From 0eaf409d3f44620403a41383d190702ffd118191 Mon Sep 17 00:00:00 2001 From: avelichk Date: Wed, 18 Nov 2020 17:12:38 +0000 Subject: [PATCH 1/3] Remove v1alpha3 files --- .dockerignore | 2 - .travis.yml | 1 - Gopkg.lock | 117 +- Gopkg.toml | 16 - Makefile | 16 - cmd/db-manager/v1alpha3/Dockerfile | 26 - cmd/db-manager/v1alpha3/main.go | 100 - cmd/db-manager/v1alpha3/main_test.go | 171 -- cmd/katib-controller/v1alpha3/Dockerfile | 22 - cmd/katib-controller/v1alpha3/main.go | 123 - .../v1alpha3/file-metricscollector/Dockerfile | 22 - .../v1alpha3/file-metricscollector/main.go | 128 - .../tfevent-metricscollector/Dockerfile | 7 - .../Dockerfile.aarch64 | 28 - .../Dockerfile.ppc64le | 7 - .../v1alpha3/tfevent-metricscollector/main.py | 54 - .../tfevent-metricscollector/requirements.txt | 1 - cmd/suggestion/chocolate/v1alpha3/Dockerfile | 31 - cmd/suggestion/chocolate/v1alpha3/main.py | 28 - .../chocolate/v1alpha3/requirements.txt | 12 - cmd/suggestion/goptuna/v1alpha3/Dockerfile | 33 - cmd/suggestion/goptuna/v1alpha3/main.go | 41 - cmd/suggestion/hyperband/v1alpha3/Dockerfile | 32 - cmd/suggestion/hyperband/v1alpha3/main.py | 29 - .../hyperband/v1alpha3/requirements.txt | 9 - cmd/suggestion/hyperopt/v1alpha3/Dockerfile | 33 - cmd/suggestion/hyperopt/v1alpha3/main.py | 28 - .../hyperopt/v1alpha3/requirements.txt | 10 - cmd/suggestion/nas/darts/v1alpha3/Dockerfile | 33 - cmd/suggestion/nas/darts/v1alpha3/main.py | 30 - .../nas/darts/v1alpha3/requirements.txt | 3 - cmd/suggestion/nas/enas/v1alpha3/Dockerfile | 29 - .../nas/enas/v1alpha3/Dockerfile.aarch64 | 58 - cmd/suggestion/nas/enas/v1alpha3/main.py | 31 - .../nas/enas/v1alpha3/requirements.txt | 4 - .../nas/enas/v1beta1/Dockerfile.aarch64 | 4 +- cmd/suggestion/skopt/v1alpha3/Dockerfile | 32 - cmd/suggestion/skopt/v1alpha3/main.py | 28 - .../skopt/v1alpha3/requirements.txt | 10 - cmd/ui/v1alpha3/Dockerfile | 27 - cmd/ui/v1alpha3/main.go | 56 - examples/v1alpha3/MinikubeDemo/deploy.sh | 5 - examples/v1alpha3/MinikubeDemo/destroy.sh | 5 - examples/v1alpha3/README.md | 354 --- .../bayesianoptimization-example.yaml | 64 - examples/v1alpha3/cmaes-example.yaml | 61 - .../custom-metricscollector-example.yaml | 76 - .../file-metrics-collector/Dockerfile | 13 - .../v1alpha3/file-metrics-collector/mnist.py | 148 -- .../file-metricscollector-example.yaml | 65 - examples/v1alpha3/fpga/README.md | 1 - examples/v1alpha3/fpga/xgboost-example.yaml | 68 - examples/v1alpha3/grid-example.yaml | 67 - examples/v1alpha3/hyperband-example.yaml | 71 - examples/v1alpha3/mxnet-mnist/Dockerfile | 16 - examples/v1alpha3/mxnet-mnist/README.md | 6 - .../v1alpha3/mxnet-mnist/common/__init__.py | 0 examples/v1alpha3/mxnet-mnist/common/fit.py | 340 --- examples/v1alpha3/mxnet-mnist/common/utils.py | 47 - examples/v1alpha3/mxnet-mnist/mnist.py | 102 - .../v1alpha3/mxnet-mnist/symbols/__init__.py | 0 examples/v1alpha3/mxnet-mnist/symbols/mlp.py | 32 - .../v1alpha3/nas/darts-cnn-cifar10/Dockerfile | 14 - .../nas/darts-cnn-cifar10/architect.py | 113 - .../v1alpha3/nas/darts-cnn-cifar10/model.py | 181 -- .../nas/darts-cnn-cifar10/operations.py | 166 -- .../nas/darts-cnn-cifar10/run_trial.py | 245 -- .../nas/darts-cnn-cifar10/search_space.py | 50 - .../v1alpha3/nas/darts-cnn-cifar10/utils.py | 70 - examples/v1alpha3/nas/darts-example-gpu.yaml | 85 - .../nas/enas-cnn-cifar10/Dockerfile.cpu | 27 - .../nas/enas-cnn-cifar10/Dockerfile.gpu | 36 - .../nas/enas-cnn-cifar10/ModelConstructor.py | 67 - .../v1alpha3/nas/enas-cnn-cifar10/RunTrial.py | 78 - .../nas/enas-cnn-cifar10/op_library.py | 141 - .../nas/enas-cnn-cifar10/requirements-cpu.txt | 2 - .../nas/enas-cnn-cifar10/requirements-gpu.txt | 2 - examples/v1alpha3/nas/enas-example-cpu.yaml | 149 -- examples/v1alpha3/nas/enas-example-gpu.yaml | 148 -- examples/v1alpha3/never-resume-example.yaml | 62 - examples/v1alpha3/pytorchjob-example.yaml | 70 - examples/v1alpha3/random-example.yaml | 61 - examples/v1alpha3/tfjob-example.yaml | 61 - examples/v1alpha3/tpe-example.yaml | 61 - hack/gen-python-sdk/gen-sdk.sh | 2 +- hack/gen-python-sdk/post_gen.py | 5 +- hack/swagger/main.go | 5 +- hack/update-codegen.sh | 4 +- hack/update-openapigen.sh | 22 +- manifests/v1alpha3/0-namespace.yaml | 6 - manifests/v1alpha3/db-manager/deployment.yaml | 48 - manifests/v1alpha3/db-manager/service.yaml | 17 - .../katib-controller/crd-experiment.yaml | 25 - .../katib-controller/crd-suggestion.yaml | 34 - .../v1alpha3/katib-controller/crd-trial.yaml | 28 - .../katib-controller/katib-config.yaml | 56 - .../katib-controller/katib-controller.yaml | 48 - manifests/v1alpha3/katib-controller/rbac.yaml | 91 - .../v1alpha3/katib-controller/secret.yaml | 5 - .../v1alpha3/katib-controller/service.yaml | 20 - .../trialTemplateConfigmap.yaml | 28 - .../trialTemplateConfigmapLabeled.yaml | 95 - manifests/v1alpha3/mysql-db/deployment.yaml | 65 - manifests/v1alpha3/mysql-db/secret.yaml | 8 - manifests/v1alpha3/mysql-db/service.yaml | 17 - manifests/v1alpha3/pv/pv.yaml | 15 - manifests/v1alpha3/pv/pvc.yaml | 14 - manifests/v1alpha3/ui/deployment.yaml | 38 - manifests/v1alpha3/ui/rbac.yaml | 39 - manifests/v1alpha3/ui/service.yaml | 18 - .../controller/addtoscheme_katib_v1alpha3.go | 31 - .../common/v1alpha3/common_types.go | 150 -- pkg/apis/controller/common/v1alpha3/doc.go | 23 - .../controller/common/v1alpha3/register.go | 48 - .../common/v1alpha3/zz_generated.deepcopy.go | 297 --- .../experiments/v1alpha3/constants.go | 30 - .../controller/experiments/v1alpha3/doc.go | 23 - .../v1alpha3/experiment_defaults.go | 120 - .../experiments/v1alpha3/experiment_types.go | 249 -- .../experiments/v1alpha3/register.go | 47 - .../controller/experiments/v1alpha3/util.go | 163 -- .../v1alpha3/zz_generated.deepcopy.go | 424 --- .../controller/suggestions/v1alpha3/doc.go | 24 - .../suggestions/v1alpha3/register.go | 48 - .../suggestions/v1alpha3/suggestion_types.go | 130 - .../controller/suggestions/v1alpha3/util.go | 117 - .../v1alpha3/zz_generated.deepcopy.go | 188 -- pkg/apis/controller/trials/v1alpha3/doc.go | 23 - .../controller/trials/v1alpha3/register.go | 47 - .../controller/trials/v1alpha3/trial_types.go | 124 - pkg/apis/controller/trials/v1alpha3/util.go | 146 -- .../trials/v1alpha3/zz_generated.deepcopy.go | 171 -- pkg/apis/manager/README.md | 8 +- pkg/apis/manager/v1alpha3/Makefile | 2 - pkg/apis/manager/v1alpha3/api.pb.go | 1470 ----------- pkg/apis/manager/v1alpha3/api.pb.gw.go | 218 -- pkg/apis/manager/v1alpha3/api.proto | 278 -- pkg/apis/manager/v1alpha3/api.swagger.json | 138 - pkg/apis/manager/v1alpha3/build.sh | 11 - pkg/apis/manager/v1alpha3/gen-doc/Dockerfile | 17 - pkg/apis/manager/v1alpha3/gen-doc/api.md | 712 ----- pkg/apis/manager/v1alpha3/gen-doc/index.html | 1731 ------------- pkg/apis/manager/v1alpha3/python/api_pb2.py | 2296 ----------------- .../manager/v1alpha3/python/api_pb2_grpc.py | 178 -- pkg/apis/v1alpha3/openapi_generated.go | 1503 ----------- pkg/apis/v1alpha3/swagger.json | 834 ------ .../clientset/versioned/clientset.go | 64 +- .../versioned/fake/clientset_generated.go | 28 - .../clientset/versioned/fake/register.go | 8 - .../clientset/versioned/scheme/register.go | 8 - .../typed/common/v1alpha3/common_client.go | 84 - .../versioned/typed/common/v1alpha3/doc.go | 19 - .../typed/common/v1alpha3/fake/doc.go | 19 - .../v1alpha3/fake/fake_common_client.go | 34 - .../common/v1alpha3/generated_expansion.go | 18 - .../typed/experiments/v1alpha3/doc.go | 19 - .../typed/experiments/v1alpha3/experiment.go | 173 -- .../v1alpha3/experiments_client.go | 89 - .../typed/experiments/v1alpha3/fake/doc.go | 19 - .../v1alpha3/fake/fake_experiment.go | 139 - .../v1alpha3/fake/fake_experiments_client.go | 39 - .../v1alpha3/generated_expansion.go | 20 - .../typed/suggestions/v1alpha3/doc.go | 19 - .../typed/suggestions/v1alpha3/fake/doc.go | 19 - .../v1alpha3/fake/fake_suggestion.go | 139 - .../v1alpha3/fake/fake_suggestions_client.go | 39 - .../v1alpha3/generated_expansion.go | 20 - .../typed/suggestions/v1alpha3/suggestion.go | 173 -- .../v1alpha3/suggestions_client.go | 89 - .../versioned/typed/trials/v1alpha3/doc.go | 19 - .../typed/trials/v1alpha3/fake/doc.go | 19 - .../typed/trials/v1alpha3/fake/fake_trial.go | 139 - .../v1alpha3/fake/fake_trials_client.go | 39 - .../trials/v1alpha3/generated_expansion.go | 20 - .../versioned/typed/trials/v1alpha3/trial.go | 173 -- .../typed/trials/v1alpha3/trials_client.go | 89 - .../externalversions/experiments/interface.go | 8 - .../experiments/v1alpha3/experiment.go | 88 - .../experiments/v1alpha3/interface.go | 44 - .../informers/externalversions/generic.go | 17 +- .../externalversions/suggestions/interface.go | 8 - .../suggestions/v1alpha3/interface.go | 44 - .../suggestions/v1alpha3/suggestion.go | 88 - .../externalversions/trials/interface.go | 8 - .../trials/v1alpha3/interface.go | 44 - .../externalversions/trials/v1alpha3/trial.go | 88 - .../v1alpha3/expansion_generated.go | 26 - .../experiments/v1alpha3/experiment.go | 93 - .../v1alpha3/expansion_generated.go | 26 - .../suggestions/v1alpha3/suggestion.go | 93 - .../trials/v1alpha3/expansion_generated.go | 26 - .../listers/trials/v1alpha3/trial.go | 93 - pkg/common/v1alpha3/common.go | 32 - pkg/common/v1alpha3/katib_manager_util.go | 82 - pkg/common/v1beta1/common.go | 32 - pkg/controller.v1alpha3/add_experiment.go | 26 - pkg/controller.v1alpha3/add_suggestion.go | 26 - pkg/controller.v1alpha3/add_trial.go | 26 - pkg/controller.v1alpha3/consts/const.go | 153 -- pkg/controller.v1alpha3/controller.go | 33 - .../experiment/experiment_consts.go | 5 - .../experiment/experiment_controller.go | 418 --- .../experiment_controller_suite_test.go | 102 - .../experiment/experiment_controller_test.go | 276 -- .../experiment/experiment_status.go | 17 - .../experiment/experiment_util.go | 140 - .../experiment/manifest/generator.go | 133 - .../experiment/manifest/generator_test.go | 188 -- .../experiment/suggestion/fake/fake.go | 26 - .../experiment/suggestion/suggestion.go | 96 - .../experiment/util/prometheus_metrics.go | 136 - .../experiment/util/status_util.go | 196 -- .../suggestion/composer/composer.go | 230 -- .../suggestion/suggestion_controller.go | 250 -- .../suggestion_controller_status.go | 39 - .../suggestion_controller_suite_test.go | 79 - .../suggestion/suggestion_controller_test.go | 125 - .../suggestion/suggestion_controller_util.go | 84 - .../suggestionclient/algorithm_settings.go | 53 - .../suggestion/suggestionclient/fake/fake.go | 53 - .../suggestion/suggestionclient/nas.go | 45 - .../suggestionclient/suggestionclient.go | 369 --- .../trial/managerclient/managerclient.go | 51 - .../trial/prometheus_metrics.go | 136 - .../trial/trial_controller.go | 332 --- .../trial/trial_controller_consts.go | 22 - .../trial/trial_controller_status.go | 17 - .../trial/trial_controller_suite_test.go | 83 - .../trial/trial_controller_test.go | 277 -- .../trial/trial_controller_util.go | 222 -- pkg/controller.v1alpha3/util/annotations.go | 122 - pkg/controller.v1alpha3/util/labels.go | 31 - pkg/controller.v1alpha3/util/suggestion.go | 25 - pkg/db/v1alpha3/common/const.go | 20 - pkg/db/v1alpha3/common/kdb.go | 14 - pkg/db/v1alpha3/db.go | 16 - pkg/db/v1alpha3/mysql/init.go | 31 - pkg/db/v1alpha3/mysql/mysql.go | 186 -- pkg/db/v1alpha3/mysql/mysql_test.go | 147 -- pkg/job/v1alpha3/job.go | 88 - pkg/job/v1alpha3/kubeflow.go | 103 - pkg/job/v1alpha3/provider.go | 44 - .../v1alpha3/common/__init__.py | 0 pkg/metricscollector/v1alpha3/common/const.go | 43 - pkg/metricscollector/v1alpha3/common/pns.go | 128 - pkg/metricscollector/v1alpha3/common/pns.py | 45 - .../file-metricscollector.go | 95 - .../tfevent-metricscollector/__init__.py | 0 .../tfevent_loader.py | 67 - pkg/mock/v1alpha3/api/manager.go | 96 - pkg/mock/v1alpha3/api/suggestion.go | 76 - pkg/mock/v1alpha3/db/db.go | 103 - .../v1alpha3/experiment/manifest/generator.go | 108 - .../experiment/suggestion/suggestion.go | 78 - .../trial/managerclient/katibmanager.go | 65 - .../v1alpha3/util/katibclient/katibclient.go | 288 --- .../v1alpha3/bayesianoptimization/__init__.py | 0 .../bayesianoptimization/acquisition_func.py | 36 - .../bayesianoptimization/algorithm_manager.py | 201 -- .../bayesian_optimization_algorithm.py | 73 - .../bayesianoptimization/global_optimizer.py | 309 --- .../bayesianoptimization/model/__init__.py | 0 .../v1alpha3/bayesianoptimization/model/gp.py | 38 - .../v1alpha3/bayesianoptimization/model/rf.py | 24 - .../v1alpha3/bayesianoptimization/utils.py | 17 - pkg/suggestion/v1alpha3/chocolate/__init__.py | 0 .../v1alpha3/chocolate/base_service.py | 196 -- pkg/suggestion/v1alpha3/chocolate/service.py | 58 - pkg/suggestion/v1alpha3/goptuna/converter.go | 350 --- .../v1alpha3/goptuna/converter_test.go | 177 -- pkg/suggestion/v1alpha3/goptuna/sample.go | 111 - pkg/suggestion/v1alpha3/goptuna/service.go | 198 -- .../v1alpha3/goptuna/service_test.go | 173 -- pkg/suggestion/v1alpha3/hyperband/__init__.py | 0 .../v1alpha3/hyperband/parameter.py | 53 - .../v1alpha3/hyperband/parsing_util.py | 144 -- pkg/suggestion/v1alpha3/hyperband/service.py | 341 --- pkg/suggestion/v1alpha3/hyperopt/__init__.py | 0 .../v1alpha3/hyperopt/base_service.py | 235 -- pkg/suggestion/v1alpha3/hyperopt/service.py | 123 - pkg/suggestion/v1alpha3/internal/__init__.py | 0 .../v1alpha3/internal/base_health_service.py | 166 -- pkg/suggestion/v1alpha3/internal/constant.py | 7 - .../v1alpha3/internal/search_space.py | 82 - pkg/suggestion/v1alpha3/internal/trial.py | 95 - pkg/suggestion/v1alpha3/nas/darts/README.md | 84 - pkg/suggestion/v1alpha3/nas/darts/__init__.py | 0 pkg/suggestion/v1alpha3/nas/darts/service.py | 123 - .../v1alpha3/nas/enas/AlgorithmSettings.py | 42 - .../v1alpha3/nas/enas/Controller.py | 243 -- pkg/suggestion/v1alpha3/nas/enas/Operation.py | 77 - pkg/suggestion/v1alpha3/nas/enas/README.md | 136 - pkg/suggestion/v1alpha3/nas/enas/__init__.py | 0 pkg/suggestion/v1alpha3/nas/enas/example.png | Bin 137757 -> 0 bytes pkg/suggestion/v1alpha3/nas/enas/service.py | 431 ---- pkg/suggestion/v1alpha3/skopt/__init__.py | 0 pkg/suggestion/v1alpha3/skopt/base_service.py | 127 - pkg/suggestion/v1alpha3/skopt/service.py | 74 - pkg/ui/v1alpha3/README.md | 86 - pkg/ui/v1alpha3/backend.go | 291 --- pkg/ui/v1alpha3/frontend/.gitignore | 27 - pkg/ui/v1alpha3/frontend/.prettierrc.yaml | 5 - pkg/ui/v1alpha3/frontend/config/env.js | 93 - .../frontend/config/jest/cssTransform.js | 14 - .../frontend/config/jest/fileTransform.js | 31 - pkg/ui/v1alpha3/frontend/config/paths.js | 89 - .../frontend/config/webpack.config.js | 605 ----- .../config/webpackDevServer.config.js | 104 - pkg/ui/v1alpha3/frontend/package.json | 143 - pkg/ui/v1alpha3/frontend/public/favicon.ico | Bin 3870 -> 0 bytes pkg/ui/v1alpha3/frontend/public/index.html | 56 - pkg/ui/v1alpha3/frontend/public/logo.png | Bin 81189 -> 0 bytes pkg/ui/v1alpha3/frontend/public/manifest.json | 15 - .../v1alpha3/frontend/public/scripts/ace.js | 17 - .../frontend/public/scripts/bootstrap.min.js | 7 - .../frontend/public/scripts/d3.v5.min.js | 2 - .../public/scripts/jquery-3.2.1.slim.min.js | 4 - .../frontend/public/scripts/mode-xml.js | 8 - .../frontend/public/scripts/popper.min.js | 5 - .../frontend/public/scripts/underscore-min.js | 5 - .../v1alpha3/frontend/public/scripts/viz.js | 213 -- pkg/ui/v1alpha3/frontend/scripts/build.js | 192 -- .../frontend/scripts/check-format-error.js | 6 - pkg/ui/v1alpha3/frontend/scripts/start.js | 133 - pkg/ui/v1alpha3/frontend/scripts/test.js | 60 - .../frontend/src/actions/generalActions.js | 114 - .../frontend/src/actions/hpCreateActions.js | 209 -- .../frontend/src/actions/hpMonitorActions.js | 49 - .../frontend/src/actions/nasCreateActions.js | 274 -- .../frontend/src/actions/nasMonitorActions.js | 33 - .../frontend/src/actions/templateActions.js | 97 - .../v1alpha3/frontend/src/components/App.jsx | 44 - .../Common/Create/Params/MetricsCollector.jsx | 656 ----- .../src/components/Common/Create/TabPanel.jsx | 81 - .../Common/ExperimentInfoDialog.jsx | 69 - .../Common/SuggestionInfoDialog.jsx | 92 - .../src/components/HP/Create/HPParameters.jsx | 275 -- .../components/HP/Create/Params/Algorithm.jsx | 170 -- .../HP/Create/Params/CommonMeta.jsx | 95 - .../HP/Create/Params/CommonSpec.jsx | 73 - .../components/HP/Create/Params/Objective.jsx | 180 -- .../HP/Create/Params/Parameters.jsx | 242 -- .../src/components/HP/Create/Params/Trial.jsx | 165 -- .../src/components/HP/Create/YAML.jsx | 81 - .../src/components/HP/Monitor/FilterPanel.jsx | 137 - .../src/components/HP/Monitor/HPJobInfo.jsx | 120 - .../src/components/HP/Monitor/HPJobList.jsx | 98 - .../components/HP/Monitor/HPJobMonitor.jsx | 43 - .../src/components/HP/Monitor/HPJobPlot.jsx | 97 - .../src/components/HP/Monitor/HPJobTable.jsx | 127 - .../components/HP/Monitor/TrialInfoDialog.jsx | 94 - .../src/components/KubeflowDashboard.jsx | 34 - .../src/components/Menu/DeleteDialog.jsx | 59 - .../frontend/src/components/Menu/Header.jsx | 63 - .../frontend/src/components/Menu/Main.jsx | 84 - .../frontend/src/components/Menu/Menu.jsx | 184 -- .../frontend/src/components/Menu/Snack.jsx | 59 - .../components/NAS/Create/NASParameters.jsx | 290 --- .../NAS/Create/Params/Algorithm.jsx | 171 -- .../NAS/Create/Params/CommonMeta.jsx | 95 - .../NAS/Create/Params/CommonSpec.jsx | 73 - .../NAS/Create/Params/NASConfig.jsx | 457 ---- .../NAS/Create/Params/Objective.jsx | 180 -- .../components/NAS/Create/Params/Trial.jsx | 165 -- .../src/components/NAS/Create/YAML.jsx | 81 - .../components/NAS/Monitor/FilterPanel.jsx | 137 - .../src/components/NAS/Monitor/NASJobInfo.jsx | 142 - .../src/components/NAS/Monitor/NASJobList.jsx | 97 - .../components/NAS/Monitor/NASJobMonitor.jsx | 42 - .../components/NAS/Monitor/NASJobStepInfo.jsx | 57 - .../components/Templates/Common/AddDialog.jsx | 239 -- .../Templates/Common/DeleteDialog.jsx | 54 - .../Templates/Common/EditDialog.jsx | 137 - .../Templates/Common/FilterPanel.jsx | 88 - .../Templates/Common/TemplateList.jsx | 174 -- .../Templates/Common/TemplatePanel.jsx | 90 - .../src/components/Templates/Trial.jsx | 41 - .../frontend/src/constants/constants.js | 23 - pkg/ui/v1alpha3/frontend/src/index.js | 58 - .../v1alpha3/frontend/src/reducers/general.js | 255 -- .../frontend/src/reducers/hpCreate.js | 382 --- .../frontend/src/reducers/hpMonitor.js | 127 - .../v1alpha3/frontend/src/reducers/index.js | 18 - .../frontend/src/reducers/nasCreate.js | 682 ----- .../frontend/src/reducers/nasMonitor.js | 112 - .../frontend/src/reducers/template.js | 152 -- pkg/ui/v1alpha3/frontend/src/sagas/index.js | 691 ----- pkg/ui/v1alpha3/frontend/src/serviceWorker.js | 131 - pkg/ui/v1alpha3/frontend/src/store/index.js | 18 - pkg/ui/v1alpha3/hp.go | 235 -- pkg/ui/v1alpha3/nas.go | 110 - pkg/ui/v1alpha3/types.go | 82 - pkg/ui/v1alpha3/util.go | 236 -- pkg/util/v1alpha3/env/env.go | 10 - pkg/util/v1alpha3/env/env_test.go | 21 - pkg/util/v1alpha3/katibclient/katib_client.go | 223 -- pkg/util/v1alpha3/katibconfig/config.go | 194 -- pkg/webhook/v1alpha3/common/const.go | 22 - .../v1alpha3/experiment/mutate_webhook.go | 70 - .../v1alpha3/experiment/validation_webhook.go | 114 - .../experiment/validator/validator.go | 234 -- .../experiment/validator/validator_test.go | 563 ---- pkg/webhook/v1alpha3/pod/const.go | 34 - pkg/webhook/v1alpha3/pod/inject_webhook.go | 391 --- .../v1alpha3/pod/inject_webhook_test.go | 542 ---- pkg/webhook/v1alpha3/pod/utils.go | 143 - pkg/webhook/v1alpha3/webhook.go | 118 - scripts/mockgen.sh | 14 - scripts/v1alpha3/build.sh | 80 - scripts/v1alpha3/deploy.sh | 33 - scripts/v1alpha3/undeploy.sh | 41 - sdk/python/v1alpha3/README.md | 98 - sdk/python/v1alpha3/docs/KatibClient.md | 135 - sdk/python/v1alpha3/docs/V1Time.md | 7 - .../docs/V1UnstructuredUnstructured.md | 7 - .../v1alpha3/docs/V1alpha3AlgorithmSetting.md | 11 - .../v1alpha3/docs/V1alpha3AlgorithmSpec.md | 12 - .../v1alpha3/docs/V1alpha3CollectorSpec.md | 11 - .../docs/V1alpha3EarlyStoppingSetting.md | 11 - .../docs/V1alpha3EarlyStoppingSpec.md | 11 - .../v1alpha3/docs/V1alpha3Experiment.md | 14 - .../docs/V1alpha3ExperimentCondition.md | 15 - .../v1alpha3/docs/V1alpha3ExperimentList.md | 13 - .../v1alpha3/docs/V1alpha3ExperimentSpec.md | 19 - .../v1alpha3/docs/V1alpha3ExperimentStatus.md | 25 - .../v1alpha3/docs/V1alpha3FeasibleSpace.md | 13 - .../v1alpha3/docs/V1alpha3FileSystemPath.md | 11 - .../v1alpha3/docs/V1alpha3FilterSpec.md | 10 - .../v1alpha3/docs/V1alpha3GoTemplate.md | 11 - .../v1alpha3/docs/V1alpha3GraphConfig.md | 12 - sdk/python/v1alpha3/docs/V1alpha3Metric.md | 11 - .../docs/V1alpha3MetricsCollectorSpec.md | 11 - sdk/python/v1alpha3/docs/V1alpha3NasConfig.md | 11 - .../v1alpha3/docs/V1alpha3ObjectiveSpec.md | 13 - .../v1alpha3/docs/V1alpha3Observation.md | 10 - sdk/python/v1alpha3/docs/V1alpha3Operation.md | 11 - .../v1alpha3/docs/V1alpha3OptimalTrial.md | 12 - .../docs/V1alpha3ParameterAssignment.md | 11 - .../v1alpha3/docs/V1alpha3ParameterSpec.md | 12 - .../v1alpha3/docs/V1alpha3SourceSpec.md | 12 - .../v1alpha3/docs/V1alpha3Suggestion.md | 14 - .../docs/V1alpha3SuggestionCondition.md | 15 - .../v1alpha3/docs/V1alpha3SuggestionList.md | 13 - .../v1alpha3/docs/V1alpha3SuggestionSpec.md | 11 - .../v1alpha3/docs/V1alpha3SuggestionStatus.md | 16 - .../v1alpha3/docs/V1alpha3TemplateSpec.md | 12 - sdk/python/v1alpha3/docs/V1alpha3Trial.md | 14 - .../v1alpha3/docs/V1alpha3TrialAssignment.md | 11 - .../v1alpha3/docs/V1alpha3TrialCondition.md | 15 - sdk/python/v1alpha3/docs/V1alpha3TrialList.md | 13 - sdk/python/v1alpha3/docs/V1alpha3TrialSpec.md | 14 - .../v1alpha3/docs/V1alpha3TrialStatus.md | 14 - .../v1alpha3/docs/V1alpha3TrialTemplate.md | 11 - .../bayesianoptimization-katib-sdk.ipynb | 531 ---- .../v1alpha3/examples/tfjob-katib-sdk.ipynb | 551 ---- sdk/python/v1alpha3/kubeflow/__init__.py | 1 - .../v1alpha3/kubeflow/katib/__init__.py | 64 - .../v1alpha3/kubeflow/katib/api/__init__.py | 5 - .../kubeflow/katib/api/katib_client.py | 290 --- .../v1alpha3/kubeflow/katib/api_client.py | 638 ----- .../v1alpha3/kubeflow/katib/configuration.py | 237 -- .../kubeflow/katib/constants/__init__.py | 13 - .../kubeflow/katib/constants/constants.py | 29 - .../kubeflow/katib/models/__init__.py | 55 - .../v1alpha3/kubeflow/katib/models/v1_time.py | 86 - .../models/v1_unstructured_unstructured.py | 86 - .../models/v1alpha3_algorithm_setting.py | 141 - .../katib/models/v1alpha3_algorithm_spec.py | 172 -- .../katib/models/v1alpha3_collector_spec.py | 146 -- .../models/v1alpha3_early_stopping_setting.py | 141 - .../models/v1alpha3_early_stopping_spec.py | 144 -- .../katib/models/v1alpha3_experiment.py | 227 -- .../models/v1alpha3_experiment_condition.py | 261 -- .../katib/models/v1alpha3_experiment_list.py | 201 -- .../katib/models/v1alpha3_experiment_spec.py | 374 --- .../models/v1alpha3_experiment_status.py | 541 ---- .../katib/models/v1alpha3_feasible_space.py | 193 -- .../katib/models/v1alpha3_file_system_path.py | 141 - .../katib/models/v1alpha3_filter_spec.py | 117 - .../katib/models/v1alpha3_go_template.py | 143 - .../katib/models/v1alpha3_graph_config.py | 167 -- .../kubeflow/katib/models/v1alpha3_metric.py | 141 - .../models/v1alpha3_metrics_collector_spec.py | 144 -- .../katib/models/v1alpha3_nas_config.py | 144 -- .../katib/models/v1alpha3_objective_spec.py | 195 -- .../katib/models/v1alpha3_observation.py | 120 - .../katib/models/v1alpha3_operation.py | 143 - .../katib/models/v1alpha3_optimal_trial.py | 178 -- .../models/v1alpha3_parameter_assignment.py | 141 - .../katib/models/v1alpha3_parameter_spec.py | 169 -- .../katib/models/v1alpha3_source_spec.py | 177 -- .../katib/models/v1alpha3_suggestion.py | 227 -- .../models/v1alpha3_suggestion_condition.py | 261 -- .../katib/models/v1alpha3_suggestion_list.py | 201 -- .../katib/models/v1alpha3_suggestion_spec.py | 144 -- .../models/v1alpha3_suggestion_status.py | 290 --- .../katib/models/v1alpha3_template_spec.py | 167 -- .../kubeflow/katib/models/v1alpha3_trial.py | 227 -- .../katib/models/v1alpha3_trial_assignment.py | 147 -- .../katib/models/v1alpha3_trial_condition.py | 261 -- .../katib/models/v1alpha3_trial_list.py | 201 -- .../katib/models/v1alpha3_trial_spec.py | 234 -- .../katib/models/v1alpha3_trial_status.py | 233 -- .../katib/models/v1alpha3_trial_template.py | 143 - sdk/python/v1alpha3/kubeflow/katib/rest.py | 323 --- .../v1alpha3/kubeflow/katib/utils/__init__.py | 13 - .../v1alpha3/kubeflow/katib/utils/utils.py | 35 - sdk/python/v1alpha3/requirements.txt | 7 - sdk/python/v1alpha3/setup.py | 52 - sdk/python/v1alpha3/test/__init__.py | 0 .../test/test_v1alpha3_algorithm_setting.py | 40 - .../test/test_v1alpha3_algorithm_spec.py | 40 - .../test/test_v1alpha3_collector_spec.py | 40 - .../test_v1alpha3_early_stopping_setting.py | 40 - .../test/test_v1alpha3_early_stopping_spec.py | 40 - .../v1alpha3/test/test_v1alpha3_experiment.py | 40 - .../test_v1alpha3_experiment_condition.py | 40 - .../test/test_v1alpha3_experiment_list.py | 40 - .../test/test_v1alpha3_experiment_spec.py | 40 - .../test/test_v1alpha3_experiment_status.py | 40 - .../test/test_v1alpha3_feasible_space.py | 40 - .../test/test_v1alpha3_file_system_path.py | 40 - .../test/test_v1alpha3_filter_spec.py | 40 - .../test/test_v1alpha3_go_template.py | 40 - .../test/test_v1alpha3_graph_config.py | 40 - .../v1alpha3/test/test_v1alpha3_metric.py | 40 - .../test_v1alpha3_metrics_collector_spec.py | 40 - .../v1alpha3/test/test_v1alpha3_nas_config.py | 40 - .../test/test_v1alpha3_objective_spec.py | 40 - .../test/test_v1alpha3_observation.py | 40 - .../v1alpha3/test/test_v1alpha3_operation.py | 40 - .../test/test_v1alpha3_optimal_trial.py | 40 - .../test_v1alpha3_parameter_assignment.py | 40 - .../test/test_v1alpha3_parameter_spec.py | 40 - .../test/test_v1alpha3_source_spec.py | 40 - .../v1alpha3/test/test_v1alpha3_suggestion.py | 40 - .../test_v1alpha3_suggestion_condition.py | 40 - .../test/test_v1alpha3_suggestion_list.py | 40 - .../test/test_v1alpha3_suggestion_spec.py | 40 - .../test/test_v1alpha3_suggestion_status.py | 40 - .../test/test_v1alpha3_template_spec.py | 40 - .../v1alpha3/test/test_v1alpha3_trial.py | 40 - .../test/test_v1alpha3_trial_assignment.py | 40 - .../test/test_v1alpha3_trial_condition.py | 40 - .../v1alpha3/test/test_v1alpha3_trial_list.py | 40 - .../v1alpha3/test/test_v1alpha3_trial_spec.py | 40 - .../test/test_v1alpha3_trial_status.py | 40 - .../test/test_v1alpha3_trial_template.py | 40 - sdk/python/v1beta1/docs/KatibClient.md | 157 -- sdk/python/v1beta1/docs/V1Time.md | 7 - .../docs/V1UnstructuredUnstructured.md | 7 - .../v1beta1/kubeflow/katib/models/v1_time.py | 86 - .../models/v1_unstructured_unstructured.py | 86 - test/unit/v1alpha3/crds/pytorchjob_v1.yaml | 12 - test/unit/v1alpha3/crds/tfjob_v1.yaml | 12 - vendor/github.com/gobuffalo/envy/LICENSE.txt | 8 - vendor/github.com/gobuffalo/envy/envy.go | 268 -- vendor/github.com/gobuffalo/envy/version.go | 3 - .../grpc-gateway/runtime/context.go | 187 -- .../grpc-gateway/runtime/convert.go | 87 - .../grpc-gateway/runtime/doc.go | 5 - .../grpc-gateway/runtime/errors.go | 142 - .../grpc-gateway/runtime/handler.go | 195 -- .../runtime/internal/stream_chunk.pb.go | 119 - .../grpc-gateway/runtime/marshal_json.go | 45 - .../grpc-gateway/runtime/marshal_jsonpb.go | 203 -- .../grpc-gateway/runtime/marshal_proto.go | 62 - .../grpc-gateway/runtime/marshaler.go | 48 - .../runtime/marshaler_registry.go | 91 - .../grpc-gateway/runtime/mux.go | 260 -- .../grpc-gateway/runtime/pattern.go | 227 -- .../grpc-gateway/runtime/proto2_convert.go | 80 - .../grpc-gateway/runtime/proto_errors.go | 61 - .../grpc-gateway/runtime/query.go | 357 --- .../hpcloud/tail/ratelimiter/memory.go | 10 +- vendor/github.com/hpcloud/tail/tail.go | 11 +- .../hpcloud/tail/watch/filechanges.go | 2 +- .../github.com/hpcloud/tail/watch/inotify.go | 11 +- .../hpcloud/tail/watch/inotify_tracker.go | 88 +- .../inconshreveable/mousetrap/LICENSE | 13 - .../inconshreveable/mousetrap/trap_others.go | 15 - .../inconshreveable/mousetrap/trap_windows.go | 98 - .../mousetrap/trap_windows_1.4.go | 46 - vendor/github.com/joho/godotenv/LICENCE | 23 - vendor/github.com/joho/godotenv/godotenv.go | 346 --- vendor/github.com/markbates/inflect/LICENCE | 7 - .../github.com/markbates/inflect/helpers.go | 19 - .../github.com/markbates/inflect/inflect.go | 892 ------- vendor/github.com/markbates/inflect/name.go | 163 -- .../github.com/markbates/inflect/version.go | 3 - vendor/github.com/mitchellh/go-ps/LICENSE.md | 21 - vendor/github.com/mitchellh/go-ps/process.go | 40 - .../mitchellh/go-ps/process_darwin.go | 138 - .../mitchellh/go-ps/process_freebsd.go | 260 -- .../mitchellh/go-ps/process_linux.go | 35 - .../mitchellh/go-ps/process_solaris.go | 96 - .../mitchellh/go-ps/process_unix.go | 101 - .../mitchellh/go-ps/process_windows.go | 119 - vendor/github.com/pkg/errors/LICENSE | 23 - vendor/github.com/pkg/errors/errors.go | 282 -- vendor/github.com/pkg/errors/stack.go | 147 -- .../github.com/rogpeppe/go-internal/LICENSE | 27 - .../rogpeppe/go-internal/modfile/gopkgin.go | 47 - .../rogpeppe/go-internal/modfile/print.go | 164 -- .../rogpeppe/go-internal/modfile/read.go | 869 ------- .../rogpeppe/go-internal/modfile/rule.go | 724 ------ .../rogpeppe/go-internal/module/module.go | 540 ---- .../rogpeppe/go-internal/semver/semver.go | 388 --- vendor/github.com/spf13/cobra/LICENSE.txt | 174 -- vendor/github.com/spf13/cobra/args.go | 89 - .../spf13/cobra/bash_completions.go | 584 ----- vendor/github.com/spf13/cobra/cobra.go | 200 -- .../cobra/cobra/cmd/testdata/LICENSE.golden | 202 -- vendor/github.com/spf13/cobra/command.go | 1517 ----------- .../github.com/spf13/cobra/command_notwin.go | 5 - vendor/github.com/spf13/cobra/command_win.go | 20 - .../github.com/spf13/cobra/zsh_completions.go | 126 - .../{ => fsnotify}/fsnotify.v1/AUTHORS | 0 .../{ => fsnotify}/fsnotify.v1/LICENSE | 2 +- .../{ => fsnotify}/fsnotify.v1/fen.go | 0 .../{ => fsnotify}/fsnotify.v1/fsnotify.go | 4 +- .../{ => fsnotify}/fsnotify.v1/inotify.go | 0 .../fsnotify.v1/inotify_poller.go | 4 +- .../{ => fsnotify}/fsnotify.v1/kqueue.go | 0 .../fsnotify.v1/open_mode_bsd.go | 2 +- .../fsnotify.v1/open_mode_darwin.go | 2 +- .../{ => fsnotify}/fsnotify.v1/windows.go | 0 vendor/sigs.k8s.io/controller-tools/LICENSE | 201 -- .../cmd/controller-gen/main.go | 194 -- .../pkg/crd/generator/generator.go | 187 -- .../controller-tools/pkg/crd/util/util.go | 117 - .../pkg/internal/codegen/parse/apis.go | 287 --- .../pkg/internal/codegen/parse/context.go | 42 - .../pkg/internal/codegen/parse/crd.go | 607 ----- .../pkg/internal/codegen/parse/index.go | 160 -- .../pkg/internal/codegen/parse/parser.go | 151 -- .../pkg/internal/codegen/parse/util.go | 521 ---- .../pkg/internal/codegen/types.go | 213 -- .../pkg/internal/general/util.go | 102 - .../controller-tools/pkg/rbac/manifests.go | 152 -- .../controller-tools/pkg/rbac/parser.go | 83 - .../controller-tools/pkg/util/util.go | 77 - .../pkg/webhook/internal/client.go | 189 -- .../pkg/webhook/internal/manager.go | 70 - .../controller-tools/pkg/webhook/manifests.go | 163 -- .../controller-tools/pkg/webhook/parser.go | 255 -- 646 files changed, 103 insertions(+), 74643 deletions(-) delete mode 100644 cmd/db-manager/v1alpha3/Dockerfile delete mode 100644 cmd/db-manager/v1alpha3/main.go delete mode 100644 cmd/db-manager/v1alpha3/main_test.go delete mode 100644 cmd/katib-controller/v1alpha3/Dockerfile delete mode 100644 cmd/katib-controller/v1alpha3/main.go delete mode 100644 cmd/metricscollector/v1alpha3/file-metricscollector/Dockerfile delete mode 100644 cmd/metricscollector/v1alpha3/file-metricscollector/main.go delete mode 100644 cmd/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile delete mode 100644 cmd/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile.aarch64 delete mode 100644 cmd/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile.ppc64le delete mode 100644 cmd/metricscollector/v1alpha3/tfevent-metricscollector/main.py delete mode 100644 cmd/metricscollector/v1alpha3/tfevent-metricscollector/requirements.txt delete mode 100644 cmd/suggestion/chocolate/v1alpha3/Dockerfile delete mode 100644 cmd/suggestion/chocolate/v1alpha3/main.py delete mode 100644 cmd/suggestion/chocolate/v1alpha3/requirements.txt delete mode 100644 cmd/suggestion/goptuna/v1alpha3/Dockerfile delete mode 100644 cmd/suggestion/goptuna/v1alpha3/main.go delete mode 100644 cmd/suggestion/hyperband/v1alpha3/Dockerfile delete mode 100644 cmd/suggestion/hyperband/v1alpha3/main.py delete mode 100644 cmd/suggestion/hyperband/v1alpha3/requirements.txt delete mode 100644 cmd/suggestion/hyperopt/v1alpha3/Dockerfile delete mode 100644 cmd/suggestion/hyperopt/v1alpha3/main.py delete mode 100644 cmd/suggestion/hyperopt/v1alpha3/requirements.txt delete mode 100644 cmd/suggestion/nas/darts/v1alpha3/Dockerfile delete mode 100644 cmd/suggestion/nas/darts/v1alpha3/main.py delete mode 100644 cmd/suggestion/nas/darts/v1alpha3/requirements.txt delete mode 100644 cmd/suggestion/nas/enas/v1alpha3/Dockerfile delete mode 100644 cmd/suggestion/nas/enas/v1alpha3/Dockerfile.aarch64 delete mode 100644 cmd/suggestion/nas/enas/v1alpha3/main.py delete mode 100644 cmd/suggestion/nas/enas/v1alpha3/requirements.txt delete mode 100644 cmd/suggestion/skopt/v1alpha3/Dockerfile delete mode 100644 cmd/suggestion/skopt/v1alpha3/main.py delete mode 100644 cmd/suggestion/skopt/v1alpha3/requirements.txt delete mode 100644 cmd/ui/v1alpha3/Dockerfile delete mode 100644 cmd/ui/v1alpha3/main.go delete mode 100755 examples/v1alpha3/MinikubeDemo/deploy.sh delete mode 100755 examples/v1alpha3/MinikubeDemo/destroy.sh delete mode 100644 examples/v1alpha3/README.md delete mode 100644 examples/v1alpha3/bayesianoptimization-example.yaml delete mode 100644 examples/v1alpha3/cmaes-example.yaml delete mode 100644 examples/v1alpha3/custom-metricscollector-example.yaml delete mode 100644 examples/v1alpha3/file-metrics-collector/Dockerfile delete mode 100644 examples/v1alpha3/file-metrics-collector/mnist.py delete mode 100644 examples/v1alpha3/file-metricscollector-example.yaml delete mode 100644 examples/v1alpha3/fpga/README.md delete mode 100644 examples/v1alpha3/fpga/xgboost-example.yaml delete mode 100644 examples/v1alpha3/grid-example.yaml delete mode 100644 examples/v1alpha3/hyperband-example.yaml delete mode 100644 examples/v1alpha3/mxnet-mnist/Dockerfile delete mode 100644 examples/v1alpha3/mxnet-mnist/README.md delete mode 100644 examples/v1alpha3/mxnet-mnist/common/__init__.py delete mode 100644 examples/v1alpha3/mxnet-mnist/common/fit.py delete mode 100644 examples/v1alpha3/mxnet-mnist/common/utils.py delete mode 100644 examples/v1alpha3/mxnet-mnist/mnist.py delete mode 100644 examples/v1alpha3/mxnet-mnist/symbols/__init__.py delete mode 100644 examples/v1alpha3/mxnet-mnist/symbols/mlp.py delete mode 100644 examples/v1alpha3/nas/darts-cnn-cifar10/Dockerfile delete mode 100644 examples/v1alpha3/nas/darts-cnn-cifar10/architect.py delete mode 100644 examples/v1alpha3/nas/darts-cnn-cifar10/model.py delete mode 100644 examples/v1alpha3/nas/darts-cnn-cifar10/operations.py delete mode 100644 examples/v1alpha3/nas/darts-cnn-cifar10/run_trial.py delete mode 100644 examples/v1alpha3/nas/darts-cnn-cifar10/search_space.py delete mode 100644 examples/v1alpha3/nas/darts-cnn-cifar10/utils.py delete mode 100644 examples/v1alpha3/nas/darts-example-gpu.yaml delete mode 100644 examples/v1alpha3/nas/enas-cnn-cifar10/Dockerfile.cpu delete mode 100644 examples/v1alpha3/nas/enas-cnn-cifar10/Dockerfile.gpu delete mode 100644 examples/v1alpha3/nas/enas-cnn-cifar10/ModelConstructor.py delete mode 100644 examples/v1alpha3/nas/enas-cnn-cifar10/RunTrial.py delete mode 100644 examples/v1alpha3/nas/enas-cnn-cifar10/op_library.py delete mode 100644 examples/v1alpha3/nas/enas-cnn-cifar10/requirements-cpu.txt delete mode 100644 examples/v1alpha3/nas/enas-cnn-cifar10/requirements-gpu.txt delete mode 100644 examples/v1alpha3/nas/enas-example-cpu.yaml delete mode 100644 examples/v1alpha3/nas/enas-example-gpu.yaml delete mode 100644 examples/v1alpha3/never-resume-example.yaml delete mode 100644 examples/v1alpha3/pytorchjob-example.yaml delete mode 100644 examples/v1alpha3/random-example.yaml delete mode 100644 examples/v1alpha3/tfjob-example.yaml delete mode 100644 examples/v1alpha3/tpe-example.yaml delete mode 100644 manifests/v1alpha3/0-namespace.yaml delete mode 100644 manifests/v1alpha3/db-manager/deployment.yaml delete mode 100644 manifests/v1alpha3/db-manager/service.yaml delete mode 100644 manifests/v1alpha3/katib-controller/crd-experiment.yaml delete mode 100644 manifests/v1alpha3/katib-controller/crd-suggestion.yaml delete mode 100644 manifests/v1alpha3/katib-controller/crd-trial.yaml delete mode 100644 manifests/v1alpha3/katib-controller/katib-config.yaml delete mode 100644 manifests/v1alpha3/katib-controller/katib-controller.yaml delete mode 100644 manifests/v1alpha3/katib-controller/rbac.yaml delete mode 100644 manifests/v1alpha3/katib-controller/secret.yaml delete mode 100644 manifests/v1alpha3/katib-controller/service.yaml delete mode 100644 manifests/v1alpha3/katib-controller/trialTemplateConfigmap.yaml delete mode 100644 manifests/v1alpha3/katib-controller/trialTemplateConfigmapLabeled.yaml delete mode 100644 manifests/v1alpha3/mysql-db/deployment.yaml delete mode 100644 manifests/v1alpha3/mysql-db/secret.yaml delete mode 100644 manifests/v1alpha3/mysql-db/service.yaml delete mode 100644 manifests/v1alpha3/pv/pv.yaml delete mode 100644 manifests/v1alpha3/pv/pvc.yaml delete mode 100644 manifests/v1alpha3/ui/deployment.yaml delete mode 100644 manifests/v1alpha3/ui/rbac.yaml delete mode 100644 manifests/v1alpha3/ui/service.yaml delete mode 100644 pkg/apis/controller/addtoscheme_katib_v1alpha3.go delete mode 100644 pkg/apis/controller/common/v1alpha3/common_types.go delete mode 100644 pkg/apis/controller/common/v1alpha3/doc.go delete mode 100644 pkg/apis/controller/common/v1alpha3/register.go delete mode 100644 pkg/apis/controller/common/v1alpha3/zz_generated.deepcopy.go delete mode 100644 pkg/apis/controller/experiments/v1alpha3/constants.go delete mode 100644 pkg/apis/controller/experiments/v1alpha3/doc.go delete mode 100644 pkg/apis/controller/experiments/v1alpha3/experiment_defaults.go delete mode 100644 pkg/apis/controller/experiments/v1alpha3/experiment_types.go delete mode 100644 pkg/apis/controller/experiments/v1alpha3/register.go delete mode 100644 pkg/apis/controller/experiments/v1alpha3/util.go delete mode 100644 pkg/apis/controller/experiments/v1alpha3/zz_generated.deepcopy.go delete mode 100644 pkg/apis/controller/suggestions/v1alpha3/doc.go delete mode 100644 pkg/apis/controller/suggestions/v1alpha3/register.go delete mode 100644 pkg/apis/controller/suggestions/v1alpha3/suggestion_types.go delete mode 100644 pkg/apis/controller/suggestions/v1alpha3/util.go delete mode 100644 pkg/apis/controller/suggestions/v1alpha3/zz_generated.deepcopy.go delete mode 100644 pkg/apis/controller/trials/v1alpha3/doc.go delete mode 100644 pkg/apis/controller/trials/v1alpha3/register.go delete mode 100644 pkg/apis/controller/trials/v1alpha3/trial_types.go delete mode 100644 pkg/apis/controller/trials/v1alpha3/util.go delete mode 100644 pkg/apis/controller/trials/v1alpha3/zz_generated.deepcopy.go delete mode 100644 pkg/apis/manager/v1alpha3/Makefile delete mode 100644 pkg/apis/manager/v1alpha3/api.pb.go delete mode 100644 pkg/apis/manager/v1alpha3/api.pb.gw.go delete mode 100644 pkg/apis/manager/v1alpha3/api.proto delete mode 100644 pkg/apis/manager/v1alpha3/api.swagger.json delete mode 100755 pkg/apis/manager/v1alpha3/build.sh delete mode 100644 pkg/apis/manager/v1alpha3/gen-doc/Dockerfile delete mode 100644 pkg/apis/manager/v1alpha3/gen-doc/api.md delete mode 100644 pkg/apis/manager/v1alpha3/gen-doc/index.html delete mode 100644 pkg/apis/manager/v1alpha3/python/api_pb2.py delete mode 100644 pkg/apis/manager/v1alpha3/python/api_pb2_grpc.py delete mode 100644 pkg/apis/v1alpha3/openapi_generated.go delete mode 100644 pkg/apis/v1alpha3/swagger.json delete mode 100644 pkg/client/controller/clientset/versioned/typed/common/v1alpha3/common_client.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/common/v1alpha3/doc.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/common/v1alpha3/fake/doc.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/common/v1alpha3/fake/fake_common_client.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/common/v1alpha3/generated_expansion.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/doc.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/experiment.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/experiments_client.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/fake/doc.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/fake/fake_experiment.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/fake/fake_experiments_client.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/generated_expansion.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/doc.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/fake/doc.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/fake/fake_suggestion.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/fake/fake_suggestions_client.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/generated_expansion.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/suggestion.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/suggestions_client.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/doc.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/fake/doc.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/fake/fake_trial.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/fake/fake_trials_client.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/generated_expansion.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/trial.go delete mode 100644 pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/trials_client.go delete mode 100644 pkg/client/controller/informers/externalversions/experiments/v1alpha3/experiment.go delete mode 100644 pkg/client/controller/informers/externalversions/experiments/v1alpha3/interface.go delete mode 100644 pkg/client/controller/informers/externalversions/suggestions/v1alpha3/interface.go delete mode 100644 pkg/client/controller/informers/externalversions/suggestions/v1alpha3/suggestion.go delete mode 100644 pkg/client/controller/informers/externalversions/trials/v1alpha3/interface.go delete mode 100644 pkg/client/controller/informers/externalversions/trials/v1alpha3/trial.go delete mode 100644 pkg/client/controller/listers/experiments/v1alpha3/expansion_generated.go delete mode 100644 pkg/client/controller/listers/experiments/v1alpha3/experiment.go delete mode 100644 pkg/client/controller/listers/suggestions/v1alpha3/expansion_generated.go delete mode 100644 pkg/client/controller/listers/suggestions/v1alpha3/suggestion.go delete mode 100644 pkg/client/controller/listers/trials/v1alpha3/expansion_generated.go delete mode 100644 pkg/client/controller/listers/trials/v1alpha3/trial.go delete mode 100644 pkg/common/v1alpha3/common.go delete mode 100644 pkg/common/v1alpha3/katib_manager_util.go delete mode 100644 pkg/common/v1beta1/common.go delete mode 100644 pkg/controller.v1alpha3/add_experiment.go delete mode 100644 pkg/controller.v1alpha3/add_suggestion.go delete mode 100644 pkg/controller.v1alpha3/add_trial.go delete mode 100644 pkg/controller.v1alpha3/consts/const.go delete mode 100644 pkg/controller.v1alpha3/controller.go delete mode 100644 pkg/controller.v1alpha3/experiment/experiment_consts.go delete mode 100644 pkg/controller.v1alpha3/experiment/experiment_controller.go delete mode 100644 pkg/controller.v1alpha3/experiment/experiment_controller_suite_test.go delete mode 100644 pkg/controller.v1alpha3/experiment/experiment_controller_test.go delete mode 100644 pkg/controller.v1alpha3/experiment/experiment_status.go delete mode 100644 pkg/controller.v1alpha3/experiment/experiment_util.go delete mode 100644 pkg/controller.v1alpha3/experiment/manifest/generator.go delete mode 100644 pkg/controller.v1alpha3/experiment/manifest/generator_test.go delete mode 100644 pkg/controller.v1alpha3/experiment/suggestion/fake/fake.go delete mode 100644 pkg/controller.v1alpha3/experiment/suggestion/suggestion.go delete mode 100644 pkg/controller.v1alpha3/experiment/util/prometheus_metrics.go delete mode 100644 pkg/controller.v1alpha3/experiment/util/status_util.go delete mode 100644 pkg/controller.v1alpha3/suggestion/composer/composer.go delete mode 100644 pkg/controller.v1alpha3/suggestion/suggestion_controller.go delete mode 100644 pkg/controller.v1alpha3/suggestion/suggestion_controller_status.go delete mode 100644 pkg/controller.v1alpha3/suggestion/suggestion_controller_suite_test.go delete mode 100644 pkg/controller.v1alpha3/suggestion/suggestion_controller_test.go delete mode 100644 pkg/controller.v1alpha3/suggestion/suggestion_controller_util.go delete mode 100644 pkg/controller.v1alpha3/suggestion/suggestionclient/algorithm_settings.go delete mode 100644 pkg/controller.v1alpha3/suggestion/suggestionclient/fake/fake.go delete mode 100644 pkg/controller.v1alpha3/suggestion/suggestionclient/nas.go delete mode 100644 pkg/controller.v1alpha3/suggestion/suggestionclient/suggestionclient.go delete mode 100644 pkg/controller.v1alpha3/trial/managerclient/managerclient.go delete mode 100644 pkg/controller.v1alpha3/trial/prometheus_metrics.go delete mode 100644 pkg/controller.v1alpha3/trial/trial_controller.go delete mode 100644 pkg/controller.v1alpha3/trial/trial_controller_consts.go delete mode 100644 pkg/controller.v1alpha3/trial/trial_controller_status.go delete mode 100644 pkg/controller.v1alpha3/trial/trial_controller_suite_test.go delete mode 100644 pkg/controller.v1alpha3/trial/trial_controller_test.go delete mode 100644 pkg/controller.v1alpha3/trial/trial_controller_util.go delete mode 100644 pkg/controller.v1alpha3/util/annotations.go delete mode 100644 pkg/controller.v1alpha3/util/labels.go delete mode 100644 pkg/controller.v1alpha3/util/suggestion.go delete mode 100644 pkg/db/v1alpha3/common/const.go delete mode 100644 pkg/db/v1alpha3/common/kdb.go delete mode 100644 pkg/db/v1alpha3/db.go delete mode 100644 pkg/db/v1alpha3/mysql/init.go delete mode 100644 pkg/db/v1alpha3/mysql/mysql.go delete mode 100644 pkg/db/v1alpha3/mysql/mysql_test.go delete mode 100644 pkg/job/v1alpha3/job.go delete mode 100644 pkg/job/v1alpha3/kubeflow.go delete mode 100644 pkg/job/v1alpha3/provider.go delete mode 100644 pkg/metricscollector/v1alpha3/common/__init__.py delete mode 100644 pkg/metricscollector/v1alpha3/common/const.go delete mode 100644 pkg/metricscollector/v1alpha3/common/pns.go delete mode 100644 pkg/metricscollector/v1alpha3/common/pns.py delete mode 100644 pkg/metricscollector/v1alpha3/file-metricscollector/file-metricscollector.go delete mode 100644 pkg/metricscollector/v1alpha3/tfevent-metricscollector/__init__.py delete mode 100644 pkg/metricscollector/v1alpha3/tfevent-metricscollector/tfevent_loader.py delete mode 100644 pkg/mock/v1alpha3/api/manager.go delete mode 100644 pkg/mock/v1alpha3/api/suggestion.go delete mode 100644 pkg/mock/v1alpha3/db/db.go delete mode 100644 pkg/mock/v1alpha3/experiment/manifest/generator.go delete mode 100644 pkg/mock/v1alpha3/experiment/suggestion/suggestion.go delete mode 100644 pkg/mock/v1alpha3/trial/managerclient/katibmanager.go delete mode 100644 pkg/mock/v1alpha3/util/katibclient/katibclient.go delete mode 100644 pkg/suggestion/v1alpha3/bayesianoptimization/__init__.py delete mode 100644 pkg/suggestion/v1alpha3/bayesianoptimization/acquisition_func.py delete mode 100644 pkg/suggestion/v1alpha3/bayesianoptimization/algorithm_manager.py delete mode 100644 pkg/suggestion/v1alpha3/bayesianoptimization/bayesian_optimization_algorithm.py delete mode 100644 pkg/suggestion/v1alpha3/bayesianoptimization/global_optimizer.py delete mode 100644 pkg/suggestion/v1alpha3/bayesianoptimization/model/__init__.py delete mode 100644 pkg/suggestion/v1alpha3/bayesianoptimization/model/gp.py delete mode 100644 pkg/suggestion/v1alpha3/bayesianoptimization/model/rf.py delete mode 100644 pkg/suggestion/v1alpha3/bayesianoptimization/utils.py delete mode 100644 pkg/suggestion/v1alpha3/chocolate/__init__.py delete mode 100644 pkg/suggestion/v1alpha3/chocolate/base_service.py delete mode 100644 pkg/suggestion/v1alpha3/chocolate/service.py delete mode 100644 pkg/suggestion/v1alpha3/goptuna/converter.go delete mode 100644 pkg/suggestion/v1alpha3/goptuna/converter_test.go delete mode 100644 pkg/suggestion/v1alpha3/goptuna/sample.go delete mode 100644 pkg/suggestion/v1alpha3/goptuna/service.go delete mode 100644 pkg/suggestion/v1alpha3/goptuna/service_test.go delete mode 100644 pkg/suggestion/v1alpha3/hyperband/__init__.py delete mode 100644 pkg/suggestion/v1alpha3/hyperband/parameter.py delete mode 100644 pkg/suggestion/v1alpha3/hyperband/parsing_util.py delete mode 100644 pkg/suggestion/v1alpha3/hyperband/service.py delete mode 100644 pkg/suggestion/v1alpha3/hyperopt/__init__.py delete mode 100644 pkg/suggestion/v1alpha3/hyperopt/base_service.py delete mode 100644 pkg/suggestion/v1alpha3/hyperopt/service.py delete mode 100644 pkg/suggestion/v1alpha3/internal/__init__.py delete mode 100644 pkg/suggestion/v1alpha3/internal/base_health_service.py delete mode 100644 pkg/suggestion/v1alpha3/internal/constant.py delete mode 100644 pkg/suggestion/v1alpha3/internal/search_space.py delete mode 100644 pkg/suggestion/v1alpha3/internal/trial.py delete mode 100644 pkg/suggestion/v1alpha3/nas/darts/README.md delete mode 100644 pkg/suggestion/v1alpha3/nas/darts/__init__.py delete mode 100644 pkg/suggestion/v1alpha3/nas/darts/service.py delete mode 100644 pkg/suggestion/v1alpha3/nas/enas/AlgorithmSettings.py delete mode 100755 pkg/suggestion/v1alpha3/nas/enas/Controller.py delete mode 100644 pkg/suggestion/v1alpha3/nas/enas/Operation.py delete mode 100644 pkg/suggestion/v1alpha3/nas/enas/README.md delete mode 100644 pkg/suggestion/v1alpha3/nas/enas/__init__.py delete mode 100644 pkg/suggestion/v1alpha3/nas/enas/example.png delete mode 100644 pkg/suggestion/v1alpha3/nas/enas/service.py delete mode 100644 pkg/suggestion/v1alpha3/skopt/__init__.py delete mode 100644 pkg/suggestion/v1alpha3/skopt/base_service.py delete mode 100644 pkg/suggestion/v1alpha3/skopt/service.py delete mode 100755 pkg/ui/v1alpha3/README.md delete mode 100644 pkg/ui/v1alpha3/backend.go delete mode 100755 pkg/ui/v1alpha3/frontend/.gitignore delete mode 100644 pkg/ui/v1alpha3/frontend/.prettierrc.yaml delete mode 100644 pkg/ui/v1alpha3/frontend/config/env.js delete mode 100644 pkg/ui/v1alpha3/frontend/config/jest/cssTransform.js delete mode 100644 pkg/ui/v1alpha3/frontend/config/jest/fileTransform.js delete mode 100644 pkg/ui/v1alpha3/frontend/config/paths.js delete mode 100644 pkg/ui/v1alpha3/frontend/config/webpack.config.js delete mode 100644 pkg/ui/v1alpha3/frontend/config/webpackDevServer.config.js delete mode 100644 pkg/ui/v1alpha3/frontend/package.json delete mode 100755 pkg/ui/v1alpha3/frontend/public/favicon.ico delete mode 100755 pkg/ui/v1alpha3/frontend/public/index.html delete mode 100644 pkg/ui/v1alpha3/frontend/public/logo.png delete mode 100755 pkg/ui/v1alpha3/frontend/public/manifest.json delete mode 100644 pkg/ui/v1alpha3/frontend/public/scripts/ace.js delete mode 100644 pkg/ui/v1alpha3/frontend/public/scripts/bootstrap.min.js delete mode 100644 pkg/ui/v1alpha3/frontend/public/scripts/d3.v5.min.js delete mode 100644 pkg/ui/v1alpha3/frontend/public/scripts/jquery-3.2.1.slim.min.js delete mode 100644 pkg/ui/v1alpha3/frontend/public/scripts/mode-xml.js delete mode 100644 pkg/ui/v1alpha3/frontend/public/scripts/popper.min.js delete mode 100644 pkg/ui/v1alpha3/frontend/public/scripts/underscore-min.js delete mode 100644 pkg/ui/v1alpha3/frontend/public/scripts/viz.js delete mode 100644 pkg/ui/v1alpha3/frontend/scripts/build.js delete mode 100644 pkg/ui/v1alpha3/frontend/scripts/check-format-error.js delete mode 100644 pkg/ui/v1alpha3/frontend/scripts/start.js delete mode 100644 pkg/ui/v1alpha3/frontend/scripts/test.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/actions/generalActions.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/actions/hpCreateActions.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/actions/hpMonitorActions.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/actions/nasCreateActions.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/actions/nasMonitorActions.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/actions/templateActions.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/App.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Common/Create/Params/MetricsCollector.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Common/Create/TabPanel.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Common/ExperimentInfoDialog.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Common/SuggestionInfoDialog.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Create/HPParameters.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Algorithm.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/CommonMeta.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/CommonSpec.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Objective.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Parameters.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Trial.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Create/YAML.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/FilterPanel.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobInfo.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobList.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobMonitor.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobPlot.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobTable.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/TrialInfoDialog.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/KubeflowDashboard.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Menu/DeleteDialog.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Menu/Header.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Menu/Main.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Menu/Menu.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Menu/Snack.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/NAS/Create/NASParameters.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/Algorithm.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/CommonMeta.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/CommonSpec.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/NASConfig.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/Objective.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/Trial.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/NAS/Create/YAML.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/FilterPanel.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobInfo.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobList.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobMonitor.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobStepInfo.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Templates/Common/AddDialog.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Templates/Common/DeleteDialog.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Templates/Common/EditDialog.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Templates/Common/FilterPanel.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Templates/Common/TemplateList.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Templates/Common/TemplatePanel.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/components/Templates/Trial.jsx delete mode 100644 pkg/ui/v1alpha3/frontend/src/constants/constants.js delete mode 100755 pkg/ui/v1alpha3/frontend/src/index.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/reducers/general.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/reducers/hpCreate.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/reducers/hpMonitor.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/reducers/index.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/reducers/nasCreate.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/reducers/nasMonitor.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/reducers/template.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/sagas/index.js delete mode 100755 pkg/ui/v1alpha3/frontend/src/serviceWorker.js delete mode 100644 pkg/ui/v1alpha3/frontend/src/store/index.js delete mode 100644 pkg/ui/v1alpha3/hp.go delete mode 100644 pkg/ui/v1alpha3/nas.go delete mode 100644 pkg/ui/v1alpha3/types.go delete mode 100644 pkg/ui/v1alpha3/util.go delete mode 100644 pkg/util/v1alpha3/env/env.go delete mode 100644 pkg/util/v1alpha3/env/env_test.go delete mode 100644 pkg/util/v1alpha3/katibclient/katib_client.go delete mode 100644 pkg/util/v1alpha3/katibconfig/config.go delete mode 100644 pkg/webhook/v1alpha3/common/const.go delete mode 100644 pkg/webhook/v1alpha3/experiment/mutate_webhook.go delete mode 100644 pkg/webhook/v1alpha3/experiment/validation_webhook.go delete mode 100644 pkg/webhook/v1alpha3/experiment/validator/validator.go delete mode 100644 pkg/webhook/v1alpha3/experiment/validator/validator_test.go delete mode 100644 pkg/webhook/v1alpha3/pod/const.go delete mode 100644 pkg/webhook/v1alpha3/pod/inject_webhook.go delete mode 100644 pkg/webhook/v1alpha3/pod/inject_webhook_test.go delete mode 100644 pkg/webhook/v1alpha3/pod/utils.go delete mode 100644 pkg/webhook/v1alpha3/webhook.go delete mode 100755 scripts/v1alpha3/build.sh delete mode 100755 scripts/v1alpha3/deploy.sh delete mode 100755 scripts/v1alpha3/undeploy.sh delete mode 100644 sdk/python/v1alpha3/README.md delete mode 100644 sdk/python/v1alpha3/docs/KatibClient.md delete mode 100644 sdk/python/v1alpha3/docs/V1Time.md delete mode 100644 sdk/python/v1alpha3/docs/V1UnstructuredUnstructured.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3AlgorithmSetting.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3AlgorithmSpec.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3CollectorSpec.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3EarlyStoppingSetting.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3EarlyStoppingSpec.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3Experiment.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3ExperimentCondition.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3ExperimentList.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3ExperimentSpec.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3ExperimentStatus.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3FeasibleSpace.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3FileSystemPath.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3FilterSpec.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3GoTemplate.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3GraphConfig.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3Metric.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3MetricsCollectorSpec.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3NasConfig.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3ObjectiveSpec.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3Observation.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3Operation.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3OptimalTrial.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3ParameterAssignment.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3ParameterSpec.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3SourceSpec.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3Suggestion.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3SuggestionCondition.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3SuggestionList.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3SuggestionSpec.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3SuggestionStatus.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3TemplateSpec.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3Trial.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3TrialAssignment.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3TrialCondition.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3TrialList.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3TrialSpec.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3TrialStatus.md delete mode 100644 sdk/python/v1alpha3/docs/V1alpha3TrialTemplate.md delete mode 100644 sdk/python/v1alpha3/examples/bayesianoptimization-katib-sdk.ipynb delete mode 100644 sdk/python/v1alpha3/examples/tfjob-katib-sdk.ipynb delete mode 100644 sdk/python/v1alpha3/kubeflow/__init__.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/__init__.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/api/__init__.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/api/katib_client.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/api_client.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/configuration.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/constants/__init__.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/constants/constants.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/__init__.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1_time.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1_unstructured_unstructured.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_algorithm_setting.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_algorithm_spec.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_collector_spec.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_early_stopping_setting.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_early_stopping_spec.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_condition.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_list.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_spec.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_status.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_feasible_space.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_file_system_path.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_filter_spec.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_go_template.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_graph_config.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_metric.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_metrics_collector_spec.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_nas_config.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_objective_spec.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_observation.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_operation.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_optimal_trial.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_parameter_assignment.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_parameter_spec.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_source_spec.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_condition.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_list.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_spec.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_status.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_template_spec.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_assignment.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_condition.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_list.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_spec.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_status.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_template.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/rest.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/utils/__init__.py delete mode 100644 sdk/python/v1alpha3/kubeflow/katib/utils/utils.py delete mode 100644 sdk/python/v1alpha3/requirements.txt delete mode 100644 sdk/python/v1alpha3/setup.py delete mode 100644 sdk/python/v1alpha3/test/__init__.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_algorithm_setting.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_algorithm_spec.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_collector_spec.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_early_stopping_setting.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_early_stopping_spec.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_experiment.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_experiment_condition.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_experiment_list.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_experiment_spec.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_experiment_status.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_feasible_space.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_file_system_path.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_filter_spec.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_go_template.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_graph_config.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_metric.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_metrics_collector_spec.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_nas_config.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_objective_spec.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_observation.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_operation.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_optimal_trial.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_parameter_assignment.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_parameter_spec.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_source_spec.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_suggestion.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_suggestion_condition.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_suggestion_list.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_suggestion_spec.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_suggestion_status.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_template_spec.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_trial.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_trial_assignment.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_trial_condition.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_trial_list.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_trial_spec.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_trial_status.py delete mode 100644 sdk/python/v1alpha3/test/test_v1alpha3_trial_template.py delete mode 100644 sdk/python/v1beta1/docs/KatibClient.md delete mode 100644 sdk/python/v1beta1/docs/V1Time.md delete mode 100644 sdk/python/v1beta1/docs/V1UnstructuredUnstructured.md delete mode 100644 sdk/python/v1beta1/kubeflow/katib/models/v1_time.py delete mode 100644 sdk/python/v1beta1/kubeflow/katib/models/v1_unstructured_unstructured.py delete mode 100644 test/unit/v1alpha3/crds/pytorchjob_v1.yaml delete mode 100644 test/unit/v1alpha3/crds/tfjob_v1.yaml delete mode 100644 vendor/github.com/gobuffalo/envy/LICENSE.txt delete mode 100644 vendor/github.com/gobuffalo/envy/envy.go delete mode 100644 vendor/github.com/gobuffalo/envy/version.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/context.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/convert.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/doc.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/errors.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/handler.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/internal/stream_chunk.pb.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_json.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_jsonpb.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_proto.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler_registry.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/mux.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/pattern.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto2_convert.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto_errors.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/query.go delete mode 100644 vendor/github.com/inconshreveable/mousetrap/LICENSE delete mode 100644 vendor/github.com/inconshreveable/mousetrap/trap_others.go delete mode 100644 vendor/github.com/inconshreveable/mousetrap/trap_windows.go delete mode 100644 vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go delete mode 100644 vendor/github.com/joho/godotenv/LICENCE delete mode 100644 vendor/github.com/joho/godotenv/godotenv.go delete mode 100644 vendor/github.com/markbates/inflect/LICENCE delete mode 100644 vendor/github.com/markbates/inflect/helpers.go delete mode 100644 vendor/github.com/markbates/inflect/inflect.go delete mode 100644 vendor/github.com/markbates/inflect/name.go delete mode 100644 vendor/github.com/markbates/inflect/version.go delete mode 100644 vendor/github.com/mitchellh/go-ps/LICENSE.md delete mode 100644 vendor/github.com/mitchellh/go-ps/process.go delete mode 100644 vendor/github.com/mitchellh/go-ps/process_darwin.go delete mode 100644 vendor/github.com/mitchellh/go-ps/process_freebsd.go delete mode 100644 vendor/github.com/mitchellh/go-ps/process_linux.go delete mode 100644 vendor/github.com/mitchellh/go-ps/process_solaris.go delete mode 100644 vendor/github.com/mitchellh/go-ps/process_unix.go delete mode 100644 vendor/github.com/mitchellh/go-ps/process_windows.go delete mode 100644 vendor/github.com/pkg/errors/LICENSE delete mode 100644 vendor/github.com/pkg/errors/errors.go delete mode 100644 vendor/github.com/pkg/errors/stack.go delete mode 100644 vendor/github.com/rogpeppe/go-internal/LICENSE delete mode 100644 vendor/github.com/rogpeppe/go-internal/modfile/gopkgin.go delete mode 100644 vendor/github.com/rogpeppe/go-internal/modfile/print.go delete mode 100644 vendor/github.com/rogpeppe/go-internal/modfile/read.go delete mode 100644 vendor/github.com/rogpeppe/go-internal/modfile/rule.go delete mode 100644 vendor/github.com/rogpeppe/go-internal/module/module.go delete mode 100644 vendor/github.com/rogpeppe/go-internal/semver/semver.go delete mode 100644 vendor/github.com/spf13/cobra/LICENSE.txt delete mode 100644 vendor/github.com/spf13/cobra/args.go delete mode 100644 vendor/github.com/spf13/cobra/bash_completions.go delete mode 100644 vendor/github.com/spf13/cobra/cobra.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/testdata/LICENSE.golden delete mode 100644 vendor/github.com/spf13/cobra/command.go delete mode 100644 vendor/github.com/spf13/cobra/command_notwin.go delete mode 100644 vendor/github.com/spf13/cobra/command_win.go delete mode 100644 vendor/github.com/spf13/cobra/zsh_completions.go rename vendor/gopkg.in/{ => fsnotify}/fsnotify.v1/AUTHORS (100%) rename vendor/gopkg.in/{ => fsnotify}/fsnotify.v1/LICENSE (95%) rename vendor/gopkg.in/{ => fsnotify}/fsnotify.v1/fen.go (100%) rename vendor/gopkg.in/{ => fsnotify}/fsnotify.v1/fsnotify.go (95%) rename vendor/gopkg.in/{ => fsnotify}/fsnotify.v1/inotify.go (100%) rename vendor/gopkg.in/{ => fsnotify}/fsnotify.v1/inotify_poller.go (97%) rename vendor/gopkg.in/{ => fsnotify}/fsnotify.v1/kqueue.go (100%) rename vendor/gopkg.in/{ => fsnotify}/fsnotify.v1/open_mode_bsd.go (79%) rename vendor/gopkg.in/{ => fsnotify}/fsnotify.v1/open_mode_darwin.go (84%) rename vendor/gopkg.in/{ => fsnotify}/fsnotify.v1/windows.go (100%) delete mode 100644 vendor/sigs.k8s.io/controller-tools/LICENSE delete mode 100644 vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/crd/generator/generator.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/crd/util/util.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/apis.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/context.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/crd.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/index.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/parser.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/util.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/types.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/internal/general/util.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/rbac/manifests.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/rbac/parser.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/util/util.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/webhook/internal/client.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/webhook/internal/manager.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/webhook/manifests.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/webhook/parser.go diff --git a/.dockerignore b/.dockerignore index aaf093a40b5..a35766d72d6 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,8 +2,6 @@ .gitignore docs examples -!examples/v1alpha3/nas -!examples/v1beta1/nas manifests pkg/ui/*/frontend/node_modules pkg/ui/*/frontend/build diff --git a/.travis.yml b/.travis.yml index b33561086b5..ddfd48fd81b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,5 +23,4 @@ jobs: install: - npm install --global prettier@1.19.1 script: - - make prettier-check-v1alpha3 - make prettier-check diff --git a/Gopkg.lock b/Gopkg.lock index 6d63a73e4dc..e98d5f16616 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -250,14 +250,6 @@ revision = "72cd26f257d44c1114970e19afddcd812016007e" version = "v1.4.1" -[[projects]] - digest = "1:9059915429f7f3a5f18cfa6b7cab9a28721d7ac6db4079a62044aa229eb7f2a8" - name = "github.com/gobuffalo/envy" - packages = ["."] - pruneopts = "NUT" - revision = "fa0dfdc10b5366ce365b7d9d1755a03e4e797bc5" - version = "v1.6.15" - [[projects]] digest = "1:abea725bcf0210887f5da19d804fffa1dd45a42a56bdf5f02322345e3fee4f0d" name = "github.com/gogo/protobuf" @@ -393,7 +385,7 @@ version = "v1.2.0" [[projects]] - digest = "1:7ad601623f5af048e72d0c712e2ce6647dbbd14d9e18c31e3464156de8c567ee" + digest = "1:d7ebfd2c03c66823ab7e24a231fc543ee625d13f44cd9423e67558f779a58556" name = "github.com/grpc-ecosystem/grpc-gateway" packages = [ "codegenerator", @@ -405,8 +397,6 @@ "protoc-gen-swagger", "protoc-gen-swagger/genswagger", "protoc-gen-swagger/options", - "runtime", - "runtime/internal", "utilities", ] pruneopts = "NUT" @@ -444,7 +434,8 @@ version = "v1.0.0" [[projects]] - digest = "1:41933d387bfa3eaa6a82647914ed7044f7b8355764c24fb920892bc8c03ef0c3" + branch = "master" + digest = "1:8d485687c449a7db7d4e8e1d6526036fe38e433232416010fe3970c929134073" name = "github.com/hpcloud/tail" packages = [ ".", @@ -454,8 +445,7 @@ "winfile", ] pruneopts = "NUT" - revision = "a30252cb686a21eb2d0b98132633053ec2f7f1e5" - version = "v1.0.0" + revision = "a1dbeea552b7c8df4b542c66073e393de198a800" [[projects]] digest = "1:aaa38889f11896ee3644d77e17dc7764cc47f5f3d3b488268df2af2b52541c5f" @@ -465,14 +455,6 @@ revision = "7c29201646fa3de8506f701213473dd407f19646" version = "v0.3.7" -[[projects]] - digest = "1:406338ad39ab2e37b7f4452906442a3dbf0eb3379dd1f06aafb5c07e769a5fbb" - name = "github.com/inconshreveable/mousetrap" - packages = ["."] - pruneopts = "NUT" - revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" - version = "v1.0" - [[projects]] digest = "1:1f2aebae7e7c856562355ec0198d8ca2fa222fb05e5b1b66632a1fce39631885" name = "github.com/jmespath/go-jmespath" @@ -480,14 +462,6 @@ pruneopts = "NUT" revision = "c2b33e84" -[[projects]] - digest = "1:da62aa6632d04e080b8a8b85a59ed9ed1550842a0099a55f3ae3a20d02a3745a" - name = "github.com/joho/godotenv" - packages = ["."] - pruneopts = "NUT" - revision = "23d116af351c84513e1946b527c88823e476be13" - version = "v1.3.0" - [[projects]] digest = "1:8e36686e8b139f8fe240c1d5cf3a145bc675c22ff8e707857cdd3ae17b00d728" name = "github.com/json-iterator/go" @@ -535,14 +509,6 @@ pruneopts = "NUT" revision = "60711f1a8329503b04e1c88535f419d0bb440bff" -[[projects]] - digest = "1:56dbf15e091bf7926cb33a57cb6bdfc658fc6d3498d2f76f10a97ce7856f1fde" - name = "github.com/markbates/inflect" - packages = ["."] - pruneopts = "NUT" - revision = "24b83195037b3bc61fcda2d28b7b0518bce293b6" - version = "v1.0.4" - [[projects]] branch = "master" digest = "1:0e9bfc47ab9941ecc3344e580baca5deb4091177e84dd9773b48b38ec26b93d5" @@ -559,14 +525,6 @@ revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" version = "v1.0.1" -[[projects]] - branch = "master" - digest = "1:ccbfcadc4082059be76365bbcfdcf8430356ea5dd94537b0e68e8423f200f0cf" - name = "github.com/mitchellh/go-ps" - packages = ["."] - pruneopts = "NUT" - revision = "621e5597135b1d14a7d9c2bfc7bc312e7c58463c" - [[projects]] digest = "1:a45ae66dea4c899d79fceb116accfa1892105c251f0dcd9a217ddc276b42ec68" name = "github.com/mitchellh/mapstructure" @@ -673,14 +631,6 @@ revision = "5f041e8faa004a95c88a202771f4cc3e991971e6" version = "v2.0.1" -[[projects]] - digest = "1:14715f705ff5dfe0ffd6571d7d201dd8e921030f8070321a79380d8ca4ec1a24" - name = "github.com/pkg/errors" - packages = ["."] - pruneopts = "NUT" - revision = "ba968bfe8b2f7e042a574c888954fccecfa385b4" - version = "v0.8.1" - [[projects]] digest = "1:3d7ad9c93ee2e43dc7dd48b76f96804c365be7fe30e75f7405028c4e633d189a" name = "github.com/prometheus/client_golang" @@ -724,18 +674,6 @@ revision = "3f98efb27840a48a7a2898ec80be07674d19f9c8" version = "v0.0.3" -[[projects]] - digest = "1:e09ada96a5a41deda4748b1659cc8953961799e798aea557257b56baee4ecaf3" - name = "github.com/rogpeppe/go-internal" - packages = [ - "modfile", - "module", - "semver", - ] - pruneopts = "NUT" - revision = "2ea7272aa4c7de5c8a568dff504404e8dc49945d" - version = "v1.2.1" - [[projects]] digest = "1:a3795b4e2d3bf4f6dcce18f1eeca71b670fce0216c9e1f7dbf4f3a96802e4560" name = "github.com/shirou/gopsutil" @@ -769,14 +707,6 @@ revision = "8c9545af88b134710ab1cd196795e7f2388358d7" version = "v1.3.0" -[[projects]] - digest = "1:343d44e06621142ab09ae0c76c1799104cdfddd3ffb445d78b1adf8dc3ffaf3d" - name = "github.com/spf13/cobra" - packages = ["."] - pruneopts = "NUT" - revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385" - version = "v0.0.3" - [[projects]] digest = "1:3d72352adb74e79d6d5a43d6f51bfd2d0bd0c9b5f3c00cf5a4b1636d8d3b9d92" name = "github.com/spf13/jwalterweatherman" @@ -1092,13 +1022,12 @@ version = "v1.3.2" [[projects]] - digest = "1:1b91ae0dc69a41d4c2ed23ea5cffb721ea63f5037ca4b81e6d6771fbb8f45129" - name = "gopkg.in/fsnotify.v1" + digest = "1:0914bf7efc3e3052163e92b859a89f3b407ad353d7c3b7f59a1bbb4fd05bb25d" + name = "gopkg.in/fsnotify/fsnotify.v1" packages = ["."] pruneopts = "NUT" - revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" - source = "https://github.com/fsnotify/fsnotify.git" - version = "v1.4.7" + revision = "45d7d09e39ef4ac08d493309fa031790c15bfe8a" + version = "v1.4.9" [[projects]] digest = "1:2d1fbdc6777e5408cabeb02bf336305e724b925ff4546ded0fa8715a7267922a" @@ -1176,8 +1105,8 @@ "pkg/client/clientset/clientset/typed/apiextensions/v1beta1", ] pruneopts = "NUT" - revision = "fa58353d80f37509c2b8de8e67f2377a2bc2ce80" - version = "kubernetes-1.12.9" + revision = "0cd23ebeb6882bd1cdc2cb15fc7b2d72e8a86a5b" + version = "kubernetes-1.12.3" [[projects]] digest = "1:aade642b1052b8b4574ffe0df877c495bfdfa76b8a1930c5492fb7d4b05f720f" @@ -1430,25 +1359,6 @@ revision = "f6f0bc9611363b43664d08fb097ab13243ef621d" version = "v0.1.9" -[[projects]] - digest = "1:946a62b07e59b9abd1f475a5b5c8d590255c1d40627f386d34fd073d3de9ecb8" - name = "sigs.k8s.io/controller-tools" - packages = [ - "cmd/controller-gen", - "pkg/crd/generator", - "pkg/crd/util", - "pkg/internal/codegen", - "pkg/internal/codegen/parse", - "pkg/internal/general", - "pkg/rbac", - "pkg/util", - "pkg/webhook", - "pkg/webhook/internal", - ] - pruneopts = "NUT" - revision = "950a0e88e4effb864253b3c7504b326cc83b9d11" - version = "v0.1.8" - [[projects]] digest = "1:237ad09ac561f3e3a2a2e9f3fee85fea98c0f41f381ac80562b05bdaa9fe89c6" name = "sigs.k8s.io/testing_frameworks" @@ -1492,15 +1402,11 @@ "github.com/grpc-ecosystem/go-grpc-middleware/retry", "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway", "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger", - "github.com/grpc-ecosystem/grpc-gateway/runtime", - "github.com/grpc-ecosystem/grpc-gateway/utilities", "github.com/hpcloud/tail", "github.com/kubeflow/pytorch-operator/pkg/apis/pytorch/v1", "github.com/kubeflow/tf-operator/pkg/apis/common/v1", "github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1", "github.com/mattbaird/jsonpatch", - "github.com/mitchellh/go-ps", - "github.com/onsi/ginkgo", "github.com/onsi/gomega", "github.com/prometheus/client_golang/prometheus", "github.com/shirou/gopsutil/process", @@ -1510,14 +1416,12 @@ "google.golang.org/genproto/googleapis/api/annotations", "google.golang.org/grpc", "google.golang.org/grpc/codes", - "google.golang.org/grpc/grpclog", "google.golang.org/grpc/reflection", "google.golang.org/grpc/status", "gopkg.in/DATA-DOG/go-sqlmock.v1", "k8s.io/api/admissionregistration/v1beta1", "k8s.io/api/apps/v1", "k8s.io/api/batch/v1", - "k8s.io/api/batch/v1beta1", "k8s.io/api/core/v1", "k8s.io/api/rbac/v1", "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1", @@ -1570,7 +1474,6 @@ "sigs.k8s.io/controller-runtime/pkg/webhook/admission", "sigs.k8s.io/controller-runtime/pkg/webhook/admission/builder", "sigs.k8s.io/controller-runtime/pkg/webhook/admission/types", - "sigs.k8s.io/controller-tools/cmd/controller-gen", "sigs.k8s.io/testing_frameworks/integration", ] solver-name = "gps-cdcl" diff --git a/Gopkg.toml b/Gopkg.toml index 70968340186..98ede4d9f48 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -1,11 +1,8 @@ required = [ "github.com/emicklei/go-restful", - "github.com/onsi/ginkgo", # for test framework - "github.com/onsi/gomega", # for test matchers "k8s.io/client-go/plugin/pkg/client/auth/gcp", # for development against gcp "k8s.io/code-generator/cmd/deepcopy-gen", # for deepcopy generation "k8s.io/code-generator/cmd/openapi-gen", # for openapi generation - "sigs.k8s.io/controller-tools/cmd/controller-gen", # for crd/rbac generation "sigs.k8s.io/controller-runtime/pkg/client/config", "sigs.k8s.io/controller-runtime/pkg/controller", "sigs.k8s.io/controller-runtime/pkg/handler", @@ -73,19 +70,6 @@ required = [ name = "k8s.io/client-go" version = "kubernetes-1.12.9" -[[override]] - name = "k8s.io/apiextensions-apiserver" - version = "kubernetes-1.12.9" - -[[override]] - name = "k8s.io/kubernetes" - version = "v1.13.3" - -[[override]] - name = "gopkg.in/fsnotify.v1" - source = "https://github.com/fsnotify/fsnotify.git" - version="v1.4.7" - [[constraint]] name = "github.com/kubeflow/tf-operator" branch = "v0.7-branch" diff --git a/Makefile b/Makefile index 6df38251119..964e477e295 100644 --- a/Makefile +++ b/Makefile @@ -30,18 +30,10 @@ vet: update: hack/update-gofmt.sh -# Deploy Katib v1alpha3 manifests into a k8s cluster -deployv1alpha3: - bash scripts/v1alpha3/deploy.sh - # Deploy Katib v1beta1 manifests into a k8s cluster deploy: bash scripts/v1beta1/deploy.sh -# Undeploy Katib v1alpha3 manifests from a k8s cluster -undeployv1alpha3: - bash scripts/v1alpha3/undeploy.sh - # Undeploy Katib v1beta1 manifests from a k8s cluster undeploy: bash scripts/v1beta1/undeploy.sh @@ -55,10 +47,6 @@ endif go generate ./pkg/... ./cmd/... hack/gen-python-sdk/gen-sdk.sh -# Build images for Katib v1alpha3 components -buildv1alpha3: depend generate - bash scripts/v1alpha3/build.sh - # Build images for Katib v1beta1 components build: depend generate ifeq ($(and $(REGISTRY),$(TAG)),) @@ -66,10 +54,6 @@ ifeq ($(and $(REGISTRY),$(TAG)),) endif bash scripts/v1beta1/build.sh -r $(REGISTRY) -t $(TAG) -# Prettier UI format check for Katib v1alpha3 -prettier-check-v1alpha3: - npm run format:check --prefix pkg/ui/v1alpha3/frontend - # Prettier UI format check for Katib v1beta1 prettier-check: npm run format:check --prefix pkg/ui/v1beta1/frontend diff --git a/cmd/db-manager/v1alpha3/Dockerfile b/cmd/db-manager/v1alpha3/Dockerfile deleted file mode 100644 index 3dc51a61c45..00000000000 --- a/cmd/db-manager/v1alpha3/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM golang:alpine AS build-env -# The GOPATH in the image is /go. -ADD . /go/src/github.com/kubeflow/katib -WORKDIR /go/src/github.com/kubeflow/katib/cmd/db-manager -RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ - apk --update add git gcc musl-dev && \ - go build -o katib-db-manager ./v1alpha3; \ - else \ - go build -o katib-db-manager ./v1alpha3; \ - fi -RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ - if [ "$(uname -m)" = "ppc64le" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ - elif [ "$(uname -m)" = "aarch64" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ - else \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ - fi && \ - chmod +x /bin/grpc_health_probe - -FROM alpine:3.7 -WORKDIR /app -COPY --from=build-env /bin/grpc_health_probe /bin/ -COPY --from=build-env /go/src/github.com/kubeflow/katib/cmd/db-manager/katib-db-manager /app/ -ENTRYPOINT ["./katib-db-manager"] -CMD ["-w", "kubernetes"] diff --git a/cmd/db-manager/v1alpha3/main.go b/cmd/db-manager/v1alpha3/main.go deleted file mode 100644 index 0638bb052c1..00000000000 --- a/cmd/db-manager/v1alpha3/main.go +++ /dev/null @@ -1,100 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - "net" - "os" - - health_pb "github.com/kubeflow/katib/pkg/apis/manager/health" - api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - db "github.com/kubeflow/katib/pkg/db/v1alpha3" - "github.com/kubeflow/katib/pkg/db/v1alpha3/common" - "k8s.io/klog" - - "google.golang.org/grpc" - "google.golang.org/grpc/reflection" -) - -const ( - port = "0.0.0.0:6789" -) - -var dbIf common.KatibDBInterface - -type server struct { -} - -// Report a log of Observations for a Trial. -// The log consists of timestamp and value of metric. -// Katib store every log of metrics. -// You can see accuracy curve or other metric logs on UI. -func (s *server) ReportObservationLog(ctx context.Context, in *api_pb.ReportObservationLogRequest) (*api_pb.ReportObservationLogReply, error) { - err := dbIf.RegisterObservationLog(in.TrialName, in.ObservationLog) - return &api_pb.ReportObservationLogReply{}, err -} - -// Get all log of Observations for a Trial. -func (s *server) GetObservationLog(ctx context.Context, in *api_pb.GetObservationLogRequest) (*api_pb.GetObservationLogReply, error) { - ol, err := dbIf.GetObservationLog(in.TrialName, in.MetricName, in.StartTime, in.EndTime) - return &api_pb.GetObservationLogReply{ - ObservationLog: ol, - }, err -} - -// Delete all log of Observations for a Trial. -func (s *server) DeleteObservationLog(ctx context.Context, in *api_pb.DeleteObservationLogRequest) (*api_pb.DeleteObservationLogReply, error) { - err := dbIf.DeleteObservationLog(in.TrialName) - return &api_pb.DeleteObservationLogReply{}, err -} - -func (s *server) Check(ctx context.Context, in *health_pb.HealthCheckRequest) (*health_pb.HealthCheckResponse, error) { - resp := health_pb.HealthCheckResponse{ - Status: health_pb.HealthCheckResponse_SERVING, - } - - // We only accept optional service name only if it's set to suggested format. - if in != nil && in.Service != "" && in.Service != "grpc.health.v1.Health" { - resp.Status = health_pb.HealthCheckResponse_UNKNOWN - return &resp, fmt.Errorf("grpc.health.v1.Health can only be accepted if you specify service name.") - } - - // Check if connection to katib db driver is okay since otherwise manager could not serve most of its methods. - err := dbIf.SelectOne() - if err != nil { - resp.Status = health_pb.HealthCheckResponse_NOT_SERVING - return &resp, fmt.Errorf("Failed to execute `SELECT 1` probe: %v", err) - } - - return &resp, nil -} - -func main() { - flag.Parse() - var err error - dbNameEnvName := common.DBNameEnvName - dbName := os.Getenv(dbNameEnvName) - if dbName == "" { - klog.Fatal("DB_NAME env is not set. Exiting") - } - dbIf, err = db.NewKatibDBInterface(dbName) - if err != nil { - klog.Fatalf("Failed to open db connection: %v", err) - } - dbIf.DBInit() - listener, err := net.Listen("tcp", port) - if err != nil { - klog.Fatalf("Failed to listen: %v", err) - } - - size := 1<<31 - 1 - klog.Infof("Start Katib manager: %s", port) - s := grpc.NewServer(grpc.MaxRecvMsgSize(size), grpc.MaxSendMsgSize(size)) - api_pb.RegisterManagerServer(s, &server{}) - health_pb.RegisterHealthServer(s, &server{}) - reflection.Register(s) - if err = s.Serve(listener); err != nil { - klog.Fatalf("Failed to serve: %v", err) - } -} diff --git a/cmd/db-manager/v1alpha3/main_test.go b/cmd/db-manager/v1alpha3/main_test.go deleted file mode 100644 index c8f84fe142d..00000000000 --- a/cmd/db-manager/v1alpha3/main_test.go +++ /dev/null @@ -1,171 +0,0 @@ -package main - -import ( - "context" - "testing" - - "github.com/golang/mock/gomock" - - health_pb "github.com/kubeflow/katib/pkg/apis/manager/health" - api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - mockdb "github.com/kubeflow/katib/pkg/mock/v1alpha3/db" -) - -func TestReportObservationLog(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - s := &server{} - mockDB := mockdb.NewMockKatibDBInterface(ctrl) - dbIf = mockDB - - req := &api_pb.ReportObservationLogRequest{ - TrialName: "test1-trial1", - ObservationLog: &api_pb.ObservationLog{ - MetricLogs: []*api_pb.MetricLog{ - { - TimeStamp: "2019-02-03T04:05:06+09:00", - Metric: &api_pb.Metric{ - Name: "f1_score", - Value: "88.95", - }, - }, - { - TimeStamp: "2019-02-03T04:05:06+09:00", - Metric: &api_pb.Metric{ - Name: "loss", - Value: "0.5", - }, - }, - { - TimeStamp: "2019-02-03T04:05:06+09:00", - Metric: &api_pb.Metric{ - Name: "precision", - Value: "88.7", - }, - }, - { - TimeStamp: "2019-02-03T04:05:06+09:00", - Metric: &api_pb.Metric{ - Name: "recall", - Value: "89.2", - }, - }, - }, - }, - } - mockDB.EXPECT().RegisterObservationLog(req.TrialName, req.ObservationLog).Return(nil) - _, err := s.ReportObservationLog(context.Background(), req) - if err != nil { - t.Fatalf("ReportObservationLog Error %v", err) - } -} - -func TestGetObservationLog(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - s := &server{} - mockDB := mockdb.NewMockKatibDBInterface(ctrl) - dbIf = mockDB - - req := &api_pb.GetObservationLogRequest{ - TrialName: "test1-trial1", - StartTime: "2019-02-03T03:05:06+09:00", - EndTime: "2019-02-03T05:05:06+09:00", - } - - obs := &api_pb.ObservationLog{ - MetricLogs: []*api_pb.MetricLog{ - { - TimeStamp: "2019-02-03T04:05:06+09:00", - Metric: &api_pb.Metric{ - Name: "f1_score", - Value: "88.95", - }, - }, - { - TimeStamp: "2019-02-03T04:05:06+09:00", - Metric: &api_pb.Metric{ - Name: "loss", - Value: "0.5", - }, - }, - { - TimeStamp: "2019-02-03T04:05:06+09:00", - Metric: &api_pb.Metric{ - Name: "precision", - Value: "88.7", - }, - }, - { - TimeStamp: "2019-02-03T04:05:06+09:00", - Metric: &api_pb.Metric{ - Name: "recall", - Value: "89.2", - }, - }, - }, - } - - mockDB.EXPECT().GetObservationLog(req.TrialName, req.MetricName, req.StartTime, req.EndTime).Return(obs, nil) - ret, err := s.GetObservationLog(context.Background(), req) - if err != nil { - t.Fatalf("GetObservationLog Error %v", err) - } - if len(obs.MetricLogs) != len(ret.ObservationLog.MetricLogs) { - t.Fatalf("GetObservationLog Test fail expect metrics number %d got %d", len(obs.MetricLogs), len(ret.ObservationLog.MetricLogs)) - } -} - -func TestDeleteObservationLog(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - s := &server{} - mockDB := mockdb.NewMockKatibDBInterface(ctrl) - dbIf = mockDB - - req := &api_pb.DeleteObservationLogRequest{ - TrialName: "test1-trial1", - } - mockDB.EXPECT().DeleteObservationLog(req.TrialName).Return(nil) - _, err := s.DeleteObservationLog(context.Background(), req) - if err != nil { - t.Fatalf("DeleteExperiment Error %v", err) - } -} - -func TestCheck(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - s := &server{} - mockDB := mockdb.NewMockKatibDBInterface(ctrl) - dbIf = mockDB - testCases := []struct { - Request *health_pb.HealthCheckRequest - ExpectedStatus health_pb.HealthCheckResponse_ServingStatus - Name string - }{ - { - Request: &health_pb.HealthCheckRequest{ - Service: "grpc.health.v1.Health", - }, - ExpectedStatus: health_pb.HealthCheckResponse_SERVING, - Name: "Valid Request", - }, - { - Request: &health_pb.HealthCheckRequest{ - Service: "grpc.health.v1.1.Health", - }, - ExpectedStatus: health_pb.HealthCheckResponse_UNKNOWN, - Name: "Invalid service name", - }, - } - - mockDB.EXPECT().SelectOne().Return(nil) - - for _, tc := range testCases { - response, _ := s.Check(context.Background(), tc.Request) - if response.Status != tc.ExpectedStatus { - t.Fatalf("Case %v failed. ExpectedStatus %v, got %v", tc.Name, tc.ExpectedStatus, response.Status) - } - } -} diff --git a/cmd/katib-controller/v1alpha3/Dockerfile b/cmd/katib-controller/v1alpha3/Dockerfile deleted file mode 100644 index 31e4aba1022..00000000000 --- a/cmd/katib-controller/v1alpha3/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -# Build the manager binary -FROM golang:alpine AS build-env - -# Copy in the go src -ADD . /go/src/github.com/kubeflow/katib - -WORKDIR /go/src/github.com/kubeflow/katib/cmd/katib-controller -# Build -RUN if [ "$(uname -m)" = "ppc64le" ]; then \ - CGO_ENABLED=0 GOOS=linux GOARCH=ppc64le go build -a -o katib-controller ./v1alpha3; \ - elif [ "$(uname -m)" = "aarch64" ]; then \ - CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -a -o katib-controller ./v1alpha3; \ - else \ - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o katib-controller ./v1alpha3; \ - fi -# Copy the controller-manager into a thin image -FROM alpine:3.7 -WORKDIR /app -RUN apk update && apk add ca-certificates -COPY --from=build-env /go/src/github.com/kubeflow/katib/cmd/katib-controller/katib-controller . -USER 1000 -ENTRYPOINT ["./katib-controller"] diff --git a/cmd/katib-controller/v1alpha3/main.go b/cmd/katib-controller/v1alpha3/main.go deleted file mode 100644 index d8fad02ae99..00000000000 --- a/cmd/katib-controller/v1alpha3/main.go +++ /dev/null @@ -1,123 +0,0 @@ -/* -Copyright 2018 The Kubeflow Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* - Katib-controller is a controller (operator) for Experiments and Trials -*/ -package main - -import ( - "flag" - "os" - - "github.com/spf13/viper" - _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" - "sigs.k8s.io/controller-runtime/pkg/client/config" - "sigs.k8s.io/controller-runtime/pkg/manager" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - "sigs.k8s.io/controller-runtime/pkg/runtime/signals" - - apis "github.com/kubeflow/katib/pkg/apis/controller" - controller "github.com/kubeflow/katib/pkg/controller.v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - webhook "github.com/kubeflow/katib/pkg/webhook/v1alpha3" -) - -func main() { - logf.SetLogger(logf.ZapLogger(false)) - log := logf.Log.WithName("entrypoint") - - var experimentSuggestionName string - var metricsAddr string - var webhookPort int - var certLocalFS bool - var injectSecurityContext bool - var serviceName string - var enableGRPCProbeInSuggestion bool - - flag.StringVar(&experimentSuggestionName, "experiment-suggestion-name", - "default", "The implementation of suggestion interface in experiment controller (default|fake)") - flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.") - flag.IntVar(&webhookPort, "webhook-port", 8443, "The port number to be used for admission webhook server.") - flag.BoolVar(&certLocalFS, "cert-localfs", false, "Store the webhook cert in local file system") - flag.BoolVar(&injectSecurityContext, "webhook-inject-securitycontext", false, "Inject the securityContext of container[0] in the sidecar") - flag.StringVar(&serviceName, "webhook-service-name", "katib-controller", "The service name which will be used in webhook") - flag.BoolVar(&enableGRPCProbeInSuggestion, "enable-grpc-probe-in-suggestion", true, "enable grpc probe in suggestions") - - flag.Parse() - - // Set the config in viper. - viper.Set(consts.ConfigExperimentSuggestionName, experimentSuggestionName) - viper.Set(consts.ConfigCertLocalFS, certLocalFS) - viper.Set(consts.ConfigInjectSecurityContext, injectSecurityContext) - viper.Set(consts.ConfigEnableGRPCProbeInSuggestion, enableGRPCProbeInSuggestion) - - log.Info("Config:", - consts.ConfigExperimentSuggestionName, - viper.GetString(consts.ConfigExperimentSuggestionName), - consts.ConfigCertLocalFS, - viper.GetBool(consts.ConfigCertLocalFS), - "webhook-port", - webhookPort, - "metrics-addr", - metricsAddr, - consts.ConfigInjectSecurityContext, - viper.GetBool(consts.ConfigInjectSecurityContext), - consts.ConfigEnableGRPCProbeInSuggestion, - viper.GetBool(consts.ConfigEnableGRPCProbeInSuggestion), - ) - - // Get a config to talk to the apiserver - cfg, err := config.GetConfig() - if err != nil { - log.Error(err, "Fail to get the config") - os.Exit(1) - } - - // Create a new katib controller to provide shared dependencies and start components - mgr, err := manager.New(cfg, manager.Options{ - MetricsBindAddress: metricsAddr, - }) - if err != nil { - log.Error(err, "unable add APIs to scheme") - os.Exit(1) - } - - log.Info("Registering Components.") - - // Setup Scheme for all resources - if err := apis.AddToScheme(mgr.GetScheme()); err != nil { - log.Error(err, "Fail to create the manager") - os.Exit(1) - } - - // Setup all Controllers - log.Info("Setting up controller") - if err := controller.AddToManager(mgr); err != nil { - log.Error(err, "unable to register controllers to the manager") - os.Exit(1) - } - - log.Info("Setting up webhooks") - if err := webhook.AddToManager(mgr, int32(webhookPort), serviceName); err != nil { - log.Error(err, "unable to register webhooks to the manager") - os.Exit(1) - } - - // Start the Cmd - log.Info("Starting the Cmd.") - if err := mgr.Start(signals.SetupSignalHandler()); err != nil { - log.Error(err, "unable to run the manager") - os.Exit(1) - } -} diff --git a/cmd/metricscollector/v1alpha3/file-metricscollector/Dockerfile b/cmd/metricscollector/v1alpha3/file-metricscollector/Dockerfile deleted file mode 100644 index 556205b1d7c..00000000000 --- a/cmd/metricscollector/v1alpha3/file-metricscollector/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -# Build the manager binary -FROM golang:alpine AS build-env - -# Copy in the go src -ADD . /go/src/github.com/kubeflow/katib - -WORKDIR /go/src/github.com/kubeflow/katib/cmd/metricscollector/v1alpha3/file-metricscollector/ - -# Build -RUN if [ "$(uname -m)" = "ppc64le" ]; then \ - CGO_ENABLED=0 GOOS=linux GOARCH=ppc64le go build -a -o file-metricscollector ./; \ - elif [ "$(uname -m)" = "aarch64" ]; then \ - CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -a -o file-metricscollector ./; \ - else \ - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o file-metricscollector ./; \ - fi - -# Copy the controller-manager into a thin image -FROM alpine:3.7 -WORKDIR /app -COPY --from=build-env /go/src/github.com/kubeflow/katib/cmd/metricscollector/v1alpha3/file-metricscollector/file-metricscollector . -ENTRYPOINT ["./file-metricscollector"] diff --git a/cmd/metricscollector/v1alpha3/file-metricscollector/main.go b/cmd/metricscollector/v1alpha3/file-metricscollector/main.go deleted file mode 100644 index 7c6b758ae0d..00000000000 --- a/cmd/metricscollector/v1alpha3/file-metricscollector/main.go +++ /dev/null @@ -1,128 +0,0 @@ -/* -Copyright 2018 The Kubeflow Authors - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* -MetricsCollector is a default metricscollector for worker. -It will collect metrics from pod log. -You should print metrics in {{MetricsName}}={{MetricsValue}} format. -For example, the objective value name is F1 and the metrics are loss, your training code should print like below. - --- - epoch 1: - batch1 loss=0.8 - batch2 loss=0.6 - - F1=0.4 - - epoch 2: - batch1 loss=0.4 - batch2 loss=0.2 - - F1=0.7 - --- -The metrics collector will collect all logs of metrics. -*/ - -package main - -import ( - "context" - "flag" - "os" - "path/filepath" - "strings" - - "github.com/hpcloud/tail" - "google.golang.org/grpc" - "k8s.io/klog" - - api "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - "github.com/kubeflow/katib/pkg/metricscollector/v1alpha3/common" - filemc "github.com/kubeflow/katib/pkg/metricscollector/v1alpha3/file-metricscollector" -) - -var ( - metricsFileName = flag.String("path", "", "Metrics File Path") - trialName = flag.String("t", "", "Trial Name") - managerService = flag.String("s", "", "Katib Manager service") - metricNames = flag.String("m", "", "Metric names") - filters = flag.String("f", "", "Metric filters") - pollInterval = flag.Duration("p", common.DefaultPollInterval, "Poll interval to check if main process of worker container exit") - timeout = flag.Duration("timeout", common.DefaultTimeout, "Timeout to check if main process of worker container exit") - waitAll = flag.Bool("w", common.DefaultWaitAll, "Whether wait for all other main process of container exiting") -) - -func printMetricsFile(mFile string) { - for { - _, err := os.Stat(mFile) - if err == nil { - break - } else if os.IsNotExist(err) { - continue - } else { - klog.Fatalf("could not watch metrics file: %v", err) - } - } - - t, _ := tail.TailFile(mFile, tail.Config{Follow: true}) - for line := range t.Lines { - klog.Info(line.Text) - } -} - -func main() { - flag.Parse() - klog.Infof("Trial Name: %s", *trialName) - - go printMetricsFile(*metricsFileName) - wopts := common.WaitPidsOpts{ - PollInterval: *pollInterval, - Timeout: *timeout, - WaitAll: *waitAll, - CompletedMarkedDirPath: filepath.Dir(*metricsFileName), - } - if err := common.Wait(wopts); err != nil { - klog.Fatalf("Failed to wait for worker container: %v", err) - } - - conn, err := grpc.Dial(*managerService, grpc.WithInsecure()) - if err != nil { - klog.Fatalf("could not connect: %v", err) - } - defer conn.Close() - c := api.NewManagerClient(conn) - ctx := context.Background() - var metricList []string - if len(*metricNames) != 0 { - metricList = strings.Split(*metricNames, ";") - } - var filterList []string - if len(*filters) != 0 { - filterList = strings.Split(*filters, ";") - } - olog, err := filemc.CollectObservationLog(*metricsFileName, metricList, filterList) - if err != nil { - klog.Fatalf("Failed to collect logs: %v", err) - } - reportreq := &api.ReportObservationLogRequest{ - TrialName: *trialName, - ObservationLog: olog, - } - _, err = c.ReportObservationLog(ctx, reportreq) - if err != nil { - klog.Fatalf("Failed to Report logs: %v", err) - } - klog.Infof("Metrics reported. :\n%v", olog) -} diff --git a/cmd/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile b/cmd/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile deleted file mode 100644 index 1426ed9a86f..00000000000 --- a/cmd/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM tensorflow/tensorflow:1.11.0 -RUN pip install rfc3339 grpcio googleapis-common-protos -ADD . /usr/src/app/github.com/kubeflow/katib -WORKDIR /usr/src/app/github.com/kubeflow/katib/cmd/metricscollector/v1alpha3/tfevent-metricscollector/ -RUN pip install --no-cache-dir -r requirements.txt -ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/v1alpha3/python:/usr/src/app/github.com/kubeflow/katib/pkg/metricscollector/v1alpha3/tfevent-metricscollector/:/usr/src/app/github.com/kubeflow/katib/pkg/metricscollector/v1alpha3/common/ -ENTRYPOINT ["python", "main.py"] diff --git a/cmd/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile.aarch64 b/cmd/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile.aarch64 deleted file mode 100644 index 09d5c3b6f97..00000000000 --- a/cmd/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile.aarch64 +++ /dev/null @@ -1,28 +0,0 @@ -FROM ubuntu:18.04 - -RUN apt-get update \ - && apt-get -y install software-properties-common \ - autoconf \ - automake \ - build-essential \ - cmake \ - pkg-config \ - wget \ - python-pip \ - libhdf5-dev \ - libhdf5-serial-dev \ - hdf5-tools\ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -RUN wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.11.0/tensorflow-1.11.0-cp27-none-linux_aarch64.whl \ - && pip install tensorflow-1.11.0-cp27-none-linux_aarch64.whl \ - && rm tensorflow-1.11.0-cp27-none-linux_aarch64.whl \ - && rm -rf .cache - -RUN pip install rfc3339 grpcio googleapis-common-protos jupyter -ADD . /usr/src/app/github.com/kubeflow/katib -WORKDIR /usr/src/app/github.com/kubeflow/katib/cmd/metricscollector/v1alpha3/tfevent-metricscollector/ -RUN pip install --no-cache-dir -r requirements.txt -ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/v1alpha3/python:/usr/src/app/github.com/kubeflow/katib/pkg/metricscollector/v1alpha3/tfevent-metricscollector/:/usr/src/app/github.com/kubeflow/katib/pkg/metricscollector/v1alpha3/common/ -ENTRYPOINT ["python", "main.py"] diff --git a/cmd/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile.ppc64le b/cmd/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile.ppc64le deleted file mode 100644 index 0dcb95b087b..00000000000 --- a/cmd/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile.ppc64le +++ /dev/null @@ -1,7 +0,0 @@ -FROM ibmcom/tensorflow-ppc64le:1.14.0-py3 -RUN pip install rfc3339 grpcio googleapis-common-protos -ADD . /usr/src/app/github.com/kubeflow/katib -WORKDIR /usr/src/app/github.com/kubeflow/katib/cmd/metricscollector/v1alpha3/tfevent-metricscollector/ -RUN pip install --no-cache-dir -r requirements.txt -ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/v1alpha3/python:/usr/src/app/github.com/kubeflow/katib/pkg/metricscollector/v1alpha3/tfevent-metricscollector/:/usr/src/app/github.com/kubeflow/katib/pkg/metricscollector/v1alpha3/common/ -ENTRYPOINT ["python", "main.py"] diff --git a/cmd/metricscollector/v1alpha3/tfevent-metricscollector/main.py b/cmd/metricscollector/v1alpha3/tfevent-metricscollector/main.py deleted file mode 100644 index 8d2d05ac7ef..00000000000 --- a/cmd/metricscollector/v1alpha3/tfevent-metricscollector/main.py +++ /dev/null @@ -1,54 +0,0 @@ -import grpc -import argparse -import api_pb2 -import api_pb2_grpc -from pns import WaitOtherMainProcesses -from tfevent_loader import MetricsCollector -from logging import getLogger, StreamHandler, INFO - -timeout_in_seconds = 60 - - -def parse_options(): - parser = argparse.ArgumentParser( - description='TF-Event MetricsCollector', - add_help=True - ) - parser.add_argument("-s", "--manager_server_addr", - type=str, default="katib-db-manager:6789") - parser.add_argument("-t", "--trial_name", type=str, default="") - parser.add_argument("-path", "--dir_path", type=str, default="/log") - parser.add_argument("-m", "--metric_names", type=str, default="") - parser.add_argument("-f", "--metric_filters", type=str, default="") - opt = parser.parse_args() - return opt - - -if __name__ == '__main__': - logger = getLogger(__name__) - handler = StreamHandler() - handler.setLevel(INFO) - logger.setLevel(INFO) - logger.addHandler(handler) - logger.propagate = False - opt = parse_options() - manager_server = opt.manager_server_addr.split(':') - if len(manager_server) != 2: - raise Exception("Invalid katib manager service address: %s" % - opt.manager_server_addr) - - WaitOtherMainProcesses(completed_marked_dir=opt.dir_path) - - mc = MetricsCollector(opt.metric_names.split(';')) - observation_log = mc.parse_file(opt.dir_path) - - channel = grpc.beta.implementations.insecure_channel( - manager_server[0], int(manager_server[1])) - - with api_pb2.beta_create_Manager_stub(channel) as client: - logger.info("In " + opt.trial_name + " " + - str(len(observation_log.metric_logs)) + " metrics will be reported.") - client.ReportObservationLog(api_pb2.ReportObservationLogRequest( - trial_name=opt.trial_name, - observation_log=observation_log - ), timeout=timeout_in_seconds) diff --git a/cmd/metricscollector/v1alpha3/tfevent-metricscollector/requirements.txt b/cmd/metricscollector/v1alpha3/tfevent-metricscollector/requirements.txt deleted file mode 100644 index d2ec0c34de0..00000000000 --- a/cmd/metricscollector/v1alpha3/tfevent-metricscollector/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -psutil==5.6.6 diff --git a/cmd/suggestion/chocolate/v1alpha3/Dockerfile b/cmd/suggestion/chocolate/v1alpha3/Dockerfile deleted file mode 100644 index 381bf703209..00000000000 --- a/cmd/suggestion/chocolate/v1alpha3/Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -FROM python:3.6 - -ENV TARGET_DIR /opt/katib -ENV SUGGESTION_DIR cmd/suggestion/chocolate/v1alpha3 - -RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ - apt-get -y update && \ - apt-get -y install gfortran libopenblas-dev liblapack-dev && \ - pip install cython 'numpy>=1.13.3'; \ - fi -RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ - if [ "$(uname -m)" = "ppc64le" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ - elif [ "$(uname -m)" = "aarch64" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ - else \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ - fi && \ - chmod +x /bin/grpc_health_probe - -ADD ./pkg/ ${TARGET_DIR}/pkg/ -ADD ./${SUGGESTION_DIR}/ ${TARGET_DIR}/${SUGGESTION_DIR}/ -WORKDIR ${TARGET_DIR}/${SUGGESTION_DIR} -RUN pip install --no-cache-dir -r requirements.txt - -RUN chgrp -R 0 ${TARGET_DIR} \ - && chmod -R g+rwX ${TARGET_DIR} - -ENV PYTHONPATH ${TARGET_DIR}:${TARGET_DIR}/pkg/apis/manager/v1alpha3/python:${TARGET_DIR}/pkg/apis/manager/health/python - -ENTRYPOINT ["python", "main.py"] diff --git a/cmd/suggestion/chocolate/v1alpha3/main.py b/cmd/suggestion/chocolate/v1alpha3/main.py deleted file mode 100644 index 106c81c7dc7..00000000000 --- a/cmd/suggestion/chocolate/v1alpha3/main.py +++ /dev/null @@ -1,28 +0,0 @@ -import grpc -import time -from pkg.apis.manager.v1alpha3.python import api_pb2_grpc -from pkg.apis.manager.health.python import health_pb2_grpc -from pkg.suggestion.v1alpha3.chocolate.service import ChocolateService -from concurrent import futures - -_ONE_DAY_IN_SECONDS = 60 * 60 * 24 -DEFAULT_PORT = "0.0.0.0:6789" - - -def serve(): - server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) - service = ChocolateService() - api_pb2_grpc.add_SuggestionServicer_to_server(service, server) - health_pb2_grpc.add_HealthServicer_to_server(service, server) - server.add_insecure_port(DEFAULT_PORT) - print("Listening...") - server.start() - try: - while True: - time.sleep(_ONE_DAY_IN_SECONDS) - except KeyboardInterrupt: - server.stop(0) - - -if __name__ == "__main__": - serve() diff --git a/cmd/suggestion/chocolate/v1alpha3/requirements.txt b/cmd/suggestion/chocolate/v1alpha3/requirements.txt deleted file mode 100644 index 117ee92cbc7..00000000000 --- a/cmd/suggestion/chocolate/v1alpha3/requirements.txt +++ /dev/null @@ -1,12 +0,0 @@ -grpcio==1.23.0 -duecredit===0.7.0 -cloudpickle==0.5.6 -numpy>=1.13.3 -scikit-learn>=0.19.0 -scipy>=0.19.1 -forestci==0.3 -protobuf==3.9.1 -googleapis-common-protos==1.6.0 -SQLAlchemy==1.3.8 -git+https://github.com/AIworx-Labs/chocolate@master -ghalton>=0.6 diff --git a/cmd/suggestion/goptuna/v1alpha3/Dockerfile b/cmd/suggestion/goptuna/v1alpha3/Dockerfile deleted file mode 100644 index 32038861236..00000000000 --- a/cmd/suggestion/goptuna/v1alpha3/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM golang:alpine AS go-build -# The GOPATH in the image is /go. -ADD . /go/src/github.com/kubeflow/katib -WORKDIR /go/src/github.com/kubeflow/katib/cmd/suggestion/goptuna -RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ - apk --update add gcc musl-dev && \ - go build -o goptuna-suggestion ./v1alpha3; \ - else \ - go build -o goptuna-suggestion ./v1alpha3; \ - fi - -RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ - if [ "$(uname -m)" = "ppc64le" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ - elif [ "$(uname -m)" = "aarch64" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ - else \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ - fi && \ - chmod +x /bin/grpc_health_probe - -FROM alpine:3.7 - -ENV TARGET_DIR /opt/katib - -WORKDIR ${TARGET_DIR} -COPY --from=go-build /bin/grpc_health_probe /bin/ -COPY --from=go-build /go/src/github.com/kubeflow/katib/cmd/suggestion/goptuna/goptuna-suggestion ${TARGET_DIR}/ - -RUN chgrp -R 0 ${TARGET_DIR} \ - && chmod -R g+rwX ${TARGET_DIR} - -ENTRYPOINT ["./goptuna-suggestion"] diff --git a/cmd/suggestion/goptuna/v1alpha3/main.go b/cmd/suggestion/goptuna/v1alpha3/main.go deleted file mode 100644 index bc77497ceb3..00000000000 --- a/cmd/suggestion/goptuna/v1alpha3/main.go +++ /dev/null @@ -1,41 +0,0 @@ -package main - -import ( - "context" - "net" - - health_pb "github.com/kubeflow/katib/pkg/apis/manager/health" - "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - suggestion "github.com/kubeflow/katib/pkg/suggestion/v1alpha3/goptuna" - "google.golang.org/grpc" - "k8s.io/klog" -) - -const ( - address = "0.0.0.0:6789" -) - -type healthService struct { -} - -func (s *healthService) Check(ctx context.Context, in *health_pb.HealthCheckRequest) (*health_pb.HealthCheckResponse, error) { - return &health_pb.HealthCheckResponse{ - Status: health_pb.HealthCheckResponse_SERVING, - }, nil -} - -func main() { - l, err := net.Listen("tcp", address) - if err != nil { - klog.Fatalf("Failed to listen: %v", err) - } - srv := grpc.NewServer() - api_v1_alpha3.RegisterSuggestionServer(srv, suggestion.NewSuggestionService()) - health_pb.RegisterHealthServer(srv, &healthService{}) - - klog.Infof("Start Goptuna suggestion service: %s", address) - err = srv.Serve(l) - if err != nil { - klog.Fatalf("Failed to serve: %v", err) - } -} diff --git a/cmd/suggestion/hyperband/v1alpha3/Dockerfile b/cmd/suggestion/hyperband/v1alpha3/Dockerfile deleted file mode 100644 index 518ff3f99e1..00000000000 --- a/cmd/suggestion/hyperband/v1alpha3/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -FROM python:3.6 - -ENV TARGET_DIR /opt/katib -ENV SUGGESTION_DIR cmd/suggestion/hyperband/v1alpha3 - -RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ - apt-get -y update && \ - apt-get -y install gfortran libopenblas-dev liblapack-dev && \ - pip install cython; \ - fi - -RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ - if [ "$(uname -m)" = "ppc64le" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ - elif [ "$(uname -m)" = "aarch64" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ - else \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ - fi && \ - chmod +x /bin/grpc_health_probe - -ADD ./pkg/ ${TARGET_DIR}/pkg/ -ADD ./${SUGGESTION_DIR}/ ${TARGET_DIR}/${SUGGESTION_DIR}/ -WORKDIR ${TARGET_DIR}/${SUGGESTION_DIR} -RUN pip install --no-cache-dir -r requirements.txt - -RUN chgrp -R 0 ${TARGET_DIR} \ - && chmod -R g+rwX ${TARGET_DIR} - -ENV PYTHONPATH ${TARGET_DIR}:${TARGET_DIR}/pkg/apis/manager/v1alpha3/python:${TARGET_DIR}/pkg/apis/manager/health/python - -ENTRYPOINT ["python", "main.py"] diff --git a/cmd/suggestion/hyperband/v1alpha3/main.py b/cmd/suggestion/hyperband/v1alpha3/main.py deleted file mode 100644 index bd98a1b9f41..00000000000 --- a/cmd/suggestion/hyperband/v1alpha3/main.py +++ /dev/null @@ -1,29 +0,0 @@ -import grpc -import time -from pkg.apis.manager.v1alpha3.python import api_pb2_grpc -from pkg.apis.manager.health.python import health_pb2_grpc -from pkg.suggestion.v1alpha3.hyperband.service import HyperbandService -from concurrent import futures - -_ONE_DAY_IN_SECONDS = 60 * 60 * 24 -DEFAULT_PORT = "0.0.0.0:6789" - - -def serve(): - server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) - service = HyperbandService() - api_pb2_grpc.add_SuggestionServicer_to_server(service, server) - health_pb2_grpc.add_HealthServicer_to_server(service, server) - - server.add_insecure_port(DEFAULT_PORT) - print("Listening...") - server.start() - try: - while True: - time.sleep(_ONE_DAY_IN_SECONDS) - except KeyboardInterrupt: - server.stop(0) - - -if __name__ == "__main__": - serve() diff --git a/cmd/suggestion/hyperband/v1alpha3/requirements.txt b/cmd/suggestion/hyperband/v1alpha3/requirements.txt deleted file mode 100644 index 210d97f7f81..00000000000 --- a/cmd/suggestion/hyperband/v1alpha3/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -grpcio==1.23.0 -duecredit===0.7.0 -cloudpickle==0.5.6 -numpy>=1.13.3 -scikit-learn>=0.19.0 -scipy>=0.19.1 -forestci==0.3 -protobuf==3.9.1 -googleapis-common-protos==1.6.0 diff --git a/cmd/suggestion/hyperopt/v1alpha3/Dockerfile b/cmd/suggestion/hyperopt/v1alpha3/Dockerfile deleted file mode 100644 index e067618191d..00000000000 --- a/cmd/suggestion/hyperopt/v1alpha3/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM python:3.6 - -ENV TARGET_DIR /opt/katib -ENV SUGGESTION_DIR cmd/suggestion/hyperopt/v1alpha3 - -RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ - apt-get -y update && \ - apt-get -y install gfortran libopenblas-dev liblapack-dev && \ - pip install cython; \ - fi - -RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ - if [ "$(uname -m)" = "ppc64le" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ - elif [ "$(uname -m)" = "aarch64" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ - else \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ - fi && \ - chmod +x /bin/grpc_health_probe - -ADD ./pkg/ ${TARGET_DIR}/pkg/ -ADD ./${SUGGESTION_DIR}/ ${TARGET_DIR}/${SUGGESTION_DIR}/ -WORKDIR ${TARGET_DIR}/${SUGGESTION_DIR} -RUN pip install --no-cache-dir -r requirements.txt - -RUN chgrp -R 0 ${TARGET_DIR} \ - && chmod -R g+rwX ${TARGET_DIR} - -ENV PYTHONPATH ${TARGET_DIR}:${TARGET_DIR}/pkg/apis/manager/v1alpha3/python:${TARGET_DIR}/pkg/apis/manager/health/python - -ENTRYPOINT ["python", "main.py"] - diff --git a/cmd/suggestion/hyperopt/v1alpha3/main.py b/cmd/suggestion/hyperopt/v1alpha3/main.py deleted file mode 100644 index b32f8cbbee1..00000000000 --- a/cmd/suggestion/hyperopt/v1alpha3/main.py +++ /dev/null @@ -1,28 +0,0 @@ -import grpc -import time -from pkg.apis.manager.v1alpha3.python import api_pb2_grpc -from pkg.apis.manager.health.python import health_pb2_grpc -from pkg.suggestion.v1alpha3.hyperopt.service import HyperoptService -from concurrent import futures - -_ONE_DAY_IN_SECONDS = 60 * 60 * 24 -DEFAULT_PORT = "0.0.0.0:6789" - - -def serve(): - server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) - service = HyperoptService() - api_pb2_grpc.add_SuggestionServicer_to_server(service, server) - health_pb2_grpc.add_HealthServicer_to_server(service, server) - server.add_insecure_port(DEFAULT_PORT) - print("Listening...") - server.start() - try: - while True: - time.sleep(_ONE_DAY_IN_SECONDS) - except KeyboardInterrupt: - server.stop(0) - - -if __name__ == "__main__": - serve() diff --git a/cmd/suggestion/hyperopt/v1alpha3/requirements.txt b/cmd/suggestion/hyperopt/v1alpha3/requirements.txt deleted file mode 100644 index b4bf1ae04e8..00000000000 --- a/cmd/suggestion/hyperopt/v1alpha3/requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -grpcio==1.23.0 -duecredit===0.7.0 -cloudpickle==0.5.6 -numpy>=1.13.3 -scikit-learn>=0.19.0 -scipy>=0.19.1 -forestci==0.3 -protobuf==3.9.1 -googleapis-common-protos==1.6.0 -hyperopt==0.2.3 diff --git a/cmd/suggestion/nas/darts/v1alpha3/Dockerfile b/cmd/suggestion/nas/darts/v1alpha3/Dockerfile deleted file mode 100644 index ad00d7325d0..00000000000 --- a/cmd/suggestion/nas/darts/v1alpha3/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM python:3.6 - -ENV TARGET_DIR /opt/katib -ENV SUGGESTION_DIR cmd/suggestion/nas/darts/v1alpha3 - -RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ - apt-get -y update && \ - apt-get -y install gfortran libopenblas-dev liblapack-dev && \ - pip install cython; \ - fi - -RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ - if [ "$(uname -m)" = "ppc64le" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ - elif [ "$(uname -m)" = "aarch64" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ - else \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ - fi && \ - chmod +x /bin/grpc_health_probe - -ADD ./pkg/ ${TARGET_DIR}/pkg/ -ADD ./${SUGGESTION_DIR}/ ${TARGET_DIR}/${SUGGESTION_DIR}/ -WORKDIR ${TARGET_DIR}/${SUGGESTION_DIR} -RUN pip install --no-cache-dir -r requirements.txt - -RUN chgrp -R 0 ${TARGET_DIR} \ - && chmod -R g+rwX ${TARGET_DIR} - -ENV PYTHONPATH ${TARGET_DIR}:${TARGET_DIR}/pkg/apis/manager/v1alpha3/python:${TARGET_DIR}/pkg/apis/manager/health/python - -ENTRYPOINT ["python", "main.py"] - diff --git a/cmd/suggestion/nas/darts/v1alpha3/main.py b/cmd/suggestion/nas/darts/v1alpha3/main.py deleted file mode 100644 index b33b3116745..00000000000 --- a/cmd/suggestion/nas/darts/v1alpha3/main.py +++ /dev/null @@ -1,30 +0,0 @@ -import grpc -from concurrent import futures -import time -from pkg.apis.manager.v1alpha3.python import api_pb2_grpc -from pkg.apis.manager.health.python import health_pb2_grpc -from pkg.suggestion.v1alpha3.nas.darts.service import DartsService - - -_ONE_DAY_IN_SECONDS = 60 * 60 * 24 -DEFAULT_PORT = "0.0.0.0:6789" - - -def serve(): - print("Darts Suggestion Service") - server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) - service = DartsService() - api_pb2_grpc.add_SuggestionServicer_to_server(service, server) - health_pb2_grpc.add_HealthServicer_to_server(service, server) - server.add_insecure_port(DEFAULT_PORT) - print("Listening...") - server.start() - try: - while True: - time.sleep(_ONE_DAY_IN_SECONDS) - except KeyboardInterrupt: - server.stop(0) - - -if __name__ == "__main__": - serve() diff --git a/cmd/suggestion/nas/darts/v1alpha3/requirements.txt b/cmd/suggestion/nas/darts/v1alpha3/requirements.txt deleted file mode 100644 index 92bd5706e11..00000000000 --- a/cmd/suggestion/nas/darts/v1alpha3/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -grpcio==1.23.0 -protobuf==3.9.1 -googleapis-common-protos==1.6.0 diff --git a/cmd/suggestion/nas/enas/v1alpha3/Dockerfile b/cmd/suggestion/nas/enas/v1alpha3/Dockerfile deleted file mode 100644 index c9255e96ce0..00000000000 --- a/cmd/suggestion/nas/enas/v1alpha3/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM python:3.6 - -ENV TARGET_DIR /opt/katib -ENV SUGGESTION_DIR cmd/suggestion/nas/enas/v1alpha3 - -RUN if [ "$(uname -m)" = "ppc64le" ]; then \ - apt-get -y update && \ - apt-get -y install gfortran libopenblas-dev liblapack-dev && \ - pip install cython; \ - fi -RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ - if [ "$(uname -m)" = "ppc64le" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ - else \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ - fi && \ - chmod +x /bin/grpc_health_probe - -ADD ./pkg/ ${TARGET_DIR}/pkg/ -ADD ./${SUGGESTION_DIR}/ ${TARGET_DIR}/${SUGGESTION_DIR}/ -WORKDIR ${TARGET_DIR}/${SUGGESTION_DIR} -RUN pip install --no-cache-dir -r requirements.txt - -RUN chgrp -R 0 ${TARGET_DIR} \ - && chmod -R g+rwX ${TARGET_DIR} - -ENV PYTHONPATH ${TARGET_DIR}:${TARGET_DIR}/pkg/apis/manager/v1alpha3/python:${TARGET_DIR}/pkg/apis/manager/health/python - -ENTRYPOINT ["python", "main.py"] diff --git a/cmd/suggestion/nas/enas/v1alpha3/Dockerfile.aarch64 b/cmd/suggestion/nas/enas/v1alpha3/Dockerfile.aarch64 deleted file mode 100644 index d60191d4ebe..00000000000 --- a/cmd/suggestion/nas/enas/v1alpha3/Dockerfile.aarch64 +++ /dev/null @@ -1,58 +0,0 @@ -FROM golang:alpine AS build-env -# The GOPATH in the image is /go. -ADD . /go/src/github.com/kubeflow/katib -RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ - apk --update add git gcc musl-dev && \ - go get github.com/grpc-ecosystem/grpc-health-probe && \ - mv $GOPATH/bin/grpc-health-probe /bin/grpc_health_probe && \ - chmod +x /bin/grpc_health_probe; \ - else \ - GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \ - chmod +x /bin/grpc_health_probe; \ - fi - -FROM python:3.7-slim-buster - -ENV TARGET_DIR /opt/katib -ENV SUGGESTION_DIR cmd/suggestion/nas/enas/v1alpha3 - -RUN apt-get update \ - && apt-get -y install software-properties-common \ - autoconf \ - automake \ - build-essential \ - cmake \ - libtool \ - pkg-config \ - wget \ - gfortran \ - libopenblas-dev \ - liblapack-dev \ - libhdf5-dev \ - libhdf5-serial-dev \ - hdf5-tools \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -RUN pip install cython numpy - -RUN wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.14.0-buster/tensorflow-1.14.0-cp37-none-linux_aarch64.whl \ - && pip install tensorflow-1.14.0-cp37-none-linux_aarch64.whl \ - && rm tensorflow-1.14.0-cp37-none-linux_aarch64.whl \ - && rm -rf .cache - -RUN pip install 'grpcio==1.23.0' 'protobuf==3.9.1' 'googleapis-common-protos==1.6.0' - -COPY --from=build-env /bin/grpc_health_probe /bin/ - -ADD ./pkg/ ${TARGET_DIR}/pkg/ -ADD ./${SUGGESTION_DIR}/ ${TARGET_DIR}/${SUGGESTION_DIR}/ -WORKDIR ${TARGET_DIR}/${SUGGESTION_DIR} - -RUN chgrp -R 0 ${TARGET_DIR} \ - && chmod -R g+rwX ${TARGET_DIR} - -ENV PYTHONPATH ${TARGET_DIR}:${TARGET_DIR}/pkg/apis/manager/v1alpha3/python:${TARGET_DIR}/pkg/apis/manager/health/python - -ENTRYPOINT ["python", "main.py"] diff --git a/cmd/suggestion/nas/enas/v1alpha3/main.py b/cmd/suggestion/nas/enas/v1alpha3/main.py deleted file mode 100644 index aa1d03173fd..00000000000 --- a/cmd/suggestion/nas/enas/v1alpha3/main.py +++ /dev/null @@ -1,31 +0,0 @@ -import grpc -from concurrent import futures -import time - -from pkg.apis.manager.v1alpha3.python import api_pb2_grpc -from pkg.apis.manager.health.python import health_pb2_grpc -from pkg.suggestion.v1alpha3.nas.enas.service import EnasService - - -_ONE_DAY_IN_SECONDS = 60 * 60 * 24 -DEFAULT_PORT = "0.0.0.0:6789" - - -def serve(): - print("ENAS Suggestion Service") - server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) - service = EnasService() - api_pb2_grpc.add_SuggestionServicer_to_server(service, server) - health_pb2_grpc.add_HealthServicer_to_server(service, server) - server.add_insecure_port(DEFAULT_PORT) - print("Listening...") - server.start() - try: - while True: - time.sleep(_ONE_DAY_IN_SECONDS) - except KeyboardInterrupt: - server.stop(0) - - -if __name__ == "__main__": - serve() diff --git a/cmd/suggestion/nas/enas/v1alpha3/requirements.txt b/cmd/suggestion/nas/enas/v1alpha3/requirements.txt deleted file mode 100644 index bde25645c41..00000000000 --- a/cmd/suggestion/nas/enas/v1alpha3/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -grpcio==1.23.0 -protobuf==3.9.1 -googleapis-common-protos==1.6.0 -tensorflow==1.15.4 diff --git a/cmd/suggestion/nas/enas/v1beta1/Dockerfile.aarch64 b/cmd/suggestion/nas/enas/v1beta1/Dockerfile.aarch64 index 6fe5fde7890..045bc1a1c8e 100644 --- a/cmd/suggestion/nas/enas/v1beta1/Dockerfile.aarch64 +++ b/cmd/suggestion/nas/enas/v1beta1/Dockerfile.aarch64 @@ -51,8 +51,8 @@ ADD ./${SUGGESTION_DIR}/ ${TARGET_DIR}/${SUGGESTION_DIR}/ WORKDIR ${TARGET_DIR}/${SUGGESTION_DIR} RUN chgrp -R 0 ${TARGET_DIR} \ - && chmod -R g+rwX ${TARGET_DIR} + && chmod -R g+rwX ${TARGET_DIR} -ENV PYTHONPATH ${TARGET_DIR}:${TARGET_DIR}/pkg/apis/manager/v1alpha3/python:${TARGET_DIR}/pkg/apis/manager/health/python +ENV PYTHONPATH ${TARGET_DIR}:${TARGET_DIR}/pkg/apis/manager/v1beta1/python:${TARGET_DIR}/pkg/apis/manager/health/python ENTRYPOINT ["python", "main.py"] diff --git a/cmd/suggestion/skopt/v1alpha3/Dockerfile b/cmd/suggestion/skopt/v1alpha3/Dockerfile deleted file mode 100644 index 85350c46aa4..00000000000 --- a/cmd/suggestion/skopt/v1alpha3/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -FROM python:3.6 - -ENV TARGET_DIR /opt/katib -ENV SUGGESTION_DIR cmd/suggestion/skopt/v1alpha3 - -RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ - apt-get -y update && \ - apt-get -y install gfortran libopenblas-dev liblapack-dev && \ - pip install cython; \ - fi - -RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ - if [ "$(uname -m)" = "ppc64le" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ - elif [ "$(uname -m)" = "aarch64" ]; then \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ - else \ - wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ - fi && \ - chmod +x /bin/grpc_health_probe - -ADD ./pkg/ ${TARGET_DIR}/pkg/ -ADD ./${SUGGESTION_DIR}/ ${TARGET_DIR}/${SUGGESTION_DIR}/ -WORKDIR ${TARGET_DIR}/${SUGGESTION_DIR} -RUN pip install --no-cache-dir -r requirements.txt - -RUN chgrp -R 0 ${TARGET_DIR} \ - && chmod -R g+rwX ${TARGET_DIR} - -ENV PYTHONPATH ${TARGET_DIR}:${TARGET_DIR}/pkg/apis/manager/v1alpha3/python:${TARGET_DIR}/pkg/apis/manager/health/python - -ENTRYPOINT ["python", "main.py"] diff --git a/cmd/suggestion/skopt/v1alpha3/main.py b/cmd/suggestion/skopt/v1alpha3/main.py deleted file mode 100644 index 3b8c6e8c7d3..00000000000 --- a/cmd/suggestion/skopt/v1alpha3/main.py +++ /dev/null @@ -1,28 +0,0 @@ -import grpc -import time -from pkg.apis.manager.v1alpha3.python import api_pb2_grpc -from pkg.apis.manager.health.python import health_pb2_grpc -from pkg.suggestion.v1alpha3.skopt.service import SkoptService -from concurrent import futures - -_ONE_DAY_IN_SECONDS = 60 * 60 * 24 -DEFAULT_PORT = "0.0.0.0:6789" - - -def serve(): - server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) - service = SkoptService() - api_pb2_grpc.add_SuggestionServicer_to_server(service, server) - health_pb2_grpc.add_HealthServicer_to_server(service, server) - server.add_insecure_port(DEFAULT_PORT) - print("Listening...") - server.start() - try: - while True: - time.sleep(_ONE_DAY_IN_SECONDS) - except KeyboardInterrupt: - server.stop(0) - - -if __name__ == "__main__": - serve() diff --git a/cmd/suggestion/skopt/v1alpha3/requirements.txt b/cmd/suggestion/skopt/v1alpha3/requirements.txt deleted file mode 100644 index 4108cb553e4..00000000000 --- a/cmd/suggestion/skopt/v1alpha3/requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -grpcio==1.23.0 -duecredit===0.7.0 -cloudpickle==0.5.6 -numpy>=1.13.3 -scikit-learn==0.22.0 -scipy>=0.19.1 -forestci==0.3 -protobuf==3.9.1 -googleapis-common-protos==1.6.0 -scikit-optimize==0.5.2 diff --git a/cmd/ui/v1alpha3/Dockerfile b/cmd/ui/v1alpha3/Dockerfile deleted file mode 100644 index 2087c44941d..00000000000 --- a/cmd/ui/v1alpha3/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM node:10.16.2-alpine AS npm-build - -ADD /pkg/ui/v1alpha3/frontend /frontend -RUN cd /frontend && npm install -RUN cd /frontend && npm run build -RUN rm -rf /frontend/node_modules - -FROM golang:alpine AS go-build -# The GOPATH in the image is /go. -ADD . /go/src/github.com/kubeflow/katib -WORKDIR /go/src/github.com/kubeflow/katib/cmd/ui -RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ - apk --update add gcc musl-dev && \ - go build -o katib-ui ./v1alpha3; \ - else \ - go build -o katib-ui ./v1alpha3; \ - fi - -FROM alpine:3.7 -WORKDIR /app -# v1alpha3 source code -COPY --from=go-build /go/src/github.com/kubeflow/katib/cmd/ui/katib-ui /app/ -COPY --from=npm-build /frontend/build /app/build - -USER 1000 - -ENTRYPOINT ["./katib-ui"] diff --git a/cmd/ui/v1alpha3/main.go b/cmd/ui/v1alpha3/main.go deleted file mode 100644 index b5fd51fc1a1..00000000000 --- a/cmd/ui/v1alpha3/main.go +++ /dev/null @@ -1,56 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "log" - "net/http" - - _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" - - ui "github.com/kubeflow/katib/pkg/ui/v1alpha3" -) - -var ( - port, host, buildDir *string -) - -func init() { - port = flag.String("port", "80", "the port to listen to for incoming HTTP connections") - host = flag.String("host", "0.0.0.0", "the host to listen to for incoming HTTP connections") - buildDir = flag.String("build-dir", "/app/build", "the dir of frontend") -} -func main() { - flag.Parse() - kuh := ui.NewKatibUIHandler() - - log.Printf("Serving the frontend dir %s", *buildDir) - frontend := http.FileServer(http.Dir(*buildDir)) - http.Handle("/katib/", http.StripPrefix("/katib/", frontend)) - - http.HandleFunc("/katib/fetch_hp_jobs/", kuh.FetchAllHPJobs) - http.HandleFunc("/katib/fetch_nas_jobs/", kuh.FetchAllNASJobs) - http.HandleFunc("/katib/submit_yaml/", kuh.SubmitYamlJob) - http.HandleFunc("/katib/submit_hp_job/", kuh.SubmitParamsJob) - http.HandleFunc("/katib/submit_nas_job/", kuh.SubmitParamsJob) - - http.HandleFunc("/katib/delete_experiment/", kuh.DeleteExperiment) - - http.HandleFunc("/katib/fetch_experiment/", kuh.FetchExperiment) - http.HandleFunc("/katib/fetch_suggestion/", kuh.FetchSuggestion) - - http.HandleFunc("/katib/fetch_hp_job_info/", kuh.FetchHPJobInfo) - http.HandleFunc("/katib/fetch_hp_job_trial_info/", kuh.FetchHPJobTrialInfo) - http.HandleFunc("/katib/fetch_nas_job_info/", kuh.FetchNASJobInfo) - - http.HandleFunc("/katib/fetch_trial_templates/", kuh.FetchTrialTemplates) - http.HandleFunc("/katib/add_template/", kuh.AddTemplate) - http.HandleFunc("/katib/edit_template/", kuh.EditTemplate) - http.HandleFunc("/katib/delete_template/", kuh.DeleteTemplate) - http.HandleFunc("/katib/fetch_namespaces", kuh.FetchNamespaces) - - log.Printf("Serving at %s:%s", *host, *port) - if err := http.ListenAndServe(fmt.Sprintf("%s:%s", *host, *port), nil); err != nil { - panic(err) - } -} diff --git a/examples/v1alpha3/MinikubeDemo/deploy.sh b/examples/v1alpha3/MinikubeDemo/deploy.sh deleted file mode 100755 index 08611e438bb..00000000000 --- a/examples/v1alpha3/MinikubeDemo/deploy.sh +++ /dev/null @@ -1,5 +0,0 @@ -#/bin/bash -set -x -set -e -minikube start --disk-size 50g --memory 4096 --cpus 4 -bash ../../../scripts/v1alpha3/deploy.sh diff --git a/examples/v1alpha3/MinikubeDemo/destroy.sh b/examples/v1alpha3/MinikubeDemo/destroy.sh deleted file mode 100755 index 3b352104a9b..00000000000 --- a/examples/v1alpha3/MinikubeDemo/destroy.sh +++ /dev/null @@ -1,5 +0,0 @@ -#/bin/bash -set -x -set -e -minikube delete -pkill kubectl diff --git a/examples/v1alpha3/README.md b/examples/v1alpha3/README.md deleted file mode 100644 index a6faf39209e..00000000000 --- a/examples/v1alpha3/README.md +++ /dev/null @@ -1,354 +0,0 @@ -# Simple Minikube Demo -You can deploy katib components and try a simple mnist demo on your laptop! - -## Requirement -* [Minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/) -* kubectl - -## Deploy katib -Start Katib on Minikube with [deploy.sh](./MinikubeDemo/deploy.sh). -A Minikube cluster and Katib components will be deployed! You can check them with `kubectl -n kubeflow get pods`. - -Then, start port-forward for katib UI `8000 -> UI`. - -kubectl v1.10~ -``` -$ kubectl -n kubeflow port-forward svc/katib-ui 8000:80 & -``` - -kubectl ~v1.9 - -``` -& kubectl -n kubeflow port-forward $(kubectl -n kubeflow get pod -o=name | grep katib-ui | sed -e "s@pods\/@@") 8000:80 & -``` - -## Create Experiment -#### Random Suggestion Demo -``` -$ kubectl apply -f random-example.yaml -``` -#### Grid Suggestion Demo -``` -$ kubectl apply -f grid-example.yaml -``` -#### Bayesian Optimization Suggestion Demo -``` -$ kubectl apply -f bayesianoptimization-example.yaml -``` -#### Hyperband Suggestion Demo -``` -$ kubectl apply -f hyperband-example.yaml -``` -#### Run trial evaluation job by [PyTorchJob](https://github.com/kubeflow/pytorch-operator) -``` -$ kubectl apply -f pytorchjob-example.yaml -``` -#### Run trial evaluation job by [TFJob](https://github.com/kubeflow/tf-operator) -``` -$ kubectl apply -f tfevent-volume/ -$ kubectl apply -f tfjob-example.yaml -``` -## Monitor Experiment -#### CLI -You can submit a new Experiment or check your Experiment results with `kubectl` CLI. -List experiments -``` -# kubectl get experiment -n kubeflow -NAME STATUS AGE -random-experiment Succeeded 25m -``` -Check experiment result -``` -# kubectl get experiment random-experiment -n kubeflow -oyaml -apiVersion: kubeflow.org/v1alpha3 -kind: Experiment -metadata: - annotations: - kubectl.kubernetes.io/last-applied-configuration: | - {"apiVersion":"kubeflow.org/v1alpha3","kind":"Experiment","metadata":{"annotations":{},"name":"random-experiment","namespace":"kubeflow"},"spec":{"algorithm":{"algorithmName":"random"},"maxFailedTrialCount":3,"maxTrialCount":12,"objective":{"additionalMetricNames":["accuracy"],"goal":0.99,"objectiveMetricName":"Validation-accuracy","type":"maximize"},"parallelTrialCount":3,"parameters":[{"feasibleSpace":{"max":"0.03","min":"0.01"},"name":"--lr","parameterType":"double"},{"feasibleSpace":{"max":"5","min":"2"},"name":"--num-layers","parameterType":"int"},{"feasibleSpace":{"list":["sgd","adam","ftrl"]},"name":"--optimizer","parameterType":"categorical"}],"trialTemplate":{"goTemplate":{"rawTemplate":"apiVersion: batch/v1\nkind: Job\nmetadata:\n name: {{.Trial}}\n namespace: {{.NameSpace}}\nspec:\n template:\n spec:\n containers:\n - name: {{.Trial}}\n image: katib/mxnet-mnist-example\n command:\n - \"python\"\n - \"/mxnet/example/image-classification/train_mnist.py\"\n - \"--batch-size=64\"\n {{- with .HyperParameters}}\n {{- range .}}\n - \"{{.Name}}={{.Value}}\"\n {{- end}}\n {{- end}}\n restartPolicy: Never"}}}} - creationTimestamp: 2019-07-15T07:37:40Z - finalizers: - - clean-data-in-db - name: random-experiment - namespace: kubeflow - resourceVersion: "22147879" - selfLink: /apis/kubeflow.org/v1alpha3/namespaces/kubeflow/experiments/random-experiment - uid: 6c8896db-a6d3-11e9-b55b-00163e01b303 -spec: - algorithm: - algorithmName: random - algorithmSettings: null - maxFailedTrialCount: 3 - maxTrialCount: 12 - objective: - additionalMetricNames: - - accuracy - goal: 0.99 - objectiveMetricName: Validation-accuracy - type: maximize - parallelTrialCount: 3 - parameters: - - feasibleSpace: - max: "0.03" - min: "0.01" - name: --lr - parameterType: double - - feasibleSpace: - max: "5" - min: "2" - name: --num-layers - parameterType: int - - feasibleSpace: - list: - - sgd - - adam - - ftrl - name: --optimizer - parameterType: categorical - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: katib/mxnet-mnist-example - command: - - "python" - - "/mxnet/example/image-classification/train_mnist.py" - - "--batch-size=64" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - restartPolicy: Never -status: - completionTime: 2019-07-15T07:45:56Z - conditions: - - lastTransitionTime: 2019-07-15T07:37:29Z - lastUpdateTime: 2019-07-15T07:37:29Z - message: Experiment is created - reason: ExperimentCreated - status: "True" - type: Created - - lastTransitionTime: 2019-07-15T07:45:56Z - lastUpdateTime: 2019-07-15T07:45:56Z - message: Experiment is running - reason: ExperimentRunning - status: "False" - type: Running - - lastTransitionTime: 2019-07-15T07:45:56Z - lastUpdateTime: 2019-07-15T07:45:56Z - message: Experiment has succeeded because max trial count has reached - reason: ExperimentSucceeded - status: "True" - type: Succeeded - currentOptimalTrial: - observation: - metrics: - - name: Validation-accuracy - value: 0.98119 - parameterAssignments: - - name: --lr - value: "0.01178778887185771" - - name: --num-layers - value: "4" - - name: --optimizer - value: sgd - startTime: 2019-07-15T07:37:29Z - trials: 12 - trialsSucceeded: 12 -``` -List trials -``` -# kubectl get trials -n kubeflow -NAME STATUS AGE -random-experiment-24lgqghm Succeeded 26m -random-experiment-2vdqlqfm Succeeded 28m -random-experiment-4xg8n48f Succeeded 30m -random-experiment-64stflgp Succeeded 29m -random-experiment-d9jgsm96 Succeeded 29m -random-experiment-pnrqmqdm Succeeded 27m -random-experiment-qvcdfppz Succeeded 27m -random-experiment-r49pflgp Succeeded 30m -random-experiment-r7d7mcbx Succeeded 29m -random-experiment-rwbf62k5 Succeeded 26m -random-experiment-vs8pmh2m Succeeded 27m -random-experiment-wmnlq972 Succeeded 30m -``` -Check trial detail -``` -# kubectl get trials random-experiment-24lgqghm -oyaml -n kubeflow -apiVersion: kubeflow.org/v1alpha3 -kind: Trial -metadata: - creationTimestamp: 2019-07-15T07:41:38Z - generation: 1 - labels: - experiment: random-experiment - name: random-experiment-24lgqghm - namespace: kubeflow - ownerReferences: - - apiVersion: kubeflow.org/v1alpha3 - blockOwnerDeletion: true - controller: true - kind: Experiment - name: random-experiment - uid: 6c8896db-a6d3-11e9-b55b-00163e01b303 - resourceVersion: "22147830" - selfLink: /apis/kubeflow.org/v1alpha3/namespaces/kubeflow/trials/random-experiment-24lgqghm - uid: fad59cb8-a6d3-11e9-b55b-00163e01b303 -spec: - metricsCollectorSpec: |- - apiVersion: batch/v1beta1 - kind: CronJob - metadata: - name: random-experiment-24lgqghm - namespace: kubeflow - spec: - schedule: "*/1 * * * *" - successfulJobsHistoryLimit: 0 - failedJobsHistoryLimit: 1 - concurrencyPolicy: Forbid - jobTemplate: - spec: - backoffLimit: 0 - template: - spec: - serviceAccountName: metrics-collector - containers: - - name: random-experiment-24lgqghm - image: gcr.io/kubeflow-images-public/katib/v1alpha3/metrics-collector - imagePullPolicy: IfNotPresent - command: ["./metricscollector"] - args: - - "-e" - - "random-experiment" - - "-t" - - "random-experiment-24lgqghm" - - "-k" - - "Job" - - "-n" - - "kubeflow" - - "-m" - - "katib-db-manager.kubeflow:6789" - - "-mn" - - "Validation-accuracy;accuracy" - restartPolicy: Never - objective: - additionalMetricNames: - - accuracy - goal: 0.99 - objectiveMetricName: Validation-accuracy - type: maximize - parameterAssignments: - - name: --lr - value: "0.017151855585117313" - - name: --num-layers - value: "5" - - name: --optimizer - value: adam - runSpec: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: random-experiment-24lgqghm - namespace: kubeflow - spec: - template: - spec: - containers: - - name: random-experiment-24lgqghm - image: katib/mxnet-mnist-example - command: - - "python" - - "/mxnet/example/image-classification/train_mnist.py" - - "--batch-size=64" - - "--lr=0.017151855585117313" - - "--num-layers=5" - - "--optimizer=adam" - restartPolicy: Never -status: - completionTime: 2019-07-15T07:45:42Z - conditions: - - lastTransitionTime: 2019-07-15T07:41:29Z - lastUpdateTime: 2019-07-15T07:41:29Z - message: Trial is created - reason: TrialCreated - status: "True" - type: Created - - lastTransitionTime: 2019-07-15T07:45:42Z - lastUpdateTime: 2019-07-15T07:45:42Z - message: Trial is running - reason: TrialRunning - status: "False" - type: Running - - lastTransitionTime: 2019-07-15T07:45:42Z - lastUpdateTime: 2019-07-15T07:45:42Z - message: Trial has succeeded - reason: TrialSucceeded - status: "True" - type: Succeeded - observation: - metrics: - - name: Validation-accuracy - value: 0.969347 - startTime: 2019-07-15T07:41:29Z -``` -#### UI -You can submit a new Experiment or check your Experiment results with Web UI. -Acsess to `http://127.0.0.1:8000/katib` -## Clean -Clean up with [destroy.sh](./MinikubeDemo/destroy.sh) script. -It will stop port-forward process and delete minikube cluster. - -# List of current Katib training container images - -- Mxnet mnist example with collecting metrics time, [source](https://github.com/kubeflow/katib/blob/master/examples/v1alpha3/mxnet-mnist/mnist.py). - -``` -docker.io/kubeflowkatib/mxnet-mnist -``` - -- Pytorch mnist example with saving metrics to the file, [source](https://github.com/kubeflow/katib/blob/master/examples/v1alpha3/file-metrics-collector/mnist.py). - -``` -docker.io/kubeflowkatib/pytorch-mnist -``` - -- Keras cifar10 CNN example for ENAS with gpu support, [source](https://github.com/kubeflow/katib/blob/master/examples/v1alpha3/nas/enas-cnn-cifar10/Dockerfile.gpu). - -``` -docker.io/kubeflowkatib/enas-cnn-cifar10-gpu -``` - -- Keras cifar10 CNN example for ENAS with cpu support, [source](https://github.com/kubeflow/katib/blob/master/examples/v1alpha3/nas/enas-cnn-cifar10/Dockerfile.cpu). - -``` -docker.io/kubeflowkatib/enas-cnn-cifar10-cpu -``` - -- Pytorch cifar10 CNN example for DARTS, [source](https://github.com/kubeflow/katib/blob/master/examples/v1alpha3/nas/darts-cnn-cifar10/Dockerfile) - -``` -docker.io/kubeflowkatib/darts-cnn-cifar10 -``` - -- Pytorch operator mnist example, [source](https://github.com/kubeflow/pytorch-operator/blob/master/examples/mnist/mnist.py). - -``` -gcr.io/kubeflow-ci/pytorch-dist-mnist-test -``` - -- Tf operator mnist example, [source](https://github.com/kubeflow/tf-operator/blob/master/examples/v1/mnist_with_summaries/mnist_with_summaries.py). - -``` -gcr.io/kubeflow-ci/tf-mnist-with-summaries -``` diff --git a/examples/v1alpha3/bayesianoptimization-example.yaml b/examples/v1alpha3/bayesianoptimization-example.yaml deleted file mode 100644 index ffec2f89bce..00000000000 --- a/examples/v1alpha3/bayesianoptimization-example.yaml +++ /dev/null @@ -1,64 +0,0 @@ -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - labels: - controller-tools.k8s.io: "1.0" - name: bayesianoptimization-example -spec: - objective: - type: maximize - goal: 0.99 - objectiveMetricName: Validation-accuracy - additionalMetricNames: - - Train-accuracy - algorithm: - algorithmName: bayesianoptimization - algorithmSettings: - - name: "random_state" - value: "10" - parallelTrialCount: 3 - maxTrialCount: 12 - maxFailedTrialCount: 3 - parameters: - - name: --lr - parameterType: double - feasibleSpace: - min: "0.01" - max: "0.03" - - name: --num-layers - parameterType: int - feasibleSpace: - min: "2" - max: "5" - - name: --optimizer - parameterType: categorical - feasibleSpace: - list: - - sgd - - adam - - ftrl - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/mxnet-mnist - command: - - "python3" - - "/opt/mxnet-mnist/mnist.py" - - "--batch-size=64" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - restartPolicy: Never diff --git a/examples/v1alpha3/cmaes-example.yaml b/examples/v1alpha3/cmaes-example.yaml deleted file mode 100644 index b2ad463e61f..00000000000 --- a/examples/v1alpha3/cmaes-example.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - labels: - controller-tools.k8s.io: "1.0" - name: cmaes-example -spec: - objective: - type: maximize - goal: 0.99 - objectiveMetricName: Validation-accuracy - additionalMetricNames: - - Train-accuracy - algorithm: - algorithmName: cmaes - parallelTrialCount: 3 - maxTrialCount: 12 - maxFailedTrialCount: 3 - parameters: - - name: --lr - parameterType: double - feasibleSpace: - min: "0.01" - max: "0.03" - - name: --num-layers - parameterType: int - feasibleSpace: - min: "2" - max: "5" - - name: --optimizer - parameterType: categorical - feasibleSpace: - list: - - sgd - - adam - - ftrl - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/mxnet-mnist - command: - - "python3" - - "/opt/mxnet-mnist/mnist.py" - - "--batch-size=64" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - restartPolicy: Never diff --git a/examples/v1alpha3/custom-metricscollector-example.yaml b/examples/v1alpha3/custom-metricscollector-example.yaml deleted file mode 100644 index 5592e4554a9..00000000000 --- a/examples/v1alpha3/custom-metricscollector-example.yaml +++ /dev/null @@ -1,76 +0,0 @@ -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - labels: - controller-tools.k8s.io: "1.0" - name: custom-metricscollector-example -spec: - objective: - type: maximize - goal: 0.99 - objectiveMetricName: accuracy - metricsCollectorSpec: - source: - fileSystemPath: - path: "/katib/mnist.log" - kind: File - collector: - kind: Custom - customCollector: - args: - - -m - - accuracy - - -s - - katib-db-manager.kubeflow:6789 - - -path - - /katib/mnist.log - image: kubeflowkatib/custom-metrics-collector:latest - imagePullPolicy: Always - name: custom-metrics-logger-and-collector - env: - - name: TrialNamePrefix - valueFrom: - fieldRef: - fieldPath: metadata.name - algorithm: - algorithmName: random - parallelTrialCount: 3 - maxTrialCount: 12 - maxFailedTrialCount: 3 - parameters: - - name: --lr - parameterType: double - feasibleSpace: - min: "0.01" - max: "0.03" - - name: --momentum - parameterType: double - feasibleSpace: - min: "0.3" - max: "0.7" - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/pytorch-mnist - imagePullPolicy: Always - command: - - "python" - - "/opt/mnist/src/mnist.py" - - "--epochs=1" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - restartPolicy: Never diff --git a/examples/v1alpha3/file-metrics-collector/Dockerfile b/examples/v1alpha3/file-metrics-collector/Dockerfile deleted file mode 100644 index 1038c48cedc..00000000000 --- a/examples/v1alpha3/file-metrics-collector/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM pytorch/pytorch:1.0-cuda10.0-cudnn7-runtime - -RUN mkdir -p /katib /opt/mnist/src - -WORKDIR /opt/mnist/src -ADD mnist.py /opt/mnist/src - -RUN chgrp -R 0 /opt/mnist \ - && chmod -R g+rwX /opt/mnist \ - && chgrp -R 0 /katib \ - && chmod -R g+rwX /katib - -ENTRYPOINT ["python", "/opt/mnist/src/mnist.py"] diff --git a/examples/v1alpha3/file-metrics-collector/mnist.py b/examples/v1alpha3/file-metrics-collector/mnist.py deleted file mode 100644 index 33f038d2fa1..00000000000 --- a/examples/v1alpha3/file-metrics-collector/mnist.py +++ /dev/null @@ -1,148 +0,0 @@ -from __future__ import print_function - -import argparse -import logging -import os - -from torchvision import datasets, transforms -import torch -import torch.distributed as dist -import torch.nn as nn -import torch.nn.functional as F -import torch.optim as optim - -WORLD_SIZE = int(os.environ.get('WORLD_SIZE', 1)) - -logging.basicConfig(filename='/katib/mnist.log', level=logging.DEBUG) - -class Net(nn.Module): - def __init__(self): - super(Net, self).__init__() - self.conv1 = nn.Conv2d(1, 20, 5, 1) - self.conv2 = nn.Conv2d(20, 50, 5, 1) - self.fc1 = nn.Linear(4*4*50, 500) - self.fc2 = nn.Linear(500, 10) - - def forward(self, x): - x = F.relu(self.conv1(x)) - x = F.max_pool2d(x, 2, 2) - x = F.relu(self.conv2(x)) - x = F.max_pool2d(x, 2, 2) - x = x.view(-1, 4*4*50) - x = F.relu(self.fc1(x)) - x = self.fc2(x) - return F.log_softmax(x, dim=1) - -def train(args, model, device, train_loader, optimizer, epoch): - model.train() - for batch_idx, (data, target) in enumerate(train_loader): - data, target = data.to(device), target.to(device) - optimizer.zero_grad() - output = model(data) - loss = F.nll_loss(output, target) - loss.backward() - optimizer.step() - if batch_idx % args.log_interval == 0: - msg = 'Train Epoch: {} [{}/{} ({:.0f}%)]\tloss={:.4f}'.format( - epoch, batch_idx * len(data), len(train_loader.dataset), - 100. * batch_idx / len(train_loader), loss.item()) - print(msg) - logging.debug(msg) - niter = epoch * len(train_loader) + batch_idx - -def test(args, model, device, test_loader, epoch): - model.eval() - test_loss = 0 - correct = 0 - with torch.no_grad(): - for data, target in test_loader: - data, target = data.to(device), target.to(device) - output = model(data) - test_loss += F.nll_loss(output, target, reduction='sum').item() # sum up batch loss - pred = output.max(1, keepdim=True)[1] # get the index of the max log-probability - correct += pred.eq(target.view_as(pred)).sum().item() - - test_loss /= len(test_loader.dataset) - logging.info('\n{{metricName: accuracy, metricValue: {:.4f}}};{{metricName: loss, metricValue: {:.4f}}}\n'.format(float(correct) / len(test_loader.dataset), test_loss)) - - -def should_distribute(): - return dist.is_available() and WORLD_SIZE > 1 - - -def is_distributed(): - return dist.is_available() and dist.is_initialized() - - -def main(): - # Training settings - parser = argparse.ArgumentParser(description='PyTorch MNIST Example') - parser.add_argument('--batch-size', type=int, default=64, metavar='N', - help='input batch size for training (default: 64)') - parser.add_argument('--test-batch-size', type=int, default=1000, metavar='N', - help='input batch size for testing (default: 1000)') - parser.add_argument('--epochs', type=int, default=10, metavar='N', - help='number of epochs to train (default: 10)') - parser.add_argument('--lr', type=float, default=0.01, metavar='LR', - help='learning rate (default: 0.01)') - parser.add_argument('--momentum', type=float, default=0.5, metavar='M', - help='SGD momentum (default: 0.5)') - parser.add_argument('--no-cuda', action='store_true', default=False, - help='disables CUDA training') - parser.add_argument('--seed', type=int, default=1, metavar='S', - help='random seed (default: 1)') - parser.add_argument('--log-interval', type=int, default=10, metavar='N', - help='how many batches to wait before logging training status') - parser.add_argument('--save-model', action='store_true', default=False, - help='For Saving the current Model') - if dist.is_available(): - parser.add_argument('--backend', type=str, help='Distributed backend', - choices=[dist.Backend.GLOO, dist.Backend.NCCL, dist.Backend.MPI], - default=dist.Backend.GLOO) - args = parser.parse_args() - use_cuda = not args.no_cuda and torch.cuda.is_available() - if use_cuda: - print('Using CUDA') - - torch.manual_seed(args.seed) - - device = torch.device("cuda" if use_cuda else "cpu") - - if should_distribute(): - print('Using distributed PyTorch with {} backend'.format(args.backend)) - dist.init_process_group(backend=args.backend) - - kwargs = {'num_workers': 1, 'pin_memory': True} if use_cuda else {} - train_loader = torch.utils.data.DataLoader( - datasets.MNIST('../data', train=True, download=True, - transform=transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize((0.1307,), (0.3081,)) - ])), - batch_size=args.batch_size, shuffle=True, **kwargs) - test_loader = torch.utils.data.DataLoader( - datasets.MNIST('../data', train=False, transform=transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize((0.1307,), (0.3081,)) - ])), - batch_size=args.test_batch_size, shuffle=False, **kwargs) - - model = Net().to(device) - - if is_distributed(): - Distributor = nn.parallel.DistributedDataParallel if use_cuda \ - else nn.parallel.DistributedDataParallelCPU - model = Distributor(model) - - optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum) - - for epoch in range(1, args.epochs + 1): - train(args, model, device, train_loader, optimizer, epoch) - test(args, model, device, test_loader, epoch) - - if (args.save_model): - torch.save(model.state_dict(),"mnist_cnn.pt") - -if __name__ == '__main__': - main() - diff --git a/examples/v1alpha3/file-metricscollector-example.yaml b/examples/v1alpha3/file-metricscollector-example.yaml deleted file mode 100644 index 6e3a4b60425..00000000000 --- a/examples/v1alpha3/file-metricscollector-example.yaml +++ /dev/null @@ -1,65 +0,0 @@ -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - labels: - controller-tools.k8s.io: "1.0" - name: file-metricscollector-example -spec: - objective: - type: maximize - goal: 0.99 - objectiveMetricName: accuracy - additionalMetricNames: - - loss - metricsCollectorSpec: - source: - filter: - metricsFormat: - - "{metricName: ([\\w|-]+), metricValue: ((-?\\d+)(\\.\\d+)?)}" - fileSystemPath: - path: "/katib/mnist.log" - kind: File - collector: - kind: File - algorithm: - algorithmName: random - parallelTrialCount: 3 - maxTrialCount: 12 - maxFailedTrialCount: 3 - parameters: - - name: --lr - parameterType: double - feasibleSpace: - min: "0.01" - max: "0.03" - - name: --momentum - parameterType: double - feasibleSpace: - min: "0.3" - max: "0.7" - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/pytorch-mnist:latest - imagePullPolicy: Always - command: - - "python" - - "/opt/mnist/src/mnist.py" - - "--epochs=1" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - restartPolicy: Never diff --git a/examples/v1alpha3/fpga/README.md b/examples/v1alpha3/fpga/README.md deleted file mode 100644 index 81cf9337ddb..00000000000 --- a/examples/v1alpha3/fpga/README.md +++ /dev/null @@ -1 +0,0 @@ -see [v1beta1/fpga](../../v1beta1/fpga) diff --git a/examples/v1alpha3/fpga/xgboost-example.yaml b/examples/v1alpha3/fpga/xgboost-example.yaml deleted file mode 100644 index 5f6d1ed9838..00000000000 --- a/examples/v1alpha3/fpga/xgboost-example.yaml +++ /dev/null @@ -1,68 +0,0 @@ ---- -apiVersion: kubeflow.org/v1alpha3 -kind: Experiment -metadata: - labels: - controller-tools.k8s.io: "1.0" - name: xgb-svhn-fpga - namespace: kubeflow -spec: - algorithm: - algorithmName: random - maxFailedTrialCount: 3 - maxTrialCount: 10 - objective: - additionalMetricNames: - - time - goal: 0.99 - objectiveMetricName: accuracy - type: maximize - parallelTrialCount: 1 - parameters: - - feasibleSpace: - min: "0.00" - max: "0.05" - name: alpha - parameterType: double - - feasibleSpace: - min: "0.1" - max: "0.4" - name: eta - parameterType: double - - feasibleSpace: - min: "0.6" - max: "1.0" - name: subsample - parameterType: double - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: "docker.io/inaccel/jupyter:lab" - command: - - python3 - - XGBoost/parameter-tuning.py - args: - - "--name=SVHN" - - "--test-size=0.35" - - "--tree-method=fpga_exact" - - "--bitstream=https://store.inaccel.com/artifactory/bitstreams/xilinx/aws-vu9p-f1/dynamic_5.0/com/inaccel/xgboost/0.1/2exact" - - "--max-depth=10" - {{- with .HyperParameters}} - {{- range .}} - - "--{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - resources: - limits: - xilinx/aws-vu9p-f1: 1 - restartPolicy: Never diff --git a/examples/v1alpha3/grid-example.yaml b/examples/v1alpha3/grid-example.yaml deleted file mode 100644 index aae13759189..00000000000 --- a/examples/v1alpha3/grid-example.yaml +++ /dev/null @@ -1,67 +0,0 @@ -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - labels: - controller-tools.k8s.io: "1.0" - name: grid-example -spec: - objective: - type: maximize - goal: 0.99 - objectiveMetricName: Validation-accuracy - additionalMetricNames: - - Train-accuracy - algorithm: - algorithmName: grid - parallelTrialCount: 3 - maxTrialCount: 12 - maxFailedTrialCount: 3 - parameters: - - name: --lr - parameterType: double - feasibleSpace: - min: "0.001" - max: "0.01" - step: "0.001" - - name: --num-layers - parameterType: int - feasibleSpace: - min: "2" - max: "5" - - name: --num-epochs - parameterType: int - feasibleSpace: - min: "10" - max: "15" - - name: --optimizer - parameterType: categorical - feasibleSpace: - list: - - sgd - - adam - - ftrl - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/mxnet-mnist - command: - - "python3" - - "/opt/mxnet-mnist/mnist.py" - - "--batch-size=64" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - restartPolicy: Never diff --git a/examples/v1alpha3/hyperband-example.yaml b/examples/v1alpha3/hyperband-example.yaml deleted file mode 100644 index d2001a64ea0..00000000000 --- a/examples/v1alpha3/hyperband-example.yaml +++ /dev/null @@ -1,71 +0,0 @@ -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - name: hyperband-example -spec: - parallelTrialCount: 9 - maxTrialCount: 9 - objective: - type: maximize - goal: 0.99 - objectiveMetricName: Validation-accuracy - additionalMetricNames: - - Train-accuracy - algorithm: - algorithmName: hyperband - algorithmSettings: - - name: "resource_name" - value: "--num-epochs" - - name: "eta" - value: "3" - - name: "r_l" - value: "9" - maxFailedTrialCount: 9 - parameters: - - name: --lr - parameterType: double - feasibleSpace: - min: "0.01" - max: "0.03" - - name: --num-layers - parameterType: int - feasibleSpace: - min: "2" - max: "5" - - name: --optimizer - parameterType: categorical - feasibleSpace: - list: - - sgd - - adam - - ftrl - - name: --num-epochs - parameterType: int - feasibleSpace: - min: "20" - max: "20" - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/mxnet-mnist - command: - - "python3" - - "/opt/mxnet-mnist/mnist.py" - - "--batch-size=64" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - restartPolicy: Never diff --git a/examples/v1alpha3/mxnet-mnist/Dockerfile b/examples/v1alpha3/mxnet-mnist/Dockerfile deleted file mode 100644 index 5448f327be7..00000000000 --- a/examples/v1alpha3/mxnet-mnist/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM ubuntu:16.04 - -RUN apt-get update && \ - apt-get install -y wget python3-dev gcc && \ - wget https://bootstrap.pypa.io/get-pip.py && \ - python3 get-pip.py - -RUN pip3 install mxnet - -ADD . /opt/mxnet-mnist -WORKDIR /opt/mxnet-mnist - -RUN chgrp -R 0 /opt/mxnet-mnist \ - && chmod -R g+rwX /opt/mxnet-mnist - -ENTRYPOINT ["python3", "/opt/mxnet-mnist/mnist.py"] diff --git a/examples/v1alpha3/mxnet-mnist/README.md b/examples/v1alpha3/mxnet-mnist/README.md deleted file mode 100644 index 5707be4696a..00000000000 --- a/examples/v1alpha3/mxnet-mnist/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Mxnet image classification example -This is Mxnet image classification training container with recording time of the metrics. - -It uses only simple multilayer perceptron network (mlp). - -If you want to read more about this example, visit official [incubator-mxnet](https://github.com/apache/incubator-mxnet/tree/master/example/image-classification) github repository. diff --git a/examples/v1alpha3/mxnet-mnist/common/__init__.py b/examples/v1alpha3/mxnet-mnist/common/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/examples/v1alpha3/mxnet-mnist/common/fit.py b/examples/v1alpha3/mxnet-mnist/common/fit.py deleted file mode 100644 index 8e8b0197960..00000000000 --- a/examples/v1alpha3/mxnet-mnist/common/fit.py +++ /dev/null @@ -1,340 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -""" example train fit utility """ -import logging -import os -import time -import re -import math -import mxnet as mx - -def get_epoch_size(args, kv): - return math.ceil(int(args.num_examples / kv.num_workers) / args.batch_size) - -def _get_lr_scheduler(args, kv): - if 'lr_factor' not in args or args.lr_factor >= 1: - return (args.lr, None) - epoch_size = get_epoch_size(args, kv) - begin_epoch = args.load_epoch if args.load_epoch else 0 - if 'pow' in args.lr_step_epochs: - lr = args.lr - max_up = args.num_epochs * epoch_size - pwr = float(re.sub('pow[- ]*', '', args.lr_step_epochs)) - poly_sched = mx.lr_scheduler.PolyScheduler(max_up, lr, pwr) - return (lr, poly_sched) - step_epochs = [int(l) for l in args.lr_step_epochs.split(',')] - lr = args.lr - for s in step_epochs: - if begin_epoch >= s: - lr *= args.lr_factor - if lr != args.lr: - logging.info('Adjust learning rate to %e for epoch %d', - lr, begin_epoch) - - steps = [epoch_size * (x - begin_epoch) - for x in step_epochs if x - begin_epoch > 0] - if steps: - return (lr, mx.lr_scheduler.MultiFactorScheduler(step=steps, factor=args.lr_factor, - base_lr=args.lr)) - else: - return (lr, None) - -def _load_model(args, rank=0): - if 'load_epoch' not in args or args.load_epoch is None: - return (None, None, None) - assert args.model_prefix is not None - model_prefix = args.model_prefix - if rank > 0 and os.path.exists("%s-%d-symbol.json" % (model_prefix, rank)): - model_prefix += "-%d" % (rank) - sym, arg_params, aux_params = mx.model.load_checkpoint( - model_prefix, args.load_epoch) - logging.info('Loaded model %s_%04d.params', model_prefix, args.load_epoch) - return (sym, arg_params, aux_params) - - -def _save_model(args, rank=0): - if args.model_prefix is None: - return None - return mx.callback.do_checkpoint(args.model_prefix if rank == 0 else "%s-%d" % ( - args.model_prefix, rank), period=args.save_period) - - -def add_fit_args(parser): - """ - parser : argparse.ArgumentParser - return a parser added with args required by fit - """ - train = parser.add_argument_group('Training', 'model training') - train.add_argument('--network', type=str, - help='the neural network to use') - train.add_argument('--num-layers', type=int, - help='number of layers in the neural network, \ - required by some networks such as resnet') - train.add_argument('--gpus', type=str, - help='list of gpus to run, e.g. 0 or 0,2,5. empty means using cpu') - train.add_argument('--kv-store', type=str, default='device', - help='key-value store type') - train.add_argument('--num-epochs', type=int, default=100, - help='max num of epochs') - train.add_argument('--lr', type=float, default=0.1, - help='initial learning rate') - train.add_argument('--lr-factor', type=float, default=0.1, - help='the ratio to reduce lr on each step') - train.add_argument('--lr-step-epochs', type=str, - help='the epochs to reduce the lr, e.g. 30,60') - train.add_argument('--initializer', type=str, default='default', - help='the initializer type') - train.add_argument('--optimizer', type=str, default='sgd', - help='the optimizer type') - train.add_argument('--mom', type=float, default=0.9, - help='momentum for sgd') - train.add_argument('--wd', type=float, default=0.0001, - help='weight decay for sgd') - train.add_argument('--batch-size', type=int, default=128, - help='the batch size') - train.add_argument('--disp-batches', type=int, default=20, - help='show progress for every n batches') - train.add_argument('--model-prefix', type=str, - help='model prefix') - train.add_argument('--save-period', type=int, default=1, help='params saving period') - parser.add_argument('--monitor', dest='monitor', type=int, default=0, - help='log network parameters every N iters if larger than 0') - train.add_argument('--load-epoch', type=int, - help='load the model on an epoch using the model-load-prefix') - train.add_argument('--top-k', type=int, default=0, - help='report the top-k accuracy. 0 means no report.') - train.add_argument('--loss', type=str, default='', - help='show the cross-entropy or nll loss. ce strands for cross-entropy, nll-loss stands for likelihood loss') - train.add_argument('--test-io', type=int, default=0, - help='1 means test reading speed without training') - train.add_argument('--dtype', type=str, default='float32', - help='precision: float32 or float16') - train.add_argument('--gc-type', type=str, default='none', - help='type of gradient compression to use, \ - takes `2bit` or `none` for now') - train.add_argument('--gc-threshold', type=float, default=0.5, - help='threshold for 2bit gradient compression') - # additional parameters for large batch sgd - train.add_argument('--macrobatch-size', type=int, default=0, - help='distributed effective batch size') - train.add_argument('--warmup-epochs', type=int, default=5, - help='the epochs to ramp-up lr to scaled large-batch value') - train.add_argument('--warmup-strategy', type=str, default='linear', - help='the ramping-up strategy for large batch sgd') - train.add_argument('--profile-worker-suffix', type=str, default='', - help='profile workers actions into this file. During distributed training\ - filename saved will be rank1_ followed by this suffix') - train.add_argument('--profile-server-suffix', type=str, default='', - help='profile server actions into a file with name like rank1_ followed by this suffix \ - during distributed training') - train.add_argument('--use-imagenet-data-augmentation', type=int, default=0, - help='enable data augmentation of ImageNet data, default disabled') - return train - - -def fit(args, network, data_loader, **kwargs): - """ - train a model - args : argparse returns - network : the symbol definition of the nerual network - data_loader : function that returns the train and val data iterators - """ - # kvstore - kv = mx.kvstore.create(args.kv_store) - if args.gc_type != 'none': - kv.set_gradient_compression({'type': args.gc_type, - 'threshold': args.gc_threshold}) - if args.profile_server_suffix: - mx.profiler.set_config(filename=args.profile_server_suffix, profile_all=True, profile_process='server') - mx.profiler.set_state(state='run', profile_process='server') - - if args.profile_worker_suffix: - if kv.num_workers > 1: - filename = 'rank' + str(kv.rank) + '_' + args.profile_worker_suffix - else: - filename = args.profile_worker_suffix - mx.profiler.set_config(filename=filename, profile_all=True, profile_process='worker') - mx.profiler.set_state(state='run', profile_process='worker') - - # logging - head = '%(asctime)-15s Node[' + str(kv.rank) + '] %(message)s' - logging.basicConfig(level=logging.DEBUG, format=head) - logging.info('start with arguments %s', args) - - epoch_size = get_epoch_size(args, kv) - - # data iterators - (train, val) = data_loader(args, kv) - if 'dist' in args.kv_store and not 'async' in args.kv_store: - logging.info('Resizing training data to %d batches per machine', epoch_size) - # resize train iter to ensure each machine has same number of batches per epoch - # if not, dist_sync can hang at the end with one machine waiting for other machines - train = mx.io.ResizeIter(train, epoch_size) - - if args.test_io: - tic = time.time() - for i, batch in enumerate(train): - if isinstance(batch, list): - for b in batch: - for j in b.data: - j.wait_to_read() - else: - for j in batch.data: - j.wait_to_read() - if (i + 1) % args.disp_batches == 0: - logging.info('Batch [%d]\tSpeed: %.2f samples/sec', i, - args.disp_batches * args.batch_size / (time.time() - tic)) - tic = time.time() - return - - # load model - if 'arg_params' in kwargs and 'aux_params' in kwargs: - arg_params = kwargs['arg_params'] - aux_params = kwargs['aux_params'] - else: - sym, arg_params, aux_params = _load_model(args, kv.rank) - if sym is not None: - assert sym.tojson() == network.tojson() - - # save model - checkpoint = _save_model(args, kv.rank) - - # devices for training - devs = mx.cpu() if args.gpus is None or args.gpus == "" else [ - mx.gpu(int(i)) for i in args.gpus.split(',')] - - # learning rate - lr, lr_scheduler = _get_lr_scheduler(args, kv) - - # create model - model = mx.mod.Module( - context=devs, - symbol=network - ) - - lr_scheduler = lr_scheduler - optimizer_params = { - 'learning_rate': lr, - 'wd': args.wd, - 'lr_scheduler': lr_scheduler, - 'multi_precision': True} - - # Only a limited number of optimizers have 'momentum' property - has_momentum = {'sgd', 'dcasgd', 'nag', 'signum', 'lbsgd'} - if args.optimizer in has_momentum: - optimizer_params['momentum'] = args.mom - - monitor = mx.mon.Monitor( - args.monitor, pattern=".*") if args.monitor > 0 else None - - # A limited number of optimizers have a warmup period - has_warmup = {'lbsgd', 'lbnag'} - if args.optimizer in has_warmup: - nworkers = kv.num_workers - if epoch_size < 1: - epoch_size = 1 - macrobatch_size = args.macrobatch_size - if macrobatch_size < args.batch_size * nworkers: - macrobatch_size = args.batch_size * nworkers - #batch_scale = round(float(macrobatch_size) / args.batch_size / nworkers +0.4999) - batch_scale = math.ceil( - float(macrobatch_size) / args.batch_size / nworkers) - optimizer_params['updates_per_epoch'] = epoch_size - optimizer_params['begin_epoch'] = args.load_epoch if args.load_epoch else 0 - optimizer_params['batch_scale'] = batch_scale - optimizer_params['warmup_strategy'] = args.warmup_strategy - optimizer_params['warmup_epochs'] = args.warmup_epochs - optimizer_params['num_epochs'] = args.num_epochs - - if args.initializer == 'default': - if args.network == 'alexnet': - # AlexNet will not converge using Xavier - initializer = mx.init.Normal() - # VGG will not trend to converge using Xavier-Gaussian - elif args.network and 'vgg' in args.network: - initializer = mx.init.Xavier() - else: - initializer = mx.init.Xavier( - rnd_type='gaussian', factor_type="in", magnitude=2) - # initializer = mx.init.Xavier(factor_type="in", magnitude=2.34), - elif args.initializer == 'xavier': - initializer = mx.init.Xavier() - elif args.initializer == 'msra': - initializer = mx.init.MSRAPrelu() - elif args.initializer == 'orthogonal': - initializer = mx.init.Orthogonal() - elif args.initializer == 'normal': - initializer = mx.init.Normal() - elif args.initializer == 'uniform': - initializer = mx.init.Uniform() - elif args.initializer == 'one': - initializer = mx.init.One() - elif args.initializer == 'zero': - initializer = mx.init.Zero() - - # evaluation metrices - eval_metrics = ['accuracy'] - if args.top_k > 0: - eval_metrics.append(mx.metric.create( - 'top_k_accuracy', top_k=args.top_k)) - - supported_loss = ['ce', 'nll_loss'] - if len(args.loss) > 0: - # ce or nll loss is only applicable to softmax output - loss_type_list = args.loss.split(',') - if 'softmax_output' in network.list_outputs(): - for loss_type in loss_type_list: - loss_type = loss_type.strip() - if loss_type == 'nll': - loss_type = 'nll_loss' - if loss_type not in supported_loss: - logging.warning(loss_type + ' is not an valid loss type, only cross-entropy or ' \ - 'negative likelihood loss is supported!') - else: - eval_metrics.append(mx.metric.create(loss_type)) - else: - logging.warning("The output is not softmax_output, loss argument will be skipped!") - - # callbacks that run after each batch - batch_end_callbacks = [mx.callback.Speedometer( - args.batch_size, args.disp_batches)] - if 'batch_end_callback' in kwargs: - cbs = kwargs['batch_end_callback'] - batch_end_callbacks += cbs if isinstance(cbs, list) else [cbs] - - # run - model.fit(train, - begin_epoch=args.load_epoch if args.load_epoch else 0, - num_epoch=args.num_epochs, - eval_data=val, - eval_metric=eval_metrics, - kvstore=kv, - optimizer=args.optimizer, - optimizer_params=optimizer_params, - initializer=initializer, - arg_params=arg_params, - aux_params=aux_params, - batch_end_callback=batch_end_callbacks, - epoch_end_callback=checkpoint, - allow_missing=True, - monitor=monitor) - - if args.profile_server_suffix: - mx.profiler.set_state(state='run', profile_process='server') - if args.profile_worker_suffix: - mx.profiler.set_state(state='run', profile_process='worker') diff --git a/examples/v1alpha3/mxnet-mnist/common/utils.py b/examples/v1alpha3/mxnet-mnist/common/utils.py deleted file mode 100644 index 87717020fdc..00000000000 --- a/examples/v1alpha3/mxnet-mnist/common/utils.py +++ /dev/null @@ -1,47 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -import os -import errno - -import mxnet as mx - -def download_file(url, local_fname=None, force_write=False): - # requests is not default installed - import requests - if local_fname is None: - local_fname = url.split('/')[-1] - if not force_write and os.path.exists(local_fname): - return local_fname - - dir_name = os.path.dirname(local_fname) - - if dir_name != "": - if not os.path.exists(dir_name): - try: # try to create the directory if it doesn't exists - os.makedirs(dir_name) - except OSError as exc: - if exc.errno != errno.EEXIST: - raise - - r = requests.get(url, stream=True) - assert r.status_code == 200, "failed to open %s" % url - with open(local_fname, 'wb') as f: - for chunk in r.iter_content(chunk_size=1024): - if chunk: # filter out keep-alive new chunks - f.write(chunk) - return local_fname diff --git a/examples/v1alpha3/mxnet-mnist/mnist.py b/examples/v1alpha3/mxnet-mnist/mnist.py deleted file mode 100644 index b3478fdc29e..00000000000 --- a/examples/v1alpha3/mxnet-mnist/mnist.py +++ /dev/null @@ -1,102 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -""" -Train mnist, see more explanation at https://mxnet.io/tutorials/python/mnist.html -""" -import os -import argparse -import logging -import mxnet as mx -import numpy as np -import gzip, struct -from common import fit -from common import utils -# This example only for mlp network -from symbols import mlp - -# Use this format (%Y-%m-%dT%H:%M:%SZ) to record timestamp of the metrics -logging.basicConfig( - format="%(asctime)s %(levelname)-8s %(message)s", - datefmt="%Y-%m-%dT%H:%M:%SZ", - level=logging.DEBUG) - -def read_data(label, image): - """ - download and read data into numpy - """ - base_url = 'http://yann.lecun.com/exdb/mnist/' - with gzip.open(utils.download_file(base_url+label, os.path.join('data',label))) as flbl: - magic, num = struct.unpack(">II", flbl.read(8)) - label = np.fromstring(flbl.read(), dtype=np.int8) - with gzip.open(utils.download_file(base_url+image, os.path.join('data',image)), 'rb') as fimg: - magic, num, rows, cols = struct.unpack(">IIII", fimg.read(16)) - image = np.fromstring(fimg.read(), dtype=np.uint8).reshape(len(label), rows, cols) - return (label, image) - - -def to4d(img): - """ - reshape to 4D arrays - """ - return img.reshape(img.shape[0], 1, 28, 28).astype(np.float32)/255 - -def get_mnist_iter(args, kv): - """ - create data iterator with NDArrayIter - """ - (train_lbl, train_img) = read_data( - 'train-labels-idx1-ubyte.gz', 'train-images-idx3-ubyte.gz') - (val_lbl, val_img) = read_data( - 't10k-labels-idx1-ubyte.gz', 't10k-images-idx3-ubyte.gz') - train = mx.io.NDArrayIter( - to4d(train_img), train_lbl, args.batch_size, shuffle=True) - val = mx.io.NDArrayIter( - to4d(val_img), val_lbl, args.batch_size) - return (train, val) - -if __name__ == '__main__': - # parse args - parser = argparse.ArgumentParser(description="train mnist", - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--num-classes', type=int, default=10, - help='the number of classes') - parser.add_argument('--num-examples', type=int, default=60000, - help='the number of training examples') - - parser.add_argument('--add_stn', action="store_true", default=False, help='Add Spatial Transformer Network Layer (lenet only)') - parser.add_argument('--image_shape', default='1, 28, 28', help='shape of training images') - - fit.add_fit_args(parser) - parser.set_defaults( - # network - network = 'mlp', - # train - gpus = None, - batch_size = 64, - disp_batches = 100, - num_epochs = 10, - lr = .05, - lr_step_epochs = '10' - ) - args = parser.parse_args() - - # load mlp network - sym = mlp.get_symbol(**vars(args)) - - # train - fit.fit(args, sym, get_mnist_iter) diff --git a/examples/v1alpha3/mxnet-mnist/symbols/__init__.py b/examples/v1alpha3/mxnet-mnist/symbols/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/examples/v1alpha3/mxnet-mnist/symbols/mlp.py b/examples/v1alpha3/mxnet-mnist/symbols/mlp.py deleted file mode 100644 index 4b190b29db9..00000000000 --- a/examples/v1alpha3/mxnet-mnist/symbols/mlp.py +++ /dev/null @@ -1,32 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -""" -a simple multilayer perceptron -""" -import mxnet as mx - -def get_symbol(num_classes=10, **kwargs): - data = mx.symbol.Variable('data') - data = mx.sym.Flatten(data=data) - fc1 = mx.symbol.FullyConnected(data = data, name='fc1', num_hidden=128) - act1 = mx.symbol.Activation(data = fc1, name='relu1', act_type="relu") - fc2 = mx.symbol.FullyConnected(data = act1, name = 'fc2', num_hidden = 64) - act2 = mx.symbol.Activation(data = fc2, name='relu2', act_type="relu") - fc3 = mx.symbol.FullyConnected(data = act2, name='fc3', num_hidden=num_classes) - mlp = mx.symbol.SoftmaxOutput(data = fc3, name = 'softmax') - return mlp diff --git a/examples/v1alpha3/nas/darts-cnn-cifar10/Dockerfile b/examples/v1alpha3/nas/darts-cnn-cifar10/Dockerfile deleted file mode 100644 index c8a79d9cd5d..00000000000 --- a/examples/v1alpha3/nas/darts-cnn-cifar10/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -ARG cuda_version=10.0 -ARG cudnn_version=7 -FROM pytorch/pytorch:1.0-cuda${cuda_version}-cudnn${cudnn_version}-runtime - -ENV TARGET_DIR /opt/nas/darts-cnn-cifar10 - - -ADD . ${TARGET_DIR} -WORKDIR ${TARGET_DIR} - -RUN chgrp -R 0 ${TARGET_DIR} \ - && chmod -R g+rwX ${TARGET_DIR} - -ENTRYPOINT ["python3", "-u", "run_trial.py"] diff --git a/examples/v1alpha3/nas/darts-cnn-cifar10/architect.py b/examples/v1alpha3/nas/darts-cnn-cifar10/architect.py deleted file mode 100644 index 65217706af3..00000000000 --- a/examples/v1alpha3/nas/darts-cnn-cifar10/architect.py +++ /dev/null @@ -1,113 +0,0 @@ -import torch -import copy - - -class Architect(): - """" Architect controls architecture of cell by computing gradients of alphas - """ - - def __init__(self, model, w_momentum, w_weight_decay): - self.model = model - self.v_model = copy.deepcopy(model) - self.w_momentum = w_momentum - self.w_weight_decay = w_weight_decay - - def virtual_step(self, train_x, train_y, xi, w_optim): - """ - Compute unrolled weight w' (virtual step) - Step process: - 1) forward - 2) calculate loss - 3) compute gradient (by backprop) - 4) update gradient - - Args: - xi: learning rate for virtual gradient step (same as weights lr) - w_optim: weights optimizer - """ - - # Forward and calculate loss - # Loss for train with w. L_train(w) - loss = self.model.loss(train_x, train_y) - # Compute gradient - gradients = torch.autograd.grad(loss, self.model.getWeights()) - - # Do virtual step (Update gradient) - # Bellow opeartions do not need gradient tracking - with torch.no_grad(): - # dict key is not the value, but the pointer. So original network weight have to - # be iterated also. - for w, vw, g in zip(self.model.getWeights(), self.v_model.getWeights(), gradients): - m = w_optim.state[w].get("momentum_buffer", 0.) * self.w_momentum - vw.copy_(w - xi * (m + g + self.w_weight_decay * w)) - - # Sync alphas - for a, va in zip(self.model.getAlphas(), self.v_model.getAlphas()): - va.copy_(a) - - def unrolled_backward(self, train_x, train_y, valid_x, valid_y, xi, w_optim): - """ Compute unrolled loss and backward its gradients - Args: - xi: learning rate for virtual gradient step (same as model lr) - w_optim: weights optimizer - for virtual step - """ - # Do virtual step (calc w') - self.virtual_step(train_x, train_y, xi, w_optim) - - # Calculate unrolled loss - # Loss for validation with w'. L_valid(w') - loss = self.v_model.loss(valid_x, valid_y) - - # Calculate gradient - v_alphas = tuple(self.v_model.getAlphas()) - v_weights = tuple(self.v_model.getWeights()) - v_grads = torch.autograd.grad(loss, v_alphas + v_weights) - - dalpha = v_grads[:len(v_alphas)] - dws = v_grads[len(v_alphas):] - - hessian = self.compute_hessian(dws, train_x, train_y) - - # Update final gradient = dalpha - xi * hessian - with torch.no_grad(): - for alpha, da, h in zip(self.model.getAlphas(), dalpha, hessian): - alpha.grad = da - xi * h - - def compute_hessian(self, dws, train_x, train_y): - """ - dw = dw' { L_valid(w', alpha) } - w+ = w + eps * dw - w- = w - eps * dw - hessian = (dalpha{ L_train(w+, alpha) } - dalpha{ L_train(w-, alpha) }) / (2*eps) - eps = 0.01 / ||dw|| - """ - - norm = torch.cat([dw.view(-1) for dw in dws]).norm() - eps = 0.01 / norm - - # w+ = w + eps * dw - with torch.no_grad(): - for p, dw in zip(self.model.getWeights(), dws): - p += eps * dw - - loss = self.model.loss(train_x, train_y) - # dalpha { L_train(w+, alpha) } - dalpha_positive = torch.autograd.grad(loss, self.model.getAlphas()) - - # w- = w - eps * dw - with torch.no_grad(): - for p, dw in zip(self.model.getWeights(), dws): - # TODO (andreyvelich): Do we need this * 2.0 ? - p -= 2. * eps * dw - - loss = self.model.loss(train_x, train_y) - # dalpha { L_train(w-, alpha) } - dalpha_negative = torch.autograd.grad(loss, self.model.getAlphas()) - - # recover w - with torch.no_grad(): - for p, dw in zip(self.model.getWeights(), dws): - p += eps * dw - - hessian = [(p-n) / (2. * eps) for p, n in zip(dalpha_positive, dalpha_negative)] - return hessian diff --git a/examples/v1alpha3/nas/darts-cnn-cifar10/model.py b/examples/v1alpha3/nas/darts-cnn-cifar10/model.py deleted file mode 100644 index f7080296db4..00000000000 --- a/examples/v1alpha3/nas/darts-cnn-cifar10/model.py +++ /dev/null @@ -1,181 +0,0 @@ -import torch -import torch.nn as nn -import torch.nn.functional as F -from operations import FactorizedReduce, StdConv, MixedOp - - -class Cell(nn.Module): - """ Cell for search - Each edge is mixed and continuous relaxed. - """ - - def __init__(self, num_nodes, c_prev_prev, c_prev, c_cur, reduction_prev, reduction_cur, search_space): - """ - Args: - num_nodes: Number of intermediate cell nodes - c_prev_prev: channels_out[k-2] - c_prev : Channels_out[k-1] - c_cur : Channels_in[k] (current) - reduction_prev: flag for whether the previous cell is reduction cell or not - reduction_cur: flag for whether the current cell is reduction cell or not - """ - - super(Cell, self).__init__() - self.reduction_cur = reduction_cur - self.num_nodes = num_nodes - - # If previous cell is reduction cell, current input size does not match with - # output size of cell[k-2]. So the output[k-2] should be reduced by preprocessing - if reduction_prev: - self.preprocess0 = FactorizedReduce(c_prev_prev, c_cur) - else: - self.preprocess0 = StdConv(c_prev_prev, c_cur, kernel_size=1, stride=1, padding=0) - self.preprocess1 = StdConv(c_prev, c_cur, kernel_size=1, stride=1, padding=0) - - # Generate dag from mixed operations - self.dag_ops = nn.ModuleList() - - for i in range(self.num_nodes): - self.dag_ops.append(nn.ModuleList()) - # Include 2 input nodes - for j in range(2+i): - # Reduction with stride = 2 must be only for the input node - stride = 2 if reduction_cur and j < 2 else 1 - op = MixedOp(c_cur, stride, search_space) - self.dag_ops[i].append(op) - - def forward(self, s0, s1, w_dag): - s0 = self.preprocess0(s0) - s1 = self.preprocess1(s1) - - states = [s0, s1] - for edges, w_list in zip(self.dag_ops, w_dag): - state_cur = sum(edges[i](s, w) for i, (s, w) in enumerate((zip(states, w_list)))) - states.append(state_cur) - - state_out = torch.cat(states[2:], dim=1) - return state_out - - -class NetworkCNN(nn.Module): - - def __init__(self, init_channels, input_channels, num_classes, - num_layers, criterion, search_space, num_nodes, stem_multiplier): - super(NetworkCNN, self).__init__() - - self.init_channels = init_channels - self.num_classes = num_classes - self.num_layers = num_layers - self.criterion = criterion - - # TODO: Algorithm settings? - self.num_nodes = num_nodes - self.stem_multiplier = stem_multiplier - - c_cur = self.stem_multiplier*self.init_channels - - self.stem = nn.Sequential( - nn.Conv2d(input_channels, c_cur, 3, padding=1, bias=False), - nn.BatchNorm2d(c_cur) - ) - - # In first Cell stem is used for s0 and s1 - # c_prev_prev and c_prev - output channels size - # c_cur - init channels size - c_prev_prev, c_prev, c_cur = c_cur, c_cur, self.init_channels - - self.cells = nn.ModuleList() - - reduction_prev = False - for i in range(self.num_layers): - # For Network with 1 layer: Only Normal Cell - if self.num_layers == 1: - reduction_cur = False - else: - # For Network with two layers: First layer - Normal, Second - Reduction - # For Other Networks: [1/3, 2/3] Layers - Reduction cell with double channels - # Others - Normal cell - if ((self.num_layers == 2 and i == 1) or - (self.num_layers > 2 and i in [self.num_layers//3, 2*self.num_layers//3])): - c_cur *= 2 - reduction_cur = True - else: - reduction_cur = False - - cell = Cell(self.num_nodes, c_prev_prev, c_prev, c_cur, reduction_prev, reduction_cur, search_space) - reduction_prev = reduction_cur - self.cells.append(cell) - - c_cur_out = c_cur * self.num_nodes - c_prev_prev, c_prev = c_prev, c_cur_out - - self.global_pooling = nn.AdaptiveAvgPool2d(1) - self.classifier = nn.Linear(c_prev, self.num_classes) - - # Initialize alphas parameters - num_ops = len(search_space.primitives) - - self.alpha_normal = nn.ParameterList() - self.alpha_reduce = nn.ParameterList() - - for i in range(self.num_nodes): - self.alpha_normal.append(nn.Parameter(1e-3*torch.randn(i+2, num_ops))) - if self.num_layers > 1: - self.alpha_reduce.append(nn.Parameter(1e-3*torch.randn(i+2, num_ops))) - - # Setup alphas list - self.alphas = [] - for name, parameter in self.named_parameters(): - if "alpha" in name: - self.alphas.append((name, parameter)) - - def forward(self, x): - - weights_normal = [F.softmax(alpha, dim=-1) for alpha in self.alpha_normal] - weights_reduce = [F.softmax(alpha, dim=-1) for alpha in self.alpha_reduce] - - s0 = s1 = self.stem(x) - - for cell in self.cells: - weights = weights_reduce if cell.reduction_cur else weights_normal - s0, s1 = s1, cell(s0, s1, weights) - - out = self.global_pooling(s1) - - # Make out flatten - out = out.view(out.size(0), -1) - - logits = self.classifier(out) - return logits - - def print_alphas(self): - - print("\n>>> Alphas Normal <<<") - for alpha in self.alpha_normal: - print(F.softmax(alpha, dim=-1)) - - if self.num_layers > 1: - print("\n>>> Alpha Reduce <<<") - for alpha in self.alpha_reduce: - print(F.softmax(alpha, dim=-1)) - print("\n") - - def getWeights(self): - return self.parameters() - - def getAlphas(self): - for _, parameter in self.alphas: - yield parameter - - def loss(self, x, y): - logits = self.forward(x) - return self.criterion(logits, y) - - def genotype(self, search_space): - gene_normal = search_space.parse(self.alpha_normal, k=2) - gene_reduce = search_space.parse(self.alpha_reduce, k=2) - # concat all intermediate nodes - concat = range(2, 2 + self.num_nodes) - - return search_space.genotype(normal=gene_normal, normal_concat=concat, - reduce=gene_reduce, reduce_concat=concat) diff --git a/examples/v1alpha3/nas/darts-cnn-cifar10/operations.py b/examples/v1alpha3/nas/darts-cnn-cifar10/operations.py deleted file mode 100644 index e9efe8b9e63..00000000000 --- a/examples/v1alpha3/nas/darts-cnn-cifar10/operations.py +++ /dev/null @@ -1,166 +0,0 @@ -import torch.nn as nn -import torch - -OPS = { - 'none': lambda channels, stride: Zero(stride), - 'avg_pooling_3x3': lambda channels, stride: PoolBN('avg', channels, kernel_size=3, stride=stride, padding=1), - 'max_pooling_3x3': lambda channels, stride: PoolBN('max', channels, kernel_size=3, stride=stride, padding=1), - 'skip_connection': lambda channels, stride: Identity() if stride == 1 else FactorizedReduce(channels, channels), - 'separable_convolution_3x3': lambda channels, stride: SepConv(channels, kernel_size=3, stride=stride, padding=1), - 'separable_convolution_5x5': lambda channels, stride: SepConv(channels, kernel_size=5, stride=stride, padding=2), - # 3x3 -> 5x5 - 'dilated_convolution_3x3': lambda channels, stride: DilConv(channels, - kernel_size=3, stride=stride, padding=2, dilation=2), - # 5x5 -> 9x9 - 'dilated_convolution_5x5': lambda channels, stride: DilConv(channels, - kernel_size=5, stride=stride, padding=4, dilation=2), -} - - -class Zero(nn.Module): - """ - Zero operation - """ - - def __init__(self, stride): - super(Zero, self).__init__() - self.stride = stride - - def forward(self, x): - if self.stride == 1: - return x * 0. - # Resize by stride - return x[:, :, ::self.stride, ::self.stride] * 0. - - -class PoolBN(nn.Module): - """ - Avg or Max pooling - BN - """ - - def __init__(self, pool_type, channels, kernel_size, stride, padding): - super(PoolBN, self).__init__() - if pool_type == "avg": - self.pool = nn.AvgPool2d(kernel_size, stride, padding, count_include_pad=False) - elif pool_type == "max": - self.pool = nn.MaxPool2d(kernel_size, stride, padding) - - self.bn = nn.BatchNorm2d(channels, affine=False) - self.net = nn.Sequential( - self.pool, - self.bn - ) - - def forward(self, x): - # out = self.pool(x), - # print(out) - # out = self.bn(out) - # print(out) - return self.net(x) - - -class Identity(nn.Module): - - def __init__(self): - super(Identity, self).__init__() - - def forward(self, x): - return x - - -class FactorizedReduce(nn.Module): - """ - Reduce feature map size by factorized pointwise (stride=2) - ReLU - Conv1 - Conv2 - BN - """ - - def __init__(self, c_in, c_out): - super(FactorizedReduce, self).__init__() - self.relu = nn.ReLU() - self.conv1 = nn.Conv2d(c_in, c_out // 2, kernel_size=1, stride=2, padding=0, bias=False) - self.conv2 = nn.Conv2d(c_in, c_out // 2, kernel_size=1, stride=2, padding=0, bias=False) - self.bn = nn.BatchNorm2d(c_out, affine=False) - - def forward(self, x): - - x = self.relu(x) - out = torch.cat([self.conv1(x), self.conv2(x[:, :, 1:, 1:])], dim=1) - out = self.bn(out) - - return out - - -class StdConv(nn.Module): - """ Standard convolition - ReLU - Conv - BN - """ - - def __init__(self, c_in, c_out, kernel_size, stride, padding): - super(StdConv, self).__init__() - self.net = nn.Sequential( - nn.ReLU(), - nn.Conv2d(c_in, c_out, kernel_size=kernel_size, stride=stride, padding=padding, bias=False), - nn.BatchNorm2d(c_out, affine=False) - ) - - def forward(self, x): - return self.net(x) - - -class DilConv(nn.Module): - """ (Dilated) depthwise separable conv - ReLU - (Dilated) depthwise separable - Pointwise - BN - - If dilation == 2, 3x3 conv => 5x5 receptive field - 5x5 conv => 9x9 receptive field - """ - - def __init__(self, channels, kernel_size, stride, padding, dilation): - super(DilConv, self).__init__() - - self.net = nn.Sequential( - nn.ReLU(), - nn.Conv2d(channels, channels, kernel_size, stride, padding, dilation=dilation, groups=channels, bias=False), - nn.Conv2d(channels, channels, kernel_size=1, stride=1, padding=0, bias=False), - nn.BatchNorm2d(channels, affine=False) - ) - - def forward(self, x): - return self.net(x) - - -class SepConv(nn.Module): - """ Depthwise separable conv - DilConv (dilation=1) * 2 - """ - - def __init__(self, channels, kernel_size, stride, padding): - super(SepConv, self).__init__() - self.net = nn.Sequential( - DilConv(channels, kernel_size, stride=stride, padding=padding, dilation=1), - DilConv(channels, kernel_size, stride=1, padding=padding, dilation=1) - ) - - def forward(self, x): - return self.net(x) - - -class MixedOp(nn.Module): - """ Mixed operation - """ - - def __init__(self, channels, stride, search_space): - super(MixedOp, self).__init__() - self.ops = nn.ModuleList() - - for primitive in search_space.primitives: - op = OPS[primitive](channels, stride) - self.ops.append(op) - - def forward(self, x, weights): - """ - Args: - x: input - weights: weight for each operation - """ - return sum(w * op(x) for w, op in zip(weights, self.ops)) diff --git a/examples/v1alpha3/nas/darts-cnn-cifar10/run_trial.py b/examples/v1alpha3/nas/darts-cnn-cifar10/run_trial.py deleted file mode 100644 index e243c42aa06..00000000000 --- a/examples/v1alpha3/nas/darts-cnn-cifar10/run_trial.py +++ /dev/null @@ -1,245 +0,0 @@ - -import torch.nn as nn - -import torch -import argparse -import json -import numpy as np - -from model import NetworkCNN -from architect import Architect -import utils -from search_space import SearchSpace - - -def main(): - - parser = argparse.ArgumentParser(description='TrainingContainer') - parser.add_argument('--algorithm-settings', type=str, default="", help="algorithm settings") - parser.add_argument('--search-space', type=str, default="", help="search space for the neural architecture search") - parser.add_argument('--num-layers', type=str, default="", help="number of layers of the neural network") - - args = parser.parse_args() - - # Get Algorithm Settings - algorithm_settings = args.algorithm_settings.replace("\'", "\"") - algorithm_settings = json.loads(algorithm_settings) - print(">>> Algorithm settings") - for key, value in algorithm_settings.items(): - if len(key) > 13: - print("{}\t{}".format(key, value)) - elif len(key) < 5: - print("{}\t\t\t{}".format(key, value)) - else: - print("{}\t\t{}".format(key, value)) - print() - - num_epochs = int(algorithm_settings["num_epochs"]) - - w_lr = float(algorithm_settings["w_lr"]) - w_lr_min = float(algorithm_settings["w_lr_min"]) - w_momentum = float(algorithm_settings["w_momentum"]) - w_weight_decay = float(algorithm_settings["w_weight_decay"]) - w_grad_clip = float(algorithm_settings["w_grad_clip"]) - - alpha_lr = float(algorithm_settings["alpha_lr"]) - alpha_weight_decay = float(algorithm_settings["alpha_weight_decay"]) - - batch_size = int(algorithm_settings["batch_size"]) - num_workers = int(algorithm_settings["num_workers"]) - - init_channels = int(algorithm_settings["init_channels"]) - - print_step = int(algorithm_settings["print_step"]) - - num_nodes = int(algorithm_settings["num_nodes"]) - stem_multiplier = int(algorithm_settings["stem_multiplier"]) - - # Get Search Space - search_space = args.search_space.replace("\'", "\"") - search_space = json.loads(search_space) - search_space = SearchSpace(search_space) - - # Get Num Layers - num_layers = int(args.num_layers) - print("Number of layers {}\n".format(num_layers)) - - # Set GPU Device - # Currently use only first available GPU - # TODO: Add multi GPU support - # TODO: Add functionality to select GPU - all_gpus = list(range(torch.cuda.device_count())) - if len(all_gpus) > 0: - device = torch.device("cuda") - torch.cuda.set_device(all_gpus[0]) - np.random.seed(2) - torch.manual_seed(2) - torch.cuda.manual_seed_all(2) - torch.backends.cudnn.benchmark = True - print(">>> Use GPU for Training <<<") - print("Device ID: {}".format(torch.cuda.current_device())) - print("Device name: {}".format(torch.cuda.get_device_name(0))) - print("Device availability: {}\n".format(torch.cuda.is_available())) - else: - device = torch.device("cpu") - print(">>> Use CPU for Training <<<") - - # Get dataset with meta information - # TODO: Add support for more dataset - input_channels, num_classes, train_data = utils.get_dataset() - - criterion = nn.CrossEntropyLoss().to(device) - - model = NetworkCNN(init_channels, input_channels, num_classes, num_layers, - criterion, search_space, num_nodes, stem_multiplier) - - model = model.to(device) - - # Weights optimizer - w_optim = torch.optim.SGD(model.getWeights(), w_lr, momentum=w_momentum, weight_decay=w_weight_decay) - - # Alphas optimizer - alpha_optim = torch.optim.Adam(model.getAlphas(), alpha_lr, betas=(0.5, 0.999), weight_decay=alpha_weight_decay) - - # Split data to train/validation - num_train = len(train_data) - split = num_train // 2 - indices = list(range(num_train)) - - train_sampler = torch.utils.data.sampler.SubsetRandomSampler(indices[:split]) - valid_sampler = torch.utils.data.sampler.SubsetRandomSampler(indices[split:]) - - train_loader = torch.utils.data.DataLoader(train_data, - batch_size=batch_size, - sampler=train_sampler, - num_workers=num_workers, - pin_memory=True) - - valid_loader = torch.utils.data.DataLoader(train_data, - batch_size=batch_size, - sampler=valid_sampler, - num_workers=num_workers, - pin_memory=True) - - lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR( - w_optim, - num_epochs, - eta_min=w_lr_min) - - architect = Architect(model, w_momentum, w_weight_decay) - - # Start training - best_top1 = 0. - - for epoch in range(num_epochs): - lr_scheduler.step() - lr = lr_scheduler.get_lr()[0] - - model.print_alphas() - - # Training - print(">>> Training") - train(train_loader, valid_loader, model, architect, w_optim, alpha_optim, - lr, epoch, num_epochs, device, w_grad_clip, print_step) - - # Validation - print("\n>>> Validation") - cur_step = (epoch + 1) * len(train_loader) - top1 = validate(valid_loader, model, epoch, cur_step, num_epochs, device, print_step) - - # Print genotype - genotype = model.genotype(search_space) - print("\nModel genotype = {}".format(genotype)) - - # Modify best top1 - if top1 > best_top1: - best_top1 = top1 - best_genotype = genotype - - print("Final best Prec@1 = {:.4%}".format(best_top1)) - print("\nBest-Genotype={}".format(str(best_genotype).replace(" ", ""))) - - -def train(train_loader, valid_loader, model, architect, w_optim, alpha_optim, - lr, epoch, num_epochs, device, w_grad_clip, print_step): - top1 = utils.AverageMeter() - top5 = utils.AverageMeter() - losses = utils.AverageMeter() - cur_step = epoch * len(train_loader) - - model.train() - for step, ((train_x, train_y), (valid_x, valid_y)) in enumerate(zip(train_loader, valid_loader)): - - train_x, train_y = train_x.to(device, non_blocking=True), train_y.to(device, non_blocking=True) - valid_x, valid_y = valid_x.to(device, non_blocking=True), valid_y.to(device, non_blocking=True) - - train_size = train_x.size(0) - - # Phase 1. Architect step (Alpha) - alpha_optim.zero_grad() - architect.unrolled_backward(train_x, train_y, valid_x, valid_y, lr, w_optim) - alpha_optim.step() - - # Phase 2. Child network step (W) - w_optim.zero_grad() - logits = model(train_x) - loss = model.criterion(logits, train_y) - loss.backward() - - # Gradient clipping - nn.utils.clip_grad_norm_(model.getWeights(), w_grad_clip) - w_optim.step() - - prec1, prec5 = utils.accuracy(logits, train_y, topk=(1, 5)) - - losses.update(loss.item(), train_size) - top1.update(prec1.item(), train_size) - top5.update(prec5.item(), train_size) - - if step % print_step == 0 or step == len(train_loader) - 1: - print( - "Train: [{:2d}/{}] Step {:03d}/{:03d} Loss {losses.avg:.3f} " - "Prec@(1,5) ({top1.avg:.1%}, {top5.avg:.1%})".format( - epoch+1, num_epochs, step, len(train_loader)-1, losses=losses, - top1=top1, top5=top5)) - - cur_step += 1 - - print("Train: [{:2d}/{}] Final Prec@1 {:.4%}".format(epoch+1, num_epochs, top1.avg)) - - -def validate(valid_loader, model, epoch, cur_step, num_epochs, device, print_step): - top1 = utils.AverageMeter() - top5 = utils.AverageMeter() - losses = utils.AverageMeter() - - model.eval() - - with torch.no_grad(): - for step, (valid_x, valid_y) in enumerate(valid_loader): - valid_x, valid_y = valid_x.to(device, non_blocking=True), valid_y.to(device, non_blocking=True) - - valid_size = valid_x.size(0) - - logits = model(valid_x) - loss = model.criterion(logits, valid_y) - - prec1, prec5 = utils.accuracy(logits, valid_y, topk=(1, 5)) - losses.update(loss.item(), valid_size) - top1.update(prec1.item(), valid_size) - top5.update(prec5.item(), valid_size) - - if step % print_step == 0 or step == len(valid_loader) - 1: - print( - "Validation: [{:2d}/{}] Step {:03d}/{:03d} Loss {losses.avg:.3f} " - "Prec@(1,5) ({top1.avg:.1%}, {top5.avg:.1%})".format( - epoch+1, num_epochs, step, len(valid_loader)-1, losses=losses, - top1=top1, top5=top5)) - - print("Valid: [{:2d}/{}] Final Prec@1 {:.4%}".format(epoch+1, num_epochs, top1.avg)) - - return top1.avg - - -if __name__ == "__main__": - main() diff --git a/examples/v1alpha3/nas/darts-cnn-cifar10/search_space.py b/examples/v1alpha3/nas/darts-cnn-cifar10/search_space.py deleted file mode 100644 index f1ca61eee01..00000000000 --- a/examples/v1alpha3/nas/darts-cnn-cifar10/search_space.py +++ /dev/null @@ -1,50 +0,0 @@ -from collections import namedtuple -import torch - - -class SearchSpace(): - def __init__(self, search_space): - self.primitives = search_space - self.primitives.append("none") - - print(">>> All Primitives") - print("{}\n".format(self.primitives)) - self.genotype = namedtuple('Genotype', 'normal normal_concat reduce reduce_concat') - - def parse(self, alpha, k): - """ - Parse continuous alpha to discrete gene. - alpha is ParameterList: - ParameterList [ - Parameter(n_edges1, n_ops), - Parameter(n_edges2, n_ops), - ... - ] - - gene is list: - [ - [('node1_ops_1', node_idx), ..., ('node1_ops_k', node_idx)], - [('node2_ops_1', node_idx), ..., ('node2_ops_k', node_idx)], - ... - ] - each node has two edges (k=2) in CNN. - """ - - gene = [] - assert self.primitives[-1] == 'none' # assume last PRIMITIVE is 'none' - - # 1) Convert the mixed op to discrete edge (single op) by choosing top-1 weight edge - # 2) Choose top-k edges per node by edge score (top-1 weight in edge) - for edges in alpha: - # edges: Tensor(n_edges, n_ops) - edge_max, primitive_indices = torch.topk(edges[:, :-1], 1) # ignore 'none' - topk_edge_values, topk_edge_indices = torch.topk(edge_max.view(-1), k) - node_gene = [] - for edge_idx in topk_edge_indices: - prim_idx = primitive_indices[edge_idx] - prim = self.primitives[prim_idx] - node_gene.append((prim, edge_idx.item())) - - gene.append(node_gene) - - return gene diff --git a/examples/v1alpha3/nas/darts-cnn-cifar10/utils.py b/examples/v1alpha3/nas/darts-cnn-cifar10/utils.py deleted file mode 100644 index b736ebbe5ea..00000000000 --- a/examples/v1alpha3/nas/darts-cnn-cifar10/utils.py +++ /dev/null @@ -1,70 +0,0 @@ -import torchvision.datasets as dset -import torchvision.transforms as transforms - - -class AverageMeter(): - """ Computes and stores the average and current value """ - - def __init__(self): - self.reset() - - def reset(self): - """ Reset all statistics """ - self.val = 0 - self.avg = 0 - self.sum = 0 - self.count = 0 - - def update(self, val, n=1): - """ Update statistics """ - self.val = val - self.sum += val * n - self.count += n - self.avg = self.sum / self.count - - -def accuracy(output, target, topk=(1,)): - """ Computes the precision@k for the specified values of k """ - maxk = max(topk) - batch_size = target.size(0) - - _, pred = output.topk(maxk, 1, True, True) - - pred = pred.t() - # one-hot case - if target.ndimension() > 1: - target = target.max(1)[1] - - correct = pred.eq(target.view(1, -1).expand_as(pred)) - - res = [] - for k in topk: - correct_k = correct[:k].view(-1).float().sum(0) - res.append(correct_k.mul_(1.0 / batch_size)) - - return res - - -def get_dataset(): - dataset_cls = dset.CIFAR10 - num_classes = 10 - input_channels = 3 - - # Do preprocessing - MEAN = [0.49139968, 0.48215827, 0.44653124] - STD = [0.24703233, 0.24348505, 0.26158768] - transf = [ - transforms.RandomCrop(32, padding=4), - transforms.RandomHorizontalFlip() - ] - - normalize = [ - transforms.ToTensor(), - transforms.Normalize(MEAN, STD) - ] - - train_transform = transforms.Compose(transf + normalize) - - train_data = dataset_cls(root="./data", train=True, download=True, transform=train_transform) - - return input_channels, num_classes, train_data diff --git a/examples/v1alpha3/nas/darts-example-gpu.yaml b/examples/v1alpha3/nas/darts-example-gpu.yaml deleted file mode 100644 index fe25d9863cb..00000000000 --- a/examples/v1alpha3/nas/darts-example-gpu.yaml +++ /dev/null @@ -1,85 +0,0 @@ -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - name: darts-example-gpu -spec: - parallelTrialCount: 1 - maxTrialCount: 1 - maxFailedTrialCount: 1 - objective: - type: maximize - objectiveMetricName: Best-Genotype - metricsCollectorSpec: - collector: - kind: StdOut - source: - filter: - metricsFormat: - - "([\\w-]+)=(Genotype.*)" - algorithm: - algorithmName: darts - algorithmSettings: - - name: num_epochs - value: "3" - nasConfig: - graphConfig: - numLayers: 3 - operations: - - operationType: separable_convolution - parameters: - - name: filter_size - parameterType: categorical - feasibleSpace: - list: - - "3" - - operationType: dilated_convolution - parameters: - - name: filter_size - parameterType: categorical - feasibleSpace: - list: - - "3" - - "5" - - operationType: avg_pooling - parameters: - - name: filter_size - parameterType: categorical - feasibleSpace: - list: - - "3" - - operationType: max_pooling - parameters: - - name: filter_size - parameterType: categorical - feasibleSpace: - list: - - "3" - - operationType: skip_connection - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/darts-cnn-cifar10 - imagePullPolicy: Always - command: - - "python3" - - "run_trial.py" - {{- with .HyperParameters}} - {{- range .}} - - "--{{.Name}}=\"{{.Value}}\"" - {{- end}} - {{- end}} - resources: - limits: - nvidia.com/gpu: 1 - restartPolicy: Never diff --git a/examples/v1alpha3/nas/enas-cnn-cifar10/Dockerfile.cpu b/examples/v1alpha3/nas/enas-cnn-cifar10/Dockerfile.cpu deleted file mode 100644 index a7cd04b0798..00000000000 --- a/examples/v1alpha3/nas/enas-cnn-cifar10/Dockerfile.cpu +++ /dev/null @@ -1,27 +0,0 @@ -FROM tensorflow/tensorflow:1.12.0 - -ENV TARGET_DIR /opt/nas/enas-cnn-cifar10 - -# Install system packages -RUN apt-get update && apt-get install -y software-properties-common && \ - add-apt-repository ppa:deadsnakes/ppa && \ - apt-get update && \ - apt-get install -y --no-install-recommends \ - python3-setuptools \ - python3-dev \ - python3-pip \ - git \ - graphviz \ - wget - -ADD . ${TARGET_DIR} -WORKDIR ${TARGET_DIR} - -RUN pip3 install --upgrade pip -RUN pip3 install --upgrade --no-cache-dir -r requirements-cpu.txt -ENV PYTHONPATH ${TARGET_DIR} - -RUN chgrp -R 0 ${TARGET_DIR} \ - && chmod -R g+rwX ${TARGET_DIR} - -ENTRYPOINT ["python3", "-u", "RunTrial.py"] diff --git a/examples/v1alpha3/nas/enas-cnn-cifar10/Dockerfile.gpu b/examples/v1alpha3/nas/enas-cnn-cifar10/Dockerfile.gpu deleted file mode 100644 index 755fef40f34..00000000000 --- a/examples/v1alpha3/nas/enas-cnn-cifar10/Dockerfile.gpu +++ /dev/null @@ -1,36 +0,0 @@ -ARG cuda_version=10.0 -ARG cudnn_version=7 -FROM nvidia/cuda:${cuda_version}-cudnn${cudnn_version}-devel - -ENV TARGET_DIR /opt/nas/enas-cnn-cifar10 - -# Install system packages -RUN apt-get update && apt-get install -y software-properties-common && \ - add-apt-repository ppa:deadsnakes/ppa && \ - apt-get update && \ - apt-get install -y --no-install-recommends \ - bzip2 \ - g++ \ - git \ - graphviz \ - libgl1-mesa-glx \ - libhdf5-dev \ - openmpi-bin \ - python3 \ - python3-pip \ - python3-setuptools \ - python3-dev \ - wget && \ - rm -rf /var/lib/apt/lists/* - -ADD . ${TARGET_DIR} -WORKDIR ${TARGET_DIR} - -RUN pip3 install --upgrade pip -RUN pip3 install --upgrade --no-cache-dir -r requirements-gpu.txt -ENV PYTHONPATH ${TARGET_DIR} - -RUN chgrp -R 0 ${TARGET_DIR} \ - && chmod -R g+rwX ${TARGET_DIR} - -ENTRYPOINT ["python3", "-u", "RunTrial.py"] diff --git a/examples/v1alpha3/nas/enas-cnn-cifar10/ModelConstructor.py b/examples/v1alpha3/nas/enas-cnn-cifar10/ModelConstructor.py deleted file mode 100644 index 6ef93cc3301..00000000000 --- a/examples/v1alpha3/nas/enas-cnn-cifar10/ModelConstructor.py +++ /dev/null @@ -1,67 +0,0 @@ -import numpy as np -from keras.models import Model -from keras import backend as K -import json -from keras.layers import Input, Conv2D, ZeroPadding2D, concatenate, MaxPooling2D, \ - AveragePooling2D, Dense, Activation, BatchNormalization, GlobalAveragePooling2D, Dropout -from op_library import concat, conv, sp_conv, dw_conv, reduction - - -class ModelConstructor(object): - def __init__(self, arc_json, nn_json): - self.arch = json.loads(arc_json) - nn_config = json.loads(nn_json) - self.num_layers = nn_config['num_layers'] - self.input_sizes = nn_config['input_sizes'] - self.output_size = nn_config['output_sizes'][-1] - self.embedding = nn_config['embedding'] - - def build_model(self): - # a list of the data all layers - all_layers = [0 for _ in range(self.num_layers + 1)] - # a list of all the dimensions of all layers - all_dims = [0 for _ in range(self.num_layers + 1)] - - # ================= Stacking layers ================= - # Input Layer. Layer 0 - input_layer = Input(shape=self.input_sizes) - all_layers[0] = input_layer - - # Intermediate Layers. Starting from layer 1. - for l in range(1, self.num_layers + 1): - input_layers = list() - opt = self.arch[l - 1][0] - opt_config = self.embedding[str(opt)] - skip = self.arch[l - 1][1:l+1] - - # set up the connection to the previous layer first - input_layers.append(all_layers[l - 1]) - - # then add skip connections - for i in range(l - 1): - if l > 1 and skip[i] == 1: - input_layers.append(all_layers[i]) - - layer_input = concat(input_layers) - if opt_config['opt_type'] == 'convolution': - layer_output = conv(layer_input, opt_config) - if opt_config['opt_type'] == 'separable_convolution': - layer_output = sp_conv(layer_input, opt_config) - if opt_config['opt_type'] == 'depthwise_convolution': - layer_output = dw_conv(layer_input, opt_config) - elif opt_config['opt_type'] == 'reduction': - layer_output = reduction(layer_input, opt_config) - - all_layers[l] = layer_output - - # Final Layer - # Global Average Pooling, then Fully connected with softmax. - avgpooled = GlobalAveragePooling2D()(all_layers[self.num_layers]) - dropped = Dropout(0.4)(avgpooled) - logits = Dense(units=self.output_size, - activation='softmax')(dropped) - - # Encapsulate the model - self.model = Model(inputs=input_layer, outputs=logits) - - return self.model diff --git a/examples/v1alpha3/nas/enas-cnn-cifar10/RunTrial.py b/examples/v1alpha3/nas/enas-cnn-cifar10/RunTrial.py deleted file mode 100644 index 4672e079a27..00000000000 --- a/examples/v1alpha3/nas/enas-cnn-cifar10/RunTrial.py +++ /dev/null @@ -1,78 +0,0 @@ -import keras -import numpy as np -from keras.datasets import cifar10 -from ModelConstructor import ModelConstructor -from keras.utils import to_categorical -from keras.utils import multi_gpu_model -from keras.preprocessing.image import ImageDataGenerator -import argparse -import time - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description='TrainingContainer') - parser.add_argument('--architecture', type=str, default="", metavar='N', - help='architecture of the neural network') - parser.add_argument('--nn_config', type=str, default="", metavar='N', - help='configurations and search space embeddings') - parser.add_argument('--num_epochs', type=int, default=10, metavar='N', - help='number of epoches that each child will be trained') - parser.add_argument('--num_gpus', type=int, default=1, metavar='N', - help='number of GPU that used for training') - args = parser.parse_args() - - arch = args.architecture.replace("\'", "\"") - print(">>> arch received by trial") - print(arch) - - nn_config = args.nn_config.replace("\'", "\"") - print(">>> nn_config received by trial") - print(nn_config) - - num_epochs = args.num_epochs - print(">>> num_epochs received by trial") - print(num_epochs) - - num_gpus = args.num_gpus - print(">>> num_gpus received by trial:") - print(num_gpus) - - print("\n>>> Constructing Model...") - constructor = ModelConstructor(arch, nn_config) - test_model = constructor.build_model() - print(">>> Model Constructed Successfully\n") - - if num_gpus > 1: - test_model = multi_gpu_model(test_model, gpus=num_gpus) - - test_model.summary() - test_model.compile(loss=keras.losses.categorical_crossentropy, - optimizer=keras.optimizers.Adam(lr=1e-3, decay=1e-4), - metrics=['accuracy']) - - (x_train, y_train), (x_test, y_test) = cifar10.load_data() - x_train = x_train.astype('float32') - x_test = x_test.astype('float32') - x_train /= 255 - x_test /= 255 - y_train = to_categorical(y_train) - y_test = to_categorical(y_test) - - augmentation = ImageDataGenerator( - width_shift_range=0.1, - height_shift_range=0.1, - horizontal_flip=True) - - # TODO: Add batch size to args - aug_data_flow = augmentation.flow(x_train, y_train, batch_size=128) - - print(">>> Data Loaded. Training starts.") - for e in range(num_epochs): - print("\nTotal Epoch {}/{}".format(e+1, num_epochs)) - history = test_model.fit_generator(generator=aug_data_flow, - steps_per_epoch=int(len(x_train)/128)+1, - epochs=1, verbose=1, - validation_data=(x_test, y_test)) - print("Training-Accuracy={}".format(history.history['acc'][-1])) - print("Training-Loss={}".format(history.history['loss'][-1])) - print("Validation-Accuracy={}".format(history.history['val_acc'][-1])) - print("Validation-Loss={}".format(history.history['val_loss'][-1])) diff --git a/examples/v1alpha3/nas/enas-cnn-cifar10/op_library.py b/examples/v1alpha3/nas/enas-cnn-cifar10/op_library.py deleted file mode 100644 index cd95429d97b..00000000000 --- a/examples/v1alpha3/nas/enas-cnn-cifar10/op_library.py +++ /dev/null @@ -1,141 +0,0 @@ -import numpy as np -from keras import backend as K -from keras.layers import Input, Conv2D, ZeroPadding2D, concatenate, MaxPooling2D, \ - AveragePooling2D, Dense, Activation, BatchNormalization, GlobalAveragePooling2D, \ - SeparableConv2D, DepthwiseConv2D - - -def concat(inputs): - n = len(inputs) - if n == 1: - return inputs[0] - - total_dim = list() - for x in inputs: - total_dim.append(K.int_shape(x)) - total_dim = np.asarray(total_dim) - max_dim = max(total_dim[:, 1]) - - padded_input = [0 for _ in range(n)] - - for i in range(n): - if total_dim[i][1] < max_dim: - diff = max_dim - total_dim[i][1] - half_diff = int(diff / 2) - if diff % 2 == 0: - padded_input[i] = ZeroPadding2D(padding=(half_diff, half_diff))(inputs[i]) - else: - padded_input[i] = ZeroPadding2D(padding=((half_diff, half_diff + 1), - (half_diff, half_diff + 1)))(inputs[i]) - else: - padded_input[i] = inputs[i] - - result = concatenate(inputs=padded_input, axis=-1) - return result - - -def conv(x, config): - parameters = { - "num_filter": 64, - "filter_size": 3, - "stride": 1, - } - for k in parameters.keys(): - if k in config: - parameters[k] = int(config[k]) - - activated = Activation('relu')(x) - - conved = Conv2D( - filters=parameters['num_filter'], - kernel_size=parameters['filter_size'], - strides=parameters['stride'], - padding='same')(activated) - - result = BatchNormalization()(conved) - - return result - - -def sp_conv(x, config): - parameters = { - "num_filter": 64, - "filter_size": 3, - "stride": 1, - "depth_multiplier": 1, - } - - for k in parameters.keys(): - if k in config: - parameters[k] = int(config[k]) - - activated = Activation('relu')(x) - - conved = SeparableConv2D( - filters=parameters['num_filter'], - kernel_size=parameters['filter_size'], - strides=parameters['stride'], - depth_multiplier=parameters['depth_multiplier'], - padding='same')(activated) - - result = BatchNormalization()(conved) - - return result - -def dw_conv(x, config): - parameters = { - "filter_size": 3, - "stride": 1, - "depth_multiplier": 1, - } - for k in parameters.keys(): - if k in config: - parameters[k] = int(config[k]) - - activated = Activation('relu')(x) - - conved = DepthwiseConv2D( - kernel_size=parameters['filter_size'], - strides=parameters['stride'], - depth_multiplier=parameters['depth_multiplier'], - padding='same')(activated) - - result = BatchNormalization()(conved) - - return result - - -def reduction(x, config): - # handle the exteme case where the input has the dimension 1 by 1 and is not reductible - # we will just change the reduction layer to identity layer - # such situation is very likely to appear though - dim = K.int_shape(x) - if dim[1] == 1 or dim[2] == 1: - print("WARNING: One or more dimensions of the input of the reduction layer is 1. It cannot be further reduced. A identity layer will be used instead.") - return x - - parameters = { - 'reduction_type': "max_pooling", - 'pool_size': 2, - 'stride': None, - } - - if 'reduction_type' in config: - parameters['reduction_type'] = config['reduction_type'] - if 'pool_size' in config: - parameters['pool_size'] = int(config['pool_size']) - if 'stride' in config: - parameters['stride'] = int(config['stride']) - - if parameters['reduction_type'] == 'max_pooling': - result = MaxPooling2D( - pool_size=parameters['pool_size'], - strides=parameters['stride'] - )(x) - elif parameters['reduction_type'] == 'avg_pooling': - result = AveragePooling2D( - pool_size=parameters['pool_size'], - strides=parameters['stride'] - )(x) - - return result diff --git a/examples/v1alpha3/nas/enas-cnn-cifar10/requirements-cpu.txt b/examples/v1alpha3/nas/enas-cnn-cifar10/requirements-cpu.txt deleted file mode 100644 index 88baeffd80d..00000000000 --- a/examples/v1alpha3/nas/enas-cnn-cifar10/requirements-cpu.txt +++ /dev/null @@ -1,2 +0,0 @@ -tensorflow==1.15.4 -keras==2.2.4 diff --git a/examples/v1alpha3/nas/enas-cnn-cifar10/requirements-gpu.txt b/examples/v1alpha3/nas/enas-cnn-cifar10/requirements-gpu.txt deleted file mode 100644 index 48e7f6865e4..00000000000 --- a/examples/v1alpha3/nas/enas-cnn-cifar10/requirements-gpu.txt +++ /dev/null @@ -1,2 +0,0 @@ -tensorflow-gpu==1.15.4 -keras==2.2.4 diff --git a/examples/v1alpha3/nas/enas-example-cpu.yaml b/examples/v1alpha3/nas/enas-example-cpu.yaml deleted file mode 100644 index 4d58ecbe615..00000000000 --- a/examples/v1alpha3/nas/enas-example-cpu.yaml +++ /dev/null @@ -1,149 +0,0 @@ -# This CPU example aims to show all the possible operations -# is not very likely to get good result due to the extensive search space - -# In practice, setting up a limited search space with more common operations is more likely to get better performance. -# For example, Efficient Neural Architecture Search via Parameter Sharing (https://arxiv.org/abs/1802.03268) -# uses only 6 operations, 3x3/5x5 convolution, 3x3/5x5 separable_convolution and 3x3 max_pooling/avg_pooling. - -# It uses only 1 layer of CNN and 1 train epoch to show CPU support and it has very bad results. -# In practice, if you increase number of layers, training process on CPU will take more time. - -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - name: enas-example-cpu -spec: - parallelTrialCount: 2 - maxTrialCount: 3 - maxFailedTrialCount: 2 - objective: - type: maximize - goal: 0.99 - objectiveMetricName: Validation-Accuracy - algorithm: - algorithmName: enas - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/enas-cnn-cifar10-cpu - command: - - "python3" - - "-u" - - "RunTrial.py" - {{- with .HyperParameters}} - {{- range .}} - - "--{{.Name}}=\"{{.Value}}\"" - {{- end}} - {{- end}} - - "--num_epochs=1" - restartPolicy: Never - nasConfig: - graphConfig: - numLayers: 1 - inputSizes: - - 32 - - 32 - - 3 - outputSizes: - - 10 - operations: - - operationType: convolution - parameters: - - name: filter_size - parameterType: categorical - feasibleSpace: - list: - - "3" - - "5" - - "7" - - name: num_filter - parameterType: categorical - feasibleSpace: - list: - - "32" - - "48" - - "64" - - "96" - - "128" - - name: stride - parameterType: categorical - feasibleSpace: - list: - - "1" - - "2" - - operationType: separable_convolution - parameters: - - name: filter_size - parameterType: categorical - feasibleSpace: - list: - - "3" - - "5" - - "7" - - name: num_filter - parameterType: categorical - feasibleSpace: - list: - - "32" - - "48" - - "64" - - "96" - - "128" - - name: stride - parameterType: categorical - feasibleSpace: - list: - - "1" - - "2" - - name: depth_multiplier - parameterType: categorical - feasibleSpace: - list: - - "1" - - "2" - - operationType: depthwise_convolution - parameters: - - name: filter_size - parameterType: categorical - feasibleSpace: - list: - - "3" - - "5" - - "7" - - name: stride - parameterType: categorical - feasibleSpace: - list: - - "1" - - "2" - - name: depth_multiplier - parameterType: categorical - feasibleSpace: - list: - - "1" - - "2" - - operationType: reduction - parameters: - - name: reduction_type - parameterType: categorical - feasibleSpace: - list: - - max_pooling - - avg_pooling - - name: pool_size - parameterType: int - feasibleSpace: - min: "2" - max: "3" - step: "1" diff --git a/examples/v1alpha3/nas/enas-example-gpu.yaml b/examples/v1alpha3/nas/enas-example-gpu.yaml deleted file mode 100644 index f775cc6cf3e..00000000000 --- a/examples/v1alpha3/nas/enas-example-gpu.yaml +++ /dev/null @@ -1,148 +0,0 @@ -# This GPU example aims to show all the possible operations -# is not very likely to get good result due to the extensive search space - -# In practice, setting up a limited search space with more common operations is more likely to get better performance. -# For example, Efficient Neural Architecture Search via Parameter Sharing (https://arxiv.org/abs/1802.03268) -# uses only 6 operations, 3x3/5x5 convolution, 3x3/5x5 separable_convolution and 3x3 max_pooling/avg_pooling - -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - name: enas-example-gpu -spec: - parallelTrialCount: 3 - maxTrialCount: 12 - maxFailedTrialCount: 3 - objective: - type: maximize - goal: 0.99 - objectiveMetricName: Validation-Accuracy - algorithm: - algorithmName: enas - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/enas-cnn-cifar10-gpu - command: - - "python3" - - "-u" - - "RunTrial.py" - {{- with .HyperParameters}} - {{- range .}} - - "--{{.Name}}=\"{{.Value}}\"" - {{- end}} - {{- end}} - resources: - limits: - nvidia.com/gpu: 1 - restartPolicy: Never - nasConfig: - graphConfig: - numLayers: 8 - inputSizes: - - 32 - - 32 - - 3 - outputSizes: - - 10 - operations: - - operationType: convolution - parameters: - - name: filter_size - parameterType: categorical - feasibleSpace: - list: - - "3" - - "5" - - "7" - - name: num_filter - parameterType: categorical - feasibleSpace: - list: - - "32" - - "48" - - "64" - - "96" - - "128" - - name: stride - parameterType: categorical - feasibleSpace: - list: - - "1" - - "2" - - operationType: separable_convolution - parameters: - - name: filter_size - parameterType: categorical - feasibleSpace: - list: - - "3" - - "5" - - "7" - - name: num_filter - parameterType: categorical - feasibleSpace: - list: - - "32" - - "48" - - "64" - - "96" - - "128" - - name: stride - parameterType: categorical - feasibleSpace: - list: - - "1" - - "2" - - name: depth_multiplier - parameterType: categorical - feasibleSpace: - list: - - "1" - - "2" - - operationType: depthwise_convolution - parameters: - - name: filter_size - parameterType: categorical - feasibleSpace: - list: - - "3" - - "5" - - "7" - - name: stride - parameterType: categorical - feasibleSpace: - list: - - "1" - - "2" - - name: depth_multiplier - parameterType: categorical - feasibleSpace: - list: - - "1" - - "2" - - operationType: reduction - parameters: - - name: reduction_type - parameterType: categorical - feasibleSpace: - list: - - max_pooling - - avg_pooling - - name: pool_size - parameterType: int - feasibleSpace: - min: "2" - max: "3" - step: "1" diff --git a/examples/v1alpha3/never-resume-example.yaml b/examples/v1alpha3/never-resume-example.yaml deleted file mode 100644 index 2e4d83329e1..00000000000 --- a/examples/v1alpha3/never-resume-example.yaml +++ /dev/null @@ -1,62 +0,0 @@ -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - labels: - controller-tools.k8s.io: "1.0" - name: never-resume-example -spec: - objective: - type: maximize - goal: 0.99 - objectiveMetricName: Validation-accuracy - additionalMetricNames: - - Train-accuracy - algorithm: - algorithmName: random - parallelTrialCount: 3 - maxTrialCount: 12 - maxFailedTrialCount: 3 - resumePolicy: Never - parameters: - - name: --lr - parameterType: double - feasibleSpace: - min: "0.01" - max: "0.03" - - name: --num-layers - parameterType: int - feasibleSpace: - min: "2" - max: "5" - - name: --optimizer - parameterType: categorical - feasibleSpace: - list: - - sgd - - adam - - ftrl - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/mxnet-mnist - command: - - "python3" - - "/opt/mxnet-mnist/mnist.py" - - "--batch-size=64" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - restartPolicy: Never diff --git a/examples/v1alpha3/pytorchjob-example.yaml b/examples/v1alpha3/pytorchjob-example.yaml deleted file mode 100644 index 0f107ed3d42..00000000000 --- a/examples/v1alpha3/pytorchjob-example.yaml +++ /dev/null @@ -1,70 +0,0 @@ -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - name: pytorchjob-example -spec: - parallelTrialCount: 3 - maxTrialCount: 12 - maxFailedTrialCount: 3 - objective: - type: maximize - goal: 0.99 - objectiveMetricName: accuracy - algorithm: - algorithmName: random - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: "kubeflow.org/v1" - kind: PyTorchJob - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - pytorchReplicaSpecs: - Master: - replicas: 1 - restartPolicy: OnFailure - template: - spec: - containers: - - name: pytorch - image: gcr.io/kubeflow-ci/pytorch-dist-mnist-test:v1.0 - imagePullPolicy: Always - command: - - "python" - - "/var/mnist.py" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - Worker: - replicas: 2 - restartPolicy: OnFailure - template: - spec: - containers: - - name: pytorch - image: gcr.io/kubeflow-ci/pytorch-dist-mnist-test:v1.0 - imagePullPolicy: Always - command: - - "python" - - "/var/mnist.py" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - parameters: - - name: --lr - parameterType: double - feasibleSpace: - min: "0.01" - max: "0.05" - - name: --momentum - parameterType: double - feasibleSpace: - min: "0.5" - max: "0.9" diff --git a/examples/v1alpha3/random-example.yaml b/examples/v1alpha3/random-example.yaml deleted file mode 100644 index 9742e2b2706..00000000000 --- a/examples/v1alpha3/random-example.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - labels: - controller-tools.k8s.io: "1.0" - name: random-example -spec: - objective: - type: maximize - goal: 0.99 - objectiveMetricName: Validation-accuracy - additionalMetricNames: - - Train-accuracy - algorithm: - algorithmName: random - parallelTrialCount: 3 - maxTrialCount: 12 - maxFailedTrialCount: 3 - parameters: - - name: --lr - parameterType: double - feasibleSpace: - min: "0.01" - max: "0.03" - - name: --num-layers - parameterType: int - feasibleSpace: - min: "2" - max: "5" - - name: --optimizer - parameterType: categorical - feasibleSpace: - list: - - sgd - - adam - - ftrl - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/mxnet-mnist - command: - - "python3" - - "/opt/mxnet-mnist/mnist.py" - - "--batch-size=64" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - restartPolicy: Never diff --git a/examples/v1alpha3/tfjob-example.yaml b/examples/v1alpha3/tfjob-example.yaml deleted file mode 100644 index e9485e07c89..00000000000 --- a/examples/v1alpha3/tfjob-example.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - name: tfjob-example -spec: - parallelTrialCount: 3 - maxTrialCount: 12 - maxFailedTrialCount: 3 - objective: - type: maximize - goal: 0.99 - objectiveMetricName: accuracy_1 - algorithm: - algorithmName: random - metricsCollectorSpec: - source: - fileSystemPath: - path: /train - kind: Directory - collector: - kind: TensorFlowEvent - parameters: - - name: --learning_rate - parameterType: double - feasibleSpace: - min: "0.01" - max: "0.05" - - name: --batch_size - parameterType: int - feasibleSpace: - min: "100" - max: "200" - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: "kubeflow.org/v1" - kind: TFJob - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - tfReplicaSpecs: - Worker: - replicas: 1 - restartPolicy: OnFailure - template: - spec: - containers: - - name: tensorflow - image: gcr.io/kubeflow-ci/tf-mnist-with-summaries:1.0 - imagePullPolicy: Always - command: - - "python" - - "/var/tf_mnist/mnist_with_summaries.py" - - "--log_dir=/train/metrics" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} diff --git a/examples/v1alpha3/tpe-example.yaml b/examples/v1alpha3/tpe-example.yaml deleted file mode 100644 index 524dfdb2d17..00000000000 --- a/examples/v1alpha3/tpe-example.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: "kubeflow.org/v1alpha3" -kind: Experiment -metadata: - namespace: kubeflow - labels: - controller-tools.k8s.io: "1.0" - name: tpe-example -spec: - objective: - type: maximize - goal: 0.99 - objectiveMetricName: Validation-accuracy - additionalMetricNames: - - Train-accuracy - algorithm: - algorithmName: tpe - parallelTrialCount: 3 - maxTrialCount: 12 - maxFailedTrialCount: 3 - parameters: - - name: --lr - parameterType: double - feasibleSpace: - min: "0.01" - max: "0.03" - - name: --num-layers - parameterType: int - feasibleSpace: - min: "2" - max: "5" - - name: --optimizer - parameterType: categorical - feasibleSpace: - list: - - sgd - - adam - - ftrl - trialTemplate: - goTemplate: - rawTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/mxnet-mnist - command: - - "python3" - - "/opt/mxnet-mnist/mnist.py" - - "--batch-size=64" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - restartPolicy: Never diff --git a/hack/gen-python-sdk/gen-sdk.sh b/hack/gen-python-sdk/gen-sdk.sh index 4e9a8fffb91..5f623fe6ec2 100755 --- a/hack/gen-python-sdk/gen-sdk.sh +++ b/hack/gen-python-sdk/gen-sdk.sh @@ -25,7 +25,7 @@ SWAGGER_CODEGEN_FILE="pkg/apis/KATIB_VERSION/swagger.json" TMP_CODEGEN_PATH="sdk/tmp/KATIB_VERSION" SDK_OUTPUT_PATH="sdk/python" POST_GEN_PYTHON_HANDLER="hack/gen-python-sdk/post_gen.py" -KATIB_VERSIONS=(v1alpha3 v1beta1) +KATIB_VERSIONS=(v1beta1) echo "Downloading the swagger-codegen JAR package ..." wget -O ${SWAGGER_CODEGEN_JAR} ${SWAGGER_JAR_URL} diff --git a/hack/gen-python-sdk/post_gen.py b/hack/gen-python-sdk/post_gen.py index cba79de936e..6a4b9186209 100644 --- a/hack/gen-python-sdk/post_gen.py +++ b/hack/gen-python-sdk/post_gen.py @@ -16,8 +16,7 @@ def _rewrite_helper(input_file, output_file, rewrite_rules): lines.append(line) # Add Katib client to init file - if (output_file == "sdk/python/v1beta1/kubeflow/katib/__init__.py" or - output_file == "sdk/python/v1alpha3/kubeflow/katib/__init__.py"): + if (output_file == "sdk/python/v1beta1/kubeflow/katib/__init__.py"): lines.append("\n") lines.append("# Import Katib API client") lines.append("\n") @@ -28,7 +27,7 @@ def _rewrite_helper(input_file, output_file, rewrite_rules): f.writelines(lines) -def update_python_sdk(src, dest, versions=('v1alpha3', 'v1beta1')): +def update_python_sdk(src, dest, versions=('v1beta1')): # tiny transformers to refine generated codes rewrite_rules = [ lambda l: l.replace('import katib', 'import kubeflow.katib'), diff --git a/hack/swagger/main.go b/hack/swagger/main.go index 094bf6f587c..3fe2326ee87 100644 --- a/hack/swagger/main.go +++ b/hack/swagger/main.go @@ -20,7 +20,6 @@ import ( "strings" "github.com/go-openapi/spec" - "github.com/kubeflow/katib/pkg/apis/v1alpha3" "github.com/kubeflow/katib/pkg/apis/v1beta1" "k8s.io/klog" "k8s.io/kube-openapi/pkg/common" @@ -41,9 +40,7 @@ func main() { katibVersion := os.Args[2] oAPIDefs := make(map[string]common.OpenAPIDefinition) - if katibVersion == "v1alpha3" { - oAPIDefs = v1alpha3.GetOpenAPIDefinitions(refCallback) - } else if katibVersion == "v1beta1" { + if katibVersion == "v1beta1" { oAPIDefs = v1beta1.GetOpenAPIDefinitions(refCallback) } else { klog.Fatalf("Katib version %v is not supported", katibVersion) diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index f0ebe30d7dc..e86bbf33cb4 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -22,11 +22,11 @@ if [[ -z "${GOPATH:-}" ]]; then export GOPATH=$(go env GOPATH) fi -VERSION_LIST=(v1alpha3 v1beta1) +VERSION_LIST=(v1beta1) PROJECT_ROOT=${GOPATH}/src/github.com/kubeflow/katib modules=(experiments suggestions trials common) -versions=(v1alpha3 v1beta1) +versions=(v1beta1) versionStr=$(printf ",%s" "${versions[@]}") GROUP_VERSIONS=$(printf "%s:${versionStr:1} " "${modules[@]}") diff --git a/hack/update-openapigen.sh b/hack/update-openapigen.sh index bd9bbfdd228..2c72747f9f6 100755 --- a/hack/update-openapigen.sh +++ b/hack/update-openapigen.sh @@ -19,24 +19,24 @@ set -o nounset set -o pipefail if [[ -z "${GOPATH:-}" ]]; then - export GOPATH=$(go env GOPATH) + export GOPATH=$(go env GOPATH) fi PROJECT_ROOT=${GOPATH}/src/github.com/kubeflow/katib CODEGEN_PKG=${PROJECT_ROOT}/vendor/k8s.io/code-generator -VERSION_LIST=(v1alpha3 v1beta1) +VERSION_LIST=(v1beta1) SWAGGER_VERSION="0.1" for VERSION in ${VERSION_LIST[@]}; do - SWAGGER_CODEGEN_FILE=${PROJECT_ROOT}/pkg/apis/${VERSION}/swagger.json + SWAGGER_CODEGEN_FILE=${PROJECT_ROOT}/pkg/apis/${VERSION}/swagger.json - echo "Generating OpenAPI specification for ${VERSION} ..." - go run ${CODEGEN_PKG}/cmd/openapi-gen/main.go \ - --go-header-file ${PROJECT_ROOT}/hack/boilerplate.go.txt \ - --input-dirs github.com/kubeflow/katib/pkg/apis/controller/common/${VERSION},github.com/kubeflow/katib/pkg/apis/controller/experiments/${VERSION},github.com/kubeflow/katib/pkg/apis/controller/suggestions/${VERSION},github.com/kubeflow/katib/pkg/apis/controller/trials/${VERSION} \ - --output-package github.com/kubeflow/katib/pkg/apis/${VERSION} \ - $@ + echo "Generating OpenAPI specification for ${VERSION} ..." + go run ${CODEGEN_PKG}/cmd/openapi-gen/main.go \ + --go-header-file ${PROJECT_ROOT}/hack/boilerplate.go.txt \ + --input-dirs github.com/kubeflow/katib/pkg/apis/controller/common/${VERSION},github.com/kubeflow/katib/pkg/apis/controller/experiments/${VERSION},github.com/kubeflow/katib/pkg/apis/controller/suggestions/${VERSION},github.com/kubeflow/katib/pkg/apis/controller/trials/${VERSION} \ + --output-package github.com/kubeflow/katib/pkg/apis/${VERSION} \ + $@ - echo "Generating swagger file for ${VERSION} ..." - go run ${PROJECT_ROOT}/hack/swagger/main.go ${VERSION}-${SWAGGER_VERSION} ${VERSION} > ${SWAGGER_CODEGEN_FILE} + echo "Generating swagger file for ${VERSION} ..." + go run ${PROJECT_ROOT}/hack/swagger/main.go ${VERSION}-${SWAGGER_VERSION} ${VERSION} >${SWAGGER_CODEGEN_FILE} done diff --git a/manifests/v1alpha3/0-namespace.yaml b/manifests/v1alpha3/0-namespace.yaml deleted file mode 100644 index d5b7bf410a2..00000000000 --- a/manifests/v1alpha3/0-namespace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: kubeflow - labels: - katib-metricscollector-injection: enabled diff --git a/manifests/v1alpha3/db-manager/deployment.yaml b/manifests/v1alpha3/db-manager/deployment.yaml deleted file mode 100644 index aa67af49443..00000000000 --- a/manifests/v1alpha3/db-manager/deployment.yaml +++ /dev/null @@ -1,48 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: katib-db-manager - namespace: kubeflow - labels: - app: katib - component: db-manager -spec: - replicas: 1 - selector: - matchLabels: - app: katib - component: db-manager - template: - metadata: - name: katib-db-manager - labels: - app: katib - component: db-manager - spec: - containers: - - name: katib-db-manager - image: gcr.io/kubeflow-images-public/katib/v1alpha3/katib-db-manager - imagePullPolicy: IfNotPresent - env: - - name : DB_NAME - value: "mysql" - - name: DB_PASSWORD - valueFrom: - secretKeyRef: - name: katib-mysql-secrets - key: MYSQL_ROOT_PASSWORD - command: - - './katib-db-manager' - ports: - - name: api - containerPort: 6789 - readinessProbe: - exec: - command: ["/bin/grpc_health_probe", "-addr=:6789"] - initialDelaySeconds: 5 - livenessProbe: - exec: - command: ["/bin/grpc_health_probe", "-addr=:6789"] - initialDelaySeconds: 10 - periodSeconds: 60 - failureThreshold: 5 diff --git a/manifests/v1alpha3/db-manager/service.yaml b/manifests/v1alpha3/db-manager/service.yaml deleted file mode 100644 index ca9e6ef78c3..00000000000 --- a/manifests/v1alpha3/db-manager/service.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: katib-db-manager - namespace: kubeflow - labels: - app: katib - component: db-manager -spec: - type: ClusterIP - ports: - - port: 6789 - protocol: TCP - name: api - selector: - app: katib - component: db-manager diff --git a/manifests/v1alpha3/katib-controller/crd-experiment.yaml b/manifests/v1alpha3/katib-controller/crd-experiment.yaml deleted file mode 100644 index a6d5fb1e1ec..00000000000 --- a/manifests/v1alpha3/katib-controller/crd-experiment.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: experiments.kubeflow.org -spec: - additionalPrinterColumns: - - JSONPath: .status.conditions[-1:].type - name: Status - type: string - - JSONPath: .metadata.creationTimestamp - name: Age - type: date - group: kubeflow.org - version: v1alpha3 - scope: Namespaced - subresources: - status: {} - names: - kind: Experiment - singular: experiment - plural: experiments - categories: - - all - - kubeflow - - katib diff --git a/manifests/v1alpha3/katib-controller/crd-suggestion.yaml b/manifests/v1alpha3/katib-controller/crd-suggestion.yaml deleted file mode 100644 index 0c725ab3b5e..00000000000 --- a/manifests/v1alpha3/katib-controller/crd-suggestion.yaml +++ /dev/null @@ -1,34 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: suggestions.kubeflow.org -spec: - additionalPrinterColumns: - - JSONPath: .status.conditions[-1:].type - name: Type - type: string - - JSONPath: .status.conditions[-1:].status - name: Status - type: string - - JSONPath: .spec.requests - name: Requested - type: string - - JSONPath: .status.suggestionCount - name: Assigned - type: string - - JSONPath: .metadata.creationTimestamp - name: Age - type: date - group: kubeflow.org - version: v1alpha3 - scope: Namespaced - subresources: - status: {} - names: - kind: Suggestion - singular: suggestion - plural: suggestions - categories: - - all - - kubeflow - - katib diff --git a/manifests/v1alpha3/katib-controller/crd-trial.yaml b/manifests/v1alpha3/katib-controller/crd-trial.yaml deleted file mode 100644 index f7cea34064f..00000000000 --- a/manifests/v1alpha3/katib-controller/crd-trial.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: trials.kubeflow.org -spec: - additionalPrinterColumns: - - JSONPath: .status.conditions[-1:].type - name: Type - type: string - - JSONPath: .status.conditions[-1:].status - name: Status - type: string - - JSONPath: .metadata.creationTimestamp - name: Age - type: date - group: kubeflow.org - version: v1alpha3 - scope: Namespaced - subresources: - status: {} - names: - kind: Trial - singular: trial - plural: trials - categories: - - all - - kubeflow - - katib diff --git a/manifests/v1alpha3/katib-controller/katib-config.yaml b/manifests/v1alpha3/katib-controller/katib-config.yaml deleted file mode 100644 index e93dc73780f..00000000000 --- a/manifests/v1alpha3/katib-controller/katib-config.yaml +++ /dev/null @@ -1,56 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: katib-config - namespace: kubeflow -data: - metrics-collector-sidecar: |- - { - "StdOut": { - "image": "gcr.io/kubeflow-images-public/katib/v1alpha3/file-metrics-collector" - }, - "File": { - "image": "gcr.io/kubeflow-images-public/katib/v1alpha3/file-metrics-collector" - }, - "TensorFlowEvent": { - "image": "gcr.io/kubeflow-images-public/katib/v1alpha3/tfevent-metrics-collector", - "resources": { - "limits": { - "memory": "1Gi" - } - } - } - } - suggestion: |- - { - "random": { - "image": "gcr.io/kubeflow-images-public/katib/v1alpha3/suggestion-hyperopt" - }, - "grid": { - "image": "gcr.io/kubeflow-images-public/katib/v1alpha3/suggestion-chocolate" - }, - "hyperband": { - "image": "gcr.io/kubeflow-images-public/katib/v1alpha3/suggestion-hyperband" - }, - "bayesianoptimization": { - "image": "gcr.io/kubeflow-images-public/katib/v1alpha3/suggestion-skopt" - }, - "tpe": { - "image": "gcr.io/kubeflow-images-public/katib/v1alpha3/suggestion-hyperopt" - }, - "enas": { - "image": "gcr.io/kubeflow-images-public/katib/v1alpha3/suggestion-enas", - "imagePullPolicy": "Always", - "resources": { - "limits": { - "memory": "200Mi" - } - } - }, - "cmaes": { - "image": "gcr.io/kubeflow-images-public/katib/v1alpha3/suggestion-goptuna" - }, - "darts": { - "image": "gcr.io/kubeflow-images-public/katib/v1alpha3/suggestion-darts" - } - } diff --git a/manifests/v1alpha3/katib-controller/katib-controller.yaml b/manifests/v1alpha3/katib-controller/katib-controller.yaml deleted file mode 100644 index b84107bc268..00000000000 --- a/manifests/v1alpha3/katib-controller/katib-controller.yaml +++ /dev/null @@ -1,48 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: katib-controller - namespace: kubeflow - labels: - app: katib-controller -spec: - replicas: 1 - selector: - matchLabels: - app: katib-controller - template: - metadata: - labels: - app: katib-controller - annotations: - prometheus.io/scrape: 'true' - spec: - serviceAccountName: katib-controller - containers: - - name: katib-controller - image: gcr.io/kubeflow-images-public/katib/v1alpha3/katib-controller - imagePullPolicy: IfNotPresent - command: ["./katib-controller"] - args: - - '--webhook-port=8443' - ports: - - containerPort: 8443 - name: webhook - protocol: TCP - - containerPort: 8080 - name: metrics - protocol: TCP - env: - - name: KATIB_CORE_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - volumeMounts: - - mountPath: /tmp/cert - name: cert - readOnly: true - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: katib-controller diff --git a/manifests/v1alpha3/katib-controller/rbac.yaml b/manifests/v1alpha3/katib-controller/rbac.yaml deleted file mode 100644 index 1299330e6c5..00000000000 --- a/manifests/v1alpha3/katib-controller/rbac.yaml +++ /dev/null @@ -1,91 +0,0 @@ -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: katib-controller -rules: -- apiGroups: - - "" - resources: - - configmaps - - serviceaccounts - - services - - secrets - - events - - namespaces - verbs: - - "*" -- apiGroups: - - "" - resources: - - pods - - pods/log - - pods/status - verbs: - - "*" -- apiGroups: - - apps - resources: - - deployments - verbs: - - "*" -- apiGroups: - - batch - resources: - - jobs - - cronjobs - verbs: - - "*" -- apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - create - - get -- apiGroups: - - admissionregistration.k8s.io - resources: - - validatingwebhookconfigurations - - mutatingwebhookconfigurations - verbs: - - '*' -- apiGroups: - - kubeflow.org - resources: - - experiments - - experiments/status - - experiments/finalizers - - trials - - trials/status - - trials/finalizers - - suggestions - - suggestions/status - - suggestions/finalizers - verbs: - - "*" -- apiGroups: - - kubeflow.org - resources: - - tfjobs - - pytorchjobs - verbs: - - "*" ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: katib-controller - namespace: kubeflow ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: katib-controller -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: katib-controller -subjects: -- kind: ServiceAccount - name: katib-controller - namespace: kubeflow diff --git a/manifests/v1alpha3/katib-controller/secret.yaml b/manifests/v1alpha3/katib-controller/secret.yaml deleted file mode 100644 index 8c9b009caf9..00000000000 --- a/manifests/v1alpha3/katib-controller/secret.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: katib-controller - namespace: kubeflow diff --git a/manifests/v1alpha3/katib-controller/service.yaml b/manifests/v1alpha3/katib-controller/service.yaml deleted file mode 100644 index 4103ef84a52..00000000000 --- a/manifests/v1alpha3/katib-controller/service.yaml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: katib-controller - namespace: kubeflow - annotations: - prometheus.io/port: "8080" - prometheus.io/scheme: http - prometheus.io/scrape: "true" -spec: - ports: - - port: 443 - protocol: TCP - targetPort: 8443 - name: webhook - - name: metrics - port: 8080 - targetPort: 8080 - selector: - app: katib-controller diff --git a/manifests/v1alpha3/katib-controller/trialTemplateConfigmap.yaml b/manifests/v1alpha3/katib-controller/trialTemplateConfigmap.yaml deleted file mode 100644 index 2b9e8e56727..00000000000 --- a/manifests/v1alpha3/katib-controller/trialTemplateConfigmap.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: trial-template - namespace: kubeflow -data: - defaultTrialTemplate.yaml : |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/mxnet-mnist - command: - - "python3" - - "/opt/mxnet-mnist/mnist.py" - - "--batch-size=64" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - restartPolicy: Never diff --git a/manifests/v1alpha3/katib-controller/trialTemplateConfigmapLabeled.yaml b/manifests/v1alpha3/katib-controller/trialTemplateConfigmapLabeled.yaml deleted file mode 100644 index 211f77bd17d..00000000000 --- a/manifests/v1alpha3/katib-controller/trialTemplateConfigmapLabeled.yaml +++ /dev/null @@ -1,95 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: trial-template-labeled - namespace: kubeflow - labels: - app: katib-trial-templates -data: - defaultTrialTemplate.yaml: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/mxnet-mnist - command: - - "python3" - - "/opt/mxnet-mnist/mnist.py" - - "--batch-size=64" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - restartPolicy: Never - enasCPUTemplate: |- - apiVersion: batch/v1 - kind: Job - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - template: - spec: - containers: - - name: {{.Trial}} - image: docker.io/kubeflowkatib/enas-cnn-cifar10-cpu - command: - - "python3.5" - - "-u" - - "RunTrial.py" - {{- with .HyperParameters}} - {{- range .}} - - "--{{.Name}}=\"{{.Value}}\"" - {{- end}} - {{- end}} - - "--num_epochs=1" - restartPolicy: Never - pytorchJobTemplate: |- - apiVersion: "kubeflow.org/v1" - kind: PyTorchJob - metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} - spec: - pytorchReplicaSpecs: - Master: - replicas: 1 - restartPolicy: OnFailure - template: - spec: - containers: - - name: pytorch - image: gcr.io/kubeflow-ci/pytorch-dist-mnist-test:v1.0 - imagePullPolicy: Always - command: - - "python" - - "/var/mnist.py" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - Worker: - replicas: 2 - restartPolicy: OnFailure - template: - spec: - containers: - - name: pytorch - image: gcr.io/kubeflow-ci/pytorch-dist-mnist-test:v1.0 - imagePullPolicy: Always - command: - - "python" - - "/var/mnist.py" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} diff --git a/manifests/v1alpha3/mysql-db/deployment.yaml b/manifests/v1alpha3/mysql-db/deployment.yaml deleted file mode 100644 index 8f40e7051ee..00000000000 --- a/manifests/v1alpha3/mysql-db/deployment.yaml +++ /dev/null @@ -1,65 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: katib-mysql - namespace: kubeflow - labels: - app: katib - component: mysql -spec: - replicas: 1 - selector: - matchLabels: - app: katib - component: mysql - template: - metadata: - name: katib-mysql - labels: - app: katib - component: mysql - spec: - containers: - - name: katib-mysql - image: mysql:8 - args: - - --datadir - - /var/lib/mysql/datadir - env: - - name: MYSQL_ROOT_PASSWORD - valueFrom: - secretKeyRef: - name: katib-mysql-secrets - key: MYSQL_ROOT_PASSWORD - - name: MYSQL_ALLOW_EMPTY_PASSWORD - value: "true" - - name: MYSQL_DATABASE - value: "katib" - ports: - - name: dbapi - containerPort: 3306 - readinessProbe: - exec: - command: - - "/bin/bash" - - "-c" - - "mysql -D ${MYSQL_DATABASE} -u root -p${MYSQL_ROOT_PASSWORD} -e 'SELECT 1'" - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 1 - livenessProbe: - exec: - command: - - "/bin/bash" - - "-c" - - "mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}" - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 5 - volumeMounts: - - name: katib-mysql - mountPath: /var/lib/mysql - volumes: - - name: katib-mysql - persistentVolumeClaim: - claimName: katib-mysql diff --git a/manifests/v1alpha3/mysql-db/secret.yaml b/manifests/v1alpha3/mysql-db/secret.yaml deleted file mode 100644 index b6f36d50a10..00000000000 --- a/manifests/v1alpha3/mysql-db/secret.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: v1 -kind: Secret -type: Opaque -metadata: - name: katib-mysql-secrets - namespace: kubeflow -data: - MYSQL_ROOT_PASSWORD: dGVzdA== # "test" diff --git a/manifests/v1alpha3/mysql-db/service.yaml b/manifests/v1alpha3/mysql-db/service.yaml deleted file mode 100644 index 85827ca6c50..00000000000 --- a/manifests/v1alpha3/mysql-db/service.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: katib-mysql - namespace: kubeflow - labels: - app: katib - component: mysql -spec: - type: ClusterIP - ports: - - port: 3306 - protocol: TCP - name: dbapi - selector: - app: katib - component: mysql diff --git a/manifests/v1alpha3/pv/pv.yaml b/manifests/v1alpha3/pv/pv.yaml deleted file mode 100644 index a3afad40f31..00000000000 --- a/manifests/v1alpha3/pv/pv.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: PersistentVolume -metadata: - name: katib-mysql - labels: - type: local - app: katib -spec: - storageClassName: katib - capacity: - storage: 10Gi - accessModes: - - ReadWriteOnce - hostPath: - path: /tmp/katib diff --git a/manifests/v1alpha3/pv/pvc.yaml b/manifests/v1alpha3/pv/pvc.yaml deleted file mode 100644 index c454826f51e..00000000000 --- a/manifests/v1alpha3/pv/pvc.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: katib-mysql - namespace: kubeflow - labels: - app: katib -spec: - storageClassName: katib - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 10Gi diff --git a/manifests/v1alpha3/ui/deployment.yaml b/manifests/v1alpha3/ui/deployment.yaml deleted file mode 100644 index 7b72fa60a13..00000000000 --- a/manifests/v1alpha3/ui/deployment.yaml +++ /dev/null @@ -1,38 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: katib-ui - namespace: kubeflow - labels: - app: katib - component: ui -spec: - replicas: 1 - selector: - matchLabels: - app: katib - component: ui - template: - metadata: - name: katib-ui - labels: - app: katib - component: ui - spec: - containers: - - name: katib-ui - image: gcr.io/kubeflow-images-public/katib/v1alpha3/katib-ui - imagePullPolicy: IfNotPresent - command: - - './katib-ui' - args: - - '--port=8080' - env: - - name: KATIB_CORE_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - ports: - - name: ui - containerPort: 8080 - serviceAccountName: katib-ui diff --git a/manifests/v1alpha3/ui/rbac.yaml b/manifests/v1alpha3/ui/rbac.yaml deleted file mode 100644 index 9c7dc753ba3..00000000000 --- a/manifests/v1alpha3/ui/rbac.yaml +++ /dev/null @@ -1,39 +0,0 @@ -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: katib-ui -rules: -- apiGroups: - - "" - resources: - - configmaps - - namespaces - verbs: - - "*" -- apiGroups: - - kubeflow.org - resources: - - experiments - - trials - - suggestions - verbs: - - "*" ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: katib-ui - namespace: kubeflow ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: katib-ui -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: katib-ui -subjects: -- kind: ServiceAccount - name: katib-ui - namespace: kubeflow diff --git a/manifests/v1alpha3/ui/service.yaml b/manifests/v1alpha3/ui/service.yaml deleted file mode 100644 index 40f1fbfbdc2..00000000000 --- a/manifests/v1alpha3/ui/service.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: katib-ui - namespace: kubeflow - labels: - app: katib - component: ui -spec: - type: ClusterIP - ports: - - port: 80 - protocol: TCP - name: ui - targetPort: 8080 - selector: - app: katib - component: ui diff --git a/pkg/apis/controller/addtoscheme_katib_v1alpha3.go b/pkg/apis/controller/addtoscheme_katib_v1alpha3.go deleted file mode 100644 index cd1209bd8a6..00000000000 --- a/pkg/apis/controller/addtoscheme_katib_v1alpha3.go +++ /dev/null @@ -1,31 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package apis - -import ( - experiments "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - suggestions "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - trials "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" -) - -func init() { - // Register the types with the Scheme so the components can map objects to GroupVersionKinds and back - AddToSchemes = append(AddToSchemes, - experiments.SchemeBuilder.AddToScheme, - trials.SchemeBuilder.AddToScheme, - suggestions.SchemeBuilder.AddToScheme, - ) -} diff --git a/pkg/apis/controller/common/v1alpha3/common_types.go b/pkg/apis/controller/common/v1alpha3/common_types.go deleted file mode 100644 index 51c3dea23c7..00000000000 --- a/pkg/apis/controller/common/v1alpha3/common_types.go +++ /dev/null @@ -1,150 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha3 - -import ( - v1 "k8s.io/api/core/v1" -) - -// +k8s:deepcopy-gen=true -type AlgorithmSpec struct { - AlgorithmName string `json:"algorithmName,omitempty"` - // Key-value pairs representing settings for suggestion algorithms. - AlgorithmSettings []AlgorithmSetting `json:"algorithmSettings,omitempty"` - EarlyStopping *EarlyStoppingSpec `json:"earlyStopping,omitempty"` -} - -type AlgorithmSetting struct { - Name string `json:"name,omitempty"` - Value string `json:"value,omitempty"` -} - -// +k8s:deepcopy-gen=true -type EarlyStoppingSpec struct { - EarlyStoppingAlgorithmName string `json:"earlyStoppingAlgorithmName,omitempty"` - EarlyStoppingSettings []EarlyStoppingSetting `json:"earlyStoppingSettings"` -} - -type EarlyStoppingSetting struct { - Name string `json:"name,omitempty"` - Value string `json:"value,omitempty"` -} - -// +k8s:deepcopy-gen=true -type ObjectiveSpec struct { - Type ObjectiveType `json:"type,omitempty"` - Goal *float64 `json:"goal,omitempty"` - ObjectiveMetricName string `json:"objectiveMetricName,omitempty"` - // This can be empty if we only care about the objective metric. - // Note: If we adopt a push instead of pull mechanism, this can be omitted completely. - AdditionalMetricNames []string `json:"additionalMetricNames,omitempty"` -} - -type ObjectiveType string - -const ( - ObjectiveTypeUnknown ObjectiveType = "" - ObjectiveTypeMinimize ObjectiveType = "minimize" - ObjectiveTypeMaximize ObjectiveType = "maximize" -) - -type ParameterAssignment struct { - Name string `json:"name,omitempty"` - Value string `json:"value,omitempty"` -} - -type Metric struct { - Name string `json:"name,omitempty"` - Value float64 `json:"value,omitempty"` -} - -// +k8s:deepcopy-gen=true -type Observation struct { - // Key-value pairs for metric names and values - Metrics []Metric `json:"metrics"` -} - -// +k8s:deepcopy-gen=true -type MetricsCollectorSpec struct { - Source *SourceSpec `json:"source,omitempty"` - Collector *CollectorSpec `json:"collector,omitempty"` -} - -// +k8s:deepcopy-gen=true -type SourceSpec struct { - // Model-train source code can expose metrics by http, such as HTTP endpoint in - // prometheus metric format - HttpGet *v1.HTTPGetAction `json:"httpGet,omitempty"` - // During training model, metrics may be persisted into local file in source - // code, such as tfEvent use case - FileSystemPath *FileSystemPath `json:"fileSystemPath,omitempty"` - // Default metric output format is {"metric": "", - // "value": , "epoch": , "step": }, but if the output doesn't - // follow default format, please extend it here - Filter *FilterSpec `json:"filter,omitempty"` -} - -// +k8s:deepcopy-gen=true -type FilterSpec struct { - // When the metrics output follows format as this field specified, metricsCollector - // collects it and reports to metrics server, it can be ": " or else - MetricsFormat []string `json:"metricsFormat,omitempty"` -} - -type FileSystemKind string - -const ( - DirectoryKind FileSystemKind = "Directory" - FileKind FileSystemKind = "File" - InvalidKind FileSystemKind = "Invalid" -) - -// +k8s:deepcopy-gen=true -type FileSystemPath struct { - Path string `json:"path,omitempty"` - Kind FileSystemKind `json:"kind,omitempty"` -} - -type CollectorKind string - -const ( - StdOutCollector CollectorKind = "StdOut" - - FileCollector CollectorKind = "File" - DefaultFilePath = "/var/log/katib/metrics.log" - - TfEventCollector CollectorKind = "TensorFlowEvent" - DefaultTensorflowEventDirPath = "/var/log/katib/tfevent/" - - PrometheusMetricCollector CollectorKind = "PrometheusMetric" - DefaultPrometheusPath = "/metrics" - DefaultPrometheusPort = 8080 - - CustomCollector CollectorKind = "Custom" - - // When model training source code persists metrics into persistent layer - // directly, metricsCollector isn't in need, and its kind is "noneCollector" - NoneCollector CollectorKind = "None" - - MetricsVolume = "metrics-volume" -) - -// +k8s:deepcopy-gen=true -type CollectorSpec struct { - Kind CollectorKind `json:"kind"` - // When kind is "customCollector", this field will be used - CustomCollector *v1.Container `json:"customCollector,omitempty"` -} diff --git a/pkg/apis/controller/common/v1alpha3/doc.go b/pkg/apis/controller/common/v1alpha3/doc.go deleted file mode 100644 index a183e275b61..00000000000 --- a/pkg/apis/controller/common/v1alpha3/doc.go +++ /dev/null @@ -1,23 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package v1alpha3 contains API Schema definitions for the common v1alpha3 API group -// +k8s:openapi-gen=true -// +k8s:deepcopy-gen=package,register -// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3 -// +k8s:defaulter-gen=TypeMeta -// +kubebuilder:subresource:status -// +groupName=common.kubeflow.org -package v1alpha3 diff --git a/pkg/apis/controller/common/v1alpha3/register.go b/pkg/apis/controller/common/v1alpha3/register.go deleted file mode 100644 index b3135f69915..00000000000 --- a/pkg/apis/controller/common/v1alpha3/register.go +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package v1alpha3 contains API Schema definitions for the common v1alpha3 API group -// +k8s:openapi-gen=true -// +k8s:deepcopy-gen=package,register -// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3 -// +k8s:defaulter-gen=TypeMeta -// +kubebuilder:subresource:status -// +groupName=common.kubeflow.org -package v1alpha3 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/runtime/scheme" -) - -const ( - Group = "kubeflow.org" - Version = "v1alpha3" -) - -var ( - // SchemeGroupVersion is group version used to register these objects - SchemeGroupVersion = schema.GroupVersion{Group: Group, Version: Version} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion} - AddToScheme = SchemeBuilder.AddToScheme -) - -// Resource is required by pkg/client/listers/... -func Resource(resource string) schema.GroupResource { - return SchemeGroupVersion.WithResource(resource).GroupResource() -} diff --git a/pkg/apis/controller/common/v1alpha3/zz_generated.deepcopy.go b/pkg/apis/controller/common/v1alpha3/zz_generated.deepcopy.go deleted file mode 100644 index 9717d332ce4..00000000000 --- a/pkg/apis/controller/common/v1alpha3/zz_generated.deepcopy.go +++ /dev/null @@ -1,297 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by deepcopy-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1 "k8s.io/api/core/v1" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AlgorithmSetting) DeepCopyInto(out *AlgorithmSetting) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlgorithmSetting. -func (in *AlgorithmSetting) DeepCopy() *AlgorithmSetting { - if in == nil { - return nil - } - out := new(AlgorithmSetting) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AlgorithmSpec) DeepCopyInto(out *AlgorithmSpec) { - *out = *in - if in.AlgorithmSettings != nil { - in, out := &in.AlgorithmSettings, &out.AlgorithmSettings - *out = make([]AlgorithmSetting, len(*in)) - copy(*out, *in) - } - if in.EarlyStopping != nil { - in, out := &in.EarlyStopping, &out.EarlyStopping - *out = new(EarlyStoppingSpec) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlgorithmSpec. -func (in *AlgorithmSpec) DeepCopy() *AlgorithmSpec { - if in == nil { - return nil - } - out := new(AlgorithmSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CollectorSpec) DeepCopyInto(out *CollectorSpec) { - *out = *in - if in.CustomCollector != nil { - in, out := &in.CustomCollector, &out.CustomCollector - *out = new(v1.Container) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CollectorSpec. -func (in *CollectorSpec) DeepCopy() *CollectorSpec { - if in == nil { - return nil - } - out := new(CollectorSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EarlyStoppingSetting) DeepCopyInto(out *EarlyStoppingSetting) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EarlyStoppingSetting. -func (in *EarlyStoppingSetting) DeepCopy() *EarlyStoppingSetting { - if in == nil { - return nil - } - out := new(EarlyStoppingSetting) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EarlyStoppingSpec) DeepCopyInto(out *EarlyStoppingSpec) { - *out = *in - if in.EarlyStoppingSettings != nil { - in, out := &in.EarlyStoppingSettings, &out.EarlyStoppingSettings - *out = make([]EarlyStoppingSetting, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EarlyStoppingSpec. -func (in *EarlyStoppingSpec) DeepCopy() *EarlyStoppingSpec { - if in == nil { - return nil - } - out := new(EarlyStoppingSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *FileSystemPath) DeepCopyInto(out *FileSystemPath) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FileSystemPath. -func (in *FileSystemPath) DeepCopy() *FileSystemPath { - if in == nil { - return nil - } - out := new(FileSystemPath) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *FilterSpec) DeepCopyInto(out *FilterSpec) { - *out = *in - if in.MetricsFormat != nil { - in, out := &in.MetricsFormat, &out.MetricsFormat - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FilterSpec. -func (in *FilterSpec) DeepCopy() *FilterSpec { - if in == nil { - return nil - } - out := new(FilterSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Metric) DeepCopyInto(out *Metric) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metric. -func (in *Metric) DeepCopy() *Metric { - if in == nil { - return nil - } - out := new(Metric) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MetricsCollectorSpec) DeepCopyInto(out *MetricsCollectorSpec) { - *out = *in - if in.Source != nil { - in, out := &in.Source, &out.Source - *out = new(SourceSpec) - (*in).DeepCopyInto(*out) - } - if in.Collector != nil { - in, out := &in.Collector, &out.Collector - *out = new(CollectorSpec) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetricsCollectorSpec. -func (in *MetricsCollectorSpec) DeepCopy() *MetricsCollectorSpec { - if in == nil { - return nil - } - out := new(MetricsCollectorSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ObjectiveSpec) DeepCopyInto(out *ObjectiveSpec) { - *out = *in - if in.Goal != nil { - in, out := &in.Goal, &out.Goal - *out = new(float64) - **out = **in - } - if in.AdditionalMetricNames != nil { - in, out := &in.AdditionalMetricNames, &out.AdditionalMetricNames - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectiveSpec. -func (in *ObjectiveSpec) DeepCopy() *ObjectiveSpec { - if in == nil { - return nil - } - out := new(ObjectiveSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Observation) DeepCopyInto(out *Observation) { - *out = *in - if in.Metrics != nil { - in, out := &in.Metrics, &out.Metrics - *out = make([]Metric, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Observation. -func (in *Observation) DeepCopy() *Observation { - if in == nil { - return nil - } - out := new(Observation) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ParameterAssignment) DeepCopyInto(out *ParameterAssignment) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ParameterAssignment. -func (in *ParameterAssignment) DeepCopy() *ParameterAssignment { - if in == nil { - return nil - } - out := new(ParameterAssignment) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SourceSpec) DeepCopyInto(out *SourceSpec) { - *out = *in - if in.HttpGet != nil { - in, out := &in.HttpGet, &out.HttpGet - *out = new(v1.HTTPGetAction) - (*in).DeepCopyInto(*out) - } - if in.FileSystemPath != nil { - in, out := &in.FileSystemPath, &out.FileSystemPath - *out = new(FileSystemPath) - **out = **in - } - if in.Filter != nil { - in, out := &in.Filter, &out.Filter - *out = new(FilterSpec) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SourceSpec. -func (in *SourceSpec) DeepCopy() *SourceSpec { - if in == nil { - return nil - } - out := new(SourceSpec) - in.DeepCopyInto(out) - return out -} diff --git a/pkg/apis/controller/experiments/v1alpha3/constants.go b/pkg/apis/controller/experiments/v1alpha3/constants.go deleted file mode 100644 index 9adace8dd6c..00000000000 --- a/pkg/apis/controller/experiments/v1alpha3/constants.go +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -package v1alpha3 - -const ( - // Default value of Spec.ParallelTrialCount - DefaultTrialParallelCount = 3 - - // Default value of Spec.ConfigMapName for Trial template - DefaultTrialConfigMapName = "trial-template" - - // Default value of Spec.TemplatePath - DefaultTrialTemplatePath = "defaultTrialTemplate.yaml" - - // Default value of Spec.DefaultResumePolicy - DefaultResumePolicy = LongRunning -) diff --git a/pkg/apis/controller/experiments/v1alpha3/doc.go b/pkg/apis/controller/experiments/v1alpha3/doc.go deleted file mode 100644 index d80f9fe4c43..00000000000 --- a/pkg/apis/controller/experiments/v1alpha3/doc.go +++ /dev/null @@ -1,23 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package v1alpha3 contains API Schema definitions for the experiment v1alpha3 API group -// +k8s:openapi-gen=true -// +k8s:deepcopy-gen=package,register -// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3 -// +k8s:defaulter-gen=TypeMeta -// +kubebuilder:subresource:status -// +groupName=experiment.kubeflow.org -package v1alpha3 diff --git a/pkg/apis/controller/experiments/v1alpha3/experiment_defaults.go b/pkg/apis/controller/experiments/v1alpha3/experiment_defaults.go deleted file mode 100644 index 14bd238c7b9..00000000000 --- a/pkg/apis/controller/experiments/v1alpha3/experiment_defaults.go +++ /dev/null @@ -1,120 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by main. DO NOT EDIT. - -package v1alpha3 - -import ( - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/intstr" - - common "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" -) - -func (e *Experiment) SetDefault() { - e.setDefaultParallelTrialCount() - e.setDefaultResumePolicy() - e.setDefaultTrialTemplate() - e.setDefaultMetricsCollector() -} - -func (e *Experiment) setDefaultParallelTrialCount() { - if e.Spec.ParallelTrialCount == nil { - e.Spec.ParallelTrialCount = new(int32) - *e.Spec.ParallelTrialCount = DefaultTrialParallelCount - } -} - -func (e *Experiment) setDefaultResumePolicy() { - if e.Spec.ResumePolicy == "" { - e.Spec.ResumePolicy = DefaultResumePolicy - } -} - -func (e *Experiment) setDefaultTrialTemplate() { - t := e.Spec.TrialTemplate - if t == nil { - t = &TrialTemplate{ - Retain: true, - } - } - if t.GoTemplate == nil { - t.GoTemplate = &GoTemplate{} - } - if t.GoTemplate.RawTemplate == "" && t.GoTemplate.TemplateSpec == nil { - t.GoTemplate.TemplateSpec = &TemplateSpec{ - ConfigMapNamespace: consts.DefaultKatibNamespace, - ConfigMapName: DefaultTrialConfigMapName, - TemplatePath: DefaultTrialTemplatePath, - } - } - e.Spec.TrialTemplate = t -} - -func (e *Experiment) setDefaultMetricsCollector() { - if e.Spec.MetricsCollectorSpec == nil { - e.Spec.MetricsCollectorSpec = &common.MetricsCollectorSpec{} - } - if e.Spec.MetricsCollectorSpec.Collector == nil { - e.Spec.MetricsCollectorSpec.Collector = &common.CollectorSpec{ - Kind: common.StdOutCollector, - } - } - switch e.Spec.MetricsCollectorSpec.Collector.Kind { - case common.PrometheusMetricCollector: - if e.Spec.MetricsCollectorSpec.Source == nil { - e.Spec.MetricsCollectorSpec.Source = &common.SourceSpec{} - } - if e.Spec.MetricsCollectorSpec.Source.HttpGet == nil { - e.Spec.MetricsCollectorSpec.Source.HttpGet = &v1.HTTPGetAction{} - } - if e.Spec.MetricsCollectorSpec.Source.HttpGet.Path == "" { - e.Spec.MetricsCollectorSpec.Source.HttpGet.Path = common.DefaultPrometheusPath - } - if e.Spec.MetricsCollectorSpec.Source.HttpGet.Port.String() == "0" { - e.Spec.MetricsCollectorSpec.Source.HttpGet.Port = intstr.FromInt(common.DefaultPrometheusPort) - } - case common.FileCollector: - if e.Spec.MetricsCollectorSpec.Source == nil { - e.Spec.MetricsCollectorSpec.Source = &common.SourceSpec{} - } - if e.Spec.MetricsCollectorSpec.Source.FileSystemPath == nil { - e.Spec.MetricsCollectorSpec.Source.FileSystemPath = &common.FileSystemPath{} - } - if e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Kind == "" { - e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Kind = common.FileKind - } - if e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Path == "" { - e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Path = common.DefaultFilePath - } - case common.TfEventCollector: - if e.Spec.MetricsCollectorSpec.Source == nil { - e.Spec.MetricsCollectorSpec.Source = &common.SourceSpec{} - } - if e.Spec.MetricsCollectorSpec.Source.FileSystemPath == nil { - e.Spec.MetricsCollectorSpec.Source.FileSystemPath = &common.FileSystemPath{} - } - if e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Kind == "" { - e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Kind = common.DirectoryKind - } - if e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Path == "" { - e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Path = common.DefaultTensorflowEventDirPath - } - } -} diff --git a/pkg/apis/controller/experiments/v1alpha3/experiment_types.go b/pkg/apis/controller/experiments/v1alpha3/experiment_types.go deleted file mode 100644 index aa94091ba90..00000000000 --- a/pkg/apis/controller/experiments/v1alpha3/experiment_types.go +++ /dev/null @@ -1,249 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha3 - -import ( - common "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -type ExperimentSpec struct { - // List of hyperparameter configurations. - Parameters []ParameterSpec `json:"parameters,omitempty"` - - // Describes the objective of the experiment. - Objective *common.ObjectiveSpec `json:"objective,omitempty"` - - // Describes the suggestion algorithm. - Algorithm *common.AlgorithmSpec `json:"algorithm,omitempty"` - - // Template for each run of the trial. - TrialTemplate *TrialTemplate `json:"trialTemplate,omitempty"` - - // How many trials can be processed in parallel. - // Defaults to 3 - ParallelTrialCount *int32 `json:"parallelTrialCount,omitempty"` - - // Max completed trials to mark experiment as succeeded - MaxTrialCount *int32 `json:"maxTrialCount,omitempty"` - - // Max failed trials to mark experiment as failed. - MaxFailedTrialCount *int32 `json:"maxFailedTrialCount,omitempty"` - - // For v1alpha3 we will keep the metrics collector implementation same as v1alpha1. - MetricsCollectorSpec *common.MetricsCollectorSpec `json:"metricsCollectorSpec,omitempty"` - - NasConfig *NasConfig `json:"nasConfig,omitempty"` - - // Describes resuming policy which usually take effect after experiment terminated. - ResumePolicy ResumePolicyType `json:"resumePolicy,omitempty"` - - // TODO - Other fields, exact format is TBD. Will add these back during implementation. - // - Early stopping -} - -type ExperimentStatus struct { - // Represents time when the Experiment was acknowledged by the Experiment controller. - // It is not guaranteed to be set in happens-before order across separate operations. - // It is represented in RFC3339 form and is in UTC. - StartTime *metav1.Time `json:"startTime,omitempty"` - - // Represents time when the Experiment was completed. It is not guaranteed to - // be set in happens-before order across separate operations. - // It is represented in RFC3339 form and is in UTC. - CompletionTime *metav1.Time `json:"completionTime,omitempty"` - - // Represents last time when the Experiment was reconciled. It is not guaranteed to - // be set in happens-before order across separate operations. - // It is represented in RFC3339 form and is in UTC. - LastReconcileTime *metav1.Time `json:"lastReconcileTime,omitempty"` - - // List of observed runtime conditions for this Experiment. - Conditions []ExperimentCondition `json:"conditions,omitempty"` - - // Current optimal trial parameters and observations. - CurrentOptimalTrial OptimalTrial `json:"currentOptimalTrial,omitempty"` - - // List of trial names which are running. - RunningTrialList []string `json:"runningTrialList,omitempty"` - - // List of trial names which are pending. - PendingTrialList []string `json:"pendingTrialList,omitempty"` - - // List of trial names which have already failed. - FailedTrialList []string `json:"failedTrialList,omitempty"` - - // List of trial names which have already succeeded. - SucceededTrialList []string `json:"succeededTrialList,omitempty"` - - // List of trial names which have been killed. - KilledTrialList []string `json:"killedTrialList,omitempty"` - - // Trials is the total number of trials owned by the experiment. - Trials int32 `json:"trials,omitempty"` - - // How many trials have succeeded. - TrialsSucceeded int32 `json:"trialsSucceeded,omitempty"` - - // How many trials have failed. - TrialsFailed int32 `json:"trialsFailed,omitempty"` - - // How many trials have been killed. - TrialsKilled int32 `json:"trialsKilled,omitempty"` - - // How many trials are currently pending. - TrialsPending int32 `json:"trialsPending,omitempty"` - - // How many trials are currently running. - TrialsRunning int32 `json:"trialsRunning,omitempty"` -} - -// OptimalTrial is the metrics and assignments of the best trial. -type OptimalTrial struct { - // BestTrialName is the name of the best trial. - BestTrialName string `json:"bestTrialName"` - // Key-value pairs for hyperparameters and assignment values. - ParameterAssignments []common.ParameterAssignment `json:"parameterAssignments"` - - // Observation for this trial - Observation common.Observation `json:"observation,omitempty"` -} - -// +k8s:deepcopy-gen=true -// ExperimentCondition describes the state of the experiment at a certain point. -type ExperimentCondition struct { - // Type of experiment condition. - Type ExperimentConditionType `json:"type"` - - // Status of the condition, one of True, False, Unknown. - Status v1.ConditionStatus `json:"status"` - - // The reason for the condition's last transition. - Reason string `json:"reason,omitempty"` - - // A human readable message indicating details about the transition. - Message string `json:"message,omitempty"` - - // The last time this condition was updated. - LastUpdateTime metav1.Time `json:"lastUpdateTime,omitempty"` - - // Last time the condition transitioned from one status to another. - LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty"` -} - -// ExperimentConditionType defines the state of an Experiment. -type ExperimentConditionType string - -const ( - ExperimentCreated ExperimentConditionType = "Created" - ExperimentRunning ExperimentConditionType = "Running" - ExperimentRestarting ExperimentConditionType = "Restarting" - ExperimentSucceeded ExperimentConditionType = "Succeeded" - ExperimentFailed ExperimentConditionType = "Failed" -) - -type ResumePolicyType string - -const ( - NeverResume ResumePolicyType = "Never" - LongRunning ResumePolicyType = "LongRunning" -) - -type ParameterSpec struct { - Name string `json:"name,omitempty"` - ParameterType ParameterType `json:"parameterType,omitempty"` - FeasibleSpace FeasibleSpace `json:"feasibleSpace,omitempty"` -} - -type ParameterType string - -const ( - ParameterTypeUnknown ParameterType = "unknown" - ParameterTypeDouble ParameterType = "double" - ParameterTypeInt ParameterType = "int" - ParameterTypeDiscrete ParameterType = "discrete" - ParameterTypeCategorical ParameterType = "categorical" -) - -type FeasibleSpace struct { - Max string `json:"max,omitempty"` - Min string `json:"min,omitempty"` - List []string `json:"list,omitempty"` - Step string `json:"step,omitempty"` -} - -type TrialTemplate struct { - Retain bool `json:"retain,omitempty"` - GoTemplate *GoTemplate `json:"goTemplate,omitempty"` -} - -type TemplateSpec struct { - ConfigMapName string `json:"configMapName,omitempty"` - ConfigMapNamespace string `json:"configMapNamespace,omitempty"` - TemplatePath string `json:"templatePath,omitempty"` -} - -type GoTemplate struct { - TemplateSpec *TemplateSpec `json:"templateSpec,omitempty"` - RawTemplate string `json:"rawTemplate,omitempty"` -} - -// +genclient -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// Structure of the Experiment custom resource. -// +k8s:openapi-gen=true -// +kubebuilder:subresource:status -type Experiment struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec ExperimentSpec `json:"spec,omitempty"` - Status ExperimentStatus `json:"status,omitempty"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// ExperimentList contains a list of Experiments -type ExperimentList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []Experiment `json:"items"` -} - -// NasConfig contains config for NAS job -type NasConfig struct { - GraphConfig GraphConfig `json:"graphConfig,omitempty"` - Operations []Operation `json:"operations,omitempty"` -} - -// GraphConfig contains a config of DAG -type GraphConfig struct { - NumLayers *int32 `json:"numLayers,omitempty"` - InputSizes []int32 `json:"inputSizes,omitempty"` - OutputSizes []int32 `json:"outputSizes,omitempty"` -} - -// Operation contains type of operation in DAG -type Operation struct { - OperationType string `json:"operationType,omitempty"` - Parameters []ParameterSpec `json:"parameters,omitempty"` -} - -func init() { - SchemeBuilder.Register(&Experiment{}, &ExperimentList{}) -} diff --git a/pkg/apis/controller/experiments/v1alpha3/register.go b/pkg/apis/controller/experiments/v1alpha3/register.go deleted file mode 100644 index e99bdccad4e..00000000000 --- a/pkg/apis/controller/experiments/v1alpha3/register.go +++ /dev/null @@ -1,47 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package v1alpha3 contains API Schema definitions for the experiment v1alpha3 API group -// +k8s:openapi-gen=true -// +k8s:deepcopy-gen=package,register -// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3 -// +k8s:defaulter-gen=TypeMeta -// +kubebuilder:subresource:status -// +groupName=experiments.kubeflow.org -package v1alpha3 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/runtime/scheme" -) - -const ( - Group = "kubeflow.org" - Version = "v1alpha3" -) - -var ( - // SchemeGroupVersion is group version used to register these objects - SchemeGroupVersion = schema.GroupVersion{Group: Group, Version: Version} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion} - AddToScheme = SchemeBuilder.AddToScheme -) - -// Resource is required by pkg/client/listers/... -func Resource(resource string) schema.GroupResource { - return SchemeGroupVersion.WithResource(resource).GroupResource() -} diff --git a/pkg/apis/controller/experiments/v1alpha3/util.go b/pkg/apis/controller/experiments/v1alpha3/util.go deleted file mode 100644 index 722f0192a1a..00000000000 --- a/pkg/apis/controller/experiments/v1alpha3/util.go +++ /dev/null @@ -1,163 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha3 - -import ( - "errors" - - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -const ( - cleanDataFinalizer = "clean-data-in-db" -) - -func getCondition(exp *Experiment, condType ExperimentConditionType) *ExperimentCondition { - if exp.Status.Conditions != nil { - for _, condition := range exp.Status.Conditions { - if condition.Type == condType { - return &condition - } - } - } - return nil -} - -func hasCondition(exp *Experiment, condType ExperimentConditionType) bool { - cond := getCondition(exp, condType) - if cond != nil && cond.Status == v1.ConditionTrue { - return true - } - return false -} - -func (exp *Experiment) removeCondition(condType ExperimentConditionType) { - var newConditions []ExperimentCondition - for _, c := range exp.Status.Conditions { - - if c.Type == condType { - continue - } - - newConditions = append(newConditions, c) - } - exp.Status.Conditions = newConditions -} - -func newCondition(conditionType ExperimentConditionType, status v1.ConditionStatus, reason, message string) ExperimentCondition { - return ExperimentCondition{ - Type: conditionType, - Status: status, - LastUpdateTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: reason, - Message: message, - } -} - -func (exp *Experiment) IsCreated() bool { - return hasCondition(exp, ExperimentCreated) -} - -func (exp *Experiment) IsSucceeded() bool { - return hasCondition(exp, ExperimentSucceeded) -} - -func (exp *Experiment) IsFailed() bool { - return hasCondition(exp, ExperimentFailed) -} - -func (exp *Experiment) IsRunning() bool { - return hasCondition(exp, ExperimentRunning) -} - -func (exp *Experiment) IsRestarting() bool { - return hasCondition(exp, ExperimentRestarting) -} - -func (exp *Experiment) IsCompleted() bool { - return exp.IsSucceeded() || exp.IsFailed() -} - -func (exp *Experiment) IsCompletedReason(reason string) bool { - cond := getCondition(exp, ExperimentSucceeded) - if cond != nil && cond.Status == v1.ConditionTrue && cond.Reason == reason { - return true - } - return false -} - -func (exp *Experiment) HasRunningTrials() bool { - return exp.Status.TrialsRunning != 0 -} - -func (exp *Experiment) GetLastConditionType() (ExperimentConditionType, error) { - if len(exp.Status.Conditions) > 0 { - return exp.Status.Conditions[len(exp.Status.Conditions)-1].Type, nil - } - return "", errors.New("Experiment doesn't have any condition") -} - -func (exp *Experiment) setCondition(conditionType ExperimentConditionType, status v1.ConditionStatus, reason, message string) { - - newCond := newCondition(conditionType, status, reason, message) - currentCond := getCondition(exp, conditionType) - // Do nothing if condition doesn't change - if currentCond != nil && currentCond.Status == newCond.Status && currentCond.Reason == newCond.Reason { - return - } - - // Do not update lastTransitionTime if the status of the condition doesn't change. - if currentCond != nil && currentCond.Status == newCond.Status { - newCond.LastTransitionTime = currentCond.LastTransitionTime - } - - exp.removeCondition(conditionType) - exp.Status.Conditions = append(exp.Status.Conditions, newCond) -} - -func (exp *Experiment) MarkExperimentStatusCreated(reason, message string) { - exp.setCondition(ExperimentCreated, v1.ConditionTrue, reason, message) -} - -func (exp *Experiment) MarkExperimentStatusRunning(reason, message string) { - //exp.removeCondition(ExperimentRestarting) - exp.setCondition(ExperimentRunning, v1.ConditionTrue, reason, message) -} - -func (exp *Experiment) MarkExperimentStatusRestarting(reason, message string) { - exp.removeCondition(ExperimentSucceeded) - exp.removeCondition(ExperimentFailed) - exp.setCondition(ExperimentRestarting, v1.ConditionTrue, reason, message) -} - -func (exp *Experiment) MarkExperimentStatusSucceeded(reason, message string) { - currentCond := getCondition(exp, ExperimentRunning) - if currentCond != nil { - exp.setCondition(ExperimentRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) - } - exp.setCondition(ExperimentSucceeded, v1.ConditionTrue, reason, message) - -} - -func (exp *Experiment) MarkExperimentStatusFailed(reason, message string) { - currentCond := getCondition(exp, ExperimentRunning) - if currentCond != nil { - exp.setCondition(ExperimentRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) - } - exp.setCondition(ExperimentFailed, v1.ConditionTrue, reason, message) -} diff --git a/pkg/apis/controller/experiments/v1alpha3/zz_generated.deepcopy.go b/pkg/apis/controller/experiments/v1alpha3/zz_generated.deepcopy.go deleted file mode 100644 index efa6052fdc7..00000000000 --- a/pkg/apis/controller/experiments/v1alpha3/zz_generated.deepcopy.go +++ /dev/null @@ -1,424 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by deepcopy-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - commonv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Experiment) DeepCopyInto(out *Experiment) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Experiment. -func (in *Experiment) DeepCopy() *Experiment { - if in == nil { - return nil - } - out := new(Experiment) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Experiment) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ExperimentCondition) DeepCopyInto(out *ExperimentCondition) { - *out = *in - in.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime) - in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExperimentCondition. -func (in *ExperimentCondition) DeepCopy() *ExperimentCondition { - if in == nil { - return nil - } - out := new(ExperimentCondition) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ExperimentList) DeepCopyInto(out *ExperimentList) { - *out = *in - out.TypeMeta = in.TypeMeta - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Experiment, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExperimentList. -func (in *ExperimentList) DeepCopy() *ExperimentList { - if in == nil { - return nil - } - out := new(ExperimentList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ExperimentList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ExperimentSpec) DeepCopyInto(out *ExperimentSpec) { - *out = *in - if in.Parameters != nil { - in, out := &in.Parameters, &out.Parameters - *out = make([]ParameterSpec, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Objective != nil { - in, out := &in.Objective, &out.Objective - *out = new(commonv1alpha3.ObjectiveSpec) - (*in).DeepCopyInto(*out) - } - if in.Algorithm != nil { - in, out := &in.Algorithm, &out.Algorithm - *out = new(commonv1alpha3.AlgorithmSpec) - (*in).DeepCopyInto(*out) - } - if in.TrialTemplate != nil { - in, out := &in.TrialTemplate, &out.TrialTemplate - *out = new(TrialTemplate) - (*in).DeepCopyInto(*out) - } - if in.ParallelTrialCount != nil { - in, out := &in.ParallelTrialCount, &out.ParallelTrialCount - *out = new(int32) - **out = **in - } - if in.MaxTrialCount != nil { - in, out := &in.MaxTrialCount, &out.MaxTrialCount - *out = new(int32) - **out = **in - } - if in.MaxFailedTrialCount != nil { - in, out := &in.MaxFailedTrialCount, &out.MaxFailedTrialCount - *out = new(int32) - **out = **in - } - if in.MetricsCollectorSpec != nil { - in, out := &in.MetricsCollectorSpec, &out.MetricsCollectorSpec - *out = new(commonv1alpha3.MetricsCollectorSpec) - (*in).DeepCopyInto(*out) - } - if in.NasConfig != nil { - in, out := &in.NasConfig, &out.NasConfig - *out = new(NasConfig) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExperimentSpec. -func (in *ExperimentSpec) DeepCopy() *ExperimentSpec { - if in == nil { - return nil - } - out := new(ExperimentSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ExperimentStatus) DeepCopyInto(out *ExperimentStatus) { - *out = *in - if in.StartTime != nil { - in, out := &in.StartTime, &out.StartTime - *out = (*in).DeepCopy() - } - if in.CompletionTime != nil { - in, out := &in.CompletionTime, &out.CompletionTime - *out = (*in).DeepCopy() - } - if in.LastReconcileTime != nil { - in, out := &in.LastReconcileTime, &out.LastReconcileTime - *out = (*in).DeepCopy() - } - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make([]ExperimentCondition, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - in.CurrentOptimalTrial.DeepCopyInto(&out.CurrentOptimalTrial) - if in.RunningTrialList != nil { - in, out := &in.RunningTrialList, &out.RunningTrialList - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.PendingTrialList != nil { - in, out := &in.PendingTrialList, &out.PendingTrialList - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.FailedTrialList != nil { - in, out := &in.FailedTrialList, &out.FailedTrialList - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.SucceededTrialList != nil { - in, out := &in.SucceededTrialList, &out.SucceededTrialList - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.KilledTrialList != nil { - in, out := &in.KilledTrialList, &out.KilledTrialList - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExperimentStatus. -func (in *ExperimentStatus) DeepCopy() *ExperimentStatus { - if in == nil { - return nil - } - out := new(ExperimentStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *FeasibleSpace) DeepCopyInto(out *FeasibleSpace) { - *out = *in - if in.List != nil { - in, out := &in.List, &out.List - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeasibleSpace. -func (in *FeasibleSpace) DeepCopy() *FeasibleSpace { - if in == nil { - return nil - } - out := new(FeasibleSpace) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *GoTemplate) DeepCopyInto(out *GoTemplate) { - *out = *in - if in.TemplateSpec != nil { - in, out := &in.TemplateSpec, &out.TemplateSpec - *out = new(TemplateSpec) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GoTemplate. -func (in *GoTemplate) DeepCopy() *GoTemplate { - if in == nil { - return nil - } - out := new(GoTemplate) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *GraphConfig) DeepCopyInto(out *GraphConfig) { - *out = *in - if in.NumLayers != nil { - in, out := &in.NumLayers, &out.NumLayers - *out = new(int32) - **out = **in - } - if in.InputSizes != nil { - in, out := &in.InputSizes, &out.InputSizes - *out = make([]int32, len(*in)) - copy(*out, *in) - } - if in.OutputSizes != nil { - in, out := &in.OutputSizes, &out.OutputSizes - *out = make([]int32, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GraphConfig. -func (in *GraphConfig) DeepCopy() *GraphConfig { - if in == nil { - return nil - } - out := new(GraphConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NasConfig) DeepCopyInto(out *NasConfig) { - *out = *in - in.GraphConfig.DeepCopyInto(&out.GraphConfig) - if in.Operations != nil { - in, out := &in.Operations, &out.Operations - *out = make([]Operation, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NasConfig. -func (in *NasConfig) DeepCopy() *NasConfig { - if in == nil { - return nil - } - out := new(NasConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Operation) DeepCopyInto(out *Operation) { - *out = *in - if in.Parameters != nil { - in, out := &in.Parameters, &out.Parameters - *out = make([]ParameterSpec, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Operation. -func (in *Operation) DeepCopy() *Operation { - if in == nil { - return nil - } - out := new(Operation) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OptimalTrial) DeepCopyInto(out *OptimalTrial) { - *out = *in - if in.ParameterAssignments != nil { - in, out := &in.ParameterAssignments, &out.ParameterAssignments - *out = make([]commonv1alpha3.ParameterAssignment, len(*in)) - copy(*out, *in) - } - in.Observation.DeepCopyInto(&out.Observation) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OptimalTrial. -func (in *OptimalTrial) DeepCopy() *OptimalTrial { - if in == nil { - return nil - } - out := new(OptimalTrial) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ParameterSpec) DeepCopyInto(out *ParameterSpec) { - *out = *in - in.FeasibleSpace.DeepCopyInto(&out.FeasibleSpace) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ParameterSpec. -func (in *ParameterSpec) DeepCopy() *ParameterSpec { - if in == nil { - return nil - } - out := new(ParameterSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TemplateSpec) DeepCopyInto(out *TemplateSpec) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TemplateSpec. -func (in *TemplateSpec) DeepCopy() *TemplateSpec { - if in == nil { - return nil - } - out := new(TemplateSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TrialTemplate) DeepCopyInto(out *TrialTemplate) { - *out = *in - if in.GoTemplate != nil { - in, out := &in.GoTemplate, &out.GoTemplate - *out = new(GoTemplate) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrialTemplate. -func (in *TrialTemplate) DeepCopy() *TrialTemplate { - if in == nil { - return nil - } - out := new(TrialTemplate) - in.DeepCopyInto(out) - return out -} diff --git a/pkg/apis/controller/suggestions/v1alpha3/doc.go b/pkg/apis/controller/suggestions/v1alpha3/doc.go deleted file mode 100644 index 9575948c583..00000000000 --- a/pkg/apis/controller/suggestions/v1alpha3/doc.go +++ /dev/null @@ -1,24 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package v1alpha3 contains API Schema definitions for the suggestion v1alpha3 API group -// +k8s:openapi-gen=true -// +k8s:deepcopy-gen=package,register -// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3 -// +k8s:defaulter-gen=TypeMeta -// +kubebuilder:subresource:status -// +groupName=suggestion.kubeflow.org -package v1alpha3 diff --git a/pkg/apis/controller/suggestions/v1alpha3/register.go b/pkg/apis/controller/suggestions/v1alpha3/register.go deleted file mode 100644 index fd19a9e7e3d..00000000000 --- a/pkg/apis/controller/suggestions/v1alpha3/register.go +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package v1alpha3 contains API Schema definitions for the suggestion v1alpha3 API group -// +k8s:openapi-gen=true -// +k8s:deepcopy-gen=package,register -// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3 -// +k8s:defaulter-gen=TypeMeta -// +kubebuilder:subresource:status -// +groupName=suggestion.kubeflow.org -package v1alpha3 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/runtime/scheme" -) - -const ( - Group = "kubeflow.org" - Version = "v1alpha3" -) - -var ( - // SchemeGroupVersion is group version used to register these objects - SchemeGroupVersion = schema.GroupVersion{Group: Group, Version: Version} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion} - AddToScheme = SchemeBuilder.AddToScheme -) - -// Resource is required by pkg/client/listers/... -func Resource(resource string) schema.GroupResource { - return SchemeGroupVersion.WithResource(resource).GroupResource() -} diff --git a/pkg/apis/controller/suggestions/v1alpha3/suggestion_types.go b/pkg/apis/controller/suggestions/v1alpha3/suggestion_types.go deleted file mode 100644 index 271b4cc247c..00000000000 --- a/pkg/apis/controller/suggestions/v1alpha3/suggestion_types.go +++ /dev/null @@ -1,130 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha3 - -import ( - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - common "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" -) - -// SuggestionSpec defines the desired state of Suggestion -type SuggestionSpec struct { - AlgorithmName string `json:"algorithmName"` - // Number of suggestions requested - Requests int32 `json:"requests,omitempty"` -} - -// SuggestionStatus defines the observed state of Suggestion -type SuggestionStatus struct { - // Algorithmsettings set by the algorithm services. - AlgorithmSettings []common.AlgorithmSetting `json:"algorithmSettings,omitempty"` - - // Number of suggestion results - SuggestionCount int32 `json:"suggestionCount,omitempty"` - - // Suggestion results - Suggestions []TrialAssignment `json:"suggestions,omitempty"` - - // Represents time when the Suggestion was acknowledged by the Suggestion controller. - // It is not guaranteed to be set in happens-before order across separate operations. - // It is represented in RFC3339 form and is in UTC. - StartTime *metav1.Time `json:"startTime,omitempty"` - - // Represents time when the Suggestion was completed. It is not guaranteed to - // be set in happens-before order across separate operations. - // It is represented in RFC3339 form and is in UTC. - CompletionTime *metav1.Time `json:"completionTime,omitempty"` - - // Represents last time when the Suggestion was reconciled. It is not guaranteed to - // be set in happens-before order across separate operations. - // It is represented in RFC3339 form and is in UTC. - LastReconcileTime *metav1.Time `json:"lastReconcileTime,omitempty"` - - // List of observed runtime conditions for this Suggestion. - Conditions []SuggestionCondition `json:"conditions,omitempty"` -} - -// TrialAssignment is the assignment for one trial. -type TrialAssignment struct { - // Suggestion results - ParameterAssignments []common.ParameterAssignment `json:"parameterAssignments,omitempty"` - - //Name of the suggestion - Name string `json:"name,omitempty"` -} - -// SuggestionCondition describes the state of the Suggestion at a certain point. -// +k8s:deepcopy-gen=true -type SuggestionCondition struct { - // Type of Suggestion condition. - Type SuggestionConditionType `json:"type"` - - // Status of the condition, one of True, False, Unknown. - Status v1.ConditionStatus `json:"status"` - - // The reason for the condition's last transition. - Reason string `json:"reason,omitempty"` - - // A human readable message indicating details about the transition. - Message string `json:"message,omitempty"` - - // The last time this condition was updated. - LastUpdateTime metav1.Time `json:"lastUpdateTime,omitempty"` - - // Last time the condition transitioned from one status to another. - LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty"` -} - -// SuggestionConditionType defines the state of a Suggestion. -type SuggestionConditionType string - -const ( - SuggestionCreated SuggestionConditionType = "Created" - SuggestionDeploymentReady SuggestionConditionType = "DeploymentReady" - SuggestionRunning SuggestionConditionType = "Running" - SuggestionSucceeded SuggestionConditionType = "Succeeded" - SuggestionFailed SuggestionConditionType = "Failed" -) - -// +genclient -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// Suggestion represents the structure of a Suggestion resource. -// +k8s:openapi-gen=true -// +kubebuilder:subresource:status -type Suggestion struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec SuggestionSpec `json:"spec,omitempty"` - Status SuggestionStatus `json:"status,omitempty"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// SuggestionList contains a list of Suggestion -type SuggestionList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []Suggestion `json:"items"` -} - -func init() { - SchemeBuilder.Register(&Suggestion{}, &SuggestionList{}) -} diff --git a/pkg/apis/controller/suggestions/v1alpha3/util.go b/pkg/apis/controller/suggestions/v1alpha3/util.go deleted file mode 100644 index d44537714f4..00000000000 --- a/pkg/apis/controller/suggestions/v1alpha3/util.go +++ /dev/null @@ -1,117 +0,0 @@ -package v1alpha3 - -import ( - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -func getCondition(suggestion *Suggestion, condType SuggestionConditionType) *SuggestionCondition { - if suggestion.Status.Conditions != nil { - for _, condition := range suggestion.Status.Conditions { - if condition.Type == condType { - return &condition - } - } - } - return nil -} - -func hasCondition(suggestion *Suggestion, condType SuggestionConditionType) bool { - cond := getCondition(suggestion, condType) - if cond != nil && cond.Status == v1.ConditionTrue { - return true - } - return false -} - -func (suggestion *Suggestion) removeCondition(condType SuggestionConditionType) { - var newConditions []SuggestionCondition - for _, c := range suggestion.Status.Conditions { - - if c.Type == condType { - continue - } - - newConditions = append(newConditions, c) - } - suggestion.Status.Conditions = newConditions -} - -func newCondition(conditionType SuggestionConditionType, status v1.ConditionStatus, reason, message string) SuggestionCondition { - return SuggestionCondition{ - Type: conditionType, - Status: status, - LastUpdateTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: reason, - Message: message, - } -} - -func (suggestion *Suggestion) IsCreated() bool { - return hasCondition(suggestion, SuggestionCreated) -} - -func (suggestion *Suggestion) IsFailed() bool { - return hasCondition(suggestion, SuggestionFailed) -} - -func (suggestion *Suggestion) IsSucceeded() bool { - return hasCondition(suggestion, SuggestionSucceeded) -} - -func (suggestion *Suggestion) IsRunning() bool { - return hasCondition(suggestion, SuggestionRunning) -} - -func (suggestion *Suggestion) IsCompleted() bool { - return suggestion.IsSucceeded() || suggestion.IsFailed() -} - -func (suggestion *Suggestion) setCondition(conditionType SuggestionConditionType, status v1.ConditionStatus, reason, message string) { - - newCond := newCondition(conditionType, status, reason, message) - currentCond := getCondition(suggestion, conditionType) - // Do nothing if condition doesn't change - if currentCond != nil && currentCond.Status == newCond.Status && currentCond.Reason == newCond.Reason { - return - } - - // Do not update lastTransitionTime if the status of the condition doesn't change. - if currentCond != nil && currentCond.Status == newCond.Status { - newCond.LastTransitionTime = currentCond.LastTransitionTime - } - - suggestion.removeCondition(conditionType) - suggestion.Status.Conditions = append(suggestion.Status.Conditions, newCond) -} - -func (suggestion *Suggestion) MarkSuggestionStatusCreated(reason, message string) { - suggestion.setCondition(SuggestionCreated, v1.ConditionTrue, reason, message) -} - -func (suggestion *Suggestion) MarkSuggestionStatusRunning(reason, message string) { - //suggestion.removeCondition(SuggestionRestarting) - suggestion.setCondition(SuggestionRunning, v1.ConditionTrue, reason, message) -} - -func (suggestion *Suggestion) MarkSuggestionStatusSucceeded(reason, message string) { - currentCond := getCondition(suggestion, SuggestionRunning) - if currentCond != nil { - suggestion.setCondition(SuggestionRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) - } - suggestion.setCondition(SuggestionSucceeded, v1.ConditionTrue, reason, message) - -} - -func (suggestion *Suggestion) MarkSuggestionStatusFailed(reason, message string) { - currentCond := getCondition(suggestion, SuggestionRunning) - if currentCond != nil { - suggestion.setCondition(SuggestionRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) - } - suggestion.setCondition(SuggestionFailed, v1.ConditionTrue, reason, message) -} - -func (suggestion *Suggestion) MarkSuggestionStatusDeploymentReady(status v1.ConditionStatus, reason, message string) { - suggestion.setCondition(SuggestionDeploymentReady, status, reason, message) -} diff --git a/pkg/apis/controller/suggestions/v1alpha3/zz_generated.deepcopy.go b/pkg/apis/controller/suggestions/v1alpha3/zz_generated.deepcopy.go deleted file mode 100644 index fbd88ddae80..00000000000 --- a/pkg/apis/controller/suggestions/v1alpha3/zz_generated.deepcopy.go +++ /dev/null @@ -1,188 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by deepcopy-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - commonv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Suggestion) DeepCopyInto(out *Suggestion) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec - in.Status.DeepCopyInto(&out.Status) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Suggestion. -func (in *Suggestion) DeepCopy() *Suggestion { - if in == nil { - return nil - } - out := new(Suggestion) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Suggestion) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SuggestionCondition) DeepCopyInto(out *SuggestionCondition) { - *out = *in - in.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime) - in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SuggestionCondition. -func (in *SuggestionCondition) DeepCopy() *SuggestionCondition { - if in == nil { - return nil - } - out := new(SuggestionCondition) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SuggestionList) DeepCopyInto(out *SuggestionList) { - *out = *in - out.TypeMeta = in.TypeMeta - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Suggestion, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SuggestionList. -func (in *SuggestionList) DeepCopy() *SuggestionList { - if in == nil { - return nil - } - out := new(SuggestionList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *SuggestionList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SuggestionSpec) DeepCopyInto(out *SuggestionSpec) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SuggestionSpec. -func (in *SuggestionSpec) DeepCopy() *SuggestionSpec { - if in == nil { - return nil - } - out := new(SuggestionSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SuggestionStatus) DeepCopyInto(out *SuggestionStatus) { - *out = *in - if in.AlgorithmSettings != nil { - in, out := &in.AlgorithmSettings, &out.AlgorithmSettings - *out = make([]commonv1alpha3.AlgorithmSetting, len(*in)) - copy(*out, *in) - } - if in.Suggestions != nil { - in, out := &in.Suggestions, &out.Suggestions - *out = make([]TrialAssignment, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.StartTime != nil { - in, out := &in.StartTime, &out.StartTime - *out = (*in).DeepCopy() - } - if in.CompletionTime != nil { - in, out := &in.CompletionTime, &out.CompletionTime - *out = (*in).DeepCopy() - } - if in.LastReconcileTime != nil { - in, out := &in.LastReconcileTime, &out.LastReconcileTime - *out = (*in).DeepCopy() - } - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make([]SuggestionCondition, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SuggestionStatus. -func (in *SuggestionStatus) DeepCopy() *SuggestionStatus { - if in == nil { - return nil - } - out := new(SuggestionStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TrialAssignment) DeepCopyInto(out *TrialAssignment) { - *out = *in - if in.ParameterAssignments != nil { - in, out := &in.ParameterAssignments, &out.ParameterAssignments - *out = make([]commonv1alpha3.ParameterAssignment, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrialAssignment. -func (in *TrialAssignment) DeepCopy() *TrialAssignment { - if in == nil { - return nil - } - out := new(TrialAssignment) - in.DeepCopyInto(out) - return out -} diff --git a/pkg/apis/controller/trials/v1alpha3/doc.go b/pkg/apis/controller/trials/v1alpha3/doc.go deleted file mode 100644 index 0474aed2c69..00000000000 --- a/pkg/apis/controller/trials/v1alpha3/doc.go +++ /dev/null @@ -1,23 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package v1alpha3 contains API Schema definitions for the trial v1alpha3 API group -// +k8s:openapi-gen=true -// +k8s:deepcopy-gen=package,register -// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3 -// +k8s:defaulter-gen=TypeMeta -// +kubebuilder:subresource:status -// +groupName=trial.kubeflow.org -package v1alpha3 diff --git a/pkg/apis/controller/trials/v1alpha3/register.go b/pkg/apis/controller/trials/v1alpha3/register.go deleted file mode 100644 index 013a3774916..00000000000 --- a/pkg/apis/controller/trials/v1alpha3/register.go +++ /dev/null @@ -1,47 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package v1alpha3 contains API Schema definitions for the trial v1alpha3 API group -// +k8s:openapi-gen=true -// +k8s:deepcopy-gen=package,register -// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3 -// +k8s:defaulter-gen=TypeMeta -// +kubebuilder:subresource:status -// +groupName=trials.kubeflow.org -package v1alpha3 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/runtime/scheme" -) - -const ( - Group = "kubeflow.org" - Version = "v1alpha3" -) - -var ( - // SchemeGroupVersion is group version used to register these objects - SchemeGroupVersion = schema.GroupVersion{Group: Group, Version: Version} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion} - AddToScheme = SchemeBuilder.AddToScheme -) - -// Resource is required by pkg/client/listers/... -func Resource(resource string) schema.GroupResource { - return SchemeGroupVersion.WithResource(resource).GroupResource() -} diff --git a/pkg/apis/controller/trials/v1alpha3/trial_types.go b/pkg/apis/controller/trials/v1alpha3/trial_types.go deleted file mode 100644 index b0e1bcda30d..00000000000 --- a/pkg/apis/controller/trials/v1alpha3/trial_types.go +++ /dev/null @@ -1,124 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha3 - -import ( - common "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -type TrialSpec struct { - // Describes the objective of the experiment. - Objective *common.ObjectiveSpec `json:"objective,omitempty"` - - // Key-value pairs for hyperparameters and assignment values. - ParameterAssignments []common.ParameterAssignment `json:"parameterAssignments"` - - // Raw text for the trial run spec. This can be any generic Kubernetes - // runtime object. The trial operator should create the resource as written, - // and let the corresponding resource controller (e.g. tf-operator) handle - // the rest. - RunSpec string `json:"runSpec,omitempty"` - // Whether to retain the trial run object after completed. - RetainRun bool `json:"retainRun,omitempty"` - - // Describes how metrics will be collected - MetricsCollector common.MetricsCollectorSpec `json:"metricsCollector,omitempty"` -} - -type TrialStatus struct { - // Represents time when the Trial was acknowledged by the Trial controller. - // It is not guaranteed to be set in happens-before order across separate operations. - // It is represented in RFC3339 form and is in UTC - StartTime *metav1.Time `json:"startTime,omitempty"` - - // Represents time when the Trial was completed. It is not guaranteed to - // be set in happens-before order across separate operations. - // It is represented in RFC3339 form and is in UTC - CompletionTime *metav1.Time `json:"completionTime,omitempty"` - - // Represents last time when the Trial was reconciled. It is not guaranteed to - // be set in happens-before order across separate operations. - // It is represented in RFC3339 form and is in UTC. - LastReconcileTime *metav1.Time `json:"lastReconcileTime,omitempty"` - - // List of observed runtime conditions for this Trial. - Conditions []TrialCondition `json:"conditions,omitempty"` - - // Results of the Trial - objectives and other metrics values. - Observation *common.Observation `json:"observation,omitempty"` -} - -// +k8s:deepcopy-gen=true -// TrialCondition describes the state of the trial at a certain point. -type TrialCondition struct { - // Type of trial condition. - Type TrialConditionType `json:"type"` - - // Status of the condition, one of True, False, Unknown. - Status v1.ConditionStatus `json:"status"` - - // The reason for the condition's last transition. - Reason string `json:"reason,omitempty"` - - // A human readable message indicating details about the transition. - Message string `json:"message,omitempty"` - - // The last time this condition was updated. - LastUpdateTime metav1.Time `json:"lastUpdateTime,omitempty"` - - // Last time the condition transitioned from one status to another. - LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty"` -} - -// TrialConditionType describes the various conditions a Trial can be in. -type TrialConditionType string - -const ( - TrialCreated TrialConditionType = "Created" - TrialRunning TrialConditionType = "Running" - TrialSucceeded TrialConditionType = "Succeeded" - TrialKilled TrialConditionType = "Killed" - TrialFailed TrialConditionType = "Failed" -) - -// +genclient -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// Represents the structure of a Trial resource. -// +k8s:openapi-gen=true -// +kubebuilder:subresource:status -type Trial struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec TrialSpec `json:"spec,omitempty"` - Status TrialStatus `json:"status,omitempty"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// TrialList contains a list of Trials -type TrialList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []Trial `json:"items"` -} - -func init() { - SchemeBuilder.Register(&Trial{}, &TrialList{}) -} diff --git a/pkg/apis/controller/trials/v1alpha3/util.go b/pkg/apis/controller/trials/v1alpha3/util.go deleted file mode 100644 index 60379dc837b..00000000000 --- a/pkg/apis/controller/trials/v1alpha3/util.go +++ /dev/null @@ -1,146 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha3 - -import ( - "errors" - - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -func getCondition(trial *Trial, condType TrialConditionType) *TrialCondition { - for _, condition := range trial.Status.Conditions { - if condition.Type == condType { - return &condition - } - } - return nil -} - -func hasCondition(trial *Trial, condType TrialConditionType) bool { - cond := getCondition(trial, condType) - if cond != nil && cond.Status == v1.ConditionTrue { - return true - } - return false -} - -func (trial *Trial) removeCondition(condType TrialConditionType) { - var newConditions []TrialCondition - for _, c := range trial.Status.Conditions { - - if c.Type == condType { - continue - } - - newConditions = append(newConditions, c) - } - trial.Status.Conditions = newConditions -} - -func newCondition(conditionType TrialConditionType, status v1.ConditionStatus, reason, message string) TrialCondition { - return TrialCondition{ - Type: conditionType, - Status: status, - LastUpdateTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: reason, - Message: message, - } -} - -func (trial *Trial) IsCreated() bool { - return hasCondition(trial, TrialCreated) -} - -func (trial *Trial) IsRunning() bool { - return hasCondition(trial, TrialRunning) -} - -func (trial *Trial) IsSucceeded() bool { - return hasCondition(trial, TrialSucceeded) -} - -func (trial *Trial) IsFailed() bool { - return hasCondition(trial, TrialFailed) -} - -func (trial *Trial) IsKilled() bool { - return hasCondition(trial, TrialKilled) -} - -func (trial *Trial) IsCompleted() bool { - return trial.IsSucceeded() || trial.IsFailed() || trial.IsKilled() -} - -func (trial *Trial) GetLastConditionType() (TrialConditionType, error) { - if len(trial.Status.Conditions) > 0 { - return trial.Status.Conditions[len(trial.Status.Conditions)-1].Type, nil - } - return "", errors.New("Trial doesn't have any condition") -} - -func (trial *Trial) setCondition(conditionType TrialConditionType, status v1.ConditionStatus, reason, message string) { - - newCond := newCondition(conditionType, status, reason, message) - currentCond := getCondition(trial, conditionType) - // Do nothing if condition doesn't change - if currentCond != nil && currentCond.Status == newCond.Status && currentCond.Reason == newCond.Reason { - return - } - - // Do not update lastTransitionTime if the status of the condition doesn't change. - if currentCond != nil && currentCond.Status == newCond.Status { - newCond.LastTransitionTime = currentCond.LastTransitionTime - } - - trial.removeCondition(conditionType) - trial.Status.Conditions = append(trial.Status.Conditions, newCond) -} - -func (trial *Trial) MarkTrialStatusCreated(reason, message string) { - trial.setCondition(TrialCreated, v1.ConditionTrue, reason, message) -} - -func (trial *Trial) MarkTrialStatusRunning(reason, message string) { - trial.setCondition(TrialRunning, v1.ConditionTrue, reason, message) -} - -func (trial *Trial) MarkTrialStatusSucceeded(status v1.ConditionStatus, reason, message string) { - currentCond := getCondition(trial, TrialRunning) - if currentCond != nil { - trial.setCondition(TrialRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) - } - trial.setCondition(TrialSucceeded, status, reason, message) - -} - -func (trial *Trial) MarkTrialStatusFailed(reason, message string) { - currentCond := getCondition(trial, TrialRunning) - if currentCond != nil { - trial.setCondition(TrialRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) - } - trial.setCondition(TrialFailed, v1.ConditionTrue, reason, message) -} - -func (trial *Trial) MarkTrialStatusKilled(reason, message string) { - currentCond := getCondition(trial, TrialRunning) - if currentCond != nil { - trial.setCondition(TrialRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) - } - trial.setCondition(TrialKilled, v1.ConditionTrue, reason, message) -} diff --git a/pkg/apis/controller/trials/v1alpha3/zz_generated.deepcopy.go b/pkg/apis/controller/trials/v1alpha3/zz_generated.deepcopy.go deleted file mode 100644 index 678f9a56597..00000000000 --- a/pkg/apis/controller/trials/v1alpha3/zz_generated.deepcopy.go +++ /dev/null @@ -1,171 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by deepcopy-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - commonv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Trial) DeepCopyInto(out *Trial) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Trial. -func (in *Trial) DeepCopy() *Trial { - if in == nil { - return nil - } - out := new(Trial) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Trial) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TrialCondition) DeepCopyInto(out *TrialCondition) { - *out = *in - in.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime) - in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrialCondition. -func (in *TrialCondition) DeepCopy() *TrialCondition { - if in == nil { - return nil - } - out := new(TrialCondition) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TrialList) DeepCopyInto(out *TrialList) { - *out = *in - out.TypeMeta = in.TypeMeta - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Trial, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrialList. -func (in *TrialList) DeepCopy() *TrialList { - if in == nil { - return nil - } - out := new(TrialList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *TrialList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TrialSpec) DeepCopyInto(out *TrialSpec) { - *out = *in - if in.Objective != nil { - in, out := &in.Objective, &out.Objective - *out = new(commonv1alpha3.ObjectiveSpec) - (*in).DeepCopyInto(*out) - } - if in.ParameterAssignments != nil { - in, out := &in.ParameterAssignments, &out.ParameterAssignments - *out = make([]commonv1alpha3.ParameterAssignment, len(*in)) - copy(*out, *in) - } - in.MetricsCollector.DeepCopyInto(&out.MetricsCollector) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrialSpec. -func (in *TrialSpec) DeepCopy() *TrialSpec { - if in == nil { - return nil - } - out := new(TrialSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TrialStatus) DeepCopyInto(out *TrialStatus) { - *out = *in - if in.StartTime != nil { - in, out := &in.StartTime, &out.StartTime - *out = (*in).DeepCopy() - } - if in.CompletionTime != nil { - in, out := &in.CompletionTime, &out.CompletionTime - *out = (*in).DeepCopy() - } - if in.LastReconcileTime != nil { - in, out := &in.LastReconcileTime, &out.LastReconcileTime - *out = (*in).DeepCopy() - } - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make([]TrialCondition, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Observation != nil { - in, out := &in.Observation, &out.Observation - *out = new(commonv1alpha3.Observation) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrialStatus. -func (in *TrialStatus) DeepCopy() *TrialStatus { - if in == nil { - return nil - } - out := new(TrialStatus) - in.DeepCopyInto(out) - return out -} diff --git a/pkg/apis/manager/README.md b/pkg/apis/manager/README.md index 17e988ecbb4..755bf21fe2d 100644 --- a/pkg/apis/manager/README.md +++ b/pkg/apis/manager/README.md @@ -2,22 +2,19 @@ Katib offers the following APIs: -- DBManager service is an API for DB services (in v1alpha3 named Manager service). +- DBManager service is an API for DB services. - Suggestion service is an API for Suggestion services. - EarlyStopping service is an API for EarlyStopping services. ## GRPC API documentation -See the [Katib v1beta1 API reference docs](https://github.com/kubeflow/katib/blob/master/pkg/apis/manager/v1beta1/gen-doc/api.md). - -See the [Katib v1alpha3 API reference docs](https://www.kubeflow.org/docs/reference/katib/). +See the [Katib v1beta1 API reference docs](https://www.kubeflow.org/docs/reference/katib/v1beta1/katib/). ## Update API and generate documents When you want to edit the API, please only edit the corresponding `api.proto` and generate other files from it: - [v1beta1/api.proto](./v1beta1/api.proto) for v1beta1. -- [v1alpha3/api.proto](./v1alpha3/api.proto) for v1alpha3. We use [protoc-gen-doc](https://github.com/pseudomuto/protoc-gen-doc) to generate the API docs from `api.proto`. @@ -25,7 +22,6 @@ generate the API docs from `api.proto`. Run `build.sh` to update every file from `api.proto` and generate the docs: - [v1beta1/build.sh](./v1beta1/build.sh) for v1beta1. -- [v1alpha3/build.sh](./v1alpha3/build.sh) for v1alpha3. After running `build.sh`, follow these steps to update the docs: diff --git a/pkg/apis/manager/v1alpha3/Makefile b/pkg/apis/manager/v1alpha3/Makefile deleted file mode 100644 index f63e1d5a8f4..00000000000 --- a/pkg/apis/manager/v1alpha3/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -api.pb.go: api.proto - protoc -I. api.proto --go_out=plugins=grpc:. diff --git a/pkg/apis/manager/v1alpha3/api.pb.go b/pkg/apis/manager/v1alpha3/api.pb.go deleted file mode 100644 index de83fbf330e..00000000000 --- a/pkg/apis/manager/v1alpha3/api.pb.go +++ /dev/null @@ -1,1470 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: api.proto - -/* -Package api_v1_alpha3 is a generated protocol buffer package. - -It is generated from these files: - api.proto - -It has these top-level messages: - FeasibleSpace - ParameterSpec - ObjectiveSpec - AlgorithmSetting - EarlyStoppingSpec - AlgorithmSpec - NasConfig - GraphConfig - Operation - ExperimentSpec - Experiment - ParameterAssignment - Metric - MetricLog - Observation - ObservationLog - TrialSpec - TrialStatus - Trial - ReportObservationLogRequest - ReportObservationLogReply - DeleteObservationLogRequest - DeleteObservationLogReply - GetObservationLogRequest - GetObservationLogReply - GetSuggestionsRequest - GetSuggestionsReply - ValidateAlgorithmSettingsRequest - ValidateAlgorithmSettingsReply -*/ -package api_v1_alpha3 - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import _ "google.golang.org/genproto/googleapis/api/annotations" - -import ( - context "golang.org/x/net/context" - grpc "google.golang.org/grpc" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -// * -// Types of value for HyperParameter. -type ParameterType int32 - -const ( - ParameterType_UNKNOWN_TYPE ParameterType = 0 - ParameterType_DOUBLE ParameterType = 1 - ParameterType_INT ParameterType = 2 - ParameterType_DISCRETE ParameterType = 3 - ParameterType_CATEGORICAL ParameterType = 4 -) - -var ParameterType_name = map[int32]string{ - 0: "UNKNOWN_TYPE", - 1: "DOUBLE", - 2: "INT", - 3: "DISCRETE", - 4: "CATEGORICAL", -} -var ParameterType_value = map[string]int32{ - "UNKNOWN_TYPE": 0, - "DOUBLE": 1, - "INT": 2, - "DISCRETE": 3, - "CATEGORICAL": 4, -} - -func (x ParameterType) String() string { - return proto.EnumName(ParameterType_name, int32(x)) -} -func (ParameterType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -// * -// Direction of optimization. Minimize or Maximize. -type ObjectiveType int32 - -const ( - ObjectiveType_UNKNOWN ObjectiveType = 0 - ObjectiveType_MINIMIZE ObjectiveType = 1 - ObjectiveType_MAXIMIZE ObjectiveType = 2 -) - -var ObjectiveType_name = map[int32]string{ - 0: "UNKNOWN", - 1: "MINIMIZE", - 2: "MAXIMIZE", -} -var ObjectiveType_value = map[string]int32{ - "UNKNOWN": 0, - "MINIMIZE": 1, - "MAXIMIZE": 2, -} - -func (x ObjectiveType) String() string { - return proto.EnumName(ObjectiveType_name, int32(x)) -} -func (ObjectiveType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } - -type TrialStatus_TrialConditionType int32 - -const ( - TrialStatus_CREATED TrialStatus_TrialConditionType = 0 - TrialStatus_RUNNING TrialStatus_TrialConditionType = 1 - TrialStatus_SUCCEEDED TrialStatus_TrialConditionType = 2 - TrialStatus_KILLED TrialStatus_TrialConditionType = 3 - TrialStatus_FAILED TrialStatus_TrialConditionType = 4 - TrialStatus_UNKNOWN TrialStatus_TrialConditionType = 5 -) - -var TrialStatus_TrialConditionType_name = map[int32]string{ - 0: "CREATED", - 1: "RUNNING", - 2: "SUCCEEDED", - 3: "KILLED", - 4: "FAILED", - 5: "UNKNOWN", -} -var TrialStatus_TrialConditionType_value = map[string]int32{ - "CREATED": 0, - "RUNNING": 1, - "SUCCEEDED": 2, - "KILLED": 3, - "FAILED": 4, - "UNKNOWN": 5, -} - -func (x TrialStatus_TrialConditionType) String() string { - return proto.EnumName(TrialStatus_TrialConditionType_name, int32(x)) -} -func (TrialStatus_TrialConditionType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{17, 0} -} - -// * -// Feasible space for optimization. -// Int and Double type use Max/Min. -// Discrete and Categorical type use List. -type FeasibleSpace struct { - Max string `protobuf:"bytes,1,opt,name=max" json:"max,omitempty"` - Min string `protobuf:"bytes,2,opt,name=min" json:"min,omitempty"` - List []string `protobuf:"bytes,3,rep,name=list" json:"list,omitempty"` - Step string `protobuf:"bytes,4,opt,name=step" json:"step,omitempty"` -} - -func (m *FeasibleSpace) Reset() { *m = FeasibleSpace{} } -func (m *FeasibleSpace) String() string { return proto.CompactTextString(m) } -func (*FeasibleSpace) ProtoMessage() {} -func (*FeasibleSpace) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -func (m *FeasibleSpace) GetMax() string { - if m != nil { - return m.Max - } - return "" -} - -func (m *FeasibleSpace) GetMin() string { - if m != nil { - return m.Min - } - return "" -} - -func (m *FeasibleSpace) GetList() []string { - if m != nil { - return m.List - } - return nil -} - -func (m *FeasibleSpace) GetStep() string { - if m != nil { - return m.Step - } - return "" -} - -// * -// Config for a Hyper parameter. -// Katib will create each Hyper parameter from this config. -type ParameterSpec struct { - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - ParameterType ParameterType `protobuf:"varint,2,opt,name=parameter_type,json=parameterType,enum=api.v1.alpha3.ParameterType" json:"parameter_type,omitempty"` - FeasibleSpace *FeasibleSpace `protobuf:"bytes,3,opt,name=feasible_space,json=feasibleSpace" json:"feasible_space,omitempty"` -} - -func (m *ParameterSpec) Reset() { *m = ParameterSpec{} } -func (m *ParameterSpec) String() string { return proto.CompactTextString(m) } -func (*ParameterSpec) ProtoMessage() {} -func (*ParameterSpec) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } - -func (m *ParameterSpec) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *ParameterSpec) GetParameterType() ParameterType { - if m != nil { - return m.ParameterType - } - return ParameterType_UNKNOWN_TYPE -} - -func (m *ParameterSpec) GetFeasibleSpace() *FeasibleSpace { - if m != nil { - return m.FeasibleSpace - } - return nil -} - -type ObjectiveSpec struct { - Type ObjectiveType `protobuf:"varint,1,opt,name=type,enum=api.v1.alpha3.ObjectiveType" json:"type,omitempty"` - Goal float64 `protobuf:"fixed64,2,opt,name=goal" json:"goal,omitempty"` - ObjectiveMetricName string `protobuf:"bytes,3,opt,name=objective_metric_name,json=objectiveMetricName" json:"objective_metric_name,omitempty"` - AdditionalMetricNames []string `protobuf:"bytes,4,rep,name=additional_metric_names,json=additionalMetricNames" json:"additional_metric_names,omitempty"` -} - -func (m *ObjectiveSpec) Reset() { *m = ObjectiveSpec{} } -func (m *ObjectiveSpec) String() string { return proto.CompactTextString(m) } -func (*ObjectiveSpec) ProtoMessage() {} -func (*ObjectiveSpec) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } - -func (m *ObjectiveSpec) GetType() ObjectiveType { - if m != nil { - return m.Type - } - return ObjectiveType_UNKNOWN -} - -func (m *ObjectiveSpec) GetGoal() float64 { - if m != nil { - return m.Goal - } - return 0 -} - -func (m *ObjectiveSpec) GetObjectiveMetricName() string { - if m != nil { - return m.ObjectiveMetricName - } - return "" -} - -func (m *ObjectiveSpec) GetAdditionalMetricNames() []string { - if m != nil { - return m.AdditionalMetricNames - } - return nil -} - -type AlgorithmSetting struct { - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` -} - -func (m *AlgorithmSetting) Reset() { *m = AlgorithmSetting{} } -func (m *AlgorithmSetting) String() string { return proto.CompactTextString(m) } -func (*AlgorithmSetting) ProtoMessage() {} -func (*AlgorithmSetting) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } - -func (m *AlgorithmSetting) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *AlgorithmSetting) GetValue() string { - if m != nil { - return m.Value - } - return "" -} - -type EarlyStoppingSpec struct { -} - -func (m *EarlyStoppingSpec) Reset() { *m = EarlyStoppingSpec{} } -func (m *EarlyStoppingSpec) String() string { return proto.CompactTextString(m) } -func (*EarlyStoppingSpec) ProtoMessage() {} -func (*EarlyStoppingSpec) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } - -type AlgorithmSpec struct { - AlgorithmName string `protobuf:"bytes,1,opt,name=algorithm_name,json=algorithmName" json:"algorithm_name,omitempty"` - AlgorithmSetting []*AlgorithmSetting `protobuf:"bytes,2,rep,name=algorithm_setting,json=algorithmSetting" json:"algorithm_setting,omitempty"` - EarlyStoppingSpec *EarlyStoppingSpec `protobuf:"bytes,3,opt,name=early_stopping_spec,json=earlyStoppingSpec" json:"early_stopping_spec,omitempty"` -} - -func (m *AlgorithmSpec) Reset() { *m = AlgorithmSpec{} } -func (m *AlgorithmSpec) String() string { return proto.CompactTextString(m) } -func (*AlgorithmSpec) ProtoMessage() {} -func (*AlgorithmSpec) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } - -func (m *AlgorithmSpec) GetAlgorithmName() string { - if m != nil { - return m.AlgorithmName - } - return "" -} - -func (m *AlgorithmSpec) GetAlgorithmSetting() []*AlgorithmSetting { - if m != nil { - return m.AlgorithmSetting - } - return nil -} - -func (m *AlgorithmSpec) GetEarlyStoppingSpec() *EarlyStoppingSpec { - if m != nil { - return m.EarlyStoppingSpec - } - return nil -} - -// * -// NasConfig contains a config of NAS job -type NasConfig struct { - GraphConfig *GraphConfig `protobuf:"bytes,1,opt,name=graph_config,json=graphConfig" json:"graph_config,omitempty"` - Operations *NasConfig_Operations `protobuf:"bytes,2,opt,name=operations" json:"operations,omitempty"` -} - -func (m *NasConfig) Reset() { *m = NasConfig{} } -func (m *NasConfig) String() string { return proto.CompactTextString(m) } -func (*NasConfig) ProtoMessage() {} -func (*NasConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } - -func (m *NasConfig) GetGraphConfig() *GraphConfig { - if m != nil { - return m.GraphConfig - } - return nil -} - -func (m *NasConfig) GetOperations() *NasConfig_Operations { - if m != nil { - return m.Operations - } - return nil -} - -type NasConfig_Operations struct { - Operation []*Operation `protobuf:"bytes,1,rep,name=operation" json:"operation,omitempty"` -} - -func (m *NasConfig_Operations) Reset() { *m = NasConfig_Operations{} } -func (m *NasConfig_Operations) String() string { return proto.CompactTextString(m) } -func (*NasConfig_Operations) ProtoMessage() {} -func (*NasConfig_Operations) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6, 0} } - -func (m *NasConfig_Operations) GetOperation() []*Operation { - if m != nil { - return m.Operation - } - return nil -} - -// * -// GraphConfig contains a config of DAG -type GraphConfig struct { - NumLayers int32 `protobuf:"varint,1,opt,name=num_layers,json=numLayers" json:"num_layers,omitempty"` - InputSizes []int32 `protobuf:"varint,2,rep,packed,name=input_sizes,json=inputSizes" json:"input_sizes,omitempty"` - OutputSizes []int32 `protobuf:"varint,3,rep,packed,name=output_sizes,json=outputSizes" json:"output_sizes,omitempty"` -} - -func (m *GraphConfig) Reset() { *m = GraphConfig{} } -func (m *GraphConfig) String() string { return proto.CompactTextString(m) } -func (*GraphConfig) ProtoMessage() {} -func (*GraphConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } - -func (m *GraphConfig) GetNumLayers() int32 { - if m != nil { - return m.NumLayers - } - return 0 -} - -func (m *GraphConfig) GetInputSizes() []int32 { - if m != nil { - return m.InputSizes - } - return nil -} - -func (m *GraphConfig) GetOutputSizes() []int32 { - if m != nil { - return m.OutputSizes - } - return nil -} - -// * -// Config for operations in DAG -type Operation struct { - OperationType string `protobuf:"bytes,1,opt,name=operation_type,json=operationType" json:"operation_type,omitempty"` - ParameterSpecs *Operation_ParameterSpecs `protobuf:"bytes,2,opt,name=parameter_specs,json=parameterSpecs" json:"parameter_specs,omitempty"` -} - -func (m *Operation) Reset() { *m = Operation{} } -func (m *Operation) String() string { return proto.CompactTextString(m) } -func (*Operation) ProtoMessage() {} -func (*Operation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } - -func (m *Operation) GetOperationType() string { - if m != nil { - return m.OperationType - } - return "" -} - -func (m *Operation) GetParameterSpecs() *Operation_ParameterSpecs { - if m != nil { - return m.ParameterSpecs - } - return nil -} - -// * -// List of ParameterSpec -type Operation_ParameterSpecs struct { - Parameters []*ParameterSpec `protobuf:"bytes,1,rep,name=parameters" json:"parameters,omitempty"` -} - -func (m *Operation_ParameterSpecs) Reset() { *m = Operation_ParameterSpecs{} } -func (m *Operation_ParameterSpecs) String() string { return proto.CompactTextString(m) } -func (*Operation_ParameterSpecs) ProtoMessage() {} -func (*Operation_ParameterSpecs) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8, 0} } - -func (m *Operation_ParameterSpecs) GetParameters() []*ParameterSpec { - if m != nil { - return m.Parameters - } - return nil -} - -// * -// Spec of a Experiment. Experiment represents a single optimization run over a feasible space. -// Each Experiment contains a configuration describing the feasible space, as well as a set of Trials. -// It is assumed that objective function f(x) does not change in the course of a Experiment. -type ExperimentSpec struct { - ParameterSpecs *ExperimentSpec_ParameterSpecs `protobuf:"bytes,1,opt,name=parameter_specs,json=parameterSpecs" json:"parameter_specs,omitempty"` - Objective *ObjectiveSpec `protobuf:"bytes,2,opt,name=objective" json:"objective,omitempty"` - Algorithm *AlgorithmSpec `protobuf:"bytes,3,opt,name=algorithm" json:"algorithm,omitempty"` - TrialTemplate string `protobuf:"bytes,4,opt,name=trial_template,json=trialTemplate" json:"trial_template,omitempty"` - MetricsCollectorSpec string `protobuf:"bytes,5,opt,name=metrics_collector_spec,json=metricsCollectorSpec" json:"metrics_collector_spec,omitempty"` - ParallelTrialCount int32 `protobuf:"varint,6,opt,name=parallel_trial_count,json=parallelTrialCount" json:"parallel_trial_count,omitempty"` - MaxTrialCount int32 `protobuf:"varint,7,opt,name=max_trial_count,json=maxTrialCount" json:"max_trial_count,omitempty"` - NasConfig *NasConfig `protobuf:"bytes,8,opt,name=nas_config,json=nasConfig" json:"nas_config,omitempty"` -} - -func (m *ExperimentSpec) Reset() { *m = ExperimentSpec{} } -func (m *ExperimentSpec) String() string { return proto.CompactTextString(m) } -func (*ExperimentSpec) ProtoMessage() {} -func (*ExperimentSpec) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } - -func (m *ExperimentSpec) GetParameterSpecs() *ExperimentSpec_ParameterSpecs { - if m != nil { - return m.ParameterSpecs - } - return nil -} - -func (m *ExperimentSpec) GetObjective() *ObjectiveSpec { - if m != nil { - return m.Objective - } - return nil -} - -func (m *ExperimentSpec) GetAlgorithm() *AlgorithmSpec { - if m != nil { - return m.Algorithm - } - return nil -} - -func (m *ExperimentSpec) GetTrialTemplate() string { - if m != nil { - return m.TrialTemplate - } - return "" -} - -func (m *ExperimentSpec) GetMetricsCollectorSpec() string { - if m != nil { - return m.MetricsCollectorSpec - } - return "" -} - -func (m *ExperimentSpec) GetParallelTrialCount() int32 { - if m != nil { - return m.ParallelTrialCount - } - return 0 -} - -func (m *ExperimentSpec) GetMaxTrialCount() int32 { - if m != nil { - return m.MaxTrialCount - } - return 0 -} - -func (m *ExperimentSpec) GetNasConfig() *NasConfig { - if m != nil { - return m.NasConfig - } - return nil -} - -// * -// List of ParameterSpec -type ExperimentSpec_ParameterSpecs struct { - Parameters []*ParameterSpec `protobuf:"bytes,1,rep,name=parameters" json:"parameters,omitempty"` -} - -func (m *ExperimentSpec_ParameterSpecs) Reset() { *m = ExperimentSpec_ParameterSpecs{} } -func (m *ExperimentSpec_ParameterSpecs) String() string { return proto.CompactTextString(m) } -func (*ExperimentSpec_ParameterSpecs) ProtoMessage() {} -func (*ExperimentSpec_ParameterSpecs) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{9, 0} -} - -func (m *ExperimentSpec_ParameterSpecs) GetParameters() []*ParameterSpec { - if m != nil { - return m.Parameters - } - return nil -} - -type Experiment struct { - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Spec *ExperimentSpec `protobuf:"bytes,2,opt,name=spec" json:"spec,omitempty"` -} - -func (m *Experiment) Reset() { *m = Experiment{} } -func (m *Experiment) String() string { return proto.CompactTextString(m) } -func (*Experiment) ProtoMessage() {} -func (*Experiment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } - -func (m *Experiment) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Experiment) GetSpec() *ExperimentSpec { - if m != nil { - return m.Spec - } - return nil -} - -type ParameterAssignment struct { - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` -} - -func (m *ParameterAssignment) Reset() { *m = ParameterAssignment{} } -func (m *ParameterAssignment) String() string { return proto.CompactTextString(m) } -func (*ParameterAssignment) ProtoMessage() {} -func (*ParameterAssignment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } - -func (m *ParameterAssignment) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *ParameterAssignment) GetValue() string { - if m != nil { - return m.Value - } - return "" -} - -type Metric struct { - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` -} - -func (m *Metric) Reset() { *m = Metric{} } -func (m *Metric) String() string { return proto.CompactTextString(m) } -func (*Metric) ProtoMessage() {} -func (*Metric) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } - -func (m *Metric) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Metric) GetValue() string { - if m != nil { - return m.Value - } - return "" -} - -type MetricLog struct { - TimeStamp string `protobuf:"bytes,1,opt,name=time_stamp,json=timeStamp" json:"time_stamp,omitempty"` - Metric *Metric `protobuf:"bytes,2,opt,name=metric" json:"metric,omitempty"` -} - -func (m *MetricLog) Reset() { *m = MetricLog{} } -func (m *MetricLog) String() string { return proto.CompactTextString(m) } -func (*MetricLog) ProtoMessage() {} -func (*MetricLog) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } - -func (m *MetricLog) GetTimeStamp() string { - if m != nil { - return m.TimeStamp - } - return "" -} - -func (m *MetricLog) GetMetric() *Metric { - if m != nil { - return m.Metric - } - return nil -} - -type Observation struct { - Metrics []*Metric `protobuf:"bytes,1,rep,name=metrics" json:"metrics,omitempty"` -} - -func (m *Observation) Reset() { *m = Observation{} } -func (m *Observation) String() string { return proto.CompactTextString(m) } -func (*Observation) ProtoMessage() {} -func (*Observation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } - -func (m *Observation) GetMetrics() []*Metric { - if m != nil { - return m.Metrics - } - return nil -} - -type ObservationLog struct { - MetricLogs []*MetricLog `protobuf:"bytes,1,rep,name=metric_logs,json=metricLogs" json:"metric_logs,omitempty"` -} - -func (m *ObservationLog) Reset() { *m = ObservationLog{} } -func (m *ObservationLog) String() string { return proto.CompactTextString(m) } -func (*ObservationLog) ProtoMessage() {} -func (*ObservationLog) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } - -func (m *ObservationLog) GetMetricLogs() []*MetricLog { - if m != nil { - return m.MetricLogs - } - return nil -} - -type TrialSpec struct { - ExperimentName string `protobuf:"bytes,1,opt,name=experiment_name,json=experimentName" json:"experiment_name,omitempty"` - Objective *ObjectiveSpec `protobuf:"bytes,2,opt,name=objective" json:"objective,omitempty"` - ParameterAssignments *TrialSpec_ParameterAssignments `protobuf:"bytes,3,opt,name=parameter_assignments,json=parameterAssignments" json:"parameter_assignments,omitempty"` - RunSpec string `protobuf:"bytes,4,opt,name=run_spec,json=runSpec" json:"run_spec,omitempty"` - MetricsCollectorSpec string `protobuf:"bytes,5,opt,name=metrics_collector_spec,json=metricsCollectorSpec" json:"metrics_collector_spec,omitempty"` -} - -func (m *TrialSpec) Reset() { *m = TrialSpec{} } -func (m *TrialSpec) String() string { return proto.CompactTextString(m) } -func (*TrialSpec) ProtoMessage() {} -func (*TrialSpec) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } - -func (m *TrialSpec) GetExperimentName() string { - if m != nil { - return m.ExperimentName - } - return "" -} - -func (m *TrialSpec) GetObjective() *ObjectiveSpec { - if m != nil { - return m.Objective - } - return nil -} - -func (m *TrialSpec) GetParameterAssignments() *TrialSpec_ParameterAssignments { - if m != nil { - return m.ParameterAssignments - } - return nil -} - -func (m *TrialSpec) GetRunSpec() string { - if m != nil { - return m.RunSpec - } - return "" -} - -func (m *TrialSpec) GetMetricsCollectorSpec() string { - if m != nil { - return m.MetricsCollectorSpec - } - return "" -} - -// * -// List of ParameterAssignment -type TrialSpec_ParameterAssignments struct { - Assignments []*ParameterAssignment `protobuf:"bytes,1,rep,name=assignments" json:"assignments,omitempty"` -} - -func (m *TrialSpec_ParameterAssignments) Reset() { *m = TrialSpec_ParameterAssignments{} } -func (m *TrialSpec_ParameterAssignments) String() string { return proto.CompactTextString(m) } -func (*TrialSpec_ParameterAssignments) ProtoMessage() {} -func (*TrialSpec_ParameterAssignments) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{16, 0} -} - -func (m *TrialSpec_ParameterAssignments) GetAssignments() []*ParameterAssignment { - if m != nil { - return m.Assignments - } - return nil -} - -type TrialStatus struct { - StartTime string `protobuf:"bytes,1,opt,name=start_time,json=startTime" json:"start_time,omitempty"` - CompletionTime string `protobuf:"bytes,2,opt,name=completion_time,json=completionTime" json:"completion_time,omitempty"` - Condition TrialStatus_TrialConditionType `protobuf:"varint,3,opt,name=condition,enum=api.v1.alpha3.TrialStatus_TrialConditionType" json:"condition,omitempty"` - Observation *Observation `protobuf:"bytes,4,opt,name=observation" json:"observation,omitempty"` -} - -func (m *TrialStatus) Reset() { *m = TrialStatus{} } -func (m *TrialStatus) String() string { return proto.CompactTextString(m) } -func (*TrialStatus) ProtoMessage() {} -func (*TrialStatus) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } - -func (m *TrialStatus) GetStartTime() string { - if m != nil { - return m.StartTime - } - return "" -} - -func (m *TrialStatus) GetCompletionTime() string { - if m != nil { - return m.CompletionTime - } - return "" -} - -func (m *TrialStatus) GetCondition() TrialStatus_TrialConditionType { - if m != nil { - return m.Condition - } - return TrialStatus_CREATED -} - -func (m *TrialStatus) GetObservation() *Observation { - if m != nil { - return m.Observation - } - return nil -} - -type Trial struct { - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Spec *TrialSpec `protobuf:"bytes,2,opt,name=spec" json:"spec,omitempty"` - Status *TrialStatus `protobuf:"bytes,3,opt,name=status" json:"status,omitempty"` -} - -func (m *Trial) Reset() { *m = Trial{} } -func (m *Trial) String() string { return proto.CompactTextString(m) } -func (*Trial) ProtoMessage() {} -func (*Trial) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } - -func (m *Trial) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Trial) GetSpec() *TrialSpec { - if m != nil { - return m.Spec - } - return nil -} - -func (m *Trial) GetStatus() *TrialStatus { - if m != nil { - return m.Status - } - return nil -} - -type ReportObservationLogRequest struct { - TrialName string `protobuf:"bytes,1,opt,name=trial_name,json=trialName" json:"trial_name,omitempty"` - ObservationLog *ObservationLog `protobuf:"bytes,2,opt,name=observation_log,json=observationLog" json:"observation_log,omitempty"` -} - -func (m *ReportObservationLogRequest) Reset() { *m = ReportObservationLogRequest{} } -func (m *ReportObservationLogRequest) String() string { return proto.CompactTextString(m) } -func (*ReportObservationLogRequest) ProtoMessage() {} -func (*ReportObservationLogRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } - -func (m *ReportObservationLogRequest) GetTrialName() string { - if m != nil { - return m.TrialName - } - return "" -} - -func (m *ReportObservationLogRequest) GetObservationLog() *ObservationLog { - if m != nil { - return m.ObservationLog - } - return nil -} - -type ReportObservationLogReply struct { -} - -func (m *ReportObservationLogReply) Reset() { *m = ReportObservationLogReply{} } -func (m *ReportObservationLogReply) String() string { return proto.CompactTextString(m) } -func (*ReportObservationLogReply) ProtoMessage() {} -func (*ReportObservationLogReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } - -type DeleteObservationLogRequest struct { - TrialName string `protobuf:"bytes,1,opt,name=trial_name,json=trialName" json:"trial_name,omitempty"` -} - -func (m *DeleteObservationLogRequest) Reset() { *m = DeleteObservationLogRequest{} } -func (m *DeleteObservationLogRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteObservationLogRequest) ProtoMessage() {} -func (*DeleteObservationLogRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } - -func (m *DeleteObservationLogRequest) GetTrialName() string { - if m != nil { - return m.TrialName - } - return "" -} - -type DeleteObservationLogReply struct { -} - -func (m *DeleteObservationLogReply) Reset() { *m = DeleteObservationLogReply{} } -func (m *DeleteObservationLogReply) String() string { return proto.CompactTextString(m) } -func (*DeleteObservationLogReply) ProtoMessage() {} -func (*DeleteObservationLogReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } - -type GetObservationLogRequest struct { - TrialName string `protobuf:"bytes,1,opt,name=trial_name,json=trialName" json:"trial_name,omitempty"` - MetricName string `protobuf:"bytes,2,opt,name=metric_name,json=metricName" json:"metric_name,omitempty"` - StartTime string `protobuf:"bytes,3,opt,name=start_time,json=startTime" json:"start_time,omitempty"` - EndTime string `protobuf:"bytes,4,opt,name=end_time,json=endTime" json:"end_time,omitempty"` -} - -func (m *GetObservationLogRequest) Reset() { *m = GetObservationLogRequest{} } -func (m *GetObservationLogRequest) String() string { return proto.CompactTextString(m) } -func (*GetObservationLogRequest) ProtoMessage() {} -func (*GetObservationLogRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } - -func (m *GetObservationLogRequest) GetTrialName() string { - if m != nil { - return m.TrialName - } - return "" -} - -func (m *GetObservationLogRequest) GetMetricName() string { - if m != nil { - return m.MetricName - } - return "" -} - -func (m *GetObservationLogRequest) GetStartTime() string { - if m != nil { - return m.StartTime - } - return "" -} - -func (m *GetObservationLogRequest) GetEndTime() string { - if m != nil { - return m.EndTime - } - return "" -} - -type GetObservationLogReply struct { - ObservationLog *ObservationLog `protobuf:"bytes,1,opt,name=observation_log,json=observationLog" json:"observation_log,omitempty"` -} - -func (m *GetObservationLogReply) Reset() { *m = GetObservationLogReply{} } -func (m *GetObservationLogReply) String() string { return proto.CompactTextString(m) } -func (*GetObservationLogReply) ProtoMessage() {} -func (*GetObservationLogReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } - -func (m *GetObservationLogReply) GetObservationLog() *ObservationLog { - if m != nil { - return m.ObservationLog - } - return nil -} - -type GetSuggestionsRequest struct { - Experiment *Experiment `protobuf:"bytes,1,opt,name=experiment" json:"experiment,omitempty"` - Trials []*Trial `protobuf:"bytes,2,rep,name=trials" json:"trials,omitempty"` - RequestNumber int32 `protobuf:"varint,3,opt,name=request_number,json=requestNumber" json:"request_number,omitempty"` -} - -func (m *GetSuggestionsRequest) Reset() { *m = GetSuggestionsRequest{} } -func (m *GetSuggestionsRequest) String() string { return proto.CompactTextString(m) } -func (*GetSuggestionsRequest) ProtoMessage() {} -func (*GetSuggestionsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } - -func (m *GetSuggestionsRequest) GetExperiment() *Experiment { - if m != nil { - return m.Experiment - } - return nil -} - -func (m *GetSuggestionsRequest) GetTrials() []*Trial { - if m != nil { - return m.Trials - } - return nil -} - -func (m *GetSuggestionsRequest) GetRequestNumber() int32 { - if m != nil { - return m.RequestNumber - } - return 0 -} - -type GetSuggestionsReply struct { - ParameterAssignments []*GetSuggestionsReply_ParameterAssignments `protobuf:"bytes,1,rep,name=parameter_assignments,json=parameterAssignments" json:"parameter_assignments,omitempty"` - Algorithm *AlgorithmSpec `protobuf:"bytes,2,opt,name=algorithm" json:"algorithm,omitempty"` -} - -func (m *GetSuggestionsReply) Reset() { *m = GetSuggestionsReply{} } -func (m *GetSuggestionsReply) String() string { return proto.CompactTextString(m) } -func (*GetSuggestionsReply) ProtoMessage() {} -func (*GetSuggestionsReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } - -func (m *GetSuggestionsReply) GetParameterAssignments() []*GetSuggestionsReply_ParameterAssignments { - if m != nil { - return m.ParameterAssignments - } - return nil -} - -func (m *GetSuggestionsReply) GetAlgorithm() *AlgorithmSpec { - if m != nil { - return m.Algorithm - } - return nil -} - -type GetSuggestionsReply_ParameterAssignments struct { - Assignments []*ParameterAssignment `protobuf:"bytes,1,rep,name=assignments" json:"assignments,omitempty"` -} - -func (m *GetSuggestionsReply_ParameterAssignments) Reset() { - *m = GetSuggestionsReply_ParameterAssignments{} -} -func (m *GetSuggestionsReply_ParameterAssignments) String() string { return proto.CompactTextString(m) } -func (*GetSuggestionsReply_ParameterAssignments) ProtoMessage() {} -func (*GetSuggestionsReply_ParameterAssignments) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{26, 0} -} - -func (m *GetSuggestionsReply_ParameterAssignments) GetAssignments() []*ParameterAssignment { - if m != nil { - return m.Assignments - } - return nil -} - -type ValidateAlgorithmSettingsRequest struct { - Experiment *Experiment `protobuf:"bytes,1,opt,name=experiment" json:"experiment,omitempty"` -} - -func (m *ValidateAlgorithmSettingsRequest) Reset() { *m = ValidateAlgorithmSettingsRequest{} } -func (m *ValidateAlgorithmSettingsRequest) String() string { return proto.CompactTextString(m) } -func (*ValidateAlgorithmSettingsRequest) ProtoMessage() {} -func (*ValidateAlgorithmSettingsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{27} -} - -func (m *ValidateAlgorithmSettingsRequest) GetExperiment() *Experiment { - if m != nil { - return m.Experiment - } - return nil -} - -// * -// Return INVALID_ARGUMENT Error if Algorithm Settings are not Valid -type ValidateAlgorithmSettingsReply struct { -} - -func (m *ValidateAlgorithmSettingsReply) Reset() { *m = ValidateAlgorithmSettingsReply{} } -func (m *ValidateAlgorithmSettingsReply) String() string { return proto.CompactTextString(m) } -func (*ValidateAlgorithmSettingsReply) ProtoMessage() {} -func (*ValidateAlgorithmSettingsReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } - -func init() { - proto.RegisterType((*FeasibleSpace)(nil), "api.v1.alpha3.FeasibleSpace") - proto.RegisterType((*ParameterSpec)(nil), "api.v1.alpha3.ParameterSpec") - proto.RegisterType((*ObjectiveSpec)(nil), "api.v1.alpha3.ObjectiveSpec") - proto.RegisterType((*AlgorithmSetting)(nil), "api.v1.alpha3.AlgorithmSetting") - proto.RegisterType((*EarlyStoppingSpec)(nil), "api.v1.alpha3.EarlyStoppingSpec") - proto.RegisterType((*AlgorithmSpec)(nil), "api.v1.alpha3.AlgorithmSpec") - proto.RegisterType((*NasConfig)(nil), "api.v1.alpha3.NasConfig") - proto.RegisterType((*NasConfig_Operations)(nil), "api.v1.alpha3.NasConfig.Operations") - proto.RegisterType((*GraphConfig)(nil), "api.v1.alpha3.GraphConfig") - proto.RegisterType((*Operation)(nil), "api.v1.alpha3.Operation") - proto.RegisterType((*Operation_ParameterSpecs)(nil), "api.v1.alpha3.Operation.ParameterSpecs") - proto.RegisterType((*ExperimentSpec)(nil), "api.v1.alpha3.ExperimentSpec") - proto.RegisterType((*ExperimentSpec_ParameterSpecs)(nil), "api.v1.alpha3.ExperimentSpec.ParameterSpecs") - proto.RegisterType((*Experiment)(nil), "api.v1.alpha3.Experiment") - proto.RegisterType((*ParameterAssignment)(nil), "api.v1.alpha3.ParameterAssignment") - proto.RegisterType((*Metric)(nil), "api.v1.alpha3.Metric") - proto.RegisterType((*MetricLog)(nil), "api.v1.alpha3.MetricLog") - proto.RegisterType((*Observation)(nil), "api.v1.alpha3.Observation") - proto.RegisterType((*ObservationLog)(nil), "api.v1.alpha3.ObservationLog") - proto.RegisterType((*TrialSpec)(nil), "api.v1.alpha3.TrialSpec") - proto.RegisterType((*TrialSpec_ParameterAssignments)(nil), "api.v1.alpha3.TrialSpec.ParameterAssignments") - proto.RegisterType((*TrialStatus)(nil), "api.v1.alpha3.TrialStatus") - proto.RegisterType((*Trial)(nil), "api.v1.alpha3.Trial") - proto.RegisterType((*ReportObservationLogRequest)(nil), "api.v1.alpha3.ReportObservationLogRequest") - proto.RegisterType((*ReportObservationLogReply)(nil), "api.v1.alpha3.ReportObservationLogReply") - proto.RegisterType((*DeleteObservationLogRequest)(nil), "api.v1.alpha3.DeleteObservationLogRequest") - proto.RegisterType((*DeleteObservationLogReply)(nil), "api.v1.alpha3.DeleteObservationLogReply") - proto.RegisterType((*GetObservationLogRequest)(nil), "api.v1.alpha3.GetObservationLogRequest") - proto.RegisterType((*GetObservationLogReply)(nil), "api.v1.alpha3.GetObservationLogReply") - proto.RegisterType((*GetSuggestionsRequest)(nil), "api.v1.alpha3.GetSuggestionsRequest") - proto.RegisterType((*GetSuggestionsReply)(nil), "api.v1.alpha3.GetSuggestionsReply") - proto.RegisterType((*GetSuggestionsReply_ParameterAssignments)(nil), "api.v1.alpha3.GetSuggestionsReply.ParameterAssignments") - proto.RegisterType((*ValidateAlgorithmSettingsRequest)(nil), "api.v1.alpha3.ValidateAlgorithmSettingsRequest") - proto.RegisterType((*ValidateAlgorithmSettingsReply)(nil), "api.v1.alpha3.ValidateAlgorithmSettingsReply") - proto.RegisterEnum("api.v1.alpha3.ParameterType", ParameterType_name, ParameterType_value) - proto.RegisterEnum("api.v1.alpha3.ObjectiveType", ObjectiveType_name, ObjectiveType_value) - proto.RegisterEnum("api.v1.alpha3.TrialStatus_TrialConditionType", TrialStatus_TrialConditionType_name, TrialStatus_TrialConditionType_value) -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// Client API for Manager service - -type ManagerClient interface { - // * - // Report a log of Observations for a Trial. - // The log consists of timestamp and value of metric. - // Katib store every log of metrics. - // You can see accuracy curve or other metric logs on UI. - ReportObservationLog(ctx context.Context, in *ReportObservationLogRequest, opts ...grpc.CallOption) (*ReportObservationLogReply, error) - // * - // Get all log of Observations for a Trial. - GetObservationLog(ctx context.Context, in *GetObservationLogRequest, opts ...grpc.CallOption) (*GetObservationLogReply, error) - // * - // Delete all log of Observations for a Trial. - DeleteObservationLog(ctx context.Context, in *DeleteObservationLogRequest, opts ...grpc.CallOption) (*DeleteObservationLogReply, error) -} - -type managerClient struct { - cc *grpc.ClientConn -} - -func NewManagerClient(cc *grpc.ClientConn) ManagerClient { - return &managerClient{cc} -} - -func (c *managerClient) ReportObservationLog(ctx context.Context, in *ReportObservationLogRequest, opts ...grpc.CallOption) (*ReportObservationLogReply, error) { - out := new(ReportObservationLogReply) - err := grpc.Invoke(ctx, "/api.v1.alpha3.Manager/ReportObservationLog", in, out, c.cc, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managerClient) GetObservationLog(ctx context.Context, in *GetObservationLogRequest, opts ...grpc.CallOption) (*GetObservationLogReply, error) { - out := new(GetObservationLogReply) - err := grpc.Invoke(ctx, "/api.v1.alpha3.Manager/GetObservationLog", in, out, c.cc, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managerClient) DeleteObservationLog(ctx context.Context, in *DeleteObservationLogRequest, opts ...grpc.CallOption) (*DeleteObservationLogReply, error) { - out := new(DeleteObservationLogReply) - err := grpc.Invoke(ctx, "/api.v1.alpha3.Manager/DeleteObservationLog", in, out, c.cc, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// Server API for Manager service - -type ManagerServer interface { - // * - // Report a log of Observations for a Trial. - // The log consists of timestamp and value of metric. - // Katib store every log of metrics. - // You can see accuracy curve or other metric logs on UI. - ReportObservationLog(context.Context, *ReportObservationLogRequest) (*ReportObservationLogReply, error) - // * - // Get all log of Observations for a Trial. - GetObservationLog(context.Context, *GetObservationLogRequest) (*GetObservationLogReply, error) - // * - // Delete all log of Observations for a Trial. - DeleteObservationLog(context.Context, *DeleteObservationLogRequest) (*DeleteObservationLogReply, error) -} - -func RegisterManagerServer(s *grpc.Server, srv ManagerServer) { - s.RegisterService(&_Manager_serviceDesc, srv) -} - -func _Manager_ReportObservationLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ReportObservationLogRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagerServer).ReportObservationLog(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/api.v1.alpha3.Manager/ReportObservationLog", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagerServer).ReportObservationLog(ctx, req.(*ReportObservationLogRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Manager_GetObservationLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetObservationLogRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagerServer).GetObservationLog(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/api.v1.alpha3.Manager/GetObservationLog", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagerServer).GetObservationLog(ctx, req.(*GetObservationLogRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Manager_DeleteObservationLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteObservationLogRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagerServer).DeleteObservationLog(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/api.v1.alpha3.Manager/DeleteObservationLog", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagerServer).DeleteObservationLog(ctx, req.(*DeleteObservationLogRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Manager_serviceDesc = grpc.ServiceDesc{ - ServiceName: "api.v1.alpha3.Manager", - HandlerType: (*ManagerServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ReportObservationLog", - Handler: _Manager_ReportObservationLog_Handler, - }, - { - MethodName: "GetObservationLog", - Handler: _Manager_GetObservationLog_Handler, - }, - { - MethodName: "DeleteObservationLog", - Handler: _Manager_DeleteObservationLog_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "api.proto", -} - -// Client API for Suggestion service - -type SuggestionClient interface { - GetSuggestions(ctx context.Context, in *GetSuggestionsRequest, opts ...grpc.CallOption) (*GetSuggestionsReply, error) - ValidateAlgorithmSettings(ctx context.Context, in *ValidateAlgorithmSettingsRequest, opts ...grpc.CallOption) (*ValidateAlgorithmSettingsReply, error) -} - -type suggestionClient struct { - cc *grpc.ClientConn -} - -func NewSuggestionClient(cc *grpc.ClientConn) SuggestionClient { - return &suggestionClient{cc} -} - -func (c *suggestionClient) GetSuggestions(ctx context.Context, in *GetSuggestionsRequest, opts ...grpc.CallOption) (*GetSuggestionsReply, error) { - out := new(GetSuggestionsReply) - err := grpc.Invoke(ctx, "/api.v1.alpha3.Suggestion/GetSuggestions", in, out, c.cc, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *suggestionClient) ValidateAlgorithmSettings(ctx context.Context, in *ValidateAlgorithmSettingsRequest, opts ...grpc.CallOption) (*ValidateAlgorithmSettingsReply, error) { - out := new(ValidateAlgorithmSettingsReply) - err := grpc.Invoke(ctx, "/api.v1.alpha3.Suggestion/ValidateAlgorithmSettings", in, out, c.cc, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// Server API for Suggestion service - -type SuggestionServer interface { - GetSuggestions(context.Context, *GetSuggestionsRequest) (*GetSuggestionsReply, error) - ValidateAlgorithmSettings(context.Context, *ValidateAlgorithmSettingsRequest) (*ValidateAlgorithmSettingsReply, error) -} - -func RegisterSuggestionServer(s *grpc.Server, srv SuggestionServer) { - s.RegisterService(&_Suggestion_serviceDesc, srv) -} - -func _Suggestion_GetSuggestions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetSuggestionsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SuggestionServer).GetSuggestions(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/api.v1.alpha3.Suggestion/GetSuggestions", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SuggestionServer).GetSuggestions(ctx, req.(*GetSuggestionsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Suggestion_ValidateAlgorithmSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ValidateAlgorithmSettingsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SuggestionServer).ValidateAlgorithmSettings(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/api.v1.alpha3.Suggestion/ValidateAlgorithmSettings", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SuggestionServer).ValidateAlgorithmSettings(ctx, req.(*ValidateAlgorithmSettingsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Suggestion_serviceDesc = grpc.ServiceDesc{ - ServiceName: "api.v1.alpha3.Suggestion", - HandlerType: (*SuggestionServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetSuggestions", - Handler: _Suggestion_GetSuggestions_Handler, - }, - { - MethodName: "ValidateAlgorithmSettings", - Handler: _Suggestion_ValidateAlgorithmSettings_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "api.proto", -} - -// Client API for EarlyStopping service - -type EarlyStoppingClient interface { -} - -type earlyStoppingClient struct { - cc *grpc.ClientConn -} - -func NewEarlyStoppingClient(cc *grpc.ClientConn) EarlyStoppingClient { - return &earlyStoppingClient{cc} -} - -// Server API for EarlyStopping service - -type EarlyStoppingServer interface { -} - -func RegisterEarlyStoppingServer(s *grpc.Server, srv EarlyStoppingServer) { - s.RegisterService(&_EarlyStopping_serviceDesc, srv) -} - -var _EarlyStopping_serviceDesc = grpc.ServiceDesc{ - ServiceName: "api.v1.alpha3.EarlyStopping", - HandlerType: (*EarlyStoppingServer)(nil), - Methods: []grpc.MethodDesc{}, - Streams: []grpc.StreamDesc{}, - Metadata: "api.proto", -} - -func init() { proto.RegisterFile("api.proto", fileDescriptor0) } - -var fileDescriptor0 = []byte{ - // 1646 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0xdd, 0x72, 0x1b, 0x4b, - 0x11, 0xce, 0x4a, 0xf2, 0xcf, 0xb6, 0x2c, 0x59, 0x1e, 0xcb, 0x07, 0x59, 0x39, 0x87, 0x98, 0x85, - 0x43, 0x5c, 0xa9, 0x44, 0xe6, 0xe8, 0x50, 0x09, 0xa1, 0x0c, 0x94, 0x91, 0x14, 0x97, 0xca, 0xb6, - 0xec, 0x1a, 0xc9, 0x40, 0x02, 0xd4, 0x32, 0x96, 0x27, 0xca, 0x52, 0xfb, 0xc7, 0xce, 0xc8, 0x65, - 0x43, 0x71, 0x05, 0x8f, 0xc0, 0x2d, 0xc5, 0x25, 0x57, 0x3c, 0x04, 0x55, 0x5c, 0x71, 0x0d, 0xbc, - 0x01, 0xef, 0x41, 0xcd, 0xcc, 0x6a, 0x77, 0xb5, 0xda, 0xb5, 0x13, 0x93, 0x73, 0x37, 0xd3, 0xfd, - 0x75, 0x4f, 0x77, 0x4f, 0xf7, 0xb7, 0x23, 0x81, 0x4e, 0x7c, 0xab, 0xe5, 0x07, 0x1e, 0xf7, 0x50, - 0x45, 0x2c, 0xaf, 0xbe, 0x68, 0x11, 0xdb, 0x7f, 0x47, 0xbe, 0x6c, 0x7e, 0x3a, 0xf1, 0xbc, 0x89, - 0x4d, 0xf7, 0x88, 0x6f, 0xed, 0x11, 0xd7, 0xf5, 0x38, 0xe1, 0x96, 0xe7, 0x32, 0x05, 0x36, 0x7e, - 0x0e, 0x95, 0x57, 0x94, 0x30, 0xeb, 0xc2, 0xa6, 0x43, 0x9f, 0x8c, 0x29, 0xaa, 0x41, 0xd1, 0x21, - 0xd7, 0x0d, 0x6d, 0x47, 0xdb, 0xd5, 0xb1, 0x58, 0x4a, 0x89, 0xe5, 0x36, 0x0a, 0xa1, 0xc4, 0x72, - 0x11, 0x82, 0x92, 0x6d, 0x31, 0xde, 0x28, 0xee, 0x14, 0x77, 0x75, 0x2c, 0xd7, 0x42, 0xc6, 0x38, - 0xf5, 0x1b, 0x25, 0x09, 0x93, 0x6b, 0xe3, 0x6f, 0x1a, 0x54, 0xce, 0x48, 0x40, 0x1c, 0xca, 0x69, - 0x30, 0xf4, 0xe9, 0x58, 0xa0, 0x5c, 0xe2, 0xd0, 0xd0, 0xbd, 0x5c, 0xa3, 0x0e, 0x54, 0xfd, 0x19, - 0xc8, 0xe4, 0x37, 0x3e, 0x95, 0x47, 0x55, 0xdb, 0x9f, 0xb6, 0xe6, 0x12, 0x69, 0x45, 0x9e, 0x46, - 0x37, 0x3e, 0xc5, 0x15, 0x3f, 0xb9, 0x15, 0x4e, 0xde, 0x86, 0x79, 0x98, 0x4c, 0x24, 0xd2, 0x28, - 0xee, 0x68, 0xbb, 0xe5, 0x05, 0x27, 0x73, 0xc9, 0xe2, 0xca, 0xdb, 0xe4, 0xd6, 0xf8, 0xbb, 0x06, - 0x95, 0xd3, 0x8b, 0x5f, 0xd3, 0x31, 0xb7, 0xae, 0xa8, 0x8c, 0xf7, 0x3b, 0x50, 0x92, 0x11, 0x69, - 0x99, 0x11, 0x45, 0x58, 0x19, 0x91, 0x44, 0x8a, 0x0c, 0x27, 0x1e, 0xb1, 0x65, 0x0e, 0x1a, 0x96, - 0x6b, 0xd4, 0x86, 0x2d, 0x6f, 0x06, 0x35, 0x1d, 0xca, 0x03, 0x6b, 0x6c, 0xca, 0x32, 0x14, 0x65, - 0x19, 0x36, 0x23, 0xe5, 0x89, 0xd4, 0x0d, 0x44, 0x55, 0x9e, 0xc3, 0xd7, 0xc8, 0xe5, 0xa5, 0x25, - 0xee, 0x8a, 0xd8, 0x49, 0x23, 0xd6, 0x28, 0xc9, 0xb2, 0x6f, 0xc5, 0xea, 0xd8, 0x8c, 0x19, 0xfb, - 0x50, 0x3b, 0xb0, 0x27, 0x5e, 0x60, 0xf1, 0x77, 0xce, 0x90, 0x72, 0x6e, 0xb9, 0x93, 0xcc, 0xaa, - 0xd7, 0x61, 0xe9, 0x8a, 0xd8, 0x53, 0x1a, 0xde, 0xab, 0xda, 0x18, 0x9b, 0xb0, 0xd1, 0x23, 0x81, - 0x7d, 0x33, 0xe4, 0x9e, 0xef, 0x5b, 0xee, 0x44, 0x14, 0xc1, 0xf8, 0x8f, 0x06, 0x95, 0xd8, 0xa7, - 0x28, 0xcb, 0xe7, 0x50, 0x25, 0x33, 0x81, 0x99, 0x70, 0x5d, 0x89, 0xa4, 0x32, 0x87, 0x63, 0xd8, - 0x88, 0x61, 0x4c, 0x05, 0xd3, 0x28, 0xec, 0x14, 0x77, 0xcb, 0xed, 0x47, 0xa9, 0x52, 0xa6, 0x63, - 0xc6, 0x35, 0x92, 0xce, 0xe2, 0x0c, 0x36, 0xa9, 0x88, 0xcd, 0x64, 0x61, 0x70, 0x26, 0xf3, 0xe9, - 0x38, 0xbc, 0xe7, 0x9d, 0x94, 0xbf, 0x85, 0x2c, 0xf0, 0x06, 0x5d, 0x48, 0xec, 0xdf, 0x1a, 0xe8, - 0x03, 0xc2, 0x3a, 0x9e, 0xfb, 0xd6, 0x9a, 0xa0, 0x1f, 0xc0, 0xda, 0x24, 0x20, 0xfe, 0x3b, 0x73, - 0x2c, 0xf7, 0x32, 0xa5, 0x72, 0xbb, 0x99, 0x72, 0x7c, 0x28, 0x20, 0xca, 0x02, 0x97, 0x27, 0xf1, - 0x06, 0x75, 0x00, 0x3c, 0x9f, 0x06, 0x6a, 0xba, 0x64, 0x55, 0xcb, 0xed, 0x6f, 0xa6, 0x8c, 0xa3, - 0xc3, 0x5a, 0xa7, 0x11, 0x14, 0x27, 0xcc, 0x9a, 0x5d, 0x80, 0x58, 0x83, 0x9e, 0x83, 0x1e, 0xe9, - 0x1a, 0x9a, 0xac, 0x5b, 0x23, 0xdd, 0x82, 0x33, 0x3d, 0x8e, 0xa1, 0x86, 0x0f, 0xe5, 0x44, 0x98, - 0xe8, 0x33, 0x00, 0x77, 0xea, 0x98, 0x36, 0xb9, 0xa1, 0x01, 0x93, 0x69, 0x2d, 0x61, 0xdd, 0x9d, - 0x3a, 0xc7, 0x52, 0x80, 0x1e, 0x41, 0xd9, 0x72, 0xfd, 0x29, 0x37, 0x99, 0xf5, 0x5b, 0xca, 0xe4, - 0xfd, 0x2c, 0x61, 0x90, 0xa2, 0xa1, 0x90, 0xa0, 0x6f, 0xc0, 0x9a, 0x37, 0xe5, 0x31, 0xa2, 0x28, - 0x11, 0x65, 0x25, 0x93, 0x10, 0xe3, 0x5f, 0x1a, 0xe8, 0x51, 0x28, 0xa2, 0x3d, 0xa2, 0x60, 0xcc, - 0x68, 0x7e, 0x74, 0x5c, 0x89, 0xa4, 0x72, 0x66, 0xcf, 0x60, 0x3d, 0x1e, 0x7c, 0x71, 0x97, 0xb3, - 0xb2, 0x3d, 0xce, 0x4b, 0xb2, 0x35, 0xc7, 0x26, 0x0c, 0xc7, 0xc4, 0x21, 0xf7, 0xcd, 0x01, 0x54, - 0xe7, 0x11, 0x68, 0x1f, 0x20, 0xc2, 0xb0, 0xb0, 0x86, 0xb9, 0xc4, 0x22, 0xfb, 0x24, 0x81, 0x37, - 0xfe, 0x52, 0x82, 0x6a, 0xef, 0xda, 0xa7, 0x81, 0xe5, 0x50, 0x97, 0xcb, 0xd6, 0x3f, 0x5f, 0x0c, - 0x5a, 0x35, 0xca, 0xd3, 0x74, 0x07, 0xce, 0xd9, 0xdd, 0x11, 0x39, 0xfa, 0x3e, 0xe8, 0x11, 0x0b, - 0x84, 0x55, 0xc8, 0x65, 0x1b, 0x19, 0x66, 0x0c, 0x17, 0xb6, 0xd1, 0xb0, 0xe4, 0xd0, 0xde, 0xdc, - 0xf8, 0xe2, 0x18, 0x2e, 0xae, 0x8a, 0x07, 0x16, 0xb1, 0x4d, 0x4e, 0x1d, 0xdf, 0x26, 0x9c, 0x86, - 0x04, 0x5e, 0x91, 0xd2, 0x51, 0x28, 0x44, 0xdf, 0x85, 0x4f, 0x14, 0x05, 0x31, 0x73, 0xec, 0xd9, - 0x36, 0x1d, 0x73, 0x4f, 0x65, 0xdf, 0x58, 0x92, 0xf0, 0x7a, 0xa8, 0xed, 0xcc, 0x94, 0x21, 0x7b, - 0xd6, 0x45, 0x9a, 0xb6, 0x4d, 0x6d, 0x53, 0x9d, 0x32, 0xf6, 0xa6, 0x2e, 0x6f, 0x2c, 0xcb, 0x16, - 0x44, 0x33, 0xdd, 0x48, 0xa8, 0x3a, 0x42, 0x83, 0xbe, 0x0d, 0xeb, 0x0e, 0xb9, 0x9e, 0x03, 0xaf, - 0x48, 0x70, 0xc5, 0x21, 0xd7, 0x09, 0xdc, 0x0b, 0x00, 0x97, 0xb0, 0xd9, 0xa4, 0xae, 0xca, 0x9c, - 0x1b, 0x79, 0xc3, 0x86, 0x75, 0x77, 0xb6, 0xfc, 0xe8, 0x1d, 0x32, 0x04, 0x88, 0x2f, 0x3a, 0x93, - 0x68, 0xbf, 0x80, 0x92, 0x2c, 0x94, 0xba, 0xd4, 0xcf, 0x6e, 0xed, 0x12, 0x2c, 0xa1, 0xc6, 0x8f, - 0x60, 0x33, 0x3a, 0xf1, 0x80, 0x31, 0x6b, 0xe2, 0xe6, 0x7a, 0xcf, 0xa6, 0xf1, 0x36, 0x2c, 0xab, - 0x6f, 0xc2, 0x07, 0xd8, 0xbc, 0x06, 0x5d, 0xd9, 0x1c, 0x7b, 0x92, 0x32, 0xb8, 0xe5, 0x50, 0x93, - 0x71, 0xe2, 0xf8, 0xa1, 0xb1, 0x2e, 0x24, 0x43, 0x21, 0x40, 0xcf, 0x60, 0x59, 0x5d, 0x78, 0x98, - 0xd5, 0x56, 0x2a, 0x2b, 0xe5, 0x08, 0x87, 0x20, 0xe3, 0x87, 0x50, 0x3e, 0xbd, 0x60, 0x34, 0xb8, - 0x52, 0xf4, 0xb0, 0x07, 0x2b, 0x61, 0xbb, 0x84, 0xe5, 0xce, 0x31, 0x9f, 0xa1, 0x8c, 0x23, 0xa8, - 0x26, 0xec, 0x45, 0x7c, 0x2f, 0xa1, 0x1c, 0x7e, 0x12, 0x6d, 0x6f, 0xc2, 0x72, 0xb8, 0x31, 0x4a, - 0x07, 0x83, 0x33, 0x5b, 0x32, 0xe3, 0x0f, 0x45, 0xd0, 0x65, 0x27, 0xc9, 0x16, 0x7d, 0x0c, 0xeb, - 0x34, 0xba, 0x82, 0xe4, 0xa7, 0xac, 0x1a, 0x8b, 0xe5, 0xb7, 0xec, 0xff, 0x19, 0xd0, 0x0b, 0xd8, - 0x8a, 0x39, 0x83, 0x44, 0x17, 0xca, 0xc2, 0x61, 0x7d, 0x96, 0xf2, 0x13, 0x45, 0xd7, 0xca, 0xe8, - 0x02, 0x86, 0xeb, 0x7e, 0x86, 0x14, 0x6d, 0xc3, 0x6a, 0x30, 0x75, 0xd5, 0x4c, 0xaa, 0x11, 0x5e, - 0x09, 0xa6, 0xae, 0xcc, 0xf1, 0x5e, 0xc3, 0xdb, 0xfc, 0x05, 0xd4, 0xb3, 0x8e, 0x47, 0x5d, 0x28, - 0x27, 0x53, 0x50, 0xa5, 0x37, 0xf2, 0x06, 0x26, 0xb6, 0xc4, 0x49, 0x33, 0xe3, 0x1f, 0x05, 0x28, - 0xab, 0x3c, 0x39, 0xe1, 0x53, 0x26, 0x1a, 0x8e, 0x71, 0x12, 0x70, 0x53, 0x34, 0xd9, 0xac, 0xe1, - 0xa4, 0x64, 0x64, 0x39, 0x54, 0x5c, 0xd3, 0xd8, 0x73, 0x7c, 0x9b, 0xaa, 0x4f, 0x8a, 0xc0, 0xa8, - 0xe6, 0xad, 0xc6, 0x62, 0x09, 0x3c, 0x02, 0x7d, 0xec, 0xb9, 0xea, 0x61, 0x24, 0xcb, 0x5b, 0xcd, - 0x29, 0xaf, 0x3c, 0xb6, 0x15, 0x52, 0x4a, 0x68, 0x20, 0x9f, 0x71, 0xb1, 0x3d, 0xda, 0x87, 0xb2, - 0x17, 0xf7, 0x9d, 0x2c, 0xeb, 0xe2, 0x83, 0x20, 0xd1, 0x99, 0x38, 0x09, 0x37, 0x2e, 0x00, 0x2d, - 0xba, 0x47, 0x65, 0x58, 0xe9, 0xe0, 0xde, 0xc1, 0xa8, 0xd7, 0xad, 0x3d, 0x10, 0x1b, 0x7c, 0x3e, - 0x18, 0xf4, 0x07, 0x87, 0x35, 0x0d, 0x55, 0x40, 0x1f, 0x9e, 0x77, 0x3a, 0xbd, 0x5e, 0xb7, 0xd7, - 0xad, 0x15, 0x10, 0xc0, 0xf2, 0x51, 0xff, 0xf8, 0xb8, 0xd7, 0xad, 0x15, 0xc5, 0xfa, 0xd5, 0x41, - 0x5f, 0xac, 0x4b, 0xc2, 0xe6, 0x7c, 0x70, 0x34, 0x38, 0xfd, 0xe9, 0xa0, 0xb6, 0x64, 0xfc, 0x1e, - 0x96, 0xe4, 0x19, 0x99, 0x73, 0xfe, 0x74, 0x8e, 0x79, 0x1a, 0x79, 0x5d, 0xa6, 0x48, 0x07, 0xb5, - 0x61, 0x99, 0xc9, 0xa2, 0x84, 0x5d, 0xd9, 0xcc, 0x2f, 0x1b, 0x0e, 0x91, 0xc6, 0x1f, 0x35, 0x78, - 0x88, 0xa9, 0xef, 0x05, 0x7c, 0x7e, 0x3e, 0x31, 0xfd, 0xcd, 0x94, 0x32, 0x2e, 0x69, 0x44, 0x52, - 0x79, 0x22, 0x36, 0x5d, 0x4a, 0xe4, 0x4c, 0xbd, 0x82, 0xf5, 0x44, 0xc1, 0xc4, 0x28, 0xe7, 0xb0, - 0x64, 0xca, 0x7b, 0xd5, 0x9b, 0xdb, 0x1b, 0x0f, 0x61, 0x3b, 0x3b, 0x0a, 0xdf, 0xbe, 0x31, 0xf6, - 0xe1, 0x61, 0x97, 0xda, 0x94, 0xd3, 0xfb, 0x84, 0x28, 0x5c, 0x67, 0x5b, 0x0b, 0xd7, 0x7f, 0xd2, - 0xa0, 0x71, 0x48, 0xef, 0x97, 0xfb, 0xa3, 0x88, 0xc1, 0xa4, 0x5e, 0x75, 0x73, 0xc8, 0x53, 0x12, - 0x30, 0x3f, 0x11, 0xc5, 0xf4, 0x44, 0x6c, 0xc3, 0x2a, 0x75, 0x2f, 0x95, 0x32, 0x9c, 0x77, 0xea, - 0x5e, 0x0a, 0x95, 0xf1, 0x2b, 0xf8, 0x24, 0x23, 0x2a, 0xdf, 0xbe, 0xc9, 0x2a, 0xb8, 0x76, 0x9f, - 0x82, 0xff, 0x55, 0x83, 0xad, 0x43, 0xca, 0x87, 0xd3, 0xc9, 0x84, 0x32, 0xf5, 0x8a, 0x0d, 0xb3, - 0x7e, 0x09, 0x10, 0x13, 0x67, 0xe8, 0x7c, 0x3b, 0xf7, 0x9b, 0x87, 0x13, 0x60, 0xf4, 0x14, 0x96, - 0x65, 0x79, 0x58, 0xf8, 0x13, 0xa1, 0x9e, 0xd5, 0x80, 0x38, 0xc4, 0x88, 0x87, 0x4b, 0xa0, 0xce, - 0x34, 0xdd, 0xa9, 0x73, 0x41, 0x03, 0x59, 0xa2, 0x25, 0x5c, 0x09, 0xa5, 0x03, 0x29, 0x34, 0xfe, - 0x5c, 0x80, 0xcd, 0x74, 0xa4, 0xa2, 0x12, 0x76, 0x1e, 0x25, 0x2b, 0x3e, 0x7b, 0x91, 0x7e, 0xf5, - 0x2f, 0xba, 0xf8, 0x10, 0x72, 0x9e, 0x7b, 0xa1, 0x15, 0x3e, 0xe8, 0x85, 0xf6, 0x15, 0xf3, 0xf0, - 0x2f, 0x61, 0xe7, 0x27, 0xc4, 0xb6, 0x2e, 0x09, 0xa7, 0xe9, 0x9f, 0x60, 0x1f, 0xe1, 0x4e, 0x8d, - 0x1d, 0xf8, 0xfa, 0x2d, 0xee, 0x7d, 0xfb, 0xe6, 0xc9, 0x79, 0xe2, 0x2f, 0x02, 0x49, 0x90, 0x35, - 0x58, 0x0b, 0xf9, 0xcd, 0x1c, 0xbd, 0x3e, 0xeb, 0xd5, 0x1e, 0x08, 0xf6, 0xeb, 0x9e, 0x9e, 0xff, - 0xf8, 0xb8, 0x57, 0xd3, 0xd0, 0x0a, 0x14, 0xfb, 0x83, 0x51, 0xad, 0x80, 0xd6, 0x60, 0xb5, 0xdb, - 0x1f, 0x76, 0x70, 0x6f, 0xd4, 0xab, 0x15, 0xd1, 0x3a, 0x94, 0x3b, 0x07, 0xa3, 0xde, 0xe1, 0x29, - 0xee, 0x77, 0x0e, 0x8e, 0x6b, 0xa5, 0x27, 0xdf, 0x4b, 0xfc, 0x92, 0x9f, 0xf1, 0xee, 0x8c, 0x36, - 0x1f, 0x08, 0xe3, 0x93, 0xfe, 0xa0, 0x7f, 0xd2, 0x7f, 0x23, 0x7c, 0x8a, 0xdd, 0xc1, 0xcf, 0xd4, - 0xae, 0xd0, 0xfe, 0x67, 0x01, 0x56, 0x4e, 0x88, 0x4b, 0x26, 0x34, 0x40, 0x36, 0xd4, 0xb3, 0x88, - 0x05, 0x3d, 0x49, 0x65, 0x7f, 0x0b, 0x07, 0x36, 0x77, 0xdf, 0x0b, 0x2b, 0x7a, 0x72, 0x0c, 0x1b, - 0x0b, 0x73, 0x8b, 0x1e, 0x2f, 0x76, 0x62, 0xf6, 0x39, 0x9f, 0xdf, 0x0d, 0x54, 0x8d, 0x5f, 0xcf, - 0x22, 0xb4, 0x85, 0x94, 0x6e, 0xe1, 0xcc, 0x85, 0x94, 0x72, 0x19, 0xb2, 0xfd, 0x5f, 0x0d, 0x20, - 0x1e, 0x1c, 0xf4, 0x06, 0xaa, 0xf3, 0x93, 0x84, 0xbe, 0x75, 0xc7, 0xa0, 0xa9, 0x03, 0x8d, 0xbb, - 0xc7, 0x11, 0xfd, 0x0e, 0xb6, 0x73, 0x5b, 0x0d, 0xed, 0xa5, 0x1c, 0xdc, 0xd5, 0xf3, 0xcd, 0x67, - 0xef, 0x6f, 0x20, 0xf2, 0x5c, 0x87, 0xca, 0xdc, 0x3f, 0x0e, 0x17, 0xcb, 0xf2, 0xef, 0xb5, 0x2f, - 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0x9c, 0xa9, 0x27, 0x25, 0x98, 0x13, 0x00, 0x00, -} diff --git a/pkg/apis/manager/v1alpha3/api.pb.gw.go b/pkg/apis/manager/v1alpha3/api.pb.gw.go deleted file mode 100644 index df1b4c2adb9..00000000000 --- a/pkg/apis/manager/v1alpha3/api.pb.gw.go +++ /dev/null @@ -1,218 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: api.proto - -/* -Package api_v1_alpha3 is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package api_v1_alpha3 - -import ( - "io" - "net/http" - - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "golang.org/x/net/context" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/status" -) - -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray - -func request_Manager_ReportObservationLog_0(ctx context.Context, marshaler runtime.Marshaler, client ManagerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ReportObservationLogRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.ReportObservationLog(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func request_Manager_GetObservationLog_0(ctx context.Context, marshaler runtime.Marshaler, client ManagerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetObservationLogRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.GetObservationLog(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func request_Manager_DeleteObservationLog_0(ctx context.Context, marshaler runtime.Marshaler, client ManagerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteObservationLogRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["trial_name"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "trial_name") - } - - protoReq.TrialName, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "trial_name", err) - } - - msg, err := client.DeleteObservationLog(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -// RegisterManagerHandlerFromEndpoint is same as RegisterManagerHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterManagerHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Printf("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Printf("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterManagerHandler(ctx, mux, conn) -} - -// RegisterManagerHandler registers the http handlers for service Manager to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterManagerHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - client := NewManagerClient(conn) - - mux.Handle("POST", pattern_Manager_ReportObservationLog_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - if cn, ok := w.(http.CloseNotifier); ok { - go func(done <-chan struct{}, closed <-chan bool) { - select { - case <-done: - case <-closed: - cancel() - } - }(ctx.Done(), cn.CloseNotify()) - } - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Manager_ReportObservationLog_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Manager_ReportObservationLog_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Manager_GetObservationLog_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - if cn, ok := w.(http.CloseNotifier); ok { - go func(done <-chan struct{}, closed <-chan bool) { - select { - case <-done: - case <-closed: - cancel() - } - }(ctx.Done(), cn.CloseNotify()) - } - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Manager_GetObservationLog_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Manager_GetObservationLog_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("DELETE", pattern_Manager_DeleteObservationLog_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - if cn, ok := w.(http.CloseNotifier); ok { - go func(done <-chan struct{}, closed <-chan bool) { - select { - case <-done: - case <-closed: - cancel() - } - }(ctx.Done(), cn.CloseNotify()) - } - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Manager_DeleteObservationLog_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Manager_DeleteObservationLog_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_Manager_ReportObservationLog_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "Manager", "ReportObservationLog"}, "")) - - pattern_Manager_GetObservationLog_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "Manager", "GetObservationLog"}, "")) - - pattern_Manager_DeleteObservationLog_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "Manager", "DeleteObservationLog", "trial_name"}, "")) -) - -var ( - forward_Manager_ReportObservationLog_0 = runtime.ForwardResponseMessage - - forward_Manager_GetObservationLog_0 = runtime.ForwardResponseMessage - - forward_Manager_DeleteObservationLog_0 = runtime.ForwardResponseMessage -) diff --git a/pkg/apis/manager/v1alpha3/api.proto b/pkg/apis/manager/v1alpha3/api.proto deleted file mode 100644 index f740cbcdf2b..00000000000 --- a/pkg/apis/manager/v1alpha3/api.proto +++ /dev/null @@ -1,278 +0,0 @@ -/** - * Katib API v1alpha3 - */ -syntax = "proto3"; - -package api.v1.alpha3; - -import "google/api/annotations.proto"; - -/** - * Service for Main API for Katib - * For each RPC service, we define mapping to HTTP REST API method. - * The mapping includes the URL path, query parameters and request body. - * https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http - */ -service Manager { - /** - * Report a log of Observations for a Trial. - * The log consists of timestamp and value of metric. - * Katib store every log of metrics. - * You can see accuracy curve or other metric logs on UI. - */ - rpc ReportObservationLog(ReportObservationLogRequest) returns (ReportObservationLogReply); - - /** - * Get all log of Observations for a Trial. - */ - rpc GetObservationLog(GetObservationLogRequest) returns (GetObservationLogReply); - - /** - * Delete all log of Observations for a Trial. - */ - rpc DeleteObservationLog(DeleteObservationLogRequest) returns (DeleteObservationLogReply); -} - -service Suggestion { - rpc GetSuggestions(GetSuggestionsRequest) returns (GetSuggestionsReply); - rpc ValidateAlgorithmSettings(ValidateAlgorithmSettingsRequest) returns (ValidateAlgorithmSettingsReply); -} - -service EarlyStopping { -//TODO: This feature is not yet fully implemented. -} - -/** - * Types of value for HyperParameter. - */ -enum ParameterType { - UNKNOWN_TYPE = 0; /// Undefined type and not used. - DOUBLE = 1; /// Double float type. Use "Max/Min". - INT = 2; /// Int type. Use "Max/Min". - DISCRETE = 3; /// Discrete number type. Use "List" as float. - CATEGORICAL = 4; /// Categorical type. Use "List" as string. -} - - -/** - * Feasible space for optimization. - * Int and Double type use Max/Min. - * Discrete and Categorical type use List. - */ -message FeasibleSpace { - string max = 1; /// Max Value - string min = 2; /// Minimum Value - repeated string list = 3; /// List of Values. - string step = 4; /// Step for double or int parameter -} - -/** - * Config for a Hyper parameter. - * Katib will create each Hyper parameter from this config. - */ -message ParameterSpec { - string name = 1; /// Name of the parameter. - ParameterType parameter_type = 2; /// Type of the parameter. - FeasibleSpace feasible_space = 3; /// FeasibleSpace for the parameter. -} - -/** - * Direction of optimization. Minimize or Maximize. - */ -enum ObjectiveType { - UNKNOWN = 0; /// Undefined type and not used. - MINIMIZE = 1; /// Minimize - MAXIMIZE = 2; /// Maximize -} - -message ObjectiveSpec{ - ObjectiveType type = 1; - double goal = 2; - string objective_metric_name = 3; - repeated string additional_metric_names = 4; - /// This can be empty if we only care about the objective metric. -} - -message AlgorithmSetting { - string name = 1; - string value = 2; -} - -message EarlyStoppingSpec { -//TODO: This feature is not yet fully implemented. -} - -message AlgorithmSpec { - string algorithm_name = 1; - repeated AlgorithmSetting algorithm_setting = 2; - EarlyStoppingSpec early_stopping_spec = 3; -} - -/** - * NasConfig contains a config of NAS job - */ - message NasConfig { - GraphConfig graph_config = 1; /// Config of DAG - message Operations { - repeated Operation operation = 1; - } - Operations operations = 2; /// List of Operation -} - -/** - * GraphConfig contains a config of DAG - */ - message GraphConfig { - int32 num_layers = 1; /// Number of layers - repeated int32 input_sizes = 2; /// Dimensions of input size - repeated int32 output_sizes = 3; /// Dimensions of output size -} - -/** - * Config for operations in DAG - */ - message Operation { - string operation_type = 1; /// Type of operation in DAG - /** - * List of ParameterSpec - */ - message ParameterSpecs { - repeated ParameterSpec parameters = 1; - } - ParameterSpecs parameter_specs = 2; -} - -/** - * Spec of a Experiment. Experiment represents a single optimization run over a feasible space. - * Each Experiment contains a configuration describing the feasible space, as well as a set of Trials. - * It is assumed that objective function f(x) does not change in the course of a Experiment. - */ -message ExperimentSpec { - /** - * List of ParameterSpec - */ - message ParameterSpecs { - repeated ParameterSpec parameters = 1; - } - ParameterSpecs parameter_specs = 1; - ObjectiveSpec objective = 2; - AlgorithmSpec algorithm = 3; - string trial_template = 4; - string metrics_collector_spec = 5; - int32 parallel_trial_count = 6; - int32 max_trial_count = 7; - NasConfig nas_config = 8; -} - -message Experiment { - string name = 1; /// Name of Experiment. This is unique in DB. - ExperimentSpec spec = 2; -} - -message ParameterAssignment { - string name = 1; - string value = 2; -} - -message Metric { - string name = 1; - string value = 2; -} - -message MetricLog { - string time_stamp = 1; /// RFC3339 format - Metric metric = 2; -} - -message Observation { - repeated Metric metrics = 1; -} - -message ObservationLog { - repeated MetricLog metric_logs = 1; -} - -message TrialSpec { - /** - * List of ParameterAssignment - */ - message ParameterAssignments{ - repeated ParameterAssignment assignments = 1; - } - string experiment_name = 1; - ObjectiveSpec objective = 2; - ParameterAssignments parameter_assignments = 3; - string run_spec = 4; - string metrics_collector_spec = 5; -} - -message TrialStatus { - enum TrialConditionType { - CREATED = 0; - RUNNING = 1; - SUCCEEDED = 2; - KILLED = 3; - FAILED = 4; - UNKNOWN = 5; - } - string start_time = 1; /// RFC3339 format - string completion_time = 2; /// RFC3339 format - TrialConditionType condition = 3; - Observation observation = 4; /// The best observation in logs. -} - -message Trial { - string name = 1; - TrialSpec spec = 2; - TrialStatus status = 3; -} - -message ReportObservationLogRequest { - string trial_name = 1; - ObservationLog observation_log = 2; -} - -message ReportObservationLogReply { -} - -message DeleteObservationLogRequest { - string trial_name = 1; -} - -message DeleteObservationLogReply { -} - -message GetObservationLogRequest { - string trial_name = 1; - string metric_name = 2; - string start_time = 3; ///The start of the time range. RFC3339 format - string end_time = 4; ///The end of the time range. RFC3339 format -} - -message GetObservationLogReply { - ObservationLog observation_log = 1; -} - -message GetSuggestionsRequest { - Experiment experiment = 1; - repeated Trial trials = 2; // all completed trials owned by the experiment. - int32 request_number = 3; ///The number of Suggestion you request at one time. When you set 3 to request_number, you can get three Suggestions at one time. -} - -message GetSuggestionsReply { - message ParameterAssignments{ - repeated ParameterAssignment assignments = 1; - } - repeated ParameterAssignments parameter_assignments = 1; - AlgorithmSpec algorithm = 2; -} - -message ValidateAlgorithmSettingsRequest { - Experiment experiment = 1; -} - -/** - * Return INVALID_ARGUMENT Error if Algorithm Settings are not Valid - */ -message ValidateAlgorithmSettingsReply { -} diff --git a/pkg/apis/manager/v1alpha3/api.swagger.json b/pkg/apis/manager/v1alpha3/api.swagger.json deleted file mode 100644 index 664f9028bd5..00000000000 --- a/pkg/apis/manager/v1alpha3/api.swagger.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "api.proto", - "version": "version not set" - }, - "schemes": [ - "http", - "https" - ], - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "paths": {}, - "definitions": { - "alpha3AlgorithmSetting": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - } - }, - "alpha3AlgorithmSpec": { - "type": "object", - "properties": { - "algorithm_name": { - "type": "string" - }, - "algorithm_setting": { - "type": "array", - "items": { - "$ref": "#/definitions/alpha3AlgorithmSetting" - } - }, - "early_stopping_spec": { - "$ref": "#/definitions/alpha3EarlyStoppingSpec" - } - } - }, - "alpha3DeleteObservationLogReply": { - "type": "object" - }, - "alpha3EarlyStoppingSpec": { - "type": "object" - }, - "alpha3GetObservationLogReply": { - "type": "object", - "properties": { - "observation_log": { - "$ref": "#/definitions/alpha3ObservationLog" - } - } - }, - "alpha3GetSuggestionsReply": { - "type": "object", - "properties": { - "parameter_assignments": { - "type": "array", - "items": { - "$ref": "#/definitions/alpha3GetSuggestionsReplyParameterAssignments" - } - }, - "algorithm": { - "$ref": "#/definitions/alpha3AlgorithmSpec" - } - } - }, - "alpha3GetSuggestionsReplyParameterAssignments": { - "type": "object", - "properties": { - "assignments": { - "type": "array", - "items": { - "$ref": "#/definitions/alpha3ParameterAssignment" - } - } - } - }, - "alpha3Metric": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - } - }, - "alpha3MetricLog": { - "type": "object", - "properties": { - "time_stamp": { - "type": "string" - }, - "metric": { - "$ref": "#/definitions/alpha3Metric" - } - } - }, - "alpha3ObservationLog": { - "type": "object", - "properties": { - "metric_logs": { - "type": "array", - "items": { - "$ref": "#/definitions/alpha3MetricLog" - } - } - } - }, - "alpha3ParameterAssignment": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - } - }, - "alpha3ReportObservationLogReply": { - "type": "object" - }, - "alpha3ValidateAlgorithmSettingsReply": { - "type": "object", - "title": "*\nReturn INVALID_ARGUMENT Error if Algorithm Settings are not Valid" - } - } -} diff --git a/pkg/apis/manager/v1alpha3/build.sh b/pkg/apis/manager/v1alpha3/build.sh deleted file mode 100755 index 74a1f5b2a18..00000000000 --- a/pkg/apis/manager/v1alpha3/build.sh +++ /dev/null @@ -1,11 +0,0 @@ -set -x -set -e -for proto in api.proto; do - docker run -it --rm -v $PWD:$(pwd) -w $(pwd) znly/protoc --python_out=plugins=grpc:./python --go_out=plugins=grpc:. -I. $proto - docker run -it --rm -v $PWD:$(pwd) -w $(pwd) znly/protoc --plugin=protoc-gen-grpc=/usr/bin/grpc_python_plugin --python_out=./python --grpc_out=./python -I. $proto - docker run -it --rm -v $PWD:$(pwd) -w $(pwd) znly/protoc --grpc-gateway_out=logtostderr=true:. -I. $proto - docker run -it --rm -v $PWD:$(pwd) -w $(pwd) znly/protoc --swagger_out=logtostderr=true:. -I. $proto -done -docker build -t protoc-gen-doc gen-doc/ -docker run --rm -v $PWD/gen-doc:/out -v $PWD:/apiprotos protoc-gen-doc --doc_opt=markdown,api.md -I /protobuf -I /apiprotos api.proto -docker run --rm -v $PWD/gen-doc:/out -v $PWD:/apiprotos protoc-gen-doc --doc_opt=html,index.html -I /protobuf -I /apiprotos api.proto diff --git a/pkg/apis/manager/v1alpha3/gen-doc/Dockerfile b/pkg/apis/manager/v1alpha3/gen-doc/Dockerfile deleted file mode 100644 index afaba128816..00000000000 --- a/pkg/apis/manager/v1alpha3/gen-doc/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM pseudomuto/protoc-gen-doc -RUN apt-get -q -y update && apt-get -q -y install curl && \ - mkdir -p /protobuf/google/protobuf && \ - for f in any duration descriptor empty struct timestamp wrappers; do \ - curl -L -o /protobuf/google/protobuf/${f}.proto https://raw.githubusercontent.com/google/protobuf/master/src/google/protobuf/${f}.proto; \ - done && \ - mkdir -p /protobuf/google/api && \ - for f in annotations http; do \ - curl -L -o /protobuf/google/api/${f}.proto https://raw.githubusercontent.com/grpc-ecosystem/grpc-gateway/master/third_party/googleapis/google/api/${f}.proto; \ - done && \ - mkdir -p /protobuf/github.com/gogo/protobuf/gogoproto && \ - curl -L -o /protobuf/github.com/gogo/protobuf/gogoproto/gogo.proto https://raw.githubusercontent.com/gogo/protobuf/master/gogoproto/gogo.proto && \ - mkdir -p /protobuf/github.com/mwitkow/go-proto-validators && \ - curl -L -o /protobuf/github.com/mwitkow/go-proto-validators/validator.proto https://raw.githubusercontent.com/mwitkow/go-proto-validators/master/validator.proto && \ - apt-get remove --purge -y curl && \ - apt-get -y autoremove && \ - rm -rf /var/lib/apt/lists/* diff --git a/pkg/apis/manager/v1alpha3/gen-doc/api.md b/pkg/apis/manager/v1alpha3/gen-doc/api.md deleted file mode 100644 index 50ef916ce0e..00000000000 --- a/pkg/apis/manager/v1alpha3/gen-doc/api.md +++ /dev/null @@ -1,712 +0,0 @@ - -# Latest version of the docs - -## For the most up-to-date docs, see the [Katib API reference docs](https://www.kubeflow.org/docs/reference/katib/). - -# Protocol Documentation - - -## Table of Contents - -- [api.proto](#api.proto) - - [AlgorithmSetting](#api.v1.alpha3.AlgorithmSetting) - - [AlgorithmSpec](#api.v1.alpha3.AlgorithmSpec) - - [DeleteObservationLogReply](#api.v1.alpha3.DeleteObservationLogReply) - - [DeleteObservationLogRequest](#api.v1.alpha3.DeleteObservationLogRequest) - - [EarlyStoppingSpec](#api.v1.alpha3.EarlyStoppingSpec) - - [Experiment](#api.v1.alpha3.Experiment) - - [ExperimentSpec](#api.v1.alpha3.ExperimentSpec) - - [ExperimentSpec.ParameterSpecs](#api.v1.alpha3.ExperimentSpec.ParameterSpecs) - - [FeasibleSpace](#api.v1.alpha3.FeasibleSpace) - - [GetObservationLogReply](#api.v1.alpha3.GetObservationLogReply) - - [GetObservationLogRequest](#api.v1.alpha3.GetObservationLogRequest) - - [GetSuggestionsReply](#api.v1.alpha3.GetSuggestionsReply) - - [GetSuggestionsReply.ParameterAssignments](#api.v1.alpha3.GetSuggestionsReply.ParameterAssignments) - - [GetSuggestionsRequest](#api.v1.alpha3.GetSuggestionsRequest) - - [GraphConfig](#api.v1.alpha3.GraphConfig) - - [Metric](#api.v1.alpha3.Metric) - - [MetricLog](#api.v1.alpha3.MetricLog) - - [NasConfig](#api.v1.alpha3.NasConfig) - - [NasConfig.Operations](#api.v1.alpha3.NasConfig.Operations) - - [ObjectiveSpec](#api.v1.alpha3.ObjectiveSpec) - - [Observation](#api.v1.alpha3.Observation) - - [ObservationLog](#api.v1.alpha3.ObservationLog) - - [Operation](#api.v1.alpha3.Operation) - - [Operation.ParameterSpecs](#api.v1.alpha3.Operation.ParameterSpecs) - - [ParameterAssignment](#api.v1.alpha3.ParameterAssignment) - - [ParameterSpec](#api.v1.alpha3.ParameterSpec) - - [ReportObservationLogReply](#api.v1.alpha3.ReportObservationLogReply) - - [ReportObservationLogRequest](#api.v1.alpha3.ReportObservationLogRequest) - - [Trial](#api.v1.alpha3.Trial) - - [TrialSpec](#api.v1.alpha3.TrialSpec) - - [TrialSpec.ParameterAssignments](#api.v1.alpha3.TrialSpec.ParameterAssignments) - - [TrialStatus](#api.v1.alpha3.TrialStatus) - - [ValidateAlgorithmSettingsReply](#api.v1.alpha3.ValidateAlgorithmSettingsReply) - - [ValidateAlgorithmSettingsRequest](#api.v1.alpha3.ValidateAlgorithmSettingsRequest) - - - [ObjectiveType](#api.v1.alpha3.ObjectiveType) - - [ParameterType](#api.v1.alpha3.ParameterType) - - [TrialStatus.TrialConditionType](#api.v1.alpha3.TrialStatus.TrialConditionType) - - - - [EarlyStopping](#api.v1.alpha3.EarlyStopping) - - [Manager](#api.v1.alpha3.Manager) - - [Suggestion](#api.v1.alpha3.Suggestion) - - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## api.proto -Katib API - - - - -### AlgorithmSetting - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| value | [string](#string) | | | - - - - - - - - -### AlgorithmSpec - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| algorithm_name | [string](#string) | | | -| algorithm_setting | [AlgorithmSetting](#api.v1.alpha3.AlgorithmSetting) | repeated | | -| early_stopping_spec | [EarlyStoppingSpec](#api.v1.alpha3.EarlyStoppingSpec) | | | - - - - - - - - -### DeleteObservationLogReply - - - - - - - - - -### DeleteObservationLogRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| trial_name | [string](#string) | | | - - - - - - - - -### EarlyStoppingSpec -TODO - - - - - - - - -### Experiment - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | Name of Experiment. This is unique in DB. | -| spec | [ExperimentSpec](#api.v1.alpha3.ExperimentSpec) | | | - - - - - - - - -### ExperimentSpec -Spec of a Experiment. Experiment represents a single optimization run over a feasible space. -Each Experiment contains a configuration describing the feasible space, as well as a set of Trials. -It is assumed that objective function f(x) does not change in the course of a Experiment. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| parameter_specs | [ExperimentSpec.ParameterSpecs](#api.v1.alpha3.ExperimentSpec.ParameterSpecs) | | | -| objective | [ObjectiveSpec](#api.v1.alpha3.ObjectiveSpec) | | | -| algorithm | [AlgorithmSpec](#api.v1.alpha3.AlgorithmSpec) | | | -| trial_template | [string](#string) | | | -| metrics_collector_spec | [string](#string) | | | -| parallel_trial_count | [int32](#int32) | | | -| max_trial_count | [int32](#int32) | | | -| nas_config | [NasConfig](#api.v1.alpha3.NasConfig) | | | - - - - - - - - -### ExperimentSpec.ParameterSpecs -List of ParameterSpec - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| parameters | [ParameterSpec](#api.v1.alpha3.ParameterSpec) | repeated | | - - - - - - - - -### FeasibleSpace -Feasible space for optimization. -Int and Double type use Max/Min. -Discrete and Categorical type use List. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| max | [string](#string) | | Max Value | -| min | [string](#string) | | Minimum Value | -| list | [string](#string) | repeated | List of Values. | -| step | [string](#string) | | Step for double or int parameter | - - - - - - - - -### GetObservationLogReply - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| observation_log | [ObservationLog](#api.v1.alpha3.ObservationLog) | | | - - - - - - - - -### GetObservationLogRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| trial_name | [string](#string) | | | -| metric_name | [string](#string) | | | -| start_time | [string](#string) | | The start of the time range. RFC3339 format | -| end_time | [string](#string) | | The end of the time range. RFC3339 format | - - - - - - - - -### GetSuggestionsReply - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| parameter_assignments | [GetSuggestionsReply.ParameterAssignments](#api.v1.alpha3.GetSuggestionsReply.ParameterAssignments) | repeated | | -| algorithm | [AlgorithmSpec](#api.v1.alpha3.AlgorithmSpec) | | | - - - - - - - - -### GetSuggestionsReply.ParameterAssignments - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| assignments | [ParameterAssignment](#api.v1.alpha3.ParameterAssignment) | repeated | | - - - - - - - - -### GetSuggestionsRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| experiment | [Experiment](#api.v1.alpha3.Experiment) | | | -| trials | [Trial](#api.v1.alpha3.Trial) | repeated | all completed trials owned by the experiment. | -| request_number | [int32](#int32) | | The number of Suggestion you request at one time. When you set 3 to request_number, you can get three Suggestions at one time. | - - - - - - - - -### GraphConfig -GraphConfig contains a config of DAG - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| num_layers | [int32](#int32) | | Number of layers | -| input_sizes | [int32](#int32) | repeated | Dimensions of input size | -| output_sizes | [int32](#int32) | repeated | Dimensions of output size | - - - - - - - - -### Metric - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| value | [string](#string) | | | - - - - - - - - -### MetricLog - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| time_stamp | [string](#string) | | RFC3339 format | -| metric | [Metric](#api.v1.alpha3.Metric) | | | - - - - - - - - -### NasConfig -NasConfig contains a config of NAS job - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| graph_config | [GraphConfig](#api.v1.alpha3.GraphConfig) | | Config of DAG | -| operations | [NasConfig.Operations](#api.v1.alpha3.NasConfig.Operations) | | List of Operation | - - - - - - - - -### NasConfig.Operations - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| operation | [Operation](#api.v1.alpha3.Operation) | repeated | | - - - - - - - - -### ObjectiveSpec - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| type | [ObjectiveType](#api.v1.alpha3.ObjectiveType) | | | -| goal | [double](#double) | | | -| objective_metric_name | [string](#string) | | | -| additional_metric_names | [string](#string) | repeated | This can be empty if we only care about the objective metric. | - - - - - - - - -### Observation - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| metrics | [Metric](#api.v1.alpha3.Metric) | repeated | | - - - - - - - - -### ObservationLog - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| metric_logs | [MetricLog](#api.v1.alpha3.MetricLog) | repeated | | - - - - - - - - -### Operation -Config for operations in DAG - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| operation_type | [string](#string) | | Type of operation in DAG | -| parameter_specs | [Operation.ParameterSpecs](#api.v1.alpha3.Operation.ParameterSpecs) | | | - - - - - - - - -### Operation.ParameterSpecs -List of ParameterSpec - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| parameters | [ParameterSpec](#api.v1.alpha3.ParameterSpec) | repeated | | - - - - - - - - -### ParameterAssignment - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| value | [string](#string) | | | - - - - - - - - -### ParameterSpec -Config for a Hyper parameter. -Katib will create each Hyper parameter from this config. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | Name of the parameter. | -| parameter_type | [ParameterType](#api.v1.alpha3.ParameterType) | | Type of the parameter. | -| feasible_space | [FeasibleSpace](#api.v1.alpha3.FeasibleSpace) | | FeasibleSpace for the parameter. | - - - - - - - - -### ReportObservationLogReply - - - - - - - - - -### ReportObservationLogRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| trial_name | [string](#string) | | | -| observation_log | [ObservationLog](#api.v1.alpha3.ObservationLog) | | | - - - - - - - - -### Trial - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| spec | [TrialSpec](#api.v1.alpha3.TrialSpec) | | | -| status | [TrialStatus](#api.v1.alpha3.TrialStatus) | | | - - - - - - - - -### TrialSpec - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| experiment_name | [string](#string) | | | -| objective | [ObjectiveSpec](#api.v1.alpha3.ObjectiveSpec) | | | -| parameter_assignments | [TrialSpec.ParameterAssignments](#api.v1.alpha3.TrialSpec.ParameterAssignments) | | | -| run_spec | [string](#string) | | | -| metrics_collector_spec | [string](#string) | | | - - - - - - - - -### TrialSpec.ParameterAssignments -List of ParameterAssignment - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| assignments | [ParameterAssignment](#api.v1.alpha3.ParameterAssignment) | repeated | | - - - - - - - - -### TrialStatus - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| start_time | [string](#string) | | RFC3339 format | -| completion_time | [string](#string) | | RFC3339 format | -| condition | [TrialStatus.TrialConditionType](#api.v1.alpha3.TrialStatus.TrialConditionType) | | | -| observation | [Observation](#api.v1.alpha3.Observation) | | The best observation in logs. | - - - - - - - - -### ValidateAlgorithmSettingsReply -Return INVALID_ARGUMENT Error if Algorithm Settings are not Valid - - - - - - - - -### ValidateAlgorithmSettingsRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| experiment | [Experiment](#api.v1.alpha3.Experiment) | | | - - - - - - - - - - -### ObjectiveType -Direction of optimization. Minimize or Maximize. - -| Name | Number | Description | -| ---- | ------ | ----------- | -| UNKNOWN | 0 | Undefined type and not used. | -| MINIMIZE | 1 | Minimize | -| MAXIMIZE | 2 | Maximize | - - - - - -### ParameterType -Types of value for HyperParameter. - -| Name | Number | Description | -| ---- | ------ | ----------- | -| UNKNOWN_TYPE | 0 | Undefined type and not used. | -| DOUBLE | 1 | Double float type. Use "Max/Min". | -| INT | 2 | Int type. Use "Max/Min". | -| DISCRETE | 3 | Discrete number type. Use "List" as float. | -| CATEGORICAL | 4 | Categorical type. Use "List" as string. | - - - - - -### TrialStatus.TrialConditionType - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| CREATED | 0 | | -| RUNNING | 1 | | -| SUCCEEDED | 2 | | -| KILLED | 3 | | -| FAILED | 4 | | -| UNKNOWN | 5 | | - - - - - - - - - -### EarlyStopping -TODO - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| - - - - -### Manager -Service for Main API for Katib -For each RPC service, we define mapping to HTTP REST API method. -The mapping includes the URL path, query parameters and request body. -https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| ReportObservationLog | [ReportObservationLogRequest](#api.v1.alpha3.ReportObservationLogRequest) | [ReportObservationLogReply](#api.v1.alpha3.ReportObservationLogReply) | Report a log of Observations for a Trial. The log consists of timestamp and value of metric. Katib store every log of metrics. You can see accuracy curve or other metric logs on UI. | -| GetObservationLog | [GetObservationLogRequest](#api.v1.alpha3.GetObservationLogRequest) | [GetObservationLogReply](#api.v1.alpha3.GetObservationLogReply) | Get all log of Observations for a Trial. | -| DeleteObservationLog | [DeleteObservationLogRequest](#api.v1.alpha3.DeleteObservationLogRequest) | [DeleteObservationLogReply](#api.v1.alpha3.DeleteObservationLogReply) | Delete all log of Observations for a Trial. | - - - - -### Suggestion - - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| GetSuggestions | [GetSuggestionsRequest](#api.v1.alpha3.GetSuggestionsRequest) | [GetSuggestionsReply](#api.v1.alpha3.GetSuggestionsReply) | | -| ValidateAlgorithmSettings | [ValidateAlgorithmSettingsRequest](#api.v1.alpha3.ValidateAlgorithmSettingsRequest) | [ValidateAlgorithmSettingsReply](#api.v1.alpha3.ValidateAlgorithmSettingsReply) | | - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ Type | Java Type | Python Type | -| ----------- | ----- | -------- | --------- | ----------- | -| double | | double | double | float | -| float | | float | float | float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | -| sfixed32 | Always four bytes. | int32 | int | int | -| sfixed64 | Always eight bytes. | int64 | long | int/long | -| bool | | bool | boolean | boolean | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | - diff --git a/pkg/apis/manager/v1alpha3/gen-doc/index.html b/pkg/apis/manager/v1alpha3/gen-doc/index.html deleted file mode 100644 index 363c9fe6ca3..00000000000 --- a/pkg/apis/manager/v1alpha3/gen-doc/index.html +++ /dev/null @@ -1,1731 +0,0 @@ - - - - - Protocol Documentation - - - - - - - - - - -

Protocol Documentation

- -

Table of Contents

- -
- - - -
-

api.proto

Top -
-

Katib API

- - -

AlgorithmSetting

-

- - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
namestring

valuestring

- - - - - -

AlgorithmSpec

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
algorithm_namestring

algorithm_settingAlgorithmSettingrepeated

early_stopping_specEarlyStoppingSpec

- - - - - -

DeleteObservationLogReply

-

- - - - - -

DeleteObservationLogRequest

-

- - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
trial_namestring

- - - - - -

EarlyStoppingSpec

-

TODO

- - - - - -

Experiment

-

- - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
namestring

Name of Experiment. This is unique in DB.

specExperimentSpec

- - - - - -

ExperimentSpec

-

Spec of a Experiment. Experiment represents a single optimization run over a feasible space.

Each Experiment contains a configuration describing the feasible space, as well as a set of Trials.

It is assumed that objective function f(x) does not change in the course of a Experiment.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
parameter_specsExperimentSpec.ParameterSpecs

objectiveObjectiveSpec

algorithmAlgorithmSpec

trial_templatestring

metrics_collector_specstring

parallel_trial_countint32

max_trial_countint32

nas_configNasConfig

- - - - - -

ExperimentSpec.ParameterSpecs

-

List of ParameterSpec

- - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
parametersParameterSpecrepeated

- - - - - -

FeasibleSpace

-

Feasible space for optimization.

Int and Double type use Max/Min.

Discrete and Categorical type use List.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
maxstring

Max Value

minstring

Minimum Value

liststringrepeated

List of Values.

stepstring

Step for double or int parameter

- - - - - -

GetObservationLogReply

-

- - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
observation_logObservationLog

- - - - - -

GetObservationLogRequest

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
trial_namestring

metric_namestring

start_timestring

The start of the time range. RFC3339 format

end_timestring

The end of the time range. RFC3339 format

- - - - - -

GetSuggestionsReply

-

- - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
parameter_assignmentsGetSuggestionsReply.ParameterAssignmentsrepeated

algorithmAlgorithmSpec

- - - - - -

GetSuggestionsReply.ParameterAssignments

-

- - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
assignmentsParameterAssignmentrepeated

- - - - - -

GetSuggestionsRequest

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
experimentExperiment

trialsTrialrepeated

all completed trials owned by the experiment.

request_numberint32

The number of Suggestion you request at one time. When you set 3 to request_number, you can get three Suggestions at one time.

- - - - - -

GraphConfig

-

GraphConfig contains a config of DAG

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
num_layersint32

Number of layers

input_sizesint32repeated

Dimensions of input size

output_sizesint32repeated

Dimensions of output size

- - - - - -

Metric

-

- - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
namestring

valuestring

- - - - - -

MetricLog

-

- - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
time_stampstring

RFC3339 format

metricMetric

- - - - - -

NasConfig

-

NasConfig contains a config of NAS job

- - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
graph_configGraphConfig

Config of DAG

operationsNasConfig.Operations

List of Operation

- - - - - -

NasConfig.Operations

-

- - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
operationOperationrepeated

- - - - - -

ObjectiveSpec

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
typeObjectiveType

goaldouble

objective_metric_namestring

additional_metric_namesstringrepeated

This can be empty if we only care about the objective metric.

- - - - - -

Observation

-

- - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
metricsMetricrepeated

- - - - - -

ObservationLog

-

- - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
metric_logsMetricLogrepeated

- - - - - -

Operation

-

Config for operations in DAG

- - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
operation_typestring

Type of operation in DAG

parameter_specsOperation.ParameterSpecs

- - - - - -

Operation.ParameterSpecs

-

List of ParameterSpec

- - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
parametersParameterSpecrepeated

- - - - - -

ParameterAssignment

-

- - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
namestring

valuestring

- - - - - -

ParameterSpec

-

Config for a Hyper parameter.

Katib will create each Hyper parameter from this config.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
namestring

Name of the parameter.

parameter_typeParameterType

Type of the parameter.

feasible_spaceFeasibleSpace

FeasibleSpace for the parameter.

- - - - - -

ReportObservationLogReply

-

- - - - - -

ReportObservationLogRequest

-

- - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
trial_namestring

observation_logObservationLog

- - - - - -

Trial

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
namestring

specTrialSpec

statusTrialStatus

- - - - - -

TrialSpec

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
experiment_namestring

objectiveObjectiveSpec

parameter_assignmentsTrialSpec.ParameterAssignments

run_specstring

metrics_collector_specstring

- - - - - -

TrialSpec.ParameterAssignments

-

List of ParameterAssignment

- - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
assignmentsParameterAssignmentrepeated

- - - - - -

TrialStatus

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
start_timestring

RFC3339 format

completion_timestring

RFC3339 format

conditionTrialStatus.TrialConditionType

observationObservation

The best observation in logs.

- - - - - -

ValidateAlgorithmSettingsReply

-

Return INVALID_ARGUMENT Error if Algorithm Settings are not Valid

- - - - - -

ValidateAlgorithmSettingsRequest

-

- - - - - - - - - - - - - - - - -
FieldTypeLabelDescription
experimentExperiment

- - - - - - - -

ObjectiveType

-

Direction of optimization. Minimize or Maximize.

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameNumberDescription
UNKNOWN0

Undefined type and not used.

MINIMIZE1

Minimize

MAXIMIZE2

Maximize

- -

ParameterType

-

Types of value for HyperParameter.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameNumberDescription
UNKNOWN_TYPE0

Undefined type and not used.

DOUBLE1

Double float type. Use "Max/Min".

INT2

Int type. Use "Max/Min".

DISCRETE3

Discrete number type. Use "List" as float.

CATEGORICAL4

Categorical type. Use "List" as string.

- -

TrialStatus.TrialConditionType

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameNumberDescription
CREATED0

RUNNING1

SUCCEEDED2

KILLED3

FAILED4

UNKNOWN5

- - - - - -

EarlyStopping

-

TODO

- - - - - - - -
Method NameRequest TypeResponse TypeDescription
- - -

Manager

-

Service for Main API for Katib

For each RPC service, we define mapping to HTTP REST API method.

The mapping includes the URL path, query parameters and request body.

https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method NameRequest TypeResponse TypeDescription
ReportObservationLogReportObservationLogRequestReportObservationLogReply

Report a log of Observations for a Trial. -The log consists of timestamp and value of metric. -Katib store every log of metrics. -You can see accuracy curve or other metric logs on UI.

GetObservationLogGetObservationLogRequestGetObservationLogReply

Get all log of Observations for a Trial.

DeleteObservationLogDeleteObservationLogRequestDeleteObservationLogReply

Delete all log of Observations for a Trial.

- - -

Suggestion

-

- - - - - - - - - - - - - - - - - - - - - -
Method NameRequest TypeResponse TypeDescription
GetSuggestionsGetSuggestionsRequestGetSuggestionsReply

ValidateAlgorithmSettingsValidateAlgorithmSettingsRequestValidateAlgorithmSettingsReply

- - - - -

Scalar Value Types

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.proto TypeNotesC++ TypeJava TypePython Type
doubledoubledoublefloat
floatfloatfloatfloat
int32Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.int32intint
int64Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.int64longint/long
uint32Uses variable-length encoding.uint32intint/long
uint64Uses variable-length encoding.uint64longint/long
sint32Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.int32intint
sint64Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.int64longint/long
fixed32Always four bytes. More efficient than uint32 if values are often greater than 2^28.uint32intint
fixed64Always eight bytes. More efficient than uint64 if values are often greater than 2^56.uint64longint/long
sfixed32Always four bytes.int32intint
sfixed64Always eight bytes.int64longint/long
boolboolbooleanboolean
stringA string must always contain UTF-8 encoded or 7-bit ASCII text.stringStringstr/unicode
bytesMay contain any arbitrary sequence of bytes.stringByteStringstr
- - - diff --git a/pkg/apis/manager/v1alpha3/python/api_pb2.py b/pkg/apis/manager/v1alpha3/python/api_pb2.py deleted file mode 100644 index 909df089acd..00000000000 --- a/pkg/apis/manager/v1alpha3/python/api_pb2.py +++ /dev/null @@ -1,2296 +0,0 @@ -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: api.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf.internal import enum_type_wrapper -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -from google.protobuf import descriptor_pb2 -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='api.proto', - package='api.v1.alpha3', - syntax='proto3', - serialized_pb=_b('\n\tapi.proto\x12\rapi.v1.alpha3\x1a\x1cgoogle/api/annotations.proto\"E\n\rFeasibleSpace\x12\x0b\n\x03max\x18\x01 \x01(\t\x12\x0b\n\x03min\x18\x02 \x01(\t\x12\x0c\n\x04list\x18\x03 \x03(\t\x12\x0c\n\x04step\x18\x04 \x01(\t\"\x89\x01\n\rParameterSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x34\n\x0eparameter_type\x18\x02 \x01(\x0e\x32\x1c.api.v1.alpha3.ParameterType\x12\x34\n\x0e\x66\x65\x61sible_space\x18\x03 \x01(\x0b\x32\x1c.api.v1.alpha3.FeasibleSpace\"\x89\x01\n\rObjectiveSpec\x12*\n\x04type\x18\x01 \x01(\x0e\x32\x1c.api.v1.alpha3.ObjectiveType\x12\x0c\n\x04goal\x18\x02 \x01(\x01\x12\x1d\n\x15objective_metric_name\x18\x03 \x01(\t\x12\x1f\n\x17\x61\x64\x64itional_metric_names\x18\x04 \x03(\t\"/\n\x10\x41lgorithmSetting\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x13\n\x11\x45\x61rlyStoppingSpec\"\xa2\x01\n\rAlgorithmSpec\x12\x16\n\x0e\x61lgorithm_name\x18\x01 \x01(\t\x12:\n\x11\x61lgorithm_setting\x18\x02 \x03(\x0b\x32\x1f.api.v1.alpha3.AlgorithmSetting\x12=\n\x13\x65\x61rly_stopping_spec\x18\x03 \x01(\x0b\x32 .api.v1.alpha3.EarlyStoppingSpec\"\xb1\x01\n\tNasConfig\x12\x30\n\x0cgraph_config\x18\x01 \x01(\x0b\x32\x1a.api.v1.alpha3.GraphConfig\x12\x37\n\noperations\x18\x02 \x01(\x0b\x32#.api.v1.alpha3.NasConfig.Operations\x1a\x39\n\nOperations\x12+\n\toperation\x18\x01 \x03(\x0b\x32\x18.api.v1.alpha3.Operation\"L\n\x0bGraphConfig\x12\x12\n\nnum_layers\x18\x01 \x01(\x05\x12\x13\n\x0binput_sizes\x18\x02 \x03(\x05\x12\x14\n\x0coutput_sizes\x18\x03 \x03(\x05\"\xa9\x01\n\tOperation\x12\x16\n\x0eoperation_type\x18\x01 \x01(\t\x12@\n\x0fparameter_specs\x18\x02 \x01(\x0b\x32\'.api.v1.alpha3.Operation.ParameterSpecs\x1a\x42\n\x0eParameterSpecs\x12\x30\n\nparameters\x18\x01 \x03(\x0b\x32\x1c.api.v1.alpha3.ParameterSpec\"\x9a\x03\n\x0e\x45xperimentSpec\x12\x45\n\x0fparameter_specs\x18\x01 \x01(\x0b\x32,.api.v1.alpha3.ExperimentSpec.ParameterSpecs\x12/\n\tobjective\x18\x02 \x01(\x0b\x32\x1c.api.v1.alpha3.ObjectiveSpec\x12/\n\talgorithm\x18\x03 \x01(\x0b\x32\x1c.api.v1.alpha3.AlgorithmSpec\x12\x16\n\x0etrial_template\x18\x04 \x01(\t\x12\x1e\n\x16metrics_collector_spec\x18\x05 \x01(\t\x12\x1c\n\x14parallel_trial_count\x18\x06 \x01(\x05\x12\x17\n\x0fmax_trial_count\x18\x07 \x01(\x05\x12,\n\nnas_config\x18\x08 \x01(\x0b\x32\x18.api.v1.alpha3.NasConfig\x1a\x42\n\x0eParameterSpecs\x12\x30\n\nparameters\x18\x01 \x03(\x0b\x32\x1c.api.v1.alpha3.ParameterSpec\"G\n\nExperiment\x12\x0c\n\x04name\x18\x01 \x01(\t\x12+\n\x04spec\x18\x02 \x01(\x0b\x32\x1d.api.v1.alpha3.ExperimentSpec\"2\n\x13ParameterAssignment\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"%\n\x06Metric\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"F\n\tMetricLog\x12\x12\n\ntime_stamp\x18\x01 \x01(\t\x12%\n\x06metric\x18\x02 \x01(\x0b\x32\x15.api.v1.alpha3.Metric\"5\n\x0bObservation\x12&\n\x07metrics\x18\x01 \x03(\x0b\x32\x15.api.v1.alpha3.Metric\"?\n\x0eObservationLog\x12-\n\x0bmetric_logs\x18\x01 \x03(\x0b\x32\x18.api.v1.alpha3.MetricLog\"\xa6\x02\n\tTrialSpec\x12\x17\n\x0f\x65xperiment_name\x18\x01 \x01(\t\x12/\n\tobjective\x18\x02 \x01(\x0b\x32\x1c.api.v1.alpha3.ObjectiveSpec\x12L\n\x15parameter_assignments\x18\x03 \x01(\x0b\x32-.api.v1.alpha3.TrialSpec.ParameterAssignments\x12\x10\n\x08run_spec\x18\x04 \x01(\t\x12\x1e\n\x16metrics_collector_spec\x18\x05 \x01(\t\x1aO\n\x14ParameterAssignments\x12\x37\n\x0b\x61ssignments\x18\x01 \x03(\x0b\x32\".api.v1.alpha3.ParameterAssignment\"\x91\x02\n\x0bTrialStatus\x12\x12\n\nstart_time\x18\x01 \x01(\t\x12\x17\n\x0f\x63ompletion_time\x18\x02 \x01(\t\x12@\n\tcondition\x18\x03 \x01(\x0e\x32-.api.v1.alpha3.TrialStatus.TrialConditionType\x12/\n\x0bobservation\x18\x04 \x01(\x0b\x32\x1a.api.v1.alpha3.Observation\"b\n\x12TrialConditionType\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07RUNNING\x10\x01\x12\r\n\tSUCCEEDED\x10\x02\x12\n\n\x06KILLED\x10\x03\x12\n\n\x06\x46\x41ILED\x10\x04\x12\x0b\n\x07UNKNOWN\x10\x05\"i\n\x05Trial\x12\x0c\n\x04name\x18\x01 \x01(\t\x12&\n\x04spec\x18\x02 \x01(\x0b\x32\x18.api.v1.alpha3.TrialSpec\x12*\n\x06status\x18\x03 \x01(\x0b\x32\x1a.api.v1.alpha3.TrialStatus\"i\n\x1bReportObservationLogRequest\x12\x12\n\ntrial_name\x18\x01 \x01(\t\x12\x36\n\x0fobservation_log\x18\x02 \x01(\x0b\x32\x1d.api.v1.alpha3.ObservationLog\"\x1b\n\x19ReportObservationLogReply\"1\n\x1b\x44\x65leteObservationLogRequest\x12\x12\n\ntrial_name\x18\x01 \x01(\t\"\x1b\n\x19\x44\x65leteObservationLogReply\"i\n\x18GetObservationLogRequest\x12\x12\n\ntrial_name\x18\x01 \x01(\t\x12\x13\n\x0bmetric_name\x18\x02 \x01(\t\x12\x12\n\nstart_time\x18\x03 \x01(\t\x12\x10\n\x08\x65nd_time\x18\x04 \x01(\t\"P\n\x16GetObservationLogReply\x12\x36\n\x0fobservation_log\x18\x01 \x01(\x0b\x32\x1d.api.v1.alpha3.ObservationLog\"\x84\x01\n\x15GetSuggestionsRequest\x12-\n\nexperiment\x18\x01 \x01(\x0b\x32\x19.api.v1.alpha3.Experiment\x12$\n\x06trials\x18\x02 \x03(\x0b\x32\x14.api.v1.alpha3.Trial\x12\x16\n\x0erequest_number\x18\x03 \x01(\x05\"\xef\x01\n\x13GetSuggestionsReply\x12V\n\x15parameter_assignments\x18\x01 \x03(\x0b\x32\x37.api.v1.alpha3.GetSuggestionsReply.ParameterAssignments\x12/\n\talgorithm\x18\x02 \x01(\x0b\x32\x1c.api.v1.alpha3.AlgorithmSpec\x1aO\n\x14ParameterAssignments\x12\x37\n\x0b\x61ssignments\x18\x01 \x03(\x0b\x32\".api.v1.alpha3.ParameterAssignment\"Q\n ValidateAlgorithmSettingsRequest\x12-\n\nexperiment\x18\x01 \x01(\x0b\x32\x19.api.v1.alpha3.Experiment\" \n\x1eValidateAlgorithmSettingsReply*U\n\rParameterType\x12\x10\n\x0cUNKNOWN_TYPE\x10\x00\x12\n\n\x06\x44OUBLE\x10\x01\x12\x07\n\x03INT\x10\x02\x12\x0c\n\x08\x44ISCRETE\x10\x03\x12\x0f\n\x0b\x43\x41TEGORICAL\x10\x04*8\n\rObjectiveType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0c\n\x08MINIMIZE\x10\x01\x12\x0c\n\x08MAXIMIZE\x10\x02\x32\xca\x02\n\x07Manager\x12l\n\x14ReportObservationLog\x12*.api.v1.alpha3.ReportObservationLogRequest\x1a(.api.v1.alpha3.ReportObservationLogReply\x12\x63\n\x11GetObservationLog\x12\'.api.v1.alpha3.GetObservationLogRequest\x1a%.api.v1.alpha3.GetObservationLogReply\x12l\n\x14\x44\x65leteObservationLog\x12*.api.v1.alpha3.DeleteObservationLogRequest\x1a(.api.v1.alpha3.DeleteObservationLogReply2\xe5\x01\n\nSuggestion\x12Z\n\x0eGetSuggestions\x12$.api.v1.alpha3.GetSuggestionsRequest\x1a\".api.v1.alpha3.GetSuggestionsReply\x12{\n\x19ValidateAlgorithmSettings\x12/.api.v1.alpha3.ValidateAlgorithmSettingsRequest\x1a-.api.v1.alpha3.ValidateAlgorithmSettingsReply2\x0f\n\rEarlyStoppingb\x06proto3') - , - dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,]) - -_PARAMETERTYPE = _descriptor.EnumDescriptor( - name='ParameterType', - full_name='api.v1.alpha3.ParameterType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='UNKNOWN_TYPE', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='DOUBLE', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='INT', index=2, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='DISCRETE', index=3, number=3, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='CATEGORICAL', index=4, number=4, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=3422, - serialized_end=3507, -) -_sym_db.RegisterEnumDescriptor(_PARAMETERTYPE) - -ParameterType = enum_type_wrapper.EnumTypeWrapper(_PARAMETERTYPE) -_OBJECTIVETYPE = _descriptor.EnumDescriptor( - name='ObjectiveType', - full_name='api.v1.alpha3.ObjectiveType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='UNKNOWN', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='MINIMIZE', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='MAXIMIZE', index=2, number=2, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=3509, - serialized_end=3565, -) -_sym_db.RegisterEnumDescriptor(_OBJECTIVETYPE) - -ObjectiveType = enum_type_wrapper.EnumTypeWrapper(_OBJECTIVETYPE) -UNKNOWN_TYPE = 0 -DOUBLE = 1 -INT = 2 -DISCRETE = 3 -CATEGORICAL = 4 -UNKNOWN = 0 -MINIMIZE = 1 -MAXIMIZE = 2 - - -_TRIALSTATUS_TRIALCONDITIONTYPE = _descriptor.EnumDescriptor( - name='TrialConditionType', - full_name='api.v1.alpha3.TrialStatus.TrialConditionType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='CREATED', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='RUNNING', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='SUCCEEDED', index=2, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='KILLED', index=3, number=3, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='FAILED', index=4, number=4, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='UNKNOWN', index=5, number=5, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=2316, - serialized_end=2414, -) -_sym_db.RegisterEnumDescriptor(_TRIALSTATUS_TRIALCONDITIONTYPE) - - -_FEASIBLESPACE = _descriptor.Descriptor( - name='FeasibleSpace', - full_name='api.v1.alpha3.FeasibleSpace', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='max', full_name='api.v1.alpha3.FeasibleSpace.max', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='min', full_name='api.v1.alpha3.FeasibleSpace.min', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='list', full_name='api.v1.alpha3.FeasibleSpace.list', index=2, - number=3, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='step', full_name='api.v1.alpha3.FeasibleSpace.step', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=58, - serialized_end=127, -) - - -_PARAMETERSPEC = _descriptor.Descriptor( - name='ParameterSpec', - full_name='api.v1.alpha3.ParameterSpec', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='api.v1.alpha3.ParameterSpec.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='parameter_type', full_name='api.v1.alpha3.ParameterSpec.parameter_type', index=1, - number=2, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='feasible_space', full_name='api.v1.alpha3.ParameterSpec.feasible_space', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=130, - serialized_end=267, -) - - -_OBJECTIVESPEC = _descriptor.Descriptor( - name='ObjectiveSpec', - full_name='api.v1.alpha3.ObjectiveSpec', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='type', full_name='api.v1.alpha3.ObjectiveSpec.type', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='goal', full_name='api.v1.alpha3.ObjectiveSpec.goal', index=1, - number=2, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='objective_metric_name', full_name='api.v1.alpha3.ObjectiveSpec.objective_metric_name', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='additional_metric_names', full_name='api.v1.alpha3.ObjectiveSpec.additional_metric_names', index=3, - number=4, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=270, - serialized_end=407, -) - - -_ALGORITHMSETTING = _descriptor.Descriptor( - name='AlgorithmSetting', - full_name='api.v1.alpha3.AlgorithmSetting', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='api.v1.alpha3.AlgorithmSetting.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='value', full_name='api.v1.alpha3.AlgorithmSetting.value', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=409, - serialized_end=456, -) - - -_EARLYSTOPPINGSPEC = _descriptor.Descriptor( - name='EarlyStoppingSpec', - full_name='api.v1.alpha3.EarlyStoppingSpec', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=458, - serialized_end=477, -) - - -_ALGORITHMSPEC = _descriptor.Descriptor( - name='AlgorithmSpec', - full_name='api.v1.alpha3.AlgorithmSpec', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='algorithm_name', full_name='api.v1.alpha3.AlgorithmSpec.algorithm_name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='algorithm_setting', full_name='api.v1.alpha3.AlgorithmSpec.algorithm_setting', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='early_stopping_spec', full_name='api.v1.alpha3.AlgorithmSpec.early_stopping_spec', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=480, - serialized_end=642, -) - - -_NASCONFIG_OPERATIONS = _descriptor.Descriptor( - name='Operations', - full_name='api.v1.alpha3.NasConfig.Operations', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='operation', full_name='api.v1.alpha3.NasConfig.Operations.operation', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=765, - serialized_end=822, -) - -_NASCONFIG = _descriptor.Descriptor( - name='NasConfig', - full_name='api.v1.alpha3.NasConfig', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='graph_config', full_name='api.v1.alpha3.NasConfig.graph_config', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='operations', full_name='api.v1.alpha3.NasConfig.operations', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[_NASCONFIG_OPERATIONS, ], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=645, - serialized_end=822, -) - - -_GRAPHCONFIG = _descriptor.Descriptor( - name='GraphConfig', - full_name='api.v1.alpha3.GraphConfig', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='num_layers', full_name='api.v1.alpha3.GraphConfig.num_layers', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='input_sizes', full_name='api.v1.alpha3.GraphConfig.input_sizes', index=1, - number=2, type=5, cpp_type=1, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='output_sizes', full_name='api.v1.alpha3.GraphConfig.output_sizes', index=2, - number=3, type=5, cpp_type=1, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=824, - serialized_end=900, -) - - -_OPERATION_PARAMETERSPECS = _descriptor.Descriptor( - name='ParameterSpecs', - full_name='api.v1.alpha3.Operation.ParameterSpecs', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='parameters', full_name='api.v1.alpha3.Operation.ParameterSpecs.parameters', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1006, - serialized_end=1072, -) - -_OPERATION = _descriptor.Descriptor( - name='Operation', - full_name='api.v1.alpha3.Operation', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='operation_type', full_name='api.v1.alpha3.Operation.operation_type', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='parameter_specs', full_name='api.v1.alpha3.Operation.parameter_specs', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[_OPERATION_PARAMETERSPECS, ], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=903, - serialized_end=1072, -) - - -_EXPERIMENTSPEC_PARAMETERSPECS = _descriptor.Descriptor( - name='ParameterSpecs', - full_name='api.v1.alpha3.ExperimentSpec.ParameterSpecs', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='parameters', full_name='api.v1.alpha3.ExperimentSpec.ParameterSpecs.parameters', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1006, - serialized_end=1072, -) - -_EXPERIMENTSPEC = _descriptor.Descriptor( - name='ExperimentSpec', - full_name='api.v1.alpha3.ExperimentSpec', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='parameter_specs', full_name='api.v1.alpha3.ExperimentSpec.parameter_specs', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='objective', full_name='api.v1.alpha3.ExperimentSpec.objective', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='algorithm', full_name='api.v1.alpha3.ExperimentSpec.algorithm', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='trial_template', full_name='api.v1.alpha3.ExperimentSpec.trial_template', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='metrics_collector_spec', full_name='api.v1.alpha3.ExperimentSpec.metrics_collector_spec', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='parallel_trial_count', full_name='api.v1.alpha3.ExperimentSpec.parallel_trial_count', index=5, - number=6, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='max_trial_count', full_name='api.v1.alpha3.ExperimentSpec.max_trial_count', index=6, - number=7, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='nas_config', full_name='api.v1.alpha3.ExperimentSpec.nas_config', index=7, - number=8, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[_EXPERIMENTSPEC_PARAMETERSPECS, ], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1075, - serialized_end=1485, -) - - -_EXPERIMENT = _descriptor.Descriptor( - name='Experiment', - full_name='api.v1.alpha3.Experiment', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='api.v1.alpha3.Experiment.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='spec', full_name='api.v1.alpha3.Experiment.spec', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1487, - serialized_end=1558, -) - - -_PARAMETERASSIGNMENT = _descriptor.Descriptor( - name='ParameterAssignment', - full_name='api.v1.alpha3.ParameterAssignment', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='api.v1.alpha3.ParameterAssignment.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='value', full_name='api.v1.alpha3.ParameterAssignment.value', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1560, - serialized_end=1610, -) - - -_METRIC = _descriptor.Descriptor( - name='Metric', - full_name='api.v1.alpha3.Metric', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='api.v1.alpha3.Metric.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='value', full_name='api.v1.alpha3.Metric.value', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1612, - serialized_end=1649, -) - - -_METRICLOG = _descriptor.Descriptor( - name='MetricLog', - full_name='api.v1.alpha3.MetricLog', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='time_stamp', full_name='api.v1.alpha3.MetricLog.time_stamp', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='metric', full_name='api.v1.alpha3.MetricLog.metric', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1651, - serialized_end=1721, -) - - -_OBSERVATION = _descriptor.Descriptor( - name='Observation', - full_name='api.v1.alpha3.Observation', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='metrics', full_name='api.v1.alpha3.Observation.metrics', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1723, - serialized_end=1776, -) - - -_OBSERVATIONLOG = _descriptor.Descriptor( - name='ObservationLog', - full_name='api.v1.alpha3.ObservationLog', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='metric_logs', full_name='api.v1.alpha3.ObservationLog.metric_logs', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1778, - serialized_end=1841, -) - - -_TRIALSPEC_PARAMETERASSIGNMENTS = _descriptor.Descriptor( - name='ParameterAssignments', - full_name='api.v1.alpha3.TrialSpec.ParameterAssignments', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='assignments', full_name='api.v1.alpha3.TrialSpec.ParameterAssignments.assignments', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2059, - serialized_end=2138, -) - -_TRIALSPEC = _descriptor.Descriptor( - name='TrialSpec', - full_name='api.v1.alpha3.TrialSpec', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='experiment_name', full_name='api.v1.alpha3.TrialSpec.experiment_name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='objective', full_name='api.v1.alpha3.TrialSpec.objective', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='parameter_assignments', full_name='api.v1.alpha3.TrialSpec.parameter_assignments', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='run_spec', full_name='api.v1.alpha3.TrialSpec.run_spec', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='metrics_collector_spec', full_name='api.v1.alpha3.TrialSpec.metrics_collector_spec', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[_TRIALSPEC_PARAMETERASSIGNMENTS, ], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1844, - serialized_end=2138, -) - - -_TRIALSTATUS = _descriptor.Descriptor( - name='TrialStatus', - full_name='api.v1.alpha3.TrialStatus', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='start_time', full_name='api.v1.alpha3.TrialStatus.start_time', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='completion_time', full_name='api.v1.alpha3.TrialStatus.completion_time', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='condition', full_name='api.v1.alpha3.TrialStatus.condition', index=2, - number=3, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='observation', full_name='api.v1.alpha3.TrialStatus.observation', index=3, - number=4, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _TRIALSTATUS_TRIALCONDITIONTYPE, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2141, - serialized_end=2414, -) - - -_TRIAL = _descriptor.Descriptor( - name='Trial', - full_name='api.v1.alpha3.Trial', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='api.v1.alpha3.Trial.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='spec', full_name='api.v1.alpha3.Trial.spec', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='status', full_name='api.v1.alpha3.Trial.status', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2416, - serialized_end=2521, -) - - -_REPORTOBSERVATIONLOGREQUEST = _descriptor.Descriptor( - name='ReportObservationLogRequest', - full_name='api.v1.alpha3.ReportObservationLogRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='trial_name', full_name='api.v1.alpha3.ReportObservationLogRequest.trial_name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='observation_log', full_name='api.v1.alpha3.ReportObservationLogRequest.observation_log', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2523, - serialized_end=2628, -) - - -_REPORTOBSERVATIONLOGREPLY = _descriptor.Descriptor( - name='ReportObservationLogReply', - full_name='api.v1.alpha3.ReportObservationLogReply', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2630, - serialized_end=2657, -) - - -_DELETEOBSERVATIONLOGREQUEST = _descriptor.Descriptor( - name='DeleteObservationLogRequest', - full_name='api.v1.alpha3.DeleteObservationLogRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='trial_name', full_name='api.v1.alpha3.DeleteObservationLogRequest.trial_name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2659, - serialized_end=2708, -) - - -_DELETEOBSERVATIONLOGREPLY = _descriptor.Descriptor( - name='DeleteObservationLogReply', - full_name='api.v1.alpha3.DeleteObservationLogReply', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2710, - serialized_end=2737, -) - - -_GETOBSERVATIONLOGREQUEST = _descriptor.Descriptor( - name='GetObservationLogRequest', - full_name='api.v1.alpha3.GetObservationLogRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='trial_name', full_name='api.v1.alpha3.GetObservationLogRequest.trial_name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='metric_name', full_name='api.v1.alpha3.GetObservationLogRequest.metric_name', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='start_time', full_name='api.v1.alpha3.GetObservationLogRequest.start_time', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='end_time', full_name='api.v1.alpha3.GetObservationLogRequest.end_time', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2739, - serialized_end=2844, -) - - -_GETOBSERVATIONLOGREPLY = _descriptor.Descriptor( - name='GetObservationLogReply', - full_name='api.v1.alpha3.GetObservationLogReply', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='observation_log', full_name='api.v1.alpha3.GetObservationLogReply.observation_log', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2846, - serialized_end=2926, -) - - -_GETSUGGESTIONSREQUEST = _descriptor.Descriptor( - name='GetSuggestionsRequest', - full_name='api.v1.alpha3.GetSuggestionsRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='experiment', full_name='api.v1.alpha3.GetSuggestionsRequest.experiment', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='trials', full_name='api.v1.alpha3.GetSuggestionsRequest.trials', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='request_number', full_name='api.v1.alpha3.GetSuggestionsRequest.request_number', index=2, - number=3, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2929, - serialized_end=3061, -) - - -_GETSUGGESTIONSREPLY_PARAMETERASSIGNMENTS = _descriptor.Descriptor( - name='ParameterAssignments', - full_name='api.v1.alpha3.GetSuggestionsReply.ParameterAssignments', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='assignments', full_name='api.v1.alpha3.GetSuggestionsReply.ParameterAssignments.assignments', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2059, - serialized_end=2138, -) - -_GETSUGGESTIONSREPLY = _descriptor.Descriptor( - name='GetSuggestionsReply', - full_name='api.v1.alpha3.GetSuggestionsReply', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='parameter_assignments', full_name='api.v1.alpha3.GetSuggestionsReply.parameter_assignments', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='algorithm', full_name='api.v1.alpha3.GetSuggestionsReply.algorithm', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[_GETSUGGESTIONSREPLY_PARAMETERASSIGNMENTS, ], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=3064, - serialized_end=3303, -) - - -_VALIDATEALGORITHMSETTINGSREQUEST = _descriptor.Descriptor( - name='ValidateAlgorithmSettingsRequest', - full_name='api.v1.alpha3.ValidateAlgorithmSettingsRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='experiment', full_name='api.v1.alpha3.ValidateAlgorithmSettingsRequest.experiment', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=3305, - serialized_end=3386, -) - - -_VALIDATEALGORITHMSETTINGSREPLY = _descriptor.Descriptor( - name='ValidateAlgorithmSettingsReply', - full_name='api.v1.alpha3.ValidateAlgorithmSettingsReply', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=3388, - serialized_end=3420, -) - -_PARAMETERSPEC.fields_by_name['parameter_type'].enum_type = _PARAMETERTYPE -_PARAMETERSPEC.fields_by_name['feasible_space'].message_type = _FEASIBLESPACE -_OBJECTIVESPEC.fields_by_name['type'].enum_type = _OBJECTIVETYPE -_ALGORITHMSPEC.fields_by_name['algorithm_setting'].message_type = _ALGORITHMSETTING -_ALGORITHMSPEC.fields_by_name['early_stopping_spec'].message_type = _EARLYSTOPPINGSPEC -_NASCONFIG_OPERATIONS.fields_by_name['operation'].message_type = _OPERATION -_NASCONFIG_OPERATIONS.containing_type = _NASCONFIG -_NASCONFIG.fields_by_name['graph_config'].message_type = _GRAPHCONFIG -_NASCONFIG.fields_by_name['operations'].message_type = _NASCONFIG_OPERATIONS -_OPERATION_PARAMETERSPECS.fields_by_name['parameters'].message_type = _PARAMETERSPEC -_OPERATION_PARAMETERSPECS.containing_type = _OPERATION -_OPERATION.fields_by_name['parameter_specs'].message_type = _OPERATION_PARAMETERSPECS -_EXPERIMENTSPEC_PARAMETERSPECS.fields_by_name['parameters'].message_type = _PARAMETERSPEC -_EXPERIMENTSPEC_PARAMETERSPECS.containing_type = _EXPERIMENTSPEC -_EXPERIMENTSPEC.fields_by_name['parameter_specs'].message_type = _EXPERIMENTSPEC_PARAMETERSPECS -_EXPERIMENTSPEC.fields_by_name['objective'].message_type = _OBJECTIVESPEC -_EXPERIMENTSPEC.fields_by_name['algorithm'].message_type = _ALGORITHMSPEC -_EXPERIMENTSPEC.fields_by_name['nas_config'].message_type = _NASCONFIG -_EXPERIMENT.fields_by_name['spec'].message_type = _EXPERIMENTSPEC -_METRICLOG.fields_by_name['metric'].message_type = _METRIC -_OBSERVATION.fields_by_name['metrics'].message_type = _METRIC -_OBSERVATIONLOG.fields_by_name['metric_logs'].message_type = _METRICLOG -_TRIALSPEC_PARAMETERASSIGNMENTS.fields_by_name['assignments'].message_type = _PARAMETERASSIGNMENT -_TRIALSPEC_PARAMETERASSIGNMENTS.containing_type = _TRIALSPEC -_TRIALSPEC.fields_by_name['objective'].message_type = _OBJECTIVESPEC -_TRIALSPEC.fields_by_name['parameter_assignments'].message_type = _TRIALSPEC_PARAMETERASSIGNMENTS -_TRIALSTATUS.fields_by_name['condition'].enum_type = _TRIALSTATUS_TRIALCONDITIONTYPE -_TRIALSTATUS.fields_by_name['observation'].message_type = _OBSERVATION -_TRIALSTATUS_TRIALCONDITIONTYPE.containing_type = _TRIALSTATUS -_TRIAL.fields_by_name['spec'].message_type = _TRIALSPEC -_TRIAL.fields_by_name['status'].message_type = _TRIALSTATUS -_REPORTOBSERVATIONLOGREQUEST.fields_by_name['observation_log'].message_type = _OBSERVATIONLOG -_GETOBSERVATIONLOGREPLY.fields_by_name['observation_log'].message_type = _OBSERVATIONLOG -_GETSUGGESTIONSREQUEST.fields_by_name['experiment'].message_type = _EXPERIMENT -_GETSUGGESTIONSREQUEST.fields_by_name['trials'].message_type = _TRIAL -_GETSUGGESTIONSREPLY_PARAMETERASSIGNMENTS.fields_by_name['assignments'].message_type = _PARAMETERASSIGNMENT -_GETSUGGESTIONSREPLY_PARAMETERASSIGNMENTS.containing_type = _GETSUGGESTIONSREPLY -_GETSUGGESTIONSREPLY.fields_by_name['parameter_assignments'].message_type = _GETSUGGESTIONSREPLY_PARAMETERASSIGNMENTS -_GETSUGGESTIONSREPLY.fields_by_name['algorithm'].message_type = _ALGORITHMSPEC -_VALIDATEALGORITHMSETTINGSREQUEST.fields_by_name['experiment'].message_type = _EXPERIMENT -DESCRIPTOR.message_types_by_name['FeasibleSpace'] = _FEASIBLESPACE -DESCRIPTOR.message_types_by_name['ParameterSpec'] = _PARAMETERSPEC -DESCRIPTOR.message_types_by_name['ObjectiveSpec'] = _OBJECTIVESPEC -DESCRIPTOR.message_types_by_name['AlgorithmSetting'] = _ALGORITHMSETTING -DESCRIPTOR.message_types_by_name['EarlyStoppingSpec'] = _EARLYSTOPPINGSPEC -DESCRIPTOR.message_types_by_name['AlgorithmSpec'] = _ALGORITHMSPEC -DESCRIPTOR.message_types_by_name['NasConfig'] = _NASCONFIG -DESCRIPTOR.message_types_by_name['GraphConfig'] = _GRAPHCONFIG -DESCRIPTOR.message_types_by_name['Operation'] = _OPERATION -DESCRIPTOR.message_types_by_name['ExperimentSpec'] = _EXPERIMENTSPEC -DESCRIPTOR.message_types_by_name['Experiment'] = _EXPERIMENT -DESCRIPTOR.message_types_by_name['ParameterAssignment'] = _PARAMETERASSIGNMENT -DESCRIPTOR.message_types_by_name['Metric'] = _METRIC -DESCRIPTOR.message_types_by_name['MetricLog'] = _METRICLOG -DESCRIPTOR.message_types_by_name['Observation'] = _OBSERVATION -DESCRIPTOR.message_types_by_name['ObservationLog'] = _OBSERVATIONLOG -DESCRIPTOR.message_types_by_name['TrialSpec'] = _TRIALSPEC -DESCRIPTOR.message_types_by_name['TrialStatus'] = _TRIALSTATUS -DESCRIPTOR.message_types_by_name['Trial'] = _TRIAL -DESCRIPTOR.message_types_by_name['ReportObservationLogRequest'] = _REPORTOBSERVATIONLOGREQUEST -DESCRIPTOR.message_types_by_name['ReportObservationLogReply'] = _REPORTOBSERVATIONLOGREPLY -DESCRIPTOR.message_types_by_name['DeleteObservationLogRequest'] = _DELETEOBSERVATIONLOGREQUEST -DESCRIPTOR.message_types_by_name['DeleteObservationLogReply'] = _DELETEOBSERVATIONLOGREPLY -DESCRIPTOR.message_types_by_name['GetObservationLogRequest'] = _GETOBSERVATIONLOGREQUEST -DESCRIPTOR.message_types_by_name['GetObservationLogReply'] = _GETOBSERVATIONLOGREPLY -DESCRIPTOR.message_types_by_name['GetSuggestionsRequest'] = _GETSUGGESTIONSREQUEST -DESCRIPTOR.message_types_by_name['GetSuggestionsReply'] = _GETSUGGESTIONSREPLY -DESCRIPTOR.message_types_by_name['ValidateAlgorithmSettingsRequest'] = _VALIDATEALGORITHMSETTINGSREQUEST -DESCRIPTOR.message_types_by_name['ValidateAlgorithmSettingsReply'] = _VALIDATEALGORITHMSETTINGSREPLY -DESCRIPTOR.enum_types_by_name['ParameterType'] = _PARAMETERTYPE -DESCRIPTOR.enum_types_by_name['ObjectiveType'] = _OBJECTIVETYPE -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -FeasibleSpace = _reflection.GeneratedProtocolMessageType('FeasibleSpace', (_message.Message,), dict( - DESCRIPTOR = _FEASIBLESPACE, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.FeasibleSpace) - )) -_sym_db.RegisterMessage(FeasibleSpace) - -ParameterSpec = _reflection.GeneratedProtocolMessageType('ParameterSpec', (_message.Message,), dict( - DESCRIPTOR = _PARAMETERSPEC, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.ParameterSpec) - )) -_sym_db.RegisterMessage(ParameterSpec) - -ObjectiveSpec = _reflection.GeneratedProtocolMessageType('ObjectiveSpec', (_message.Message,), dict( - DESCRIPTOR = _OBJECTIVESPEC, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.ObjectiveSpec) - )) -_sym_db.RegisterMessage(ObjectiveSpec) - -AlgorithmSetting = _reflection.GeneratedProtocolMessageType('AlgorithmSetting', (_message.Message,), dict( - DESCRIPTOR = _ALGORITHMSETTING, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.AlgorithmSetting) - )) -_sym_db.RegisterMessage(AlgorithmSetting) - -EarlyStoppingSpec = _reflection.GeneratedProtocolMessageType('EarlyStoppingSpec', (_message.Message,), dict( - DESCRIPTOR = _EARLYSTOPPINGSPEC, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.EarlyStoppingSpec) - )) -_sym_db.RegisterMessage(EarlyStoppingSpec) - -AlgorithmSpec = _reflection.GeneratedProtocolMessageType('AlgorithmSpec', (_message.Message,), dict( - DESCRIPTOR = _ALGORITHMSPEC, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.AlgorithmSpec) - )) -_sym_db.RegisterMessage(AlgorithmSpec) - -NasConfig = _reflection.GeneratedProtocolMessageType('NasConfig', (_message.Message,), dict( - - Operations = _reflection.GeneratedProtocolMessageType('Operations', (_message.Message,), dict( - DESCRIPTOR = _NASCONFIG_OPERATIONS, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.NasConfig.Operations) - )) - , - DESCRIPTOR = _NASCONFIG, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.NasConfig) - )) -_sym_db.RegisterMessage(NasConfig) -_sym_db.RegisterMessage(NasConfig.Operations) - -GraphConfig = _reflection.GeneratedProtocolMessageType('GraphConfig', (_message.Message,), dict( - DESCRIPTOR = _GRAPHCONFIG, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.GraphConfig) - )) -_sym_db.RegisterMessage(GraphConfig) - -Operation = _reflection.GeneratedProtocolMessageType('Operation', (_message.Message,), dict( - - ParameterSpecs = _reflection.GeneratedProtocolMessageType('ParameterSpecs', (_message.Message,), dict( - DESCRIPTOR = _OPERATION_PARAMETERSPECS, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.Operation.ParameterSpecs) - )) - , - DESCRIPTOR = _OPERATION, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.Operation) - )) -_sym_db.RegisterMessage(Operation) -_sym_db.RegisterMessage(Operation.ParameterSpecs) - -ExperimentSpec = _reflection.GeneratedProtocolMessageType('ExperimentSpec', (_message.Message,), dict( - - ParameterSpecs = _reflection.GeneratedProtocolMessageType('ParameterSpecs', (_message.Message,), dict( - DESCRIPTOR = _EXPERIMENTSPEC_PARAMETERSPECS, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.ExperimentSpec.ParameterSpecs) - )) - , - DESCRIPTOR = _EXPERIMENTSPEC, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.ExperimentSpec) - )) -_sym_db.RegisterMessage(ExperimentSpec) -_sym_db.RegisterMessage(ExperimentSpec.ParameterSpecs) - -Experiment = _reflection.GeneratedProtocolMessageType('Experiment', (_message.Message,), dict( - DESCRIPTOR = _EXPERIMENT, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.Experiment) - )) -_sym_db.RegisterMessage(Experiment) - -ParameterAssignment = _reflection.GeneratedProtocolMessageType('ParameterAssignment', (_message.Message,), dict( - DESCRIPTOR = _PARAMETERASSIGNMENT, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.ParameterAssignment) - )) -_sym_db.RegisterMessage(ParameterAssignment) - -Metric = _reflection.GeneratedProtocolMessageType('Metric', (_message.Message,), dict( - DESCRIPTOR = _METRIC, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.Metric) - )) -_sym_db.RegisterMessage(Metric) - -MetricLog = _reflection.GeneratedProtocolMessageType('MetricLog', (_message.Message,), dict( - DESCRIPTOR = _METRICLOG, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.MetricLog) - )) -_sym_db.RegisterMessage(MetricLog) - -Observation = _reflection.GeneratedProtocolMessageType('Observation', (_message.Message,), dict( - DESCRIPTOR = _OBSERVATION, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.Observation) - )) -_sym_db.RegisterMessage(Observation) - -ObservationLog = _reflection.GeneratedProtocolMessageType('ObservationLog', (_message.Message,), dict( - DESCRIPTOR = _OBSERVATIONLOG, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.ObservationLog) - )) -_sym_db.RegisterMessage(ObservationLog) - -TrialSpec = _reflection.GeneratedProtocolMessageType('TrialSpec', (_message.Message,), dict( - - ParameterAssignments = _reflection.GeneratedProtocolMessageType('ParameterAssignments', (_message.Message,), dict( - DESCRIPTOR = _TRIALSPEC_PARAMETERASSIGNMENTS, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.TrialSpec.ParameterAssignments) - )) - , - DESCRIPTOR = _TRIALSPEC, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.TrialSpec) - )) -_sym_db.RegisterMessage(TrialSpec) -_sym_db.RegisterMessage(TrialSpec.ParameterAssignments) - -TrialStatus = _reflection.GeneratedProtocolMessageType('TrialStatus', (_message.Message,), dict( - DESCRIPTOR = _TRIALSTATUS, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.TrialStatus) - )) -_sym_db.RegisterMessage(TrialStatus) - -Trial = _reflection.GeneratedProtocolMessageType('Trial', (_message.Message,), dict( - DESCRIPTOR = _TRIAL, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.Trial) - )) -_sym_db.RegisterMessage(Trial) - -ReportObservationLogRequest = _reflection.GeneratedProtocolMessageType('ReportObservationLogRequest', (_message.Message,), dict( - DESCRIPTOR = _REPORTOBSERVATIONLOGREQUEST, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.ReportObservationLogRequest) - )) -_sym_db.RegisterMessage(ReportObservationLogRequest) - -ReportObservationLogReply = _reflection.GeneratedProtocolMessageType('ReportObservationLogReply', (_message.Message,), dict( - DESCRIPTOR = _REPORTOBSERVATIONLOGREPLY, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.ReportObservationLogReply) - )) -_sym_db.RegisterMessage(ReportObservationLogReply) - -DeleteObservationLogRequest = _reflection.GeneratedProtocolMessageType('DeleteObservationLogRequest', (_message.Message,), dict( - DESCRIPTOR = _DELETEOBSERVATIONLOGREQUEST, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.DeleteObservationLogRequest) - )) -_sym_db.RegisterMessage(DeleteObservationLogRequest) - -DeleteObservationLogReply = _reflection.GeneratedProtocolMessageType('DeleteObservationLogReply', (_message.Message,), dict( - DESCRIPTOR = _DELETEOBSERVATIONLOGREPLY, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.DeleteObservationLogReply) - )) -_sym_db.RegisterMessage(DeleteObservationLogReply) - -GetObservationLogRequest = _reflection.GeneratedProtocolMessageType('GetObservationLogRequest', (_message.Message,), dict( - DESCRIPTOR = _GETOBSERVATIONLOGREQUEST, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.GetObservationLogRequest) - )) -_sym_db.RegisterMessage(GetObservationLogRequest) - -GetObservationLogReply = _reflection.GeneratedProtocolMessageType('GetObservationLogReply', (_message.Message,), dict( - DESCRIPTOR = _GETOBSERVATIONLOGREPLY, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.GetObservationLogReply) - )) -_sym_db.RegisterMessage(GetObservationLogReply) - -GetSuggestionsRequest = _reflection.GeneratedProtocolMessageType('GetSuggestionsRequest', (_message.Message,), dict( - DESCRIPTOR = _GETSUGGESTIONSREQUEST, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.GetSuggestionsRequest) - )) -_sym_db.RegisterMessage(GetSuggestionsRequest) - -GetSuggestionsReply = _reflection.GeneratedProtocolMessageType('GetSuggestionsReply', (_message.Message,), dict( - - ParameterAssignments = _reflection.GeneratedProtocolMessageType('ParameterAssignments', (_message.Message,), dict( - DESCRIPTOR = _GETSUGGESTIONSREPLY_PARAMETERASSIGNMENTS, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.GetSuggestionsReply.ParameterAssignments) - )) - , - DESCRIPTOR = _GETSUGGESTIONSREPLY, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.GetSuggestionsReply) - )) -_sym_db.RegisterMessage(GetSuggestionsReply) -_sym_db.RegisterMessage(GetSuggestionsReply.ParameterAssignments) - -ValidateAlgorithmSettingsRequest = _reflection.GeneratedProtocolMessageType('ValidateAlgorithmSettingsRequest', (_message.Message,), dict( - DESCRIPTOR = _VALIDATEALGORITHMSETTINGSREQUEST, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.ValidateAlgorithmSettingsRequest) - )) -_sym_db.RegisterMessage(ValidateAlgorithmSettingsRequest) - -ValidateAlgorithmSettingsReply = _reflection.GeneratedProtocolMessageType('ValidateAlgorithmSettingsReply', (_message.Message,), dict( - DESCRIPTOR = _VALIDATEALGORITHMSETTINGSREPLY, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:api.v1.alpha3.ValidateAlgorithmSettingsReply) - )) -_sym_db.RegisterMessage(ValidateAlgorithmSettingsReply) - - - -_MANAGER = _descriptor.ServiceDescriptor( - name='Manager', - full_name='api.v1.alpha3.Manager', - file=DESCRIPTOR, - index=0, - options=None, - serialized_start=3568, - serialized_end=3898, - methods=[ - _descriptor.MethodDescriptor( - name='ReportObservationLog', - full_name='api.v1.alpha3.Manager.ReportObservationLog', - index=0, - containing_service=None, - input_type=_REPORTOBSERVATIONLOGREQUEST, - output_type=_REPORTOBSERVATIONLOGREPLY, - options=None, - ), - _descriptor.MethodDescriptor( - name='GetObservationLog', - full_name='api.v1.alpha3.Manager.GetObservationLog', - index=1, - containing_service=None, - input_type=_GETOBSERVATIONLOGREQUEST, - output_type=_GETOBSERVATIONLOGREPLY, - options=None, - ), - _descriptor.MethodDescriptor( - name='DeleteObservationLog', - full_name='api.v1.alpha3.Manager.DeleteObservationLog', - index=2, - containing_service=None, - input_type=_DELETEOBSERVATIONLOGREQUEST, - output_type=_DELETEOBSERVATIONLOGREPLY, - options=None, - ), -]) -_sym_db.RegisterServiceDescriptor(_MANAGER) - -DESCRIPTOR.services_by_name['Manager'] = _MANAGER - - -_SUGGESTION = _descriptor.ServiceDescriptor( - name='Suggestion', - full_name='api.v1.alpha3.Suggestion', - file=DESCRIPTOR, - index=1, - options=None, - serialized_start=3901, - serialized_end=4130, - methods=[ - _descriptor.MethodDescriptor( - name='GetSuggestions', - full_name='api.v1.alpha3.Suggestion.GetSuggestions', - index=0, - containing_service=None, - input_type=_GETSUGGESTIONSREQUEST, - output_type=_GETSUGGESTIONSREPLY, - options=None, - ), - _descriptor.MethodDescriptor( - name='ValidateAlgorithmSettings', - full_name='api.v1.alpha3.Suggestion.ValidateAlgorithmSettings', - index=1, - containing_service=None, - input_type=_VALIDATEALGORITHMSETTINGSREQUEST, - output_type=_VALIDATEALGORITHMSETTINGSREPLY, - options=None, - ), -]) -_sym_db.RegisterServiceDescriptor(_SUGGESTION) - -DESCRIPTOR.services_by_name['Suggestion'] = _SUGGESTION - - -_EARLYSTOPPING = _descriptor.ServiceDescriptor( - name='EarlyStopping', - full_name='api.v1.alpha3.EarlyStopping', - file=DESCRIPTOR, - index=2, - options=None, - serialized_start=4132, - serialized_end=4147, - methods=[ -]) -_sym_db.RegisterServiceDescriptor(_EARLYSTOPPING) - -DESCRIPTOR.services_by_name['EarlyStopping'] = _EARLYSTOPPING - -try: - # THESE ELEMENTS WILL BE DEPRECATED. - # Please use the generated *_pb2_grpc.py files instead. - import grpc - from grpc.beta import implementations as beta_implementations - from grpc.beta import interfaces as beta_interfaces - from grpc.framework.common import cardinality - from grpc.framework.interfaces.face import utilities as face_utilities - - - class ManagerStub(object): - """* - Service for Main API for Katib - For each RPC service, we define mapping to HTTP REST API method. - The mapping includes the URL path, query parameters and request body. - https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http - """ - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.ReportObservationLog = channel.unary_unary( - '/api.v1.alpha3.Manager/ReportObservationLog', - request_serializer=ReportObservationLogRequest.SerializeToString, - response_deserializer=ReportObservationLogReply.FromString, - ) - self.GetObservationLog = channel.unary_unary( - '/api.v1.alpha3.Manager/GetObservationLog', - request_serializer=GetObservationLogRequest.SerializeToString, - response_deserializer=GetObservationLogReply.FromString, - ) - self.DeleteObservationLog = channel.unary_unary( - '/api.v1.alpha3.Manager/DeleteObservationLog', - request_serializer=DeleteObservationLogRequest.SerializeToString, - response_deserializer=DeleteObservationLogReply.FromString, - ) - - - class ManagerServicer(object): - """* - Service for Main API for Katib - For each RPC service, we define mapping to HTTP REST API method. - The mapping includes the URL path, query parameters and request body. - https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http - """ - - def ReportObservationLog(self, request, context): - """* - Report a log of Observations for a Trial. - The log consists of timestamp and value of metric. - Katib store every log of metrics. - You can see accuracy curve or other metric logs on UI. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetObservationLog(self, request, context): - """* - Get all log of Observations for a Trial. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def DeleteObservationLog(self, request, context): - """* - Delete all log of Observations for a Trial. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - - def add_ManagerServicer_to_server(servicer, server): - rpc_method_handlers = { - 'ReportObservationLog': grpc.unary_unary_rpc_method_handler( - servicer.ReportObservationLog, - request_deserializer=ReportObservationLogRequest.FromString, - response_serializer=ReportObservationLogReply.SerializeToString, - ), - 'GetObservationLog': grpc.unary_unary_rpc_method_handler( - servicer.GetObservationLog, - request_deserializer=GetObservationLogRequest.FromString, - response_serializer=GetObservationLogReply.SerializeToString, - ), - 'DeleteObservationLog': grpc.unary_unary_rpc_method_handler( - servicer.DeleteObservationLog, - request_deserializer=DeleteObservationLogRequest.FromString, - response_serializer=DeleteObservationLogReply.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'api.v1.alpha3.Manager', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - - - class SuggestionStub(object): - # missing associated documentation comment in .proto file - pass - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.GetSuggestions = channel.unary_unary( - '/api.v1.alpha3.Suggestion/GetSuggestions', - request_serializer=GetSuggestionsRequest.SerializeToString, - response_deserializer=GetSuggestionsReply.FromString, - ) - self.ValidateAlgorithmSettings = channel.unary_unary( - '/api.v1.alpha3.Suggestion/ValidateAlgorithmSettings', - request_serializer=ValidateAlgorithmSettingsRequest.SerializeToString, - response_deserializer=ValidateAlgorithmSettingsReply.FromString, - ) - - - class SuggestionServicer(object): - # missing associated documentation comment in .proto file - pass - - def GetSuggestions(self, request, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ValidateAlgorithmSettings(self, request, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - - def add_SuggestionServicer_to_server(servicer, server): - rpc_method_handlers = { - 'GetSuggestions': grpc.unary_unary_rpc_method_handler( - servicer.GetSuggestions, - request_deserializer=GetSuggestionsRequest.FromString, - response_serializer=GetSuggestionsReply.SerializeToString, - ), - 'ValidateAlgorithmSettings': grpc.unary_unary_rpc_method_handler( - servicer.ValidateAlgorithmSettings, - request_deserializer=ValidateAlgorithmSettingsRequest.FromString, - response_serializer=ValidateAlgorithmSettingsReply.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'api.v1.alpha3.Suggestion', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - - - class EarlyStoppingStub(object): - """TODO - """ - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - - - class EarlyStoppingServicer(object): - """TODO - """ - - - def add_EarlyStoppingServicer_to_server(servicer, server): - rpc_method_handlers = { - } - generic_handler = grpc.method_handlers_generic_handler( - 'api.v1.alpha3.EarlyStopping', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - - - class BetaManagerServicer(object): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This class was generated - only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" - """* - Service for Main API for Katib - For each RPC service, we define mapping to HTTP REST API method. - The mapping includes the URL path, query parameters and request body. - https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http - """ - def ReportObservationLog(self, request, context): - """* - Report a log of Observations for a Trial. - The log consists of timestamp and value of metric. - Katib store every log of metrics. - You can see accuracy curve or other metric logs on UI. - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - def GetObservationLog(self, request, context): - """* - Get all log of Observations for a Trial. - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - def DeleteObservationLog(self, request, context): - """* - Delete all log of Observations for a Trial. - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - - - class BetaManagerStub(object): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This class was generated - only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" - """* - Service for Main API for Katib - For each RPC service, we define mapping to HTTP REST API method. - The mapping includes the URL path, query parameters and request body. - https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http - """ - def ReportObservationLog(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - """* - Report a log of Observations for a Trial. - The log consists of timestamp and value of metric. - Katib store every log of metrics. - You can see accuracy curve or other metric logs on UI. - """ - raise NotImplementedError() - ReportObservationLog.future = None - def GetObservationLog(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - """* - Get all log of Observations for a Trial. - """ - raise NotImplementedError() - GetObservationLog.future = None - def DeleteObservationLog(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - """* - Delete all log of Observations for a Trial. - """ - raise NotImplementedError() - DeleteObservationLog.future = None - - - def beta_create_Manager_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This function was - generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" - request_deserializers = { - ('api.v1.alpha3.Manager', 'DeleteObservationLog'): DeleteObservationLogRequest.FromString, - ('api.v1.alpha3.Manager', 'GetObservationLog'): GetObservationLogRequest.FromString, - ('api.v1.alpha3.Manager', 'ReportObservationLog'): ReportObservationLogRequest.FromString, - } - response_serializers = { - ('api.v1.alpha3.Manager', 'DeleteObservationLog'): DeleteObservationLogReply.SerializeToString, - ('api.v1.alpha3.Manager', 'GetObservationLog'): GetObservationLogReply.SerializeToString, - ('api.v1.alpha3.Manager', 'ReportObservationLog'): ReportObservationLogReply.SerializeToString, - } - method_implementations = { - ('api.v1.alpha3.Manager', 'DeleteObservationLog'): face_utilities.unary_unary_inline(servicer.DeleteObservationLog), - ('api.v1.alpha3.Manager', 'GetObservationLog'): face_utilities.unary_unary_inline(servicer.GetObservationLog), - ('api.v1.alpha3.Manager', 'ReportObservationLog'): face_utilities.unary_unary_inline(servicer.ReportObservationLog), - } - server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) - return beta_implementations.server(method_implementations, options=server_options) - - - def beta_create_Manager_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This function was - generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" - request_serializers = { - ('api.v1.alpha3.Manager', 'DeleteObservationLog'): DeleteObservationLogRequest.SerializeToString, - ('api.v1.alpha3.Manager', 'GetObservationLog'): GetObservationLogRequest.SerializeToString, - ('api.v1.alpha3.Manager', 'ReportObservationLog'): ReportObservationLogRequest.SerializeToString, - } - response_deserializers = { - ('api.v1.alpha3.Manager', 'DeleteObservationLog'): DeleteObservationLogReply.FromString, - ('api.v1.alpha3.Manager', 'GetObservationLog'): GetObservationLogReply.FromString, - ('api.v1.alpha3.Manager', 'ReportObservationLog'): ReportObservationLogReply.FromString, - } - cardinalities = { - 'DeleteObservationLog': cardinality.Cardinality.UNARY_UNARY, - 'GetObservationLog': cardinality.Cardinality.UNARY_UNARY, - 'ReportObservationLog': cardinality.Cardinality.UNARY_UNARY, - } - stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) - return beta_implementations.dynamic_stub(channel, 'api.v1.alpha3.Manager', cardinalities, options=stub_options) - - - class BetaSuggestionServicer(object): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This class was generated - only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" - # missing associated documentation comment in .proto file - pass - def GetSuggestions(self, request, context): - # missing associated documentation comment in .proto file - pass - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - def ValidateAlgorithmSettings(self, request, context): - # missing associated documentation comment in .proto file - pass - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - - - class BetaSuggestionStub(object): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This class was generated - only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" - # missing associated documentation comment in .proto file - pass - def GetSuggestions(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - # missing associated documentation comment in .proto file - pass - raise NotImplementedError() - GetSuggestions.future = None - def ValidateAlgorithmSettings(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - # missing associated documentation comment in .proto file - pass - raise NotImplementedError() - ValidateAlgorithmSettings.future = None - - - def beta_create_Suggestion_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This function was - generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" - request_deserializers = { - ('api.v1.alpha3.Suggestion', 'GetSuggestions'): GetSuggestionsRequest.FromString, - ('api.v1.alpha3.Suggestion', 'ValidateAlgorithmSettings'): ValidateAlgorithmSettingsRequest.FromString, - } - response_serializers = { - ('api.v1.alpha3.Suggestion', 'GetSuggestions'): GetSuggestionsReply.SerializeToString, - ('api.v1.alpha3.Suggestion', 'ValidateAlgorithmSettings'): ValidateAlgorithmSettingsReply.SerializeToString, - } - method_implementations = { - ('api.v1.alpha3.Suggestion', 'GetSuggestions'): face_utilities.unary_unary_inline(servicer.GetSuggestions), - ('api.v1.alpha3.Suggestion', 'ValidateAlgorithmSettings'): face_utilities.unary_unary_inline(servicer.ValidateAlgorithmSettings), - } - server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) - return beta_implementations.server(method_implementations, options=server_options) - - - def beta_create_Suggestion_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This function was - generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" - request_serializers = { - ('api.v1.alpha3.Suggestion', 'GetSuggestions'): GetSuggestionsRequest.SerializeToString, - ('api.v1.alpha3.Suggestion', 'ValidateAlgorithmSettings'): ValidateAlgorithmSettingsRequest.SerializeToString, - } - response_deserializers = { - ('api.v1.alpha3.Suggestion', 'GetSuggestions'): GetSuggestionsReply.FromString, - ('api.v1.alpha3.Suggestion', 'ValidateAlgorithmSettings'): ValidateAlgorithmSettingsReply.FromString, - } - cardinalities = { - 'GetSuggestions': cardinality.Cardinality.UNARY_UNARY, - 'ValidateAlgorithmSettings': cardinality.Cardinality.UNARY_UNARY, - } - stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) - return beta_implementations.dynamic_stub(channel, 'api.v1.alpha3.Suggestion', cardinalities, options=stub_options) - - - class BetaEarlyStoppingServicer(object): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This class was generated - only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" - """TODO - """ - - - class BetaEarlyStoppingStub(object): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This class was generated - only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" - """TODO - """ - - - def beta_create_EarlyStopping_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This function was - generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" - request_deserializers = { - } - response_serializers = { - } - method_implementations = { - } - server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) - return beta_implementations.server(method_implementations, options=server_options) - - - def beta_create_EarlyStopping_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This function was - generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" - request_serializers = { - } - response_deserializers = { - } - cardinalities = { - } - stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) - return beta_implementations.dynamic_stub(channel, 'api.v1.alpha3.EarlyStopping', cardinalities, options=stub_options) -except ImportError: - pass -# @@protoc_insertion_point(module_scope) diff --git a/pkg/apis/manager/v1alpha3/python/api_pb2_grpc.py b/pkg/apis/manager/v1alpha3/python/api_pb2_grpc.py deleted file mode 100644 index d38bda8de28..00000000000 --- a/pkg/apis/manager/v1alpha3/python/api_pb2_grpc.py +++ /dev/null @@ -1,178 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -import grpc - -import api_pb2 as api__pb2 - - -class ManagerStub(object): - """* - Service for Main API for Katib - For each RPC service, we define mapping to HTTP REST API method. - The mapping includes the URL path, query parameters and request body. - https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http - """ - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.ReportObservationLog = channel.unary_unary( - '/api.v1.alpha3.Manager/ReportObservationLog', - request_serializer=api__pb2.ReportObservationLogRequest.SerializeToString, - response_deserializer=api__pb2.ReportObservationLogReply.FromString, - ) - self.GetObservationLog = channel.unary_unary( - '/api.v1.alpha3.Manager/GetObservationLog', - request_serializer=api__pb2.GetObservationLogRequest.SerializeToString, - response_deserializer=api__pb2.GetObservationLogReply.FromString, - ) - self.DeleteObservationLog = channel.unary_unary( - '/api.v1.alpha3.Manager/DeleteObservationLog', - request_serializer=api__pb2.DeleteObservationLogRequest.SerializeToString, - response_deserializer=api__pb2.DeleteObservationLogReply.FromString, - ) - - -class ManagerServicer(object): - """* - Service for Main API for Katib - For each RPC service, we define mapping to HTTP REST API method. - The mapping includes the URL path, query parameters and request body. - https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http - """ - - def ReportObservationLog(self, request, context): - """* - Report a log of Observations for a Trial. - The log consists of timestamp and value of metric. - Katib store every log of metrics. - You can see accuracy curve or other metric logs on UI. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetObservationLog(self, request, context): - """* - Get all log of Observations for a Trial. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def DeleteObservationLog(self, request, context): - """* - Delete all log of Observations for a Trial. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - -def add_ManagerServicer_to_server(servicer, server): - rpc_method_handlers = { - 'ReportObservationLog': grpc.unary_unary_rpc_method_handler( - servicer.ReportObservationLog, - request_deserializer=api__pb2.ReportObservationLogRequest.FromString, - response_serializer=api__pb2.ReportObservationLogReply.SerializeToString, - ), - 'GetObservationLog': grpc.unary_unary_rpc_method_handler( - servicer.GetObservationLog, - request_deserializer=api__pb2.GetObservationLogRequest.FromString, - response_serializer=api__pb2.GetObservationLogReply.SerializeToString, - ), - 'DeleteObservationLog': grpc.unary_unary_rpc_method_handler( - servicer.DeleteObservationLog, - request_deserializer=api__pb2.DeleteObservationLogRequest.FromString, - response_serializer=api__pb2.DeleteObservationLogReply.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'api.v1.alpha3.Manager', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - - -class SuggestionStub(object): - # missing associated documentation comment in .proto file - pass - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.GetSuggestions = channel.unary_unary( - '/api.v1.alpha3.Suggestion/GetSuggestions', - request_serializer=api__pb2.GetSuggestionsRequest.SerializeToString, - response_deserializer=api__pb2.GetSuggestionsReply.FromString, - ) - self.ValidateAlgorithmSettings = channel.unary_unary( - '/api.v1.alpha3.Suggestion/ValidateAlgorithmSettings', - request_serializer=api__pb2.ValidateAlgorithmSettingsRequest.SerializeToString, - response_deserializer=api__pb2.ValidateAlgorithmSettingsReply.FromString, - ) - - -class SuggestionServicer(object): - # missing associated documentation comment in .proto file - pass - - def GetSuggestions(self, request, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ValidateAlgorithmSettings(self, request, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - -def add_SuggestionServicer_to_server(servicer, server): - rpc_method_handlers = { - 'GetSuggestions': grpc.unary_unary_rpc_method_handler( - servicer.GetSuggestions, - request_deserializer=api__pb2.GetSuggestionsRequest.FromString, - response_serializer=api__pb2.GetSuggestionsReply.SerializeToString, - ), - 'ValidateAlgorithmSettings': grpc.unary_unary_rpc_method_handler( - servicer.ValidateAlgorithmSettings, - request_deserializer=api__pb2.ValidateAlgorithmSettingsRequest.FromString, - response_serializer=api__pb2.ValidateAlgorithmSettingsReply.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'api.v1.alpha3.Suggestion', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - - -class EarlyStoppingStub(object): - """TODO - """ - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - - -class EarlyStoppingServicer(object): - """TODO - """ - - -def add_EarlyStoppingServicer_to_server(servicer, server): - rpc_method_handlers = { - } - generic_handler = grpc.method_handlers_generic_handler( - 'api.v1.alpha3.EarlyStopping', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) diff --git a/pkg/apis/v1alpha3/openapi_generated.go b/pkg/apis/v1alpha3/openapi_generated.go deleted file mode 100644 index 5c88d96b1bf..00000000000 --- a/pkg/apis/v1alpha3/openapi_generated.go +++ /dev/null @@ -1,1503 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by main. DO NOT EDIT. - -// This file was autogenerated by openapi-gen. Do not edit it manually! - -package v1alpha3 - -import ( - spec "github.com/go-openapi/spec" - common "k8s.io/kube-openapi/pkg/common" -) - -func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { - return map[string]common.OpenAPIDefinition{ - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.AlgorithmSetting": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "name": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "value": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - Dependencies: []string{}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.AlgorithmSpec": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "algorithmName": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "algorithmSettings": { - SchemaProps: spec.SchemaProps{ - Description: "Key-value pairs representing settings for suggestion algorithms.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.AlgorithmSetting"), - }, - }, - }, - }, - }, - "earlyStopping": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.EarlyStoppingSpec"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.AlgorithmSetting", "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.EarlyStoppingSpec"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.CollectorSpec": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "customCollector": { - SchemaProps: spec.SchemaProps{ - Description: "When kind is \"customCollector\", this field will be used", - Ref: ref("k8s.io/api/core/v1.Container"), - }, - }, - }, - Required: []string{"kind"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/core/v1.Container"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.EarlyStoppingSetting": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "name": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "value": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - Dependencies: []string{}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.EarlyStoppingSpec": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "earlyStoppingAlgorithmName": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "earlyStoppingSettings": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.EarlyStoppingSetting"), - }, - }, - }, - }, - }, - }, - Required: []string{"earlyStoppingSettings"}, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.EarlyStoppingSetting"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.FileSystemPath": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "path": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "kind": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - Dependencies: []string{}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.FilterSpec": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "metricsFormat": { - SchemaProps: spec.SchemaProps{ - Description: "When the metrics output follows format as this field specified, metricsCollector collects it and reports to metrics server, it can be \": \" or else", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - }, - }, - }, - Dependencies: []string{}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.Metric": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "name": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "value": { - SchemaProps: spec.SchemaProps{ - Type: []string{"number"}, - Format: "double", - }, - }, - }, - }, - }, - Dependencies: []string{}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.MetricsCollectorSpec": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "source": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.SourceSpec"), - }, - }, - "collector": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.CollectorSpec"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.CollectorSpec", "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.SourceSpec"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.ObjectiveSpec": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "type": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "goal": { - SchemaProps: spec.SchemaProps{ - Type: []string{"number"}, - Format: "double", - }, - }, - "objectiveMetricName": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "additionalMetricNames": { - SchemaProps: spec.SchemaProps{ - Description: "This can be empty if we only care about the objective metric. Note: If we adopt a push instead of pull mechanism, this can be omitted completely.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - }, - }, - }, - Dependencies: []string{}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.Observation": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "metrics": { - SchemaProps: spec.SchemaProps{ - Description: "Key-value pairs for metric names and values", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.Metric"), - }, - }, - }, - }, - }, - }, - Required: []string{"metrics"}, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.Metric"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.ParameterAssignment": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "name": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "value": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - Dependencies: []string{}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.SourceSpec": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "httpGet": { - SchemaProps: spec.SchemaProps{ - Description: "Model-train source code can expose metrics by http, such as HTTP endpoint in prometheus metric format", - Ref: ref("k8s.io/api/core/v1.HTTPGetAction"), - }, - }, - "fileSystemPath": { - SchemaProps: spec.SchemaProps{ - Description: "During training model, metrics may be persisted into local file in source code, such as tfEvent use case", - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.FileSystemPath"), - }, - }, - "filter": { - SchemaProps: spec.SchemaProps{ - Description: "Default metric output format is {\"metric\": \"\", \"value\": , \"epoch\": , \"step\": }, but if the output doesn't follow default format, please extend it here", - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.FilterSpec"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.FileSystemPath", "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.FilterSpec", "k8s.io/api/core/v1.HTTPGetAction"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.Experiment": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "Structure of the Experiment custom resource.", - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "spec": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ExperimentSpec"), - }, - }, - "status": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ExperimentStatus"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ExperimentSpec", "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ExperimentStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ExperimentCondition": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ExperimentCondition describes the state of the experiment at a certain point.", - Properties: map[string]spec.Schema{ - "type": { - SchemaProps: spec.SchemaProps{ - Description: "Type of experiment condition.", - Type: []string{"string"}, - Format: "", - }, - }, - "status": { - SchemaProps: spec.SchemaProps{ - Description: "Status of the condition, one of True, False, Unknown.", - Type: []string{"string"}, - Format: "", - }, - }, - "reason": { - SchemaProps: spec.SchemaProps{ - Description: "The reason for the condition's last transition.", - Type: []string{"string"}, - Format: "", - }, - }, - "message": { - SchemaProps: spec.SchemaProps{ - Description: "A human readable message indicating details about the transition.", - Type: []string{"string"}, - Format: "", - }, - }, - "lastUpdateTime": { - SchemaProps: spec.SchemaProps{ - Description: "The last time this condition was updated.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - "lastTransitionTime": { - SchemaProps: spec.SchemaProps{ - Description: "Last time the condition transitioned from one status to another.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - }, - Required: []string{"type", "status"}, - }, - }, - Dependencies: []string{ - "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ExperimentList": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ExperimentList contains a list of Experiments", - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), - }, - }, - "items": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.Experiment"), - }, - }, - }, - }, - }, - }, - Required: []string{"items"}, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.Experiment", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ExperimentSpec": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "parameters": { - SchemaProps: spec.SchemaProps{ - Description: "List of hyperparameter configurations.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ParameterSpec"), - }, - }, - }, - }, - }, - "objective": { - SchemaProps: spec.SchemaProps{ - Description: "Describes the objective of the experiment.", - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.ObjectiveSpec"), - }, - }, - "algorithm": { - SchemaProps: spec.SchemaProps{ - Description: "Describes the suggestion algorithm.", - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.AlgorithmSpec"), - }, - }, - "trialTemplate": { - SchemaProps: spec.SchemaProps{ - Description: "Template for each run of the trial.", - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.TrialTemplate"), - }, - }, - "parallelTrialCount": { - SchemaProps: spec.SchemaProps{ - Description: "How many trials can be processed in parallel. Defaults to 3", - Type: []string{"integer"}, - Format: "int32", - }, - }, - "maxTrialCount": { - SchemaProps: spec.SchemaProps{ - Description: "Max completed trials to mark experiment as succeeded", - Type: []string{"integer"}, - Format: "int32", - }, - }, - "maxFailedTrialCount": { - SchemaProps: spec.SchemaProps{ - Description: "Max failed trials to mark experiment as failed.", - Type: []string{"integer"}, - Format: "int32", - }, - }, - "metricsCollectorSpec": { - SchemaProps: spec.SchemaProps{ - Description: "For v1alpha3 we will keep the metrics collector implementation same as v1alpha1.", - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.MetricsCollectorSpec"), - }, - }, - "nasConfig": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.NasConfig"), - }, - }, - "resumePolicy": { - SchemaProps: spec.SchemaProps{ - Description: "Describes resuming policy which usually take effect after experiment terminated.", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.AlgorithmSpec", "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.MetricsCollectorSpec", "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.ObjectiveSpec", "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.NasConfig", "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ParameterSpec", "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.TrialTemplate"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ExperimentStatus": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "startTime": { - SchemaProps: spec.SchemaProps{ - Description: "Represents time when the Experiment was acknowledged by the Experiment controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - "completionTime": { - SchemaProps: spec.SchemaProps{ - Description: "Represents time when the Experiment was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - "lastReconcileTime": { - SchemaProps: spec.SchemaProps{ - Description: "Represents last time when the Experiment was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - "conditions": { - SchemaProps: spec.SchemaProps{ - Description: "List of observed runtime conditions for this Experiment.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ExperimentCondition"), - }, - }, - }, - }, - }, - "currentOptimalTrial": { - SchemaProps: spec.SchemaProps{ - Description: "Current optimal trial parameters and observations.", - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.OptimalTrial"), - }, - }, - "runningTrialList": { - SchemaProps: spec.SchemaProps{ - Description: "List of trial names which are running.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - "pendingTrialList": { - SchemaProps: spec.SchemaProps{ - Description: "List of trial names which are pending.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - "failedTrialList": { - SchemaProps: spec.SchemaProps{ - Description: "List of trial names which have already failed.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - "succeededTrialList": { - SchemaProps: spec.SchemaProps{ - Description: "List of trial names which have already succeeded.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - "killedTrialList": { - SchemaProps: spec.SchemaProps{ - Description: "List of trial names which have been killed.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - "trials": { - SchemaProps: spec.SchemaProps{ - Description: "Trials is the total number of trials owned by the experiment.", - Type: []string{"integer"}, - Format: "int32", - }, - }, - "trialsSucceeded": { - SchemaProps: spec.SchemaProps{ - Description: "How many trials have succeeded.", - Type: []string{"integer"}, - Format: "int32", - }, - }, - "trialsFailed": { - SchemaProps: spec.SchemaProps{ - Description: "How many trials have failed.", - Type: []string{"integer"}, - Format: "int32", - }, - }, - "trialsKilled": { - SchemaProps: spec.SchemaProps{ - Description: "How many trials have been killed.", - Type: []string{"integer"}, - Format: "int32", - }, - }, - "trialsPending": { - SchemaProps: spec.SchemaProps{ - Description: "How many trials are currently pending.", - Type: []string{"integer"}, - Format: "int32", - }, - }, - "trialsRunning": { - SchemaProps: spec.SchemaProps{ - Description: "How many trials are currently running.", - Type: []string{"integer"}, - Format: "int32", - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ExperimentCondition", "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.OptimalTrial", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.FeasibleSpace": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "max": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "min": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "list": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - "step": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - Dependencies: []string{}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.GoTemplate": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "templateSpec": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.TemplateSpec"), - }, - }, - "rawTemplate": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.TemplateSpec"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.GraphConfig": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "GraphConfig contains a config of DAG", - Properties: map[string]spec.Schema{ - "numLayers": { - SchemaProps: spec.SchemaProps{ - Type: []string{"integer"}, - Format: "int32", - }, - }, - "inputSizes": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"integer"}, - Format: "int32", - }, - }, - }, - }, - }, - "outputSizes": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"integer"}, - Format: "int32", - }, - }, - }, - }, - }, - }, - }, - }, - Dependencies: []string{}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.NasConfig": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "NasConfig contains config for NAS job", - Properties: map[string]spec.Schema{ - "graphConfig": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.GraphConfig"), - }, - }, - "operations": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.Operation"), - }, - }, - }, - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.GraphConfig", "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.Operation"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.Operation": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "Operation contains type of operation in DAG", - Properties: map[string]spec.Schema{ - "operationType": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "parameters": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ParameterSpec"), - }, - }, - }, - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ParameterSpec"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.OptimalTrial": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "OptimalTrial is the metrics and assignments of the best trial.", - Properties: map[string]spec.Schema{ - "bestTrialName": { - SchemaProps: spec.SchemaProps{ - Description: "BestTrialName is the name of the best trial.", - Type: []string{"string"}, - Format: "", - }, - }, - "parameterAssignments": { - SchemaProps: spec.SchemaProps{ - Description: "Key-value pairs for hyperparameters and assignment values.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.ParameterAssignment"), - }, - }, - }, - }, - }, - "observation": { - SchemaProps: spec.SchemaProps{ - Description: "Observation for this trial", - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.Observation"), - }, - }, - }, - Required: []string{"bestTrialName", "parameterAssignments"}, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.Observation", "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.ParameterAssignment"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.ParameterSpec": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "name": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "parameterType": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "feasibleSpace": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.FeasibleSpace"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.FeasibleSpace"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.TemplateSpec": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "configMapName": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "configMapNamespace": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "templatePath": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - Dependencies: []string{}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.TrialTemplate": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "retain": { - SchemaProps: spec.SchemaProps{ - Type: []string{"boolean"}, - Format: "", - }, - }, - "goTemplate": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.GoTemplate"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3.GoTemplate"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.Suggestion": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "Suggestion represents the structure of a Suggestion resource.", - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "spec": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.SuggestionSpec"), - }, - }, - "status": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.SuggestionStatus"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.SuggestionSpec", "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.SuggestionStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.SuggestionCondition": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "SuggestionCondition describes the state of the Suggestion at a certain point.", - Properties: map[string]spec.Schema{ - "type": { - SchemaProps: spec.SchemaProps{ - Description: "Type of Suggestion condition.", - Type: []string{"string"}, - Format: "", - }, - }, - "status": { - SchemaProps: spec.SchemaProps{ - Description: "Status of the condition, one of True, False, Unknown.", - Type: []string{"string"}, - Format: "", - }, - }, - "reason": { - SchemaProps: spec.SchemaProps{ - Description: "The reason for the condition's last transition.", - Type: []string{"string"}, - Format: "", - }, - }, - "message": { - SchemaProps: spec.SchemaProps{ - Description: "A human readable message indicating details about the transition.", - Type: []string{"string"}, - Format: "", - }, - }, - "lastUpdateTime": { - SchemaProps: spec.SchemaProps{ - Description: "The last time this condition was updated.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - "lastTransitionTime": { - SchemaProps: spec.SchemaProps{ - Description: "Last time the condition transitioned from one status to another.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - }, - Required: []string{"type", "status"}, - }, - }, - Dependencies: []string{ - "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.SuggestionList": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "SuggestionList contains a list of Suggestion", - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), - }, - }, - "items": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.Suggestion"), - }, - }, - }, - }, - }, - }, - Required: []string{"items"}, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.Suggestion", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.SuggestionSpec": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "SuggestionSpec defines the desired state of Suggestion", - Properties: map[string]spec.Schema{ - "algorithmName": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "requests": { - SchemaProps: spec.SchemaProps{ - Description: "Number of suggestions requested", - Type: []string{"integer"}, - Format: "int32", - }, - }, - }, - Required: []string{"algorithmName"}, - }, - }, - Dependencies: []string{}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.SuggestionStatus": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "SuggestionStatus defines the observed state of Suggestion", - Properties: map[string]spec.Schema{ - "algorithmSettings": { - SchemaProps: spec.SchemaProps{ - Description: "Algorithmsettings set by the algorithm services.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.AlgorithmSetting"), - }, - }, - }, - }, - }, - "suggestionCount": { - SchemaProps: spec.SchemaProps{ - Description: "Number of suggestion results", - Type: []string{"integer"}, - Format: "int32", - }, - }, - "suggestions": { - SchemaProps: spec.SchemaProps{ - Description: "Suggestion results", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.TrialAssignment"), - }, - }, - }, - }, - }, - "startTime": { - SchemaProps: spec.SchemaProps{ - Description: "Represents time when the Suggestion was acknowledged by the Suggestion controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - "completionTime": { - SchemaProps: spec.SchemaProps{ - Description: "Represents time when the Suggestion was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - "lastReconcileTime": { - SchemaProps: spec.SchemaProps{ - Description: "Represents last time when the Suggestion was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - "conditions": { - SchemaProps: spec.SchemaProps{ - Description: "List of observed runtime conditions for this Suggestion.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.SuggestionCondition"), - }, - }, - }, - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.AlgorithmSetting", "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.SuggestionCondition", "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.TrialAssignment", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3.TrialAssignment": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "TrialAssignment is the assignment for one trial.", - Properties: map[string]spec.Schema{ - "parameterAssignments": { - SchemaProps: spec.SchemaProps{ - Description: "Suggestion results", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.ParameterAssignment"), - }, - }, - }, - }, - }, - "name": { - SchemaProps: spec.SchemaProps{ - Description: "Name of the suggestion", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.ParameterAssignment"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3.Trial": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "Represents the structure of a Trial resource.", - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "spec": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3.TrialSpec"), - }, - }, - "status": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3.TrialStatus"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3.TrialSpec", "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3.TrialStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3.TrialCondition": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "TrialCondition describes the state of the trial at a certain point.", - Properties: map[string]spec.Schema{ - "type": { - SchemaProps: spec.SchemaProps{ - Description: "Type of trial condition.", - Type: []string{"string"}, - Format: "", - }, - }, - "status": { - SchemaProps: spec.SchemaProps{ - Description: "Status of the condition, one of True, False, Unknown.", - Type: []string{"string"}, - Format: "", - }, - }, - "reason": { - SchemaProps: spec.SchemaProps{ - Description: "The reason for the condition's last transition.", - Type: []string{"string"}, - Format: "", - }, - }, - "message": { - SchemaProps: spec.SchemaProps{ - Description: "A human readable message indicating details about the transition.", - Type: []string{"string"}, - Format: "", - }, - }, - "lastUpdateTime": { - SchemaProps: spec.SchemaProps{ - Description: "The last time this condition was updated.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - "lastTransitionTime": { - SchemaProps: spec.SchemaProps{ - Description: "Last time the condition transitioned from one status to another.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - }, - Required: []string{"type", "status"}, - }, - }, - Dependencies: []string{ - "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3.TrialList": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "TrialList contains a list of Trials", - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), - }, - }, - "items": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3.Trial"), - }, - }, - }, - }, - }, - }, - Required: []string{"items"}, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3.Trial", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3.TrialSpec": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "objective": { - SchemaProps: spec.SchemaProps{ - Description: "Describes the objective of the experiment.", - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.ObjectiveSpec"), - }, - }, - "parameterAssignments": { - SchemaProps: spec.SchemaProps{ - Description: "Key-value pairs for hyperparameters and assignment values.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.ParameterAssignment"), - }, - }, - }, - }, - }, - "runSpec": { - SchemaProps: spec.SchemaProps{ - Description: "Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest.", - Type: []string{"string"}, - Format: "", - }, - }, - "retainRun": { - SchemaProps: spec.SchemaProps{ - Description: "Whether to retain the trial run object after completed.", - Type: []string{"boolean"}, - Format: "", - }, - }, - "metricsCollector": { - SchemaProps: spec.SchemaProps{ - Description: "Describes how metrics will be collected", - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.MetricsCollectorSpec"), - }, - }, - }, - Required: []string{"parameterAssignments"}, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.MetricsCollectorSpec", "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.ObjectiveSpec", "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.ParameterAssignment"}, - }, - "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3.TrialStatus": { - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Properties: map[string]spec.Schema{ - "startTime": { - SchemaProps: spec.SchemaProps{ - Description: "Represents time when the Trial was acknowledged by the Trial controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - "completionTime": { - SchemaProps: spec.SchemaProps{ - Description: "Represents time when the Trial was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - "lastReconcileTime": { - SchemaProps: spec.SchemaProps{ - Description: "Represents last time when the Trial was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - "conditions": { - SchemaProps: spec.SchemaProps{ - Description: "List of observed runtime conditions for this Trial.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3.TrialCondition"), - }, - }, - }, - }, - }, - "observation": { - SchemaProps: spec.SchemaProps{ - Description: "Results of the Trial - objectives and other metrics values.", - Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.Observation"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3.Observation", "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3.TrialCondition", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, - }, - } -} diff --git a/pkg/apis/v1alpha3/swagger.json b/pkg/apis/v1alpha3/swagger.json deleted file mode 100644 index a9661214c75..00000000000 --- a/pkg/apis/v1alpha3/swagger.json +++ /dev/null @@ -1,834 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Swagger description for Katib", - "title": "Katib", - "version": "v1alpha3-0.1" - }, - "paths": {}, - "definitions": { - ".v1alpha3.Suggestion": { - "description": "Suggestion represents the structure of a Suggestion resource.", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - "type": "string" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "$ref": "#/definitions/v1.ObjectMeta" - }, - "spec": { - "$ref": "#/definitions/.v1alpha3.SuggestionSpec" - }, - "status": { - "$ref": "#/definitions/.v1alpha3.SuggestionStatus" - } - } - }, - ".v1alpha3.SuggestionCondition": { - "description": "SuggestionCondition describes the state of the Suggestion at a certain point.", - "required": [ - "type", - "status" - ], - "properties": { - "lastTransitionTime": { - "description": "Last time the condition transitioned from one status to another.", - "$ref": "#/definitions/v1.Time" - }, - "lastUpdateTime": { - "description": "The last time this condition was updated.", - "$ref": "#/definitions/v1.Time" - }, - "message": { - "description": "A human readable message indicating details about the transition.", - "type": "string" - }, - "reason": { - "description": "The reason for the condition's last transition.", - "type": "string" - }, - "status": { - "description": "Status of the condition, one of True, False, Unknown.", - "type": "string" - }, - "type": { - "description": "Type of Suggestion condition.", - "type": "string" - } - } - }, - ".v1alpha3.SuggestionList": { - "description": "SuggestionList contains a list of Suggestion", - "required": [ - "items" - ], - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - "type": "string" - }, - "items": { - "type": "array", - "items": { - "$ref": "#/definitions/.v1alpha3.Suggestion" - } - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "$ref": "#/definitions/v1.ListMeta" - } - } - }, - ".v1alpha3.SuggestionSpec": { - "description": "SuggestionSpec defines the desired state of Suggestion", - "required": [ - "algorithmName" - ], - "properties": { - "algorithmName": { - "type": "string" - }, - "requests": { - "description": "Number of suggestions requested", - "type": "integer", - "format": "int32" - } - } - }, - ".v1alpha3.SuggestionStatus": { - "description": "SuggestionStatus defines the observed state of Suggestion", - "properties": { - "algorithmSettings": { - "description": "Algorithmsettings set by the algorithm services.", - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha3.AlgorithmSetting" - } - }, - "completionTime": { - "description": "Represents time when the Suggestion was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - "$ref": "#/definitions/v1.Time" - }, - "conditions": { - "description": "List of observed runtime conditions for this Suggestion.", - "type": "array", - "items": { - "$ref": "#/definitions/.v1alpha3.SuggestionCondition" - } - }, - "lastReconcileTime": { - "description": "Represents last time when the Suggestion was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - "$ref": "#/definitions/v1.Time" - }, - "startTime": { - "description": "Represents time when the Suggestion was acknowledged by the Suggestion controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - "$ref": "#/definitions/v1.Time" - }, - "suggestionCount": { - "description": "Number of suggestion results", - "type": "integer", - "format": "int32" - }, - "suggestions": { - "description": "Suggestion results", - "type": "array", - "items": { - "$ref": "#/definitions/.v1alpha3.TrialAssignment" - } - } - } - }, - ".v1alpha3.Trial": { - "description": "Represents the structure of a Trial resource.", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - "type": "string" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "$ref": "#/definitions/v1.ObjectMeta" - }, - "spec": { - "$ref": "#/definitions/.v1alpha3.TrialSpec" - }, - "status": { - "$ref": "#/definitions/.v1alpha3.TrialStatus" - } - } - }, - ".v1alpha3.TrialAssignment": { - "description": "TrialAssignment is the assignment for one trial.", - "properties": { - "name": { - "description": "Name of the suggestion", - "type": "string" - }, - "parameterAssignments": { - "description": "Suggestion results", - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha3.ParameterAssignment" - } - } - } - }, - ".v1alpha3.TrialCondition": { - "description": "TrialCondition describes the state of the trial at a certain point.", - "required": [ - "type", - "status" - ], - "properties": { - "lastTransitionTime": { - "description": "Last time the condition transitioned from one status to another.", - "$ref": "#/definitions/v1.Time" - }, - "lastUpdateTime": { - "description": "The last time this condition was updated.", - "$ref": "#/definitions/v1.Time" - }, - "message": { - "description": "A human readable message indicating details about the transition.", - "type": "string" - }, - "reason": { - "description": "The reason for the condition's last transition.", - "type": "string" - }, - "status": { - "description": "Status of the condition, one of True, False, Unknown.", - "type": "string" - }, - "type": { - "description": "Type of trial condition.", - "type": "string" - } - } - }, - ".v1alpha3.TrialList": { - "description": "TrialList contains a list of Trials", - "required": [ - "items" - ], - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - "type": "string" - }, - "items": { - "type": "array", - "items": { - "$ref": "#/definitions/.v1alpha3.Trial" - } - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "$ref": "#/definitions/v1.ListMeta" - } - } - }, - ".v1alpha3.TrialSpec": { - "required": [ - "parameterAssignments" - ], - "properties": { - "metricsCollector": { - "description": "Describes how metrics will be collected", - "$ref": "#/definitions/v1alpha3.MetricsCollectorSpec" - }, - "objective": { - "description": "Describes the objective of the experiment.", - "$ref": "#/definitions/v1alpha3.ObjectiveSpec" - }, - "parameterAssignments": { - "description": "Key-value pairs for hyperparameters and assignment values.", - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha3.ParameterAssignment" - } - }, - "retainRun": { - "description": "Whether to retain the trial run object after completed.", - "type": "boolean" - }, - "runSpec": { - "description": "Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest.", - "type": "string" - } - } - }, - ".v1alpha3.TrialStatus": { - "properties": { - "completionTime": { - "description": "Represents time when the Trial was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC", - "$ref": "#/definitions/v1.Time" - }, - "conditions": { - "description": "List of observed runtime conditions for this Trial.", - "type": "array", - "items": { - "$ref": "#/definitions/.v1alpha3.TrialCondition" - } - }, - "lastReconcileTime": { - "description": "Represents last time when the Trial was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - "$ref": "#/definitions/v1.Time" - }, - "observation": { - "description": "Results of the Trial - objectives and other metrics values.", - "$ref": "#/definitions/v1alpha3.Observation" - }, - "startTime": { - "description": "Represents time when the Trial was acknowledged by the Trial controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC", - "$ref": "#/definitions/v1.Time" - } - } - }, - "v1alpha3.AlgorithmSetting": { - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - } - }, - "v1alpha3.AlgorithmSpec": { - "properties": { - "algorithmName": { - "type": "string" - }, - "algorithmSettings": { - "description": "Key-value pairs representing settings for suggestion algorithms.", - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha3.AlgorithmSetting" - } - }, - "earlyStopping": { - "$ref": "#/definitions/v1alpha3.EarlyStoppingSpec" - } - } - }, - "v1alpha3.CollectorSpec": { - "required": [ - "kind" - ], - "properties": { - "customCollector": { - "description": "When kind is \"customCollector\", this field will be used", - "$ref": "#/definitions/v1.Container" - }, - "kind": { - "type": "string" - } - } - }, - "v1alpha3.EarlyStoppingSetting": { - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - } - }, - "v1alpha3.EarlyStoppingSpec": { - "required": [ - "earlyStoppingSettings" - ], - "properties": { - "earlyStoppingAlgorithmName": { - "type": "string" - }, - "earlyStoppingSettings": { - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha3.EarlyStoppingSetting" - } - } - } - }, - "v1alpha3.Experiment": { - "description": "Structure of the Experiment custom resource.", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - "type": "string" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "$ref": "#/definitions/v1.ObjectMeta" - }, - "spec": { - "$ref": "#/definitions/v1alpha3.ExperimentSpec" - }, - "status": { - "$ref": "#/definitions/v1alpha3.ExperimentStatus" - } - } - }, - "v1alpha3.ExperimentCondition": { - "description": "ExperimentCondition describes the state of the experiment at a certain point.", - "required": [ - "type", - "status" - ], - "properties": { - "lastTransitionTime": { - "description": "Last time the condition transitioned from one status to another.", - "$ref": "#/definitions/v1.Time" - }, - "lastUpdateTime": { - "description": "The last time this condition was updated.", - "$ref": "#/definitions/v1.Time" - }, - "message": { - "description": "A human readable message indicating details about the transition.", - "type": "string" - }, - "reason": { - "description": "The reason for the condition's last transition.", - "type": "string" - }, - "status": { - "description": "Status of the condition, one of True, False, Unknown.", - "type": "string" - }, - "type": { - "description": "Type of experiment condition.", - "type": "string" - } - } - }, - "v1alpha3.ExperimentList": { - "description": "ExperimentList contains a list of Experiments", - "required": [ - "items" - ], - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - "type": "string" - }, - "items": { - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha3.Experiment" - } - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "$ref": "#/definitions/v1.ListMeta" - } - } - }, - "v1alpha3.ExperimentSpec": { - "properties": { - "algorithm": { - "description": "Describes the suggestion algorithm.", - "$ref": "#/definitions/v1alpha3.AlgorithmSpec" - }, - "maxFailedTrialCount": { - "description": "Max failed trials to mark experiment as failed.", - "type": "integer", - "format": "int32" - }, - "maxTrialCount": { - "description": "Max completed trials to mark experiment as succeeded", - "type": "integer", - "format": "int32" - }, - "metricsCollectorSpec": { - "description": "For v1alpha3 we will keep the metrics collector implementation same as v1alpha1.", - "$ref": "#/definitions/v1alpha3.MetricsCollectorSpec" - }, - "nasConfig": { - "$ref": "#/definitions/v1alpha3.NasConfig" - }, - "objective": { - "description": "Describes the objective of the experiment.", - "$ref": "#/definitions/v1alpha3.ObjectiveSpec" - }, - "parallelTrialCount": { - "description": "How many trials can be processed in parallel. Defaults to 3", - "type": "integer", - "format": "int32" - }, - "parameters": { - "description": "List of hyperparameter configurations.", - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha3.ParameterSpec" - } - }, - "resumePolicy": { - "description": "Describes resuming policy which usually take effect after experiment terminated.", - "type": "string" - }, - "trialTemplate": { - "description": "Template for each run of the trial.", - "$ref": "#/definitions/v1alpha3.TrialTemplate" - } - } - }, - "v1alpha3.ExperimentStatus": { - "properties": { - "completionTime": { - "description": "Represents time when the Experiment was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - "$ref": "#/definitions/v1.Time" - }, - "conditions": { - "description": "List of observed runtime conditions for this Experiment.", - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha3.ExperimentCondition" - } - }, - "currentOptimalTrial": { - "description": "Current optimal trial parameters and observations.", - "$ref": "#/definitions/v1alpha3.OptimalTrial" - }, - "failedTrialList": { - "description": "List of trial names which have already failed.", - "type": "array", - "items": { - "type": "string" - } - }, - "killedTrialList": { - "description": "List of trial names which have been killed.", - "type": "array", - "items": { - "type": "string" - } - }, - "lastReconcileTime": { - "description": "Represents last time when the Experiment was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - "$ref": "#/definitions/v1.Time" - }, - "pendingTrialList": { - "description": "List of trial names which are pending.", - "type": "array", - "items": { - "type": "string" - } - }, - "runningTrialList": { - "description": "List of trial names which are running.", - "type": "array", - "items": { - "type": "string" - } - }, - "startTime": { - "description": "Represents time when the Experiment was acknowledged by the Experiment controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - "$ref": "#/definitions/v1.Time" - }, - "succeededTrialList": { - "description": "List of trial names which have already succeeded.", - "type": "array", - "items": { - "type": "string" - } - }, - "trials": { - "description": "Trials is the total number of trials owned by the experiment.", - "type": "integer", - "format": "int32" - }, - "trialsFailed": { - "description": "How many trials have failed.", - "type": "integer", - "format": "int32" - }, - "trialsKilled": { - "description": "How many trials have been killed.", - "type": "integer", - "format": "int32" - }, - "trialsPending": { - "description": "How many trials are currently pending.", - "type": "integer", - "format": "int32" - }, - "trialsRunning": { - "description": "How many trials are currently running.", - "type": "integer", - "format": "int32" - }, - "trialsSucceeded": { - "description": "How many trials have succeeded.", - "type": "integer", - "format": "int32" - } - } - }, - "v1alpha3.FeasibleSpace": { - "properties": { - "list": { - "type": "array", - "items": { - "type": "string" - } - }, - "max": { - "type": "string" - }, - "min": { - "type": "string" - }, - "step": { - "type": "string" - } - } - }, - "v1alpha3.FileSystemPath": { - "properties": { - "kind": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "v1alpha3.FilterSpec": { - "properties": { - "metricsFormat": { - "description": "When the metrics output follows format as this field specified, metricsCollector collects it and reports to metrics server, it can be \"\u003cmetric_name\u003e: \u003cfloat\u003e\" or else", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "v1alpha3.GoTemplate": { - "properties": { - "rawTemplate": { - "type": "string" - }, - "templateSpec": { - "$ref": "#/definitions/v1alpha3.TemplateSpec" - } - } - }, - "v1alpha3.GraphConfig": { - "description": "GraphConfig contains a config of DAG", - "properties": { - "inputSizes": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "numLayers": { - "type": "integer", - "format": "int32" - }, - "outputSizes": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - } - } - }, - "v1alpha3.Metric": { - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "number", - "format": "double" - } - } - }, - "v1alpha3.MetricsCollectorSpec": { - "properties": { - "collector": { - "$ref": "#/definitions/v1alpha3.CollectorSpec" - }, - "source": { - "$ref": "#/definitions/v1alpha3.SourceSpec" - } - } - }, - "v1alpha3.NasConfig": { - "description": "NasConfig contains config for NAS job", - "properties": { - "graphConfig": { - "$ref": "#/definitions/v1alpha3.GraphConfig" - }, - "operations": { - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha3.Operation" - } - } - } - }, - "v1alpha3.ObjectiveSpec": { - "properties": { - "additionalMetricNames": { - "description": "This can be empty if we only care about the objective metric. Note: If we adopt a push instead of pull mechanism, this can be omitted completely.", - "type": "array", - "items": { - "type": "string" - } - }, - "goal": { - "type": "number", - "format": "double" - }, - "objectiveMetricName": { - "type": "string" - }, - "type": { - "type": "string" - } - } - }, - "v1alpha3.Observation": { - "required": [ - "metrics" - ], - "properties": { - "metrics": { - "description": "Key-value pairs for metric names and values", - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha3.Metric" - } - } - } - }, - "v1alpha3.Operation": { - "description": "Operation contains type of operation in DAG", - "properties": { - "operationType": { - "type": "string" - }, - "parameters": { - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha3.ParameterSpec" - } - } - } - }, - "v1alpha3.OptimalTrial": { - "description": "OptimalTrial is the metrics and assignments of the best trial.", - "required": [ - "bestTrialName", - "parameterAssignments" - ], - "properties": { - "bestTrialName": { - "description": "BestTrialName is the name of the best trial.", - "type": "string" - }, - "observation": { - "description": "Observation for this trial", - "$ref": "#/definitions/v1alpha3.Observation" - }, - "parameterAssignments": { - "description": "Key-value pairs for hyperparameters and assignment values.", - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha3.ParameterAssignment" - } - } - } - }, - "v1alpha3.ParameterAssignment": { - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - } - }, - "v1alpha3.ParameterSpec": { - "properties": { - "feasibleSpace": { - "$ref": "#/definitions/v1alpha3.FeasibleSpace" - }, - "name": { - "type": "string" - }, - "parameterType": { - "type": "string" - } - } - }, - "v1alpha3.SourceSpec": { - "properties": { - "fileSystemPath": { - "description": "During training model, metrics may be persisted into local file in source code, such as tfEvent use case", - "$ref": "#/definitions/v1alpha3.FileSystemPath" - }, - "filter": { - "description": "Default metric output format is {\"metric\": \"\u003cmetric_name\u003e\", \"value\": \u003cint_or_float\u003e, \"epoch\": \u003cint\u003e, \"step\": \u003cint\u003e}, but if the output doesn't follow default format, please extend it here", - "$ref": "#/definitions/v1alpha3.FilterSpec" - }, - "httpGet": { - "description": "Model-train source code can expose metrics by http, such as HTTP endpoint in prometheus metric format", - "$ref": "#/definitions/v1.HTTPGetAction" - } - } - }, - "v1alpha3.TemplateSpec": { - "properties": { - "configMapName": { - "type": "string" - }, - "configMapNamespace": { - "type": "string" - }, - "templatePath": { - "type": "string" - } - } - }, - "v1alpha3.TrialTemplate": { - "properties": { - "goTemplate": { - "$ref": "#/definitions/v1alpha3.GoTemplate" - }, - "retain": { - "type": "boolean" - } - } - } - } -} diff --git a/pkg/client/controller/clientset/versioned/clientset.go b/pkg/client/controller/clientset/versioned/clientset.go index d4ebfded011..a6adf151690 100644 --- a/pkg/client/controller/clientset/versioned/clientset.go +++ b/pkg/client/controller/clientset/versioned/clientset.go @@ -18,13 +18,9 @@ limitations under the License. package versioned import ( - commonv1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/common/v1alpha3" commonv1beta1 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/common/v1beta1" - experimentv1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3" experimentv1beta1 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/experiments/v1beta1" - suggestionv1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3" suggestionv1beta1 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/suggestions/v1beta1" - trialv1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3" trialv1beta1 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/trials/v1beta1" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" @@ -33,19 +29,15 @@ import ( type Interface interface { Discovery() discovery.DiscoveryInterface - CommonV1alpha3() commonv1alpha3.CommonV1alpha3Interface CommonV1beta1() commonv1beta1.CommonV1beta1Interface // Deprecated: please explicitly pick a version if possible. Common() commonv1beta1.CommonV1beta1Interface - ExperimentV1alpha3() experimentv1alpha3.ExperimentV1alpha3Interface ExperimentV1beta1() experimentv1beta1.ExperimentV1beta1Interface // Deprecated: please explicitly pick a version if possible. Experiment() experimentv1beta1.ExperimentV1beta1Interface - SuggestionV1alpha3() suggestionv1alpha3.SuggestionV1alpha3Interface SuggestionV1beta1() suggestionv1beta1.SuggestionV1beta1Interface // Deprecated: please explicitly pick a version if possible. Suggestion() suggestionv1beta1.SuggestionV1beta1Interface - TrialV1alpha3() trialv1alpha3.TrialV1alpha3Interface TrialV1beta1() trialv1beta1.TrialV1beta1Interface // Deprecated: please explicitly pick a version if possible. Trial() trialv1beta1.TrialV1beta1Interface @@ -55,19 +47,10 @@ type Interface interface { // version included in a Clientset. type Clientset struct { *discovery.DiscoveryClient - commonV1alpha3 *commonv1alpha3.CommonV1alpha3Client - commonV1beta1 *commonv1beta1.CommonV1beta1Client - experimentV1alpha3 *experimentv1alpha3.ExperimentV1alpha3Client - experimentV1beta1 *experimentv1beta1.ExperimentV1beta1Client - suggestionV1alpha3 *suggestionv1alpha3.SuggestionV1alpha3Client - suggestionV1beta1 *suggestionv1beta1.SuggestionV1beta1Client - trialV1alpha3 *trialv1alpha3.TrialV1alpha3Client - trialV1beta1 *trialv1beta1.TrialV1beta1Client -} - -// CommonV1alpha3 retrieves the CommonV1alpha3Client -func (c *Clientset) CommonV1alpha3() commonv1alpha3.CommonV1alpha3Interface { - return c.commonV1alpha3 + commonV1beta1 *commonv1beta1.CommonV1beta1Client + experimentV1beta1 *experimentv1beta1.ExperimentV1beta1Client + suggestionV1beta1 *suggestionv1beta1.SuggestionV1beta1Client + trialV1beta1 *trialv1beta1.TrialV1beta1Client } // CommonV1beta1 retrieves the CommonV1beta1Client @@ -81,11 +64,6 @@ func (c *Clientset) Common() commonv1beta1.CommonV1beta1Interface { return c.commonV1beta1 } -// ExperimentV1alpha3 retrieves the ExperimentV1alpha3Client -func (c *Clientset) ExperimentV1alpha3() experimentv1alpha3.ExperimentV1alpha3Interface { - return c.experimentV1alpha3 -} - // ExperimentV1beta1 retrieves the ExperimentV1beta1Client func (c *Clientset) ExperimentV1beta1() experimentv1beta1.ExperimentV1beta1Interface { return c.experimentV1beta1 @@ -97,11 +75,6 @@ func (c *Clientset) Experiment() experimentv1beta1.ExperimentV1beta1Interface { return c.experimentV1beta1 } -// SuggestionV1alpha3 retrieves the SuggestionV1alpha3Client -func (c *Clientset) SuggestionV1alpha3() suggestionv1alpha3.SuggestionV1alpha3Interface { - return c.suggestionV1alpha3 -} - // SuggestionV1beta1 retrieves the SuggestionV1beta1Client func (c *Clientset) SuggestionV1beta1() suggestionv1beta1.SuggestionV1beta1Interface { return c.suggestionV1beta1 @@ -113,11 +86,6 @@ func (c *Clientset) Suggestion() suggestionv1beta1.SuggestionV1beta1Interface { return c.suggestionV1beta1 } -// TrialV1alpha3 retrieves the TrialV1alpha3Client -func (c *Clientset) TrialV1alpha3() trialv1alpha3.TrialV1alpha3Interface { - return c.trialV1alpha3 -} - // TrialV1beta1 retrieves the TrialV1beta1Client func (c *Clientset) TrialV1beta1() trialv1beta1.TrialV1beta1Interface { return c.trialV1beta1 @@ -145,34 +113,18 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { } var cs Clientset var err error - cs.commonV1alpha3, err = commonv1alpha3.NewForConfig(&configShallowCopy) - if err != nil { - return nil, err - } cs.commonV1beta1, err = commonv1beta1.NewForConfig(&configShallowCopy) if err != nil { return nil, err } - cs.experimentV1alpha3, err = experimentv1alpha3.NewForConfig(&configShallowCopy) - if err != nil { - return nil, err - } cs.experimentV1beta1, err = experimentv1beta1.NewForConfig(&configShallowCopy) if err != nil { return nil, err } - cs.suggestionV1alpha3, err = suggestionv1alpha3.NewForConfig(&configShallowCopy) - if err != nil { - return nil, err - } cs.suggestionV1beta1, err = suggestionv1beta1.NewForConfig(&configShallowCopy) if err != nil { return nil, err } - cs.trialV1alpha3, err = trialv1alpha3.NewForConfig(&configShallowCopy) - if err != nil { - return nil, err - } cs.trialV1beta1, err = trialv1beta1.NewForConfig(&configShallowCopy) if err != nil { return nil, err @@ -189,13 +141,9 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { // panics if there is an error in the config. func NewForConfigOrDie(c *rest.Config) *Clientset { var cs Clientset - cs.commonV1alpha3 = commonv1alpha3.NewForConfigOrDie(c) cs.commonV1beta1 = commonv1beta1.NewForConfigOrDie(c) - cs.experimentV1alpha3 = experimentv1alpha3.NewForConfigOrDie(c) cs.experimentV1beta1 = experimentv1beta1.NewForConfigOrDie(c) - cs.suggestionV1alpha3 = suggestionv1alpha3.NewForConfigOrDie(c) cs.suggestionV1beta1 = suggestionv1beta1.NewForConfigOrDie(c) - cs.trialV1alpha3 = trialv1alpha3.NewForConfigOrDie(c) cs.trialV1beta1 = trialv1beta1.NewForConfigOrDie(c) cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) @@ -205,13 +153,9 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { // New creates a new Clientset for the given RESTClient. func New(c rest.Interface) *Clientset { var cs Clientset - cs.commonV1alpha3 = commonv1alpha3.New(c) cs.commonV1beta1 = commonv1beta1.New(c) - cs.experimentV1alpha3 = experimentv1alpha3.New(c) cs.experimentV1beta1 = experimentv1beta1.New(c) - cs.suggestionV1alpha3 = suggestionv1alpha3.New(c) cs.suggestionV1beta1 = suggestionv1beta1.New(c) - cs.trialV1alpha3 = trialv1alpha3.New(c) cs.trialV1beta1 = trialv1beta1.New(c) cs.DiscoveryClient = discovery.NewDiscoveryClient(c) diff --git a/pkg/client/controller/clientset/versioned/fake/clientset_generated.go b/pkg/client/controller/clientset/versioned/fake/clientset_generated.go index 922f421c061..b8a9cd4012a 100644 --- a/pkg/client/controller/clientset/versioned/fake/clientset_generated.go +++ b/pkg/client/controller/clientset/versioned/fake/clientset_generated.go @@ -19,20 +19,12 @@ package fake import ( clientset "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned" - commonv1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/common/v1alpha3" - fakecommonv1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/fake" commonv1beta1 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/common/v1beta1" fakecommonv1beta1 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/common/v1beta1/fake" - experimentv1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3" - fakeexperimentv1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/fake" experimentv1beta1 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/experiments/v1beta1" fakeexperimentv1beta1 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/experiments/v1beta1/fake" - suggestionv1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3" - fakesuggestionv1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/fake" suggestionv1beta1 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/suggestions/v1beta1" fakesuggestionv1beta1 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/suggestions/v1beta1/fake" - trialv1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3" - faketrialv1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/fake" trialv1beta1 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/trials/v1beta1" faketrialv1beta1 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/trials/v1beta1/fake" "k8s.io/apimachinery/pkg/runtime" @@ -84,11 +76,6 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface { var _ clientset.Interface = &Clientset{} -// CommonV1alpha3 retrieves the CommonV1alpha3Client -func (c *Clientset) CommonV1alpha3() commonv1alpha3.CommonV1alpha3Interface { - return &fakecommonv1alpha3.FakeCommonV1alpha3{Fake: &c.Fake} -} - // CommonV1beta1 retrieves the CommonV1beta1Client func (c *Clientset) CommonV1beta1() commonv1beta1.CommonV1beta1Interface { return &fakecommonv1beta1.FakeCommonV1beta1{Fake: &c.Fake} @@ -99,11 +86,6 @@ func (c *Clientset) Common() commonv1beta1.CommonV1beta1Interface { return &fakecommonv1beta1.FakeCommonV1beta1{Fake: &c.Fake} } -// ExperimentV1alpha3 retrieves the ExperimentV1alpha3Client -func (c *Clientset) ExperimentV1alpha3() experimentv1alpha3.ExperimentV1alpha3Interface { - return &fakeexperimentv1alpha3.FakeExperimentV1alpha3{Fake: &c.Fake} -} - // ExperimentV1beta1 retrieves the ExperimentV1beta1Client func (c *Clientset) ExperimentV1beta1() experimentv1beta1.ExperimentV1beta1Interface { return &fakeexperimentv1beta1.FakeExperimentV1beta1{Fake: &c.Fake} @@ -114,11 +96,6 @@ func (c *Clientset) Experiment() experimentv1beta1.ExperimentV1beta1Interface { return &fakeexperimentv1beta1.FakeExperimentV1beta1{Fake: &c.Fake} } -// SuggestionV1alpha3 retrieves the SuggestionV1alpha3Client -func (c *Clientset) SuggestionV1alpha3() suggestionv1alpha3.SuggestionV1alpha3Interface { - return &fakesuggestionv1alpha3.FakeSuggestionV1alpha3{Fake: &c.Fake} -} - // SuggestionV1beta1 retrieves the SuggestionV1beta1Client func (c *Clientset) SuggestionV1beta1() suggestionv1beta1.SuggestionV1beta1Interface { return &fakesuggestionv1beta1.FakeSuggestionV1beta1{Fake: &c.Fake} @@ -129,11 +106,6 @@ func (c *Clientset) Suggestion() suggestionv1beta1.SuggestionV1beta1Interface { return &fakesuggestionv1beta1.FakeSuggestionV1beta1{Fake: &c.Fake} } -// TrialV1alpha3 retrieves the TrialV1alpha3Client -func (c *Clientset) TrialV1alpha3() trialv1alpha3.TrialV1alpha3Interface { - return &faketrialv1alpha3.FakeTrialV1alpha3{Fake: &c.Fake} -} - // TrialV1beta1 retrieves the TrialV1beta1Client func (c *Clientset) TrialV1beta1() trialv1beta1.TrialV1beta1Interface { return &faketrialv1beta1.FakeTrialV1beta1{Fake: &c.Fake} diff --git a/pkg/client/controller/clientset/versioned/fake/register.go b/pkg/client/controller/clientset/versioned/fake/register.go index 7dfdef4084b..5e87a1b6fc0 100644 --- a/pkg/client/controller/clientset/versioned/fake/register.go +++ b/pkg/client/controller/clientset/versioned/fake/register.go @@ -18,13 +18,9 @@ limitations under the License. package fake import ( - commonv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" commonv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" - experimentv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" experimentv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" - suggestionv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" suggestionv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" - trialv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" trialv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" @@ -37,13 +33,9 @@ var scheme = runtime.NewScheme() var codecs = serializer.NewCodecFactory(scheme) var parameterCodec = runtime.NewParameterCodec(scheme) var localSchemeBuilder = runtime.SchemeBuilder{ - commonv1alpha3.AddToScheme, commonv1beta1.AddToScheme, - experimentv1alpha3.AddToScheme, experimentv1beta1.AddToScheme, - suggestionv1alpha3.AddToScheme, suggestionv1beta1.AddToScheme, - trialv1alpha3.AddToScheme, trialv1beta1.AddToScheme, } diff --git a/pkg/client/controller/clientset/versioned/scheme/register.go b/pkg/client/controller/clientset/versioned/scheme/register.go index 8b258a907bf..7205940120d 100644 --- a/pkg/client/controller/clientset/versioned/scheme/register.go +++ b/pkg/client/controller/clientset/versioned/scheme/register.go @@ -18,13 +18,9 @@ limitations under the License. package scheme import ( - commonv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" commonv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" - experimentv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" experimentv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" - suggestionv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" suggestionv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" - trialv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" trialv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" @@ -37,13 +33,9 @@ var Scheme = runtime.NewScheme() var Codecs = serializer.NewCodecFactory(Scheme) var ParameterCodec = runtime.NewParameterCodec(Scheme) var localSchemeBuilder = runtime.SchemeBuilder{ - commonv1alpha3.AddToScheme, commonv1beta1.AddToScheme, - experimentv1alpha3.AddToScheme, experimentv1beta1.AddToScheme, - suggestionv1alpha3.AddToScheme, suggestionv1beta1.AddToScheme, - trialv1alpha3.AddToScheme, trialv1beta1.AddToScheme, } diff --git a/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/common_client.go b/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/common_client.go deleted file mode 100644 index 4d11d61d93c..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/common_client.go +++ /dev/null @@ -1,84 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/scheme" - serializer "k8s.io/apimachinery/pkg/runtime/serializer" - rest "k8s.io/client-go/rest" -) - -type CommonV1alpha3Interface interface { - RESTClient() rest.Interface -} - -// CommonV1alpha3Client is used to interact with features provided by the common.kubeflow.org group. -type CommonV1alpha3Client struct { - restClient rest.Interface -} - -// NewForConfig creates a new CommonV1alpha3Client for the given config. -func NewForConfig(c *rest.Config) (*CommonV1alpha3Client, error) { - config := *c - if err := setConfigDefaults(&config); err != nil { - return nil, err - } - client, err := rest.RESTClientFor(&config) - if err != nil { - return nil, err - } - return &CommonV1alpha3Client{client}, nil -} - -// NewForConfigOrDie creates a new CommonV1alpha3Client for the given config and -// panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *CommonV1alpha3Client { - client, err := NewForConfig(c) - if err != nil { - panic(err) - } - return client -} - -// New creates a new CommonV1alpha3Client for the given RESTClient. -func New(c rest.Interface) *CommonV1alpha3Client { - return &CommonV1alpha3Client{c} -} - -func setConfigDefaults(config *rest.Config) error { - gv := v1alpha3.SchemeGroupVersion - config.GroupVersion = &gv - config.APIPath = "/apis" - config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} - - if config.UserAgent == "" { - config.UserAgent = rest.DefaultKubernetesUserAgent() - } - - return nil -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *CommonV1alpha3Client) RESTClient() rest.Interface { - if c == nil { - return nil - } - return c.restClient -} diff --git a/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/doc.go b/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/doc.go deleted file mode 100644 index 1f0d1b67b02..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -// This package has the automatically generated typed clients. -package v1alpha3 diff --git a/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/fake/doc.go b/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/fake/doc.go deleted file mode 100644 index 38939b5c8bc..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/fake/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -// Package fake has the automatically generated clients. -package fake diff --git a/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/fake/fake_common_client.go b/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/fake/fake_common_client.go deleted file mode 100644 index e68d50fb3d7..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/fake/fake_common_client.go +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - rest "k8s.io/client-go/rest" - testing "k8s.io/client-go/testing" -) - -type FakeCommonV1alpha3 struct { - *testing.Fake -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *FakeCommonV1alpha3) RESTClient() rest.Interface { - var ret *rest.RESTClient - return ret -} diff --git a/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/generated_expansion.go b/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/generated_expansion.go deleted file mode 100644 index 8ece88b8cd9..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/common/v1alpha3/generated_expansion.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 diff --git a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/doc.go b/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/doc.go deleted file mode 100644 index 1f0d1b67b02..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -// This package has the automatically generated typed clients. -package v1alpha3 diff --git a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/experiment.go b/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/experiment.go deleted file mode 100644 index 44e7e9406d7..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/experiment.go +++ /dev/null @@ -1,173 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - scheme "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/scheme" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" -) - -// ExperimentsGetter has a method to return a ExperimentInterface. -// A group's client should implement this interface. -type ExperimentsGetter interface { - Experiments(namespace string) ExperimentInterface -} - -// ExperimentInterface has methods to work with Experiment resources. -type ExperimentInterface interface { - Create(*v1alpha3.Experiment) (*v1alpha3.Experiment, error) - Update(*v1alpha3.Experiment) (*v1alpha3.Experiment, error) - UpdateStatus(*v1alpha3.Experiment) (*v1alpha3.Experiment, error) - Delete(name string, options *v1.DeleteOptions) error - DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string, options v1.GetOptions) (*v1alpha3.Experiment, error) - List(opts v1.ListOptions) (*v1alpha3.ExperimentList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Experiment, err error) - ExperimentExpansion -} - -// experiments implements ExperimentInterface -type experiments struct { - client rest.Interface - ns string -} - -// newExperiments returns a Experiments -func newExperiments(c *ExperimentV1alpha3Client, namespace string) *experiments { - return &experiments{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the experiment, and returns the corresponding experiment object, and an error if there is any. -func (c *experiments) Get(name string, options v1.GetOptions) (result *v1alpha3.Experiment, err error) { - result = &v1alpha3.Experiment{} - err = c.client.Get(). - Namespace(c.ns). - Resource("experiments"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of Experiments that match those selectors. -func (c *experiments) List(opts v1.ListOptions) (result *v1alpha3.ExperimentList, err error) { - result = &v1alpha3.ExperimentList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("experiments"). - VersionedParams(&opts, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested experiments. -func (c *experiments) Watch(opts v1.ListOptions) (watch.Interface, error) { - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("experiments"). - VersionedParams(&opts, scheme.ParameterCodec). - Watch() -} - -// Create takes the representation of a experiment and creates it. Returns the server's representation of the experiment, and an error, if there is any. -func (c *experiments) Create(experiment *v1alpha3.Experiment) (result *v1alpha3.Experiment, err error) { - result = &v1alpha3.Experiment{} - err = c.client.Post(). - Namespace(c.ns). - Resource("experiments"). - Body(experiment). - Do(). - Into(result) - return -} - -// Update takes the representation of a experiment and updates it. Returns the server's representation of the experiment, and an error, if there is any. -func (c *experiments) Update(experiment *v1alpha3.Experiment) (result *v1alpha3.Experiment, err error) { - result = &v1alpha3.Experiment{} - err = c.client.Put(). - Namespace(c.ns). - Resource("experiments"). - Name(experiment.Name). - Body(experiment). - Do(). - Into(result) - return -} - -// UpdateStatus was generated because the type contains a Status member. -// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). - -func (c *experiments) UpdateStatus(experiment *v1alpha3.Experiment) (result *v1alpha3.Experiment, err error) { - result = &v1alpha3.Experiment{} - err = c.client.Put(). - Namespace(c.ns). - Resource("experiments"). - Name(experiment.Name). - SubResource("status"). - Body(experiment). - Do(). - Into(result) - return -} - -// Delete takes name of the experiment and deletes it. Returns an error if one occurs. -func (c *experiments) Delete(name string, options *v1.DeleteOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("experiments"). - Name(name). - Body(options). - Do(). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *experiments) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("experiments"). - VersionedParams(&listOptions, scheme.ParameterCodec). - Body(options). - Do(). - Error() -} - -// Patch applies the patch and returns the patched experiment. -func (c *experiments) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Experiment, err error) { - result = &v1alpha3.Experiment{} - err = c.client.Patch(pt). - Namespace(c.ns). - Resource("experiments"). - SubResource(subresources...). - Name(name). - Body(data). - Do(). - Into(result) - return -} diff --git a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/experiments_client.go b/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/experiments_client.go deleted file mode 100644 index cbcb77165c2..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/experiments_client.go +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/scheme" - serializer "k8s.io/apimachinery/pkg/runtime/serializer" - rest "k8s.io/client-go/rest" -) - -type ExperimentV1alpha3Interface interface { - RESTClient() rest.Interface - ExperimentsGetter -} - -// ExperimentV1alpha3Client is used to interact with features provided by the experiment.kubeflow.org group. -type ExperimentV1alpha3Client struct { - restClient rest.Interface -} - -func (c *ExperimentV1alpha3Client) Experiments(namespace string) ExperimentInterface { - return newExperiments(c, namespace) -} - -// NewForConfig creates a new ExperimentV1alpha3Client for the given config. -func NewForConfig(c *rest.Config) (*ExperimentV1alpha3Client, error) { - config := *c - if err := setConfigDefaults(&config); err != nil { - return nil, err - } - client, err := rest.RESTClientFor(&config) - if err != nil { - return nil, err - } - return &ExperimentV1alpha3Client{client}, nil -} - -// NewForConfigOrDie creates a new ExperimentV1alpha3Client for the given config and -// panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *ExperimentV1alpha3Client { - client, err := NewForConfig(c) - if err != nil { - panic(err) - } - return client -} - -// New creates a new ExperimentV1alpha3Client for the given RESTClient. -func New(c rest.Interface) *ExperimentV1alpha3Client { - return &ExperimentV1alpha3Client{c} -} - -func setConfigDefaults(config *rest.Config) error { - gv := v1alpha3.SchemeGroupVersion - config.GroupVersion = &gv - config.APIPath = "/apis" - config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} - - if config.UserAgent == "" { - config.UserAgent = rest.DefaultKubernetesUserAgent() - } - - return nil -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *ExperimentV1alpha3Client) RESTClient() rest.Interface { - if c == nil { - return nil - } - return c.restClient -} diff --git a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/fake/doc.go b/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/fake/doc.go deleted file mode 100644 index 38939b5c8bc..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/fake/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -// Package fake has the automatically generated clients. -package fake diff --git a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/fake/fake_experiment.go b/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/fake/fake_experiment.go deleted file mode 100644 index e47ddbfe3e2..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/fake/fake_experiment.go +++ /dev/null @@ -1,139 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - testing "k8s.io/client-go/testing" -) - -// FakeExperiments implements ExperimentInterface -type FakeExperiments struct { - Fake *FakeExperimentV1alpha3 - ns string -} - -var experimentsResource = schema.GroupVersionResource{Group: "experiment.kubeflow.org", Version: "v1alpha3", Resource: "experiments"} - -var experimentsKind = schema.GroupVersionKind{Group: "experiment.kubeflow.org", Version: "v1alpha3", Kind: "Experiment"} - -// Get takes name of the experiment, and returns the corresponding experiment object, and an error if there is any. -func (c *FakeExperiments) Get(name string, options v1.GetOptions) (result *v1alpha3.Experiment, err error) { - obj, err := c.Fake. - Invokes(testing.NewGetAction(experimentsResource, c.ns, name), &v1alpha3.Experiment{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Experiment), err -} - -// List takes label and field selectors, and returns the list of Experiments that match those selectors. -func (c *FakeExperiments) List(opts v1.ListOptions) (result *v1alpha3.ExperimentList, err error) { - obj, err := c.Fake. - Invokes(testing.NewListAction(experimentsResource, experimentsKind, c.ns, opts), &v1alpha3.ExperimentList{}) - - if obj == nil { - return nil, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v1alpha3.ExperimentList{ListMeta: obj.(*v1alpha3.ExperimentList).ListMeta} - for _, item := range obj.(*v1alpha3.ExperimentList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested experiments. -func (c *FakeExperiments) Watch(opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchAction(experimentsResource, c.ns, opts)) - -} - -// Create takes the representation of a experiment and creates it. Returns the server's representation of the experiment, and an error, if there is any. -func (c *FakeExperiments) Create(experiment *v1alpha3.Experiment) (result *v1alpha3.Experiment, err error) { - obj, err := c.Fake. - Invokes(testing.NewCreateAction(experimentsResource, c.ns, experiment), &v1alpha3.Experiment{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Experiment), err -} - -// Update takes the representation of a experiment and updates it. Returns the server's representation of the experiment, and an error, if there is any. -func (c *FakeExperiments) Update(experiment *v1alpha3.Experiment) (result *v1alpha3.Experiment, err error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateAction(experimentsResource, c.ns, experiment), &v1alpha3.Experiment{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Experiment), err -} - -// UpdateStatus was generated because the type contains a Status member. -// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeExperiments) UpdateStatus(experiment *v1alpha3.Experiment) (*v1alpha3.Experiment, error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateSubresourceAction(experimentsResource, "status", c.ns, experiment), &v1alpha3.Experiment{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Experiment), err -} - -// Delete takes name of the experiment and deletes it. Returns an error if one occurs. -func (c *FakeExperiments) Delete(name string, options *v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteAction(experimentsResource, c.ns, name), &v1alpha3.Experiment{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeExperiments) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(experimentsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &v1alpha3.ExperimentList{}) - return err -} - -// Patch applies the patch and returns the patched experiment. -func (c *FakeExperiments) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Experiment, err error) { - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(experimentsResource, c.ns, name, data, subresources...), &v1alpha3.Experiment{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Experiment), err -} diff --git a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/fake/fake_experiments_client.go b/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/fake/fake_experiments_client.go deleted file mode 100644 index 3df65a2ab92..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/fake/fake_experiments_client.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3" - rest "k8s.io/client-go/rest" - testing "k8s.io/client-go/testing" -) - -type FakeExperimentV1alpha3 struct { - *testing.Fake -} - -func (c *FakeExperimentV1alpha3) Experiments(namespace string) v1alpha3.ExperimentInterface { - return &FakeExperiments{c, namespace} -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *FakeExperimentV1alpha3) RESTClient() rest.Interface { - var ret *rest.RESTClient - return ret -} diff --git a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/generated_expansion.go b/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/generated_expansion.go deleted file mode 100644 index 7e29327d55d..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/experiments/v1alpha3/generated_expansion.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 - -type ExperimentExpansion interface{} diff --git a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/doc.go b/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/doc.go deleted file mode 100644 index 1f0d1b67b02..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -// This package has the automatically generated typed clients. -package v1alpha3 diff --git a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/fake/doc.go b/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/fake/doc.go deleted file mode 100644 index 38939b5c8bc..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/fake/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -// Package fake has the automatically generated clients. -package fake diff --git a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/fake/fake_suggestion.go b/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/fake/fake_suggestion.go deleted file mode 100644 index 905eab161ed..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/fake/fake_suggestion.go +++ /dev/null @@ -1,139 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - testing "k8s.io/client-go/testing" -) - -// FakeSuggestions implements SuggestionInterface -type FakeSuggestions struct { - Fake *FakeSuggestionV1alpha3 - ns string -} - -var suggestionsResource = schema.GroupVersionResource{Group: "suggestion.kubeflow.org", Version: "v1alpha3", Resource: "suggestions"} - -var suggestionsKind = schema.GroupVersionKind{Group: "suggestion.kubeflow.org", Version: "v1alpha3", Kind: "Suggestion"} - -// Get takes name of the suggestion, and returns the corresponding suggestion object, and an error if there is any. -func (c *FakeSuggestions) Get(name string, options v1.GetOptions) (result *v1alpha3.Suggestion, err error) { - obj, err := c.Fake. - Invokes(testing.NewGetAction(suggestionsResource, c.ns, name), &v1alpha3.Suggestion{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Suggestion), err -} - -// List takes label and field selectors, and returns the list of Suggestions that match those selectors. -func (c *FakeSuggestions) List(opts v1.ListOptions) (result *v1alpha3.SuggestionList, err error) { - obj, err := c.Fake. - Invokes(testing.NewListAction(suggestionsResource, suggestionsKind, c.ns, opts), &v1alpha3.SuggestionList{}) - - if obj == nil { - return nil, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v1alpha3.SuggestionList{ListMeta: obj.(*v1alpha3.SuggestionList).ListMeta} - for _, item := range obj.(*v1alpha3.SuggestionList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested suggestions. -func (c *FakeSuggestions) Watch(opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchAction(suggestionsResource, c.ns, opts)) - -} - -// Create takes the representation of a suggestion and creates it. Returns the server's representation of the suggestion, and an error, if there is any. -func (c *FakeSuggestions) Create(suggestion *v1alpha3.Suggestion) (result *v1alpha3.Suggestion, err error) { - obj, err := c.Fake. - Invokes(testing.NewCreateAction(suggestionsResource, c.ns, suggestion), &v1alpha3.Suggestion{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Suggestion), err -} - -// Update takes the representation of a suggestion and updates it. Returns the server's representation of the suggestion, and an error, if there is any. -func (c *FakeSuggestions) Update(suggestion *v1alpha3.Suggestion) (result *v1alpha3.Suggestion, err error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateAction(suggestionsResource, c.ns, suggestion), &v1alpha3.Suggestion{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Suggestion), err -} - -// UpdateStatus was generated because the type contains a Status member. -// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeSuggestions) UpdateStatus(suggestion *v1alpha3.Suggestion) (*v1alpha3.Suggestion, error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateSubresourceAction(suggestionsResource, "status", c.ns, suggestion), &v1alpha3.Suggestion{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Suggestion), err -} - -// Delete takes name of the suggestion and deletes it. Returns an error if one occurs. -func (c *FakeSuggestions) Delete(name string, options *v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteAction(suggestionsResource, c.ns, name), &v1alpha3.Suggestion{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeSuggestions) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(suggestionsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &v1alpha3.SuggestionList{}) - return err -} - -// Patch applies the patch and returns the patched suggestion. -func (c *FakeSuggestions) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Suggestion, err error) { - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(suggestionsResource, c.ns, name, data, subresources...), &v1alpha3.Suggestion{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Suggestion), err -} diff --git a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/fake/fake_suggestions_client.go b/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/fake/fake_suggestions_client.go deleted file mode 100644 index e11bd7057ef..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/fake/fake_suggestions_client.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3" - rest "k8s.io/client-go/rest" - testing "k8s.io/client-go/testing" -) - -type FakeSuggestionV1alpha3 struct { - *testing.Fake -} - -func (c *FakeSuggestionV1alpha3) Suggestions(namespace string) v1alpha3.SuggestionInterface { - return &FakeSuggestions{c, namespace} -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *FakeSuggestionV1alpha3) RESTClient() rest.Interface { - var ret *rest.RESTClient - return ret -} diff --git a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/generated_expansion.go b/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/generated_expansion.go deleted file mode 100644 index fd4908c58c4..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/generated_expansion.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 - -type SuggestionExpansion interface{} diff --git a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/suggestion.go b/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/suggestion.go deleted file mode 100644 index e87f047293c..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/suggestion.go +++ /dev/null @@ -1,173 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - scheme "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/scheme" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" -) - -// SuggestionsGetter has a method to return a SuggestionInterface. -// A group's client should implement this interface. -type SuggestionsGetter interface { - Suggestions(namespace string) SuggestionInterface -} - -// SuggestionInterface has methods to work with Suggestion resources. -type SuggestionInterface interface { - Create(*v1alpha3.Suggestion) (*v1alpha3.Suggestion, error) - Update(*v1alpha3.Suggestion) (*v1alpha3.Suggestion, error) - UpdateStatus(*v1alpha3.Suggestion) (*v1alpha3.Suggestion, error) - Delete(name string, options *v1.DeleteOptions) error - DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string, options v1.GetOptions) (*v1alpha3.Suggestion, error) - List(opts v1.ListOptions) (*v1alpha3.SuggestionList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Suggestion, err error) - SuggestionExpansion -} - -// suggestions implements SuggestionInterface -type suggestions struct { - client rest.Interface - ns string -} - -// newSuggestions returns a Suggestions -func newSuggestions(c *SuggestionV1alpha3Client, namespace string) *suggestions { - return &suggestions{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the suggestion, and returns the corresponding suggestion object, and an error if there is any. -func (c *suggestions) Get(name string, options v1.GetOptions) (result *v1alpha3.Suggestion, err error) { - result = &v1alpha3.Suggestion{} - err = c.client.Get(). - Namespace(c.ns). - Resource("suggestions"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of Suggestions that match those selectors. -func (c *suggestions) List(opts v1.ListOptions) (result *v1alpha3.SuggestionList, err error) { - result = &v1alpha3.SuggestionList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("suggestions"). - VersionedParams(&opts, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested suggestions. -func (c *suggestions) Watch(opts v1.ListOptions) (watch.Interface, error) { - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("suggestions"). - VersionedParams(&opts, scheme.ParameterCodec). - Watch() -} - -// Create takes the representation of a suggestion and creates it. Returns the server's representation of the suggestion, and an error, if there is any. -func (c *suggestions) Create(suggestion *v1alpha3.Suggestion) (result *v1alpha3.Suggestion, err error) { - result = &v1alpha3.Suggestion{} - err = c.client.Post(). - Namespace(c.ns). - Resource("suggestions"). - Body(suggestion). - Do(). - Into(result) - return -} - -// Update takes the representation of a suggestion and updates it. Returns the server's representation of the suggestion, and an error, if there is any. -func (c *suggestions) Update(suggestion *v1alpha3.Suggestion) (result *v1alpha3.Suggestion, err error) { - result = &v1alpha3.Suggestion{} - err = c.client.Put(). - Namespace(c.ns). - Resource("suggestions"). - Name(suggestion.Name). - Body(suggestion). - Do(). - Into(result) - return -} - -// UpdateStatus was generated because the type contains a Status member. -// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). - -func (c *suggestions) UpdateStatus(suggestion *v1alpha3.Suggestion) (result *v1alpha3.Suggestion, err error) { - result = &v1alpha3.Suggestion{} - err = c.client.Put(). - Namespace(c.ns). - Resource("suggestions"). - Name(suggestion.Name). - SubResource("status"). - Body(suggestion). - Do(). - Into(result) - return -} - -// Delete takes name of the suggestion and deletes it. Returns an error if one occurs. -func (c *suggestions) Delete(name string, options *v1.DeleteOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("suggestions"). - Name(name). - Body(options). - Do(). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *suggestions) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("suggestions"). - VersionedParams(&listOptions, scheme.ParameterCodec). - Body(options). - Do(). - Error() -} - -// Patch applies the patch and returns the patched suggestion. -func (c *suggestions) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Suggestion, err error) { - result = &v1alpha3.Suggestion{} - err = c.client.Patch(pt). - Namespace(c.ns). - Resource("suggestions"). - SubResource(subresources...). - Name(name). - Body(data). - Do(). - Into(result) - return -} diff --git a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/suggestions_client.go b/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/suggestions_client.go deleted file mode 100644 index 2634e0db1b0..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/suggestions/v1alpha3/suggestions_client.go +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/scheme" - serializer "k8s.io/apimachinery/pkg/runtime/serializer" - rest "k8s.io/client-go/rest" -) - -type SuggestionV1alpha3Interface interface { - RESTClient() rest.Interface - SuggestionsGetter -} - -// SuggestionV1alpha3Client is used to interact with features provided by the suggestion.kubeflow.org group. -type SuggestionV1alpha3Client struct { - restClient rest.Interface -} - -func (c *SuggestionV1alpha3Client) Suggestions(namespace string) SuggestionInterface { - return newSuggestions(c, namespace) -} - -// NewForConfig creates a new SuggestionV1alpha3Client for the given config. -func NewForConfig(c *rest.Config) (*SuggestionV1alpha3Client, error) { - config := *c - if err := setConfigDefaults(&config); err != nil { - return nil, err - } - client, err := rest.RESTClientFor(&config) - if err != nil { - return nil, err - } - return &SuggestionV1alpha3Client{client}, nil -} - -// NewForConfigOrDie creates a new SuggestionV1alpha3Client for the given config and -// panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *SuggestionV1alpha3Client { - client, err := NewForConfig(c) - if err != nil { - panic(err) - } - return client -} - -// New creates a new SuggestionV1alpha3Client for the given RESTClient. -func New(c rest.Interface) *SuggestionV1alpha3Client { - return &SuggestionV1alpha3Client{c} -} - -func setConfigDefaults(config *rest.Config) error { - gv := v1alpha3.SchemeGroupVersion - config.GroupVersion = &gv - config.APIPath = "/apis" - config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} - - if config.UserAgent == "" { - config.UserAgent = rest.DefaultKubernetesUserAgent() - } - - return nil -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *SuggestionV1alpha3Client) RESTClient() rest.Interface { - if c == nil { - return nil - } - return c.restClient -} diff --git a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/doc.go b/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/doc.go deleted file mode 100644 index 1f0d1b67b02..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -// This package has the automatically generated typed clients. -package v1alpha3 diff --git a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/fake/doc.go b/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/fake/doc.go deleted file mode 100644 index 38939b5c8bc..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/fake/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -// Package fake has the automatically generated clients. -package fake diff --git a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/fake/fake_trial.go b/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/fake/fake_trial.go deleted file mode 100644 index 9642d92318e..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/fake/fake_trial.go +++ /dev/null @@ -1,139 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - testing "k8s.io/client-go/testing" -) - -// FakeTrials implements TrialInterface -type FakeTrials struct { - Fake *FakeTrialV1alpha3 - ns string -} - -var trialsResource = schema.GroupVersionResource{Group: "trial.kubeflow.org", Version: "v1alpha3", Resource: "trials"} - -var trialsKind = schema.GroupVersionKind{Group: "trial.kubeflow.org", Version: "v1alpha3", Kind: "Trial"} - -// Get takes name of the trial, and returns the corresponding trial object, and an error if there is any. -func (c *FakeTrials) Get(name string, options v1.GetOptions) (result *v1alpha3.Trial, err error) { - obj, err := c.Fake. - Invokes(testing.NewGetAction(trialsResource, c.ns, name), &v1alpha3.Trial{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Trial), err -} - -// List takes label and field selectors, and returns the list of Trials that match those selectors. -func (c *FakeTrials) List(opts v1.ListOptions) (result *v1alpha3.TrialList, err error) { - obj, err := c.Fake. - Invokes(testing.NewListAction(trialsResource, trialsKind, c.ns, opts), &v1alpha3.TrialList{}) - - if obj == nil { - return nil, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v1alpha3.TrialList{ListMeta: obj.(*v1alpha3.TrialList).ListMeta} - for _, item := range obj.(*v1alpha3.TrialList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested trials. -func (c *FakeTrials) Watch(opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchAction(trialsResource, c.ns, opts)) - -} - -// Create takes the representation of a trial and creates it. Returns the server's representation of the trial, and an error, if there is any. -func (c *FakeTrials) Create(trial *v1alpha3.Trial) (result *v1alpha3.Trial, err error) { - obj, err := c.Fake. - Invokes(testing.NewCreateAction(trialsResource, c.ns, trial), &v1alpha3.Trial{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Trial), err -} - -// Update takes the representation of a trial and updates it. Returns the server's representation of the trial, and an error, if there is any. -func (c *FakeTrials) Update(trial *v1alpha3.Trial) (result *v1alpha3.Trial, err error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateAction(trialsResource, c.ns, trial), &v1alpha3.Trial{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Trial), err -} - -// UpdateStatus was generated because the type contains a Status member. -// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeTrials) UpdateStatus(trial *v1alpha3.Trial) (*v1alpha3.Trial, error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateSubresourceAction(trialsResource, "status", c.ns, trial), &v1alpha3.Trial{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Trial), err -} - -// Delete takes name of the trial and deletes it. Returns an error if one occurs. -func (c *FakeTrials) Delete(name string, options *v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteAction(trialsResource, c.ns, name), &v1alpha3.Trial{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeTrials) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(trialsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &v1alpha3.TrialList{}) - return err -} - -// Patch applies the patch and returns the patched trial. -func (c *FakeTrials) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Trial, err error) { - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(trialsResource, c.ns, name, data, subresources...), &v1alpha3.Trial{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha3.Trial), err -} diff --git a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/fake/fake_trials_client.go b/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/fake/fake_trials_client.go deleted file mode 100644 index 344c9a0b49f..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/fake/fake_trials_client.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3" - rest "k8s.io/client-go/rest" - testing "k8s.io/client-go/testing" -) - -type FakeTrialV1alpha3 struct { - *testing.Fake -} - -func (c *FakeTrialV1alpha3) Trials(namespace string) v1alpha3.TrialInterface { - return &FakeTrials{c, namespace} -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *FakeTrialV1alpha3) RESTClient() rest.Interface { - var ret *rest.RESTClient - return ret -} diff --git a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/generated_expansion.go b/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/generated_expansion.go deleted file mode 100644 index b23cf88fce5..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/generated_expansion.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 - -type TrialExpansion interface{} diff --git a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/trial.go b/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/trial.go deleted file mode 100644 index 3cf4aa359ea..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/trial.go +++ /dev/null @@ -1,173 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - scheme "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/scheme" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" -) - -// TrialsGetter has a method to return a TrialInterface. -// A group's client should implement this interface. -type TrialsGetter interface { - Trials(namespace string) TrialInterface -} - -// TrialInterface has methods to work with Trial resources. -type TrialInterface interface { - Create(*v1alpha3.Trial) (*v1alpha3.Trial, error) - Update(*v1alpha3.Trial) (*v1alpha3.Trial, error) - UpdateStatus(*v1alpha3.Trial) (*v1alpha3.Trial, error) - Delete(name string, options *v1.DeleteOptions) error - DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string, options v1.GetOptions) (*v1alpha3.Trial, error) - List(opts v1.ListOptions) (*v1alpha3.TrialList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Trial, err error) - TrialExpansion -} - -// trials implements TrialInterface -type trials struct { - client rest.Interface - ns string -} - -// newTrials returns a Trials -func newTrials(c *TrialV1alpha3Client, namespace string) *trials { - return &trials{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the trial, and returns the corresponding trial object, and an error if there is any. -func (c *trials) Get(name string, options v1.GetOptions) (result *v1alpha3.Trial, err error) { - result = &v1alpha3.Trial{} - err = c.client.Get(). - Namespace(c.ns). - Resource("trials"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of Trials that match those selectors. -func (c *trials) List(opts v1.ListOptions) (result *v1alpha3.TrialList, err error) { - result = &v1alpha3.TrialList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("trials"). - VersionedParams(&opts, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested trials. -func (c *trials) Watch(opts v1.ListOptions) (watch.Interface, error) { - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("trials"). - VersionedParams(&opts, scheme.ParameterCodec). - Watch() -} - -// Create takes the representation of a trial and creates it. Returns the server's representation of the trial, and an error, if there is any. -func (c *trials) Create(trial *v1alpha3.Trial) (result *v1alpha3.Trial, err error) { - result = &v1alpha3.Trial{} - err = c.client.Post(). - Namespace(c.ns). - Resource("trials"). - Body(trial). - Do(). - Into(result) - return -} - -// Update takes the representation of a trial and updates it. Returns the server's representation of the trial, and an error, if there is any. -func (c *trials) Update(trial *v1alpha3.Trial) (result *v1alpha3.Trial, err error) { - result = &v1alpha3.Trial{} - err = c.client.Put(). - Namespace(c.ns). - Resource("trials"). - Name(trial.Name). - Body(trial). - Do(). - Into(result) - return -} - -// UpdateStatus was generated because the type contains a Status member. -// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). - -func (c *trials) UpdateStatus(trial *v1alpha3.Trial) (result *v1alpha3.Trial, err error) { - result = &v1alpha3.Trial{} - err = c.client.Put(). - Namespace(c.ns). - Resource("trials"). - Name(trial.Name). - SubResource("status"). - Body(trial). - Do(). - Into(result) - return -} - -// Delete takes name of the trial and deletes it. Returns an error if one occurs. -func (c *trials) Delete(name string, options *v1.DeleteOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("trials"). - Name(name). - Body(options). - Do(). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *trials) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("trials"). - VersionedParams(&listOptions, scheme.ParameterCodec). - Body(options). - Do(). - Error() -} - -// Patch applies the patch and returns the patched trial. -func (c *trials) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Trial, err error) { - result = &v1alpha3.Trial{} - err = c.client.Patch(pt). - Namespace(c.ns). - Resource("trials"). - SubResource(subresources...). - Name(name). - Body(data). - Do(). - Into(result) - return -} diff --git a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/trials_client.go b/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/trials_client.go deleted file mode 100644 index 423bfe0f0a4..00000000000 --- a/pkg/client/controller/clientset/versioned/typed/trials/v1alpha3/trials_client.go +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned/scheme" - serializer "k8s.io/apimachinery/pkg/runtime/serializer" - rest "k8s.io/client-go/rest" -) - -type TrialV1alpha3Interface interface { - RESTClient() rest.Interface - TrialsGetter -} - -// TrialV1alpha3Client is used to interact with features provided by the trial.kubeflow.org group. -type TrialV1alpha3Client struct { - restClient rest.Interface -} - -func (c *TrialV1alpha3Client) Trials(namespace string) TrialInterface { - return newTrials(c, namespace) -} - -// NewForConfig creates a new TrialV1alpha3Client for the given config. -func NewForConfig(c *rest.Config) (*TrialV1alpha3Client, error) { - config := *c - if err := setConfigDefaults(&config); err != nil { - return nil, err - } - client, err := rest.RESTClientFor(&config) - if err != nil { - return nil, err - } - return &TrialV1alpha3Client{client}, nil -} - -// NewForConfigOrDie creates a new TrialV1alpha3Client for the given config and -// panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *TrialV1alpha3Client { - client, err := NewForConfig(c) - if err != nil { - panic(err) - } - return client -} - -// New creates a new TrialV1alpha3Client for the given RESTClient. -func New(c rest.Interface) *TrialV1alpha3Client { - return &TrialV1alpha3Client{c} -} - -func setConfigDefaults(config *rest.Config) error { - gv := v1alpha3.SchemeGroupVersion - config.GroupVersion = &gv - config.APIPath = "/apis" - config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} - - if config.UserAgent == "" { - config.UserAgent = rest.DefaultKubernetesUserAgent() - } - - return nil -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *TrialV1alpha3Client) RESTClient() rest.Interface { - if c == nil { - return nil - } - return c.restClient -} diff --git a/pkg/client/controller/informers/externalversions/experiments/interface.go b/pkg/client/controller/informers/externalversions/experiments/interface.go index 759dcdcce92..0c7e1a5efa8 100644 --- a/pkg/client/controller/informers/externalversions/experiments/interface.go +++ b/pkg/client/controller/informers/externalversions/experiments/interface.go @@ -18,15 +18,12 @@ limitations under the License. package experiment import ( - v1alpha3 "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/experiments/v1alpha3" v1beta1 "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/experiments/v1beta1" internalinterfaces "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/internalinterfaces" ) // Interface provides access to each of this group's versions. type Interface interface { - // V1alpha3 provides access to shared informers for resources in V1alpha3. - V1alpha3() v1alpha3.Interface // V1beta1 provides access to shared informers for resources in V1beta1. V1beta1() v1beta1.Interface } @@ -42,11 +39,6 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } -// V1alpha3 returns a new v1alpha3.Interface. -func (g *group) V1alpha3() v1alpha3.Interface { - return v1alpha3.New(g.factory, g.namespace, g.tweakListOptions) -} - // V1beta1 returns a new v1beta1.Interface. func (g *group) V1beta1() v1beta1.Interface { return v1beta1.New(g.factory, g.namespace, g.tweakListOptions) diff --git a/pkg/client/controller/informers/externalversions/experiments/v1alpha3/experiment.go b/pkg/client/controller/informers/externalversions/experiments/v1alpha3/experiment.go deleted file mode 100644 index 89c36cda073..00000000000 --- a/pkg/client/controller/informers/externalversions/experiments/v1alpha3/experiment.go +++ /dev/null @@ -1,88 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by informer-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - time "time" - - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - versioned "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned" - internalinterfaces "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/internalinterfaces" - v1alpha3 "github.com/kubeflow/katib/pkg/client/controller/listers/experiments/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" - watch "k8s.io/apimachinery/pkg/watch" - cache "k8s.io/client-go/tools/cache" -) - -// ExperimentInformer provides access to a shared informer and lister for -// Experiments. -type ExperimentInformer interface { - Informer() cache.SharedIndexInformer - Lister() v1alpha3.ExperimentLister -} - -type experimentInformer struct { - factory internalinterfaces.SharedInformerFactory - tweakListOptions internalinterfaces.TweakListOptionsFunc - namespace string -} - -// NewExperimentInformer constructs a new informer for Experiment type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewExperimentInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredExperimentInformer(client, namespace, resyncPeriod, indexers, nil) -} - -// NewFilteredExperimentInformer constructs a new informer for Experiment type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewFilteredExperimentInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { - return cache.NewSharedIndexInformer( - &cache.ListWatch{ - ListFunc: func(options v1.ListOptions) (runtime.Object, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.ExperimentV1alpha3().Experiments(namespace).List(options) - }, - WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.ExperimentV1alpha3().Experiments(namespace).Watch(options) - }, - }, - &experimentsv1alpha3.Experiment{}, - resyncPeriod, - indexers, - ) -} - -func (f *experimentInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredExperimentInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) -} - -func (f *experimentInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&experimentsv1alpha3.Experiment{}, f.defaultInformer) -} - -func (f *experimentInformer) Lister() v1alpha3.ExperimentLister { - return v1alpha3.NewExperimentLister(f.Informer().GetIndexer()) -} diff --git a/pkg/client/controller/informers/externalversions/experiments/v1alpha3/interface.go b/pkg/client/controller/informers/externalversions/experiments/v1alpha3/interface.go deleted file mode 100644 index c505ff6e58e..00000000000 --- a/pkg/client/controller/informers/externalversions/experiments/v1alpha3/interface.go +++ /dev/null @@ -1,44 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by informer-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - internalinterfaces "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/internalinterfaces" -) - -// Interface provides access to all the informers in this group version. -type Interface interface { - // Experiments returns a ExperimentInformer. - Experiments() ExperimentInformer -} - -type version struct { - factory internalinterfaces.SharedInformerFactory - namespace string - tweakListOptions internalinterfaces.TweakListOptionsFunc -} - -// New returns a new Interface. -func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { - return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} -} - -// Experiments returns a ExperimentInformer. -func (v *version) Experiments() ExperimentInformer { - return &experimentInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} -} diff --git a/pkg/client/controller/informers/externalversions/generic.go b/pkg/client/controller/informers/externalversions/generic.go index 73a3c6fd2cd..d5ef3fd6a8e 100644 --- a/pkg/client/controller/informers/externalversions/generic.go +++ b/pkg/client/controller/informers/externalversions/generic.go @@ -20,11 +20,8 @@ package externalversions import ( "fmt" - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" v1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" @@ -56,26 +53,14 @@ func (f *genericInformer) Lister() cache.GenericLister { // TODO extend this to unknown resources with a client pool func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { switch resource { - // Group=experiment.kubeflow.org, Version=v1alpha3 - case v1alpha3.SchemeGroupVersion.WithResource("experiments"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Experiment().V1alpha3().Experiments().Informer()}, nil - - // Group=experiment.kubeflow.org, Version=v1beta1 + // Group=experiment.kubeflow.org, Version=v1beta1 case v1beta1.SchemeGroupVersion.WithResource("experiments"): return &genericInformer{resource: resource.GroupResource(), informer: f.Experiment().V1beta1().Experiments().Informer()}, nil - // Group=suggestion.kubeflow.org, Version=v1alpha3 - case suggestionsv1alpha3.SchemeGroupVersion.WithResource("suggestions"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Suggestion().V1alpha3().Suggestions().Informer()}, nil - // Group=suggestion.kubeflow.org, Version=v1beta1 case suggestionsv1beta1.SchemeGroupVersion.WithResource("suggestions"): return &genericInformer{resource: resource.GroupResource(), informer: f.Suggestion().V1beta1().Suggestions().Informer()}, nil - // Group=trial.kubeflow.org, Version=v1alpha3 - case trialsv1alpha3.SchemeGroupVersion.WithResource("trials"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Trial().V1alpha3().Trials().Informer()}, nil - // Group=trial.kubeflow.org, Version=v1beta1 case trialsv1beta1.SchemeGroupVersion.WithResource("trials"): return &genericInformer{resource: resource.GroupResource(), informer: f.Trial().V1beta1().Trials().Informer()}, nil diff --git a/pkg/client/controller/informers/externalversions/suggestions/interface.go b/pkg/client/controller/informers/externalversions/suggestions/interface.go index f464c1a1078..c2bdd8894f8 100644 --- a/pkg/client/controller/informers/externalversions/suggestions/interface.go +++ b/pkg/client/controller/informers/externalversions/suggestions/interface.go @@ -19,14 +19,11 @@ package suggestion import ( internalinterfaces "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/internalinterfaces" - v1alpha3 "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/suggestions/v1alpha3" v1beta1 "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/suggestions/v1beta1" ) // Interface provides access to each of this group's versions. type Interface interface { - // V1alpha3 provides access to shared informers for resources in V1alpha3. - V1alpha3() v1alpha3.Interface // V1beta1 provides access to shared informers for resources in V1beta1. V1beta1() v1beta1.Interface } @@ -42,11 +39,6 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } -// V1alpha3 returns a new v1alpha3.Interface. -func (g *group) V1alpha3() v1alpha3.Interface { - return v1alpha3.New(g.factory, g.namespace, g.tweakListOptions) -} - // V1beta1 returns a new v1beta1.Interface. func (g *group) V1beta1() v1beta1.Interface { return v1beta1.New(g.factory, g.namespace, g.tweakListOptions) diff --git a/pkg/client/controller/informers/externalversions/suggestions/v1alpha3/interface.go b/pkg/client/controller/informers/externalversions/suggestions/v1alpha3/interface.go deleted file mode 100644 index f8430e5667e..00000000000 --- a/pkg/client/controller/informers/externalversions/suggestions/v1alpha3/interface.go +++ /dev/null @@ -1,44 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by informer-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - internalinterfaces "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/internalinterfaces" -) - -// Interface provides access to all the informers in this group version. -type Interface interface { - // Suggestions returns a SuggestionInformer. - Suggestions() SuggestionInformer -} - -type version struct { - factory internalinterfaces.SharedInformerFactory - namespace string - tweakListOptions internalinterfaces.TweakListOptionsFunc -} - -// New returns a new Interface. -func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { - return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} -} - -// Suggestions returns a SuggestionInformer. -func (v *version) Suggestions() SuggestionInformer { - return &suggestionInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} -} diff --git a/pkg/client/controller/informers/externalversions/suggestions/v1alpha3/suggestion.go b/pkg/client/controller/informers/externalversions/suggestions/v1alpha3/suggestion.go deleted file mode 100644 index b3d0a4a2604..00000000000 --- a/pkg/client/controller/informers/externalversions/suggestions/v1alpha3/suggestion.go +++ /dev/null @@ -1,88 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by informer-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - time "time" - - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - versioned "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned" - internalinterfaces "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/internalinterfaces" - v1alpha3 "github.com/kubeflow/katib/pkg/client/controller/listers/suggestions/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" - watch "k8s.io/apimachinery/pkg/watch" - cache "k8s.io/client-go/tools/cache" -) - -// SuggestionInformer provides access to a shared informer and lister for -// Suggestions. -type SuggestionInformer interface { - Informer() cache.SharedIndexInformer - Lister() v1alpha3.SuggestionLister -} - -type suggestionInformer struct { - factory internalinterfaces.SharedInformerFactory - tweakListOptions internalinterfaces.TweakListOptionsFunc - namespace string -} - -// NewSuggestionInformer constructs a new informer for Suggestion type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewSuggestionInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredSuggestionInformer(client, namespace, resyncPeriod, indexers, nil) -} - -// NewFilteredSuggestionInformer constructs a new informer for Suggestion type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewFilteredSuggestionInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { - return cache.NewSharedIndexInformer( - &cache.ListWatch{ - ListFunc: func(options v1.ListOptions) (runtime.Object, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.SuggestionV1alpha3().Suggestions(namespace).List(options) - }, - WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.SuggestionV1alpha3().Suggestions(namespace).Watch(options) - }, - }, - &suggestionsv1alpha3.Suggestion{}, - resyncPeriod, - indexers, - ) -} - -func (f *suggestionInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredSuggestionInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) -} - -func (f *suggestionInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&suggestionsv1alpha3.Suggestion{}, f.defaultInformer) -} - -func (f *suggestionInformer) Lister() v1alpha3.SuggestionLister { - return v1alpha3.NewSuggestionLister(f.Informer().GetIndexer()) -} diff --git a/pkg/client/controller/informers/externalversions/trials/interface.go b/pkg/client/controller/informers/externalversions/trials/interface.go index 57b23f8f378..cacf6f733e5 100644 --- a/pkg/client/controller/informers/externalversions/trials/interface.go +++ b/pkg/client/controller/informers/externalversions/trials/interface.go @@ -19,14 +19,11 @@ package trial import ( internalinterfaces "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/internalinterfaces" - v1alpha3 "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/trials/v1alpha3" v1beta1 "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/trials/v1beta1" ) // Interface provides access to each of this group's versions. type Interface interface { - // V1alpha3 provides access to shared informers for resources in V1alpha3. - V1alpha3() v1alpha3.Interface // V1beta1 provides access to shared informers for resources in V1beta1. V1beta1() v1beta1.Interface } @@ -42,11 +39,6 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } -// V1alpha3 returns a new v1alpha3.Interface. -func (g *group) V1alpha3() v1alpha3.Interface { - return v1alpha3.New(g.factory, g.namespace, g.tweakListOptions) -} - // V1beta1 returns a new v1beta1.Interface. func (g *group) V1beta1() v1beta1.Interface { return v1beta1.New(g.factory, g.namespace, g.tweakListOptions) diff --git a/pkg/client/controller/informers/externalversions/trials/v1alpha3/interface.go b/pkg/client/controller/informers/externalversions/trials/v1alpha3/interface.go deleted file mode 100644 index f406b336c45..00000000000 --- a/pkg/client/controller/informers/externalversions/trials/v1alpha3/interface.go +++ /dev/null @@ -1,44 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by informer-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - internalinterfaces "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/internalinterfaces" -) - -// Interface provides access to all the informers in this group version. -type Interface interface { - // Trials returns a TrialInformer. - Trials() TrialInformer -} - -type version struct { - factory internalinterfaces.SharedInformerFactory - namespace string - tweakListOptions internalinterfaces.TweakListOptionsFunc -} - -// New returns a new Interface. -func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { - return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} -} - -// Trials returns a TrialInformer. -func (v *version) Trials() TrialInformer { - return &trialInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} -} diff --git a/pkg/client/controller/informers/externalversions/trials/v1alpha3/trial.go b/pkg/client/controller/informers/externalversions/trials/v1alpha3/trial.go deleted file mode 100644 index a21ef6fbd92..00000000000 --- a/pkg/client/controller/informers/externalversions/trials/v1alpha3/trial.go +++ /dev/null @@ -1,88 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by informer-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - time "time" - - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - versioned "github.com/kubeflow/katib/pkg/client/controller/clientset/versioned" - internalinterfaces "github.com/kubeflow/katib/pkg/client/controller/informers/externalversions/internalinterfaces" - v1alpha3 "github.com/kubeflow/katib/pkg/client/controller/listers/trials/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" - watch "k8s.io/apimachinery/pkg/watch" - cache "k8s.io/client-go/tools/cache" -) - -// TrialInformer provides access to a shared informer and lister for -// Trials. -type TrialInformer interface { - Informer() cache.SharedIndexInformer - Lister() v1alpha3.TrialLister -} - -type trialInformer struct { - factory internalinterfaces.SharedInformerFactory - tweakListOptions internalinterfaces.TweakListOptionsFunc - namespace string -} - -// NewTrialInformer constructs a new informer for Trial type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewTrialInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredTrialInformer(client, namespace, resyncPeriod, indexers, nil) -} - -// NewFilteredTrialInformer constructs a new informer for Trial type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewFilteredTrialInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { - return cache.NewSharedIndexInformer( - &cache.ListWatch{ - ListFunc: func(options v1.ListOptions) (runtime.Object, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.TrialV1alpha3().Trials(namespace).List(options) - }, - WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.TrialV1alpha3().Trials(namespace).Watch(options) - }, - }, - &trialsv1alpha3.Trial{}, - resyncPeriod, - indexers, - ) -} - -func (f *trialInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredTrialInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) -} - -func (f *trialInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&trialsv1alpha3.Trial{}, f.defaultInformer) -} - -func (f *trialInformer) Lister() v1alpha3.TrialLister { - return v1alpha3.NewTrialLister(f.Informer().GetIndexer()) -} diff --git a/pkg/client/controller/listers/experiments/v1alpha3/expansion_generated.go b/pkg/client/controller/listers/experiments/v1alpha3/expansion_generated.go deleted file mode 100644 index 57eac6ff69d..00000000000 --- a/pkg/client/controller/listers/experiments/v1alpha3/expansion_generated.go +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by lister-gen. DO NOT EDIT. - -package v1alpha3 - -// ExperimentListerExpansion allows custom methods to be added to -// ExperimentLister. -type ExperimentListerExpansion interface{} - -// ExperimentNamespaceListerExpansion allows custom methods to be added to -// ExperimentNamespaceLister. -type ExperimentNamespaceListerExpansion interface{} diff --git a/pkg/client/controller/listers/experiments/v1alpha3/experiment.go b/pkg/client/controller/listers/experiments/v1alpha3/experiment.go deleted file mode 100644 index 1eda8d36cef..00000000000 --- a/pkg/client/controller/listers/experiments/v1alpha3/experiment.go +++ /dev/null @@ -1,93 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by lister-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/tools/cache" -) - -// ExperimentLister helps list Experiments. -type ExperimentLister interface { - // List lists all Experiments in the indexer. - List(selector labels.Selector) (ret []*v1alpha3.Experiment, err error) - // Experiments returns an object that can list and get Experiments. - Experiments(namespace string) ExperimentNamespaceLister - ExperimentListerExpansion -} - -// experimentLister implements the ExperimentLister interface. -type experimentLister struct { - indexer cache.Indexer -} - -// NewExperimentLister returns a new ExperimentLister. -func NewExperimentLister(indexer cache.Indexer) ExperimentLister { - return &experimentLister{indexer: indexer} -} - -// List lists all Experiments in the indexer. -func (s *experimentLister) List(selector labels.Selector) (ret []*v1alpha3.Experiment, err error) { - err = cache.ListAll(s.indexer, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha3.Experiment)) - }) - return ret, err -} - -// Experiments returns an object that can list and get Experiments. -func (s *experimentLister) Experiments(namespace string) ExperimentNamespaceLister { - return experimentNamespaceLister{indexer: s.indexer, namespace: namespace} -} - -// ExperimentNamespaceLister helps list and get Experiments. -type ExperimentNamespaceLister interface { - // List lists all Experiments in the indexer for a given namespace. - List(selector labels.Selector) (ret []*v1alpha3.Experiment, err error) - // Get retrieves the Experiment from the indexer for a given namespace and name. - Get(name string) (*v1alpha3.Experiment, error) - ExperimentNamespaceListerExpansion -} - -// experimentNamespaceLister implements the ExperimentNamespaceLister -// interface. -type experimentNamespaceLister struct { - indexer cache.Indexer - namespace string -} - -// List lists all Experiments in the indexer for a given namespace. -func (s experimentNamespaceLister) List(selector labels.Selector) (ret []*v1alpha3.Experiment, err error) { - err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha3.Experiment)) - }) - return ret, err -} - -// Get retrieves the Experiment from the indexer for a given namespace and name. -func (s experimentNamespaceLister) Get(name string) (*v1alpha3.Experiment, error) { - obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) - if err != nil { - return nil, err - } - if !exists { - return nil, errors.NewNotFound(v1alpha3.Resource("experiment"), name) - } - return obj.(*v1alpha3.Experiment), nil -} diff --git a/pkg/client/controller/listers/suggestions/v1alpha3/expansion_generated.go b/pkg/client/controller/listers/suggestions/v1alpha3/expansion_generated.go deleted file mode 100644 index 28dfd3440d6..00000000000 --- a/pkg/client/controller/listers/suggestions/v1alpha3/expansion_generated.go +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by lister-gen. DO NOT EDIT. - -package v1alpha3 - -// SuggestionListerExpansion allows custom methods to be added to -// SuggestionLister. -type SuggestionListerExpansion interface{} - -// SuggestionNamespaceListerExpansion allows custom methods to be added to -// SuggestionNamespaceLister. -type SuggestionNamespaceListerExpansion interface{} diff --git a/pkg/client/controller/listers/suggestions/v1alpha3/suggestion.go b/pkg/client/controller/listers/suggestions/v1alpha3/suggestion.go deleted file mode 100644 index 7183068d785..00000000000 --- a/pkg/client/controller/listers/suggestions/v1alpha3/suggestion.go +++ /dev/null @@ -1,93 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by lister-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/tools/cache" -) - -// SuggestionLister helps list Suggestions. -type SuggestionLister interface { - // List lists all Suggestions in the indexer. - List(selector labels.Selector) (ret []*v1alpha3.Suggestion, err error) - // Suggestions returns an object that can list and get Suggestions. - Suggestions(namespace string) SuggestionNamespaceLister - SuggestionListerExpansion -} - -// suggestionLister implements the SuggestionLister interface. -type suggestionLister struct { - indexer cache.Indexer -} - -// NewSuggestionLister returns a new SuggestionLister. -func NewSuggestionLister(indexer cache.Indexer) SuggestionLister { - return &suggestionLister{indexer: indexer} -} - -// List lists all Suggestions in the indexer. -func (s *suggestionLister) List(selector labels.Selector) (ret []*v1alpha3.Suggestion, err error) { - err = cache.ListAll(s.indexer, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha3.Suggestion)) - }) - return ret, err -} - -// Suggestions returns an object that can list and get Suggestions. -func (s *suggestionLister) Suggestions(namespace string) SuggestionNamespaceLister { - return suggestionNamespaceLister{indexer: s.indexer, namespace: namespace} -} - -// SuggestionNamespaceLister helps list and get Suggestions. -type SuggestionNamespaceLister interface { - // List lists all Suggestions in the indexer for a given namespace. - List(selector labels.Selector) (ret []*v1alpha3.Suggestion, err error) - // Get retrieves the Suggestion from the indexer for a given namespace and name. - Get(name string) (*v1alpha3.Suggestion, error) - SuggestionNamespaceListerExpansion -} - -// suggestionNamespaceLister implements the SuggestionNamespaceLister -// interface. -type suggestionNamespaceLister struct { - indexer cache.Indexer - namespace string -} - -// List lists all Suggestions in the indexer for a given namespace. -func (s suggestionNamespaceLister) List(selector labels.Selector) (ret []*v1alpha3.Suggestion, err error) { - err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha3.Suggestion)) - }) - return ret, err -} - -// Get retrieves the Suggestion from the indexer for a given namespace and name. -func (s suggestionNamespaceLister) Get(name string) (*v1alpha3.Suggestion, error) { - obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) - if err != nil { - return nil, err - } - if !exists { - return nil, errors.NewNotFound(v1alpha3.Resource("suggestion"), name) - } - return obj.(*v1alpha3.Suggestion), nil -} diff --git a/pkg/client/controller/listers/trials/v1alpha3/expansion_generated.go b/pkg/client/controller/listers/trials/v1alpha3/expansion_generated.go deleted file mode 100644 index 0d2dba81d06..00000000000 --- a/pkg/client/controller/listers/trials/v1alpha3/expansion_generated.go +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by lister-gen. DO NOT EDIT. - -package v1alpha3 - -// TrialListerExpansion allows custom methods to be added to -// TrialLister. -type TrialListerExpansion interface{} - -// TrialNamespaceListerExpansion allows custom methods to be added to -// TrialNamespaceLister. -type TrialNamespaceListerExpansion interface{} diff --git a/pkg/client/controller/listers/trials/v1alpha3/trial.go b/pkg/client/controller/listers/trials/v1alpha3/trial.go deleted file mode 100644 index 94735ea3586..00000000000 --- a/pkg/client/controller/listers/trials/v1alpha3/trial.go +++ /dev/null @@ -1,93 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Code generated by lister-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/tools/cache" -) - -// TrialLister helps list Trials. -type TrialLister interface { - // List lists all Trials in the indexer. - List(selector labels.Selector) (ret []*v1alpha3.Trial, err error) - // Trials returns an object that can list and get Trials. - Trials(namespace string) TrialNamespaceLister - TrialListerExpansion -} - -// trialLister implements the TrialLister interface. -type trialLister struct { - indexer cache.Indexer -} - -// NewTrialLister returns a new TrialLister. -func NewTrialLister(indexer cache.Indexer) TrialLister { - return &trialLister{indexer: indexer} -} - -// List lists all Trials in the indexer. -func (s *trialLister) List(selector labels.Selector) (ret []*v1alpha3.Trial, err error) { - err = cache.ListAll(s.indexer, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha3.Trial)) - }) - return ret, err -} - -// Trials returns an object that can list and get Trials. -func (s *trialLister) Trials(namespace string) TrialNamespaceLister { - return trialNamespaceLister{indexer: s.indexer, namespace: namespace} -} - -// TrialNamespaceLister helps list and get Trials. -type TrialNamespaceLister interface { - // List lists all Trials in the indexer for a given namespace. - List(selector labels.Selector) (ret []*v1alpha3.Trial, err error) - // Get retrieves the Trial from the indexer for a given namespace and name. - Get(name string) (*v1alpha3.Trial, error) - TrialNamespaceListerExpansion -} - -// trialNamespaceLister implements the TrialNamespaceLister -// interface. -type trialNamespaceLister struct { - indexer cache.Indexer - namespace string -} - -// List lists all Trials in the indexer for a given namespace. -func (s trialNamespaceLister) List(selector labels.Selector) (ret []*v1alpha3.Trial, err error) { - err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha3.Trial)) - }) - return ret, err -} - -// Get retrieves the Trial from the indexer for a given namespace and name. -func (s trialNamespaceLister) Get(name string) (*v1alpha3.Trial, error) { - obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) - if err != nil { - return nil, err - } - if !exists { - return nil, errors.NewNotFound(v1alpha3.Resource("trial"), name) - } - return obj.(*v1alpha3.Trial), nil -} diff --git a/pkg/common/v1alpha3/common.go b/pkg/common/v1alpha3/common.go deleted file mode 100644 index 187a3e8ca4c..00000000000 --- a/pkg/common/v1alpha3/common.go +++ /dev/null @@ -1,32 +0,0 @@ -package v1alpha3 - -import ( - "time" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -func ConvertTime2RFC3339(t *metav1.Time) string { - if t != nil { - return t.UTC().Format(time.RFC3339) - } else { - zero := &metav1.Time{} - return zero.UTC().Format(time.RFC3339) - } -} - -func GetJobLabelMap(jobKind string, trialName string) map[string]string { - labelMap := make(map[string]string) - - if jobKind == "TFJob" { - labelMap["job-name"] = trialName - labelMap["job-role"] = "master" - } else if jobKind == "PyTorchJob" { - labelMap["job-name"] = trialName - labelMap["job-role"] = "master" - } else { - labelMap["job-name"] = trialName - } - - return labelMap -} diff --git a/pkg/common/v1alpha3/katib_manager_util.go b/pkg/common/v1alpha3/katib_manager_util.go deleted file mode 100644 index 436b7f800cf..00000000000 --- a/pkg/common/v1alpha3/katib_manager_util.go +++ /dev/null @@ -1,82 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha3 - -import ( - "context" - - "google.golang.org/grpc" - - api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" -) - -type katibDBManagerClientAndConn struct { - Conn *grpc.ClientConn - KatibDBManagerClient api_pb.ManagerClient -} - -// GetDBManagerAddr returns address of Katib DB Manager -func GetDBManagerAddr() string { - dbManagerNS := consts.DefaultKatibDBManagerServiceNamespace - dbManagerIP := consts.DefaultKatibDBManagerServiceIP - dbManagerPort := consts.DefaultKatibDBManagerServicePort - - if len(dbManagerNS) != 0 { - return dbManagerIP + "." + dbManagerNS + ":" + dbManagerPort - } - - return dbManagerIP + ":" + dbManagerPort -} - -func getKatibDBManagerClientAndConn() (*katibDBManagerClientAndConn, error) { - addr := GetDBManagerAddr() - conn, err := grpc.Dial(addr, grpc.WithInsecure()) - if err != nil { - return nil, err - } - kcc := &katibDBManagerClientAndConn{ - Conn: conn, - KatibDBManagerClient: api_pb.NewManagerClient(conn), - } - return kcc, nil -} - -func closeKatibDBManagerConnection(kcc *katibDBManagerClientAndConn) { - kcc.Conn.Close() -} - -func GetObservationLog(request *api_pb.GetObservationLogRequest) (*api_pb.GetObservationLogReply, error) { - ctx := context.Background() - kcc, err := getKatibDBManagerClientAndConn() - if err != nil { - return nil, err - } - defer closeKatibDBManagerConnection(kcc) - kc := kcc.KatibDBManagerClient - return kc.GetObservationLog(ctx, request) -} - -func DeleteObservationLog(request *api_pb.DeleteObservationLogRequest) (*api_pb.DeleteObservationLogReply, error) { - ctx := context.Background() - kcc, err := getKatibDBManagerClientAndConn() - if err != nil { - return nil, err - } - defer closeKatibDBManagerConnection(kcc) - kc := kcc.KatibDBManagerClient - return kc.DeleteObservationLog(ctx, request) -} diff --git a/pkg/common/v1beta1/common.go b/pkg/common/v1beta1/common.go deleted file mode 100644 index 0b37adbad0f..00000000000 --- a/pkg/common/v1beta1/common.go +++ /dev/null @@ -1,32 +0,0 @@ -package v1beta1 - -import ( - "time" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -func ConvertTime2RFC3339(t *metav1.Time) string { - if t != nil { - return t.UTC().Format(time.RFC3339) - } else { - zero := &metav1.Time{} - return zero.UTC().Format(time.RFC3339) - } -} - -func GetJobLabelMap(jobKind string, trialName string) map[string]string { - labelMap := make(map[string]string) - - if jobKind == "TFJob" { - labelMap["job-name"] = trialName - labelMap["job-role"] = "master" - } else if jobKind == "PyTorchJob" { - labelMap["job-name"] = trialName - labelMap["job-role"] = "master" - } else { - labelMap["job-name"] = trialName - } - - return labelMap -} diff --git a/pkg/controller.v1alpha3/add_experiment.go b/pkg/controller.v1alpha3/add_experiment.go deleted file mode 100644 index d12107832dd..00000000000 --- a/pkg/controller.v1alpha3/add_experiment.go +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package controller - -import ( - "github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment" -) - -func init() { - // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. - AddToManagerFuncs = append(AddToManagerFuncs, experiment.Add) -} diff --git a/pkg/controller.v1alpha3/add_suggestion.go b/pkg/controller.v1alpha3/add_suggestion.go deleted file mode 100644 index b3ae49cafa9..00000000000 --- a/pkg/controller.v1alpha3/add_suggestion.go +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package controller - -import ( - "github.com/kubeflow/katib/pkg/controller.v1alpha3/suggestion" -) - -func init() { - // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. - AddToManagerFuncs = append(AddToManagerFuncs, suggestion.Add) -} diff --git a/pkg/controller.v1alpha3/add_trial.go b/pkg/controller.v1alpha3/add_trial.go deleted file mode 100644 index 7c38930cf2e..00000000000 --- a/pkg/controller.v1alpha3/add_trial.go +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package controller - -import ( - "github.com/kubeflow/katib/pkg/controller.v1alpha3/trial" -) - -func init() { - // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. - AddToManagerFuncs = append(AddToManagerFuncs, trial.Add) -} diff --git a/pkg/controller.v1alpha3/consts/const.go b/pkg/controller.v1alpha3/consts/const.go deleted file mode 100644 index ffdd2da15b4..00000000000 --- a/pkg/controller.v1alpha3/consts/const.go +++ /dev/null @@ -1,153 +0,0 @@ -package consts - -import ( - "github.com/kubeflow/katib/pkg/util/v1alpha3/env" - "time" -) - -const ( - // ConfigExperimentSuggestionName is the config name of the - // suggestion client implementation in experiment controller. - ConfigExperimentSuggestionName = "experiment-suggestion-name" - // ConfigCertLocalFS is the config name which indicates if we - // should store the cert in file system. - ConfigCertLocalFS = "cert-local-filesystem" - // ConfigInjectSecurityContext is the config name which indicates - // if we should inject the security context into the metrics collector - // sidecar. - ConfigInjectSecurityContext = "inject-security-context" - // ConfigEnableGRPCProbeInSuggestion is the config name which indicates - // if we should set GRPC probe in suggestion deployments. - ConfigEnableGRPCProbeInSuggestion = "enable-grpc-probe-in-suggestion" - - // LabelExperimentName is the label of experiment name. - LabelExperimentName = "experiment" - // LabelSuggestionName is the label of suggestion name. - LabelSuggestionName = "suggestion" - // LabelDeploymentName is the label of deployment name. - LabelDeploymentName = "deployment" - - // ContainerSuggestion is the container name in Suggestion. - ContainerSuggestion = "suggestion" - - // DefaultSuggestionPort is the default port of suggestion service. - DefaultSuggestionPort = 6789 - // DefaultSuggestionPortName is the default port name of suggestion service. - DefaultSuggestionPortName = "katib-api" - // DefaultGRPCService is the default service name in Suggestion, - // which is used to run healthz check using grpc probe. - DefaultGRPCService = "manager.v1alpha3.Suggestion" - - // DefaultGRPCRetryAttempts is the the maximum number of retries for gRPC calls - DefaultGRPCRetryAttempts = 10 - // DefaultGRPCRetryPeriod is a fixed period of time between gRPC call retries - DefaultGRPCRetryPeriod = 3 * time.Second - - // DefaultKatibNamespaceEnvName is the default env name of katib namespace - DefaultKatibNamespaceEnvName = "KATIB_CORE_NAMESPACE" - // DefaultKatibComposerEnvName is the default env name of katib suggestion composer - DefaultKatibComposerEnvName = "KATIB_SUGGESTION_COMPOSER" - - // DefaultKatibDBManagerServiceNamespaceEnvName is the env name of Katib DB Manager namespace - DefaultKatibDBManagerServiceNamespaceEnvName = "KATIB_DB_MANAGER_SERVICE_NAMESPACE" - // DefaultKatibDBManagerServiceIPEnvName is the env name of Katib DB Manager IP - DefaultKatibDBManagerServiceIPEnvName = "KATIB_DB_MANAGER_SERVICE_IP" - // DefaultKatibDBManagerServicePortEnvName is the env name of Katib DB Manager Port - DefaultKatibDBManagerServicePortEnvName = "KATIB_DB_MANAGER_SERVICE_PORT" - - // KatibConfigMapName is the config map constants - // Configmap name which includes Katib's configuration - KatibConfigMapName = "katib-config" - // LabelSuggestionTag is the name of suggestion config in configmap. - LabelSuggestionTag = "suggestion" - // LabelSuggestionImageTag is the name of suggestion image config in configmap. - LabelSuggestionImageTag = "image" - // LabelSuggestionCPULimitTag is the name of suggestion CPU Limit config in configmap. - LabelSuggestionCPULimitTag = "cpuLimit" - // DefaultCPULimit is the default value for CPU Limit - DefaultCPULimit = "500m" - // LabelSuggestionCPURequestTag is the name of suggestion CPU Request config in configmap. - LabelSuggestionCPURequestTag = "cpuRequest" - // DefaultCPURequest is the default value for CPU Request - DefaultCPURequest = "50m" - // LabelSuggestionMemLimitTag is the name of suggestion Mem Limit config in configmap. - LabelSuggestionMemLimitTag = "memLimit" - // DefaultMemLimit is the default value for mem Limit - DefaultMemLimit = "100Mi" - // LabelSuggestionMemRequestTag is the name of suggestion Mem Request config in configmap. - LabelSuggestionMemRequestTag = "memRequest" - // DefaultMemRequest is the default value for mem Request - DefaultMemRequest = "10Mi" - // LabelSuggestionDiskLimitTag is the name of suggestion Disk Limit config in configmap. - LabelSuggestionDiskLimitTag = "diskLimit" - // DefaultDiskLimit is the default value for disk limit. - DefaultDiskLimit = "5Gi" - // LabelSuggestionDiskRequestTag is the name of suggestion Disk Request config in configmap. - LabelSuggestionDiskRequestTag = "diskRequest" - // DefaultDiskRequest is the default value for disk request. - DefaultDiskRequest = "500Mi" - // LabelSuggestionImagePullPolicy is the name of suggestion image pull policy in configmap. - LabelSuggestionImagePullPolicy = "imagePullPolicy" - // LabelSuggestionServiceAccountName is the name of suggestion service account in configmap. - LabelSuggestionServiceAccountName = "serviceAccountName" - // DefaultImagePullPolicy is the default value for image pull policy. - DefaultImagePullPolicy = "IfNotPresent" - // LabelMetricsCollectorSidecar is the name of metrics collector config in configmap. - LabelMetricsCollectorSidecar = "metrics-collector-sidecar" - // LabelMetricsCollectorSidecarImage is the name of metrics collector image config in configmap. - LabelMetricsCollectorSidecarImage = "image" - // LabelMetricsCollectorCPULimitTag is the name of metrics collector CPU Limit config in configmap. - LabelMetricsCollectorCPULimitTag = "cpuLimit" - // LabelMetricsCollectorCPURequestTag is the name of metrics collector CPU Request config in configmap. - LabelMetricsCollectorCPURequestTag = "cpuRequest" - // LabelMetricsCollectorMemLimitTag is the name of metrics collector Mem Limit config in configmap. - LabelMetricsCollectorMemLimitTag = "memLimit" - // LabelMetricsCollectorMemRequestTag is the name of metrics collector Mem Request config in configmap. - LabelMetricsCollectorMemRequestTag = "memRequest" - // LabelMetricsCollectorDiskLimitTag is the name of metrics collector Disk Limit config in configmap. - LabelMetricsCollectorDiskLimitTag = "diskLimit" - // LabelMetricsCollectorDiskRequestTag is the name of metrics collector Disk Request config in configmap. - LabelMetricsCollectorDiskRequestTag = "diskRequest" - // LabelMetricsCollectorImagePullPolicy is the name of metrics collector image pull policy in configmap. - LabelMetricsCollectorImagePullPolicy = "imagePullPolicy" - - // ReconcileErrorReason is the reason when there is a reconcile error. - ReconcileErrorReason = "ReconcileError" - - // JobKindJob is the kind of the Kubernetes Job. - JobKindJob = "Job" - // JobKindTF is the kind of TFJob. - JobKindTF = "TFJob" - // JobKindPyTorch is the kind of PyTorchJob. - JobKindPyTorch = "PyTorchJob" - - // built-in JobRoles - JobRole = "job-role" - JobRoleTF = "tf-job-role" - JobRolePyTorch = "pytorch-job-role" - - // AnnotationIstioSidecarInjectName is the annotation of Istio Sidecar - AnnotationIstioSidecarInjectName = "sidecar.istio.io/inject" - - // AnnotationIstioSidecarInjectValue is the value of Istio Sidecar annotation - AnnotationIstioSidecarInjectValue = "false" - - // LabelTrialTemplateConfigMapName is the label name for the Trial templates configMap - LabelTrialTemplateConfigMapName = "app" - // LabelTrialTemplateConfigMapValue is the label value for the Trial templates configMap - LabelTrialTemplateConfigMapValue = "katib-trial-templates" -) - -var ( - // DefaultKatibNamespace is the default namespace of katib deployment. - DefaultKatibNamespace = env.GetEnvOrDefault(DefaultKatibNamespaceEnvName, "kubeflow") - // DefaultComposer is the default composer of katib suggestion. - DefaultComposer = env.GetEnvOrDefault(DefaultKatibComposerEnvName, "General") - - // DefaultKatibDBManagerServiceNamespace is the default namespace of Katib DB Manager - DefaultKatibDBManagerServiceNamespace = env.GetEnvOrDefault(DefaultKatibDBManagerServiceNamespaceEnvName, DefaultKatibNamespace) - // DefaultKatibDBManagerServiceIP is the default IP of Katib DB Manager - DefaultKatibDBManagerServiceIP = env.GetEnvOrDefault(DefaultKatibDBManagerServiceIPEnvName, "katib-db-manager") - // DefaultKatibDBManagerServicePort is the default Port of Katib DB Manager - DefaultKatibDBManagerServicePort = env.GetEnvOrDefault(DefaultKatibDBManagerServicePortEnvName, "6789") -) diff --git a/pkg/controller.v1alpha3/controller.go b/pkg/controller.v1alpha3/controller.go deleted file mode 100644 index b2acc50372b..00000000000 --- a/pkg/controller.v1alpha3/controller.go +++ /dev/null @@ -1,33 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package controller - -import ( - "sigs.k8s.io/controller-runtime/pkg/manager" -) - -// AddToManagerFuncs is a list of functions to add all Controllers to the Manager -var AddToManagerFuncs []func(manager.Manager) error - -// AddToManager adds all Controllers to the Manager -func AddToManager(m manager.Manager) error { - for _, f := range AddToManagerFuncs { - if err := f(m); err != nil { - return err - } - } - return nil -} diff --git a/pkg/controller.v1alpha3/experiment/experiment_consts.go b/pkg/controller.v1alpha3/experiment/experiment_consts.go deleted file mode 100644 index 306f54aea3e..00000000000 --- a/pkg/controller.v1alpha3/experiment/experiment_consts.go +++ /dev/null @@ -1,5 +0,0 @@ -package experiment - -const ( - ReconcileFailedReason = "ReconcileFailed" -) diff --git a/pkg/controller.v1alpha3/experiment/experiment_controller.go b/pkg/controller.v1alpha3/experiment/experiment_controller.go deleted file mode 100644 index a6ea2f20e49..00000000000 --- a/pkg/controller.v1alpha3/experiment/experiment_controller.go +++ /dev/null @@ -1,418 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package experiment - -import ( - "context" - "sort" - - "github.com/spf13/viper" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/equality" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/tools/record" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/metrics" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - "sigs.k8s.io/controller-runtime/pkg/source" - - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/manifest" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/suggestion" - suggestionfake "github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/suggestion/fake" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/util" -) - -const ( - // ControllerName is the controller name. - ControllerName = "experiment-controller" -) - -var ( - log = logf.Log.WithName(ControllerName) -) - -// Add creates a new Experiment Controller and adds it to the Manager with default RBAC. The Manager will set fields on the Controller -// and Start it when the Manager is Started. -func Add(mgr manager.Manager) error { - return add(mgr, newReconciler(mgr)) -} - -// newReconciler returns a new reconcile.Reconciler -func newReconciler(mgr manager.Manager) reconcile.Reconciler { - r := &ReconcileExperiment{ - Client: mgr.GetClient(), - scheme: mgr.GetScheme(), - recorder: mgr.GetRecorder(ControllerName), - } - imp := viper.GetString(consts.ConfigExperimentSuggestionName) - r.Suggestion = newSuggestion(imp, mgr.GetScheme(), mgr.GetClient()) - - r.Generator = manifest.New(r.Client) - r.updateStatusHandler = r.updateStatus - r.collector = util.NewExpsCollector(mgr.GetCache(), metrics.Registry) - return r -} - -// newSuggestion returns the new Suggestion for the given config. -func newSuggestion(config string, scheme *runtime.Scheme, client client.Client) suggestion.Suggestion { - // Use different implementation according to the configuration. - switch config { - case "fake": - log.Info("Using the fake suggestion implementation") - return suggestionfake.New() - case "default": - log.Info("Using the default suggestion implementation") - return suggestion.New(scheme, client) - default: - log.Info("No valid name specified, using the default suggestion implementation", - "implementation", config) - return suggestion.New(scheme, client) - } -} - -// add adds a new Controller to mgr with r as the reconcile.Reconciler -func add(mgr manager.Manager, r reconcile.Reconciler) error { - // Create a new controller - c, err := controller.New("experiment-controller", mgr, controller.Options{Reconciler: r}) - if err != nil { - log.Error(err, "Failed to create experiment controller") - return err - } - - if err = addWatch(mgr, c); err != nil { - log.Error(err, "Trial watch failed") - return err - } - - log.Info("Experiment controller created") - return nil -} - -// addWatch adds a new Controller to mgr with r as the reconcile.Reconciler -func addWatch(mgr manager.Manager, c controller.Controller) error { - // Watch for changes to Experiment - err := c.Watch(&source.Kind{Type: &experimentsv1alpha3.Experiment{}}, &handler.EnqueueRequestForObject{}) - if err != nil { - log.Error(err, "Experiment watch failed") - return err - } - - // Watch for trials for the experiments - err = c.Watch( - &source.Kind{Type: &trialsv1alpha3.Trial{}}, - &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &experimentsv1alpha3.Experiment{}, - }) - - if err != nil { - log.Error(err, "Trial watch failed") - return err - } - - err = c.Watch( - &source.Kind{Type: &suggestionsv1alpha3.Suggestion{}}, - &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &experimentsv1alpha3.Experiment{}, - }) - - if err != nil { - log.Error(err, "Suggestion watch failed") - return err - } - return nil -} - -var _ reconcile.Reconciler = &ReconcileExperiment{} - -// ReconcileExperiment reconciles a Experiment object -type ReconcileExperiment struct { - client.Client - scheme *runtime.Scheme - recorder record.EventRecorder - - suggestion.Suggestion - manifest.Generator - // updateStatusHandler is defined for test purpose. - updateStatusHandler updateStatusFunc - // collector is a wrapper for experiment metrics. - collector *util.ExperimentsCollector -} - -// Reconcile reads that state of the cluster for a Experiment object and makes changes based on the state read -// and what is in the Experiment.Spec -// +kubebuilder:rbac:groups=experiments.kubeflow.org,resources=experiments,verbs=get;list;watch;create;update;patch;delete -// +kubebuilder:rbac:groups=experiments.kubeflow.org,resources=experiments/status,verbs=get;update;patch -func (r *ReconcileExperiment) Reconcile(request reconcile.Request) (reconcile.Result, error) { - // Fetch the Experiment instance - logger := log.WithValues("Experiment", request.NamespacedName) - original := &experimentsv1alpha3.Experiment{} - err := r.Get(context.TODO(), request.NamespacedName, original) - if err != nil { - if errors.IsNotFound(err) { - // Object not found, return. Created objects are automatically garbage collected. - // For additional cleanup logic use finalizers. - return reconcile.Result{}, nil - } - // Error reading the object - requeue the request. - logger.Error(err, "Experiment Get error") - return reconcile.Result{}, err - } - instance := original.DeepCopy() - - if needUpdate, finalizers := needUpdateFinalizers(instance); needUpdate { - return r.updateFinalizers(instance, finalizers) - } - - if instance.IsCompleted() { - // Check if completed instance is restartable - // Experiment is restartable only if it is in succeeded state by reaching max trials - // And Resume Policy is LongRunning - if util.IsCompletedExperimentRestartable(instance) { - // Check if max trials is reconfigured - if (instance.Spec.MaxTrialCount != nil && - *instance.Spec.MaxTrialCount != instance.Status.Trials) || - (instance.Spec.MaxTrialCount == nil && instance.Status.Trials != 0) { - logger.Info("Experiment is restarting") - msg := "Experiment is restarted" - instance.MarkExperimentStatusRestarting(util.ExperimentRestartingReason, msg) - } - } else { - // Terminate Suggestion after Experiment is finished if Resume Policy is Never - if instance.Spec.ResumePolicy == experimentsv1alpha3.NeverResume { - err := r.terminateSuggestion(instance) - if err != nil { - logger.Error(err, "Terminate Suggestion error") - } - return reconcile.Result{}, err - } - // If experiment is completed with no running trials, stop reconcile - if !instance.HasRunningTrials() { - return reconcile.Result{}, nil - } - } - } - if !instance.IsCreated() { - if instance.Status.StartTime == nil { - now := metav1.Now() - instance.Status.StartTime = &now - } - if instance.Status.CompletionTime == nil { - instance.Status.CompletionTime = &metav1.Time{} - } - msg := "Experiment is created" - instance.MarkExperimentStatusCreated(util.ExperimentCreatedReason, msg) - } else { - err := r.ReconcileExperiment(instance) - if err != nil { - logger.Error(err, "Reconcile experiment error") - r.recorder.Eventf(instance, - corev1.EventTypeWarning, ReconcileFailedReason, - "Failed to reconcile: %v", err) - return reconcile.Result{}, err - } - } - - if !equality.Semantic.DeepEqual(original.Status, instance.Status) { - //assuming that only status change - err = r.updateStatusHandler(instance) - if err != nil { - logger.Error(err, "Update experiment instance status error") - return reconcile.Result{}, err - } - } - - return reconcile.Result{}, nil -} - -// ReconcileExperiment is the main reconcile loop. -func (r *ReconcileExperiment) ReconcileExperiment(instance *experimentsv1alpha3.Experiment) error { - logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) - trials := &trialsv1alpha3.TrialList{} - labels := map[string]string{consts.LabelExperimentName: instance.Name} - lo := &client.ListOptions{} - lo.MatchingLabels(labels).InNamespace(instance.Namespace) - - if err := r.List(context.TODO(), lo, trials); err != nil { - logger.Error(err, "Trial List error") - return err - } - if len(trials.Items) > 0 { - if err := util.UpdateExperimentStatus(r.collector, instance, trials); err != nil { - logger.Error(err, "Update experiment status error") - return err - } - } - reconcileRequired := !instance.IsCompleted() - if reconcileRequired { - r.ReconcileTrials(instance, trials.Items) - } - - return nil -} - -// ReconcileTrials syncs trials. -func (r *ReconcileExperiment) ReconcileTrials(instance *experimentsv1alpha3.Experiment, trials []trialsv1alpha3.Trial) error { - - logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) - - parallelCount := *instance.Spec.ParallelTrialCount - activeCount := instance.Status.TrialsPending + instance.Status.TrialsRunning - completedCount := instance.Status.TrialsSucceeded + instance.Status.TrialsFailed + instance.Status.TrialsKilled - - if activeCount > parallelCount { - deleteCount := activeCount - parallelCount - if deleteCount > 0 { - //delete 'deleteCount' number of trails. Sort them? - logger.Info("DeleteTrials", "deleteCount", deleteCount) - if err := r.deleteTrials(instance, trials, deleteCount); err != nil { - logger.Error(err, "Delete trials error") - return err - } - } - - } else if activeCount < parallelCount { - var requiredActiveCount int32 - if instance.Spec.MaxTrialCount == nil { - requiredActiveCount = parallelCount - } else { - requiredActiveCount = *instance.Spec.MaxTrialCount - completedCount - if requiredActiveCount > parallelCount { - requiredActiveCount = parallelCount - } - } - - addCount := requiredActiveCount - activeCount - if addCount < 0 { - logger.Info("Invalid setting", "requiredActiveCount", requiredActiveCount, "MaxTrialCount", - *instance.Spec.MaxTrialCount, "CompletedCount", completedCount) - addCount = 0 - } - - logger.Info("Statistics", - "requiredActiveCount", requiredActiveCount, - "parallelCount", parallelCount, - "activeCount", activeCount, - "completedCount", completedCount, - ) - - //skip if no trials need to be created - if addCount > 0 { - //create "addCount" number of trials - logger.Info("CreateTrials", "addCount", addCount) - if err := r.createTrials(instance, trials, addCount); err != nil { - logger.Error(err, "Create trials error") - return err - } - } - } - - return nil - -} - -func (r *ReconcileExperiment) createTrials(instance *experimentsv1alpha3.Experiment, trialList []trialsv1alpha3.Trial, addCount int32) error { - - logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) - currentCount := int32(len(trialList)) - trials, err := r.ReconcileSuggestions(instance, currentCount, addCount) - if err != nil { - logger.Error(err, "Get suggestions error") - return err - } - for _, trial := range trials { - if err = r.createTrialInstance(instance, &trial); err != nil { - logger.Error(err, "Create trial instance error", "trial", trial) - continue - } - } - return nil -} - -func (r *ReconcileExperiment) deleteTrials(instance *experimentsv1alpha3.Experiment, - trials []trialsv1alpha3.Trial, - expectedDeletions int32) error { - logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) - - trialSlice := trials - sort.Slice(trialSlice, func(i, j int) bool { - return trialSlice[i].CreationTimestamp.Time. - After(trialSlice[j].CreationTimestamp.Time) - }) - - expected := int(expectedDeletions) - actual := len(trialSlice) - // If the number of trials < expected, we delete all we have. - if actual < expected { - logger.Info("deleteTrials does not find enough trials, we will delete all trials instead", - "expectedDeletions", expected, "trials", actual) - expected = actual - } - for i := 0; i < expected; i++ { - if err := r.Delete(context.TODO(), &trialSlice[i]); err != nil { - logger.Error(err, "Trial Delete error") - return err - } - } - return nil -} - -// ReconcileSuggestions gets or creates the suggestion if needed. -func (r *ReconcileExperiment) ReconcileSuggestions(instance *experimentsv1alpha3.Experiment, currentCount, addCount int32) ([]suggestionsv1alpha3.TrialAssignment, error) { - logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) - var assignments []suggestionsv1alpha3.TrialAssignment - suggestionRequestsCount := currentCount + addCount - - original, err := r.GetOrCreateSuggestion(instance, suggestionRequestsCount) - logger.Info("GetOrCreateSuggestion", "Instance name", instance.Name, "suggestionRequestsCount", suggestionRequestsCount) - if err != nil { - logger.Error(err, "GetOrCreateSuggestion failed", "instance", instance.Name, "suggestionRequestsCount", suggestionRequestsCount) - return nil, err - } else { - if original != nil { - if original.IsFailed() { - msg := "Suggestion has failed" - instance.MarkExperimentStatusFailed(util.ExperimentFailedReason, msg) - } else { - suggestion := original.DeepCopy() - if len(suggestion.Status.Suggestions) > int(currentCount) { - suggestions := suggestion.Status.Suggestions - assignments = suggestions[currentCount:] - } - if suggestion.Spec.Requests != suggestionRequestsCount { - suggestion.Spec.Requests = suggestionRequestsCount - if err := r.UpdateSuggestion(suggestion); err != nil { - return nil, err - } - } - } - } - } - return assignments, nil -} diff --git a/pkg/controller.v1alpha3/experiment/experiment_controller_suite_test.go b/pkg/controller.v1alpha3/experiment/experiment_controller_suite_test.go deleted file mode 100644 index 7f56324b0da..00000000000 --- a/pkg/controller.v1alpha3/experiment/experiment_controller_suite_test.go +++ /dev/null @@ -1,102 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package experiment - -import ( - stdlog "log" - "os" - "path/filepath" - "sync" - "testing" - "time" - - "github.com/onsi/gomega" - "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/rest" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/envtest" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - - apis "github.com/kubeflow/katib/pkg/apis/controller" -) - -var ( - cfg *rest.Config - controlPlaneStartTimeout = 60 * time.Second - controlPlaneStopTimeout = 60 * time.Second -) - -func TestMain(m *testing.M) { - t := &envtest.Environment{ - ControlPlaneStartTimeout: controlPlaneStartTimeout, - ControlPlaneStopTimeout: controlPlaneStopTimeout, - CRDDirectoryPaths: []string{ - filepath.Join("..", "..", "..", "manifests", "v1alpha3", "katib-controller"), - filepath.Join("..", "..", "..", "test", "unit", "v1alpha3", "crds"), - }, - } - apis.AddToScheme(scheme.Scheme) - - var err error - if cfg, err = t.Start(); err != nil { - stdlog.Fatal(err) - } - - code := m.Run() - t.Stop() - os.Exit(code) -} - -// SetupTestReconcile returns a reconcile.Reconcile implementation that delegates to inner. -func SetupTestReconcile(inner reconcile.Reconciler) reconcile.Reconciler { - fn := reconcile.Func(func(req reconcile.Request) (reconcile.Result, error) { - result, err := inner.Reconcile(req) - return result, err - }) - return fn -} - -// StartTestManager adds recFn -func StartTestManager(mgr manager.Manager, g *gomega.GomegaWithT) (chan struct{}, *sync.WaitGroup) { - stop := make(chan struct{}) - wg := &sync.WaitGroup{} - wg.Add(1) - go func() { - defer wg.Done() - g.Expect(mgr.Start(stop)).NotTo(gomega.HaveOccurred()) - }() - return stop, wg -} - -// addForTestPurpose adds a new Controller to mgr with r as the reconcile.Reconciler. -func addForTestPurpose(mgr manager.Manager, r reconcile.Reconciler) error { - // Create a new controller - c, err := controller.New("test-experiment-controller", mgr, controller.Options{Reconciler: r}) - if err != nil { - log.Error(err, "Failed to create experiment controller for test purpose.") - return err - } - - if err = addWatch(mgr, c); err != nil { - log.Error(err, "Trial watch failed") - return err - } - - log.Info("Experiment controller created") - return nil -} diff --git a/pkg/controller.v1alpha3/experiment/experiment_controller_test.go b/pkg/controller.v1alpha3/experiment/experiment_controller_test.go deleted file mode 100644 index 2d3d094fdaf..00000000000 --- a/pkg/controller.v1alpha3/experiment/experiment_controller_test.go +++ /dev/null @@ -1,276 +0,0 @@ -package experiment - -import ( - "context" - "testing" - "time" - - "github.com/golang/mock/gomock" - "github.com/onsi/gomega" - "github.com/prometheus/client_golang/prometheus" - "k8s.io/apimachinery/pkg/api/errors" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - - commonapiv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/util" - manifestmock "github.com/kubeflow/katib/pkg/mock/v1alpha3/experiment/manifest" - suggestionmock "github.com/kubeflow/katib/pkg/mock/v1alpha3/experiment/suggestion" -) - -const ( - experimentName = "foo" - namespace = "default" - - timeout = time.Second * 40 -) - -var expectedRequest = reconcile.Request{NamespacedName: types.NamespacedName{Name: experimentName, Namespace: namespace}} -var trialKey = types.NamespacedName{Name: "test", Namespace: namespace} - -func init() { - logf.SetLogger(logf.ZapLogger(true)) -} - -func TestCreateExperiment(t *testing.T) { - g := gomega.NewGomegaWithT(t) - instance := newFakeInstance() - - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - mockCtrl2 := gomock.NewController(t) - defer mockCtrl2.Finish() - suggestion := suggestionmock.NewMockSuggestion(mockCtrl) - - mockCtrl3 := gomock.NewController(t) - defer mockCtrl3.Finish() - generator := manifestmock.NewMockGenerator(mockCtrl) - - // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a - // channel when it is finished. - mgr, err := manager.New(cfg, manager.Options{}) - g.Expect(err).NotTo(gomega.HaveOccurred()) - c := mgr.GetClient() - - recFn := SetupTestReconcile(&ReconcileExperiment{ - Client: mgr.GetClient(), - scheme: mgr.GetScheme(), - Suggestion: suggestion, - Generator: generator, - updateStatusHandler: func(instance *experimentsv1alpha3.Experiment) error { - if !instance.IsCreated() { - t.Errorf("Expected got condition created") - } - return nil - }, - }) - g.Expect(addForTestPurpose(mgr, recFn)).NotTo(gomega.HaveOccurred()) - - stopMgr, mgrStopped := StartTestManager(mgr, g) - - defer func() { - close(stopMgr) - mgrStopped.Wait() - }() - - // Create the Trial object and expect the Reconcile and Deployment to be created - err = c.Create(context.TODO(), instance) - // The instance object may not be a valid object because it might be missing some required fields. - // Please modify the instance object by adding required fields and then remove the following if statement. - if apierrors.IsInvalid(err) { - t.Logf("failed to create object, got an invalid object error: %v", err) - return - } - g.Expect(err).NotTo(gomega.HaveOccurred()) - - g.Expect(c.Delete(context.TODO(), instance)).NotTo(gomega.HaveOccurred()) - g.Eventually(func() bool { - return errors.IsNotFound(c.Get(context.TODO(), - expectedRequest.NamespacedName, instance)) - }, timeout).Should(gomega.BeTrue()) -} - -func TestReconcileExperiment(t *testing.T) { - g := gomega.NewGomegaWithT(t) - testName := "tn" - instance := newFakeInstance() - instance.Name = testName - - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - mockCtrl2 := gomock.NewController(t) - defer mockCtrl2.Finish() - suggestion := suggestionmock.NewMockSuggestion(mockCtrl) - suggestion.EXPECT().GetOrCreateSuggestion(gomock.Any(), gomock.Any()).Return( - &suggestionsv1alpha3.Suggestion{ - ObjectMeta: metav1.ObjectMeta{ - Name: instance.Name, - Namespace: instance.Namespace, - }, - Status: suggestionsv1alpha3.SuggestionStatus{ - Suggestions: []suggestionsv1alpha3.TrialAssignment{ - { - Name: trialKey.Name, - ParameterAssignments: []commonapiv1alpha3.ParameterAssignment{ - { - Name: "--lr", - Value: "0.5", - }, - }, - }, - }, - }, - }, nil).AnyTimes() - suggestion.EXPECT().UpdateSuggestion(gomock.Any()).Return(nil).AnyTimes() - mockCtrl3 := gomock.NewController(t) - defer mockCtrl3.Finish() - generator := manifestmock.NewMockGenerator(mockCtrl) - generator.EXPECT().GetRunSpecWithHyperParameters(gomock.Any(), gomock.Any(), - gomock.Any(), gomock.Any(), gomock.Any()).Return(`apiVersion: "kubeflow.org/v1" -kind: "TFJob" -metadata: - name: "test" - namespace: "default" -spec: - tfReplicaSpecs: - PS: - replicas: 2 - restartPolicy: Never - template: - spec: - containers: - - name: tensorflow - image: kubeflow/tf-dist-mnist-test:1.0 - Worker: - replicas: 4 - restartPolicy: Never - template: - spec: - containers: - - name: tensorflow - image: kubeflow/tf-dist-mnist-test:1.0`, nil).AnyTimes() - - mgr, err := manager.New(cfg, manager.Options{}) - g.Expect(err).NotTo(gomega.HaveOccurred()) - c := mgr.GetClient() - - r := &ReconcileExperiment{ - Client: mgr.GetClient(), - scheme: mgr.GetScheme(), - Suggestion: suggestion, - Generator: generator, - collector: util.NewExpsCollector(mgr.GetCache(), prometheus.NewRegistry()), - } - r.updateStatusHandler = func(instance *experimentsv1alpha3.Experiment) error { - if !instance.IsCreated() { - t.Errorf("Expected got condition created") - } - return r.updateStatus(instance) - } - - recFn := SetupTestReconcile(r) - g.Expect(addForTestPurpose(mgr, recFn)).NotTo(gomega.HaveOccurred()) - - stopMgr, mgrStopped := StartTestManager(mgr, g) - - defer func() { - close(stopMgr) - mgrStopped.Wait() - }() - - // Create the Trial object and expect the Reconcile and Deployment to be created - err = c.Create(context.TODO(), instance) - // The instance object may not be a valid object because it might be missing some required fields. - // Please modify the instance object by adding required fields and then remove the following if statement. - if apierrors.IsInvalid(err) { - t.Logf("failed to create object, got an invalid object error: %v", err) - return - } - g.Expect(err).NotTo(gomega.HaveOccurred()) - - trials := &trialsv1alpha3.TrialList{} - g.Eventually(func() int { - label := labels.Set{ - consts.LabelExperimentName: testName, - } - c.List(context.TODO(), &client.ListOptions{ - LabelSelector: label.AsSelector(), - }, trials) - return len(trials.Items) - }, timeout). - Should(gomega.Equal(1)) - - g.Expect(c.Delete(context.TODO(), instance)).NotTo(gomega.HaveOccurred()) - g.Eventually(func() bool { - return errors.IsNotFound(c.Get(context.TODO(), - types.NamespacedName{Namespace: instance.Namespace, Name: instance.Name}, instance)) - }, timeout).Should(gomega.BeTrue()) -} - -func newFakeInstance() *experimentsv1alpha3.Experiment { - var parallelCount int32 = 1 - var goal float64 = 99.9 - return &experimentsv1alpha3.Experiment{ - ObjectMeta: metav1.ObjectMeta{ - Name: experimentName, - Namespace: namespace, - }, - Spec: experimentsv1alpha3.ExperimentSpec{ - ParallelTrialCount: ¶llelCount, - MaxTrialCount: ¶llelCount, - Objective: &commonapiv1alpha3.ObjectiveSpec{ - Type: commonapiv1alpha3.ObjectiveTypeMaximize, - Goal: &goal, - ObjectiveMetricName: "accuracy", - }, - TrialTemplate: &experimentsv1alpha3.TrialTemplate{ - GoTemplate: &experimentsv1alpha3.GoTemplate{ - RawTemplate: `apiVersion: "kubeflow.org/v1" -kind: TFJob -metadata: - name: {{.Trial}} - namespace: {{.NameSpace}} -spec: - tfReplicaSpecs: - Worker: - replicas: 1 - restartPolicy: OnFailure - template: - spec: - containers: - - name: tensorflow - image: gcr.io/kubeflow-ci/tf-mnist-with-summaries:1.0 - imagePullPolicy: Always - command: - - "python" - - "/var/tf_mnist/mnist_with_summaries.py" - - "--log_dir=/train/{{.Trial}}" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}} - volumeMounts: - - mountPath: "/train" - name: "train" - volumes: - - name: "train" - persistentVolumeClaim: - claimName: "tfevent-volume"`, - }, - }, - }, - } -} diff --git a/pkg/controller.v1alpha3/experiment/experiment_status.go b/pkg/controller.v1alpha3/experiment/experiment_status.go deleted file mode 100644 index 484da9e525a..00000000000 --- a/pkg/controller.v1alpha3/experiment/experiment_status.go +++ /dev/null @@ -1,17 +0,0 @@ -package experiment - -import ( - "context" - - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" -) - -type updateStatusFunc func(instance *experimentsv1alpha3.Experiment) error - -func (r *ReconcileExperiment) updateStatus(instance *experimentsv1alpha3.Experiment) error { - err := r.Status().Update(context.TODO(), instance) - if err != nil { - return err - } - return nil -} diff --git a/pkg/controller.v1alpha3/experiment/experiment_util.go b/pkg/controller.v1alpha3/experiment/experiment_util.go deleted file mode 100644 index ff820c3d295..00000000000 --- a/pkg/controller.v1alpha3/experiment/experiment_util.go +++ /dev/null @@ -1,140 +0,0 @@ -package experiment - -import ( - "bytes" - "context" - "fmt" - - "k8s.io/apimachinery/pkg/api/errors" - - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/types" - k8syaml "k8s.io/apimachinery/pkg/util/yaml" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - suggestionController "github.com/kubeflow/katib/pkg/controller.v1alpha3/suggestion" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/util" -) - -const ( - updatePrometheusMetrics = "update-prometheus-metrics" -) - -func (r *ReconcileExperiment) createTrialInstance(expInstance *experimentsv1alpha3.Experiment, trialAssignment *suggestionsv1alpha3.TrialAssignment) error { - BUFSIZE := 1024 - logger := log.WithValues("Experiment", types.NamespacedName{Name: expInstance.GetName(), Namespace: expInstance.GetNamespace()}) - - trial := &trialsv1alpha3.Trial{} - trial.Name = trialAssignment.Name - trial.Namespace = expInstance.GetNamespace() - trial.Labels = util.TrialLabels(expInstance) - - if err := controllerutil.SetControllerReference(expInstance, trial, r.scheme); err != nil { - logger.Error(err, "Set controller reference error") - return err - } - - trial.Spec.Objective = expInstance.Spec.Objective - - hps := trialAssignment.ParameterAssignments - trial.Spec.ParameterAssignments = trialAssignment.ParameterAssignments - runSpec, err := r.GetRunSpecWithHyperParameters(expInstance, expInstance.GetName(), trial.Name, trial.Namespace, hps) - if err != nil { - logger.Error(err, "Fail to get RunSpec from experiment", expInstance.Name) - return err - } - - trial.Spec.RunSpec = runSpec - if expInstance.Spec.TrialTemplate != nil { - trial.Spec.RetainRun = expInstance.Spec.TrialTemplate.Retain - } - - buf := bytes.NewBufferString(runSpec) - job := &unstructured.Unstructured{} - if err := k8syaml.NewYAMLOrJSONDecoder(buf, BUFSIZE).Decode(job); err != nil { - return fmt.Errorf("Invalid spec.trialTemplate: %v.", err) - } - - if expInstance.Spec.MetricsCollectorSpec != nil { - trial.Spec.MetricsCollector = *expInstance.Spec.MetricsCollectorSpec - } - - if err := r.Create(context.TODO(), trial); err != nil { - logger.Error(err, "Trial create error", "Trial name", trial.Name) - return err - } - return nil - -} - -func needUpdateFinalizers(exp *experimentsv1alpha3.Experiment) (bool, []string) { - deleted := !exp.ObjectMeta.DeletionTimestamp.IsZero() - pendingFinalizers := exp.GetFinalizers() - contained := false - for _, elem := range pendingFinalizers { - if elem == updatePrometheusMetrics { - contained = true - break - } - } - - if !deleted && !contained { - finalizers := append(pendingFinalizers, updatePrometheusMetrics) - return true, finalizers - } - if deleted && contained { - finalizers := []string{} - for _, pendingFinalizer := range pendingFinalizers { - if pendingFinalizer != updatePrometheusMetrics { - finalizers = append(finalizers, pendingFinalizer) - } - } - return true, finalizers - } - return false, []string{} -} - -func (r *ReconcileExperiment) updateFinalizers(instance *experimentsv1alpha3.Experiment, finalizers []string) (reconcile.Result, error) { - instance.SetFinalizers(finalizers) - if err := r.Update(context.TODO(), instance); err != nil { - return reconcile.Result{}, err - } else { - if !instance.ObjectMeta.DeletionTimestamp.IsZero() { - r.collector.IncreaseExperimentsDeletedCount(instance.Namespace) - } else { - r.collector.IncreaseExperimentsCreatedCount(instance.Namespace) - } - // Need to requeue because finalizer update does not change metadata.generation - return reconcile.Result{Requeue: true}, err - } -} - -func (r *ReconcileExperiment) terminateSuggestion(instance *experimentsv1alpha3.Experiment) error { - original := &suggestionsv1alpha3.Suggestion{} - err := r.Get(context.TODO(), - types.NamespacedName{Namespace: instance.GetNamespace(), Name: instance.GetName()}, original) - if err != nil { - if errors.IsNotFound(err) { - return nil - } - return err - } - // If Suggestion is failed or Suggestion is Succeeded, not needed to terminate Suggestion - if original.IsFailed() || original.IsSucceeded() { - return nil - } - log.Info("Start terminating suggestion") - suggestion := original.DeepCopy() - msg := "Suggestion is succeeded" - suggestion.MarkSuggestionStatusSucceeded(suggestionController.SuggestionSucceededReason, msg) - log.Info("Mark suggestion succeeded") - - if err := r.UpdateSuggestionStatus(suggestion); err != nil { - return err - } - return nil -} diff --git a/pkg/controller.v1alpha3/experiment/manifest/generator.go b/pkg/controller.v1alpha3/experiment/manifest/generator.go deleted file mode 100644 index e8095527ea7..00000000000 --- a/pkg/controller.v1alpha3/experiment/manifest/generator.go +++ /dev/null @@ -1,133 +0,0 @@ -package manifest - -import ( - "bytes" - "errors" - "text/template" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/controller-runtime/pkg/client" - - commonapiv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - "github.com/kubeflow/katib/pkg/util/v1alpha3/katibclient" - "github.com/kubeflow/katib/pkg/util/v1alpha3/katibconfig" -) - -const ( - defaultMetricsCollectorTemplateName = "defaultMetricsCollectorTemplate.yaml" -) - -// Generator is the type for manifests Generator. -type Generator interface { - InjectClient(c client.Client) - GetRunSpec(e *experimentsv1alpha3.Experiment, experiment, trial, namespace string) (string, error) - GetRunSpecWithHyperParameters(e *experimentsv1alpha3.Experiment, experiment, trial, namespace string, hps []commonapiv1alpha3.ParameterAssignment) (string, error) - GetSuggestionConfigData(algorithmName string) (map[string]string, error) - GetMetricsCollectorImage(cKind commonapiv1alpha3.CollectorKind) (string, error) -} - -// DefaultGenerator is the default implementation of Generator. -type DefaultGenerator struct { - client katibclient.Client -} - -// New creates a new Generator. -func New(c client.Client) Generator { - katibClient := katibclient.NewWithGivenClient(c) - return &DefaultGenerator{ - client: katibClient, - } -} - -func (g *DefaultGenerator) InjectClient(c client.Client) { - g.client.InjectClient(c) -} - -func (g *DefaultGenerator) GetMetricsCollectorImage(cKind commonapiv1alpha3.CollectorKind) (string, error) { - configData, err := katibconfig.GetMetricsCollectorConfigData(cKind, g.client.GetClient()) - if err != nil { - return "", nil - } - return configData[consts.LabelMetricsCollectorSidecarImage], nil -} - -func (g *DefaultGenerator) GetSuggestionConfigData(algorithmName string) (map[string]string, error) { - return katibconfig.GetSuggestionConfigData(algorithmName, g.client.GetClient()) -} - -// GetRunSpec get the specification for trial. -func (g *DefaultGenerator) GetRunSpec(e *experimentsv1alpha3.Experiment, experiment, trial, namespace string) (string, error) { - params := trialTemplateParams{ - Experiment: experiment, - Trial: trial, - NameSpace: namespace, - } - return g.getRunSpec(e, params) -} - -// GetRunSpecWithHyperParameters get the specification for trial with hyperparameters. -func (g *DefaultGenerator) GetRunSpecWithHyperParameters(e *experimentsv1alpha3.Experiment, experiment, trial, namespace string, hps []commonapiv1alpha3.ParameterAssignment) (string, error) { - params := trialTemplateParams{ - Experiment: experiment, - Trial: trial, - NameSpace: namespace, - HyperParameters: hps, - } - return g.getRunSpec(e, params) -} - -func (g *DefaultGenerator) getRunSpec(e *experimentsv1alpha3.Experiment, params trialTemplateParams) (string, error) { - var buf bytes.Buffer - trialTemplate, err := g.getTrialTemplate(e) - if err != nil { - return "", err - } - if err := trialTemplate.Execute(&buf, params); err != nil { - return "", err - } - return buf.String(), nil -} - -func (g *DefaultGenerator) getTrialTemplate(instance *experimentsv1alpha3.Experiment) (*template.Template, error) { - var err error - var tpl *template.Template = nil - - trialTemplate := instance.Spec.TrialTemplate - if trialTemplate.GoTemplate.RawTemplate != "" { - tpl, err = template.New("Trial").Parse(trialTemplate.GoTemplate.RawTemplate) - if err != nil { - return nil, err - } - } else { - templateSpec := trialTemplate.GoTemplate.TemplateSpec - configMapNS := templateSpec.ConfigMapNamespace - configMapName := templateSpec.ConfigMapName - templatePath := templateSpec.TemplatePath - - configMap, err := g.client.GetConfigMap(configMapName, configMapNS) - if err != nil { - return nil, err - } - - if configMapTemplate, ok := configMap[templatePath]; !ok { - err = errors.New(string(metav1.StatusReasonNotFound)) - return nil, err - } else { - tpl, err = template.New("Trial").Parse(configMapTemplate) - if err != nil { - return nil, err - } - } - } - - return tpl, nil -} - -type trialTemplateParams struct { - Experiment string - Trial string - NameSpace string - HyperParameters []commonapiv1alpha3.ParameterAssignment -} diff --git a/pkg/controller.v1alpha3/experiment/manifest/generator_test.go b/pkg/controller.v1alpha3/experiment/manifest/generator_test.go deleted file mode 100644 index 8529e1929e0..00000000000 --- a/pkg/controller.v1alpha3/experiment/manifest/generator_test.go +++ /dev/null @@ -1,188 +0,0 @@ -package manifest - -import ( - "reflect" - "testing" - "text/template" - - "github.com/golang/mock/gomock" - - commonapiv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - katibclientmock "github.com/kubeflow/katib/pkg/mock/v1alpha3/util/katibclient" -) - -const ( - rawTemplate = `apiVersion: batch/v1 -kind: Job -metadata: -name: {{.Trial}} -namespace: {{.NameSpace}} -spec: - template: - spec: - containers: - - name: {{.Trial}} - image: katib/mxnet-mnist-example - command: - - "python" - - "/mxnet/example/image-classification/train_mnist.py" - - "--batch-size=64" - {{- with .HyperParameters}} - {{- range .}} - - "{{.Name}}={{.Value}}" - {{- end}} - {{- end}}` -) - -func TestGetTrialTemplateConfigMap(t *testing.T) { - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - c := katibclientmock.NewMockClient(mockCtrl) - - p := &DefaultGenerator{ - client: c, - } - - templatePath := "test.yaml" - - c.EXPECT().GetConfigMap(gomock.Any(), gomock.Any()).Return(map[string]string{ - templatePath: rawTemplate, - }, nil) - - instance := newFakeInstance() - instance.Spec.TrialTemplate.GoTemplate.TemplateSpec = &experimentsv1alpha3.TemplateSpec{ - TemplatePath: templatePath, - } - instance.Spec.TrialTemplate.GoTemplate.RawTemplate = "" - actual, err := p.getTrialTemplate(instance) - if err != nil { - t.Errorf("Expected nil, got %v", err) - } - expected, err := template.New("Trial").Parse(rawTemplate) - if err != nil { - t.Errorf("Expected nil, got %v", err) - } - if !reflect.DeepEqual(expected, actual) { - t.Errorf("Expected %v, got %v", *expected, *actual) - } -} - -func TestGetTrialTemplate(t *testing.T) { - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - c := katibclientmock.NewMockClient(mockCtrl) - - p := &DefaultGenerator{ - client: c, - } - - tc := newFakeInstance() - - expected, err := template.New("Trial"). - Parse(tc.Spec.TrialTemplate.GoTemplate.RawTemplate) - if err != nil { - t.Errorf("Failed to compose expected result") - } - - actual, err := p.getTrialTemplate(tc) - if err != nil { - t.Errorf("Expected nil, got %v", err) - } - - if !reflect.DeepEqual(expected, actual) { - t.Errorf("Expected %v, got %v", *expected, *actual) - } -} - -func TestGetRunSpec(t *testing.T) { - tc := newFakeInstance() - - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - c := katibclientmock.NewMockClient(mockCtrl) - - p := &DefaultGenerator{ - client: c, - } - - actual, err := p.GetRunSpec(tc, "", "test", "testns") - if err != nil { - t.Errorf("Expected nil, got %v", err) - } - expected := `apiVersion: batch/v1 -kind: Job -metadata: -name: test -namespace: testns -spec: - template: - spec: - containers: - - name: test - image: katib/mxnet-mnist-example - command: - - "python" - - "/mxnet/example/image-classification/train_mnist.py" - - "--batch-size=64"` - if expected != actual { - t.Errorf("Expected %s, got %s", expected, actual) - } -} - -func TestGetRunSpecWithHP(t *testing.T) { - tc := newFakeInstance() - - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - c := katibclientmock.NewMockClient(mockCtrl) - - p := &DefaultGenerator{ - client: c, - } - - actual, err := p.GetRunSpecWithHyperParameters(tc, "", "test", "testns", []commonapiv1alpha3.ParameterAssignment{ - { - Name: "testname", - Value: "testvalue", - }, - }) - if err != nil { - t.Errorf("Expected nil, got %v", err) - } - expected := `apiVersion: batch/v1 -kind: Job -metadata: -name: test -namespace: testns -spec: - template: - spec: - containers: - - name: test - image: katib/mxnet-mnist-example - command: - - "python" - - "/mxnet/example/image-classification/train_mnist.py" - - "--batch-size=64" - - "testname=testvalue"` - if expected != actual { - t.Errorf("Expected %s, got %s", expected, actual) - } -} - -func newFakeInstance() *experimentsv1alpha3.Experiment { - return &experimentsv1alpha3.Experiment{ - Spec: experimentsv1alpha3.ExperimentSpec{ - TrialTemplate: &experimentsv1alpha3.TrialTemplate{ - GoTemplate: &experimentsv1alpha3.GoTemplate{ - RawTemplate: rawTemplate, - }, - }, - }, - } -} diff --git a/pkg/controller.v1alpha3/experiment/suggestion/fake/fake.go b/pkg/controller.v1alpha3/experiment/suggestion/fake/fake.go deleted file mode 100644 index fadcc317ee6..00000000000 --- a/pkg/controller.v1alpha3/experiment/suggestion/fake/fake.go +++ /dev/null @@ -1,26 +0,0 @@ -package fake - -import ( - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/suggestion" -) - -type Fake struct { -} - -func New() suggestion.Suggestion { - return &Fake{} -} - -func (f *Fake) GetOrCreateSuggestion(instance *experimentsv1alpha3.Experiment, suggestionRequests int32) (*suggestionsv1alpha3.Suggestion, error) { - return nil, nil -} - -func (f *Fake) UpdateSuggestion(suggestion *suggestionsv1alpha3.Suggestion) error { - return nil -} - -func (f *Fake) UpdateSuggestionStatus(suggestion *suggestionsv1alpha3.Suggestion) error { - return nil -} diff --git a/pkg/controller.v1alpha3/experiment/suggestion/suggestion.go b/pkg/controller.v1alpha3/experiment/suggestion/suggestion.go deleted file mode 100644 index cda42f18322..00000000000 --- a/pkg/controller.v1alpha3/experiment/suggestion/suggestion.go +++ /dev/null @@ -1,96 +0,0 @@ -package suggestion - -import ( - "context" - - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - - //utilrand "k8s.io/apimachinery/pkg/util/rand" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" -) - -var log = logf.Log.WithName("experiment-suggestion-client") - -type Suggestion interface { - GetOrCreateSuggestion(instance *experimentsv1alpha3.Experiment, suggestionRequests int32) (*suggestionsv1alpha3.Suggestion, error) - UpdateSuggestion(suggestion *suggestionsv1alpha3.Suggestion) error - UpdateSuggestionStatus(suggestion *suggestionsv1alpha3.Suggestion) error -} - -type General struct { - scheme *runtime.Scheme - client.Client -} - -func New(scheme *runtime.Scheme, client client.Client) Suggestion { - return &General{scheme: scheme, Client: client} -} - -func (g *General) GetOrCreateSuggestion(instance *experimentsv1alpha3.Experiment, suggestionRequests int32) (*suggestionsv1alpha3.Suggestion, error) { - logger := log.WithValues("experiment", types.NamespacedName{Name: instance.Name, Namespace: instance.Namespace}) - suggestion := &suggestionsv1alpha3.Suggestion{} - err := g.Get(context.TODO(), - types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}, suggestion) - if err != nil && errors.IsNotFound(err) { - logger.Info("Creating Suggestion", "namespace", instance.Namespace, "name", instance.Name, "requests", suggestionRequests) - if err := g.createSuggestion(instance, suggestionRequests); err != nil { - logger.Error(err, "CreateSuggestion failed", "instance", instance.Name) - return nil, err - } - } else if err != nil { - logger.Error(err, "Suggestion get failed", "instance", instance.Name) - return nil, err - } else { - return suggestion, nil - } - return nil, nil -} - -func (g *General) createSuggestion(instance *experimentsv1alpha3.Experiment, suggestionRequests int32) error { - logger := log.WithValues("experiment", types.NamespacedName{Name: instance.Name, Namespace: instance.Namespace}) - suggestion := &suggestionsv1alpha3.Suggestion{ - ObjectMeta: metav1.ObjectMeta{ - Name: instance.Name, - Namespace: instance.Namespace, - Labels: instance.Labels, - Annotations: instance.Annotations, - }, - Spec: suggestionsv1alpha3.SuggestionSpec{ - AlgorithmName: instance.Spec.Algorithm.AlgorithmName, - Requests: suggestionRequests, - }, - } - - if err := controllerutil.SetControllerReference(instance, suggestion, g.scheme); err != nil { - logger.Error(err, "Error in setting controller reference") - return err - } - logger.Info("Creating Suggestion", "namespace", instance.Namespace, "name", instance.Name) - if err := g.Create(context.TODO(), suggestion); err != nil { - return err - } - return nil -} - -func (g *General) UpdateSuggestion(suggestion *suggestionsv1alpha3.Suggestion) error { - if err := g.Update(context.TODO(), suggestion); err != nil { - return err - } - return nil -} - -func (g *General) UpdateSuggestionStatus(suggestion *suggestionsv1alpha3.Suggestion) error { - if err := g.Status().Update(context.TODO(), suggestion); err != nil { - return err - } - - return nil -} diff --git a/pkg/controller.v1alpha3/experiment/util/prometheus_metrics.go b/pkg/controller.v1alpha3/experiment/util/prometheus_metrics.go deleted file mode 100644 index 3b451ca695f..00000000000 --- a/pkg/controller.v1alpha3/experiment/util/prometheus_metrics.go +++ /dev/null @@ -1,136 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package util - -import ( - "context" - - "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - "github.com/prometheus/client_golang/prometheus" - "sigs.k8s.io/controller-runtime/pkg/cache" -) - -type ExperimentsCollector struct { - store cache.Cache - expDeleteCount *prometheus.CounterVec - expCreateCount *prometheus.CounterVec - expSucceedCount *prometheus.CounterVec - expFailCount *prometheus.CounterVec - expCurrent *prometheus.GaugeVec -} - -func NewExpsCollector(store cache.Cache, registerer prometheus.Registerer) *ExperimentsCollector { - c := &ExperimentsCollector{ - store: store, - expDeleteCount: prometheus.NewCounterVec(prometheus.CounterOpts{ - Name: "katib_experiment_deleted_total", - Help: "The total number of deleted experiments", - }, []string{"namespace"}), - - expCreateCount: prometheus.NewCounterVec(prometheus.CounterOpts{ - Name: "katib_experiment_created_total", - Help: "The total number of created experiments", - }, []string{"namespace"}), - - expSucceedCount: prometheus.NewCounterVec(prometheus.CounterOpts{ - Name: "katib_experiment_succeeded_total", - Help: "The total number of succeeded experiments", - }, []string{"namespace"}), - - expFailCount: prometheus.NewCounterVec(prometheus.CounterOpts{ - Name: "katib_experiment_failed_total", - Help: "The total number of failed experiments", - }, []string{"namespace"}), - - expCurrent: prometheus.NewGaugeVec(prometheus.GaugeOpts{ - Name: "katib_experiments_current", - Help: "The number of current katib experiments in the cluster", - }, []string{"namespace", "status"}), - } - registerer.MustRegister(c) - return c -} - -// Describe implements the prometheus.Collector interface. -func (m *ExperimentsCollector) Describe(ch chan<- *prometheus.Desc) { - m.expDeleteCount.Describe(ch) - m.expSucceedCount.Describe(ch) - m.expFailCount.Describe(ch) - m.expCreateCount.Describe(ch) - m.expCurrent.Describe(ch) -} - -// Collect implements the prometheus.Collector interface. -func (m *ExperimentsCollector) Collect(ch chan<- prometheus.Metric) { - m.collect() - m.expDeleteCount.Collect(ch) - m.expSucceedCount.Collect(ch) - m.expFailCount.Collect(ch) - m.expCreateCount.Collect(ch) - m.expCurrent.Collect(ch) -} - -func (c *ExperimentsCollector) IncreaseExperimentsDeletedCount(ns string) { - c.expDeleteCount.WithLabelValues(ns).Inc() -} - -func (c *ExperimentsCollector) IncreaseExperimentsCreatedCount(ns string) { - c.expCreateCount.WithLabelValues(ns).Inc() -} - -func (c *ExperimentsCollector) IncreaseExperimentsSucceededCount(ns string) { - c.expSucceedCount.WithLabelValues(ns).Inc() -} - -func (c *ExperimentsCollector) IncreaseExperimentsFailedCount(ns string) { - c.expFailCount.WithLabelValues(ns).Inc() -} - -// collect gets the current experiments from cache. -func (c *ExperimentsCollector) collect() { - var ( - conditionType v1alpha3.ExperimentConditionType - status string - err error - ) - expLists := &v1alpha3.ExperimentList{} - if err = c.store.List(context.TODO(), nil, expLists); err != nil { - return - } - - expCache := map[string]map[string]int{} - for _, exp := range expLists.Items { - conditionType, err = exp.GetLastConditionType() - status = string(conditionType) - // If experiment doesn't have any condition, use unknown. - if err != nil { - status = "Unknown" - } - - if _, ok := expCache[exp.Namespace]; !ok { - expCache[exp.Namespace] = make(map[string]int) - } - expCache[exp.Namespace][status] += 1 - } - - c.expCurrent.Reset() - for ns, v := range expCache { - for status, count := range v { - c.expCurrent.WithLabelValues(ns, status).Set(float64(count)) - } - } -} diff --git a/pkg/controller.v1alpha3/experiment/util/status_util.go b/pkg/controller.v1alpha3/experiment/util/status_util.go deleted file mode 100644 index 094399d7732..00000000000 --- a/pkg/controller.v1alpha3/experiment/util/status_util.go +++ /dev/null @@ -1,196 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package util - -import ( - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - - commonv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -var log = logf.Log.WithName("experiment-status-util") - -const ( - ExperimentCreatedReason = "ExperimentCreated" - ExperimentRunningReason = "ExperimentRunning" - ExperimentRestartingReason = "ExperimentRestarting" - ExperimentGoalReachedReason = "ExperimentGoalReached" - ExperimentMaxTrialsReachedReason = "ExperimentMaxTrialsReached" - ExperimentSuggestionEndReachedReason = "ExperimentSuggestionEndReached" - ExperimentFailedReason = "ExperimentFailed" - ExperimentKilledReason = "ExperimentKilled" -) - -func UpdateExperimentStatus(collector *ExperimentsCollector, instance *experimentsv1alpha3.Experiment, trials *trialsv1alpha3.TrialList) error { - - isObjectiveGoalReached := updateTrialsSummary(instance, trials) - - if !instance.IsCompleted() { - UpdateExperimentStatusCondition(collector, instance, isObjectiveGoalReached, false) - } - return nil - -} - -func updateTrialsSummary(instance *experimentsv1alpha3.Experiment, trials *trialsv1alpha3.TrialList) bool { - - var bestTrialValue float64 - sts := &instance.Status - sts.Trials = 0 - sts.RunningTrialList, sts.PendingTrialList, sts.FailedTrialList, sts.SucceededTrialList, sts.KilledTrialList = nil, nil, nil, nil, nil - bestTrialIndex := -1 - isObjectiveGoalReached := false - var objectiveValueGoal float64 - if instance.Spec.Objective.Goal != nil { - objectiveValueGoal = *instance.Spec.Objective.Goal - } - objectiveType := instance.Spec.Objective.Type - objectiveMetricName := instance.Spec.Objective.ObjectiveMetricName - - for index, trial := range trials.Items { - sts.Trials++ - if trial.IsKilled() { - sts.KilledTrialList = append(sts.KilledTrialList, trial.Name) - } else if trial.IsFailed() { - sts.FailedTrialList = append(sts.FailedTrialList, trial.Name) - } else if trial.IsSucceeded() { - sts.SucceededTrialList = append(sts.SucceededTrialList, trial.Name) - } else if trial.IsRunning() { - sts.RunningTrialList = append(sts.RunningTrialList, trial.Name) - } else { - sts.PendingTrialList = append(sts.PendingTrialList, trial.Name) - } - - objectiveMetricValue := getObjectiveMetricValue(trial, objectiveMetricName) - if objectiveMetricValue == nil { - continue - } - - //intialize vars to objective metric value of the first trial - if bestTrialIndex == -1 { - bestTrialValue = *objectiveMetricValue - bestTrialIndex = index - } - - if objectiveType == commonv1alpha3.ObjectiveTypeMinimize { - if *objectiveMetricValue < bestTrialValue { - bestTrialValue = *objectiveMetricValue - bestTrialIndex = index - } - if instance.Spec.Objective.Goal != nil && bestTrialValue <= objectiveValueGoal { - isObjectiveGoalReached = true - } - } else if objectiveType == commonv1alpha3.ObjectiveTypeMaximize { - if *objectiveMetricValue > bestTrialValue { - bestTrialValue = *objectiveMetricValue - bestTrialIndex = index - } - if instance.Spec.Objective.Goal != nil && bestTrialValue >= objectiveValueGoal { - isObjectiveGoalReached = true - } - } - } - - sts.TrialsRunning = int32(len(sts.RunningTrialList)) - sts.TrialsPending = int32(len(sts.PendingTrialList)) - sts.TrialsSucceeded = int32(len(sts.SucceededTrialList)) - sts.TrialsFailed = int32(len(sts.FailedTrialList)) - sts.TrialsKilled = int32(len(sts.KilledTrialList)) - - // if best trial is set - if bestTrialIndex != -1 { - bestTrial := trials.Items[bestTrialIndex] - - sts.CurrentOptimalTrial.BestTrialName = bestTrial.Name - sts.CurrentOptimalTrial.ParameterAssignments = []commonv1alpha3.ParameterAssignment{} - for _, parameterAssigment := range bestTrial.Spec.ParameterAssignments { - sts.CurrentOptimalTrial.ParameterAssignments = append(sts.CurrentOptimalTrial.ParameterAssignments, parameterAssigment) - } - - sts.CurrentOptimalTrial.Observation.Metrics = []commonv1alpha3.Metric{} - for _, metric := range bestTrial.Status.Observation.Metrics { - sts.CurrentOptimalTrial.Observation.Metrics = append(sts.CurrentOptimalTrial.Observation.Metrics, metric) - } - } - return isObjectiveGoalReached -} - -func getObjectiveMetricValue(trial trialsv1alpha3.Trial, objectiveMetricName string) *float64 { - if trial.Status.Observation == nil { - return nil - } - for _, metric := range trial.Status.Observation.Metrics { - if objectiveMetricName == metric.Name { - return &metric.Value - } - } - return nil -} - -// UpdateExperimentStatusCondition updates the experiment status. -func UpdateExperimentStatusCondition(collector *ExperimentsCollector, instance *experimentsv1alpha3.Experiment, isObjectiveGoalReached bool, getSuggestionDone bool) { - completedTrialsCount := instance.Status.TrialsSucceeded + instance.Status.TrialsFailed + instance.Status.TrialsKilled - failedTrialsCount := instance.Status.TrialsFailed - activeTrialsCount := instance.Status.TrialsPending + instance.Status.TrialsRunning - now := metav1.Now() - - if isObjectiveGoalReached { - msg := "Experiment has succeeded because Objective goal has reached" - instance.MarkExperimentStatusSucceeded(ExperimentGoalReachedReason, msg) - instance.Status.CompletionTime = &now - collector.IncreaseExperimentsSucceededCount(instance.Namespace) - return - } - - // First check if MaxFailedTrialCount is reached. - if (instance.Spec.MaxFailedTrialCount != nil) && (failedTrialsCount > *instance.Spec.MaxFailedTrialCount) { - msg := "Experiment has failed because max failed count has reached" - instance.MarkExperimentStatusFailed(ExperimentFailedReason, msg) - instance.Status.CompletionTime = &now - collector.IncreaseExperimentsFailedCount(instance.Namespace) - return - } - - // Then Check if MaxTrialCount is reached. - if (instance.Spec.MaxTrialCount != nil) && (completedTrialsCount >= *instance.Spec.MaxTrialCount) { - msg := "Experiment has succeeded because max trial count has reached" - instance.MarkExperimentStatusSucceeded(ExperimentMaxTrialsReachedReason, msg) - instance.Status.CompletionTime = &now - collector.IncreaseExperimentsSucceededCount(instance.Namespace) - return - } - - if getSuggestionDone && activeTrialsCount == 0 { - msg := "Experiment has succeeded because suggestion service has reached the end" - instance.MarkExperimentStatusSucceeded(ExperimentSuggestionEndReachedReason, msg) - instance.Status.CompletionTime = &now - collector.IncreaseExperimentsSucceededCount(instance.Namespace) - return - } - - msg := "Experiment is running" - instance.MarkExperimentStatusRunning(ExperimentRunningReason, msg) -} - -func IsCompletedExperimentRestartable(instance *experimentsv1alpha3.Experiment) bool { - if instance.IsSucceeded() && instance.IsCompletedReason(ExperimentMaxTrialsReachedReason) && instance.Spec.ResumePolicy == experimentsv1alpha3.LongRunning { - return true - } - return false -} diff --git a/pkg/controller.v1alpha3/suggestion/composer/composer.go b/pkg/controller.v1alpha3/suggestion/composer/composer.go deleted file mode 100644 index 58d580a6c5f..00000000000 --- a/pkg/controller.v1alpha3/suggestion/composer/composer.go +++ /dev/null @@ -1,230 +0,0 @@ -package composer - -import ( - "fmt" - - "github.com/spf13/viper" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/manager" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/util" - "github.com/kubeflow/katib/pkg/util/v1alpha3/katibconfig" -) - -const ( - defaultInitialDelaySeconds = 10 - defaultPeriodForReady = 10 - defaultPeriodForLive = 120 - defaultFailureThreshold = 12 - // Ref https://github.com/grpc-ecosystem/grpc-health-probe/ - defaultGRPCHealthCheckProbe = "/bin/grpc_health_probe" -) - -var ( - log = logf.Log.WithName("suggestion-composer") - ComposerRegistry = make(map[string]Composer) -) - -type Composer interface { - DesiredDeployment(s *suggestionsv1alpha3.Suggestion) (*appsv1.Deployment, error) - DesiredService(s *suggestionsv1alpha3.Suggestion) (*corev1.Service, error) - CreateComposer(mgr manager.Manager) Composer -} - -type General struct { - scheme *runtime.Scheme - client.Client -} - -func New(mgr manager.Manager) Composer { - // We assume DefaultComposer always exists in ComposerRegistry. - ptr, _ := ComposerRegistry[consts.DefaultComposer] - return ptr.CreateComposer(mgr) -} - -func (g *General) DesiredDeployment(s *suggestionsv1alpha3.Suggestion) (*appsv1.Deployment, error) { - - suggestionConfigData, err := katibconfig.GetSuggestionConfigData(s.Spec.AlgorithmName, g.Client) - if err != nil { - return nil, err - } - - container, err := g.desiredContainer(s, suggestionConfigData) - if err != nil { - log.Error(err, "Error in constructing container") - return nil, err - } - d := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GetAlgorithmDeploymentName(s), - Namespace: s.Namespace, - Labels: s.Labels, - Annotations: s.Annotations, - }, - Spec: appsv1.DeploymentSpec{ - Selector: &metav1.LabelSelector{ - MatchLabels: util.SuggestionLabels(s), - }, - Template: corev1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: util.SuggestionLabels(s), - Annotations: util.SuggestionAnnotations(s), - }, - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - *container, - }, - }, - }, - }, - } - - // Get Suggestion Service Account Name from config - if suggestionConfigData[consts.LabelSuggestionServiceAccountName] != "" { - d.Spec.Template.Spec.ServiceAccountName = suggestionConfigData[consts.LabelSuggestionServiceAccountName] - } - - if err := controllerutil.SetControllerReference(s, d, g.scheme); err != nil { - return nil, err - } - return d, nil -} - -func (g *General) DesiredService(s *suggestionsv1alpha3.Suggestion) (*corev1.Service, error) { - ports := []corev1.ServicePort{ - { - Name: consts.DefaultSuggestionPortName, - Port: consts.DefaultSuggestionPort, - }, - } - - service := &corev1.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GetAlgorithmServiceName(s), - Namespace: s.Namespace, - }, - Spec: corev1.ServiceSpec{ - Selector: util.SuggestionLabels(s), - Ports: ports, - Type: corev1.ServiceTypeClusterIP, - }, - } - - // Add owner reference to the service so that it could be GC after the suggestion is deleted - if err := controllerutil.SetControllerReference(s, service, g.scheme); err != nil { - return nil, err - } - - return service, nil -} - -func (g *General) desiredContainer(s *suggestionsv1alpha3.Suggestion, suggestionConfigData map[string]string) (*corev1.Container, error) { - - // Get Suggestion data from config - suggestionContainerImage := suggestionConfigData[consts.LabelSuggestionImageTag] - suggestionImagePullPolicy := suggestionConfigData[consts.LabelSuggestionImagePullPolicy] - suggestionCPULimit := suggestionConfigData[consts.LabelSuggestionCPULimitTag] - suggestionCPURequest := suggestionConfigData[consts.LabelSuggestionCPURequestTag] - suggestionMemLimit := suggestionConfigData[consts.LabelSuggestionMemLimitTag] - suggestionMemRequest := suggestionConfigData[consts.LabelSuggestionMemRequestTag] - suggestionDiskLimit := suggestionConfigData[consts.LabelSuggestionDiskLimitTag] - suggestionDiskRequest := suggestionConfigData[consts.LabelSuggestionDiskRequestTag] - c := &corev1.Container{ - Name: consts.ContainerSuggestion, - } - c.Image = suggestionContainerImage - c.ImagePullPolicy = corev1.PullPolicy(suggestionImagePullPolicy) - c.Ports = []corev1.ContainerPort{ - { - Name: consts.DefaultSuggestionPortName, - ContainerPort: consts.DefaultSuggestionPort, - }, - } - - cpuLimitQuantity, err := resource.ParseQuantity(suggestionCPULimit) - if err != nil { - return nil, err - } - cpuRequestQuantity, err := resource.ParseQuantity(suggestionCPURequest) - if err != nil { - return nil, err - } - memLimitQuantity, err := resource.ParseQuantity(suggestionMemLimit) - if err != nil { - return nil, err - } - memRequestQuantity, err := resource.ParseQuantity(suggestionMemRequest) - if err != nil { - return nil, err - } - diskLimitQuantity, err := resource.ParseQuantity(suggestionDiskLimit) - if err != nil { - return nil, err - } - diskRequestQuantity, err := resource.ParseQuantity(suggestionDiskRequest) - if err != nil { - return nil, err - } - - c.Resources = corev1.ResourceRequirements{ - Limits: corev1.ResourceList{ - corev1.ResourceCPU: cpuLimitQuantity, - corev1.ResourceMemory: memLimitQuantity, - corev1.ResourceEphemeralStorage: diskLimitQuantity, - }, - Requests: corev1.ResourceList{ - corev1.ResourceCPU: cpuRequestQuantity, - corev1.ResourceMemory: memRequestQuantity, - corev1.ResourceEphemeralStorage: diskRequestQuantity, - }, - } - - if viper.GetBool(consts.ConfigEnableGRPCProbeInSuggestion) { - c.ReadinessProbe = &corev1.Probe{ - Handler: corev1.Handler{ - Exec: &corev1.ExecAction{ - Command: []string{ - defaultGRPCHealthCheckProbe, - fmt.Sprintf("-addr=:%d", consts.DefaultSuggestionPort), - fmt.Sprintf("-service=%s", consts.DefaultGRPCService), - }, - }, - }, - InitialDelaySeconds: defaultInitialDelaySeconds, - PeriodSeconds: defaultPeriodForReady, - } - c.LivenessProbe = &corev1.Probe{ - Handler: corev1.Handler{ - Exec: &corev1.ExecAction{ - Command: []string{ - defaultGRPCHealthCheckProbe, - fmt.Sprintf("-addr=:%d", consts.DefaultSuggestionPort), - fmt.Sprintf("-service=%s", consts.DefaultGRPCService), - }, - }, - }, - // Ref https://srcco.de/posts/kubernetes-liveness-probes-are-dangerous.html - InitialDelaySeconds: defaultInitialDelaySeconds, - PeriodSeconds: defaultPeriodForLive, - FailureThreshold: defaultFailureThreshold, - } - } - return c, nil -} - -func (g *General) CreateComposer(mgr manager.Manager) Composer { - return &General{mgr.GetScheme(), mgr.GetClient()} -} - -func init() { - ComposerRegistry[consts.DefaultComposer] = &General{} -} diff --git a/pkg/controller.v1alpha3/suggestion/suggestion_controller.go b/pkg/controller.v1alpha3/suggestion/suggestion_controller.go deleted file mode 100644 index 9eaa9e27f70..00000000000 --- a/pkg/controller.v1alpha3/suggestion/suggestion_controller.go +++ /dev/null @@ -1,250 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package suggestion - -import ( - "context" - "fmt" - - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/tools/record" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - "sigs.k8s.io/controller-runtime/pkg/source" - - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/suggestion/composer" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/suggestion/suggestionclient" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/util" -) - -const ( - ControllerName = "suggestion-controller" -) - -var log = logf.Log.WithName(ControllerName) - -// Add creates a new Suggestion Controller and adds it to the Manager with default RBAC. The Manager will set fields on the Controller -// and Start it when the Manager is Started. -func Add(mgr manager.Manager) error { - return add(mgr, newReconciler(mgr)) -} - -// newReconciler returns a new reconcile.Reconciler -func newReconciler(mgr manager.Manager) reconcile.Reconciler { - return &ReconcileSuggestion{ - Client: mgr.GetClient(), - SuggestionClient: suggestionclient.New(), - scheme: mgr.GetScheme(), - Composer: composer.New(mgr), - recorder: mgr.GetRecorder(ControllerName), - } -} - -// add adds a new Controller to mgr with r as the reconcile.Reconciler -func add(mgr manager.Manager, r reconcile.Reconciler) error { - // Create a new controller - c, err := controller.New("suggestion-controller", mgr, controller.Options{Reconciler: r}) - if err != nil { - return err - } - - err = c.Watch(&source.Kind{Type: &suggestionsv1alpha3.Suggestion{}}, &handler.EnqueueRequestForObject{}) - if err != nil { - return err - } - - err = c.Watch(&source.Kind{Type: &appsv1.Deployment{}}, &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &suggestionsv1alpha3.Suggestion{}, - }) - if err != nil { - return err - } - - err = c.Watch(&source.Kind{Type: &corev1.Service{}}, &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &suggestionsv1alpha3.Suggestion{}, - }) - if err != nil { - return err - } - log.Info("Suggestion controller created") - return nil -} - -var _ reconcile.Reconciler = &ReconcileSuggestion{} - -// ReconcileSuggestion reconciles a Suggestion object -type ReconcileSuggestion struct { - client.Client - composer.Composer - suggestionclient.SuggestionClient - - scheme *runtime.Scheme - recorder record.EventRecorder -} - -// Reconcile reads that state of the cluster for a Suggestion object and makes changes based on the state read -// and what is in the Suggestion.Spec -// TODO(user): Modify this Reconcile function to implement your Controller logic. The scaffolding writes -// a Deployment as an example -// Automatically generate RBAC rules to allow the Controller to read and write Deployments -// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete -// +kubebuilder:rbac:groups=apps,resources=deployments/status,verbs=get;update;patch -// +kubebuilder:rbac:groups=katib.kubeflow.org,resources=suggestions,verbs=get;list;watch;create;update;patch;delete -// +kubebuilder:rbac:groups=katib.kubeflow.org,resources=suggestions/status,verbs=get;update;patch -func (r *ReconcileSuggestion) Reconcile(request reconcile.Request) (reconcile.Result, error) { - logger := log.WithValues("Suggestion", request.NamespacedName) - // Fetch the Suggestion instance - oldS := &suggestionsv1alpha3.Suggestion{} - err := r.Get(context.TODO(), request.NamespacedName, oldS) - if err != nil { - if errors.IsNotFound(err) { - // For additional cleanup logic use finalizers. - return reconcile.Result{}, nil - } - // Error reading the object - requeue the request. - return reconcile.Result{}, err - } - instance := oldS.DeepCopy() - // If ResumePolicyType is LongRunning, suggestion status will never be succeeded. - if instance.IsSucceeded() { - err = r.deleteDeployment(instance) - if err != nil { - return reconcile.Result{}, err - } - err = r.deleteService(instance) - if err != nil { - return reconcile.Result{}, err - } - return reconcile.Result{}, nil - } - if !instance.IsCreated() { - if instance.Status.StartTime == nil { - now := metav1.Now() - instance.Status.StartTime = &now - } - msg := "Suggestion is created" - instance.MarkSuggestionStatusCreated(SuggestionCreatedReason, msg) - } else { - err := r.ReconcileSuggestion(instance) - if err != nil { - r.recorder.Eventf(instance, corev1.EventTypeWarning, - consts.ReconcileErrorReason, err.Error()) - - // Try updating just the status condition when possible - // Status conditions might need to be updated even in error - // Ignore all other status fields else it will be inconsistent during retry - _ = r.updateStatusCondition(instance, oldS) - logger.Error(err, "Reconcile Suggestion error") - return reconcile.Result{}, err - } - } - - if err := r.updateStatus(instance, oldS); err != nil { - return reconcile.Result{}, err - } - return reconcile.Result{}, nil -} - -func (r *ReconcileSuggestion) ReconcileSuggestion(instance *suggestionsv1alpha3.Suggestion) error { - logger := log.WithValues("Suggestion", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) - service, err := r.DesiredService(instance) - if err != nil { - return err - } - _, err = r.reconcileService(service) - if err != nil { - return err - } - - deploy, err := r.DesiredDeployment(instance) - if err != nil { - return err - } - if foundDeploy, err := r.reconcileDeployment(deploy); err != nil { - return err - } else { - if isReady := r.checkDeploymentReady(foundDeploy); isReady != true { - // deployment is not ready yet - msg := "Deployment is not ready" - instance.MarkSuggestionStatusDeploymentReady(corev1.ConditionFalse, SuggestionDeploymentNotReady, msg) - return nil - } else { - msg := "Deployment is ready" - instance.MarkSuggestionStatusDeploymentReady(corev1.ConditionTrue, SuggestionDeploymentReady, msg) - } - - } - experiment := &experimentsv1alpha3.Experiment{} - trials := &trialsv1alpha3.TrialList{} - - if err := r.Get(context.TODO(), types.NamespacedName{ - Name: instance.Name, - Namespace: instance.Namespace, - }, experiment); err != nil { - return err - } - - if err := r.List(context.TODO(), - client.MatchingLabels(util.TrialLabels(experiment)), trials); err != nil { - return err - } - if !instance.IsRunning() { - if err = r.ValidateAlgorithmSettings(instance, experiment); err != nil { - logger.Error(err, "Marking suggestion failed as algorithm settings validation failed") - msg := fmt.Sprintf("Validation failed: %v", err) - instance.MarkSuggestionStatusFailed(SuggestionFailedReason, msg) - // return nil since it is a terminal condition - return nil - } - msg := "Suggestion is running" - instance.MarkSuggestionStatusRunning(SuggestionRunningReason, msg) - } - logger.Info("Sync assignments", "suggestions", instance.Spec.Requests) - if err = r.SyncAssignments(instance, experiment, trials.Items); err != nil { - return err - } - - return nil -} - -func (r *ReconcileSuggestion) checkDeploymentReady(deploy *appsv1.Deployment) bool { - if deploy == nil { - return false - } else { - for _, cond := range deploy.Status.Conditions { - if cond.Type == appsv1.DeploymentAvailable && cond.Status == corev1.ConditionTrue { - return true - } - } - } - return false -} diff --git a/pkg/controller.v1alpha3/suggestion/suggestion_controller_status.go b/pkg/controller.v1alpha3/suggestion/suggestion_controller_status.go deleted file mode 100644 index 0259070f9f1..00000000000 --- a/pkg/controller.v1alpha3/suggestion/suggestion_controller_status.go +++ /dev/null @@ -1,39 +0,0 @@ -package suggestion - -import ( - "context" - - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - "k8s.io/apimachinery/pkg/api/equality" -) - -const ( - SuggestionCreatedReason = "SuggestionCreated" - SuggestionDeploymentReady = "DeploymentReady" - SuggestionDeploymentNotReady = "DeploymentNotReady" - SuggestionRunningReason = "SuggestionRunning" - SuggestionSucceededReason = "SuggestionSucceeded" - SuggestionFailedReason = "SuggestionFailed" - SuggestionKilledReason = "SuggestionKilled" -) - -func (r *ReconcileSuggestion) updateStatus(s *suggestionsv1alpha3.Suggestion, oldS *suggestionsv1alpha3.Suggestion) error { - if !equality.Semantic.DeepEqual(s.Status, oldS.Status) { - if err := r.Status().Update(context.TODO(), s); err != nil { - return err - } - } - return nil -} - -func (r *ReconcileSuggestion) updateStatusCondition(s *suggestionsv1alpha3.Suggestion, oldS *suggestionsv1alpha3.Suggestion) error { - if !equality.Semantic.DeepEqual(s.Status.Conditions, oldS.Status.Conditions) { - newConditions := s.Status.Conditions - s.Status = oldS.Status - s.Status.Conditions = newConditions - if err := r.Status().Update(context.TODO(), s); err != nil { - return err - } - } - return nil -} diff --git a/pkg/controller.v1alpha3/suggestion/suggestion_controller_suite_test.go b/pkg/controller.v1alpha3/suggestion/suggestion_controller_suite_test.go deleted file mode 100644 index 5b7739a2869..00000000000 --- a/pkg/controller.v1alpha3/suggestion/suggestion_controller_suite_test.go +++ /dev/null @@ -1,79 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package suggestion - -import ( - stdlog "log" - "os" - "path/filepath" - "sync" - "testing" - - "github.com/onsi/gomega" - "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/rest" - "sigs.k8s.io/controller-runtime/pkg/envtest" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - - apis "github.com/kubeflow/katib/pkg/apis/controller" -) - -var cfg *rest.Config - -func TestMain(m *testing.M) { - t := &envtest.Environment{ - CRDDirectoryPaths: []string{ - filepath.Join("..", "..", "..", "manifests", "v1alpha3", "katib-controller"), - filepath.Join("..", "..", "..", "test", "unit", "v1alpha3", "crds"), - }, - } - apis.AddToScheme(scheme.Scheme) - - var err error - if cfg, err = t.Start(); err != nil { - stdlog.Fatal(err) - } - - code := m.Run() - t.Stop() - os.Exit(code) -} - -// SetupTestReconcile returns a reconcile.Reconcile implementation that delegates to inner and -// writes the request to requests after Reconcile is finished. -func SetupTestReconcile(inner reconcile.Reconciler) (reconcile.Reconciler, chan reconcile.Request) { - requests := make(chan reconcile.Request) - fn := reconcile.Func(func(req reconcile.Request) (reconcile.Result, error) { - result, err := inner.Reconcile(req) - requests <- req - return result, err - }) - return fn, requests -} - -// StartTestManager adds recFn -func StartTestManager(mgr manager.Manager, g *gomega.GomegaWithT) (chan struct{}, *sync.WaitGroup) { - stop := make(chan struct{}) - wg := &sync.WaitGroup{} - wg.Add(1) - go func() { - defer wg.Done() - g.Expect(mgr.Start(stop)).NotTo(gomega.HaveOccurred()) - }() - return stop, wg -} diff --git a/pkg/controller.v1alpha3/suggestion/suggestion_controller_test.go b/pkg/controller.v1alpha3/suggestion/suggestion_controller_test.go deleted file mode 100644 index cb60e0a83fe..00000000000 --- a/pkg/controller.v1alpha3/suggestion/suggestion_controller_test.go +++ /dev/null @@ -1,125 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package suggestion - -import ( - "encoding/json" - "testing" - "time" - - "github.com/onsi/gomega" - "golang.org/x/net/context" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" -) - -var c client.Client - -var expectedRequest = reconcile.Request{NamespacedName: types.NamespacedName{Name: "foo", Namespace: "default"}} -var depKey = types.NamespacedName{Name: "foo-random", Namespace: "default"} - -const timeout = time.Second * 5 - -func init() { - logf.SetLogger(logf.ZapLogger(true)) -} - -func TestReconcile(t *testing.T) { - g := gomega.NewGomegaWithT(t) - instance := &suggestionsv1alpha3.Suggestion{ - ObjectMeta: metav1.ObjectMeta{ - Name: "foo", - Namespace: "default", - }, - Spec: suggestionsv1alpha3.SuggestionSpec{ - Requests: 1, - AlgorithmName: "random", - }, - } - configMap := newKatibConfigMapInstance() - - // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a - // channel when it is finished. - mgr, err := manager.New(cfg, manager.Options{}) - g.Expect(err).NotTo(gomega.HaveOccurred()) - c = mgr.GetClient() - - recFn, requests := SetupTestReconcile(newReconciler(mgr)) - g.Expect(add(mgr, recFn)).NotTo(gomega.HaveOccurred()) - - stopMgr, mgrStopped := StartTestManager(mgr, g) - - defer func() { - close(stopMgr) - mgrStopped.Wait() - }() - - // Create the Suggestion object and expect the Reconcile and Deployment to be created - err = c.Create(context.TODO(), instance) - g.Expect(err).NotTo(gomega.HaveOccurred()) - err = c.Create(context.TODO(), configMap) - g.Expect(err).NotTo(gomega.HaveOccurred()) - // The instance object may not be a valid object because it might be missing some required fields. - // Please modify the instance object by adding required fields and then remove the following if statement. - if apierrors.IsInvalid(err) { - t.Logf("failed to create object, got an invalid object error: %v", err) - return - } - g.Expect(err).NotTo(gomega.HaveOccurred()) - defer c.Delete(context.TODO(), instance) - g.Eventually(requests, timeout).Should(gomega.Receive(gomega.Equal(expectedRequest))) - - deploy := &appsv1.Deployment{} - g.Eventually(func() error { return c.Get(context.TODO(), depKey, deploy) }, timeout). - Should(gomega.Succeed()) - - // Delete the Deployment and expect Reconcile to be called for Deployment deletion - g.Expect(c.Delete(context.TODO(), deploy)).NotTo(gomega.HaveOccurred()) - g.Eventually(requests, timeout).Should(gomega.Receive(gomega.Equal(expectedRequest))) - g.Eventually(func() error { return c.Get(context.TODO(), depKey, deploy) }, timeout). - Should(gomega.Succeed()) - - // Manually delete Deployment since GC isn't enabled in the test control plane - g.Eventually(func() error { return c.Delete(context.TODO(), deploy) }, timeout). - Should(gomega.MatchError("deployments.apps \"foo-random\" not found")) - -} - -func newKatibConfigMapInstance() *corev1.ConfigMap { - suggestionConfig := map[string]map[string]string{ - "random": {"image": "test"}, - } - b, _ := json.Marshal(suggestionConfig) - return &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "katib-config", - Namespace: "kubeflow", - }, - Data: map[string]string{ - "suggestion": string(b), - }, - } -} diff --git a/pkg/controller.v1alpha3/suggestion/suggestion_controller_util.go b/pkg/controller.v1alpha3/suggestion/suggestion_controller_util.go deleted file mode 100644 index f4d5daa632d..00000000000 --- a/pkg/controller.v1alpha3/suggestion/suggestion_controller_util.go +++ /dev/null @@ -1,84 +0,0 @@ -package suggestion - -import ( - "context" - - "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/types" -) - -func (r *ReconcileSuggestion) reconcileDeployment(deploy *appsv1.Deployment) (*appsv1.Deployment, error) { - foundDeploy := &appsv1.Deployment{} - err := r.Get(context.TODO(), types.NamespacedName{Name: deploy.Name, Namespace: deploy.Namespace}, foundDeploy) - if err != nil && errors.IsNotFound(err) { - log.Info("Creating Deployment", "namespace", deploy.Namespace, "name", deploy.Name) - err = r.Create(context.TODO(), deploy) - return nil, err - } else if err != nil { - return nil, err - } - return foundDeploy, nil -} - -func (r *ReconcileSuggestion) reconcileService(service *corev1.Service) (*corev1.Service, error) { - foundService := &corev1.Service{} - err := r.Get(context.TODO(), types.NamespacedName{Name: service.Name, Namespace: service.Namespace}, foundService) - if err != nil && errors.IsNotFound(err) { - log.Info("Creating Service", "namespace", service.Namespace, "name", service.Name) - err = r.Create(context.TODO(), service) - return nil, err - } else if err != nil { - return nil, err - } - return foundService, nil -} - -func (r *ReconcileSuggestion) deleteDeployment(instance *v1alpha3.Suggestion) error { - deploy, err := r.DesiredDeployment(instance) - if err != nil { - return err - } - realDeploy := &appsv1.Deployment{} - err = r.Get(context.TODO(), types.NamespacedName{Name: deploy.Name, Namespace: deploy.Namespace}, realDeploy) - if err != nil { - if errors.IsNotFound(err) { - return nil - } - return err - } - log.Info("Deleting Suggestion Deployment", "namespace", realDeploy.Namespace, "name", realDeploy.Name) - - err = r.Delete(context.TODO(), realDeploy) - if err != nil { - return err - } - - return nil -} - -func (r *ReconcileSuggestion) deleteService(instance *v1alpha3.Suggestion) error { - service, err := r.DesiredService(instance) - if err != nil { - return err - } - realService := &corev1.Service{} - err = r.Get(context.TODO(), types.NamespacedName{Name: service.Name, Namespace: service.Namespace}, realService) - if err != nil { - if errors.IsNotFound(err) { - return nil - } - return err - } - log.Info("Deleting Suggestion Service", "namespace", realService.Namespace, "name", realService.Name) - - err = r.Delete(context.TODO(), realService) - if err != nil { - return err - } - - return nil -} diff --git a/pkg/controller.v1alpha3/suggestion/suggestionclient/algorithm_settings.go b/pkg/controller.v1alpha3/suggestion/suggestionclient/algorithm_settings.go deleted file mode 100644 index aa782b06fe1..00000000000 --- a/pkg/controller.v1alpha3/suggestion/suggestionclient/algorithm_settings.go +++ /dev/null @@ -1,53 +0,0 @@ -package suggestionclient - -import ( - common "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - suggestionapi "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" -) - -// appendAlgorithmSettingsFromSuggestion appends the algorithm settings -// in suggestion to Experiment. -// Algorithm settings in suggestion will overwrite the settings in experiment. -func appendAlgorithmSettingsFromSuggestion(experiment *experimentsv1alpha3.Experiment, algoSettingsInSuggestion []common.AlgorithmSetting) { - algoSettingsInExperiment := experiment.Spec.Algorithm - for _, setting := range algoSettingsInSuggestion { - if index, found := contains( - algoSettingsInExperiment.AlgorithmSettings, setting.Name); found { - // If the setting is found in Experiment, update it. - algoSettingsInExperiment.AlgorithmSettings[index].Value = setting.Value - } else { - // If not found, append it. - algoSettingsInExperiment.AlgorithmSettings = append( - algoSettingsInExperiment.AlgorithmSettings, setting) - } - } -} - -func updateAlgorithmSettings(suggestion *suggestionsv1alpha3.Suggestion, algorithm *suggestionapi.AlgorithmSpec) { - for _, setting := range algorithm.AlgorithmSetting { - if setting != nil { - if index, found := contains(suggestion.Status.AlgorithmSettings, setting.Name); found { - // If the setting is found in Suggestion, update it. - suggestion.Status.AlgorithmSettings[index].Value = setting.Value - } else { - // If not found, append it. - suggestion.Status.AlgorithmSettings = append(suggestion.Status.AlgorithmSettings, common.AlgorithmSetting{ - Name: setting.Name, - Value: setting.Value, - }) - } - } - } -} - -func contains(algorithmSettings []common.AlgorithmSetting, - name string) (int, bool) { - for i, s := range algorithmSettings { - if s.Name == name { - return i, true - } - } - return -1, false -} diff --git a/pkg/controller.v1alpha3/suggestion/suggestionclient/fake/fake.go b/pkg/controller.v1alpha3/suggestion/suggestionclient/fake/fake.go deleted file mode 100644 index 6e573b7ef4c..00000000000 --- a/pkg/controller.v1alpha3/suggestion/suggestionclient/fake/fake.go +++ /dev/null @@ -1,53 +0,0 @@ -package fake - -import ( - "fmt" - - utilrand "k8s.io/apimachinery/pkg/util/rand" - - common "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/suggestion/suggestionclient" -) - -type Fake struct { -} - -func New() suggestionclient.SuggestionClient { - return &Fake{} -} - -func (f *Fake) SyncAssignments( - instance *suggestionsv1alpha3.Suggestion, - e *experimentsv1alpha3.Experiment, - ts []trialsv1alpha3.Trial) error { - if int(instance.Status.SuggestionCount) != int(instance.Spec.Requests) { - for i := 0; i < int(instance.Spec.Requests)-int(instance.Status.SuggestionCount); i++ { - name := fmt.Sprintf("%s-%s", instance.Name, utilrand.String(8)) - instance.Status.Suggestions = append(instance.Status.Suggestions, suggestionsv1alpha3.TrialAssignment{ - Name: name, - ParameterAssignments: []common.ParameterAssignment{ - { - Name: "--lr", - Value: "0.03", - }, - { - Name: "--num-layers", - Value: "4", - }, - { - Name: "--optimizer", - Value: "adam", - }, - }, - }) - } - } - return nil -} - -func (f *Fake) ValidateAlgorithmSettings(instance *suggestionsv1alpha3.Suggestion, e *experimentsv1alpha3.Experiment) error { - return nil -} diff --git a/pkg/controller.v1alpha3/suggestion/suggestionclient/nas.go b/pkg/controller.v1alpha3/suggestion/suggestionclient/nas.go deleted file mode 100644 index 2ce101d4b09..00000000000 --- a/pkg/controller.v1alpha3/suggestion/suggestionclient/nas.go +++ /dev/null @@ -1,45 +0,0 @@ -package suggestionclient - -import ( - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - suggestionapi "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" -) - -func convertNasConfig(nasConfig *experimentsv1alpha3.NasConfig) *suggestionapi.NasConfig { - res := &suggestionapi.NasConfig{ - GraphConfig: convertGraphConfig(nasConfig.GraphConfig), - Operations: convertOperations(nasConfig.Operations), - } - return res -} - -func convertGraphConfig(graphConfig experimentsv1alpha3.GraphConfig) *suggestionapi.GraphConfig { - gc := &suggestionapi.GraphConfig{} - if graphConfig.NumLayers != nil { - gc.NumLayers = *graphConfig.NumLayers - } - gc.InputSizes = graphConfig.InputSizes - gc.OutputSizes = graphConfig.OutputSizes - return gc -} - -func convertOperations(operations []experimentsv1alpha3.Operation) *suggestionapi.NasConfig_Operations { - ops := &suggestionapi.NasConfig_Operations{ - Operation: make([]*suggestionapi.Operation, 0), - } - for _, operation := range operations { - op := &suggestionapi.Operation{ - OperationType: operation.OperationType, - ParameterSpecs: convertNasParameterSpecs(operation.Parameters), - } - ops.Operation = append(ops.Operation, op) - } - return ops -} - -func convertNasParameterSpecs(parameters []experimentsv1alpha3.ParameterSpec) *suggestionapi.Operation_ParameterSpecs { - ps := &suggestionapi.Operation_ParameterSpecs{ - Parameters: convertParameters(parameters), - } - return ps -} diff --git a/pkg/controller.v1alpha3/suggestion/suggestionclient/suggestionclient.go b/pkg/controller.v1alpha3/suggestion/suggestionclient/suggestionclient.go deleted file mode 100644 index d0c3be37fe2..00000000000 --- a/pkg/controller.v1alpha3/suggestion/suggestionclient/suggestionclient.go +++ /dev/null @@ -1,369 +0,0 @@ -package suggestionclient - -import ( - "context" - "fmt" - "time" - - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - - grpc_retry "github.com/grpc-ecosystem/go-grpc-middleware/retry" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "k8s.io/apimachinery/pkg/types" - utilrand "k8s.io/apimachinery/pkg/util/rand" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - - commonapiv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - suggestionapi "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/util" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -var ( - log = logf.Log.WithName("suggestion-client") - timeout = 60 * time.Second - timeFormat = "2006-01-02T15:04:05Z" -) - -// SuggestionClient is the interface to communicate with algorithm services. -type SuggestionClient interface { - SyncAssignments(instance *suggestionsv1alpha3.Suggestion, e *experimentsv1alpha3.Experiment, - ts []trialsv1alpha3.Trial) error - - ValidateAlgorithmSettings(instance *suggestionsv1alpha3.Suggestion, e *experimentsv1alpha3.Experiment) error -} - -// General is the implementation for SuggestionClient. -type General struct { -} - -// New creates a new SuggestionClient. -func New() SuggestionClient { - return &General{} -} - -// SyncAssignments syncs assignments from algorithm services. -func (g *General) SyncAssignments( - instance *suggestionsv1alpha3.Suggestion, - e *experimentsv1alpha3.Experiment, - ts []trialsv1alpha3.Trial) error { - logger := log.WithValues("Suggestion", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) - requestNum := int(instance.Spec.Requests) - int(instance.Status.SuggestionCount) - if requestNum <= 0 { - return nil - } - - endpoint := util.GetAlgorithmEndpoint(instance) - conn, err := grpc.Dial(endpoint, grpc.WithInsecure()) - if err != nil { - return err - } - defer conn.Close() - - client := suggestionapi.NewSuggestionClient(conn) - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - - // Algorithm settings in suggestion will overwrite the settings in experiment. - filledE := e.DeepCopy() - appendAlgorithmSettingsFromSuggestion(filledE, - instance.Status.AlgorithmSettings) - - request := &suggestionapi.GetSuggestionsRequest{ - Experiment: g.ConvertExperiment(filledE), - Trials: g.ConvertTrials(ts), - RequestNumber: int32(requestNum), - } - response, err := client.GetSuggestions(ctx, request) - if err != nil { - return err - } - logger.V(0).Info("Getting suggestions", "endpoint", endpoint, "response", response, "request", request) - if len(response.ParameterAssignments) != requestNum { - err := fmt.Errorf("The response contains unexpected trials") - logger.Error(err, "The response contains unexpected trials", "requestNum", requestNum, "response", response) - return err - } - for _, t := range response.ParameterAssignments { - instance.Status.Suggestions = append(instance.Status.Suggestions, - suggestionsv1alpha3.TrialAssignment{ - Name: fmt.Sprintf("%s-%s", instance.Name, utilrand.String(8)), - ParameterAssignments: composeParameterAssignments(t.Assignments), - }) - } - instance.Status.SuggestionCount = int32(len(instance.Status.Suggestions)) - - if response.Algorithm != nil { - updateAlgorithmSettings(instance, response.Algorithm) - } - return nil -} - -// ValidateAlgorithmSettings validates if the algorithm specific configurations are valid. -func (g *General) ValidateAlgorithmSettings(instance *suggestionsv1alpha3.Suggestion, e *experimentsv1alpha3.Experiment) error { - logger := log.WithValues("Suggestion", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) - endpoint := util.GetAlgorithmEndpoint(instance) - - callOpts := []grpc_retry.CallOption{ - grpc_retry.WithBackoff(grpc_retry.BackoffLinear(consts.DefaultGRPCRetryPeriod)), - grpc_retry.WithMax(consts.DefaultGRPCRetryAttempts), - } - conn, err := grpc.Dial(endpoint, grpc.WithInsecure(), - grpc.WithStreamInterceptor(grpc_retry.StreamClientInterceptor(callOpts...)), - grpc.WithUnaryInterceptor(grpc_retry.UnaryClientInterceptor(callOpts...)), - ) - if err != nil { - return err - } - defer conn.Close() - - client := suggestionapi.NewSuggestionClient(conn) - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - - request := &suggestionapi.ValidateAlgorithmSettingsRequest{ - Experiment: g.ConvertExperiment(e), - } - - // See https://github.com/grpc/grpc-go/issues/2636 - // See https://github.com/grpc/grpc-go/pull/2503 - _, err = client.ValidateAlgorithmSettings(ctx, request, grpc.WaitForReady(true)) - statusCode, _ := status.FromError(err) - - // validation error - if statusCode.Code() == codes.InvalidArgument || statusCode.Code() == codes.Unknown { - logger.Error(err, "ValidateAlgorithmSettings error") - return fmt.Errorf("ValidateAlgorithmSettings Error: %v", statusCode.Message()) - } - - // Connection error - if statusCode.Code() == codes.Unavailable { - logger.Error(err, "Connection to Suggestion algorithm service currently unavailable") - return err - } - - // Validate to true as function is not implemented - if statusCode.Code() == codes.Unimplemented { - logger.Info("Method ValidateAlgorithmSettings not found", "Suggestion service", e.Spec.Algorithm.AlgorithmName) - return nil - } - logger.Info("Algorithm settings validated") - return nil -} - -// ConvertExperiment converts CRD to the GRPC definition. -func (g *General) ConvertExperiment(e *experimentsv1alpha3.Experiment) *suggestionapi.Experiment { - res := &suggestionapi.Experiment{} - res.Name = e.Name - res.Spec = &suggestionapi.ExperimentSpec{ - Algorithm: &suggestionapi.AlgorithmSpec{ - AlgorithmName: e.Spec.Algorithm.AlgorithmName, - AlgorithmSetting: convertAlgorithmSettings(e.Spec.Algorithm.AlgorithmSettings), - }, - Objective: &suggestionapi.ObjectiveSpec{ - Type: convertObjectiveType(e.Spec.Objective.Type), - ObjectiveMetricName: e.Spec.Objective.ObjectiveMetricName, - }, - ParameterSpecs: &suggestionapi.ExperimentSpec_ParameterSpecs{ - Parameters: convertParameters(e.Spec.Parameters), - }, - } - // Set Goal if user defines it in Objective - if e.Spec.Objective.Goal != nil { - res.Spec.Objective.Goal = *e.Spec.Objective.Goal - } - // Set NasConfig if the user defines it in Spec. - if e.Spec.NasConfig != nil { - res.Spec.NasConfig = convertNasConfig(e.Spec.NasConfig) - } - if e.Spec.ParallelTrialCount != nil { - res.Spec.ParallelTrialCount = *e.Spec.ParallelTrialCount - } - if e.Spec.MaxTrialCount != nil { - res.Spec.MaxTrialCount = *e.Spec.MaxTrialCount - } - return res -} - -// ConvertTrials converts CRD to the GRPC definition. -func (g *General) ConvertTrials(ts []trialsv1alpha3.Trial) []*suggestionapi.Trial { - trialsRes := make([]*suggestionapi.Trial, 0) - for _, t := range ts { - trial := &suggestionapi.Trial{ - Name: t.Name, - Spec: &suggestionapi.TrialSpec{ - Objective: &suggestionapi.ObjectiveSpec{ - Type: convertObjectiveType(t.Spec.Objective.Type), - ObjectiveMetricName: t.Spec.Objective.ObjectiveMetricName, - AdditionalMetricNames: t.Spec.Objective.AdditionalMetricNames, - }, - ParameterAssignments: convertTrialParameterAssignments( - t.Spec.ParameterAssignments), - }, - Status: &suggestionapi.TrialStatus{ - StartTime: convertTrialStatusTime(t.Status.StartTime), - CompletionTime: convertTrialStatusTime(t.Status.CompletionTime), - Observation: convertTrialObservation( - t.Status.Observation), - }, - } - if t.Spec.Objective.Goal != nil { - trial.Spec.Objective.Goal = *t.Spec.Objective.Goal - } - if len(t.Status.Conditions) > 0 { - // We send only the latest condition of the Trial! - trial.Status.Condition = convertTrialConditionType( - t.Status.Conditions[len(t.Status.Conditions)-1].Type) - } - trialsRes = append(trialsRes, trial) - } - - return trialsRes -} - -// convertTrialParameterAssignments convert ParameterAssignments CRD to the GRPC definition -func convertTrialParameterAssignments(pas []commonapiv1alpha3.ParameterAssignment) *suggestionapi.TrialSpec_ParameterAssignments { - tsPas := &suggestionapi.TrialSpec_ParameterAssignments{ - Assignments: make([]*suggestionapi.ParameterAssignment, 0), - } - for _, pa := range pas { - tsPas.Assignments = append(tsPas.Assignments, &suggestionapi.ParameterAssignment{ - Name: pa.Name, - Value: pa.Value, - }) - } - - return tsPas -} - -// convertTrialConditionType convert Trial Status Condition Type CRD to the GRPC definition -func convertTrialConditionType(conditionType trialsv1alpha3.TrialConditionType) suggestionapi.TrialStatus_TrialConditionType { - switch conditionType { - case trialsv1alpha3.TrialCreated: - return suggestionapi.TrialStatus_CREATED - case trialsv1alpha3.TrialRunning: - return suggestionapi.TrialStatus_RUNNING - case trialsv1alpha3.TrialSucceeded: - return suggestionapi.TrialStatus_SUCCEEDED - case trialsv1alpha3.TrialKilled: - return suggestionapi.TrialStatus_KILLED - case trialsv1alpha3.TrialFailed: - return suggestionapi.TrialStatus_FAILED - default: - return suggestionapi.TrialStatus_UNKNOWN - } -} - -// convertTrialObservation convert Trial Observation Metrics CRD to the GRPC definition -func convertTrialObservation(observation *commonapiv1alpha3.Observation) *suggestionapi.Observation { - resObservation := &suggestionapi.Observation{ - Metrics: make([]*suggestionapi.Metric, 0), - } - if observation != nil && observation.Metrics != nil { - for _, m := range observation.Metrics { - resObservation.Metrics = append(resObservation.Metrics, &suggestionapi.Metric{ - Name: m.Name, - Value: fmt.Sprintf("%f", m.Value), - }) - } - } - return resObservation - -} - -// convertTrialStatusTime convert Trial Status Time CRD to the GRPC definition -func convertTrialStatusTime(time *metav1.Time) string { - if time != nil { - return time.Format(timeFormat) - } - return "" -} - -// ComposeTrialsTemplate composes trials with raw template from the GRPC response. -func (g *General) ComposeTrialsTemplate(ts []*suggestionapi.Trial) []trialsv1alpha3.Trial { - res := make([]trialsv1alpha3.Trial, 0) - for _, t := range ts { - res = append(res, trialsv1alpha3.Trial{ - Spec: trialsv1alpha3.TrialSpec{ - ParameterAssignments: composeParameterAssignments( - t.Spec.ParameterAssignments.Assignments), - }, - }) - } - return res -} - -func composeParameterAssignments(pas []*suggestionapi.ParameterAssignment) []commonapiv1alpha3.ParameterAssignment { - res := make([]commonapiv1alpha3.ParameterAssignment, 0) - for _, pa := range pas { - res = append(res, commonapiv1alpha3.ParameterAssignment{ - Name: pa.Name, - Value: pa.Value, - }) - } - return res -} - -func convertObjectiveType(typ commonapiv1alpha3.ObjectiveType) suggestionapi.ObjectiveType { - switch typ { - case commonapiv1alpha3.ObjectiveTypeMaximize: - return suggestionapi.ObjectiveType_MAXIMIZE - case commonapiv1alpha3.ObjectiveTypeMinimize: - return suggestionapi.ObjectiveType_MINIMIZE - default: - return suggestionapi.ObjectiveType_UNKNOWN - } -} - -func convertAlgorithmSettings(as []commonapiv1alpha3.AlgorithmSetting) []*suggestionapi.AlgorithmSetting { - res := make([]*suggestionapi.AlgorithmSetting, 0) - for _, s := range as { - res = append(res, &suggestionapi.AlgorithmSetting{ - Name: s.Name, - Value: s.Value, - }) - } - return res -} - -func convertParameters(ps []experimentsv1alpha3.ParameterSpec) []*suggestionapi.ParameterSpec { - res := make([]*suggestionapi.ParameterSpec, 0) - for _, p := range ps { - res = append(res, &suggestionapi.ParameterSpec{ - Name: p.Name, - ParameterType: convertParameterType(p.ParameterType), - FeasibleSpace: convertFeasibleSpace(p.FeasibleSpace), - }) - } - return res -} - -func convertParameterType(typ experimentsv1alpha3.ParameterType) suggestionapi.ParameterType { - switch typ { - case experimentsv1alpha3.ParameterTypeDiscrete: - return suggestionapi.ParameterType_DISCRETE - case experimentsv1alpha3.ParameterTypeCategorical: - return suggestionapi.ParameterType_CATEGORICAL - case experimentsv1alpha3.ParameterTypeDouble: - return suggestionapi.ParameterType_DOUBLE - case experimentsv1alpha3.ParameterTypeInt: - return suggestionapi.ParameterType_INT - default: - return suggestionapi.ParameterType_UNKNOWN_TYPE - } -} - -func convertFeasibleSpace(fs experimentsv1alpha3.FeasibleSpace) *suggestionapi.FeasibleSpace { - res := &suggestionapi.FeasibleSpace{ - Max: fs.Max, - Min: fs.Min, - List: fs.List, - Step: fs.Step, - } - return res -} diff --git a/pkg/controller.v1alpha3/trial/managerclient/managerclient.go b/pkg/controller.v1alpha3/trial/managerclient/managerclient.go deleted file mode 100644 index f7b62102ff1..00000000000 --- a/pkg/controller.v1alpha3/trial/managerclient/managerclient.go +++ /dev/null @@ -1,51 +0,0 @@ -package managerclient - -import ( - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - common "github.com/kubeflow/katib/pkg/common/v1alpha3" -) - -// ManagerClient is the interface for katib manager client in trial controller. -type ManagerClient interface { - GetTrialObservationLog( - instance *trialsv1alpha3.Trial) (*api_pb.GetObservationLogReply, error) - DeleteTrialObservationLog( - instance *trialsv1alpha3.Trial) (*api_pb.DeleteObservationLogReply, error) -} - -// DefaultClient implements the Client interface. -type DefaultClient struct { -} - -// New creates a new ManagerClient. -func New() ManagerClient { - return &DefaultClient{} -} - -func (d *DefaultClient) GetTrialObservationLog( - instance *trialsv1alpha3.Trial) (*api_pb.GetObservationLogReply, error) { - // read GetObservationLog call and update observation field - objectiveMetricName := instance.Spec.Objective.ObjectiveMetricName - request := &api_pb.GetObservationLogRequest{ - TrialName: instance.Name, - MetricName: objectiveMetricName, - } - reply, err := common.GetObservationLog(request) - if err != nil { - return nil, err - } - return reply, nil -} - -func (d *DefaultClient) DeleteTrialObservationLog( - instance *trialsv1alpha3.Trial) (*api_pb.DeleteObservationLogReply, error) { - request := &api_pb.DeleteObservationLogRequest{ - TrialName: instance.Name, - } - reply, err := common.DeleteObservationLog(request) - if err != nil { - return nil, err - } - return reply, nil -} diff --git a/pkg/controller.v1alpha3/trial/prometheus_metrics.go b/pkg/controller.v1alpha3/trial/prometheus_metrics.go deleted file mode 100644 index c5cd292274c..00000000000 --- a/pkg/controller.v1alpha3/trial/prometheus_metrics.go +++ /dev/null @@ -1,136 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package trial - -import ( - "context" - - "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - "github.com/prometheus/client_golang/prometheus" - "sigs.k8s.io/controller-runtime/pkg/cache" -) - -type TrialsCollector struct { - store cache.Cache - trialDeleteCount *prometheus.CounterVec - trialCreateCount *prometheus.CounterVec - trialSucceedCount *prometheus.CounterVec - trialFailCount *prometheus.CounterVec - trialCurrent *prometheus.GaugeVec -} - -func NewTrialsCollector(store cache.Cache, registerer prometheus.Registerer) *TrialsCollector { - c := &TrialsCollector{ - store: store, - trialDeleteCount: prometheus.NewCounterVec(prometheus.CounterOpts{ - Name: "katib_trial_deleted_total", - Help: "The total number of deleted trials", - }, []string{"namespace"}), - - trialCreateCount: prometheus.NewCounterVec(prometheus.CounterOpts{ - Name: "katib_trial_created_total", - Help: "The total number of created trials", - }, []string{"namespace"}), - - trialSucceedCount: prometheus.NewCounterVec(prometheus.CounterOpts{ - Name: "katib_trial_succeeded_total", - Help: "The total number of succeeded trials", - }, []string{"namespace"}), - - trialFailCount: prometheus.NewCounterVec(prometheus.CounterOpts{ - Name: "katib_trial_failed_total", - Help: "The total number of failed trials", - }, []string{"namespace"}), - - trialCurrent: prometheus.NewGaugeVec(prometheus.GaugeOpts{ - Name: "katib_trials_current", - Help: "The number of current katib trials in the cluster", - }, []string{"namespace", "status"}), - } - registerer.MustRegister(c) - return c -} - -// Describe implements the prometheus.Collector interface. -func (m *TrialsCollector) Describe(ch chan<- *prometheus.Desc) { - m.trialDeleteCount.Describe(ch) - m.trialSucceedCount.Describe(ch) - m.trialFailCount.Describe(ch) - m.trialCreateCount.Describe(ch) - m.trialCurrent.Describe(ch) -} - -// Collect implements the prometheus.Collector interface. -func (m *TrialsCollector) Collect(ch chan<- prometheus.Metric) { - m.collect() - m.trialDeleteCount.Collect(ch) - m.trialSucceedCount.Collect(ch) - m.trialFailCount.Collect(ch) - m.trialCreateCount.Collect(ch) - m.trialCurrent.Collect(ch) -} - -func (c *TrialsCollector) IncreaseTrialsDeletedCount(ns string) { - c.trialDeleteCount.WithLabelValues(ns).Inc() -} - -func (c *TrialsCollector) IncreaseTrialsCreatedCount(ns string) { - c.trialCreateCount.WithLabelValues(ns).Inc() -} - -func (c *TrialsCollector) IncreaseTrialsSucceededCount(ns string) { - c.trialSucceedCount.WithLabelValues(ns).Inc() -} - -func (c *TrialsCollector) IncreaseTrialsFailedCount(ns string) { - c.trialFailCount.WithLabelValues(ns).Inc() -} - -// collect gets the current experiments from cache. -func (c *TrialsCollector) collect() { - var ( - conditionType v1alpha3.TrialConditionType - status string - err error - ) - trialLists := &v1alpha3.TrialList{} - if err = c.store.List(context.TODO(), nil, trialLists); err != nil { - return - } - - trialCache := map[string]map[string]int{} - for _, trial := range trialLists.Items { - conditionType, err = trial.GetLastConditionType() - status = string(conditionType) - // If trial doesn't have any condition, use unknown. - if err != nil { - status = "Unknown" - } - - if _, ok := trialCache[trial.Namespace]; !ok { - trialCache[trial.Namespace] = make(map[string]int) - } - trialCache[trial.Namespace][status] += 1 - } - - c.trialCurrent.Reset() - for ns, v := range trialCache { - for status, count := range v { - c.trialCurrent.WithLabelValues(ns, status).Set(float64(count)) - } - } -} diff --git a/pkg/controller.v1alpha3/trial/trial_controller.go b/pkg/controller.v1alpha3/trial/trial_controller.go deleted file mode 100644 index 37dc3c5bc3e..00000000000 --- a/pkg/controller.v1alpha3/trial/trial_controller.go +++ /dev/null @@ -1,332 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package trial - -import ( - "bytes" - "context" - "fmt" - - batchv1beta "k8s.io/api/batch/v1beta1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/equality" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/types" - k8syaml "k8s.io/apimachinery/pkg/util/yaml" - "k8s.io/client-go/tools/record" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/metrics" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - "sigs.k8s.io/controller-runtime/pkg/source" - - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/trial/managerclient" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/util" - jobv1alpha3 "github.com/kubeflow/katib/pkg/job/v1alpha3" -) - -const ( - // ControllerName is the controller name. - ControllerName = "trial-controller" -) - -var ( - log = logf.Log.WithName(ControllerName) -) - -// Add creates a new Trial Controller and adds it to the Manager with default RBAC. The Manager will set fields on the Controller -// and Start it when the Manager is Started. -func Add(mgr manager.Manager) error { - return add(mgr, newReconciler(mgr)) -} - -// newReconciler returns a new reconcile.Reconciler -func newReconciler(mgr manager.Manager) reconcile.Reconciler { - r := &ReconcileTrial{ - Client: mgr.GetClient(), - scheme: mgr.GetScheme(), - ManagerClient: managerclient.New(), - recorder: mgr.GetRecorder(ControllerName), - collector: NewTrialsCollector(mgr.GetCache(), metrics.Registry), - } - r.updateStatusHandler = r.updateStatus - return r -} - -// add adds a new Controller to mgr with r as the reconcile.Reconciler -func add(mgr manager.Manager, r reconcile.Reconciler) error { - // Create a new controller - c, err := controller.New("trial-controller", mgr, controller.Options{Reconciler: r}) - if err != nil { - log.Error(err, "Create trial controller error") - return err - } - - // Watch for changes to Trial - err = c.Watch(&source.Kind{Type: &trialsv1alpha3.Trial{}}, &handler.EnqueueRequestForObject{}) - if err != nil { - log.Error(err, "Trial watch error") - return err - } - - // Watch for changes to Cronjob - err = c.Watch( - &source.Kind{Type: &batchv1beta.CronJob{}}, - &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &trialsv1alpha3.Trial{}, - }) - - if err != nil { - log.Error(err, "CronJob watch error") - return err - } - - for _, gvk := range jobv1alpha3.SupportedJobList { - unstructuredJob := &unstructured.Unstructured{} - unstructuredJob.SetGroupVersionKind(gvk) - err = c.Watch( - &source.Kind{Type: unstructuredJob}, - &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &trialsv1alpha3.Trial{}, - }) - if err != nil { - if meta.IsNoMatchError(err) { - log.Info("Job watch error. CRD might be missing. Please install CRD and restart katib-controller", "CRD Kind", gvk.Kind) - continue - } - return err - } else { - log.Info("Job watch added successfully", "CRD Kind", gvk.Kind) - } - } - log.Info("Trial controller created") - return nil -} - -var _ reconcile.Reconciler = &ReconcileTrial{} - -// ReconcileTrial reconciles a Trial object -type ReconcileTrial struct { - client.Client - scheme *runtime.Scheme - recorder record.EventRecorder - - managerclient.ManagerClient - // updateStatusHandler is defined for test purpose. - updateStatusHandler updateStatusFunc - // collector is a wrapper for experiment metrics. - collector *TrialsCollector -} - -// Reconcile reads that state of the cluster for a Trial object and makes changes based on the state read -// and what is in the Trial.Spec -// +kubebuilder:rbac:groups=trials.kubeflow.org,resources=trials,verbs=get;list;watch;create;update;patch;delete -// +kubebuilder:rbac:groups=trials.kubeflow.org,resources=trials/status,verbs=get;update;patch -func (r *ReconcileTrial) Reconcile(request reconcile.Request) (reconcile.Result, error) { - // Fetch the Trial instance - logger := log.WithValues("Trial", request.NamespacedName) - original := &trialsv1alpha3.Trial{} - err := r.Get(context.TODO(), request.NamespacedName, original) - if err != nil { - if errors.IsNotFound(err) { - // Object not found, return. Created objects are automatically garbage collected. - // For additional cleanup logic use finalizers. - return reconcile.Result{}, nil - } - // Error reading the object - requeue the request. - logger.Error(err, "Trial Get error") - return reconcile.Result{}, err - } - - instance := original.DeepCopy() - - if needUpdate, finalizers := needUpdateFinalizers(instance); needUpdate { - return r.updateFinalizers(instance, finalizers) - } - - if !instance.IsCreated() { - if instance.Status.StartTime == nil { - now := metav1.Now() - instance.Status.StartTime = &now - } - if instance.Status.CompletionTime == nil { - instance.Status.CompletionTime = &metav1.Time{} - } - msg := "Trial is created" - instance.MarkTrialStatusCreated(TrialCreatedReason, msg) - } else { - err := r.reconcileTrial(instance) - if err != nil { - logger.Error(err, "Reconcile trial error") - r.recorder.Eventf(instance, - corev1.EventTypeWarning, ReconcileFailedReason, - "Failed to reconcile: %v", err) - return reconcile.Result{}, err - } - } - - if !equality.Semantic.DeepEqual(original.Status, instance.Status) { - //assuming that only status change - err = r.updateStatusHandler(instance) - if err != nil { - logger.Error(err, "Update trial instance status error") - return reconcile.Result{}, err - } - } - - return reconcile.Result{}, nil -} - -func (r *ReconcileTrial) reconcileTrial(instance *trialsv1alpha3.Trial) error { - - var err error - logger := log.WithValues("Trial", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) - desiredJob, err := r.getDesiredJobSpec(instance) - if err != nil { - logger.Error(err, "Job Spec Get error") - return err - } - - deployedJob, err := r.reconcileJob(instance, desiredJob) - if err != nil { - logger.Error(err, "Reconcile job error") - return err - } - - // Job already exists - // TODO Can desired Spec differ from deployedSpec? - if deployedJob != nil { - kind := deployedJob.GetKind() - jobProvider, err := jobv1alpha3.New(kind) - if err != nil { - logger.Error(err, "Failed to create the provider") - return err - } - jobCondition, err := jobProvider.GetDeployedJobStatus(deployedJob) - if err != nil { - logger.Error(err, "Get deployed status error") - return err - } - - // Update trial observation when the job is succeeded. - if isJobSucceeded(jobCondition) { - if err = r.UpdateTrialStatusObservation(instance, deployedJob); err != nil { - logger.Error(err, "Update trial status observation error") - return err - } - } - - // Update Trial job status only - // if job has succeeded and if observation field is available. - // if job has failed - // This will ensure that trial is set to be complete only if metric is collected at least once - r.UpdateTrialStatusCondition(instance, deployedJob, jobCondition) - - } - return nil -} - -func (r *ReconcileTrial) reconcileJob(instance *trialsv1alpha3.Trial, desiredJob *unstructured.Unstructured) (*unstructured.Unstructured, error) { - var err error - logger := log.WithValues("Trial", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) - apiVersion := desiredJob.GetAPIVersion() - kind := desiredJob.GetKind() - gvk := schema.FromAPIVersionAndKind(apiVersion, kind) - - // Add annotation to desired Job - err = util.TrainingJobAnnotations(desiredJob) - if err != nil { - logger.Error(err, "TrainingJobAnnotations error") - return nil, err - } - - deployedJob := &unstructured.Unstructured{} - deployedJob.SetGroupVersionKind(gvk) - err = r.Get(context.TODO(), types.NamespacedName{Name: desiredJob.GetName(), Namespace: desiredJob.GetNamespace()}, deployedJob) - if err != nil { - if errors.IsNotFound(err) { - if instance.IsCompleted() { - return nil, nil - } - jobProvider, err := jobv1alpha3.New(desiredJob.GetKind()) - if err != nil { - return nil, err - } - // mutate desiredJob according to provider - if err := jobProvider.MutateJob(instance, desiredJob); err != nil { - logger.Error(err, "Mutating desiredSpec of km.Training error") - return nil, err - } - logger.Info("Creating Job", "kind", kind, - "name", desiredJob.GetName()) - err = r.Create(context.TODO(), desiredJob) - if err != nil { - logger.Error(err, "Create job error") - return nil, err - } - eventMsg := fmt.Sprintf("Job %s has been created", desiredJob.GetName()) - r.recorder.Eventf(instance, corev1.EventTypeNormal, JobCreatedReason, eventMsg) - } else { - logger.Error(err, "Trial Get error") - return nil, err - } - } else { - if instance.IsCompleted() && !instance.Spec.RetainRun { - if err = r.Delete(context.TODO(), desiredJob, client.PropagationPolicy(metav1.DeletePropagationForeground)); err != nil { - logger.Error(err, "Delete job error") - return nil, err - } else { - eventMsg := fmt.Sprintf("Job %s has been deleted", desiredJob.GetName()) - r.recorder.Eventf(instance, corev1.EventTypeNormal, JobDeletedReason, eventMsg) - return nil, nil - } - } - } - - return deployedJob, nil -} - -func (r *ReconcileTrial) getDesiredJobSpec(instance *trialsv1alpha3.Trial) (*unstructured.Unstructured, error) { - - bufSize := 1024 - logger := log.WithValues("Trial", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) - buf := bytes.NewBufferString(instance.Spec.RunSpec) - - desiredJobSpec := &unstructured.Unstructured{} - if err := k8syaml.NewYAMLOrJSONDecoder(buf, bufSize).Decode(desiredJobSpec); err != nil { - logger.Error(err, "Yaml decode error") - return nil, err - } - if err := controllerutil.SetControllerReference(instance, desiredJobSpec, r.scheme); err != nil { - logger.Error(err, "Set controller reference error") - return nil, err - } - - return desiredJobSpec, nil -} diff --git a/pkg/controller.v1alpha3/trial/trial_controller_consts.go b/pkg/controller.v1alpha3/trial/trial_controller_consts.go deleted file mode 100644 index cc0fe390046..00000000000 --- a/pkg/controller.v1alpha3/trial/trial_controller_consts.go +++ /dev/null @@ -1,22 +0,0 @@ -package trial - -const ( - DefaultJobKind = "Job" - - // For trials - TrialCreatedReason = "TrialCreated" - TrialRunningReason = "TrialRunning" - TrialSucceededReason = "TrialSucceeded" - TrialMetricsUnavailableReason = "MetricsUnavailable" - TrialFailedReason = "TrialFailed" - TrialKilledReason = "TrialKilled" - - // For Jobs - JobCreatedReason = "JobCreated" - JobDeletedReason = "JobDeleted" - JobSucceededReason = "JobSucceeded" - JobMetricsUnavailableReason = "MetricsUnavailable" - JobFailedReason = "JobFailed" - JobRunningReason = "JobRunning" - ReconcileFailedReason = "ReconcileFailed" -) diff --git a/pkg/controller.v1alpha3/trial/trial_controller_status.go b/pkg/controller.v1alpha3/trial/trial_controller_status.go deleted file mode 100644 index 8220397780e..00000000000 --- a/pkg/controller.v1alpha3/trial/trial_controller_status.go +++ /dev/null @@ -1,17 +0,0 @@ -package trial - -import ( - "context" - - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" -) - -type updateStatusFunc func(instance *trialsv1alpha3.Trial) error - -func (r *ReconcileTrial) updateStatus(instance *trialsv1alpha3.Trial) error { - err := r.Status().Update(context.TODO(), instance) - if err != nil { - return err - } - return nil -} diff --git a/pkg/controller.v1alpha3/trial/trial_controller_suite_test.go b/pkg/controller.v1alpha3/trial/trial_controller_suite_test.go deleted file mode 100644 index 23f0ef091a6..00000000000 --- a/pkg/controller.v1alpha3/trial/trial_controller_suite_test.go +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package trial - -import ( - stdlog "log" - "os" - "path/filepath" - "sync" - "testing" - "time" - - "github.com/onsi/gomega" - "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/rest" - "sigs.k8s.io/controller-runtime/pkg/envtest" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - - apis "github.com/kubeflow/katib/pkg/apis/controller" -) - -var ( - cfg *rest.Config - controlPlaneStartTimeout = 60 * time.Second - controlPlaneStopTimeout = 60 * time.Second -) - -func TestMain(m *testing.M) { - t := &envtest.Environment{ - ControlPlaneStartTimeout: controlPlaneStartTimeout, - ControlPlaneStopTimeout: controlPlaneStopTimeout, - CRDDirectoryPaths: []string{ - filepath.Join("..", "..", "..", "manifests", "v1alpha3", "katib-controller"), - filepath.Join("..", "..", "..", "test", "unit", "v1alpha3", "crds"), - }, - } - apis.AddToScheme(scheme.Scheme) - - var err error - if cfg, err = t.Start(); err != nil { - stdlog.Fatal(err) - } - - code := m.Run() - t.Stop() - os.Exit(code) -} - -// SetupTestReconcile returns a reconcile.Reconcile implementation that delegates to inner. -func SetupTestReconcile(inner reconcile.Reconciler) reconcile.Reconciler { - fn := reconcile.Func(func(req reconcile.Request) (reconcile.Result, error) { - result, err := inner.Reconcile(req) - return result, err - }) - return fn -} - -// StartTestManager adds recFn -func StartTestManager(mgr manager.Manager, g *gomega.GomegaWithT) (chan struct{}, *sync.WaitGroup) { - stop := make(chan struct{}) - wg := &sync.WaitGroup{} - wg.Add(1) - go func() { - defer wg.Done() - g.Expect(mgr.Start(stop)).NotTo(gomega.HaveOccurred()) - }() - return stop, wg -} diff --git a/pkg/controller.v1alpha3/trial/trial_controller_test.go b/pkg/controller.v1alpha3/trial/trial_controller_test.go deleted file mode 100644 index caa5814f1d4..00000000000 --- a/pkg/controller.v1alpha3/trial/trial_controller_test.go +++ /dev/null @@ -1,277 +0,0 @@ -package trial - -import ( - "bytes" - "testing" - "time" - - "github.com/golang/mock/gomock" - "github.com/onsi/gomega" - "github.com/prometheus/client_golang/prometheus" - "golang.org/x/net/context" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/types" - k8syaml "k8s.io/apimachinery/pkg/util/yaml" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - - commonv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - managerclientmock "github.com/kubeflow/katib/pkg/mock/v1alpha3/trial/managerclient" -) - -const ( - trialName = "foo" - namespace = "default" - - timeout = time.Second * 40 -) - -var expectedRequest = reconcile.Request{NamespacedName: types.NamespacedName{Name: trialName, Namespace: namespace}} -var expectedResult = reconcile.Result{Requeue: true} -var tfJobKey = types.NamespacedName{Name: "test", Namespace: namespace} - -func init() { - logf.SetLogger(logf.ZapLogger(true)) -} - -func TestCreateTFJobTrial(t *testing.T) { - g := gomega.NewGomegaWithT(t) - instance := newFakeTrialWithTFJob() - - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - mc := managerclientmock.NewMockManagerClient(mockCtrl) - - // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a - // channel when it is finished. - mgr, err := manager.New(cfg, manager.Options{}) - g.Expect(err).NotTo(gomega.HaveOccurred()) - c := mgr.GetClient() - - recFn := SetupTestReconcile(&ReconcileTrial{ - Client: mgr.GetClient(), - scheme: mgr.GetScheme(), - ManagerClient: mc, - recorder: mgr.GetRecorder(ControllerName), - updateStatusHandler: func(instance *trialsv1alpha3.Trial) error { - if !instance.IsCreated() { - t.Errorf("Expected got condition created") - } - return nil - }, - }) - g.Expect(add(mgr, recFn)).NotTo(gomega.HaveOccurred()) - - stopMgr, mgrStopped := StartTestManager(mgr, g) - - defer func() { - close(stopMgr) - mgrStopped.Wait() - }() - - // Create the Trial object and expect the Reconcile and Deployment to be created - err = c.Create(context.TODO(), instance) - // The instance object may not be a valid object because it might be missing some required fields. - // Please modify the instance object by adding required fields and then remove the following if statement. - if apierrors.IsInvalid(err) { - t.Logf("failed to create object, got an invalid object error: %v", err) - return - } - g.Expect(err).NotTo(gomega.HaveOccurred()) - g.Expect(c.Delete(context.TODO(), instance)).NotTo(gomega.HaveOccurred()) - g.Eventually(func() bool { - return apierrors.IsNotFound(c.Get(context.TODO(), - expectedRequest.NamespacedName, instance)) - }, timeout).Should(gomega.BeTrue()) -} - -func TestReconcileTFJobTrial(t *testing.T) { - g := gomega.NewGomegaWithT(t) - instance := newFakeTrialWithTFJob() - - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - mc := managerclientmock.NewMockManagerClient(mockCtrl) - mc.EXPECT().GetTrialObservationLog(gomock.Any()).Return(&api_pb.GetObservationLogReply{ - ObservationLog: nil, - }, nil).AnyTimes() - mc.EXPECT().DeleteTrialObservationLog(gomock.Any()).Return(&api_pb.DeleteObservationLogReply{}, nil).AnyTimes() - - // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a - // channel when it is finished. - mgr, err := manager.New(cfg, manager.Options{}) - g.Expect(err).NotTo(gomega.HaveOccurred()) - c := mgr.GetClient() - - r := &ReconcileTrial{ - Client: mgr.GetClient(), - scheme: mgr.GetScheme(), - ManagerClient: mc, - recorder: mgr.GetRecorder(ControllerName), - collector: NewTrialsCollector(mgr.GetCache(), prometheus.NewRegistry()), - } - - r.updateStatusHandler = func(instance *trialsv1alpha3.Trial) error { - if !instance.IsCreated() { - t.Errorf("Expected got condition created") - } - return r.updateStatus(instance) - } - - recFn := SetupTestReconcile(r) - g.Expect(add(mgr, recFn)).NotTo(gomega.HaveOccurred()) - - stopMgr, mgrStopped := StartTestManager(mgr, g) - - defer func() { - close(stopMgr) - mgrStopped.Wait() - }() - - // Create the Trial object and expect the Reconcile and Deployment to be created - err = c.Create(context.TODO(), instance) - // The instance object may not be a valid object because it might be missing some required fields. - // Please modify the instance object by adding required fields and then remove the following if statement. - if apierrors.IsInvalid(err) { - t.Logf("failed to create object, got an invalid object error: %v", err) - return - } - g.Expect(err).NotTo(gomega.HaveOccurred()) - - tfJob := &unstructured.Unstructured{} - bufSize := 1024 - buf := bytes.NewBufferString(instance.Spec.RunSpec) - if err := k8syaml.NewYAMLOrJSONDecoder(buf, bufSize).Decode(tfJob); err != nil { - t.Errorf("Expected nil, got %v", err) - } - g.Eventually(func() error { return c.Get(context.TODO(), tfJobKey, tfJob) }, timeout). - Should(gomega.Succeed()) - - // Delete the TFJob and expect Reconcile to be called for TFJob deletion - g.Expect(c.Delete(context.TODO(), tfJob)).NotTo(gomega.HaveOccurred()) - g.Eventually(func() error { return c.Get(context.TODO(), tfJobKey, tfJob) }, timeout). - Should(gomega.Succeed()) - - // Manually delete TFJob since GC isn't enabled in the test control plane - g.Eventually(func() error { return c.Delete(context.TODO(), tfJob) }, timeout). - Should(gomega.MatchError("tfjobs.kubeflow.org \"test\" not found")) - g.Expect(c.Delete(context.TODO(), instance)).NotTo(gomega.HaveOccurred()) -} - -func TestReconcileCompletedTFJobTrial(t *testing.T) { - g := gomega.NewGomegaWithT(t) - instance := newFakeTrialWithTFJob() - instance.Name = "tfjob-trial" - - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - mc := managerclientmock.NewMockManagerClient(mockCtrl) - mc.EXPECT().GetTrialObservationLog(gomock.Any()).Return(&api_pb.GetObservationLogReply{ - ObservationLog: nil, - }, nil).AnyTimes() - mc.EXPECT().DeleteTrialObservationLog(gomock.Any()).Return(&api_pb.DeleteObservationLogReply{}, nil).AnyTimes() - - // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a - // channel when it is finished. - mgr, err := manager.New(cfg, manager.Options{}) - g.Expect(err).NotTo(gomega.HaveOccurred()) - c := mgr.GetClient() - - r := &ReconcileTrial{ - Client: mgr.GetClient(), - scheme: mgr.GetScheme(), - ManagerClient: mc, - recorder: mgr.GetRecorder(ControllerName), - collector: NewTrialsCollector(mgr.GetCache(), prometheus.NewRegistry()), - } - - r.updateStatusHandler = func(instance *trialsv1alpha3.Trial) error { - if !instance.IsCreated() { - t.Errorf("Expected got condition created") - } - return r.updateStatus(instance) - } - - recFn := SetupTestReconcile(r) - g.Expect(add(mgr, recFn)).NotTo(gomega.HaveOccurred()) - - stopMgr, mgrStopped := StartTestManager(mgr, g) - - defer func() { - close(stopMgr) - mgrStopped.Wait() - }() - - // Create the Trial object and expect the Reconcile and Deployment to be created - err = c.Create(context.TODO(), instance) - // The instance object may not be a valid object because it might be missing some required fields. - // Please modify the instance object by adding required fields and then remove the following if statement. - if apierrors.IsInvalid(err) { - t.Logf("failed to create object, got an invalid object error: %v", err) - return - } - g.Expect(err).NotTo(gomega.HaveOccurred()) - defer c.Delete(context.TODO(), instance) - - g.Eventually(func() error { - return c.Get(context.TODO(), expectedRequest.NamespacedName, instance) - }, timeout). - Should(gomega.Succeed()) - instance.MarkTrialStatusSucceeded(corev1.ConditionTrue, "", "") - g.Expect(c.Status().Update(context.TODO(), instance)).NotTo(gomega.HaveOccurred()) - g.Eventually(func() bool { - err := c.Get(context.TODO(), expectedRequest.NamespacedName, instance) - if err == nil && instance.IsCompleted() { - return true - } - return false - }, timeout). - Should(gomega.BeTrue()) -} - -func newFakeTrialWithTFJob() *trialsv1alpha3.Trial { - objectiveSpec := commonv1alpha3.ObjectiveSpec{ObjectiveMetricName: "test"} - t := &trialsv1alpha3.Trial{ - ObjectMeta: metav1.ObjectMeta{ - Name: trialName, - Namespace: namespace, - }, - Spec: trialsv1alpha3.TrialSpec{ - Objective: &objectiveSpec, - RunSpec: `apiVersion: "kubeflow.org/v1" -kind: "TFJob" -metadata: - name: "test" - namespace: "default" -spec: - tfReplicaSpecs: - PS: - replicas: 2 - restartPolicy: Never - template: - spec: - containers: - - name: tensorflow - image: kubeflow/tf-dist-mnist-test:1.0 - Worker: - replicas: 4 - restartPolicy: Never - template: - spec: - containers: - - name: tensorflow - image: kubeflow/tf-dist-mnist-test:1.0 -`, - }, - } - return t -} diff --git a/pkg/controller.v1alpha3/trial/trial_controller_util.go b/pkg/controller.v1alpha3/trial/trial_controller_util.go deleted file mode 100644 index c2499ae1aff..00000000000 --- a/pkg/controller.v1alpha3/trial/trial_controller_util.go +++ /dev/null @@ -1,222 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package trial - -import ( - "context" - "fmt" - "strconv" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - - commonv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - commonv1 "github.com/kubeflow/tf-operator/pkg/apis/common/v1" -) - -const ( - cleanMetricsFinalizer = "clean-metrics-in-db" -) - -func (r *ReconcileTrial) UpdateTrialStatusCondition(instance *trialsv1alpha3.Trial, deployedJob *unstructured.Unstructured, jobCondition *commonv1.JobCondition) { - if jobCondition == nil || instance == nil || deployedJob == nil { - return - } - now := metav1.Now() - jobConditionType := (*jobCondition).Type - if jobConditionType == commonv1.JobSucceeded { - if isTrialObservationAvailable(instance) { - msg := "Trial has succeeded" - instance.MarkTrialStatusSucceeded(corev1.ConditionTrue, TrialSucceededReason, msg) - instance.Status.CompletionTime = &now - - eventMsg := fmt.Sprintf("Job %s has succeeded", deployedJob.GetName()) - r.recorder.Eventf(instance, corev1.EventTypeNormal, JobSucceededReason, eventMsg) - r.collector.IncreaseTrialsSucceededCount(instance.Namespace) - } else { - msg := "Metrics are not available" - instance.MarkTrialStatusSucceeded(corev1.ConditionFalse, TrialMetricsUnavailableReason, msg) - - eventMsg := fmt.Sprintf("Metrics are not available for Job %s", deployedJob.GetName()) - r.recorder.Eventf(instance, corev1.EventTypeWarning, JobMetricsUnavailableReason, eventMsg) - } - } else if jobConditionType == commonv1.JobFailed { - msg := "Trial has failed" - instance.MarkTrialStatusFailed(TrialFailedReason, msg) - instance.Status.CompletionTime = &now - - jobConditionMessage := (*jobCondition).Message - eventMsg := fmt.Sprintf("Job %s has failed: %s", deployedJob.GetName(), jobConditionMessage) - r.recorder.Eventf(instance, corev1.EventTypeNormal, JobFailedReason, eventMsg) - r.collector.IncreaseTrialsFailedCount(instance.Namespace) - } else if jobConditionType == commonv1.JobRunning { - msg := "Trial is running" - instance.MarkTrialStatusRunning(TrialRunningReason, msg) - jobConditionMessage := (*jobCondition).Message - eventMsg := fmt.Sprintf("Job %s is running: %s", - deployedJob.GetName(), jobConditionMessage) - r.recorder.Eventf(instance, corev1.EventTypeNormal, - JobRunningReason, eventMsg) - // TODO(gaocegege): Should we maintain a TrialsRunningCount? - } - // else nothing to do - return -} - -func (r *ReconcileTrial) UpdateTrialStatusObservation(instance *trialsv1alpha3.Trial, deployedJob *unstructured.Unstructured) error { - objectiveMetricName := instance.Spec.Objective.ObjectiveMetricName - reply, err := r.GetTrialObservationLog(instance) - if err != nil { - log.Error(err, "Get trial observation log error") - return err - } - if reply.ObservationLog != nil { - bestObjectiveValue := getBestObjectiveMetricValue(reply.ObservationLog.MetricLogs, instance.Spec.Objective.Type) - if bestObjectiveValue != nil { - if instance.Status.Observation == nil { - instance.Status.Observation = &commonv1alpha3.Observation{} - metric := commonv1alpha3.Metric{Name: objectiveMetricName, Value: *bestObjectiveValue} - instance.Status.Observation.Metrics = []commonv1alpha3.Metric{metric} - } else { - for index, metric := range instance.Status.Observation.Metrics { - if metric.Name == objectiveMetricName { - instance.Status.Observation.Metrics[index].Value = *bestObjectiveValue - } - } - } - } - } - return nil -} - -func (r *ReconcileTrial) updateFinalizers(instance *trialsv1alpha3.Trial, finalizers []string) (reconcile.Result, error) { - isDelete := true - if !instance.ObjectMeta.DeletionTimestamp.IsZero() { - if _, err := r.DeleteTrialObservationLog(instance); err != nil { - return reconcile.Result{}, err - } - } else { - isDelete = false - } - instance.SetFinalizers(finalizers) - if err := r.Update(context.TODO(), instance); err != nil { - return reconcile.Result{}, err - } else { - if isDelete { - r.collector.IncreaseTrialsDeletedCount(instance.Namespace) - } else { - r.collector.IncreaseTrialsCreatedCount(instance.Namespace) - } - // Need to requeue because finalizer update does not change metadata.generation - return reconcile.Result{Requeue: true}, err - } -} - -func isTrialObservationAvailable(instance *trialsv1alpha3.Trial) bool { - if instance == nil { - return false - } - objectiveMetricName := instance.Spec.Objective.ObjectiveMetricName - if instance.Status.Observation != nil && instance.Status.Observation.Metrics != nil { - for _, metric := range instance.Status.Observation.Metrics { - if metric.Name == objectiveMetricName { - return true - } - } - } - return false -} - -func isTrialComplete(instance *trialsv1alpha3.Trial, jobCondition *commonv1.JobCondition) bool { - if jobCondition == nil || instance == nil { - return false - } - jobConditionType := (*jobCondition).Type - if jobConditionType == commonv1.JobSucceeded && isTrialObservationAvailable(instance) { - return true - } - if jobConditionType == commonv1.JobFailed { - return true - } - - return false -} - -func isJobSucceeded(jobCondition *commonv1.JobCondition) bool { - if jobCondition == nil { - return false - } - jobConditionType := (*jobCondition).Type - if jobConditionType == commonv1.JobSucceeded { - return true - } - - return false -} - -func getBestObjectiveMetricValue(metricLogs []*api_pb.MetricLog, objectiveType commonv1alpha3.ObjectiveType) *float64 { - metricLogSize := len(metricLogs) - if metricLogSize == 0 { - return nil - } - - bestObjectiveValue, _ := strconv.ParseFloat(metricLogs[0].Metric.Value, 64) - for _, metricLog := range metricLogs[1:] { - objectiveMetricValue, _ := strconv.ParseFloat(metricLog.Metric.Value, 64) - if objectiveType == commonv1alpha3.ObjectiveTypeMinimize { - if objectiveMetricValue < bestObjectiveValue { - bestObjectiveValue = objectiveMetricValue - } - } else if objectiveType == commonv1alpha3.ObjectiveTypeMaximize { - if objectiveMetricValue > bestObjectiveValue { - bestObjectiveValue = objectiveMetricValue - } - } - - } - return &bestObjectiveValue -} - -func needUpdateFinalizers(trial *trialsv1alpha3.Trial) (bool, []string) { - deleted := !trial.ObjectMeta.DeletionTimestamp.IsZero() - pendingFinalizers := trial.GetFinalizers() - contained := false - for _, elem := range pendingFinalizers { - if elem == cleanMetricsFinalizer { - contained = true - break - } - } - - if !deleted && !contained { - finalizers := append(pendingFinalizers, cleanMetricsFinalizer) - return true, finalizers - } - if deleted && contained { - finalizers := []string{} - for _, pendingFinalizer := range pendingFinalizers { - if pendingFinalizer != cleanMetricsFinalizer { - finalizers = append(finalizers, pendingFinalizer) - } - } - return true, finalizers - } - return false, []string{} -} diff --git a/pkg/controller.v1alpha3/util/annotations.go b/pkg/controller.v1alpha3/util/annotations.go deleted file mode 100644 index 47c63307be5..00000000000 --- a/pkg/controller.v1alpha3/util/annotations.go +++ /dev/null @@ -1,122 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package util - -import ( - "fmt" - - batchv1 "k8s.io/api/batch/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - jobv1alpha3 "github.com/kubeflow/katib/pkg/job/v1alpha3" - pytorchv1 "github.com/kubeflow/pytorch-operator/pkg/apis/pytorch/v1" - tfv1 "github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1" -) - -var ( - log = logf.Log.WithName("util-annotations") -) - -// SuggestionAnnotations returns the expected suggestion annotations. -func SuggestionAnnotations(instance *suggestionsv1alpha3.Suggestion) map[string]string { - return appendAnnotation( - instance.Annotations, - consts.AnnotationIstioSidecarInjectName, - consts.AnnotationIstioSidecarInjectValue) -} - -// TrainingJobAnnotations adds annotations to unstructured job. -func TrainingJobAnnotations(desiredJob *unstructured.Unstructured) error { - kind := desiredJob.GetKind() - switch kind { - case consts.JobKindJob: - batchJob := &batchv1.Job{} - err := runtime.DefaultUnstructuredConverter.FromUnstructured(desiredJob.Object, &batchJob) - if err != nil { - log.Error(err, "Convert unstructured to job error") - return err - } - batchJob.Spec.Template.ObjectMeta.Annotations = appendAnnotation( - batchJob.Spec.Template.ObjectMeta.Annotations, - consts.AnnotationIstioSidecarInjectName, - consts.AnnotationIstioSidecarInjectValue) - desiredJob.Object, err = runtime.DefaultUnstructuredConverter.ToUnstructured(batchJob) - if err != nil { - log.Error(err, "Convert job to unstructured error") - return err - } - return nil - case consts.JobKindTF: - tfJob := &tfv1.TFJob{} - err := runtime.DefaultUnstructuredConverter.FromUnstructured(desiredJob.Object, &tfJob) - if err != nil { - log.Error(err, "Convert unstructured to TFJob error") - return err - } - for _, replicaSpec := range tfJob.Spec.TFReplicaSpecs { - replicaSpec.Template.ObjectMeta.Annotations = appendAnnotation( - replicaSpec.Template.ObjectMeta.Annotations, - consts.AnnotationIstioSidecarInjectName, - consts.AnnotationIstioSidecarInjectValue) - } - desiredJob.Object, err = runtime.DefaultUnstructuredConverter.ToUnstructured(tfJob) - if err != nil { - log.Error(err, "Convert TFJob to unstructured error") - return err - } - return nil - case consts.JobKindPyTorch: - pytorchJob := &pytorchv1.PyTorchJob{} - err := runtime.DefaultUnstructuredConverter.FromUnstructured(desiredJob.Object, &pytorchJob) - if err != nil { - log.Error(err, "Convert unstructured to PytorchJob error") - return err - } - for _, replicaSpec := range pytorchJob.Spec.PyTorchReplicaSpecs { - replicaSpec.Template.ObjectMeta.Annotations = appendAnnotation( - replicaSpec.Template.ObjectMeta.Annotations, - consts.AnnotationIstioSidecarInjectName, - consts.AnnotationIstioSidecarInjectValue) - } - desiredJob.Object, err = runtime.DefaultUnstructuredConverter.ToUnstructured(pytorchJob) - if err != nil { - log.Error(err, "Convert PytorchJob to unstructured error") - return err - } - return nil - default: - // Annotation appending of custom job can be done in Provider.MutateJob. - if _, ok := jobv1alpha3.SupportedJobList[kind]; ok { - return nil - } - return fmt.Errorf("Invalid Katib Training Job kind %v", kind) - } - -} - -func appendAnnotation(annotations map[string]string, newAnnotationName string, newAnnotationValue string) map[string]string { - res := make(map[string]string) - for k, v := range annotations { - res[k] = v - } - res[newAnnotationName] = newAnnotationValue - - return res -} diff --git a/pkg/controller.v1alpha3/util/labels.go b/pkg/controller.v1alpha3/util/labels.go deleted file mode 100644 index 4b3e6904b33..00000000000 --- a/pkg/controller.v1alpha3/util/labels.go +++ /dev/null @@ -1,31 +0,0 @@ -package util - -import ( - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" -) - -// SuggestionLabels returns the expected suggestion labels. -func SuggestionLabels(instance *suggestionsv1alpha3.Suggestion) map[string]string { - res := make(map[string]string) - for k, v := range instance.Labels { - res[k] = v - } - res[consts.LabelDeploymentName] = GetAlgorithmDeploymentName(instance) - res[consts.LabelExperimentName] = instance.Name - res[consts.LabelSuggestionName] = instance.Name - - return res -} - -// TrialLabels returns the expected trial labels. -func TrialLabels(instance *experimentsv1alpha3.Experiment) map[string]string { - res := make(map[string]string) - for k, v := range instance.Labels { - res[k] = v - } - res[consts.LabelExperimentName] = instance.Name - - return res -} diff --git a/pkg/controller.v1alpha3/util/suggestion.go b/pkg/controller.v1alpha3/util/suggestion.go deleted file mode 100644 index bbf309fb8a5..00000000000 --- a/pkg/controller.v1alpha3/util/suggestion.go +++ /dev/null @@ -1,25 +0,0 @@ -package util - -import ( - "fmt" - - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" -) - -func GetAlgorithmDeploymentName(s *suggestionsv1alpha3.Suggestion) string { - return s.Name + "-" + s.Spec.AlgorithmName -} - -func GetAlgorithmServiceName(s *suggestionsv1alpha3.Suggestion) string { - return s.Name + "-" + s.Spec.AlgorithmName -} - -// GetAlgorithmEndpoint returns the endpoint of the algorithm service. -func GetAlgorithmEndpoint(s *suggestionsv1alpha3.Suggestion) string { - serviceName := GetAlgorithmServiceName(s) - return fmt.Sprintf("%s.%s:%d", - serviceName, - s.Namespace, - consts.DefaultSuggestionPort) -} diff --git a/pkg/db/v1alpha3/common/const.go b/pkg/db/v1alpha3/common/const.go deleted file mode 100644 index 0d1d0cac161..00000000000 --- a/pkg/db/v1alpha3/common/const.go +++ /dev/null @@ -1,20 +0,0 @@ -package common - -const ( - DBUserEnvName = "DB_USER" - - DBNameEnvName = "DB_NAME" - - MySqlDBNameEnvValue = "mysql" - - DBPasswordEnvName = "DB_PASSWORD" - - MySQLDBHostEnvName = "KATIB_MYSQL_DB_HOST" - MySQLDBPortEnvName = "KATIB_MYSQL_DB_PORT" - MySQLDatabase = "KATIB_MYSQL_DB_DATABASE" - - DefaultMySQLUser = "root" - DefaultMySQLDatabase = "katib" - DefaultMySQLHost = "katib-mysql" - DefaultMySQLPort = "3306" -) diff --git a/pkg/db/v1alpha3/common/kdb.go b/pkg/db/v1alpha3/common/kdb.go deleted file mode 100644 index 17492f52882..00000000000 --- a/pkg/db/v1alpha3/common/kdb.go +++ /dev/null @@ -1,14 +0,0 @@ -package common - -import ( - v1alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" -) - -type KatibDBInterface interface { - DBInit() - SelectOne() error - - RegisterObservationLog(trialName string, observationLog *v1alpha3.ObservationLog) error - GetObservationLog(trialName string, metricName string, startTime string, endTime string) (*v1alpha3.ObservationLog, error) - DeleteObservationLog(trialName string) error -} diff --git a/pkg/db/v1alpha3/db.go b/pkg/db/v1alpha3/db.go deleted file mode 100644 index 2c2329c9762..00000000000 --- a/pkg/db/v1alpha3/db.go +++ /dev/null @@ -1,16 +0,0 @@ -package db - -import ( - "errors" - - "github.com/kubeflow/katib/pkg/db/v1alpha3/common" - "github.com/kubeflow/katib/pkg/db/v1alpha3/mysql" -) - -func NewKatibDBInterface(dbName string) (common.KatibDBInterface, error) { - - if dbName == common.MySqlDBNameEnvValue { - return mysql.NewDBInterface() - } - return nil, errors.New("Invalid DB Name") -} diff --git a/pkg/db/v1alpha3/mysql/init.go b/pkg/db/v1alpha3/mysql/init.go deleted file mode 100644 index 74560dee962..00000000000 --- a/pkg/db/v1alpha3/mysql/init.go +++ /dev/null @@ -1,31 +0,0 @@ -package mysql - -import ( - "fmt" - - "k8s.io/klog" -) - -func (d *dbConn) DBInit() { - db := d.db - klog.Info("Initializing v1alpha3 DB schema") - - _, err := db.Exec(`CREATE TABLE IF NOT EXISTS observation_logs - (trial_name VARCHAR(255) NOT NULL, - id INT AUTO_INCREMENT PRIMARY KEY, - time DATETIME(6), - metric_name VARCHAR(255) NOT NULL, - value TEXT NOT NULL)`) - if err != nil { - klog.Fatalf("Error creating observation_logs table: %v", err) - } -} - -func (d *dbConn) SelectOne() error { - db := d.db - _, err := db.Exec(`SELECT 1`) - if err != nil { - return fmt.Errorf("Error `SELECT 1` probing: %v", err) - } - return nil -} diff --git a/pkg/db/v1alpha3/mysql/mysql.go b/pkg/db/v1alpha3/mysql/mysql.go deleted file mode 100644 index d6a521ec504..00000000000 --- a/pkg/db/v1alpha3/mysql/mysql.go +++ /dev/null @@ -1,186 +0,0 @@ -package mysql - -import ( - crand "crypto/rand" - "database/sql" - "fmt" - "math/big" - "math/rand" - "os" - "time" - - _ "github.com/go-sql-driver/mysql" - "k8s.io/klog" - - v1alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - "github.com/kubeflow/katib/pkg/db/v1alpha3/common" - "github.com/kubeflow/katib/pkg/util/v1alpha3/env" -) - -const ( - dbDriver = "mysql" - //dbNameTmpl = "root:%s@tcp(%s:%s)/%s?timeout=5s" - dbNameTmpl = "%s:%s@tcp(%s:%s)/%s?timeout=5s" - mysqlTimeFmt = "2006-01-02 15:04:05.999999" - - connectInterval = 5 * time.Second - connectTimeout = 60 * time.Second -) - -type dbConn struct { - db *sql.DB -} - -func getDbName() string { - dbPassEnvName := common.DBPasswordEnvName - dbPass := os.Getenv(dbPassEnvName) - dbUser := env.GetEnvOrDefault( - common.DBUserEnvName, common.DefaultMySQLUser) - dbHost := env.GetEnvOrDefault( - common.MySQLDBHostEnvName, common.DefaultMySQLHost) - dbPort := env.GetEnvOrDefault( - common.MySQLDBPortEnvName, common.DefaultMySQLPort) - dbName := env.GetEnvOrDefault(common.MySQLDatabase, - common.DefaultMySQLDatabase) - - return fmt.Sprintf(dbNameTmpl, dbUser, dbPass, dbHost, dbPort, dbName) -} - -func openSQLConn(driverName string, dataSourceName string, interval time.Duration, - timeout time.Duration) (*sql.DB, error) { - ticker := time.NewTicker(interval) - defer ticker.Stop() - - timeoutC := time.After(timeout) - for { - select { - case <-ticker.C: - if db, err := sql.Open(driverName, dataSourceName); err == nil { - if err = db.Ping(); err == nil { - return db, nil - } - klog.Errorf("Ping to Katib db failed: %v", err) - } else { - klog.Errorf("Open sql connection failed: %v", err) - } - case <-timeoutC: - return nil, fmt.Errorf("Timeout waiting for DB conn successfully opened.") - } - } -} - -func NewWithSQLConn(db *sql.DB) (common.KatibDBInterface, error) { - d := new(dbConn) - d.db = db - seed, err := crand.Int(crand.Reader, big.NewInt(1<<63-1)) - if err != nil { - return nil, fmt.Errorf("RNG initialization failed: %v", err) - } - // We can do the following instead, but it creates a locking issue - //d.rng = rand.New(rand.NewSource(seed.Int64())) - rand.Seed(seed.Int64()) - - return d, nil -} - -func NewDBInterface() (common.KatibDBInterface, error) { - db, err := openSQLConn(dbDriver, getDbName(), connectInterval, connectTimeout) - if err != nil { - return nil, fmt.Errorf("DB open failed: %v", err) - } - return NewWithSQLConn(db) -} - -func (d *dbConn) RegisterObservationLog(trialName string, observationLog *v1alpha3.ObservationLog) error { - var mname, mvalue string - for _, mlog := range observationLog.MetricLogs { - mname = mlog.Metric.Name - mvalue = mlog.Metric.Value - if mlog.TimeStamp == "" { - continue - } - t, err := time.Parse(time.RFC3339Nano, mlog.TimeStamp) - if err != nil { - return fmt.Errorf("Error parsing start time %s: %v", mlog.TimeStamp, err) - } - sqlTimeStr := t.UTC().Format(mysqlTimeFmt) - _, err = d.db.Exec( - `INSERT INTO observation_logs ( - trial_name, - time, - metric_name, - value - ) VALUES (?, ?, ?, ?)`, - trialName, - sqlTimeStr, - mname, - mvalue, - ) - if err != nil { - return err - } - } - return nil -} - -func (d *dbConn) DeleteObservationLog(trialName string) error { - _, err := d.db.Exec("DELETE FROM observation_logs WHERE trial_name = ?", trialName) - return err -} - -func (d *dbConn) GetObservationLog(trialName string, metricName string, startTime string, endTime string) (*v1alpha3.ObservationLog, error) { - qfield := []interface{}{trialName} - qstr := "" - if metricName != "" { - qstr += " AND metric_name = ?" - qfield = append(qfield, metricName) - } - if startTime != "" { - s_time, err := time.Parse(time.RFC3339Nano, startTime) - if err != nil { - return nil, fmt.Errorf("Error parsing start time %s: %v", startTime, err) - } - formattedStartTime := s_time.UTC().Format(mysqlTimeFmt) - qstr += " AND time >= ?" - qfield = append(qfield, formattedStartTime) - } - if endTime != "" { - e_time, err := time.Parse(time.RFC3339Nano, endTime) - if err != nil { - return nil, fmt.Errorf("Error parsing completion time %s: %v", endTime, err) - } - formattedEndTime := e_time.UTC().Format(mysqlTimeFmt) - qstr += " AND time <= ?" - qfield = append(qfield, formattedEndTime) - } - rows, err := d.db.Query("SELECT time, metric_name, value FROM observation_logs WHERE trial_name = ?"+qstr+" ORDER BY time", - qfield...) - if err != nil { - return nil, fmt.Errorf("Failed to get ObservationLogs %v", err) - } - result := &v1alpha3.ObservationLog{ - MetricLogs: []*v1alpha3.MetricLog{}, - } - for rows.Next() { - var mname, mvalue, sqlTimeStr string - err := rows.Scan(&sqlTimeStr, &mname, &mvalue) - if err != nil { - klog.Errorf("Error scanning log: %v", err) - continue - } - ptime, err := time.Parse(mysqlTimeFmt, sqlTimeStr) - if err != nil { - klog.Errorf("Error parsing time %s: %v", sqlTimeStr, err) - continue - } - timeStamp := ptime.UTC().Format(time.RFC3339Nano) - result.MetricLogs = append(result.MetricLogs, &v1alpha3.MetricLog{ - TimeStamp: timeStamp, - Metric: &v1alpha3.Metric{ - Name: mname, - Value: mvalue, - }, - }) - } - return result, nil -} diff --git a/pkg/db/v1alpha3/mysql/mysql_test.go b/pkg/db/v1alpha3/mysql/mysql_test.go deleted file mode 100644 index 5137290ac3c..00000000000 --- a/pkg/db/v1alpha3/mysql/mysql_test.go +++ /dev/null @@ -1,147 +0,0 @@ -package mysql - -import ( - "fmt" - "os" - "testing" - - _ "github.com/go-sql-driver/mysql" - sqlmock "gopkg.in/DATA-DOG/go-sqlmock.v1" - - api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - "github.com/kubeflow/katib/pkg/db/v1alpha3/common" -) - -var dbInterface, mysqlInterface common.KatibDBInterface -var mock sqlmock.Sqlmock - -var observationLogsColumns = []string{ - "trial_name", - "id", - "time", - "metric_name", - "value", -} - -func TestMain(m *testing.M) { - db, sm, err := sqlmock.New() - mock = sm - if err != nil { - fmt.Printf("error opening db: %v\n", err) - os.Exit(1) - } - dbInterface, err = NewWithSQLConn(db) - if err != nil { - fmt.Printf("error NewWithSQLConn: %v\n", err) - } - mock.ExpectExec("CREATE TABLE IF NOT EXISTS observation_logs").WithArgs().WillReturnResult(sqlmock.NewResult(1, 1)) - dbInterface.DBInit() - err = dbInterface.SelectOne() - if err != nil { - fmt.Printf("error `SELECT 1` probing: %v\n", err) - } - os.Exit(m.Run()) -} - -func TestRegisterObservationLog(t *testing.T) { - obsLog := &api_pb.ObservationLog{ - MetricLogs: []*api_pb.MetricLog{ - { - TimeStamp: "2016-12-31T20:02:05.123456Z", - Metric: &api_pb.Metric{ - Name: "f1_score", - Value: "88.95", - }, - }, - { - TimeStamp: "2016-12-31T20:02:05.123456Z", - Metric: &api_pb.Metric{ - Name: "loss", - Value: "0.5", - }, - }, - { - TimeStamp: "2016-12-31T20:02:05.123456Z", - Metric: &api_pb.Metric{ - Name: "precision", - Value: "88.7", - }, - }, - { - TimeStamp: "2016-12-31T20:02:05.123456Z", - Metric: &api_pb.Metric{ - Name: "recall", - Value: "89.2", - }, - }, - }, - } - for _, m := range obsLog.MetricLogs { - mock.ExpectExec( - `INSERT INTO observation_logs \( - trial_name, - time, - metric_name, - value - \)`, - ).WithArgs( - "test1_trial1", - "2016-12-31 20:02:05.123456", - m.Metric.Name, - m.Metric.Value, - ).WillReturnResult(sqlmock.NewResult(1, 1)) - } - err := dbInterface.RegisterObservationLog("test1_trial1", obsLog) - if err != nil { - t.Errorf("RegisterExperiment failed: %v", err) - } - -} - -func TestGetObservationLog(t *testing.T) { - mock.ExpectQuery("SELECT").WillReturnRows( - sqlmock.NewRows([]string{"time", "metric_name", "value"}).AddRow( - "2016-12-31 21:02:05.123456", - "loss", - "0.9", - ).AddRow( - "2016-12-31 22:02:05.123456", - "loss", - "0.9", - ), - ) - obsLog, err := dbInterface.GetObservationLog( - "test1_trial1", - "loss", - "2016-12-31T21:01:05.123456Z", - "2016-12-31T22:10:20.123456Z", - ) - if err != nil { - t.Errorf("GetObservationLog failed %v", err) - } else if len(obsLog.MetricLogs) != 2 { - t.Errorf("GetObservationLog incorrect return %v", obsLog) - } - -} - -func TestDeleteObservationLog(t *testing.T) { - trialName := "test1_trial1" - - mock.ExpectExec( - "DELETE FROM observation_logs", - ).WithArgs(trialName).WillReturnResult(sqlmock.NewResult(1, 1)) - - err := dbInterface.DeleteObservationLog(trialName) - if err != nil { - t.Errorf("DeleteObservationLog failed: %v", err) - } -} - -func TestGetDbName(t *testing.T) { - dbName := "root:@tcp(katib-mysql:3306)/katib?timeout=5s" - - if getDbName() != dbName { - t.Errorf("getDbName returns wrong value %v", getDbName()) - } - -} diff --git a/pkg/job/v1alpha3/job.go b/pkg/job/v1alpha3/job.go deleted file mode 100644 index 063fba0bc4e..00000000000 --- a/pkg/job/v1alpha3/job.go +++ /dev/null @@ -1,88 +0,0 @@ -package v1alpha3 - -import ( - commonv1 "github.com/kubeflow/tf-operator/pkg/apis/common/v1" - batchv1 "k8s.io/api/batch/v1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - - "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" -) - -var ( - jobLogger = logf.Log.WithName("provider-job") -) - -// Job is the provider of Job kind. -type Job struct{} - -// GetDeployedJobStatus get the deployed job status. -func (j Job) GetDeployedJobStatus( - deployedJob *unstructured.Unstructured) (*commonv1.JobCondition, error) { - jobCondition := commonv1.JobCondition{} - // Set default type to running. - jobCondition.Type = commonv1.JobRunning - status, ok, unerr := unstructured.NestedFieldCopy(deployedJob.Object, "status") - if !ok { - if unerr != nil { - jobLogger.Error(unerr, "NestedFieldCopy unstructured to status error") - return nil, unerr - } - // Job does not have the running condition in status, thus we think - // the job is running when it is created. - jobLogger.Info("NestedFieldCopy", "err", "status cannot be found in job") - return nil, nil - } - - statusMap := status.(map[string]interface{}) - jobStatus := batchv1.JobStatus{} - err := runtime.DefaultUnstructuredConverter.FromUnstructured(statusMap, &jobStatus) - if err != nil { - jobLogger.Error(err, "Convert unstructured to status error") - return nil, err - } - for _, cond := range jobStatus.Conditions { - if cond.Type == batchv1.JobComplete && cond.Status == corev1.ConditionTrue { - jobCondition.Type = commonv1.JobSucceeded - // JobConditions message not populated when succeeded for batchv1 Job - break - } - if cond.Type == batchv1.JobFailed && cond.Status == corev1.ConditionTrue { - jobCondition.Type = commonv1.JobFailed - jobCondition.Message = cond.Message - break - } - } - return &jobCondition, nil -} - -// IsTrainingContainer returns if the c is the actual training container. -func (j Job) IsTrainingContainer(index int, c corev1.Container) bool { - if index == 0 { - // for Job worker, the first container will be taken as worker container, - // katib document should note it - return true - } - return false -} -func (j Job) MutateJob(*v1alpha3.Trial, *unstructured.Unstructured) error { - return nil -} - -func (j *Job) Create(kind string) Provider { - return &Job{} -} - -func init() { - ProviderRegistry[consts.JobKindJob] = &Job{} - SupportedJobList[consts.JobKindJob] = schema.GroupVersionKind{ - Group: "batch", - Version: "v1", - Kind: consts.JobKindJob, - } - JobRoleMap[consts.JobKindJob] = []string{} -} diff --git a/pkg/job/v1alpha3/kubeflow.go b/pkg/job/v1alpha3/kubeflow.go deleted file mode 100644 index 2c9c539236a..00000000000 --- a/pkg/job/v1alpha3/kubeflow.go +++ /dev/null @@ -1,103 +0,0 @@ -package v1alpha3 - -import ( - pytorchv1 "github.com/kubeflow/pytorch-operator/pkg/apis/pytorch/v1" - commonv1 "github.com/kubeflow/tf-operator/pkg/apis/common/v1" - tfv1 "github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - - "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" -) - -var ( - kfLogger = logf.Log.WithName("provider-kubeflow") -) - -// Kubeflow is the provider of Kubeflow kinds. -type Kubeflow struct { - Kind string -} - -// GetDeployedJobStatus get the deployed job status. -func (k Kubeflow) GetDeployedJobStatus( - deployedJob *unstructured.Unstructured) (*commonv1.JobCondition, error) { - jobCondition := commonv1.JobCondition{} - // Set default type to running. - jobCondition.Type = commonv1.JobRunning - status, ok, unerr := unstructured.NestedFieldCopy(deployedJob.Object, "status") - if !ok { - if unerr != nil { - kfLogger.Error(unerr, "NestedFieldCopy unstructured to status error") - return nil, unerr - } - kfLogger.Info("NestedFieldCopy unstructured to status error", - "err", "Status is not found in job") - return nil, nil - } - - statusMap := status.(map[string]interface{}) - jobStatus := commonv1.JobStatus{} - err := runtime.DefaultUnstructuredConverter.FromUnstructured(statusMap, &jobStatus) - if err != nil { - kfLogger.Error(err, "Convert unstructured to status error") - return nil, err - } - // Get the latest condition and set it to jobCondition. - if len(jobStatus.Conditions) > 0 { - lc := jobStatus.Conditions[len(jobStatus.Conditions)-1] - jobCondition.Type = lc.Type - jobCondition.Message = lc.Message - jobCondition.Status = lc.Status - jobCondition.Reason = lc.Reason - } - - return &jobCondition, nil -} - -// IsTrainingContainer returns if the c is the actual training container. -func (k Kubeflow) IsTrainingContainer(index int, c corev1.Container) bool { - switch k.Kind { - case consts.JobKindTF: - if c.Name == tfv1.DefaultContainerName { - return true - } - case consts.JobKindPyTorch: - if c.Name == pytorchv1.DefaultContainerName { - return true - } - default: - kfLogger.Info("Invalid Katib worker kind", "JobKind", k.Kind) - return false - } - return false -} - -func (k Kubeflow) MutateJob(*v1alpha3.Trial, *unstructured.Unstructured) error { - return nil -} - -func (k *Kubeflow) Create(kind string) Provider { - return &Kubeflow{Kind: kind} -} - -func init() { - ProviderRegistry[consts.JobKindTF] = &Kubeflow{} - SupportedJobList[consts.JobKindTF] = schema.GroupVersionKind{ - Group: "kubeflow.org", - Version: "v1", - Kind: consts.JobKindTF, - } - JobRoleMap[consts.JobKindTF] = []string{consts.JobRole, consts.JobRoleTF} - ProviderRegistry[consts.JobKindPyTorch] = &Kubeflow{} - SupportedJobList[consts.JobKindPyTorch] = schema.GroupVersionKind{ - Group: "kubeflow.org", - Version: "v1", - Kind: consts.JobKindPyTorch, - } - JobRoleMap[consts.JobKindPyTorch] = []string{consts.JobRole, consts.JobRolePyTorch} -} diff --git a/pkg/job/v1alpha3/provider.go b/pkg/job/v1alpha3/provider.go deleted file mode 100644 index 4daa137c0b1..00000000000 --- a/pkg/job/v1alpha3/provider.go +++ /dev/null @@ -1,44 +0,0 @@ -package v1alpha3 - -import ( - "fmt" - - commonv1 "github.com/kubeflow/tf-operator/pkg/apis/common/v1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/schema" - - "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" -) - -var ( - ProviderRegistry = make(map[string]Provider) - // JobRoleMap is the map which is used to determin if the replica is master. - // Katib will inject metrics collector into master replica. - JobRoleMap = make(map[string][]string) - // SupportedJobList returns the list of the supported jobs' GVK. - SupportedJobList = make(map[string]schema.GroupVersionKind) -) - -// Provider provides utilities for different jobs. -type Provider interface { - // GetDeployedJobStatus get the deployed job status. - GetDeployedJobStatus( - deployedJob *unstructured.Unstructured) (*commonv1.JobCondition, error) - // IsTrainingContainer returns if the c is the actual training container. - IsTrainingContainer(index int, c corev1.Container) bool - // Mutate jobSpec before creation if necessary - MutateJob(*v1alpha3.Trial, *unstructured.Unstructured) error - // Recreate Provider from kind - Create(kind string) Provider -} - -// New creates a new Provider. -func New(kind string) (Provider, error) { - if ptr, ok := ProviderRegistry[kind]; ok { - return ptr.Create(kind), nil - } else { - return nil, fmt.Errorf( - "failed to create the provider: Unknown kind %s", kind) - } -} diff --git a/pkg/metricscollector/v1alpha3/common/__init__.py b/pkg/metricscollector/v1alpha3/common/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/pkg/metricscollector/v1alpha3/common/const.go b/pkg/metricscollector/v1alpha3/common/const.go deleted file mode 100644 index 5e1205fdc7b..00000000000 --- a/pkg/metricscollector/v1alpha3/common/const.go +++ /dev/null @@ -1,43 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -package common - -import ( - "time" - - v1alpha3common "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" -) - -const ( - DefaultPollInterval = time.Second - DefaultTimeout = 0 - DefaultWaitAll = false - - MetricCollectorContainerName = "metrics-collector" - MetricLoggerCollectorContainerName = "metrics-logger-and-collector" - - TrainingCompleted = "completed" - - DefaultFilter = `([\w|-]+)\s*=\s*((-?\d+)(\.\d+)?)` -) - -var ( - AutoInjectMetricsCollecterList = [...]v1alpha3common.CollectorKind{ - v1alpha3common.StdOutCollector, - v1alpha3common.TfEventCollector, - v1alpha3common.FileCollector, - v1alpha3common.PrometheusMetricCollector, - } -) diff --git a/pkg/metricscollector/v1alpha3/common/pns.go b/pkg/metricscollector/v1alpha3/common/pns.go deleted file mode 100644 index c423d2285e6..00000000000 --- a/pkg/metricscollector/v1alpha3/common/pns.go +++ /dev/null @@ -1,128 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package common - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "strings" - "time" - - gops "github.com/mitchellh/go-ps" -) - -var ErrWaitPidTimeout = fmt.Errorf("Timed out waiting for PID to complete") - -type WaitPidsOpts struct { - PollInterval time.Duration - Timeout time.Duration - WaitAll bool - CompletedMarkedDirPath string -} - -func Wait(opts WaitPidsOpts) error { - pids, err := GetOtherMainProcesses() - if err != nil { - return err - } - return WaitPIDS(pids, opts) -} - -func GetOtherMainProcesses() ([]int, error) { - pids := []int{} - allProcs, err := gops.Processes() - if err != nil { - return pids, fmt.Errorf("Failed to list processes: %v", err) - } - - thisPID := os.Getpid() - for _, proc := range allProcs { - pid := proc.Pid() - if pid == 1 || pid == thisPID || proc.PPid() != 0 { - // ignore the pause container, our own pid, and non-root processes - continue - } - pids = append(pids, pid) - } - return pids, nil -} - -func WaitPIDS(pids []int, opts ...WaitPidsOpts) error { - if runtime.GOOS != "linux" { - return fmt.Errorf("Platform '%s' unsupported", runtime.GOOS) - } - if len(pids) == 0 { - return nil - } - waitAll := false - var timeout time.Duration - var pollInterval = time.Second - if len(opts) > 0 { - if opts[0].PollInterval != 0 { - pollInterval = opts[0].PollInterval - } - if opts[0].Timeout != 0 { - timeout = opts[0].Timeout - } - waitAll = opts[0].WaitAll - } - - finishedPids := []int{} - - ticker := time.NewTicker(pollInterval) - defer ticker.Stop() - var timoutCh <-chan time.Time - if timeout != 0 { - timoutCh = time.NewTimer(timeout).C - } - for { - select { - case <-ticker.C: - for _, pid := range pids { - path := fmt.Sprintf("/proc/%d", pid) - _, err := os.Stat(path) - if err != nil { - if os.IsNotExist(err) { - if opts[0].CompletedMarkedDirPath != "" { - markFile := filepath.Join(opts[0].CompletedMarkedDirPath, fmt.Sprintf("%d.pid", pid)) - if data, err := ioutil.ReadFile(markFile); err != nil { - return fmt.Errorf("Process %d hadn't completed: %v", pid, err) - } else { - if strings.TrimSpace(string(data)) != TrainingCompleted { - return fmt.Errorf("Process %d hadn't completed", pid) - } - } - } - if waitAll { - finishedPids = append(finishedPids, pid) - if len(finishedPids) == len(pids) { - return nil - } - } else { - return nil - } - } - return fmt.Errorf("Fail to check process info: %v", err) - } - } - case <-timoutCh: - return ErrWaitPidTimeout - } - } -} diff --git a/pkg/metricscollector/v1alpha3/common/pns.py b/pkg/metricscollector/v1alpha3/common/pns.py deleted file mode 100644 index f37e3f45e42..00000000000 --- a/pkg/metricscollector/v1alpha3/common/pns.py +++ /dev/null @@ -1,45 +0,0 @@ -import os -import psutil -import time - -def GetOtherMainProcesses(): - this_pid = psutil.Process().pid - pids = set() - for proc in psutil.process_iter(): - pid = proc.pid - ppid = proc.ppid() - if pid == 1 or pid == this_pid or ppid != 0: - # ignore the pause container, our own pid, and non-root processes - continue - pids.add(pid) - return pids - -def WaitPIDs(pids, poll_interval_seconds=1, timeout_seconds=0, is_wait_all=False, completed_marked_dir=""): - start = 0 - pids = set(pids) - if poll_interval_seconds <= 0: - raise Exception("Poll interval seconds must be a positive integer") - while (timeout_seconds <= 0 or start < timeout_seconds) and len(pids) > 0: - stop_pids = set() - for pid in pids: - path = "/proc/%d" % pid - if os.path.isdir(path): - continue - else: - if completed_marked_dir: - mark_file = os.path.join(completed_marked_dir, "%d.pid" % pid) - with open(mark_file) as file_obj: - contents = file_obj.read() - if contents.strip() != "completed": - raise Exception("Pid %d hadn't completed" % pid) - if is_wait_all: - stop_pids.add(pid) - else: - return - if is_wait_all: - pids = pids - stop_pids - time.sleep(poll_interval_seconds) - start = start + poll_interval_seconds - -def WaitOtherMainProcesses(poll_interval_seconds=1, timeout_seconds=0, is_wait_all=False, completed_marked_dir=""): - return WaitPIDs(GetOtherMainProcesses(), poll_interval_seconds, timeout_seconds, is_wait_all, completed_marked_dir) diff --git a/pkg/metricscollector/v1alpha3/file-metricscollector/file-metricscollector.go b/pkg/metricscollector/v1alpha3/file-metricscollector/file-metricscollector.go deleted file mode 100644 index e6d86cff0b6..00000000000 --- a/pkg/metricscollector/v1alpha3/file-metricscollector/file-metricscollector.go +++ /dev/null @@ -1,95 +0,0 @@ -package sidecarmetricscollector - -import ( - "io/ioutil" - "os" - "regexp" - "strings" - "time" - - v1alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - "github.com/kubeflow/katib/pkg/metricscollector/v1alpha3/common" - "k8s.io/klog" -) - -func CollectObservationLog(fileName string, metrics []string, filters []string) (*v1alpha3.ObservationLog, error) { - file, err := os.Open(fileName) - if err != nil { - return nil, err - } - defer file.Close() - content, err := ioutil.ReadAll(file) - logs := string(content) - olog, err := parseLogs(strings.Split(logs, "\n"), metrics, filters) - return olog, err -} - -func parseLogs(logs []string, metrics []string, filters []string) (*v1alpha3.ObservationLog, error) { - olog := &v1alpha3.ObservationLog{} - metricRegList := getFilterRegexpList(filters) - mlogs := make([]*v1alpha3.MetricLog, 0, len(logs)) - - for _, logline := range logs { - // skip line which doesn't contain any metrics keywords, avoiding unnecessary pattern match - isObjLine := false - for _, m := range metrics { - if strings.Contains(logline, m) { - isObjLine = true - break - } - } - if !isObjLine { - continue - } - - timestamp := time.Time{}.UTC().Format(time.RFC3339) - ls := strings.SplitN(logline, " ", 2) - if len(ls) != 2 { - klog.Warningf("Metrics will not have timestamp since %s doesn't begin with timestamp string", logline) - } else { - if _, err := time.Parse(time.RFC3339Nano, ls[0]); err != nil { - klog.Warningf("Metrics will not have timestamp since error parsing time %s: %v", ls[0], err) - } else { - timestamp = ls[0] - } - } - - for _, metricReg := range metricRegList { - matchStrs := metricReg.FindAllStringSubmatch(logline, -1) - for _, kevList := range matchStrs { - if len(kevList) < 3 { - continue - } - name := strings.TrimSpace(kevList[1]) - value := strings.TrimSpace(kevList[2]) - for _, m := range metrics { - if name != m { - continue - } - mlogs = append(mlogs, &v1alpha3.MetricLog{ - TimeStamp: timestamp, - Metric: &v1alpha3.Metric{ - Name: name, - Value: value, - }, - }) - break - } - } - } - } - olog.MetricLogs = mlogs - return olog, nil -} - -func getFilterRegexpList(filters []string) []*regexp.Regexp { - regexpList := make([]*regexp.Regexp, 0, len(filters)) - if len(filters) == 0 { - filters = append(filters, common.DefaultFilter) - } - for _, filter := range filters { - reg, _ := regexp.Compile(filter) - regexpList = append(regexpList, reg) - } - return regexpList -} diff --git a/pkg/metricscollector/v1alpha3/tfevent-metricscollector/__init__.py b/pkg/metricscollector/v1alpha3/tfevent-metricscollector/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/pkg/metricscollector/v1alpha3/tfevent-metricscollector/tfevent_loader.py b/pkg/metricscollector/v1alpha3/tfevent-metricscollector/tfevent_loader.py deleted file mode 100644 index e0dd7b7dc46..00000000000 --- a/pkg/metricscollector/v1alpha3/tfevent-metricscollector/tfevent_loader.py +++ /dev/null @@ -1,67 +0,0 @@ -import tensorflow as tf -import os -from datetime import datetime -import rfc3339 -import grpc -import api_pb2 -import api_pb2_grpc -import sys -from logging import getLogger, StreamHandler, INFO - -# TFEventFileParser parses tfevent files and returns an ObservationLog of the metrics specified. -# When the event file is under a directory(e.g. test dir), please specify "{{dirname}}/{{metrics name}}" -# For example, in the TensorFlow official tutorial for mnist with summary (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py), -# the "accuracy" metric is saved under "train" and "test" directories. So in Katib, please specify name of metrics as "train/accuracy" and "test/accuracy". - - -class TFEventFileParser: - def find_all_files(self, directory): - for root, dirs, files in os.walk(directory): - yield root - for f in files: - yield os.path.join(root, f) - - def parse_summary(self, tfefile, metrics): - metric_logs = [] - for summary in tf.train.summary_iterator(tfefile): - paths = tfefile.split("/") - for v in summary.summary.value: - for m in metrics: - tag = str(v.tag) - if len(paths) >= 2 and len(m.split("/")) >= 2: - tag = str(paths[-2]+"/" + v.tag) - if tag.startswith(m): - ml = api_pb2.MetricLog( - time_stamp=rfc3339.rfc3339(datetime.fromtimestamp(summary.wall_time)), - metric=api_pb2.Metric( - name=m, - value=str(v.simple_value) - ) - ) - metric_logs.append(ml) - return metric_logs - - -class MetricsCollector: - def __init__(self, metric_names): - self.logger = getLogger(__name__) - handler = StreamHandler() - handler.setLevel(INFO) - self.logger.setLevel(INFO) - self.logger.addHandler(handler) - self.logger.propagate = False - self.metrics = metric_names - self.parser = TFEventFileParser() - - def parse_file(self, directory): - mls = [] - for f in self.parser.find_all_files(directory): - if os.path.isdir(f): - continue - try: - self.logger.info(f + " will be parsed.") - mls.extend(self.parser.parse_summary(f, self.metrics)) - except Exception as e: - self.logger.warning("Unexpected error: " + str(e)) - continue - return api_pb2.ObservationLog(metric_logs=mls) diff --git a/pkg/mock/v1alpha3/api/manager.go b/pkg/mock/v1alpha3/api/manager.go deleted file mode 100644 index 238e6d58a2c..00000000000 --- a/pkg/mock/v1alpha3/api/manager.go +++ /dev/null @@ -1,96 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/kubeflow/katib/pkg/apis/manager/v1alpha3 (interfaces: ManagerClient) - -// Package mock is a generated GoMock package. -package mock - -import ( - context "context" - gomock "github.com/golang/mock/gomock" - api_v1_alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - grpc "google.golang.org/grpc" - reflect "reflect" -) - -// MockManagerClient is a mock of ManagerClient interface. -type MockManagerClient struct { - ctrl *gomock.Controller - recorder *MockManagerClientMockRecorder -} - -// MockManagerClientMockRecorder is the mock recorder for MockManagerClient. -type MockManagerClientMockRecorder struct { - mock *MockManagerClient -} - -// NewMockManagerClient creates a new mock instance. -func NewMockManagerClient(ctrl *gomock.Controller) *MockManagerClient { - mock := &MockManagerClient{ctrl: ctrl} - mock.recorder = &MockManagerClientMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockManagerClient) EXPECT() *MockManagerClientMockRecorder { - return m.recorder -} - -// DeleteObservationLog mocks base method. -func (m *MockManagerClient) DeleteObservationLog(arg0 context.Context, arg1 *api_v1_alpha3.DeleteObservationLogRequest, arg2 ...grpc.CallOption) (*api_v1_alpha3.DeleteObservationLogReply, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1} - for _, a := range arg2 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "DeleteObservationLog", varargs...) - ret0, _ := ret[0].(*api_v1_alpha3.DeleteObservationLogReply) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DeleteObservationLog indicates an expected call of DeleteObservationLog. -func (mr *MockManagerClientMockRecorder) DeleteObservationLog(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1}, arg2...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObservationLog", reflect.TypeOf((*MockManagerClient)(nil).DeleteObservationLog), varargs...) -} - -// GetObservationLog mocks base method. -func (m *MockManagerClient) GetObservationLog(arg0 context.Context, arg1 *api_v1_alpha3.GetObservationLogRequest, arg2 ...grpc.CallOption) (*api_v1_alpha3.GetObservationLogReply, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1} - for _, a := range arg2 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetObservationLog", varargs...) - ret0, _ := ret[0].(*api_v1_alpha3.GetObservationLogReply) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetObservationLog indicates an expected call of GetObservationLog. -func (mr *MockManagerClientMockRecorder) GetObservationLog(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1}, arg2...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObservationLog", reflect.TypeOf((*MockManagerClient)(nil).GetObservationLog), varargs...) -} - -// ReportObservationLog mocks base method. -func (m *MockManagerClient) ReportObservationLog(arg0 context.Context, arg1 *api_v1_alpha3.ReportObservationLogRequest, arg2 ...grpc.CallOption) (*api_v1_alpha3.ReportObservationLogReply, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1} - for _, a := range arg2 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "ReportObservationLog", varargs...) - ret0, _ := ret[0].(*api_v1_alpha3.ReportObservationLogReply) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ReportObservationLog indicates an expected call of ReportObservationLog. -func (mr *MockManagerClientMockRecorder) ReportObservationLog(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1}, arg2...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReportObservationLog", reflect.TypeOf((*MockManagerClient)(nil).ReportObservationLog), varargs...) -} diff --git a/pkg/mock/v1alpha3/api/suggestion.go b/pkg/mock/v1alpha3/api/suggestion.go deleted file mode 100644 index 8d3d6a102af..00000000000 --- a/pkg/mock/v1alpha3/api/suggestion.go +++ /dev/null @@ -1,76 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/kubeflow/katib/pkg/apis/manager/v1alpha3 (interfaces: SuggestionClient) - -// Package mock is a generated GoMock package. -package mock - -import ( - context "context" - gomock "github.com/golang/mock/gomock" - api_v1_alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - grpc "google.golang.org/grpc" - reflect "reflect" -) - -// MockSuggestionClient is a mock of SuggestionClient interface. -type MockSuggestionClient struct { - ctrl *gomock.Controller - recorder *MockSuggestionClientMockRecorder -} - -// MockSuggestionClientMockRecorder is the mock recorder for MockSuggestionClient. -type MockSuggestionClientMockRecorder struct { - mock *MockSuggestionClient -} - -// NewMockSuggestionClient creates a new mock instance. -func NewMockSuggestionClient(ctrl *gomock.Controller) *MockSuggestionClient { - mock := &MockSuggestionClient{ctrl: ctrl} - mock.recorder = &MockSuggestionClientMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockSuggestionClient) EXPECT() *MockSuggestionClientMockRecorder { - return m.recorder -} - -// GetSuggestions mocks base method. -func (m *MockSuggestionClient) GetSuggestions(arg0 context.Context, arg1 *api_v1_alpha3.GetSuggestionsRequest, arg2 ...grpc.CallOption) (*api_v1_alpha3.GetSuggestionsReply, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1} - for _, a := range arg2 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetSuggestions", varargs...) - ret0, _ := ret[0].(*api_v1_alpha3.GetSuggestionsReply) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetSuggestions indicates an expected call of GetSuggestions. -func (mr *MockSuggestionClientMockRecorder) GetSuggestions(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1}, arg2...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSuggestions", reflect.TypeOf((*MockSuggestionClient)(nil).GetSuggestions), varargs...) -} - -// ValidateAlgorithmSettings mocks base method. -func (m *MockSuggestionClient) ValidateAlgorithmSettings(arg0 context.Context, arg1 *api_v1_alpha3.ValidateAlgorithmSettingsRequest, arg2 ...grpc.CallOption) (*api_v1_alpha3.ValidateAlgorithmSettingsReply, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1} - for _, a := range arg2 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "ValidateAlgorithmSettings", varargs...) - ret0, _ := ret[0].(*api_v1_alpha3.ValidateAlgorithmSettingsReply) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ValidateAlgorithmSettings indicates an expected call of ValidateAlgorithmSettings. -func (mr *MockSuggestionClientMockRecorder) ValidateAlgorithmSettings(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1}, arg2...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateAlgorithmSettings", reflect.TypeOf((*MockSuggestionClient)(nil).ValidateAlgorithmSettings), varargs...) -} diff --git a/pkg/mock/v1alpha3/db/db.go b/pkg/mock/v1alpha3/db/db.go deleted file mode 100644 index d530497d724..00000000000 --- a/pkg/mock/v1alpha3/db/db.go +++ /dev/null @@ -1,103 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/kubeflow/katib/pkg/db/v1alpha3/common (interfaces: KatibDBInterface) - -// Package mock is a generated GoMock package. -package mock - -import ( - gomock "github.com/golang/mock/gomock" - api_v1_alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - reflect "reflect" -) - -// MockKatibDBInterface is a mock of KatibDBInterface interface. -type MockKatibDBInterface struct { - ctrl *gomock.Controller - recorder *MockKatibDBInterfaceMockRecorder -} - -// MockKatibDBInterfaceMockRecorder is the mock recorder for MockKatibDBInterface. -type MockKatibDBInterfaceMockRecorder struct { - mock *MockKatibDBInterface -} - -// NewMockKatibDBInterface creates a new mock instance. -func NewMockKatibDBInterface(ctrl *gomock.Controller) *MockKatibDBInterface { - mock := &MockKatibDBInterface{ctrl: ctrl} - mock.recorder = &MockKatibDBInterfaceMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockKatibDBInterface) EXPECT() *MockKatibDBInterfaceMockRecorder { - return m.recorder -} - -// DBInit mocks base method. -func (m *MockKatibDBInterface) DBInit() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "DBInit") -} - -// DBInit indicates an expected call of DBInit. -func (mr *MockKatibDBInterfaceMockRecorder) DBInit() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DBInit", reflect.TypeOf((*MockKatibDBInterface)(nil).DBInit)) -} - -// DeleteObservationLog mocks base method. -func (m *MockKatibDBInterface) DeleteObservationLog(arg0 string) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteObservationLog", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// DeleteObservationLog indicates an expected call of DeleteObservationLog. -func (mr *MockKatibDBInterfaceMockRecorder) DeleteObservationLog(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObservationLog", reflect.TypeOf((*MockKatibDBInterface)(nil).DeleteObservationLog), arg0) -} - -// GetObservationLog mocks base method. -func (m *MockKatibDBInterface) GetObservationLog(arg0, arg1, arg2, arg3 string) (*api_v1_alpha3.ObservationLog, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetObservationLog", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*api_v1_alpha3.ObservationLog) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetObservationLog indicates an expected call of GetObservationLog. -func (mr *MockKatibDBInterfaceMockRecorder) GetObservationLog(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObservationLog", reflect.TypeOf((*MockKatibDBInterface)(nil).GetObservationLog), arg0, arg1, arg2, arg3) -} - -// RegisterObservationLog mocks base method. -func (m *MockKatibDBInterface) RegisterObservationLog(arg0 string, arg1 *api_v1_alpha3.ObservationLog) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "RegisterObservationLog", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 -} - -// RegisterObservationLog indicates an expected call of RegisterObservationLog. -func (mr *MockKatibDBInterfaceMockRecorder) RegisterObservationLog(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterObservationLog", reflect.TypeOf((*MockKatibDBInterface)(nil).RegisterObservationLog), arg0, arg1) -} - -// SelectOne mocks base method. -func (m *MockKatibDBInterface) SelectOne() error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SelectOne") - ret0, _ := ret[0].(error) - return ret0 -} - -// SelectOne indicates an expected call of SelectOne. -func (mr *MockKatibDBInterfaceMockRecorder) SelectOne() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SelectOne", reflect.TypeOf((*MockKatibDBInterface)(nil).SelectOne)) -} diff --git a/pkg/mock/v1alpha3/experiment/manifest/generator.go b/pkg/mock/v1alpha3/experiment/manifest/generator.go deleted file mode 100644 index 3aa0510f82c..00000000000 --- a/pkg/mock/v1alpha3/experiment/manifest/generator.go +++ /dev/null @@ -1,108 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/manifest (interfaces: Generator) - -// Package mock is a generated GoMock package. -package mock - -import ( - gomock "github.com/golang/mock/gomock" - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - v1alpha30 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - reflect "reflect" - client "sigs.k8s.io/controller-runtime/pkg/client" -) - -// MockGenerator is a mock of Generator interface. -type MockGenerator struct { - ctrl *gomock.Controller - recorder *MockGeneratorMockRecorder -} - -// MockGeneratorMockRecorder is the mock recorder for MockGenerator. -type MockGeneratorMockRecorder struct { - mock *MockGenerator -} - -// NewMockGenerator creates a new mock instance. -func NewMockGenerator(ctrl *gomock.Controller) *MockGenerator { - mock := &MockGenerator{ctrl: ctrl} - mock.recorder = &MockGeneratorMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockGenerator) EXPECT() *MockGeneratorMockRecorder { - return m.recorder -} - -// GetMetricsCollectorImage mocks base method. -func (m *MockGenerator) GetMetricsCollectorImage(arg0 v1alpha3.CollectorKind) (string, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetMetricsCollectorImage", arg0) - ret0, _ := ret[0].(string) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetMetricsCollectorImage indicates an expected call of GetMetricsCollectorImage. -func (mr *MockGeneratorMockRecorder) GetMetricsCollectorImage(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMetricsCollectorImage", reflect.TypeOf((*MockGenerator)(nil).GetMetricsCollectorImage), arg0) -} - -// GetRunSpec mocks base method. -func (m *MockGenerator) GetRunSpec(arg0 *v1alpha30.Experiment, arg1, arg2, arg3 string) (string, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetRunSpec", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(string) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetRunSpec indicates an expected call of GetRunSpec. -func (mr *MockGeneratorMockRecorder) GetRunSpec(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRunSpec", reflect.TypeOf((*MockGenerator)(nil).GetRunSpec), arg0, arg1, arg2, arg3) -} - -// GetRunSpecWithHyperParameters mocks base method. -func (m *MockGenerator) GetRunSpecWithHyperParameters(arg0 *v1alpha30.Experiment, arg1, arg2, arg3 string, arg4 []v1alpha3.ParameterAssignment) (string, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetRunSpecWithHyperParameters", arg0, arg1, arg2, arg3, arg4) - ret0, _ := ret[0].(string) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetRunSpecWithHyperParameters indicates an expected call of GetRunSpecWithHyperParameters. -func (mr *MockGeneratorMockRecorder) GetRunSpecWithHyperParameters(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRunSpecWithHyperParameters", reflect.TypeOf((*MockGenerator)(nil).GetRunSpecWithHyperParameters), arg0, arg1, arg2, arg3, arg4) -} - -// GetSuggestionConfigData mocks base method. -func (m *MockGenerator) GetSuggestionConfigData(arg0 string) (map[string]string, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetSuggestionConfigData", arg0) - ret0, _ := ret[0].(map[string]string) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetSuggestionConfigData indicates an expected call of GetSuggestionConfigData. -func (mr *MockGeneratorMockRecorder) GetSuggestionConfigData(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSuggestionConfigData", reflect.TypeOf((*MockGenerator)(nil).GetSuggestionConfigData), arg0) -} - -// InjectClient mocks base method. -func (m *MockGenerator) InjectClient(arg0 client.Client) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "InjectClient", arg0) -} - -// InjectClient indicates an expected call of InjectClient. -func (mr *MockGeneratorMockRecorder) InjectClient(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InjectClient", reflect.TypeOf((*MockGenerator)(nil).InjectClient), arg0) -} diff --git a/pkg/mock/v1alpha3/experiment/suggestion/suggestion.go b/pkg/mock/v1alpha3/experiment/suggestion/suggestion.go deleted file mode 100644 index bff20c922a1..00000000000 --- a/pkg/mock/v1alpha3/experiment/suggestion/suggestion.go +++ /dev/null @@ -1,78 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/suggestion (interfaces: Suggestion) - -// Package mock is a generated GoMock package. -package mock - -import ( - gomock "github.com/golang/mock/gomock" - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - v1alpha30 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - reflect "reflect" -) - -// MockSuggestion is a mock of Suggestion interface. -type MockSuggestion struct { - ctrl *gomock.Controller - recorder *MockSuggestionMockRecorder -} - -// MockSuggestionMockRecorder is the mock recorder for MockSuggestion. -type MockSuggestionMockRecorder struct { - mock *MockSuggestion -} - -// NewMockSuggestion creates a new mock instance. -func NewMockSuggestion(ctrl *gomock.Controller) *MockSuggestion { - mock := &MockSuggestion{ctrl: ctrl} - mock.recorder = &MockSuggestionMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockSuggestion) EXPECT() *MockSuggestionMockRecorder { - return m.recorder -} - -// GetOrCreateSuggestion mocks base method. -func (m *MockSuggestion) GetOrCreateSuggestion(arg0 *v1alpha3.Experiment, arg1 int32) (*v1alpha30.Suggestion, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetOrCreateSuggestion", arg0, arg1) - ret0, _ := ret[0].(*v1alpha30.Suggestion) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetOrCreateSuggestion indicates an expected call of GetOrCreateSuggestion. -func (mr *MockSuggestionMockRecorder) GetOrCreateSuggestion(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOrCreateSuggestion", reflect.TypeOf((*MockSuggestion)(nil).GetOrCreateSuggestion), arg0, arg1) -} - -// UpdateSuggestion mocks base method. -func (m *MockSuggestion) UpdateSuggestion(arg0 *v1alpha30.Suggestion) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateSuggestion", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// UpdateSuggestion indicates an expected call of UpdateSuggestion. -func (mr *MockSuggestionMockRecorder) UpdateSuggestion(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSuggestion", reflect.TypeOf((*MockSuggestion)(nil).UpdateSuggestion), arg0) -} - -// UpdateSuggestionStatus mocks base method. -func (m *MockSuggestion) UpdateSuggestionStatus(arg0 *v1alpha30.Suggestion) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateSuggestionStatus", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// UpdateSuggestionStatus indicates an expected call of UpdateSuggestionStatus. -func (mr *MockSuggestionMockRecorder) UpdateSuggestionStatus(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSuggestionStatus", reflect.TypeOf((*MockSuggestion)(nil).UpdateSuggestionStatus), arg0) -} diff --git a/pkg/mock/v1alpha3/trial/managerclient/katibmanager.go b/pkg/mock/v1alpha3/trial/managerclient/katibmanager.go deleted file mode 100644 index 1432dd26a47..00000000000 --- a/pkg/mock/v1alpha3/trial/managerclient/katibmanager.go +++ /dev/null @@ -1,65 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/kubeflow/katib/pkg/controller.v1alpha3/trial/managerclient (interfaces: ManagerClient) - -// Package mock is a generated GoMock package. -package mock - -import ( - gomock "github.com/golang/mock/gomock" - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - api_v1_alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - reflect "reflect" -) - -// MockManagerClient is a mock of ManagerClient interface. -type MockManagerClient struct { - ctrl *gomock.Controller - recorder *MockManagerClientMockRecorder -} - -// MockManagerClientMockRecorder is the mock recorder for MockManagerClient. -type MockManagerClientMockRecorder struct { - mock *MockManagerClient -} - -// NewMockManagerClient creates a new mock instance. -func NewMockManagerClient(ctrl *gomock.Controller) *MockManagerClient { - mock := &MockManagerClient{ctrl: ctrl} - mock.recorder = &MockManagerClientMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockManagerClient) EXPECT() *MockManagerClientMockRecorder { - return m.recorder -} - -// DeleteTrialObservationLog mocks base method. -func (m *MockManagerClient) DeleteTrialObservationLog(arg0 *v1alpha3.Trial) (*api_v1_alpha3.DeleteObservationLogReply, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteTrialObservationLog", arg0) - ret0, _ := ret[0].(*api_v1_alpha3.DeleteObservationLogReply) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DeleteTrialObservationLog indicates an expected call of DeleteTrialObservationLog. -func (mr *MockManagerClientMockRecorder) DeleteTrialObservationLog(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTrialObservationLog", reflect.TypeOf((*MockManagerClient)(nil).DeleteTrialObservationLog), arg0) -} - -// GetTrialObservationLog mocks base method. -func (m *MockManagerClient) GetTrialObservationLog(arg0 *v1alpha3.Trial) (*api_v1_alpha3.GetObservationLogReply, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetTrialObservationLog", arg0) - ret0, _ := ret[0].(*api_v1_alpha3.GetObservationLogReply) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetTrialObservationLog indicates an expected call of GetTrialObservationLog. -func (mr *MockManagerClientMockRecorder) GetTrialObservationLog(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTrialObservationLog", reflect.TypeOf((*MockManagerClient)(nil).GetTrialObservationLog), arg0) -} diff --git a/pkg/mock/v1alpha3/util/katibclient/katibclient.go b/pkg/mock/v1alpha3/util/katibclient/katibclient.go deleted file mode 100644 index e42264e1b41..00000000000 --- a/pkg/mock/v1alpha3/util/katibclient/katibclient.go +++ /dev/null @@ -1,288 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/kubeflow/katib/pkg/util/v1alpha3/katibclient (interfaces: Client) - -// Package mock is a generated GoMock package. -package mock - -import ( - gomock "github.com/golang/mock/gomock" - v1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - v1alpha30 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - v1alpha31 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - v1 "k8s.io/api/core/v1" - reflect "reflect" - client "sigs.k8s.io/controller-runtime/pkg/client" -) - -// MockClient is a mock of Client interface. -type MockClient struct { - ctrl *gomock.Controller - recorder *MockClientMockRecorder -} - -// MockClientMockRecorder is the mock recorder for MockClient. -type MockClientMockRecorder struct { - mock *MockClient -} - -// NewMockClient creates a new mock instance. -func NewMockClient(ctrl *gomock.Controller) *MockClient { - mock := &MockClient{ctrl: ctrl} - mock.recorder = &MockClientMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockClient) EXPECT() *MockClientMockRecorder { - return m.recorder -} - -// CreateExperiment mocks base method. -func (m *MockClient) CreateExperiment(arg0 *v1alpha3.Experiment, arg1 ...string) error { - m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "CreateExperiment", varargs...) - ret0, _ := ret[0].(error) - return ret0 -} - -// CreateExperiment indicates an expected call of CreateExperiment. -func (mr *MockClientMockRecorder) CreateExperiment(arg0 interface{}, arg1 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateExperiment", reflect.TypeOf((*MockClient)(nil).CreateExperiment), varargs...) -} - -// DeleteExperiment mocks base method. -func (m *MockClient) DeleteExperiment(arg0 *v1alpha3.Experiment, arg1 ...string) error { - m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "DeleteExperiment", varargs...) - ret0, _ := ret[0].(error) - return ret0 -} - -// DeleteExperiment indicates an expected call of DeleteExperiment. -func (mr *MockClientMockRecorder) DeleteExperiment(arg0 interface{}, arg1 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteExperiment", reflect.TypeOf((*MockClient)(nil).DeleteExperiment), varargs...) -} - -// GetClient mocks base method. -func (m *MockClient) GetClient() client.Client { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetClient") - ret0, _ := ret[0].(client.Client) - return ret0 -} - -// GetClient indicates an expected call of GetClient. -func (mr *MockClientMockRecorder) GetClient() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetClient", reflect.TypeOf((*MockClient)(nil).GetClient)) -} - -// GetConfigMap mocks base method. -func (m *MockClient) GetConfigMap(arg0 string, arg1 ...string) (map[string]string, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetConfigMap", varargs...) - ret0, _ := ret[0].(map[string]string) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetConfigMap indicates an expected call of GetConfigMap. -func (mr *MockClientMockRecorder) GetConfigMap(arg0 interface{}, arg1 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConfigMap", reflect.TypeOf((*MockClient)(nil).GetConfigMap), varargs...) -} - -// GetExperiment mocks base method. -func (m *MockClient) GetExperiment(arg0 string, arg1 ...string) (*v1alpha3.Experiment, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetExperiment", varargs...) - ret0, _ := ret[0].(*v1alpha3.Experiment) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetExperiment indicates an expected call of GetExperiment. -func (mr *MockClientMockRecorder) GetExperiment(arg0 interface{}, arg1 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetExperiment", reflect.TypeOf((*MockClient)(nil).GetExperiment), varargs...) -} - -// GetExperimentList mocks base method. -func (m *MockClient) GetExperimentList(arg0 ...string) (*v1alpha3.ExperimentList, error) { - m.ctrl.T.Helper() - varargs := []interface{}{} - for _, a := range arg0 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetExperimentList", varargs...) - ret0, _ := ret[0].(*v1alpha3.ExperimentList) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetExperimentList indicates an expected call of GetExperimentList. -func (mr *MockClientMockRecorder) GetExperimentList(arg0 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetExperimentList", reflect.TypeOf((*MockClient)(nil).GetExperimentList), arg0...) -} - -// GetNamespaceList mocks base method. -func (m *MockClient) GetNamespaceList() (*v1.NamespaceList, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetNamespaceList") - ret0, _ := ret[0].(*v1.NamespaceList) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetNamespaceList indicates an expected call of GetNamespaceList. -func (mr *MockClientMockRecorder) GetNamespaceList() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNamespaceList", reflect.TypeOf((*MockClient)(nil).GetNamespaceList)) -} - -// GetSuggestion mocks base method. -func (m *MockClient) GetSuggestion(arg0 string, arg1 ...string) (*v1alpha30.Suggestion, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetSuggestion", varargs...) - ret0, _ := ret[0].(*v1alpha30.Suggestion) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetSuggestion indicates an expected call of GetSuggestion. -func (mr *MockClientMockRecorder) GetSuggestion(arg0 interface{}, arg1 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSuggestion", reflect.TypeOf((*MockClient)(nil).GetSuggestion), varargs...) -} - -// GetTrial mocks base method. -func (m *MockClient) GetTrial(arg0 string, arg1 ...string) (*v1alpha31.Trial, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetTrial", varargs...) - ret0, _ := ret[0].(*v1alpha31.Trial) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetTrial indicates an expected call of GetTrial. -func (mr *MockClientMockRecorder) GetTrial(arg0 interface{}, arg1 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTrial", reflect.TypeOf((*MockClient)(nil).GetTrial), varargs...) -} - -// GetTrialList mocks base method. -func (m *MockClient) GetTrialList(arg0 string, arg1 ...string) (*v1alpha31.TrialList, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetTrialList", varargs...) - ret0, _ := ret[0].(*v1alpha31.TrialList) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetTrialList indicates an expected call of GetTrialList. -func (mr *MockClientMockRecorder) GetTrialList(arg0 interface{}, arg1 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTrialList", reflect.TypeOf((*MockClient)(nil).GetTrialList), varargs...) -} - -// GetTrialTemplates mocks base method. -func (m *MockClient) GetTrialTemplates(arg0 ...string) (*v1.ConfigMapList, error) { - m.ctrl.T.Helper() - varargs := []interface{}{} - for _, a := range arg0 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetTrialTemplates", varargs...) - ret0, _ := ret[0].(*v1.ConfigMapList) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetTrialTemplates indicates an expected call of GetTrialTemplates. -func (mr *MockClientMockRecorder) GetTrialTemplates(arg0 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTrialTemplates", reflect.TypeOf((*MockClient)(nil).GetTrialTemplates), arg0...) -} - -// InjectClient mocks base method. -func (m *MockClient) InjectClient(arg0 client.Client) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "InjectClient", arg0) -} - -// InjectClient indicates an expected call of InjectClient. -func (mr *MockClientMockRecorder) InjectClient(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InjectClient", reflect.TypeOf((*MockClient)(nil).InjectClient), arg0) -} - -// UpdateConfigMap mocks base method. -func (m *MockClient) UpdateConfigMap(arg0 *v1.ConfigMap) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateConfigMap", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// UpdateConfigMap indicates an expected call of UpdateConfigMap. -func (mr *MockClientMockRecorder) UpdateConfigMap(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateConfigMap", reflect.TypeOf((*MockClient)(nil).UpdateConfigMap), arg0) -} - -// UpdateExperiment mocks base method. -func (m *MockClient) UpdateExperiment(arg0 *v1alpha3.Experiment, arg1 ...string) error { - m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "UpdateExperiment", varargs...) - ret0, _ := ret[0].(error) - return ret0 -} - -// UpdateExperiment indicates an expected call of UpdateExperiment. -func (mr *MockClientMockRecorder) UpdateExperiment(arg0 interface{}, arg1 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateExperiment", reflect.TypeOf((*MockClient)(nil).UpdateExperiment), varargs...) -} diff --git a/pkg/suggestion/v1alpha3/bayesianoptimization/__init__.py b/pkg/suggestion/v1alpha3/bayesianoptimization/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/pkg/suggestion/v1alpha3/bayesianoptimization/acquisition_func.py b/pkg/suggestion/v1alpha3/bayesianoptimization/acquisition_func.py deleted file mode 100644 index 9e061c6bd76..00000000000 --- a/pkg/suggestion/v1alpha3/bayesianoptimization/acquisition_func.py +++ /dev/null @@ -1,36 +0,0 @@ -""" module for acquisition function""" -import numpy as np -from scipy.stats import norm - - -class AcquisitionFunc: - """ - Class for acquisition function with options for expected improvement, - probability of improvement, or lower confident bound. - """ - - def __init__(self, model, current_optimal, mode="ei", trade_off=0.01): - """ - :param mode: pi: probability of improvement, ei: expected improvement, lcb: lower confident bound - :param trade_off: a parameter to control the trade off between exploiting and exploring - :param model_type: gp: gaussian process, rf: random forest - """ - self.model = model - self.current_optimal = current_optimal - self.mode = mode - self.trade_off = trade_off - - def compute(self, X_test): - y_mean, y_std, y_variance = self.model.predict(X_test) - - z = (y_mean - self.current_optimal - self.trade_off) / y_std - - if self.mode == "ei": - if y_std.any() < 0.000001: - return 0, y_mean, y_variance - result = y_std * (z * norm.cdf(z) + norm.pdf(z)) - elif self.mode == "pi": - result = norm.cdf(z) - else: - result = - (y_mean - self.trade_off * y_std) - return np.squeeze(result), np.squeeze(y_mean), np.squeeze(y_variance) diff --git a/pkg/suggestion/v1alpha3/bayesianoptimization/algorithm_manager.py b/pkg/suggestion/v1alpha3/bayesianoptimization/algorithm_manager.py deleted file mode 100644 index 0b00d88819d..00000000000 --- a/pkg/suggestion/v1alpha3/bayesianoptimization/algorithm_manager.py +++ /dev/null @@ -1,201 +0,0 @@ -""" module for algorithm manager """ -import numpy as np - -from pkg.apis.manager.v1alpha3.python import api_pb2 - -from pkg.suggestion.v1alpha3.bayesianoptimization.utils import get_logger - - -def deal_with_discrete(feasible_values, current_value): - """ function to embed the current values to the feasible discrete space""" - diff = np.subtract(feasible_values, current_value) - diff = np.absolute(diff) - return feasible_values[np.argmin(diff)] - - -def deal_with_categorical(feasible_values, one_hot_values): - """ function to do the one hot encoding of the categorical values """ - index = np.argmax(one_hot_values) - #index = one_hot_values.argmax() - return feasible_values[int(index)] - - -class AlgorithmManager: - """ class for the algorithm manager - provide some helper functions - """ - - def __init__(self, experiment_name, experiment, parameter_config, X_train, y_train, logger=None): - self.logger = logger if (logger is not None) else get_logger() - self._experiment_name = experiment_name - self._experiment = experiment - self._goal = self._experiment.spec.objective.type - self._dim = parameter_config.dim - self._lowerbound = parameter_config.lower_bounds - self._upperbound = parameter_config.upper_bounds - self._types = parameter_config.parameter_types - self._names = parameter_config.names - # record all the feasible values of discrete type variables - self._discrete_info = parameter_config.discrete_info - self._categorical_info = parameter_config.categorical_info - self._name_id = parameter_config.name_ids - - self._X_train = self._mapping_params(X_train) - self.parse_X() - - self._y_train = y_train - self._parse_metric() - - @property - def experiment_name(self): - """ return the experiment_name """ - return self._experiment_name - - @property - def experiment(self): - """ return the experiment """ - return self._experiment - - @property - def goal(self): - """ return the optimization goal""" - return self._goal - - @property - def dim(self): - """ return the dimension """ - return self._dim - - @property - def lower_bound(self): - """ return the lower bound of all the parameters """ - return self._lowerbound - - @property - def upper_bound(self): - """ return the upper bound of all the parameters """ - return self._upperbound - - @property - def types(self): - """ return the types of all the parameters """ - return self._types - - @property - def names(self): - """ return the names of all the parameters """ - return self._names - - @property - def discrete_info(self): - """ return the info of all the discrete parameters """ - return self._discrete_info - - @property - def categorical_info(self): - """ return the info of all the categorical parameters """ - return self._categorical_info - - @property - def X_train(self): - """ return the training data """ - return self._X_train - - @property - def y_train(self): - """ return the target of the training data""" - return self._y_train - - def _mapping_params(self, parameters_list): - if len(parameters_list) == 0: - return None - ret = [] - for parameters in parameters_list: - maplist = [np.zeros(1)]*len(self._names) - for p in parameters: - self.logger.debug("mapping: %r", p, extra={ - "Experiment": self._experiment_name}) - map_id = self._name_id[p.name] - if self._types[map_id] in [api_pb2.DOUBLE, api_pb2.INT, api_pb2.DISCRETE]: - maplist[map_id] = float(p.value) - elif self._types[map_id] == api_pb2.CATEGORICAL: - for ci in self._categorical_info: - if ci["name"] == p.name: - maplist[map_id] = np.zeros(ci["number"]) - for i, v in enumerate(ci["values"]): - if v == p.value: - maplist[map_id][i] = 1 - break - self.logger.debug("mapped: %r", maplist, extra={ - "Experiment": self._experiment_name}) - ret.append(np.hstack(maplist)) - return ret - - def _parse_metric(self): - """ parse the metric to the dictionary """ - self.logger.info("Ytrain: %r", self._y_train, extra={ - "Experiment": self._experiment_name}) - if not self._y_train: - self._y_train = None - return - y = [] - for metric in self._y_train: - if self._goal == api_pb2.MAXIMIZE: - y.append(float(metric)) - else: - y.append(-float(metric)) - self.logger.debug("Ytrain: %r", y, extra={ - "Experiment": self._experiment_name}) - self._y_train = np.array(y) - - def parse_X(self): - if not self._X_train: - self._X_train = None - return - self.logger.debug("Xtrain: %r", self._X_train, extra={ - "Experiment": self._experiment_name}) - self._X_train = np.array(self._X_train) - - def parse_x_next(self, x_next): - """ parse the next suggestion to the proper format """ - counter = 0 - result = [] - for i in range(len(self._types)): - if self._types[i] == api_pb2.INT: - result.append(int(round(x_next[counter], 0))) - counter = counter + 1 - elif self._types[i] == api_pb2.DISCRETE: - for param in self._discrete_info: - if param["name"] == self._names[i]: - result.append( - deal_with_discrete( - param["values"], x_next[counter]) - ) - counter = counter + 1 - break - elif self._types[i] == api_pb2.CATEGORICAL: - for param in self._categorical_info: - if param["name"] == self._names[i]: - result.append(deal_with_categorical( - feasible_values=param["values"], - one_hot_values=x_next[counter:counter + - param["number"]], - )) - counter = counter + param["number"] - break - elif self._types[i] == api_pb2.DOUBLE: - result.append(x_next[counter]) - counter = counter + 1 - return result - - def convert_to_dict(self, x_next): - """ convert the next suggestion to the dictionary """ - result = [] - for i in range(len(x_next)): - tmp = dict({ - "name": self._names[i], - "value": x_next[i], - "type": self._types[i], - }) - result.append(tmp) - return result diff --git a/pkg/suggestion/v1alpha3/bayesianoptimization/bayesian_optimization_algorithm.py b/pkg/suggestion/v1alpha3/bayesianoptimization/bayesian_optimization_algorithm.py deleted file mode 100644 index fb6d906a7d1..00000000000 --- a/pkg/suggestion/v1alpha3/bayesianoptimization/bayesian_optimization_algorithm.py +++ /dev/null @@ -1,73 +0,0 @@ -""" module for bayesian optimization algorithm """ -import numpy as np -from sklearn.preprocessing import MinMaxScaler - -from pkg.suggestion.v1alpha3.bayesianoptimization.global_optimizer import GlobalOptimizer - - -class BOAlgorithm: - """ class for bayesian optimization """ - - def __init__(self, experiment_name, dim, N, lowerbound, upperbound, X_train, y_train, mode, trade_off, - length_scale, noise, nu, kernel_type, n_estimators, max_features, model_type, logger=None): - # np.random.seed(0) - self._experiment_name = experiment_name - self.dim = dim - self.N = N or 100 - self.l = np.zeros((1, dim)) - self.u = np.ones((1, dim)) - self.lowerbound = lowerbound.reshape(1, dim) - self.upperbound = upperbound.reshape(1, dim) - self.logger = logger - - # normalize the upperbound and lowerbound to [0, 1] - self.scaler = MinMaxScaler() - self.scaler.fit(np.append(self.lowerbound, self.upperbound, axis=0)) - - self.X_train = X_train - self.y_train = y_train - if self.y_train is None: - self.current_optimal = None - else: - self.current_optimal = max(self.y_train) - self.logger.debug("create optimizer", extra={ - "Experiment": self._experiment_name}) - # initialize the global optimizer - self.optimizer = GlobalOptimizer( - N, - self.l, - self.u, - self.scaler, - self.X_train, - self.y_train, - self.current_optimal, - experiment_name=self._experiment_name, - mode=mode, - trade_off=trade_off, - length_scale=length_scale, - noise=noise, - nu=nu, - kernel_type=kernel_type, - n_estimators=n_estimators, - max_features=max_features, - model_type=model_type, - logger=logger, - ) - self.logger.debug("optimizer created", extra={ - "Experiment": self._experiment_name}) - - def get_suggestion(self, request_num): - """ main function to provide suggestion """ - x_next_list = [] - if self.X_train is None and self.y_train is None and self.current_optimal is None: - # randomly pick a point as the first trial - for _ in range(request_num): - x_next_list.append(np.random.uniform( - self.lowerbound, self.upperbound, size=(1, self.dim))) - else: - _, x_next_list_que = self.optimizer.direct(request_num) - for xn in x_next_list_que: - x = np.array(xn).reshape(1, self.dim) - x = self.scaler.inverse_transform(x) - x_next_list.append(x) - return x_next_list diff --git a/pkg/suggestion/v1alpha3/bayesianoptimization/global_optimizer.py b/pkg/suggestion/v1alpha3/bayesianoptimization/global_optimizer.py deleted file mode 100644 index 080404d1f0e..00000000000 --- a/pkg/suggestion/v1alpha3/bayesianoptimization/global_optimizer.py +++ /dev/null @@ -1,309 +0,0 @@ -""" module for the global optimizer -DIRECT algorithm is used in this case -""" -import copy - -import numpy as np - -from pkg.suggestion.v1alpha3.bayesianoptimization.acquisition_func import AcquisitionFunc -from pkg.suggestion.v1alpha3.bayesianoptimization.model.gp import GaussianProcessModel -from pkg.suggestion.v1alpha3.bayesianoptimization.model.rf import RandomForestModel -from pkg.suggestion.v1alpha3.bayesianoptimization.utils import get_logger - - -class RectPack: - """ class for the rectangular - including border, center and acquisition function value - """ - - def __init__(self, l, u, division_num, dim, scaler, aq_func): - self.l = l - self.u = u - self.center = (l + u) / 2 - j = np.mod(division_num, dim) - k = (division_num - j) / dim - self.d = np.sqrt(j * np.power(3, float(-2 * (k + 1))) + - (dim - j) * np.power(3, float(-2 * k))) / 2 - self.division_num = division_num - self.fc, _, _ = aq_func.compute(scaler.inverse_transform(self.center)) - self.fc = -self.fc - - -class RectBucket: - """ class for the rectangular bucket - rectangular with the same size are put in the same bucket - the rectangular is sorted by the acquisition function value - """ - - def __init__(self, diff, pack): - self.diff = diff - self.array = [pack] - - def insert(self, new_pack): - """ insert a new rectangular to a bucket """ - for i in range(len(self.array)): - if new_pack.fc < self.array[i].fc: - self.array.insert(i, new_pack) - return - self.array.append(new_pack) - - def delete(self): - """ delete the first rectangular""" - del self.array[0] - - def diff_exist(self, diff): - """ detect the size difference """ - return abs(self.diff - diff) < 0.00001 - - -class OptimalPoint: - """ helper class to find potential optimal points""" - - def __init__(self, point, prev, slope): - self.point = point - self.prev = prev - self.slope = slope - - -class DimPack: - def __init__(self, dim, fc): - self.dim = dim - self.fc = fc - - -class GlobalOptimizer: - """ class for the global optimizer """ - - def __init__(self, N, l, u, scaler, X_train, y_train, current_optimal, - experiment_name, mode, trade_off, length_scale, - noise, nu, kernel_type, n_estimators, max_features, model_type, logger=None): - self.logger = logger if (logger is not None) else get_logger() - self.N = N - self.l = l - self.u = u - self.scaler = scaler - self.buckets = [] - self.dim = None - self._experiment_name = experiment_name - if model_type == "gp": - model = GaussianProcessModel( - length_scale=length_scale, - noise=noise, - nu=nu, - kernel_type=kernel_type, - ) - else: - model = RandomForestModel( - n_estimators=n_estimators, - max_features=max_features, - ) - self.logger.debug("before model fit", extra={ - "Experiment": self._experiment_name}) - model.fit(X_train, y_train) - self.logger.debug("after model fit", extra={ - "Experiment": self._experiment_name}) - self.aq_func = AcquisitionFunc( - model=model, - current_optimal=current_optimal, - mode=mode, - trade_off=trade_off, - ) - - def potential_opt(self, f_min): - """ find the potential optimal rectangular """ - b = [] - for i in range(len(self.buckets)): - b.append(self.buckets[i].array[0]) - b.sort(key=lambda x: x.d) - index = 0 - min_fc = b[0].fc - for i in range(len(b)): - if b[i].fc < min_fc: - min_fc = b[i].fc - index = i - - opt_list = [OptimalPoint(b[index], 0, 0)] - for i in range(index + 1, len(b)): - prev = len(opt_list) - 1 - diff1 = b[i].d - diff2 = opt_list[prev].point.d - current_slope = ( - b[i].fc - opt_list[prev].point.fc) / (diff1 - diff2) - prev_slope = opt_list[prev].slope - - while prev >= 0 and current_slope < prev_slope: - temp = opt_list[prev].prev - opt_list[prev].prev = -1 - prev = temp - prev_slope = opt_list[prev].slope - diff1 = b[i].d - diff2 = opt_list[prev].point.d - current_slope = ( - b[i].fc - opt_list[prev].point.fc) / (diff1 - diff2) - - opt_list.append(OptimalPoint(b[i], prev, current_slope)) - - opt_list2 = [] - for i in range(len(opt_list)): - if opt_list[i].prev != -1: - opt_list2.append(opt_list[i]) - - for i in range(len(opt_list2) - 1): - c1 = opt_list2[i].point.d - c2 = opt_list2[i + 1].point.d - fc1 = opt_list2[i].point.fc - fc2 = opt_list2[i + 1].point.fc - if fc1 - c1 * (fc1 - fc2) / (c1 - c2) > (1 - 0.001) * f_min: - # if abs(fc1-fc2)<0.0001: - opt_list2[i] = None - while None in opt_list2: - index = opt_list2.index(None) - del opt_list2[index] - # for opt in opt_list2: - # print(opt.point.fc) - return opt_list2 - - def direct(self, request_num): - """ main algorithm """ - self.dim = self.l.shape[1] - division_num = 0 - - # create the first rectangle and put it in the first bucket - first_rect = RectPack(self.l, self.u, division_num, self.dim, - self.scaler, self.aq_func) - self.buckets.append(RectBucket(first_rect.d, first_rect)) - - ei_min = [] - f_min = first_rect.fc - x_next = first_rect.center - ei_min.append(f_min) - - for _ in range(self.N): - opt_set = self.potential_opt(f_min) - - # for bucket in self.buckets: - # for i in range(len(bucket.array)): - # print(bucket.array[i].fc) - # plt.plot(bucket.diff, bucket.array[i].fc, 'b.') - # - # for opt in opt_set: - # plt.plot(opt.point.d, opt.point.fc, 'r.') - # plt.show() - - for opt in opt_set: - f_min, x_next = self.divide_rect( - opt.point, - f_min, - x_next, - self.aq_func, - self.scaler - ) - for bucket in self.buckets: - if bucket.diff_exist(opt.point.d): - bucket.delete() - if not bucket.array: - index = self.buckets.index(bucket) - del self.buckets[index] - ei_min.append(f_min) - x_next_candidate = self.sample_buckets(request_num) - return f_min, x_next_candidate - - def sample_buckets(self, request_num): - self.logger.debug("In lne self.buckets: %r", len(self.buckets)) - bucket_index = [] - fc_sum = 0.0 - x_next_candidate = [] - for bucket in self.buckets: - for a in bucket.array: - self.logger.debug("fc: %r, %r", a.fc, a.center) - fc_sum -= a.fc - bucket_index.append([-a.fc, a.center]) - bucket_index = sorted(bucket_index, key=lambda x: x[0]) - for _ in range(request_num): - sample = np.random.rand() - stick = 0.0 - for b in bucket_index: - stick += b[0]/fc_sum - if stick > sample: - x_next_candidate.append(b[1]) - break - return x_next_candidate - - def divide_rect(self, opt_rect, f_min, x_next, aq_func, scaler): - """ divide the rectangular into smaller ones """ - rect = copy.deepcopy(opt_rect) - division_num = rect.division_num - j = np.mod(division_num, self.dim) - k = (division_num - j) / self.dim - max_side_len = np.power(3, float(-k)) - delta = max_side_len / 3 - dim_set = [] - for i in range(self.dim): - if abs(max_side_len - (rect.u[0, i] - rect.l[0, i])) < 0.0000001: - dim_set.append(i) - - dim_list = [] - for i in dim_set: - e = np.zeros((1, self.dim)) - e[0, i] = 1 - function_value = min( - aq_func.compute(scaler.inverse_transform( - rect.center + delta * e)), - aq_func.compute(scaler.inverse_transform( - rect.center - delta * e)) - ) - dim_list.append(DimPack(i, function_value)) - dim_list.sort(key=lambda x: x.fc) - - for i in range(len(dim_list)): - division_num = division_num + 1 - temp = np.zeros((1, self.dim)) - temp[0, dim_list[i].dim] = delta - left_rect = RectPack( - rect.l, - rect.u - 2 * temp, - division_num, - self.dim, - self.scaler, - aq_func - ) - middle_rect = RectPack( - rect.l + temp, - rect.u - temp, - division_num, - self.dim, - self.scaler, - aq_func - ) - right_rect = RectPack( - rect.l + 2 * temp, - rect.u, - division_num, - self.dim, - self.scaler, - aq_func - ) - if left_rect.fc < f_min: - f_min = left_rect.fc - x_next = left_rect.center - if right_rect.fc < f_min: - f_min = right_rect.fc - x_next = right_rect.center - - insert = 0 - for bucket in self.buckets: - if bucket.diff_exist(left_rect.d): - bucket.insert(left_rect) - bucket.insert(right_rect) - if i == len(dim_list) - 1: - bucket.insert(middle_rect) - insert = 1 - break - if insert == 0: - new_bucket = RectBucket(left_rect.d, left_rect) - new_bucket.insert(right_rect) - if i == len(dim_list) - 1: - new_bucket.insert(middle_rect) - self.buckets.append(new_bucket) - rect = middle_rect - return f_min, x_next diff --git a/pkg/suggestion/v1alpha3/bayesianoptimization/model/__init__.py b/pkg/suggestion/v1alpha3/bayesianoptimization/model/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/pkg/suggestion/v1alpha3/bayesianoptimization/model/gp.py b/pkg/suggestion/v1alpha3/bayesianoptimization/model/gp.py deleted file mode 100644 index 446238c0669..00000000000 --- a/pkg/suggestion/v1alpha3/bayesianoptimization/model/gp.py +++ /dev/null @@ -1,38 +0,0 @@ -""" module for gaussian process prior """ -from sklearn.gaussian_process.kernels import RBF, Matern -from sklearn.gaussian_process import GaussianProcessRegressor - - -class GaussianProcessModel: - """ use the gaussian process as a prior """ - def __init__(self, length_scale=0.5, noise=0.00005, - nu=1.5, kernel_type="matern"): - """ - :param length_scale: the larger the length_scale is, the smoother the gaussian prior is. If a float, - an isotropic kernel is used. If an array, an anisotropic kernel is used where each dimension of it defines - the length-scale of the respective feature dimension. - :param noise: - :param nu: control the smoothness of the prior using Matern kernel. The larger nu is, the smoother the - approximate function is. - :param kernel_type: "rbf": squared exponential kernel, "matern": Matern kernel. - """ - if kernel_type == "rbf": - kernel = RBF(length_scale=length_scale) - elif kernel_type == "matern": - kernel = Matern(length_scale=length_scale, nu=nu) - else: - raise Exception("kernel_type must be 'rbf' or 'matern'") - self.gp = GaussianProcessRegressor( - kernel=kernel, - alpha=noise, - random_state=0, - optimizer=None, - ) - - def fit(self, X_train, y_train): - self.gp.fit(X_train, y_train) - - def predict(self, X_test): - y_mean, y_std = self.gp.predict(X_test, return_std=True) - y_variance = y_std ** 2 - return y_mean, y_std, y_variance diff --git a/pkg/suggestion/v1alpha3/bayesianoptimization/model/rf.py b/pkg/suggestion/v1alpha3/bayesianoptimization/model/rf.py deleted file mode 100644 index 8778b921e78..00000000000 --- a/pkg/suggestion/v1alpha3/bayesianoptimization/model/rf.py +++ /dev/null @@ -1,24 +0,0 @@ -import numpy as np -import forestci as fci -from sklearn.ensemble import RandomForestRegressor - - -class RandomForestModel: - - def __init__(self, n_estimators=50, max_features="auto"): - self.rf = RandomForestRegressor( - n_estimators=n_estimators, - max_features=max_features, - ) - self.X_train = None - - def fit(self, X_train, y_train): - print(X_train.shape, y_train.shape) - self.X_train = X_train - self.rf.fit(X_train, y_train) - - def predict(self, X_test): - y_mean = self.rf.predict(X_test) - y_variance = fci.random_forest_error(self.rf, self.X_train, X_test) - y_std = np.sqrt(y_variance) - return y_mean, y_std, y_variance diff --git a/pkg/suggestion/v1alpha3/bayesianoptimization/utils.py b/pkg/suggestion/v1alpha3/bayesianoptimization/utils.py deleted file mode 100644 index a63bfb3b169..00000000000 --- a/pkg/suggestion/v1alpha3/bayesianoptimization/utils.py +++ /dev/null @@ -1,17 +0,0 @@ -import os -import logging -from logging import getLogger, StreamHandler - - -FORMAT = '%(asctime)-15s Experiment %(experiment_name)s %(message)s' -LOG_LEVEL = os.environ.get("LOG_LEVEL", "INFO") - - -def get_logger(name=__name__): - logger = getLogger(name) - logging.basicConfig(format=FORMAT) - handler = StreamHandler() - logger.setLevel(LOG_LEVEL) - logger.addHandler(handler) - logger.propagate = False - return logger diff --git a/pkg/suggestion/v1alpha3/chocolate/__init__.py b/pkg/suggestion/v1alpha3/chocolate/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/pkg/suggestion/v1alpha3/chocolate/base_service.py b/pkg/suggestion/v1alpha3/chocolate/base_service.py deleted file mode 100644 index a241d3aaf7a..00000000000 --- a/pkg/suggestion/v1alpha3/chocolate/base_service.py +++ /dev/null @@ -1,196 +0,0 @@ -import chocolate as choco -import logging -import base64 -import warnings - -from pkg.suggestion.v1alpha3.internal.constant import MAX_GOAL, INTEGER, DOUBLE, CATEGORICAL, DISCRETE -from pkg.suggestion.v1alpha3.internal.trial import Assignment - -logger = logging.getLogger(__name__) - -DB_ADDRESS = "sqlite:///my_db.db?check_same_thread=False" -DB_FIELD_LOSS = "_loss" -DB_FIELD_CHOCOLATE_ID = "_chocolate_id" -DB_FIELD_TRIAL_NAME = "_trial_name" - -DEPRECATED_ALGORITHM_NAME = { - "chocolate-random": "random", - "chocolate-quasirandom": "quasirandom", - "chocolate-bayesian-optimization": "bayesianoptimization", - "chocolate-mocmaes": "mocmaes", -} - - -class BaseChocolateService(object): - """ - Refer to https://chocolate.readthedocs.io/ - """ - - def __init__(self, algorithm_name, search_space): - self.conn = choco.SQLiteConnection(DB_ADDRESS) - self.search_space = search_space - self.chocolate_optimizer = None - self.create_optimizer(algorithm_name) - # created_trials is the list of dicts with all created trials assignments, loss and trial name - # _chocolate_id is the ID of the trial, Assignment names are encoded, _loss is the target metric, _trial_name is the Trial name - # One row example: - # {'_chocolate_id': 0, 'LS1scg==': 0.001, 'LS1udW0tZXBvY2hz': 1, 'LS1udW0tbGF5ZXJz': 2, "_loss": "0.97", "_trial_name": "grid-example-hsdvfdwl"} - self.created_trials = [] - self.recorded_trials_names = [] - - def create_optimizer(self, algorithm_name): - - # Search Space example: {"x" : choco.uniform(-6, 6), "y" : choco.uniform(-6, 6)} - chocolate_search_space = {} - - for param in self.search_space.params: - key = BaseChocolateService.encode(param.name) - if param.type == INTEGER: - chocolate_search_space[key] = choco.quantized_uniform( - int(param.min), int(param.max), int(param.step)) - elif param.type == DOUBLE: - chocolate_search_space[key] = choco.quantized_uniform( - float(param.min), float(param.max), float(param.step)) - # For Categorical and Discrete insert indexes to DB from list of values - elif param.type == CATEGORICAL or param.type == DISCRETE: - chocolate_search_space[key] = choco.choice( - [idx for idx, _ in enumerate(param.list)]) - - if algorithm_name in DEPRECATED_ALGORITHM_NAME: - warnings.warn( - "Algorithm name '{}' is deprecated. Please use '{}'.".format( - algorithm_name, DEPRECATED_ALGORITHM_NAME[algorithm_name], - ), - DeprecationWarning, - ) - algorithm_name = DEPRECATED_ALGORITHM_NAME[algorithm_name] - - # Refer to https://chocolate.readthedocs.io/tutorials/algo.html - if algorithm_name == "grid": - self.chocolate_optimizer = choco.Grid( - self.conn, chocolate_search_space, clear_db=True) - # hyperopt-random is the default option in katib. - elif algorithm_name == "random": - self.chocolate_optimizer = choco.Random( - self.conn, chocolate_search_space, clear_db=True) - elif algorithm_name == "quasirandom": - self.chocolate_optimizer = choco.QuasiRandom( - self.conn, chocolate_search_space, clear_db=True) - elif algorithm_name == "bayesianoptimization": - self.chocolate_optimizer = choco.Bayes( - self.conn, chocolate_search_space, clear_db=True) - # elif self.algorithm_name == "chocolate-CMAES": - # self.chocolate_optimizer = choco.CMAES(self.conn, chocolate_search_space, clear_db=True) - elif algorithm_name == "mocmaes": - mu = 1 - self.chocolate_optimizer = choco.MOCMAES( - self.conn, chocolate_search_space, mu=mu, clear_db=True) - else: - raise Exception( - '"Failed to create Chocolate optimizer for the algorithm: {}'.format(algorithm_name)) - - def getSuggestions(self, trials, request_number): - """ - Get the new suggested trials with chocolate algorithm. - """ - logger.info("-" * 100 + "\n") - logger.info("New GetSuggestions call\n") - for _, trial in enumerate(trials): - if trial.name not in self.recorded_trials_names: - loss_for_choco = float(trial.target_metric.value) - if self.search_space.goal == MAX_GOAL: - loss_for_choco = -1 * loss_for_choco - - trial_assignments_dict = {} - for param in self.search_space.params: - param_assignment = None - for assignment in trial.assignments: - if param.name == assignment.name: - param_assignment = assignment.value - break - if param.type == INTEGER: - param_assignment = int(param_assignment) - elif param.type == DOUBLE: - param_assignment = float(param_assignment) - elif param.type == CATEGORICAL or param.type == DISCRETE: - param_assignment = param.list.index(param_assignment) - trial_assignments_dict.update({BaseChocolateService.encode( - param.name): param_assignment}) - - # Finding index for the current Trial Assignments in created_trial list without loss - new_trial_loss_idx = -1 - i = 0 - while new_trial_loss_idx == -1 and i < len(self.created_trials): - # Created Trial must not include loss and must have the same param assignment - if ((DB_FIELD_LOSS not in self.created_trials[i] or self.created_trials[i][DB_FIELD_LOSS] is None) and - len(trial_assignments_dict.items() & self.created_trials[i].items()) == len(self.search_space.params)): - new_trial_loss_idx = i - i += 1 - - if new_trial_loss_idx != -1: - self.created_trials[new_trial_loss_idx][DB_FIELD_LOSS] = loss_for_choco - self.created_trials[new_trial_loss_idx][DB_FIELD_TRIAL_NAME] = trial.name - - # Update sqlite database with new loss and trial assignments - id_filter = { - DB_FIELD_CHOCOLATE_ID: self.created_trials[new_trial_loss_idx][DB_FIELD_CHOCOLATE_ID]} - self.conn.update_result( - id_filter, - self.created_trials[new_trial_loss_idx]) - - self.recorded_trials_names.append(trial.name) - - logger.info("New record in sqlite DB is updated") - logger.info("{}\n".format( - self.created_trials[new_trial_loss_idx])) - - list_of_assignments = [] - for i in range(request_number): - try: - token, chocolate_params = self.chocolate_optimizer.next() - new_assignment = BaseChocolateService.convert( - self.search_space, chocolate_params) - list_of_assignments.append(new_assignment) - logger.info("New suggested parameters for Trial with chocolate_id: {}".format( - token[DB_FIELD_CHOCOLATE_ID])) - for assignment in new_assignment: - logger.info("Name = {}, Value = {}".format( - assignment.name, assignment.value)) - logger.info("-" * 50 + "\n") - # Add new trial assignment with chocolate_id to created trials - token.update(chocolate_params) - new_trial_dict = token - self.created_trials.append(new_trial_dict) - - except StopIteration: - logger.info( - "Chocolate db is exhausted, increase Search Space or decrease maxTrialCount!") - - if len(list_of_assignments) > 0: - logger.info( - "GetSuggestions returns {} new Trials\n\n".format(request_number)) - - return list_of_assignments - - @staticmethod - def convert(search_space, chocolate_params): - assignments = [] - for param in search_space.params: - key = BaseChocolateService.encode(param.name) - if param.type == INTEGER: - assignments.append(Assignment( - param.name, chocolate_params[key])) - elif param.type == DOUBLE: - assignments.append(Assignment( - param.name, chocolate_params[key])) - elif param.type == CATEGORICAL or param.type == DISCRETE: - assignments.append(Assignment( - param.name, param.list[chocolate_params[key]])) - return assignments - - @staticmethod - def encode(name): - """Encode the name. Chocolate will check if the name contains hyphens. - Thus we need to encode it. - """ - return base64.b64encode(name.encode('utf-8')).decode('utf-8') diff --git a/pkg/suggestion/v1alpha3/chocolate/service.py b/pkg/suggestion/v1alpha3/chocolate/service.py deleted file mode 100644 index 733baeb513c..00000000000 --- a/pkg/suggestion/v1alpha3/chocolate/service.py +++ /dev/null @@ -1,58 +0,0 @@ -import logging -import grpc - -from pkg.apis.manager.v1alpha3.python import api_pb2 -from pkg.apis.manager.v1alpha3.python import api_pb2_grpc - -from pkg.suggestion.v1alpha3.internal.constant import DOUBLE -from pkg.suggestion.v1alpha3.internal.search_space import HyperParameterSearchSpace -from pkg.suggestion.v1alpha3.internal.trial import Trial, Assignment -from pkg.suggestion.v1alpha3.chocolate.base_service import BaseChocolateService -from pkg.suggestion.v1alpha3.internal.base_health_service import HealthServicer - -logger = logging.getLogger(__name__) - - -class ChocolateService(api_pb2_grpc.SuggestionServicer, HealthServicer): - def __init__(self): - super(ChocolateService, self).__init__() - self.base_service = None - self.is_first_run = True - - def ValidateAlgorithmSettings(self, request, context): - algorithm_name = request.experiment.spec.algorithm.algorithm_name - if algorithm_name == "grid": - search_space = HyperParameterSearchSpace.convert( - request.experiment) - for param in search_space.params: - if param.type == DOUBLE: - if param.step == "" or param.step is None: - return self._set_validate_context_error( - context, "param {} step is nil".format(param.name)) - return api_pb2.ValidateAlgorithmSettingsReply() - - def GetSuggestions(self, request, context): - """ - Main function to provide suggestion. - """ - - if self.is_first_run: - search_space = HyperParameterSearchSpace.convert( - request.experiment) - self.base_service = BaseChocolateService( - algorithm_name=request.experiment.spec.algorithm.algorithm_name, - search_space=search_space) - self.is_first_run = False - - trials = Trial.convert(request.trials) - new_assignments = self.base_service.getSuggestions( - trials, request.request_number) - return api_pb2.GetSuggestionsReply( - parameter_assignments=Assignment.generate(new_assignments) - ) - - def _set_validate_context_error(self, context, error_message): - context.set_code(grpc.StatusCode.INVALID_ARGUMENT) - context.set_details(error_message) - logger.info(error_message) - return api_pb2.ValidateAlgorithmSettingsReply() diff --git a/pkg/suggestion/v1alpha3/goptuna/converter.go b/pkg/suggestion/v1alpha3/goptuna/converter.go deleted file mode 100644 index e838c45a985..00000000000 --- a/pkg/suggestion/v1alpha3/goptuna/converter.go +++ /dev/null @@ -1,350 +0,0 @@ -package suggestion_goptuna_v1alpha3 - -import ( - "errors" - "strconv" - "time" - - "github.com/c-bata/goptuna" - "github.com/c-bata/goptuna/cmaes" - "github.com/c-bata/goptuna/tpe" - api_v1_alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" -) - -func toGoptunaDirection(t api_v1_alpha3.ObjectiveType) goptuna.StudyDirection { - if t == api_v1_alpha3.ObjectiveType_MINIMIZE { - return goptuna.StudyDirectionMinimize - } - return goptuna.StudyDirectionMaximize -} - -func toGoptunaSampler(algorithm *api_v1_alpha3.AlgorithmSpec) (goptuna.Sampler, goptuna.RelativeSampler, error) { - name := algorithm.GetAlgorithmName() - if name == AlgorithmCMAES { - opts := make([]cmaes.SamplerOption, 0, len(algorithm.GetAlgorithmSetting())+1) - opts = append(opts, cmaes.SamplerOptionNStartupTrials(0)) - for _, s := range algorithm.GetAlgorithmSetting() { - if s.Name == "random_state" { - seed, err := strconv.Atoi(s.Value) - if err != nil { - return nil, nil, err - } - opts = append(opts, cmaes.SamplerOptionSeed(int64(seed))) - } else if s.Name == "sigma" { - sigma, err := strconv.ParseFloat(s.Value, 64) - if err != nil { - return nil, nil, err - } - opts = append(opts, cmaes.SamplerOptionInitialSigma(sigma)) - } - } - return nil, cmaes.NewSampler(opts...), nil - } else if name == AlgorithmTPE { - opts := make([]tpe.SamplerOption, 0, len(algorithm.GetAlgorithmSetting())) - for _, s := range algorithm.GetAlgorithmSetting() { - if s.Name == "random_state" { - seed, err := strconv.Atoi(s.Value) - if err != nil { - return nil, nil, err - } - opts = append(opts, tpe.SamplerOptionSeed(int64(seed))) - } else if s.Name == "startup_trials" { - n, err := strconv.Atoi(s.Value) - if err != nil { - return nil, nil, err - } - opts = append(opts, tpe.SamplerOptionNumberOfStartupTrials(n)) - } else if s.Name == "ei_candidates" { - n, err := strconv.Atoi(s.Value) - if err != nil { - return nil, nil, err - } - opts = append(opts, tpe.SamplerOptionNumberOfEICandidates(n)) - } - } - return tpe.NewSampler(opts...), nil, nil - } else { - opts := make([]goptuna.RandomSearchSamplerOption, 0, len(algorithm.GetAlgorithmSetting())) - for _, s := range algorithm.GetAlgorithmSetting() { - if s.Name == "random_state" { - seed, err := strconv.Atoi(s.Value) - if err != nil { - return nil, nil, err - } - opts = append(opts, goptuna.RandomSearchSamplerOptionSeed(int64(seed))) - } - } - return goptuna.NewRandomSearchSampler(opts...), nil, nil - } -} - -func toGoptunaSearchSpace(parameters []*api_v1_alpha3.ParameterSpec) (map[string]interface{}, error) { - searchSpace := make(map[string]interface{}, len(parameters)) - for _, p := range parameters { - if p.ParameterType == api_v1_alpha3.ParameterType_UNKNOWN_TYPE { - return nil, errors.New("invalid parameter type") - } - - if p.ParameterType == api_v1_alpha3.ParameterType_DOUBLE { - high, err := strconv.ParseFloat(p.GetFeasibleSpace().GetMax(), 64) - if err != nil { - return nil, err - } - low, err := strconv.ParseFloat(p.GetFeasibleSpace().GetMin(), 64) - if err != nil { - return nil, err - } - - stepstr := p.GetFeasibleSpace().GetStep() - if stepstr == "" { - searchSpace[p.Name] = goptuna.UniformDistribution{ - High: high, - Low: low, - } - } else { - step, err := strconv.ParseFloat(stepstr, 64) - if err != nil { - return nil, err - } - searchSpace[p.Name] = goptuna.DiscreteUniformDistribution{ - High: high, - Low: low, - Q: step, - } - } - } else if p.ParameterType == api_v1_alpha3.ParameterType_INT { - high, err := strconv.Atoi(p.GetFeasibleSpace().GetMax()) - if err != nil { - return nil, err - } - low, err := strconv.Atoi(p.GetFeasibleSpace().GetMin()) - if err != nil { - return nil, err - } - stepstr := p.GetFeasibleSpace().GetStep() - if stepstr == "" { - searchSpace[p.Name] = goptuna.IntUniformDistribution{ - High: high, - Low: low, - } - } else { - step, err := strconv.Atoi(stepstr) - if err != nil { - return nil, err - } - searchSpace[p.Name] = goptuna.StepIntUniformDistribution{ - High: high, - Low: low, - Step: step, - } - } - } else if p.ParameterType == api_v1_alpha3.ParameterType_CATEGORICAL { - choices := p.GetFeasibleSpace().GetList() - searchSpace[p.Name] = goptuna.CategoricalDistribution{ - Choices: choices, - } - } else if p.ParameterType == api_v1_alpha3.ParameterType_DISCRETE { - // Use categorical distribution instead of goptuna.DiscreteUniformDistribution - // because goptuna.DiscreteUniformDistributions needs to declare the parameter - // space with minimum value, maximum value and interval. - choices := p.GetFeasibleSpace().GetList() - searchSpace[p.Name] = goptuna.CategoricalDistribution{ - Choices: choices, - } - } else { - return nil, errors.New("unsupported parameter type") - } - } - return searchSpace, nil -} - -func toGoptunaState(condition api_v1_alpha3.TrialStatus_TrialConditionType) (goptuna.TrialState, error) { - if condition == api_v1_alpha3.TrialStatus_CREATED { - return goptuna.TrialStateRunning, nil - } else if condition == api_v1_alpha3.TrialStatus_RUNNING { - return goptuna.TrialStateRunning, nil - } else if condition == api_v1_alpha3.TrialStatus_SUCCEEDED { - return goptuna.TrialStateComplete, nil - } else if condition == api_v1_alpha3.TrialStatus_KILLED { - return goptuna.TrialStateFail, nil - } else if condition == api_v1_alpha3.TrialStatus_FAILED { - return goptuna.TrialStateFail, nil - } - return goptuna.TrialStateFail, errors.New("unexpected trial condition") -} - -func getFinalMetric(objectMetricName string, trial *api_v1_alpha3.Trial) (float64, error) { - metrics := trial.GetStatus().GetObservation().GetMetrics() - for i := len(metrics) - 1; i >= 0; i-- { - if metrics[i].GetName() != objectMetricName { - continue - } - v, err := strconv.ParseFloat(metrics[i].GetValue(), 64) - if err != nil { - return 0, err - } - return v, nil - } - return 0, errors.New("no objective metrics") -} - -func toGoptunaTrials( - ktrials []*api_v1_alpha3.Trial, - objectMetricName string, - study *goptuna.Study, - searchSpace map[string]interface{}, -) (map[string]goptuna.FrozenTrial, error) { - gtrials := make(map[string]goptuna.FrozenTrial, len(ktrials)) - for i, kt := range ktrials { - var err error - var datetimeStart, datetimeComplete time.Time - if kt.GetStatus().GetStartTime() != "" { - datetimeStart, err = time.Parse(time.RFC3339Nano, kt.GetStatus().GetStartTime()) - if err != nil { - return nil, err - } - } - if kt.GetStatus().GetCompletionTime() != "" { - datetimeComplete, err = time.Parse(time.RFC3339Nano, kt.GetStatus().GetCompletionTime()) - if err != nil { - return nil, err - } - } - state, err := toGoptunaState(kt.GetStatus().GetCondition()) - if err != nil { - return nil, err - } - - var finalValue float64 - if state == goptuna.TrialStateComplete { - finalValue, err = getFinalMetric(objectMetricName, kt) - if err != nil { - return nil, err - } - } - - assignments := kt.GetSpec().GetParameterAssignments().GetAssignments() - internalParams, externalParams, err := toGoptunaParams(assignments, searchSpace) - if err != nil { - return nil, err - } - - gt := goptuna.FrozenTrial{ - ID: i, // dummy id - StudyID: study.ID, - Number: i, // dummy number - State: state, - Value: finalValue, - IntermediateValues: nil, - DatetimeStart: datetimeStart, - DatetimeComplete: datetimeComplete, - InternalParams: internalParams, - Params: externalParams, - Distributions: searchSpace, - UserAttrs: nil, - SystemAttrs: nil, - } - gtrials[kt.GetName()] = gt - } - return gtrials, nil -} - -func toGoptunaParams( - assignments []*api_v1_alpha3.ParameterAssignment, - searchSpace map[string]interface{}, -) ( - internalParams map[string]float64, - externalParams map[string]interface{}, - err error, -) { - internalParams = make(map[string]float64, len(assignments)) - externalParams = make(map[string]interface{}, len(assignments)) - - for i := range assignments { - name := assignments[i].GetName() - valueStr := assignments[i].GetValue() - - switch d := searchSpace[name].(type) { - case goptuna.UniformDistribution: - p, err := strconv.ParseFloat(valueStr, 64) - if err != nil { - return nil, nil, err - } - internalParams[name] = p - externalParams[name] = d.ToExternalRepr(p) - case goptuna.DiscreteUniformDistribution: - p, err := strconv.ParseFloat(valueStr, 64) - if err != nil { - return nil, nil, err - } - internalParams[name] = p - externalParams[name] = d.ToExternalRepr(p) - case goptuna.IntUniformDistribution: - p, err := strconv.ParseInt(valueStr, 10, 64) - if err != nil { - return nil, nil, err - } - ir := float64(p) - internalParams[name] = ir - // externalParams[name] = p is prohibited because of reflect.DeepEqual() will be false - // at findGoptunaTrialIDByParam() function. - externalParams[name] = d.ToExternalRepr(ir) - case goptuna.StepIntUniformDistribution: - p, err := strconv.ParseInt(valueStr, 10, 64) - if err != nil { - return nil, nil, err - } - ir := float64(p) - internalParams[name] = ir - // externalParams[name] = p is prohibited because of reflect.DeepEqual() will be false - // at findGoptunaTrialIDByParam() function. - externalParams[name] = d.ToExternalRepr(ir) - case goptuna.CategoricalDistribution: - internalRepr := -1.0 - for i := range d.Choices { - if d.Choices[i] == valueStr { - internalRepr = float64(i) - break - } - } - if internalRepr == -1.0 { - return nil, nil, errors.New("invalid categorical value") - } - internalParams[name] = internalRepr - externalParams[name] = valueStr - } - } - return internalParams, externalParams, nil -} - -func createStudyAndSearchSpace( - experiment *api_v1_alpha3.Experiment, -) (*goptuna.Study, map[string]interface{}, error) { - direction := toGoptunaDirection(experiment.GetSpec().GetObjective().GetType()) - independentSampler, relativeSampler, err := toGoptunaSampler(experiment.GetSpec().GetAlgorithm()) - if err != nil { - return nil, nil, err - } - searchSpace, err := toGoptunaSearchSpace(experiment.GetSpec().GetParameterSpecs().GetParameters()) - if err != nil { - return nil, nil, err - } - - studyOpts := make([]goptuna.StudyOption, 0, 5) - studyOpts = append(studyOpts, goptuna.StudyOptionSetDirection(direction)) - studyOpts = append(studyOpts, goptuna.StudyOptionDefineSearchSpace(searchSpace)) - studyOpts = append(studyOpts, goptuna.StudyOptionLogger(nil)) - if independentSampler != nil { - studyOpts = append(studyOpts, goptuna.StudyOptionSampler(independentSampler)) - } - if relativeSampler != nil { - studyOpts = append(studyOpts, goptuna.StudyOptionRelativeSampler(relativeSampler)) - } - - study, err := goptuna.CreateStudy(defaultStudyName, studyOpts...) - if err != nil { - return nil, nil, err - } - - return study, searchSpace, nil -} diff --git a/pkg/suggestion/v1alpha3/goptuna/converter_test.go b/pkg/suggestion/v1alpha3/goptuna/converter_test.go deleted file mode 100644 index d39c83658b2..00000000000 --- a/pkg/suggestion/v1alpha3/goptuna/converter_test.go +++ /dev/null @@ -1,177 +0,0 @@ -package suggestion_goptuna_v1alpha3 - -import ( - "reflect" - "testing" - - "github.com/c-bata/goptuna" - api_v1_alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" -) - -func Test_toGoptunaDirection(t *testing.T) { - for _, tt := range []struct { - name string - objectiveType api_v1_alpha3.ObjectiveType - expected goptuna.StudyDirection - }{ - { - name: "minimize", - objectiveType: api_v1_alpha3.ObjectiveType_MINIMIZE, - expected: goptuna.StudyDirectionMinimize, - }, - { - name: "maximize", - objectiveType: api_v1_alpha3.ObjectiveType_MAXIMIZE, - expected: goptuna.StudyDirectionMaximize, - }, - } { - t.Run(tt.name, func(t *testing.T) { - got := toGoptunaDirection(tt.objectiveType) - if got != tt.expected { - t.Errorf("toGoptunaDirection() got = %v, want %v", got, tt.expected) - } - }) - } -} - -func Test_toGoptunaSearchSpace(t *testing.T) { - tests := []struct { - name string - parameters []*api_v1_alpha3.ParameterSpec - want map[string]interface{} - wantErr bool - }{ - { - name: "Double parameter type", - parameters: []*api_v1_alpha3.ParameterSpec{ - { - Name: "param-double", - ParameterType: api_v1_alpha3.ParameterType_DOUBLE, - FeasibleSpace: &api_v1_alpha3.FeasibleSpace{ - Max: "5.5", - Min: "1.5", - }, - }, - }, - want: map[string]interface{}{ - "param-double": goptuna.UniformDistribution{ - High: 5.5, - Low: 1.5, - }, - }, - wantErr: false, - }, - { - name: "Double parameter type with step", - parameters: []*api_v1_alpha3.ParameterSpec{ - { - Name: "param-double", - ParameterType: api_v1_alpha3.ParameterType_DOUBLE, - FeasibleSpace: &api_v1_alpha3.FeasibleSpace{ - Max: "5.5", - Min: "1.5", - Step: "0.5", - }, - }, - }, - want: map[string]interface{}{ - "param-double": goptuna.DiscreteUniformDistribution{ - High: 5.5, - Low: 1.5, - Q: 0.5, - }, - }, - wantErr: false, - }, - { - name: "Int parameter type", - parameters: []*api_v1_alpha3.ParameterSpec{ - { - Name: "param-int", - ParameterType: api_v1_alpha3.ParameterType_INT, - FeasibleSpace: &api_v1_alpha3.FeasibleSpace{ - Max: "5", - Min: "1", - }, - }, - }, - want: map[string]interface{}{ - "param-int": goptuna.IntUniformDistribution{ - High: 5, - Low: 1, - }, - }, - wantErr: false, - }, - { - name: "Int parameter type with step", - parameters: []*api_v1_alpha3.ParameterSpec{ - { - Name: "param-int", - ParameterType: api_v1_alpha3.ParameterType_INT, - FeasibleSpace: &api_v1_alpha3.FeasibleSpace{ - Max: "5", - Min: "1", - Step: "2", - }, - }, - }, - want: map[string]interface{}{ - "param-int": goptuna.StepIntUniformDistribution{ - High: 5, - Low: 1, - Step: 2, - }, - }, - wantErr: false, - }, - { - name: "Discrete parameter type", - parameters: []*api_v1_alpha3.ParameterSpec{ - { - Name: "param-discrete", - ParameterType: api_v1_alpha3.ParameterType_DISCRETE, - FeasibleSpace: &api_v1_alpha3.FeasibleSpace{ - List: []string{"3", "2", "6"}, - }, - }, - }, - want: map[string]interface{}{ - "param-discrete": goptuna.CategoricalDistribution{ - Choices: []string{"3", "2", "6"}, - }, - }, - wantErr: false, - }, - { - name: "Categorical parameter type", - parameters: []*api_v1_alpha3.ParameterSpec{ - { - Name: "param-categorical", - ParameterType: api_v1_alpha3.ParameterType_CATEGORICAL, - FeasibleSpace: &api_v1_alpha3.FeasibleSpace{ - List: []string{"cat1", "cat2", "cat3"}, - }, - }, - }, - want: map[string]interface{}{ - "param-categorical": goptuna.CategoricalDistribution{ - Choices: []string{"cat1", "cat2", "cat3"}, - }, - }, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := toGoptunaSearchSpace(tt.parameters) - if (err != nil) != tt.wantErr { - t.Errorf("toGoptunaSearchSpace() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("toGoptunaSearchSpace() got = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/pkg/suggestion/v1alpha3/goptuna/sample.go b/pkg/suggestion/v1alpha3/goptuna/sample.go deleted file mode 100644 index b5f0b662fdf..00000000000 --- a/pkg/suggestion/v1alpha3/goptuna/sample.go +++ /dev/null @@ -1,111 +0,0 @@ -package suggestion_goptuna_v1alpha3 - -import ( - "errors" - "reflect" - "strconv" - - "github.com/c-bata/goptuna" - api_v1_alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" -) - -func sampleNextParam(study *goptuna.Study, searchSpace map[string]interface{}) (int, []*api_v1_alpha3.ParameterAssignment, error) { - nextTrialID, err := study.Storage.CreateNewTrial(study.ID) - if err != nil { - return -1, nil, err - } - trial := goptuna.Trial{ - Study: study, - ID: nextTrialID, - } - - // Sample parameters and stored in Goptuna storage. - err = trial.CallRelativeSampler() - if err != nil { - return nextTrialID, nil, err - } - - assignments := make([]*api_v1_alpha3.ParameterAssignment, 0, len(searchSpace)) - for name := range searchSpace { - switch distribution := searchSpace[name].(type) { - case goptuna.UniformDistribution: - p, err := trial.SuggestFloat(name, distribution.Low, distribution.High) - if err != nil { - return nextTrialID, nil, err - } - assignments = append(assignments, &api_v1_alpha3.ParameterAssignment{ - Name: name, - Value: strconv.FormatFloat(p, 'f', -1, 64), - }) - case goptuna.DiscreteUniformDistribution: - p, err := trial.SuggestDiscreteFloat(name, distribution.Low, distribution.High, distribution.Q) - if err != nil { - return nextTrialID, nil, err - } - assignments = append(assignments, &api_v1_alpha3.ParameterAssignment{ - Name: name, - Value: strconv.FormatFloat(p, 'f', -1, 64), - }) - case goptuna.IntUniformDistribution: - p, err := trial.SuggestInt(name, distribution.Low, distribution.High) - if err != nil { - return nextTrialID, nil, err - } - assignments = append(assignments, &api_v1_alpha3.ParameterAssignment{ - Name: name, - Value: strconv.Itoa(p), - }) - case goptuna.StepIntUniformDistribution: - p, err := trial.SuggestStepInt(name, distribution.Low, distribution.High, distribution.Step) - if err != nil { - return nextTrialID, nil, err - } - assignments = append(assignments, &api_v1_alpha3.ParameterAssignment{ - Name: name, - Value: strconv.Itoa(p), - }) - case goptuna.CategoricalDistribution: - p, err := trial.SuggestCategorical(name, distribution.Choices) - if err != nil { - return nextTrialID, nil, err - } - assignments = append(assignments, &api_v1_alpha3.ParameterAssignment{ - Name: name, - Value: p, - }) - } - } - return nextTrialID, assignments, nil -} - -func findGoptunaTrialIDByParam(study *goptuna.Study, trialMapping map[string]int, ktrial goptuna.FrozenTrial) (int, error) { - trials, err := study.GetTrials() - if err != nil { - return -1, err - } - - existInMapping := func(trialID int) bool { - for j := range trialMapping { - if trialMapping[j] == trialID { - return true - } - } - return false - } - - for i := len(trials) - 1; i >= 0; i-- { - if trials[i].State != goptuna.TrialStateRunning { - continue - } - - // skip the trial id which already mapped by other katib trial name - if existInMapping(trials[i].ID) { - continue - } - - if reflect.DeepEqual(ktrial.Params, trials[i].Params) { - return trials[i].ID, nil - } - } - return -1, errors.New("same trial parameter is not found") -} diff --git a/pkg/suggestion/v1alpha3/goptuna/service.go b/pkg/suggestion/v1alpha3/goptuna/service.go deleted file mode 100644 index d7b1861e885..00000000000 --- a/pkg/suggestion/v1alpha3/goptuna/service.go +++ /dev/null @@ -1,198 +0,0 @@ -package suggestion_goptuna_v1alpha3 - -import ( - "context" - "sync" - - "github.com/c-bata/goptuna" - "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "k8s.io/klog" -) - -const ( - AlgorithmCMAES = "cmaes" - AlgorithmTPE = "tpe" - AlgorithmRandom = "random" - - defaultStudyName = "Katib" -) - -func NewSuggestionService() *SuggestionService { - return &SuggestionService{ - searchSpace: nil, - study: nil, - trialMapping: make(map[string]int), - } -} - -type SuggestionService struct { - mu sync.RWMutex - searchSpace map[string]interface{} - study *goptuna.Study - trialMapping map[string]int // Katib trial name -> Goptuna trial id -} - -func (s *SuggestionService) GetSuggestions( - ctx context.Context, - req *api_v1_alpha3.GetSuggestionsRequest, -) (*api_v1_alpha3.GetSuggestionsReply, error) { - err := s.initStudyAndSearchSpaceAtFirstRun(req.GetExperiment()) - if err != nil { - return nil, status.Errorf(codes.Internal, "Failed to create goptuna study and search space: %s", err.Error()) - } - - objectMetricName := req.GetExperiment().GetSpec().GetObjective().GetObjectiveMetricName() - trials, err := toGoptunaTrials(req.GetTrials(), objectMetricName, s.study, s.searchSpace) - if err != nil { - klog.Errorf("Failed to convert to Goptuna trials: %s", err) - return nil, status.Error(codes.Internal, err.Error()) - } - err = s.syncTrials(trials) - if err != nil { - klog.Errorf("Failed to sync Goptuna trials: %s", err) - return nil, status.Error(codes.Internal, err.Error()) - } - - requestNumber := int(req.GetRequestNumber()) - parameterAssignments := make([]*api_v1_alpha3.GetSuggestionsReply_ParameterAssignments, requestNumber) - for i := 0; i < requestNumber; i++ { - trialID, assignments, err := sampleNextParam(s.study, s.searchSpace) - if err != nil { - klog.Errorf("Failed to sample next param: trialID=%d, err=%s", trialID, err) - return nil, status.Error(codes.Internal, err.Error()) - } - - klog.Infof("Success to sample new trial: trialID=%d, assignments=%v", trialID, assignments) - parameterAssignments[i] = &api_v1_alpha3.GetSuggestionsReply_ParameterAssignments{ - Assignments: assignments, - } - } - - return &api_v1_alpha3.GetSuggestionsReply{ - ParameterAssignments: parameterAssignments, - }, nil -} - -// Sync Goptuna trials with Katib trials. -func (s *SuggestionService) syncTrials(ktrials map[string]goptuna.FrozenTrial) (err error) { - s.mu.Lock() - defer s.mu.Unlock() - - for katibTrialName := range ktrials { - ktrial := ktrials[katibTrialName] - gtrialID, found := s.trialMapping[katibTrialName] - if !found { - // In the CMA-ES algorithm, the parameters of Multivariate Normal Distribution MUST be updated by the - // solutions that are sampled from the same generation. To ensure this, Goptuna stores the trial - // metadata which contains the generation number. - // - // But suggestion service cannot know which Katib trial name corresponds to Goptuna trial ID. - // Because Katib's trial name is determined by Katib controller after finished this gRPC call. - // So `findGoptunaTrialIDByParam()` returns the goptuna trial ID from the parameter values. - gtrialID, err = findGoptunaTrialIDByParam(s.study, s.trialMapping, ktrial) - if err != nil { - klog.Errorf("Failed to find Goptuna Trial ID: trialName=%s, err=%s", katibTrialName, err) - return err - } - s.trialMapping[katibTrialName] = gtrialID - klog.Infof("Update trial mapping : trialName=%s -> trialID=%d", katibTrialName, gtrialID) - } - - gtrial, err := s.study.Storage.GetTrial(gtrialID) - if err != nil { - return err - } - - // It doesn't need to update finished trials. - if gtrial.State.IsFinished() { - continue - } - - if ktrial.State == gtrial.State { - continue - } - - if ktrial.State == goptuna.TrialStateComplete { - err = s.study.Storage.SetTrialValue(gtrialID, ktrial.Value) - if err != nil { - return err - } - } - - err = s.study.Storage.SetTrialState(gtrialID, ktrial.State) - if err != nil { - klog.Errorf("Failed to update state: %s", err) - return err - } - - klog.Infof("Detect changes of Trial (trialName=%s, trialID=%d) : State %s, Evaluation %f", - katibTrialName, gtrialID, ktrial.State, ktrial.Value) - } - return nil -} - -func (s *SuggestionService) initStudyAndSearchSpaceAtFirstRun( - experiment *api_v1_alpha3.Experiment, -) error { - s.mu.Lock() - defer s.mu.Unlock() - - if s.study != nil && s.searchSpace != nil { - return nil - } - - study, searchSpace, err := createStudyAndSearchSpace(experiment) - if err != nil { - return err - } - - s.study = study - s.searchSpace = searchSpace - return nil -} - -func (s *SuggestionService) ValidateAlgorithmSettings( - ctx context.Context, - req *api_v1_alpha3.ValidateAlgorithmSettingsRequest, -) (*api_v1_alpha3.ValidateAlgorithmSettingsReply, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "request is empty") - } - - algorithmName := req.GetExperiment().GetSpec().GetAlgorithm().GetAlgorithmName() - if algorithmName != AlgorithmRandom && algorithmName != AlgorithmCMAES && algorithmName != AlgorithmTPE { - return nil, status.Error(codes.InvalidArgument, "unsupported algorithm") - } - - params := req.GetExperiment().GetSpec().GetParameterSpecs().GetParameters() - if algorithmName == AlgorithmCMAES { - cnt := 0 - for _, p := range params { - if p.ParameterType == api_v1_alpha3.ParameterType_DOUBLE || p.ParameterType == api_v1_alpha3.ParameterType_INT { - cnt++ - } - } - if cnt < 2 { - return nil, status.Error(codes.InvalidArgument, "CMA-ES only supports two or more dimensional continuous search space.") - } - } - - paramSet := make(map[string]interface{}, len(params)) - for _, p := range params { - if _, ok := paramSet[p.Name]; ok { - return nil, status.Errorf(codes.InvalidArgument, "Detect duplicated parameter name: %s", p.Name) - } - paramSet[p.Name] = nil - } - _, _, err := createStudyAndSearchSpace(req.GetExperiment()) - if err != nil { - return nil, status.Errorf(codes.Internal, "Failed to create goptuna study and search space: %s", err.Error()) - } - return &api_v1_alpha3.ValidateAlgorithmSettingsReply{}, nil -} - -// This is a compile-time assertion to ensure that SuggestionService -// implements an api_v1_alpha3.SuggestionServer interface. -var _ api_v1_alpha3.SuggestionServer = &SuggestionService{} diff --git a/pkg/suggestion/v1alpha3/goptuna/service_test.go b/pkg/suggestion/v1alpha3/goptuna/service_test.go deleted file mode 100644 index 829b7cec2e9..00000000000 --- a/pkg/suggestion/v1alpha3/goptuna/service_test.go +++ /dev/null @@ -1,173 +0,0 @@ -package suggestion_goptuna_v1alpha3_test - -import ( - "context" - "testing" - - api_v1_alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - suggestion_goptuna_v1alpha3 "github.com/kubeflow/katib/pkg/suggestion/v1alpha3/goptuna" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -func TestSuggestionService_GetSuggestions(t *testing.T) { - ctx := context.TODO() - parameterSpecs := &api_v1_alpha3.ExperimentSpec_ParameterSpecs{ - Parameters: []*api_v1_alpha3.ParameterSpec{ - { - Name: "param-1", - ParameterType: api_v1_alpha3.ParameterType_INT, - FeasibleSpace: &api_v1_alpha3.FeasibleSpace{ - Max: "10", - Min: "-10", - List: nil, - Step: "", - }, - }, - { - Name: "param-2", - ParameterType: api_v1_alpha3.ParameterType_CATEGORICAL, - FeasibleSpace: &api_v1_alpha3.FeasibleSpace{ - List: []string{"cat1", "cat2", "cat3"}, - }, - }, - { - Name: "param-3", - ParameterType: api_v1_alpha3.ParameterType_DISCRETE, - FeasibleSpace: &api_v1_alpha3.FeasibleSpace{ - List: []string{"3", "2", "6"}, - }, - }, - { - Name: "param-4", - ParameterType: api_v1_alpha3.ParameterType_DOUBLE, - FeasibleSpace: &api_v1_alpha3.FeasibleSpace{ - Max: "5.5", - Min: "-1.5", - }, - }, - }, - } - - for _, tt := range []struct { - name string - req *api_v1_alpha3.GetSuggestionsRequest - expectedCode codes.Code - }{ - { - name: "CMA-ES request", - req: &api_v1_alpha3.GetSuggestionsRequest{ - Experiment: &api_v1_alpha3.Experiment{ - Name: "test", - Spec: &api_v1_alpha3.ExperimentSpec{ - Algorithm: &api_v1_alpha3.AlgorithmSpec{ - AlgorithmName: "cmaes", - AlgorithmSetting: []*api_v1_alpha3.AlgorithmSetting{ - { - Name: "random_state", - Value: "10", - }, - }, - }, - Objective: &api_v1_alpha3.ObjectiveSpec{ - Type: api_v1_alpha3.ObjectiveType_MINIMIZE, - Goal: 0.1, - ObjectiveMetricName: "metric-1", - AdditionalMetricNames: nil, - }, - ParameterSpecs: parameterSpecs, - }, - }, - RequestNumber: 2, - }, - expectedCode: codes.OK, - }, - { - name: "TPE request", - req: &api_v1_alpha3.GetSuggestionsRequest{ - Experiment: &api_v1_alpha3.Experiment{ - Name: "test", - Spec: &api_v1_alpha3.ExperimentSpec{ - Algorithm: &api_v1_alpha3.AlgorithmSpec{ - AlgorithmName: "tpe", - AlgorithmSetting: []*api_v1_alpha3.AlgorithmSetting{ - { - Name: "random_state", - Value: "10", - }, - }, - EarlyStoppingSpec: nil, - }, - Objective: &api_v1_alpha3.ObjectiveSpec{ - Type: api_v1_alpha3.ObjectiveType_MINIMIZE, - Goal: 0.1, - ObjectiveMetricName: "metric-1", - AdditionalMetricNames: nil, - }, - ParameterSpecs: parameterSpecs, - }, - }, - RequestNumber: 2, - }, - }, - { - name: "Random request", - req: &api_v1_alpha3.GetSuggestionsRequest{ - Experiment: &api_v1_alpha3.Experiment{ - Name: "test", - Spec: &api_v1_alpha3.ExperimentSpec{ - Algorithm: &api_v1_alpha3.AlgorithmSpec{ - AlgorithmName: "random", - AlgorithmSetting: []*api_v1_alpha3.AlgorithmSetting{ - { - Name: "random_state", - Value: "10", - }, - }, - EarlyStoppingSpec: nil, - }, - Objective: &api_v1_alpha3.ObjectiveSpec{ - Type: api_v1_alpha3.ObjectiveType_MINIMIZE, - Goal: 0.1, - ObjectiveMetricName: "metric-1", - AdditionalMetricNames: nil, - }, - ParameterSpecs: parameterSpecs, - }, - }, - RequestNumber: 2, - }, - }, - } { - t.Run(tt.name, func(t *testing.T) { - s := &suggestion_goptuna_v1alpha3.SuggestionService{} - reply, err := s.GetSuggestions(ctx, tt.req) - - c, ok := status.FromError(err) - if !ok { - t.Errorf("GetSuggestion() returns non-gRPC error") - } - if tt.expectedCode != c.Code() { - t.Errorf("GetSuggestions() should return = %v, but got %v", tt.expectedCode, c.Code()) - } - - if c.Code() != codes.OK { - return - } - - if len(reply.ParameterAssignments) != int(tt.req.RequestNumber) { - t.Errorf("GetSuggestions() should return %d suggestions, but got %#v", tt.req.RequestNumber, reply.ParameterAssignments) - return - } - - params := tt.req.GetExperiment().GetSpec().GetParameterSpecs().GetParameters() - for i := range reply.ParameterAssignments { - assignments := reply.ParameterAssignments[i].Assignments - if len(assignments) != len(params) { - t.Errorf("Each assignments should holds %d parameters, but got %#v", len(params), assignments) - return - } - } - }) - } -} diff --git a/pkg/suggestion/v1alpha3/hyperband/__init__.py b/pkg/suggestion/v1alpha3/hyperband/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/pkg/suggestion/v1alpha3/hyperband/parameter.py b/pkg/suggestion/v1alpha3/hyperband/parameter.py deleted file mode 100644 index e2c03e16246..00000000000 --- a/pkg/suggestion/v1alpha3/hyperband/parameter.py +++ /dev/null @@ -1,53 +0,0 @@ -import numpy as np -from sklearn.preprocessing import MinMaxScaler - - -class ParameterConfig: - """ - Class to hold the parameter configuration for an experiment. - - Attributes: - name_ids (dict): Mapping from a parameter name to the index of that - parameter in the other fields. - dim (int): Dimension of the vectors created when parameter assignments - are mapped to a vector. Each int, double, or discrete parameter - adds one to the dimension, and each categorical parameter adds - the number of feasible values for that parameter due to one-hot - encoding. - lower_bounds (ndarray): The lower bounds for each parameter in the - search space. - upper_bounds (ndarray): The lower bounds for each parameter in the - search space. - parameter_types (list): The type of each parameter. - names (list): The name of each parameter. - discrete_info (list): A list of dicts where each dict contains the - information for a single discrete parameter. An example of a dict - is {"name": "discrete_parameter, "values": [2, 3, 5]}] - categorical_info (list): A list of dicts where each dict contains the - information for a single categorical parameter. An example dict is - {"name": "cat_param", "values": ["true", "false"], "number": 2}. - """ - - def __init__(self, name_ids, dim, lower_bounds, upper_bounds, - parameter_types, names, discrete_info, categorical_info): - self.name_ids = name_ids - self.dim = dim - self.lower_bounds = np.array(lower_bounds).reshape((1, dim)) - self.upper_bounds = np.array(upper_bounds).reshape((1, dim)) - self.parameter_types = parameter_types - self.names = names - self.discrete_info = discrete_info - self.categorical_info = categorical_info - if len(self.names) != len(set(self.names)): - raise Exception("Parameter names are not unique.") - - def create_scaler(self): - search_space = np.append(self.lower_bounds, self.upper_bounds, axis=0) - scaler = MinMaxScaler() - scaler.fit(search_space) - return scaler - - def random_sample(self): - new_sample = np.random.uniform(self.lower_bounds, self.upper_bounds, - size=(1, self.dim)) - return new_sample diff --git a/pkg/suggestion/v1alpha3/hyperband/parsing_util.py b/pkg/suggestion/v1alpha3/hyperband/parsing_util.py deleted file mode 100644 index f054a882f71..00000000000 --- a/pkg/suggestion/v1alpha3/hyperband/parsing_util.py +++ /dev/null @@ -1,144 +0,0 @@ -""" -Module containing helper functions to translate objects that come -to/from the grpc API into the format accepted/returned by the different -suggestion generation algorithms. -""" -from collections.abc import Iterable -from pkg.apis.manager.v1alpha3.python import api_pb2 -import numpy as np -from pkg.suggestion.v1alpha3.hyperband.parameter import ParameterConfig - - -def _deal_with_discrete(feasible_values, current_value): - """ function to embed the current values to the feasible discrete space""" - diff = np.subtract(feasible_values, current_value) - diff = np.absolute(diff) - return feasible_values[np.argmin(diff)] - - -def _deal_with_categorical(feasible_values, one_hot_values): - """ function to do the one hot encoding of the categorical values """ - index = np.argmax(one_hot_values) - return feasible_values[int(index)] - - -def parse_parameter_configs(parameter_configs): - name_ids = {} - dim = 0 - lower_bounds = [] - upper_bounds = [] - parameter_types = [] - names = [] - discrete_info = [] - categorical_info = [] - for param_idx, param in enumerate(parameter_configs): - name_ids[param.name] = param_idx - parameter_types.append(param.parameter_type) - names.append(param.name) - if param.parameter_type == api_pb2.DOUBLE: - new_lower = float(param.feasible_space.min) - new_upper = float(param.feasible_space.max) - elif param.parameter_type == api_pb2.INT: - new_lower = int(param.feasible_space.min) - new_upper = int(param.feasible_space.max) - elif param.parameter_type == api_pb2.DISCRETE: - discrete_values = [int(x) for x in param.feasible_space.list] - new_lower = min(discrete_values) - new_upper = max(discrete_values) - discrete_info.append( - {"name": param.name, "values": discrete_values}) - elif param.parameter_type == api_pb2.CATEGORICAL: - num_feasible = len(param.feasible_space.list) - new_lower = [0 for _ in range(num_feasible)] - new_upper = [1 for _ in range(num_feasible)] - categorical_info.append({ - "name": param.name, - "values": param.feasible_space.list, - "number": num_feasible, - }) - if isinstance(new_lower, Iterable): # handles categorical parameters - lower_bounds.extend(new_lower) - upper_bounds.extend(new_upper) - dim += len(new_lower) - else: # handles ints, doubles, and discrete parameters - lower_bounds.append(new_lower) - upper_bounds.append(new_upper) - dim += 1 - parsed_config = ParameterConfig(name_ids, - dim, - lower_bounds, - upper_bounds, - parameter_types, - names, - discrete_info, - categorical_info) - return parsed_config - - -def parse_previous_observations(parameters_list, dim, name_id, types, categorical_info): - parsed_X = np.zeros(shape=(len(parameters_list), dim)) - for row_idx, parameters in enumerate(parameters_list): - offset = 0 - for p in parameters: - map_id = name_id[p.name] - if types[map_id] in [api_pb2.DOUBLE, api_pb2.INT, - api_pb2.DISCRETE]: - parsed_X[row_idx, offset] = float(p.value) - offset += 1 - elif types[map_id] == api_pb2.CATEGORICAL: - for ci in categorical_info: - if ci["name"] == p.name: - value_num = ci["values"].index(p.value) - parsed_X[row_idx, offset + value_num] = 1 - offset += ci["number"] - return parsed_X - - -def parse_metric(y_train, goal): - """ - Parse the metric to the dictionary - """ - y_array = np.array(y_train, dtype=np.float64) - if goal == api_pb2.MINIMIZE: - y_array *= -1 - return y_array - - -def parse_x_next_vector(x_next, param_types, param_names, discrete_info, categorical_info): - """ parse the next suggestion to the proper format """ - counter = 0 - result = [] - if isinstance(x_next, np.ndarray): - x_next = x_next.squeeze(axis=0) - for par_type, par_name in zip(param_types, param_names): - if par_type == api_pb2.INT: - value = int(round(x_next[counter], 0)) - counter = counter + 1 - elif par_type == api_pb2.DOUBLE: - value = float(x_next[counter]) - counter = counter + 1 - elif par_type == api_pb2.DISCRETE: - for param in discrete_info: - if param["name"] == par_name: - value = _deal_with_discrete(param["values"], - x_next[counter]) - counter = counter + 1 - break - elif par_type == api_pb2.CATEGORICAL: - for param in categorical_info: - if param["name"] == par_name: - value = _deal_with_categorical( - feasible_values=param["values"], - one_hot_values=x_next[counter:counter + param["number"]], - ) - counter = counter + param["number"] - break - result.append({"name": par_name, "value": value, "type": par_type}) - return result - - -def parse_x_next_tuple(x_next, param_types, param_names): - result = [] - for value, param_type, param_name in zip(x_next, param_types, param_names): - result.append({"name": param_name, "type": param_type, "value": str(value)}) - return result diff --git a/pkg/suggestion/v1alpha3/hyperband/service.py b/pkg/suggestion/v1alpha3/hyperband/service.py deleted file mode 100644 index 280eb78b9df..00000000000 --- a/pkg/suggestion/v1alpha3/hyperband/service.py +++ /dev/null @@ -1,341 +0,0 @@ -import math -import traceback -import grpc -import logging -from logging import getLogger, StreamHandler, DEBUG - -from pkg.apis.manager.v1alpha3.python import api_pb2 -from pkg.apis.manager.v1alpha3.python import api_pb2_grpc -from pkg.suggestion.v1alpha3.hyperband import parsing_util -from pkg.suggestion.v1alpha3.internal.base_health_service import HealthServicer - -logger = getLogger(__name__) -FORMAT = '%(asctime)-15s Experiment %(experiment_name)s %(message)s' -logging.basicConfig(format=FORMAT) -handler = StreamHandler() -handler.setLevel(DEBUG) -logger.setLevel(DEBUG) -logger.addHandler(handler) - - -class HyperbandService(api_pb2_grpc.SuggestionServicer, HealthServicer): - def GetSuggestions(self, request, context): - """ - Main function to provide suggestion. - """ - try: - reply = api_pb2.GetSuggestionsReply() - experiment = request.experiment - self.all_trials = request.trials - alg_settings = experiment.spec.algorithm.algorithm_setting - - param = HyperBandParam.convert(alg_settings) - if param.current_s < 0: - # Hyperband outlerloop has finished - return reply - # This is a hack to get request number. - param.n = request.request_number - - trials = self._make_bracket(experiment, param) - for trial in trials: - reply.parameter_assignments.add(assignments=trial.parameter_assignments.assignments) - reply.algorithm.CopyFrom(HyperBandParam.generate(param)) - return reply - except Exception as e: - logger.error("Fail to generate trials: \n%s", - traceback.format_exc(), extra={"experiment_name": experiment.name}) - raise e - - def _update_hbParameters(self, param): - param.current_i += 1 - if param.current_i > param.current_s: - self._new_hbParameters(param) - - def _new_hbParameters(self, param): - param.current_s -= 1 - param.current_i = 0 - if param.current_s >= 0: - # when param.current_s < 0, hyperband algorithm reaches the end - param.n = int(math.ceil(float(param.s_max + 1) * ( - float(param.eta**param.current_s) / float(param.current_s+1)))) - param.r = param.r_l * \ - param.eta**(-param.current_s) - - def _make_bracket(self, experiment, param): - if param.evaluating_trials == 0: - trialSpecs = self._make_master_bracket(experiment, param) - else: - trialSpecs = self._make_child_bracket(experiment, param) - if param.current_i < param.current_s: - param.evaluating_trials = len(trialSpecs) - else: - param.evaluating_trials = 0 - - logger.info("HyperBand Param eta %d.", - param.eta, extra={"experiment_name": experiment.name}) - logger.info("HyperBand Param R %d.", - param.r_l, extra={"experiment_name": experiment.name}) - logger.info("HyperBand Param sMax %d.", - param.s_max, extra={"experiment_name": experiment.name}) - logger.info("HyperBand Param B %d.", - param.b_l, extra={"experiment_name": experiment.name}) - logger.info("HyperBand Param n %d.", - param.n, extra={"experiment_name": experiment.name}) - logger.info("HyperBand Param r %d.", - param.r, extra={"experiment_name": experiment.name}) - logger.info("HyperBand Param s %d.", - param.current_s, extra={"experiment_name": experiment.name}) - logger.info("HyperBand Param i %d.", - param.current_i, extra={"experiment_name": experiment.name}) - logger.info("HyperBand evaluating trials count %d.", - param.evaluating_trials, extra={"experiment_name": experiment.name}) - logger.info("HyperBand budget resource name %s.", - param.resource_name, extra={"experiment_name": experiment.name}) - if param.evaluating_trials == 0: - self._new_hbParameters(param) - - return trialSpecs - - def _make_child_bracket(self, experiment, param): - n_i = math.ceil(param.n * param.eta**(-param.current_i)) - top_trials_num = int(math.ceil(n_i / param.eta)) - self._update_hbParameters(param) - r_i = int(param.r * param.eta**param.current_i) - last_trials = self._get_top_trial( - param.evaluating_trials, top_trials_num, experiment) - trialSpecs = self._copy_trials( - last_trials, r_i, param.resource_name) - - logger.info("Generate %d trials by child bracket.", - top_trials_num, extra={"experiment_name": experiment.name}) - return trialSpecs - - def _get_last_trials(self, all_trials, latest_trials_num): - sorted_trials = sorted( - all_trials, key=lambda trial: trial.status.start_time) - if len(sorted_trials) > latest_trials_num: - return sorted_trials[-latest_trials_num:] - else: - return sorted_trials - - def _get_top_trial(self, latest_trials_num, top_trials_num, experiment): - objective_metric = experiment.spec.objective.objective_metric_name - objective_type = experiment.spec.objective.type - - def get_objective_value(t): - for m in t.status.observation.metrics: - if m.name == objective_metric: - return float(m.value) - - top_trials = [] - all_trials = self.all_trials - latest_trials = self._get_last_trials(all_trials, latest_trials_num) - - for t in latest_trials: - if t.status.condition != api_pb2.TrialStatus.TrialConditionType.SUCCEEDED: - raise Exception( - "There are some trials which are not completed yet for experiment %s." % experiment.name) - - if objective_type == api_pb2.MAXIMIZE: - top_trials.extend( - sorted(latest_trials, key=get_objective_value, reverse=True)) - else: - top_trials.extend(sorted(latest_trials, key=get_objective_value)) - return top_trials[:top_trials_num] - - def _copy_trials(self, trials, r_i, resourceName): - trialSpecs = [] - for t in trials: - trial_spec = api_pb2.TrialSpec() - for assignment in t.spec.parameter_assignments.assignments: - if assignment.name == resourceName: - value = str(r_i) - else: - value = assignment.value - trial_spec.parameter_assignments.assignments.add(name=assignment.name, - value=value) - trialSpecs.append(trial_spec) - return trialSpecs - - def _make_master_bracket(self, experiment, param): - n = param.n - r = int(param.r) - parameter_config = parsing_util.parse_parameter_configs( - experiment.spec.parameter_specs.parameters) - trial_specs = [] - for _ in range(n): - sample = parameter_config.random_sample() - suggestion = parsing_util.parse_x_next_vector( - sample, - parameter_config.parameter_types, - parameter_config.names, - parameter_config.discrete_info, - parameter_config.categorical_info) - trial_spec = api_pb2.TrialSpec() - trial_spec.experiment_name = experiment.name - for hp in suggestion: - if hp['name'] == param.resource_name: - hp['value'] = str(r) - trial_spec.parameter_assignments.assignments.add(name=hp['name'], - value=str(hp['value'])) - trial_specs.append(trial_spec) - logger.info("Generate %d trials by master bracket.", - n, extra={"experiment_name": experiment.name}) - return trial_specs - - def _set_validate_context_error(self, context, error_message): - context.set_code(grpc.StatusCode.INVALID_ARGUMENT) - context.set_details(error_message) - logger.info(error_message) - return api_pb2.ValidateAlgorithmSettingsReply() - - def ValidateAlgorithmSettings(self, request, context): - params = request.experiment.spec.parameter_specs.parameters - settings = request.experiment.spec.algorithm.algorithm_setting - setting_dict = {} - for setting in settings: - setting_dict[setting.name] = setting.value - if "r_l" not in setting_dict or "resource_name" not in setting_dict: - return self._set_validate_context_error(context, "r_l and resource_name must be set.") - try: - rl = float(setting_dict["r_l"]) - except: - return self._set_validate_context_error(context, "r_l must be a positive float number.") - else: - if rl < 0: - return self._set_validate_context_error(context, "r_l must be a positive float number.") - - if "eta" in setting_dict: - eta = int(float(setting_dict["eta"])) - if eta <= 0: - eta = 3 - else: - eta = 3 - - smax = int(math.log(rl)/math.log(eta)) - max_parallel = int(math.ceil(eta**smax)) - if request.experiment.spec.parallel_trial_count < max_parallel: - return self._set_validate_context_error(context, - "parallelTrialCount must be not less than %d." % max_parallel) - - valid_resourceName = False - for param in params: - if param.name == setting_dict["resource_name"]: - valid_resourceName = True - break - if not valid_resourceName: - return self._set_validate_context_error(context, - "value of resource_name setting must be in parameters.") - - return api_pb2.ValidateAlgorithmSettingsReply() - - -class HyperBandParam(object): - def __init__(self, eta=3, s_max=-1, r_l=-1, - b_l=-1, r=-1, n=-1, current_s=-2, - current_i=-1, resource_name="", - evaluating_trials=0): - self.eta = eta - self.s_max = s_max - self.r_l = r_l - self.b_l = b_l - self.r = r - self.n = n - self.current_s = current_s - self.current_i = current_i - self.resource_name = resource_name - self.evaluating_trials = evaluating_trials - - @staticmethod - def generate(param): - algorithm_settings = [ - api_pb2.AlgorithmSetting( - name="eta", - value=str(param.eta) - ), api_pb2.AlgorithmSetting( - name="s_max", - value=str(param.s_max) - ), api_pb2.AlgorithmSetting( - name="r_l", - value=str(param.r_l) - ), api_pb2.AlgorithmSetting( - name="b_l", - value=str(param.b_l) - ), api_pb2.AlgorithmSetting( - name="r", - value=str(param.r) - ), api_pb2.AlgorithmSetting( - name="n", - value=str(param.n) - ), api_pb2.AlgorithmSetting( - name="current_s", - value=str(param.current_s) - ), api_pb2.AlgorithmSetting( - name="current_i", - value=str(param.current_i) - ), api_pb2.AlgorithmSetting( - name="resource_name", - value=param.resource_name - ), api_pb2.AlgorithmSetting( - name="evaluating_trials", - value=str(param.evaluating_trials) - )] - return api_pb2.AlgorithmSpec( - algorithm_setting=algorithm_settings - ) - - @staticmethod - def convert(alg_settings): - """Convert the algorithm settings to HyperBandParam. - """ - param = HyperBandParam() - # Set the param from the algorithm settings. - for setting in alg_settings: - if setting.name == "eta": - param.eta = float(setting.value) - elif setting.name == "r_l": - param.r_l = float(setting.value) - elif setting.name == "b_l": - param.b_l = float(setting.value) - elif setting.name == "n": - param.n = int(float(setting.value)) - elif setting.name == "r": - param.r = int(float(setting.value)) - elif setting.name == "current_s": - param.current_s = int(float(setting.value)) - elif setting.name == "current_i": - param.current_i = int(float(setting.value)) - elif setting.name == "s_max": - param.s_max = int(float(setting.value)) - elif setting.name == "evaluating_trials": - param.evaluating_trials = int(float(setting.value)) - elif setting.name == "resource_name": - param.resource_name = setting.value - else: - logger.info( - "Unknown HyperBand Param %s, ignore it", setting.name) - if param.current_s == -1: - # Hyperband outlerloop has finished - logger.info("HyperBand outlerloop has finished.") - return param - - # Deal with illegal parameter values. - if param.eta <= 0: - param.eta = 3 - if param.s_max < 0: - param.s_max = int( - math.log(param.r_l) / math.log(param.eta)) - if param.b_l < 0: - param.b_l = (param.s_max + 1) * param.r_l - if param.current_s < 0: - param.current_s = param.s_max - if param.current_i < 0: - param.current_i = 0 - if param.n < 0: - param.n = int(math.ceil(float(param.s_max + 1) * ( - float(param.eta**param.current_s) / float(param.current_s+1)))) - if param.r < 0: - param.r = param.r_l * \ - param.eta**(-param.current_s) - - return param diff --git a/pkg/suggestion/v1alpha3/hyperopt/__init__.py b/pkg/suggestion/v1alpha3/hyperopt/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/pkg/suggestion/v1alpha3/hyperopt/base_service.py b/pkg/suggestion/v1alpha3/hyperopt/base_service.py deleted file mode 100644 index 3c39b05187a..00000000000 --- a/pkg/suggestion/v1alpha3/hyperopt/base_service.py +++ /dev/null @@ -1,235 +0,0 @@ -import hyperopt -import numpy as np -import logging - -from pkg.suggestion.v1alpha3.internal.constant import INTEGER, DOUBLE, CATEGORICAL, DISCRETE, MAX_GOAL -from pkg.suggestion.v1alpha3.internal.trial import Assignment - -logger = logging.getLogger(__name__) - -TPE_ALGORITHM_NAME = "tpe" -RANDOM_ALGORITHM_NAME = "random" - - -class BaseHyperoptService(object): - def __init__(self, - algorithm_name=TPE_ALGORITHM_NAME, - algorithm_conf=None, - search_space=None): - self.algorithm_name = algorithm_name - self.algorithm_conf = algorithm_conf or {} - # pop common configurations - random_state = self.algorithm_conf.pop('random_state', None) - - if self.algorithm_name == TPE_ALGORITHM_NAME: - self.hyperopt_algorithm = hyperopt.tpe.suggest - elif self.algorithm_name == RANDOM_ALGORITHM_NAME: - self.hyperopt_algorithm = hyperopt.rand.suggest - # elif algorithm_name == 'hyperopt-anneal': - # self.hyperopt_algorithm = hyperopt.anneal.suggest_batch - # elif algorithm_name == 'hyperopt-mix': - # self.hyperopt_algorithm = hyperopt.mix.suggest - - self.search_space = search_space - # New hyperopt variables - self.hyperopt_rstate = np.random.RandomState(random_state) - self.create_hyperopt_domain() - self.create_fmin() - self.is_first_run = True - - def create_hyperopt_domain(self): - # Construct search space, example: {"x": hyperopt.hp.uniform('x', -10, 10), "x2": hyperopt.hp.uniform('x2', -10, 10)} - hyperopt_search_space = {} - for param in self.search_space.params: - if param.type == INTEGER: - hyperopt_search_space[param.name] = hyperopt.hp.quniform( - param.name, - float(param.min), - float(param.max), - float(param.step)) - elif param.type == DOUBLE: - hyperopt_search_space[param.name] = hyperopt.hp.uniform( - param.name, - float(param.min), - float(param.max)) - elif param.type == CATEGORICAL or param.type == DISCRETE: - hyperopt_search_space[param.name] = hyperopt.hp.choice( - param.name, param.list) - - self.hyperopt_domain = hyperopt.Domain( - None, hyperopt_search_space, pass_expr_memo_ctrl=None) - - def create_fmin(self): - self.fmin = hyperopt.FMinIter( - self.hyperopt_algorithm, - self.hyperopt_domain, - trials=hyperopt.Trials(), - max_evals=-1, - rstate=self.hyperopt_rstate, - verbose=False) - - self.fmin.catch_eval_exceptions = False - - def getSuggestions(self, trials, request_number): - """ - Get the new suggested trials with the given algorithm. - """ - - recorded_trials_names = self.fmin.trials.specs - - hyperopt_trial_new_ids = [] - hyperopt_trial_specs = [] - hyperopt_trial_results = [] - hyperopt_trial_miscs = [] - # Update hyperopt FMin with new completed Trials - for trial in trials: - if {"trial-name": trial.name} not in recorded_trials_names: - # Produce new id for the new Trial - new_id = self.fmin.trials.new_trial_ids(1) - hyperopt_trial_new_ids.append(new_id[0]) - hyperopt_trial_miscs_idxs = {} - # Example: {'l1_normalization': [0.1], 'learning_rate': [0.1], 'hidden2': [1], 'optimizer': [1]} - hyperopt_trial_miscs_vals = {} - - # Insert Trial assignment to the misc - hyperopt_trial_misc = dict( - tid=new_id[0], cmd=self.hyperopt_domain.cmd, workdir=self.hyperopt_domain.workdir) - for param in self.search_space.params: - parameter_value = None - for assignment in trial.assignments: - if assignment.name == param.name: - parameter_value = assignment.value - break - if param.type == INTEGER: - hyperopt_trial_miscs_idxs[param.name] = new_id - hyperopt_trial_miscs_vals[param.name] = [int(parameter_value)] - elif param.type == DOUBLE: - hyperopt_trial_miscs_idxs[param.name] = new_id - hyperopt_trial_miscs_vals[param.name] = [float(parameter_value)] - elif param.type == DISCRETE or param.type == CATEGORICAL: - index_of_value_in_list = param.list.index(parameter_value) - hyperopt_trial_miscs_idxs[param.name] = new_id - hyperopt_trial_miscs_vals[param.name] = [index_of_value_in_list] - - hyperopt_trial_misc["idxs"] = hyperopt_trial_miscs_idxs - hyperopt_trial_misc["vals"] = hyperopt_trial_miscs_vals - hyperopt_trial_miscs.append(hyperopt_trial_misc) - - # Insert Trial name to the spec - hyperopt_trial_spec = { - "trial-name": trial.name - } - hyperopt_trial_specs.append(hyperopt_trial_spec) - - # Insert Trial result to the result - # TODO: Use negative objective value for loss or not - # TODO: Do we need to analyse additional_metrics? - objective_for_hyperopt = float(trial.target_metric.value) - if self.search_space.goal == MAX_GOAL: - # Now hyperopt only supports fmin and we need to reverse objective value for maximization - objective_for_hyperopt = -1 * objective_for_hyperopt - hyperopt_trial_result = { - "loss": objective_for_hyperopt, - "status": hyperopt.STATUS_OK - } - hyperopt_trial_results.append(hyperopt_trial_result) - - if len(trials) > 0: - - # Create new Trial doc - hyperopt_trials = hyperopt.Trials().new_trial_docs( - tids=hyperopt_trial_new_ids, - specs=hyperopt_trial_specs, - results=hyperopt_trial_results, - miscs=hyperopt_trial_miscs) - - for i, _ in enumerate(hyperopt_trials): - hyperopt_trials[i]["state"] = hyperopt.JOB_STATE_DONE - - # Insert new set of Trial to FMin object - # Example: of inserting doc with tunning lr - # [{ - # 'state':2, - # 'tid':5, - # 'spec':{ - # 'trial-name':'tpe-example-48xl8whg' - # }, - # 'result':{ - # 'loss':-0.1135, - # 'status':'ok' - # }, - # 'misc':{ - # 'tid':5, - # 'cmd':('domain_attachment','FMinIter_Domain'), - # 'workdir':None, - # 'idxs':{ - # '--lr':[5] - # }, - # 'vals':{ - # '--lr':[0.025351232898626827] - # } - # }, - # 'exp_key':None, - # 'owner':None, - # 'version':0, - # 'book_time':None, - # 'refresh_time':None - # }] - self.fmin.trials.insert_trial_docs(hyperopt_trials) - self.fmin.trials.refresh() - - # Produce new request_number ids to make new Suggestion - hyperopt_trial_new_ids = self.fmin.trials.new_trial_ids(request_number) - random_state = self.fmin.rstate.randint(2**31 - 1) - if self.algorithm_name == RANDOM_ALGORITHM_NAME: - new_trials = self.hyperopt_algorithm( - new_ids=hyperopt_trial_new_ids, - domain=self.fmin.domain, - trials=self.fmin.trials, - seed=random_state) - elif self.algorithm_name == TPE_ALGORITHM_NAME: - # n_startup_jobs indicates for how many Trials we run random suggestion - # This must be request_number value - # After this tpe suggestion starts analyse Trial info. - # On the first run we can run suggest just once with n_startup_jobs - # Next suggest runs must be for each new Trial generation - if self.is_first_run: - new_trials = self.hyperopt_algorithm( - new_ids=hyperopt_trial_new_ids, - domain=self.fmin.domain, - trials=self.fmin.trials, - seed=random_state, - n_startup_jobs=request_number, - **self.algorithm_conf) - self.is_first_run = False - else: - new_trials = [] - for i in range(request_number): - # hyperopt_algorithm always returns one new Trial - new_trials.append(self.hyperopt_algorithm( - new_ids=[hyperopt_trial_new_ids[i]], - domain=self.fmin.domain, - trials=self.fmin.trials, - seed=random_state, - n_startup_jobs=request_number, - **self.algorithm_conf)[0]) - - # Construct return advisor Trials from new hyperopt Trials - list_of_assignments = [] - for i in range(request_number): - vals = new_trials[i]['misc']['vals'] - list_of_assignments.append(BaseHyperoptService.convert(self.search_space, vals)) - return list_of_assignments - - @staticmethod - def convert(search_space, vals): - assignments = [] - for param in search_space.params: - if param.type == INTEGER: - assignments.append(Assignment(param.name, int(vals[param.name][0]))) - elif param.type == DOUBLE: - assignments.append(Assignment(param.name, vals[param.name][0])) - elif param.type == CATEGORICAL or param.type == DISCRETE: - assignments.append( - Assignment(param.name, param.list[vals[param.name][0]])) - return assignments diff --git a/pkg/suggestion/v1alpha3/hyperopt/service.py b/pkg/suggestion/v1alpha3/hyperopt/service.py deleted file mode 100644 index 5336b693800..00000000000 --- a/pkg/suggestion/v1alpha3/hyperopt/service.py +++ /dev/null @@ -1,123 +0,0 @@ -import logging -import grpc - -from pkg.apis.manager.v1alpha3.python import api_pb2 -from pkg.apis.manager.v1alpha3.python import api_pb2_grpc - -from pkg.suggestion.v1alpha3.internal.search_space import HyperParameterSearchSpace -from pkg.suggestion.v1alpha3.internal.trial import Trial, Assignment -from pkg.suggestion.v1alpha3.hyperopt.base_service import BaseHyperoptService -from pkg.suggestion.v1alpha3.internal.base_health_service import HealthServicer - -logger = logging.getLogger(__name__) - - -class HyperoptService(api_pb2_grpc.SuggestionServicer, HealthServicer): - - def __init__(self): - super(HyperoptService, self).__init__() - self.base_service = None - self.is_first_run = True - - def GetSuggestions(self, request, context): - """ - Main function to provide suggestion. - """ - name, config = OptimizerConfiguration.convert_algorithm_spec( - request.experiment.spec.algorithm) - - if self.is_first_run: - search_space = HyperParameterSearchSpace.convert(request.experiment) - self.base_service = BaseHyperoptService( - algorithm_name=name, - algorithm_conf=config, - search_space=search_space) - self.is_first_run = False - - trials = Trial.convert(request.trials) - new_assignments = self.base_service.getSuggestions(trials, request.request_number) - return api_pb2.GetSuggestionsReply( - parameter_assignments=Assignment.generate(new_assignments) - ) - - def ValidateAlgorithmSettings(self, request, context): - is_valid, message = OptimizerConfiguration.validate_algorithm_spec( - request.experiment.spec.algorithm) - if not is_valid: - context.set_code(grpc.StatusCode.INVALID_ARGUMENT) - context.set_details(message) - logger.error(message) - return api_pb2.ValidateAlgorithmSettingsReply() - - -class OptimizerConfiguration: - __conversion_dict = { - 'tpe': { - 'gamma': lambda x: float(x), - 'prior_weight': lambda x: float(x), - 'n_EI_candidates': lambda x: int(x), - "random_state": lambda x: int(x), - }, - "random": { - "random_state": lambda x: int(x), - } - } - - @classmethod - def convert_algorithm_spec(cls, algorithm_spec): - ret = {} - setting_schema = cls.__conversion_dict[algorithm_spec.algorithm_name] - for s in algorithm_spec.algorithm_setting: - if s.name in setting_schema: - ret[s.name] = setting_schema[s.name](s.value) - - return algorithm_spec.algorithm_name, ret - - @classmethod - def validate_algorithm_spec(cls, algorithm_spec): - algo_name = algorithm_spec.algorithm_name - if algo_name == 'tpe': - return cls._validate_tpe_setting(algorithm_spec.algorithm_setting) - elif algo_name == 'random': - return cls._validate_random_setting(algorithm_spec.algorithm_setting) - else: - return False, "unknown algorithm name {}".format(algo_name) - - @classmethod - def _validate_tpe_setting(cls, algorithm_settings): - for s in algorithm_settings: - try: - if s.name == 'gamma': - if not 1 > float(s.value) > 0: - return False, "gamma should be in the range of (0, 1)" - elif s.name == 'prior_weight': - if not float(s.value) > 0: - return False, "prior_weight should be great than zero" - elif s.name == 'n_EI_candidates': - if not int(s.value) > 0: - return False, "n_EI_candidates should be great than zero" - elif s.name == 'random_state': - if not int(s.value) >= 0: - return False, "random_state should be great or equal than zero" - else: - return False, "unknown setting {} for algorithm tpe".format(s.name) - except Exception as e: - return False, "failed to validate {name}({value}): {exception}".format( - name=s.name, value=s.value, exception=e) - - return True, "" - - @classmethod - def _validate_random_setting(cls, algorithm_settings): - for s in algorithm_settings: - try: - if s.name == 'random_state': - if not (int(s.value) >= 0): - return False, "random_state should be great or equal than zero" - else: - return False, "unknown setting {} for algorithm random".format(s.name) - except Exception as e: - return False, "failed to validate {name}({value}): {exception}".format( - name=s.name, value=s.value, exception=e) - - return True, "" diff --git a/pkg/suggestion/v1alpha3/internal/__init__.py b/pkg/suggestion/v1alpha3/internal/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/pkg/suggestion/v1alpha3/internal/base_health_service.py b/pkg/suggestion/v1alpha3/internal/base_health_service.py deleted file mode 100644 index adb6d8506dd..00000000000 --- a/pkg/suggestion/v1alpha3/internal/base_health_service.py +++ /dev/null @@ -1,166 +0,0 @@ -# Copyright 2015 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Reference implementation for health checking in gRPC Python.""" - -import collections -import threading - -import grpc - -from pkg.apis.manager.health.python import health_pb2 as _health_pb2 -from pkg.apis.manager.health.python import health_pb2_grpc as _health_pb2_grpc - -SERVICE_NAME = _health_pb2.DESCRIPTOR.services_by_name['Health'].full_name - - -class _Watcher: - def __init__(self): - self._condition = threading.Condition() - self._responses = collections.deque() - self._open = True - - def __iter__(self): - return self - - def _next(self): - with self._condition: - while not self._responses and self._open: - self._condition.wait() - if self._responses: - return self._responses.popleft() - else: - raise StopIteration() - - def next(self): - return self._next() - - def __next__(self): - return self._next() - - def add(self, response): - with self._condition: - self._responses.append(response) - self._condition.notify() - - def close(self): - with self._condition: - self._open = False - self._condition.notify() - - -def _watcher_to_send_response_callback_adapter(watcher): - - def send_response_callback(response): - if response is None: - watcher.close() - else: - watcher.add(response) - - return send_response_callback - - -class HealthServicer(_health_pb2_grpc.HealthServicer): - """Servicer handling RPCs for service statuses.""" - - def __init__(self, - experimental_non_blocking=True, - experimental_thread_pool=None): - self._lock = threading.RLock() - self._server_status = {} - self._send_response_callbacks = {} - self.Watch.__func__.experimental_non_blocking = experimental_non_blocking - self.Watch.__func__.experimental_thread_pool = experimental_thread_pool - self._gracefully_shutting_down = False - self.set("manager.v1alpha3.Suggestion", _health_pb2.HealthCheckResponse.SERVING) - - def _on_close_callback(self, send_response_callback, service): - - def callback(): - with self._lock: - self._send_response_callbacks[service].remove( - send_response_callback) - send_response_callback(None) - - return callback - - def Check(self, request, context): - with self._lock: - status = self._server_status.get(request.service) - if status is None: - print(request.service) - context.set_code(grpc.StatusCode.NOT_FOUND) - return _health_pb2.HealthCheckResponse() - else: - return _health_pb2.HealthCheckResponse(status=status) - - # pylint: disable=arguments-differ - def Watch(self, request, context, send_response_callback=None): - blocking_watcher = None - if send_response_callback is None: - # The server does not support the experimental_non_blocking - # parameter. For backwards compatibility, return a blocking response - # generator. - blocking_watcher = _Watcher() - send_response_callback = _watcher_to_send_response_callback_adapter( - blocking_watcher) - service = request.service - with self._lock: - status = self._server_status.get(service) - if status is None: - status = _health_pb2.HealthCheckResponse.SERVICE_UNKNOWN # pylint: disable=no-member - send_response_callback( - _health_pb2.HealthCheckResponse(status=status)) - if service not in self._send_response_callbacks: - self._send_response_callbacks[service] = set() - self._send_response_callbacks[service].add(send_response_callback) - context.add_callback( - self._on_close_callback(send_response_callback, service)) - return blocking_watcher - - def set(self, service, status): - """Sets the status of a service. - - Args: - service: string, the name of the service. NOTE, '' must be set. - status: HealthCheckResponse.status enum value indicating the status of - the service - """ - with self._lock: - if self._gracefully_shutting_down: - return - else: - self._server_status[service] = status - if service in self._send_response_callbacks: - for send_response_callback in self._send_response_callbacks[ - service]: - send_response_callback( - _health_pb2.HealthCheckResponse(status=status)) - - def enter_graceful_shutdown(self): - """Permanently sets the status of all services to NOT_SERVING. - - This should be invoked when the server is entering a graceful shutdown - period. After this method is invoked, future attempts to set the status - of a service will be ignored. - - This is an EXPERIMENTAL API. - """ - with self._lock: - if self._gracefully_shutting_down: - return - else: - for service in self._server_status: - self.set(service, - _health_pb2.HealthCheckResponse.NOT_SERVING) # pylint: disable=no-member - self._gracefully_shutting_down = True diff --git a/pkg/suggestion/v1alpha3/internal/constant.py b/pkg/suggestion/v1alpha3/internal/constant.py deleted file mode 100644 index e0b9715e938..00000000000 --- a/pkg/suggestion/v1alpha3/internal/constant.py +++ /dev/null @@ -1,7 +0,0 @@ -MAX_GOAL = "MAXIMIZE" -MIN_GOAL = "MINIMIZE" - -INTEGER = "INTEGER" -DOUBLE = "DOUBLE" -CATEGORICAL = "CATEGORICAL" -DISCRETE = "DISCRETE" diff --git a/pkg/suggestion/v1alpha3/internal/search_space.py b/pkg/suggestion/v1alpha3/internal/search_space.py deleted file mode 100644 index 0f2d694c021..00000000000 --- a/pkg/suggestion/v1alpha3/internal/search_space.py +++ /dev/null @@ -1,82 +0,0 @@ -import logging -from pkg.apis.manager.v1alpha3.python import api_pb2 as api - -from pkg.suggestion.v1alpha3.internal.constant import * - - -logging.basicConfig(level=logging.DEBUG) -logger = logging.getLogger(__name__) - - -class HyperParameterSearchSpace(object): - def __init__(self): - self.goal = "" - self.params = [] - - @staticmethod - def convert(experiment): - search_space = HyperParameterSearchSpace() - if experiment.spec.objective.type == api.MAXIMIZE: - search_space.goal = MAX_GOAL - elif experiment.spec.objective.type == api.MINIMIZE: - search_space.goal = MIN_GOAL - for p in experiment.spec.parameter_specs.parameters: - search_space.params.append( - HyperParameterSearchSpace.convertParameter(p)) - return search_space - - def __str__(self): - return "HyperParameterSearchSpace(goal: {}, ".format(self.goal) + \ - "params: {})".format(", ".join([element.__str__() for element in self.params])) - - @staticmethod - def convertParameter(p): - if p.parameter_type == api.INT: - # Default value for INT parameter step is 1 - step = 1 - if p.feasible_space.step is not None and p.feasible_space.step != "": - step = p.feasible_space.step - return HyperParameter.int(p.name, p.feasible_space.min, p.feasible_space.max, step) - elif p.parameter_type == api.DOUBLE: - return HyperParameter.double(p.name, p.feasible_space.min, p.feasible_space.max, p.feasible_space.step) - elif p.parameter_type == api.CATEGORICAL: - return HyperParameter.categorical(p.name, p.feasible_space.list) - elif p.parameter_type == api.DISCRETE: - return HyperParameter.discrete(p.name, p.feasible_space.list) - else: - logger.error( - "Cannot get the type for the parameter: %s (%s)", p.name, p.parameter_type) - - -class HyperParameter(object): - def __init__(self, name, type_, min_, max_, list_, step): - self.name = name - self.type = type_ - self.min = min_ - self.max = max_ - self.list = list_ - self.step = step - - def __str__(self): - if self.type == INTEGER or self.type == DOUBLE: - return "HyperParameter(name: {}, type: {}, min: {}, max: {}, step: {})".format( - self.name, self.type, self.min, self.max, self.step) - else: - return "HyperParameter(name: {}, type: {}, list: {})".format( - self.name, self.type, ", ".join(self.list)) - - @staticmethod - def int(name, min_, max_, step): - return HyperParameter(name, INTEGER, min_, max_, [], step) - - @staticmethod - def double(name, min_, max_, step): - return HyperParameter(name, DOUBLE, min_, max_, [], step) - - @staticmethod - def categorical(name, lst): - return HyperParameter(name, CATEGORICAL, 0, 0, [str(e) for e in lst], 0) - - @staticmethod - def discrete(name, lst): - return HyperParameter(name, DISCRETE, 0, 0, [str(e) for e in lst], 0) diff --git a/pkg/suggestion/v1alpha3/internal/trial.py b/pkg/suggestion/v1alpha3/internal/trial.py deleted file mode 100644 index 754de429fc1..00000000000 --- a/pkg/suggestion/v1alpha3/internal/trial.py +++ /dev/null @@ -1,95 +0,0 @@ -import logging -from pkg.apis.manager.v1alpha3.python import api_pb2 as api - - -logging.basicConfig(level=logging.DEBUG) -logger = logging.getLogger(__name__) - - -class Trial(object): - def __init__(self, name, assignments, target_metric, metric_name, additional_metrics): - self.name = name - self.assignments = assignments - self.target_metric = target_metric - self.metric_name = metric_name - self.additional_metrics = additional_metrics - - @staticmethod - def convert(trials): - res = [] - for trial in trials: - if trial.status.condition == api.TrialStatus.TrialConditionType.SUCCEEDED: - new_trial = Trial.convertTrial(trial) - if new_trial is not None: - res.append(Trial.convertTrial(trial)) - return res - - @staticmethod - def convertTrial(trial): - assignments = [] - for assignment in trial.spec.parameter_assignments.assignments: - assignments.append(Assignment.convert(assignment)) - metric_name = trial.spec.objective.objective_metric_name - target_metric, additional_metrics = Metric.convert( - trial.status.observation, metric_name) - # If the target_metric is none, ignore the trial. - if target_metric is not None: - trial = Trial(trial.name, assignments, target_metric, - metric_name, additional_metrics) - return trial - return None - - def __str__(self): - if self.name is None: - return "Trial(assignment: {})".format(", ".join([str(e) for e in self.assignments])) - else: - return "Trial(assignment: {}, metric_name: {}, metric: {}, additional_metrics: {})".format( - ", ".join([str(e) for e in self.assignments]), - self.metric_name, self.target_metric, - ", ".join(str(e) for e in self.additional_metrics)) - - -class Assignment(object): - def __init__(self, name, value): - self.name = name - self.value = value - - @staticmethod - def convert(assignment): - return Assignment(assignment.name, assignment.value) - - @staticmethod - def generate(list_of_assignments): - res = [] - for assignments in list_of_assignments: - buf = [] - for assignment in assignments: - buf.append( - api.ParameterAssignment(name=assignment.name, value=str(assignment.value))) - rt = api.GetSuggestionsReply.ParameterAssignments( - assignments=buf) - res.append(rt) - return res - - def __str__(self): - return "Assignment(name={}, value={})".format(self.name, self.value) - - -class Metric(object): - def __init__(self, name, value): - self.name = name - self.value = value - - @staticmethod - def convert(observation, target): - metric = None - additional_metrics = [] - for m in observation.metrics: - if m.name == target: - metric = Metric(m.name, m.value) - else: - additional_metrics.append(Metric(m.name, m.value)) - return metric, additional_metrics - - def __str__(self): - return "Metric(name={}, value={})".format(self.name, self.value) diff --git a/pkg/suggestion/v1alpha3/nas/darts/README.md b/pkg/suggestion/v1alpha3/nas/darts/README.md deleted file mode 100644 index e050a72fc5a..00000000000 --- a/pkg/suggestion/v1alpha3/nas/darts/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# About the Differentiable Architecture Search - -The algorithm follows the idea proposed in _DARTS: Differentiable Architecture Search_ by Hanxiao Liu, Karen Simonyan, Yiming Yang (https://arxiv.org/abs/1806.09055). - -The implementation is based on [official github implementation](https://github.com/quark0/darts) and [popular repository](https://github.com/khanrc/pt.darts). - -The algorithm addresses the scalability challenge of architecture search by formulating the task in a differentiable manner. It is based on continuous relaxation and gradient descent in the search space. It is able to efficiently design high-performance convolutional architectures for image classification (on CIFAR-10 and ImageNet) and recurrent architectures for language modeling (on Penn Treebank and WikiText-2). - -## Katib implementation - -To support DARTS in current Katib functionality the implementation follows this way: - -1. DARTS Suggestion service creates set of primitive operations from the Experiment search space. For example: `['separable_convolution_3x3', 'dilated_convolution_3x3', 'dilated_convolution_5x5', 'avg_pooling_3x3', 'max_pooling_3x3', 'skip_connection']`. - -2. Suggestion returns algorithm settings, number of layers and set of primitives to Katib Controller - -3. Katib controller starts training container with appropriate settings and all possible operations. - -4. Training container runs DARTS algorithm. - -5. Metrics collector saves Best Genotype from the training container log. - -Experiment example you can find [here](https://github.com/kubeflow/katib/blob/master/examples/v1alpha3/nas/darts-example-gpu.yaml). -You can find DARTS Suggestion service source code [here](https://github.com/kubeflow/katib/tree/master/pkg/suggestion/v1alpha3/nas/darts) and DARTS training container implementation [here](https://github.com/kubeflow/katib/tree/master/examples/v1alpha3/nas/darts-cnn-cifar10). - -### Best Genotype representation - -Best Genotype is the best cell for each neural network layer. Cells are generated by DARTS algorithm. -Here is an example of the Best Genotype: - -``` -Genotype( - normal=[ - [('max_pooling_3x3',0),('max_pooling_3x3',1)], - [('max_pooling_3x3',0),('max_pooling_3x3',1)], - [('max_pooling_3x3',0),('dilated_convolution_3x3',3)], - [('max_pooling_3x3',0),('max_pooling_3x3',1)] - ], - normal_concat=range(2,6), - reduce=[ - [('dilated_convolution_5x5',1),('separable_convolution_3x3',0)], - [('max_pooling_3x3',2),('dilated_convolution_5x5',1)], - [('dilated_convolution_5x5',3),('dilated_convolution_5x5',2)], - [('dilated_convolution_5x5',3),('dilated_convolution_5x5',4)] - ], - reduce_concat=range(2,6) -) -``` - -In this example you can see 4 DARTS nodes with indexes: 2,3,4,5. - -`reduce` parameter is the cells which located at the 1/3 and 2/3 of the total neural network layers. They represent reduction cells in which all the operations adjacent to the input nodes are of stride two. - -`normal` parameter is the cells which is located at the rest neural network layers. They represent normal cell. - -In CNN all reduce and normal intermediate nodes are concatenated and each node has 2 edges. - -Each element in `normal` array is the node which has 2 edges. First element is the operation on the edge and second element is the node index connection. Note that index 0 is the `C_{k-2}` node and index 1 is the `C_{k-1}` node. - -For example `[('max_pooling_3x3',0),('max_pooling_3x3',1)]` means that `C_{k-2}` node connects to the first node with `max_pooling_3x3` operation (Max Pooling with filter size 3) and `C_{k-1}` node connects to the first node with `max_pooling_3x3` operation. - -`reduce` array follows the same way as `normal` array. - -`normal_concat` and `reduce_concat` means concatenation between intermediate nodes. - -Currently, it supports running only on single GPU and second-order approximation, which produced better results than first-order. - -## TODO list - -- Integrate E2E test in CI. Create simple example, which can run on CPU. - -- Add validation to Suggestion service. - -- Support multi GPU training. Add functionality to select GPU for training. - -- Support DARTS in Katib UI. - -- Think about better representation of Best Genotype. - -- Add more dataset for CNN. Currently, it supports only CIFAR-10. - -- Support RNN in addition to CNN. - -- Support micro mode, which means searching for a particular neural network cell. diff --git a/pkg/suggestion/v1alpha3/nas/darts/__init__.py b/pkg/suggestion/v1alpha3/nas/darts/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/pkg/suggestion/v1alpha3/nas/darts/service.py b/pkg/suggestion/v1alpha3/nas/darts/service.py deleted file mode 100644 index d8d93c399a8..00000000000 --- a/pkg/suggestion/v1alpha3/nas/darts/service.py +++ /dev/null @@ -1,123 +0,0 @@ -import logging -from logging import getLogger, StreamHandler, INFO -import json - -from pkg.suggestion.v1alpha3.internal.base_health_service import HealthServicer -from pkg.apis.manager.v1alpha3.python import api_pb2 -from pkg.apis.manager.v1alpha3.python import api_pb2_grpc - - -class DartsService(api_pb2_grpc.SuggestionServicer, HealthServicer): - - def __init__(self): - super(DartsService, self).__init__() - self.is_first_run = True - - self.logger = getLogger(__name__) - FORMAT = '%(asctime)-15s Experiment %(experiment_name)s %(message)s' - logging.basicConfig(format=FORMAT) - handler = StreamHandler() - handler.setLevel(INFO) - self.logger.setLevel(INFO) - self.logger.addHandler(handler) - self.logger.propagate = False - - # TODO: Add validation - def ValidateAlgorithmSettings(self, request, context): - return api_pb2.ValidateAlgorithmSettingsReply() - - def GetSuggestions(self, request, context): - if self.is_first_run: - nas_config = request.experiment.spec.nas_config - num_layers = str(nas_config.graph_config.num_layers) - - search_space = get_search_space(nas_config.operations) - - settings_raw = request.experiment.spec.algorithm.algorithm_setting - algorithm_settings = get_algorithm_settings(settings_raw) - - search_space_json = json.dumps(search_space) - algorithm_settings_json = json.dumps(algorithm_settings) - - search_space_str = str(search_space_json).replace('\"', '\'') - algorithm_settings_str = str(algorithm_settings_json).replace('\"', '\'') - - self.is_first_run = False - - parameter_assignments = [] - for i in range(request.request_number): - - self.logger.info(">>> Generate new Darts Trial Job") - - self.logger.info(">>> Number of layers {}\n".format(num_layers)) - - self.logger.info(">>> Search Space") - self.logger.info("{}\n".format(search_space_str)) - - self.logger.info(">>> Algorithm Settings") - self.logger.info("{}\n\n".format(algorithm_settings_str)) - - parameter_assignments.append( - api_pb2.GetSuggestionsReply.ParameterAssignments( - assignments=[ - api_pb2.ParameterAssignment( - name="algorithm-settings", - value=algorithm_settings_str - ), - api_pb2.ParameterAssignment( - name="search-space", - value=search_space_str - ), - api_pb2.ParameterAssignment( - name="num-layers", - value=num_layers - ) - ] - ) - ) - - return api_pb2.GetSuggestionsReply(parameter_assignments=parameter_assignments) - - -def get_search_space(operations): - search_space = [] - - for operation in list(operations.operation): - opt_type = operation.operation_type - - if opt_type == "skip_connection": - search_space.append(opt_type) - else: - # Currently support only one Categorical parameter - filter size - opt_spec = list(operation.parameter_specs.parameters)[0] - for filter_size in list(opt_spec.feasible_space.list): - search_space.append(opt_type+"_{}x{}".format(filter_size, filter_size)) - return search_space - - -# TODO: Add more algorithm settings -def get_algorithm_settings(settings_raw): - - algorithm_settings_default = { - "num_epochs": 50, - "w_lr": 0.025, - "w_lr_min": 0.001, - "w_momentum": 0.9, - "w_weight_decay": 3e-4, - "w_grad_clip": 5., - "alpha_lr": 3e-4, - "alpha_weight_decay": 1e-3, - "batch_size": 128, - "num_workers": 4, - "init_channels": 16, - "print_step": 50, - "num_nodes": 4, - "stem_multiplier": 3, - } - - for setting in settings_raw: - s_name = setting.name - s_value = setting.value - algorithm_settings_default[s_name] = s_value - - return algorithm_settings_default diff --git a/pkg/suggestion/v1alpha3/nas/enas/AlgorithmSettings.py b/pkg/suggestion/v1alpha3/nas/enas/AlgorithmSettings.py deleted file mode 100644 index 064b503a533..00000000000 --- a/pkg/suggestion/v1alpha3/nas/enas/AlgorithmSettings.py +++ /dev/null @@ -1,42 +0,0 @@ - -algorithmSettingsValidator = { - "controller_hidden_size": [int, [1, 'inf']], - "controller_temperature": [float, [0, 'inf']], - "controller_tanh_const": [float, [0, 'inf']], - "controller_entropy_weight": [float, [0.0, 'inf']], - "controller_baseline_decay": [float, [0.0, 1.0]], - "controller_learning_rate": [float, [0.0, 1.0]], - "controller_skip_target": [float, [0.0, 1.0]], - "controller_skip_weight": [float, [0.0, 'inf']], - "controller_train_steps": [int, [1, 'inf']], - "controller_log_every_steps": [int, [1, 'inf']], -} -enableNoneSettingsList = [ - "controller_temperature", "controller_tanh_const", "controller_entropy_weight", "controller_skip_weight"] - - -def parseAlgorithmSettings(settings_raw): - - algorithm_settings_default = { - "controller_hidden_size": 64, - "controller_temperature": 5., - "controller_tanh_const": 2.25, - "controller_entropy_weight": 1e-5, - "controller_baseline_decay": 0.999, - "controller_learning_rate": 5e-5, - "controller_skip_target": 0.4, - "controller_skip_weight": 0.8, - "controller_train_steps": 50, - "controller_log_every_steps": 10, - } - - for setting in settings_raw: - s_name = setting.name - s_value = setting.value - if s_value == "None": - algorithm_settings_default[s_name] = None - else: - s_type = algorithmSettingsValidator[s_name][0] - algorithm_settings_default[s_name] = s_type(s_value) - - return algorithm_settings_default diff --git a/pkg/suggestion/v1alpha3/nas/enas/Controller.py b/pkg/suggestion/v1alpha3/nas/enas/Controller.py deleted file mode 100755 index cb3ec4021b7..00000000000 --- a/pkg/suggestion/v1alpha3/nas/enas/Controller.py +++ /dev/null @@ -1,243 +0,0 @@ -import tensorflow as tf -import numpy as np - - -class Controller(object): - def __init__(self, - num_layers=12, - num_operations=16, - controller_hidden_size=64, - controller_temperature=5., - controller_tanh_const=2.25, - controller_entropy_weight=1e-5, - controller_baseline_decay=0.999, - controller_learning_rate=5e-5, - controller_skip_target=0.4, - controller_skip_weight=0.8, - controller_name="controller", - logger=None): - - self.logger = logger - self.logger.info(">>> Building Controller\n") - - self.num_layers = num_layers - self.num_operations = num_operations - - self.controller_hidden_size = controller_hidden_size - self.controller_temperature = controller_temperature - self.controller_tanh_const = controller_tanh_const - self.controller_entropy_weight = controller_entropy_weight - self.controller_baseline_decay = controller_baseline_decay - self.controller_learning_rate = controller_learning_rate - self.controller_skip_target = controller_skip_target - self.controller_skip_weight = controller_skip_weight - - self.controller_name = controller_name - - self._build_params() - self._build_sampler() - - def _build_params(self): - """Create TF parameters""" - self.logger.info(">>> Building Controller Parameters\n") - initializer = tf.random_uniform_initializer(minval=-0.01, maxval=0.01) - hidden_size = self.controller_hidden_size - - with tf.compat.v1.variable_scope(self.controller_name, initializer=initializer): - with tf.compat.v1.variable_scope("lstm"): - self.w_lstm = tf.compat.v1.get_variable("w", [2 * hidden_size, 4 * hidden_size]) - - self.g_emb = tf.compat.v1.get_variable("g_emb", [1, hidden_size]) - - with tf.compat.v1.variable_scope("embedding"): - self.w_emb = tf.compat.v1.get_variable("w", [self.num_operations, hidden_size]) - - with tf.compat.v1.variable_scope("softmax"): - self.w_soft = tf.compat.v1.get_variable("w", [hidden_size, self.num_operations]) - - with tf.compat.v1.variable_scope('attention'): - self.attn_w_1 = tf.compat.v1.get_variable('w_1', [hidden_size, hidden_size]) - self.attn_w_2 = tf.compat.v1.get_variable("w_2", [hidden_size, hidden_size]) - self.attn_v = tf.compat.v1.get_variable('v', [hidden_size, 1]) - - num_params = sum([np.prod(v.shape) - for v in tf.compat.v1.trainable_variables() if v.name.startswith(self.controller_name)]) - self.logger.info(">>> Controller has {} Trainable params\n".format(num_params)) - - def _build_sampler(self): - """Build the sampler ops and the log_prob ops.""" - self.logger.info(">>> Building Controller Sampler\n") - - hidden_size = self.controller_hidden_size - - arc_seq = [] - sample_log_probs = [] - sample_entropies = [] - - skip_penalties = [] - skip_count = [] - - all_h = [] - all_h_w = [] - - prev_c = tf.zeros([1, hidden_size], tf.float32) - prev_h = tf.zeros([1, hidden_size], tf.float32) - - skip_targets = tf.constant([1.0 - self.controller_skip_target, self.controller_skip_target], - dtype=tf.float32) - - inputs = self.g_emb - - for layer_id in range(self.num_layers): - - next_c, next_h = _lstm(inputs, prev_c, prev_h, self.w_lstm) - prev_c, prev_h = next_c, next_h - - logits = tf.matmul(next_h, self.w_soft) - - if self.controller_temperature is not None: - logits /= self.controller_temperature - if self.controller_tanh_const is not None: - logits = self.controller_tanh_const * tf.tanh(logits) - - func = tf.random.categorical(logits, 1) - func = tf.dtypes.cast(func, tf.int32) - func = tf.reshape(func, [1]) - - arc_seq.append(func) - - log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits( - logits=logits, labels=func) - - sample_log_probs.append(log_prob) - entropy = log_prob * tf.exp(-log_prob) - entropy = tf.stop_gradient(entropy) - sample_entropies.append(entropy) - inputs = tf.nn.embedding_lookup(self.w_emb, func) - - next_c, next_h = _lstm(inputs, prev_c, prev_h, self.w_lstm) - prev_c, prev_h = next_c, next_h - - if layer_id > 0: - - query = tf.matmul(next_h, self.attn_w_2) - query = query + tf.concat(all_h_w, axis=0) - query = tf.tanh(query) - query = tf.matmul(query, self.attn_v) - - logits = tf.concat([-query, query], axis=1) - - if self.controller_temperature is not None: - logits /= self.controller_temperature - if self.controller_tanh_const is not None: - logits = self.controller_tanh_const * tf.tanh(logits) - - skip_index = tf.random.categorical(logits, 1) - skip_index = tf.dtypes.cast(skip_index, tf.int32) - - skip_index = tf.reshape(skip_index, [layer_id]) - arc_seq.append(skip_index) - - skip_prob = tf.sigmoid(logits) - kl = skip_prob * tf.math.log(skip_prob/skip_targets) - kl = tf.reduce_sum(kl) - skip_penalties.append(kl) - - log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits( - logits=logits, labels=skip_index) - - sample_log_probs.append(tf.reduce_sum(log_prob, keepdims=True)) - - entropy = tf.stop_gradient( - tf.reduce_sum(log_prob * tf.exp(-log_prob), keepdims=True)) - sample_entropies.append(entropy) - - skip_index = tf.dtypes.cast(skip_index, tf.float32) - skip_index = tf.reshape(skip_index, [1, layer_id]) - - skip_count.append(tf.reduce_sum(skip_index)) - - inputs = tf.matmul(skip_index, tf.concat(all_h, axis=0)) - - inputs /= (1.0 + tf.reduce_sum(skip_index)) - else: - inputs = self.g_emb - - all_h.append(next_h) - all_h_w.append(tf.matmul(next_h, self.attn_w_1)) - - arc_seq = tf.concat(arc_seq, axis=0) - self.sample_arc = tf.reshape(arc_seq, [-1]) - - sample_entropies = tf.stack(sample_entropies) - self.sample_entropy = tf.reduce_sum(sample_entropies) - - sample_log_probs = tf.stack(sample_log_probs, axis=0) - self.sample_log_probs = tf.reduce_sum(sample_log_probs) - - skip_penalties = tf.stack(skip_penalties) - self.skip_penalties = tf.reduce_mean(skip_penalties) - - skip_count = tf.stack(skip_count) - self.skip_count = tf.reduce_sum(skip_count) - - def build_trainer(self): - """Build the train ops by connecting Controller with candidate.""" - self.child_val_accuracy = tf.compat.v1.placeholder(tf.float32, shape=()) - - self.reward = self.child_val_accuracy - - normalize = tf.dtypes.cast((self.num_layers * (self.num_layers - 1) / 2), tf.float32) - self.skip_rate = tf.dtypes.cast((self.skip_count / normalize), tf.float32) - - if self.controller_entropy_weight is not None: - self.reward += self.controller_entropy_weight * self.sample_entropy - - self.sample_log_probs = tf.reduce_sum(self.sample_log_probs) - self.baseline = tf.Variable(0.0, dtype=tf.float32, trainable=False) - baseline_update = tf.compat.v1.assign_sub( - self.baseline, (1 - self.controller_baseline_decay) * (self.baseline - self.reward)) - - with tf.control_dependencies([baseline_update]): - self.reward = tf.identity(self.reward) - - self.loss = self.sample_log_probs * (self.reward - self.baseline) - - if self.controller_skip_weight is not None: - self.loss += self.controller_skip_weight * self.skip_penalties - - self.train_step = tf.Variable( - 0, dtype=tf.int32, trainable=False, name=self.controller_name + '_train_step') - - tf_variables = [var for var in tf.compat.v1.trainable_variables() - if var.name.startswith(self.controller_name)] - - self.train_op, self.grad_norm = _build_train_op( - loss=self.loss, - tf_variables=tf_variables, - train_step=self.train_step, - learning_rate=self.controller_learning_rate) - - -# TODO: will remove this function and use tf.nn.LSTMCell instead -def _lstm(x, prev_c, prev_h, w_lstm): - ifog = tf.matmul(tf.concat([x, prev_h], axis=1), w_lstm) - i, f, o, g = tf.split(ifog, 4, axis=1) - i = tf.sigmoid(i) - f = tf.sigmoid(f) - o = tf.sigmoid(o) - g = tf.tanh(g) - next_c = i * g + f * prev_c - next_h = o * tf.tanh(next_c) - return next_c, next_h - - -def _build_train_op(loss, tf_variables, train_step, learning_rate): - """Build training ops from `loss` tensor.""" - optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate) - grads = tf.gradients(loss, tf_variables) - - grad_norm = tf.linalg.global_norm(grads) - train_op = optimizer.apply_gradients(zip(grads, tf_variables), global_step=train_step) - - return train_op, grad_norm diff --git a/pkg/suggestion/v1alpha3/nas/enas/Operation.py b/pkg/suggestion/v1alpha3/nas/enas/Operation.py deleted file mode 100644 index 2de7eb1600c..00000000000 --- a/pkg/suggestion/v1alpha3/nas/enas/Operation.py +++ /dev/null @@ -1,77 +0,0 @@ -import itertools -import numpy as np -from pkg.apis.manager.v1alpha3.python import api_pb2 - - -class Operation(object): - def __init__(self, opt_id, opt_type, opt_params): - self.opt_id = opt_id - self.opt_type = opt_type - self.opt_params = opt_params - - def get_dict(self): - opt_dict = dict() - opt_dict['opt_id'] = self.opt_id - opt_dict['opt_type'] = self.opt_type - opt_dict['opt_params'] = self.opt_params - return opt_dict - - def print_op(self, logger): - logger.info("Operation ID: \n\t{}".format(self.opt_id)) - logger.info("Operation Type: \n\t{}".format(self.opt_type)) - logger.info("Operations Parameters:") - for ikey in self.opt_params: - logger.info("\t{}: {}".format(ikey, self.opt_params[ikey])) - logger.info("") - - -class SearchSpace(object): - def __init__(self, operations): - self.operation_list = list(operations.operation) - self.search_space = list() - self._parse_operations() - self.num_operations = len(self.search_space) - - def _parse_operations(self): - # search_sapce is a list of Operation class - - operation_id = 0 - - for operation_dict in self.operation_list: - opt_type = operation_dict.operation_type - opt_spec = list(operation_dict.parameter_specs.parameters) - # avail_space is dict with the format {"spec_nam": [spec feasible values]} - avail_space = dict() - num_spec = len(opt_spec) - - for ispec in opt_spec: - spec_name = ispec.name - if ispec.parameter_type == api_pb2.CATEGORICAL: - avail_space[spec_name] = list(ispec.feasible_space.list) - elif ispec.parameter_type == api_pb2.INT: - spec_min = int(ispec.feasible_space.min) - spec_max = int(ispec.feasible_space.max) - spec_step = int(ispec.feasible_space.step) - avail_space[spec_name] = range( - spec_min, spec_max+1, spec_step) - elif ispec.parameter_type == api_pb2.DOUBLE: - spec_min = float(ispec.feasible_space.min) - spec_max = float(ispec.feasible_space.max) - spec_step = float(ispec.feasible_space.step) - double_list = np.arange( - spec_min, spec_max+spec_step, spec_step) - if double_list[-1] > spec_max: - del double_list[-1] - avail_space[spec_name] = double_list - - # generate all the combinations of possible operations - key_avail_space = list(avail_space.keys()) - val_avail_space = list(avail_space.values()) - - for this_opt_vector in itertools.product(*val_avail_space): - opt_params = dict() - for i in range(num_spec): - opt_params[key_avail_space[i]] = this_opt_vector[i] - this_opt_class = Operation(operation_id, opt_type, opt_params) - self.search_space.append(this_opt_class) - operation_id += 1 diff --git a/pkg/suggestion/v1alpha3/nas/enas/README.md b/pkg/suggestion/v1alpha3/nas/enas/README.md deleted file mode 100644 index 49cf3c3d11a..00000000000 --- a/pkg/suggestion/v1alpha3/nas/enas/README.md +++ /dev/null @@ -1,136 +0,0 @@ -# About the Efficient Neural Architecture Search - -The algorithm follows the idea proposed in _Efficient Neural Architecture Search via Parameter Sharing_ by Hieu Pham, Melody Y. Guan, Barret Zoph, Quoc V. Le and Jeff Dean (https://arxiv.org/abs/1802.03268) and _Neural Architecture Search with Reinforcement Learning_ by Barret Zoph and Quoc V. Le (https://arxiv.org/abs/1611.01578). - -The implementation is based on the github of _Efficient Neural Architecture Search via Parameter Sharing_ (https://github.com/melodyguan/enas and https://github.com/google-research/google-research/tree/master/enas_lm). It uses a recurrent neural network with LSTM cells as controller to generate neural architecture candidates. And this controller network is updated by policy gradients. However, it currently does not support parameter sharing. - -## Definition of a Neural Architecture - -Define the number of layers is n, the number of possible operations is m. - -If n = 12, m = 6, the definition of an architecture will be like: - -``` -[2] -[0 0] -[1 1 0] -[5 1 0 1] -[1 1 1 0 1] -[5 0 0 1 0 1] -[1 1 1 0 0 1 0] -[2 0 0 0 1 1 0 1] -[0 0 0 1 1 1 1 1 0] -[2 0 1 0 1 1 1 0 0 0] -[3 1 1 1 1 1 1 0 0 1 1] -[0 1 1 1 1 0 0 1 1 1 1 0] -``` - -There are n rows, the ith row has i elements and describes the ith layer. Please notice that layer 0 is the input and is not included in this definition. - -In each row, the first integer ranges from 0 to m-1 and indicates the operation in this layer. -Starting from the second position, the kth integer is a boolean value that indicates whether (k-2)th layer has a skip connection with this layer. (There will always be a connection from (k-1)th layer to kth layer) - -## Output of `GetSuggestion()` - -The output of `GetSuggestion()` consists of two parts: `architecture` and `nn_config`. - -`architecture` is a json string of the definition of a neural architecture. The format is as stated above. One example is: - -``` -[[27], [29, 0], [22, 1, 0], [13, 0, 0, 0], [26, 1, 1, 0, 0], [30, 1, 0, 1, 0, 0], [11, 0, 1, 1, 0, 1, 1], [9, 1, 0, 0, 1, 0, 0, 0]] -``` - -`nn_config` is a json string of the detailed description of what is the num of layers, input size, output size and what each operation index stands for. A nn_config corresponding to the architecture above can be: - -``` -{ - "num_layers": 8, - "input_sizes": [32, 32, 3], - "output_sizes": [10], - "embedding": { - "27": { - "opt_id": 27, - "opt_type": "convolution", - "opt_params": { - "filter_size": "7", - "num_filter": "96", - "stride": "2" - } - }, - "29": { - "opt_id": 29, - "opt_type": "convolution", - "opt_params": { - "filter_size": "7", - "num_filter": "128", - "stride": "2" - } - }, - "22": { - "opt_id": 22, - "opt_type": "convolution", - "opt_params": { - "filter_size": "7", - "num_filter": "48", - "stride": "1" - } - }, - "13": { - "opt_id": 13, - "opt_type": "convolution", - "opt_params": { - "filter_size": "5", - "num_filter": "48", - "stride": "2" - } - }, - "26": { - "opt_id": 26, - "opt_type": "convolution", - "opt_params": { - "filter_size": "7", - "num_filter": "96", - "stride": "1" - } - }, - "30": { - "opt_id": 30, - "opt_type": "reduction", - "opt_params": { - "reduction_type": "max_pooling", - "pool_size": 2 - } - }, - "11": { - "opt_id": 11, - "opt_type": "convolution", - "opt_params": { - "filter_size": "5", - "num_filter": "32", - "stride": "2" - } - }, - "9": { - "opt_id": 9, - "opt_type": "convolution", - "opt_params": { - "filter_size": "3", - "num_filter": "128", - "stride": "2" - } - } - } -} -``` - -This neural architecture can be visualized as -![a neural network architecture example](example.png) - -## To Do - -1. Add 'micro' mode, which means searching for a neural cell instead of the whole neural network. -2. Add support for recurrent neural networks and build a training container for the Penn Treebank task. -3. Add parameter sharing, if possible. -4. Change LSTM cell from self defined functions in LSTM.py to `tf.nn.rnn_cell.LSTMCell` -5. Store the suggestion checkpoint to PVC to protect against unexpected enas service pod restarts -6. Add `RequestCount` into API so that the suggestion can clean the information of completed studies. diff --git a/pkg/suggestion/v1alpha3/nas/enas/__init__.py b/pkg/suggestion/v1alpha3/nas/enas/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/pkg/suggestion/v1alpha3/nas/enas/example.png b/pkg/suggestion/v1alpha3/nas/enas/example.png deleted file mode 100644 index 90ac2eb6190051e322d45110e9b807473a35632d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137757 zcmZU5WmweP8!Zfj3?0%SjkI)0my~pebhm(Xhje!cNT?{CA`Q|hNH-E99nx|4oOAy7 zez>1_;FBSk|%K){rjlU7GSfcPOGK(Aqsz+c9Gwv~b(h;Hh# zk_Z)}XFXky$BqYp3zy(E9I6!Xh881WyEn+|NX(y%<|}e zpZfR1KVFCvwAmz7o-6MxmP$>on;Tjs3IuLvKV)3wrA)vK|H(rfc;nrm|VnEG~IyWURAt)Ds~@}ze= znO-s5|6)leRR~`gsz}K`czu6!h#5_-u%2NYV9Vz)OO-EJY4f9SD^)|8^J9L%w^D<~ z3cNaO?ei-b6%E^XNC7pNyczx`@J2rb{V6> ztnJ5lR`Fu@Ue$w7+{Y#4Q}b?;p9pzG*1L>k^KOmsui$UGo^Fj;foJEABjx4Ve&?BI z`=c;i@NzZO&A3eVzc=N=L)5zDa-FT843}9wY=7Vz6MJaM;xG-#5({iIML#dA9mSK` zU344cjiB(cG5sR<`?}nqF&i13Fmk=g<_AqT;pMU9V~1=$N4xV`saAeGh^C4* z{B@|zV4u2(su8CSyka`Qg&imYE={@ZelpHkInGwS-&t;Lww?N%raRkGF48tp%^`X^ z%)M3JN5LIK#GbzY%f6zi_iS%&lH8>O@tB~{n(5zolSTuNOv9TyPg03TCY-Gz$$ zm44)Z(JO$X8qQAstGN8-V~F&e=+#Eb)`uJ?E=K`6tASNx*|m2qWnGyWmpctQW>SOYVqNWN-bs=)L{! zJ$4vX#|8*9?q9ue+|bmQdBS>-mmxxE^IZRCORy$Y!CpnFxY|%8IV9z&5*M%iG>>lY za=?uvx5wV>IEya^UQ+W}xabf5YdK@B|MssiE{NIh2Zizes}R`j>6loJr6Sd%03Q~e z3Z8nqDTS)k)qLgr-(>#9l@1z{o&^8h%7&)E;M)&!oqa7l7*6m)#VeuH>)pzjsV|NT z4f3gYZHiW-xwhXt_U%RmeqnH%_hQ6tV6NcU#Sp+Vn-K@RCR&)BN<8(1R6yz z;^-97E-XR#wF!a{7>Q!YV}y<-%76Kud89HfFRQPYz!oh^PEAo^6`qU~138oCV z?9?n(@2Rt$d@)f%uO@B5PK`;1w$d9%rgXgCL%X1|pZQOuWQ7FjUvgO%*XK9k5DT~z zSY%V}h7DH0f(D$L_pLhQWd5yaRJX8C;q15OpG3gL+1oC=G(T&~pA2`&d`u=oJUL8e z_nQ2m^uh1yq)BC*_P^rzUIJ9baf~!Ro-|nEQ%4ZAR=d;XR)?(@%HMvkbw?u36#!0XTQ}LEffCS zob8y$KmWss>Pj_k3WA^i?&gABdI&AB^p`+5`}g!98jKevCI4F+C#dEc`o*Q~Zi+a9 z>n6O$PL~@ny#8B}A+EaE+FMWwb{;2YWd&VF;VV!&)+E6DjRZi z*~xzs{9lY7(NxKLNcIoTW+N%_^SpcaW~-&} z8$j9ZzXk2^gTq|S*3Dsi#&a9)&ZoI5XL}%roZ9ZM?YUpCOS=uRHD)?3eaotN)vRE& z$YnW*|1Ac5pp7x7PVs-ykqeIwfj%XJS1_n*ooZD}D!lzMI8K$f>nbgl1`EGhf2Ymc5eO=%o zdWm3rs-7SY_I{*sB_QWI_07pJ@{t$VHyqOCDwk%;;j)aT_Cl7#cEXa#zCI?;-L9Z zVJ>yd_bVc9Vfaqp>%J$}RCc1r-yhQ-6?1%jIihd*iDY5-->RWnNBy)3`1G9GIjf6Og3?(bMvubTo2zb(cb&pAM9m0w|&@&C#$F3kjN0p0o?h;!yL!aEcBKpBj? zztG6v{TB1F%+E28jWTr0OOU|)jY}RmJ1gyhqm>#bS^Fjvqpeq4IVbwnX5kKM=E%aE zsT$IV#h5J&yOICR2;yr1URAnW?o1)RKp4UcCSml}{jAD0`@w=GgGl1hWecz4yk_dN zG8Gg`zba>uYY-xsm3!(fUdMZs{(;y4YJMwIxxbAR5tmw6JVmj35hcRD$;Z^>fX3A2W6kL5&HPNghyHM zD_qrZXC2`)4H)j_Ze{!TrwK7lpzl)gJOV;`8Gj_RO#rZP+7bfFpc4#3_(4j z2ct=KB5V6`FPY@7I+cxRewFv>7V9Q9eIlnhOK!E(L~&GIKAX?~s^%i75*cKVMercd z)!c5K;2nlC@Dw?Tl?cMr!+F(6jo+|ze!urE@hKgCu-T3Z5IQ0k)*;^#Fhm=Sl1`Q5L z4up(8x0r+npYDV=Ic7_r@j-6Nj_$%gv-5lsm7q6$(q` zyRP_O$S@O!+=FanR7CtviDOAfvvWEsq{7;C>G1iV{7GbjFC7!@lbV2o#imIUf60Mv zu`DQAv)5K~xliI-b zmbhpm=|0x5HUL%ODH;Wdz$_j)zf-Q@{pGK44&s$64m5mTMxR6~W1pQ8v%3&1WMrJd zl$W>-`}w{Hf@%oI4^qcHya+>-KNd+ZlbER^4V4e|PNJc5@(P8#>auJ1aL{cCHuxvpSfz zt&#l)nk}s(vPM-2_8Ibf=d+}?3G3@TTeCEgzDK_Wv=KcVcp6PCYW)R3FKs>rgN_9$ z`Mfc}`;i8(;mNE@w5sb($!0n^pm1bzBH$a73Pt3@s2>qW1Y2^%GMDS!X`tTiOK z8ibU4{Hw1y!t=@*35lGnpITw!eFVjy*_ZgE08x7iGQcQp9y=DrF}l}fHT2!BC|oC7M_1WW@|4I5+VnmB)DEx#p+)`KC0x4>ZP}vCx}cpf$(~lAbQO> zx%T586n$|Rt}104#zL2htmnQzwXiL=$XVji0@#v4L)QWNt@RjoKJbfzY)Z|aTQE_D zr$d>sPkOP4ImBcD1RqdJl2Cc3#AhX3@w*&eQkbs zJPbNCT}lsujv@7;N5CVK4P@$#LB@9|6kY}1Cj$)hmO4h;y>8?^=lhK-gqzb^-#ZXW z(65Pi$*ewWeR+!e-r|ALprOp-jOrC}Qpc@qf2AT7;sf>L7oFlsb#3uhch`U4Moy}T zUVSfcNcNr4Vnux_fg3FFjYCqO7h)N3y~BW75S*&FX$)1pr}BL|9!@@@dWoYNb`nwe z&aTJkwaz~*f)+ffnd$0tS)q}T`h^h5c#I!xgGkYNOL#-i8QwVu-2K&Y+pnL=mZk9i z?!G@i)lnNUkzpr+C@mQJJ?p^*mOO&g6DOyJ-{1ue$Hfx-B(+LKhXfm>^*U*!uM*o5|!+G1qGG=oMo2DRaKy74jAqq$6IlxW+jOd7Fq=OeG*20-Bxq~uZO ziFJ{0T$})rPB6f%QS>@$>i?|G5`1kAaADqexrA_{Rp6*;t`;=}=(hch&myA(anH|P87+p^fAR*QtT?M;B|8!hn2J%lR zgK_qyYgKaMJ)mOHi);D_4@52&&Hv0)I)h>(AkXlE=ZnG`4uVvOYX`nVCvln9iEM%0 z)aMX_pMu3$8_S68*}V3Ht4dK)cZBpojxs2h|xA|SU znsevNVHx`wtvR&-#4wW1W`Oogdh8!Ql?oL;y+G<-eud(hmI-2#^59fd!=e0F?KUc* zJgG!`jWGFQI*CW5CaWV3;b@N>Ix|0Ma-jI8UE)%$lepTK1@JGrghIW^Uw_B_VBQyR z)e}u{OjK=a^NdTR^-IgQf}t=C{k3=*&a5#NP!u zL~xe-QEa%=@l(-n7Wq4iO|`lc-u>&ryMXWF=e7HpI80IeAAd@v2VWn;rbt8C>`#*_ zVy{@eZaWf5F}`#i_fb+tQ`D5m8AMT7DJEf%GVe$r?5zM=f&{%ctXfST3lZ}CEB1=- zp-6RJG9>ZLZ@jg`zx3beFN7x09Mvv^)yu4kk&V)PpeWB$_1xL zxEy{C>m@zTXv;pmQKN003fr z7RxeLp$gX|w&2usm{_P+wd4qv3Ob_~j@oViWXyV>h$uiWr+{E3XoIjx08m8}0UkDq zY$8wyJ~j8RClpB}5GM>>um@;2r*@t|s& z%+P9c3=+i>Qu&cti5)JlBa>4Am;0v$wWq-FpdfH}f6@L>@&S(xPKM9~!*500`$`D0 z1WEd|~#K6Xo*gowiO@}@Qd}>KXLggb2^t*#Cs{;x(cvu?r zw8R9V7#~2S(JNq!iJW97v(c7?tl%1&17?_)=#_htZYUUVh^7y0noq@pID01gh`Fa@ zo33*=5w)qYYFp8>u74$nJzHoNhDv4>1wRQ#&|=quN=AbPr+y;P;5^{D@L7wcI-uOR zeRy!*v{9LHXXLzSQwxMvQH?LN4t3hY`0z6#n4Odan4(%yl~_|3z96r67Lq z0VkD%f5Wwy$X+i%Kc0lnRvL>%bXM`GC97`+o-WhAyg+%M#y)oX%Q2ZMqVh-^lD;ta*OX7t9H0gS!L zBk3<{1q{KkZ?Av#Zsod-;-Z`a3U34ZZ2*}bl=w!6tpvv{Sg>G88m;b-5sX{ksTECY&{YdmekwhL_vkMn#f; zzi|2Uv-JH2D#ncfwEWIRh6_CMFy>a|BR4O8g-f-44nci(j2AiA#r$)Ge;C zHrulPH=0!<@Vr;y?udWI)5P7^BXMbm`;%xbeZzU=)o=rZse(lgzWy2pqor*mzNQ*< zT_UKdE7$aZBO+6gd6{U%_=ImsyD>mEIe5=4`xXI zDXPQLG%lnvFQ#kBbA?SX0Kh@BQy|D?70SeXGu{c5p?U`W=Sgv{3bQo8l~?s|@_ha< z9hZiQZiBDR)T2*+A=lYQb5zO_<9@HExOKOn3LcT_xEgd5u*=dkV84>m94$6$q!kkN#Rg}xo8bAla&)BD_*$CXe9;oD=Y4=#%sn zz)KpyNx-a`_|Zzvs)+6u_E_r*=ulaprMyaOWyEw6zwQ!2lBIWxZR*X{IHm{&Yw;?z zwL~$4)b(`wvzDUA)0Rp-dpN7p1*fS^abK?bG`LjzbXM}4bRft(YBo5`K^0*4rIdb0 z!Hl)iT9O}wi&~>;R*@mYY+J-`aVU&idC_99Rkz`1$fEv$vj3oa=N>adxmQmp1CWSE zEr02AGrAZf$V?JW8;D!0zW66ry|E-_X>zM4s=3$m_LW&cvNPrig#(_gf>10pndZqK za;$U?p4J&m8Xx-mau>sHKLPcH|EBa>lnk<{v1l+(Jd(vNOXFSZU+ygO0zn&*t0)mK zLC_FPC<*pI*WoCO1df6p)k7<(zf}Q^@&nl4~6vC|tPR zsIbjtO_I7{3BYHJ1&iviR5QA|z_oB9cLQNU@j1XJ^ijGd00m_Xu2}xx+bY@vP%(mt zLQbV{0aktgb)0?+*dDrQ@jc^gX~iF><}^Xa?(jLa<#d$WMSpFKP{#5f`BeHi=^C?3 zTkG6RIpP&op8xrr8KTU4+6kWNn8T`M*9wJu7{_*|@36$yx)ioZ>I3q%qXMpp;**#+ z1IhFwprSie9l?b`@hTif*N8L|UMAA=PU8g1JU}{-h46sV^emK@!H&yiReTau>@}HC zGB$*amuD!=p#(m z+!D%G$<+=dY@TAPg&ND4GSr_)Y7G^rM${FX%n($XAnbevJKReEL7(Kr_k+EPH81xm zWfP_Jxur!!*U%I9+cKae89NO4N)#S+$x9Hqb1P2YZj){UJCznp_TCMW*tHeZn?ItL|&MkL4ca5MWK=rHvk3W^cbW%jS1>qKern z88kY143mi$Cu(qVL+iU#PHWBW|NfBGG(f)D86!BfsCA4TTs!()(Uqz@NiNUD>jpl1 z!LQquL9=%}MJq{=ClX*$D5nH4k60#XV5oXLu{TG~rTAEg>bsq^85#n;p3LD=L4rU5 zsT|C;Jm8AZx|J#b^?nQRJjo8^AK!Uo!(A7FY4%E>NLImH#XdyVmC~v8ul7KMFI@ft z2(+hemQKgjrQ-U0!C9uWn>xql7f{nsKE9@Qk_RS;mjE2O{tYts`>5^(&HOT~xAhE- z%1y6F3=ZTR3E7PtR4*e1tQn-?An{ffpdm>UW%o_`3`4Vnrfmwi&?fcW4nLfYq~UXv z@Y8n$ej&`IQUwN$PR-ITk4Hv00cz{`=jpSCvZLAF%=T(b05Xn6Fk$Ua=m)eFV>rWm zM1+VrFNfzWFmY5(^ZI5ui%CsIP7%uB%8@OF>9NH&2F^zMN}_dB@5 zMm-W}*2xGdj8mYcW&weSw8lm{jlps0+nZzv)`{`Nhtisi?-o(N@bH@foREO+@3S&t~W6@&0y^ehKBWmtLtrn@Err}&GC+@ziUFLfl@q;C` zq8F$V=T)ZNx8;WR8c;5L#H9%(lhxw~YCKQC8x-!DMnx5N&_}wx0VoW!Ngg2H2SyKW zRsU;1u+_4DauCv=I1sOAkB$re5Poyjda<0czXUL-X!H_>d%oOIWXa*E&>;`B9Z;Cj zL7p&a_L&S>-TlQTjS0RrXXFtii$b+j&t-4fPdchrb2Yu5D)fO+*zz235lIJ27Pk1` zc+`SPIkOUsWO_Ebi;GR;m0u5!oh9Lu5nU$^a(7=};DyM*&Rl%#-;h1B8mmi6Fzm4q zcHbK0&8?hJ!RevuS$>Dv@s_g*#hQ0{bDu63Zb0)>>`<>XYW-gFKJelGo=+V9@-Wcd zdN^lw&q?{69Qd4o7o?DUEEr!q?1}M4=!v+I9H5Qt zBXEuGRqqFBRDrjB@0r#FBy8Y*kdw}Th3md@n%|U}!8PDnfwQyA9LN~dqDn`Nyd5t2 z>4Y7^_cw!@48`yDS6e{-%f3G*LClFBDL4bo(tqpomx_}nk8)+)ehko2SWI%SaOtUq z)KYZM3qS9{iInRo+8a&ZY~zM|PyT6{p1@e~{?-%Km-?sZNk6Sj zFbx}Nbm~q11*0CL%RqmE*gazgz2baa3C`xEmUN@j67%8G16NPFmY=dIuOz5L|W-wVd>SKTFH##3&it zWKZxbaF#ah7~7pK?e^h!QNl)T&KOZP9;@L2`o#LnxoOX$L)3oBolr*I9%CqgcUasu z<5b*0ZJ&HEh4N4J4vvJ+3=~MQQl7wmFapQ|>A7EhqS0M^(}LT%DJ6T=Bg9&r`Z356 zlAnn@SQG;d{AzwK5$ju-VHHIasUZGwMNfd{}KS34gSxiG8_s5+|M zCy=2Q54BkYOmp^Jt+nh#O{33WyXxu0l}tx_eBs{5$d5L|Dcv_)VnmuzRo8X z_8sxX8-%=xyO<5XXqV3tMO-qbw}FO}0}zzLnUiMGaj3Agi0?TM*vGGWRVKmI1ux)r z6D)kJcAlfe>&Z;g0 z`=!YOkQKkvI7V?OpUE9fB652VV7?T_krdpMXk_r%1%h-|C$}HDR$(z(#+0T@!0_RRqxRD7 z=O^lD*dUCMl=xmtJpuurOE*&Ovp45Q)#5pX*-;r-#EFP`CAyIemDXmU9KQ^~k~iLR(&i=clrL{DyE>e0_| z?S8T`@Q9l-6mA^%arB_TRE*$!&X$yjcto^$7DQ*nQ00s2wnsE&}6zi%= znt9@O-hkL+TXg$JnE0;5*VJ#{E>viIRQ>?ERFc+2sK^)BMywd(dmR;#zo{;d%y=VA z_{(fzO9;;>n00BHbt-b3Cw;ziL%piHol{}1hNy+>0qZ0t`c*WEC=im$qqXm2eE15` zmp5v0gEt@sH{_cD=U4OURh`Wb;SbUr*hQ(emcGDZ5Q!Z1@t&pPtK`?oPI=|oVBfdWm)w+61=9I{`QY90bVvCYL1I%AW*Xn@({EeXr^9fPmy%08N(M_I` zp@oKiP{JUGG^13=i1NWu0?VXy|5ka)Xw8MXhMFL=`UosW$j?dHikq(P+$SqO!)2jB zWYE<=BG9lL>mz&G`I(rkH?rDn80KdJ2%_H9YRnjyF_*(VkY29ruT@GfBM`9Bp=QSu zXZH7N6}&PSh`VG-NkA6+sF?9A{;#Q9nX|G5XB7zzIa%)7ETvvw^6uLY`LSb{$G_eI zII~!7AP}!qbuf#8_ujUhkB1KuOKm=o$<+|cY5s(8jbhzsJ#T$k{g?=Gw^Fgob{hcL zvqrOWCEQ2^h(Nbh?rdV<_JksP8s(FlpA>WV3oohTM+jGE_Zj+JKZk$F_po28#+``Y z^mE&5C^v5`lA82zwDE&+e28T;AJ*mGGQ~ZhKVUjwJK!V;#I5>19B)bJ;t=$%oxt8P zTD%{(UoIRQJ@hZND=WQxe+2vC*1|qlpX-<)pLv+MhRvqGSx{TGZ96%cC5y^Yx^j_#zvg2e=L2FXK07G{3Y5R@p1zic|ga zy97-2i(^Wf5V)?5yHN1ZDCA+34Xj9Lo&l%kEh_nCS9Mb&|gZ( z)Mu@fYO7%q-z@|;>fe$=O^yA_l3@ZDxnQW;1GovVL#t34b#4Ck?~L(Xsjj^mv@2d5 znmYZp+2paCkVkc7%R`@*&Z|w`2=Bf}Mc?C;z9}yP8p-?$+tRS2X^XV)+47EE^mL9D zlo;INg3&Fc3DRNG+!0a9~@rL9V6AdE8T0C)iXh;rKxDWF3XawpEd7sal3BFnX|!6`3JY=0=SgV ze*fr>CE@Np+nHn-I}JHPCLx*ic)PF%jF22hNFOw)rjQ$TA+7zu>1ysza7w(XYQ!2G zCQt_bUVZ&*iu3Zo0l&4F2Z&u5%o6E9yz9_iF@dAi0S>&4h8N|Iz_Q8#5JBy@{S;`J zc1x4@jF3_(sxSpRNu`E1pOZ5Ym(`B23iO2mzTGhM$1_5W%Rct2Iir&T)6@2qt$ZA* z_5Q8F$d*=mhEnOKZlB9`Me{*)bGcLm)*IHjDrw^8%_GY2P2d4^ad4XcIyCY4 z0nk8Qxp2J}2^;l->VoE?7zFEVZgV{5iK_!2R-e`8aiv+gJT43ulB9Kcv>&uM<+SAC2!z;Yb#4K# zk~`jU+%paWBS$QKAa8n@=7f$Oy1Geo)EI?r0}yjX-8R#79yPq1Bbx@6Lvth;ohQ34 zHZe!Xtm6y868D{n^%&Uz<6>Z2^uBh|a}qQU#i2uC^v*ebY)`_)cN129>;BeV-Q$ab zx_8rzZjGLKEk^&vG_!4)YjsTE0-)q*uk5qXhacb~sjjG$Et%-+NX%y(KSL9__TaYW z+(Qa>?Xt{H=VvxtK4&)OjmzQ5wEd#~>9KRV$Sb$N$_{sx^PoI&R~;{ib?_}%_;%EV zJ_1-gHo*zn1vTK2O~imSz3FhF>?GCrtjXj(7|%t`ybxxc`}(be%p;MUTEz7JRE~7fKbNeE zowX&>PUW;V2Z8CbC%ORup9|I1dv3tOo$>Z}iA3dq%5d=+1WRIPk7(Ve@F}tW`VWaz zIHhb$K!-3S)KjN8HYeAj<|Pj>W3_WIhw5EcOC6gia=&cjt!z1oW|S68ql~Yu*DZR1 zIe=%w@EjhHQ5TzMaUd6~#xxSJip_OIVZ= zAY47Pr_nTh4yiucbBt-^_VabN)0}=rWWYW0S1{5!Q)-xgOLLrn=|Jf~?Lg~5k021I zLnZwtB_f}rT=2f2sNRALlB9Ooc6V;jS93lTNAaj@y6ffhLPU8?qDN+yAv{(6e!vAygdPM8C2{%BR^Dnul_{!Z=dM>`6;42Ga`LKVUx7!XF;8W)p)m-w{N;OIeV))uYGy+7#HTJ<`u zWrw2^y_mPQ0hxbC!lcT0dx!Hx3~sm0>WOdJ z?%q}p=Dkn2Lfv$!(E4y9q;v}vr2g2Rv751Ta=m#bTdx+SegIJT32Xkfx%}aBE2e+= zM?gWh^8ls6iE#pxDyZ+`~sV3+? zka+Rm1fshMbfZmtG|H*1z+j0?ezK7xTcH-2Mx6kcG*j67KeFgKl#7+%Ok8VPDtxY9 zcvmO~Wb3C^-hB2k)zf0H2d#xwvrq7LcNwCa{uT}G;tOImaZ6&Y<(e@u41+{ujVKpe zd1jo!ZfqpF@M-*2eBUYJw#PiOUR6Cg8g4@gXY}?&T|QE^fLn}sN&)%>^98G0xUX&x zC6sERk?Hy+(3CNymzkr*KhWaXg^$g@k~yYMcD=v7`k;`;ob*J6l>_bzuD&-xwe*)G zqSAd8byg?%BCe!QUWYsRvnTL9<7p{wI4V;sqz8Z*Z#a?H95`&>{{EqR0`gz(j3=o9 zIqI)qvc}$YCH3HB8qmE*X7|P2z^pYyz2)OUP4k3WUr4Rm?=>89nw8X%d-l5a)9Xvm zk1}w*YwFSEmpURF2vu}Bl>4&8Fo2%_`k$icvfkfq4xJbzkG1+SQgb3@UT~o z2Uckr2ou%3KX8`1<{iwI3lFrI5CGrirm#4aUG1GmxyznM>ZKpt)>Ta?+}Cpi&WWTS zT90I>y=l6mPWj|M<2*G{(=RAc*4(A5>cpz7pg2b(!I<9FBO=1{&>4P{e;+Q9DYn?X zIJ7v)d`~4FgcndJcn46*D-b6kq2e~7d=3W+SMO`Qbwfix$g;uxvKD@`Utbr=@)ozv zf+8+B9mw<-+1IeJz97m~xv) z3B^5W*#qhArYfgFa1~p^T2@D0+-hDCF8?({{;I#Vd>tE-4mJ4XS0IPBYj}aeR8Bt# z3sYVTZ3tnj1E*wo27l4`o9|+c@_Ws8(Wyp_JK?(#$aE+|GtGy2GunEGzNzc+UGVIW zwu$5qp468u!pijP6$}w-PSv(V6%!aCKV+yhCCH@LC7pv$Yw1(!n~i=DY!4ipd7Zz`Xtl@|fN?IF;)m<0 zyq)Bs{ZCT-U=wPbY{PG=8oILX17wQDg+nTYtO6R7r1s^Bi)Ah~xFxnvCN(swR7z&q z)HG_Xl=L(KL8wx1$D0+2;2q*f6;>_5-5ckQg^tCC9wyw9{4r~>7l1Sq-E4|^56NFW zhcLhN4Z+cvBCfh8Ki{%IuBdR(&?)(MkckXURIj&2a)@j#6RJZhhpv-J1QxqK?EMJ% zEt<$NZYd}ASH%X`Wjj-7yXzK%@yOME*ldf#cvocE|#M0|aUuv~cV; zHkdW24rEu3l5+lzJ}khcayEWGMURT*Ll}mz6fvJl_wU7$S)V#)RMU^Nj*5)6R<4Uc zWGVgYn!2s*f_*1mDES({pDutwp}`$2e(3=+>W_~#J-SdCpin;N>`v|a5l`khB-VEk z{Arh}c7SY_(R&4CZ|r&kLuBb*)}wU$(K^S4>BYc@ySMvwE#F_9$?Jar)a1Yw-)F8$ zjZ=|Pk6U1HXE2Dr$|Fu>?;MyQ&pO{<*j6|uOnka!_s9*SBubD-d(DW!9Ci_)Y_?x@ z&h&fV<502Y^(xZmLYM^DHw!8oJ5&57T=WqefN z^DcQ#R!4Q4Mb|>c^7MBdArL}@$ZN~im?mth#}tTOJmuK=!`_GXlVH`)XmMtZY2+-p z!wcY+2KPVH<-3~Y`cu^b(L4DBOg5chgrrB8`L@FaKLes>1WpJhPO%VQsCBtcaO(y# z3u2kp{UsZD-p=7X3fk&8ql%N*s}rjWH`NF3Mu%wLi2r+Q6D9b~?RVT9M0biWxmumy zfgLI)3>J6VS&vj29e~fNv%?5Ujdk<*uYogw*9xct@0YU&MOCN&n6Zv!I^bG~9bEWw zEP-wD9H`yfDtW?dr>X7c@Dy`k$ncxHE#SCPQ)LdrIni+X&N*NUV}O;@#}9L~-D0sv zv=52CfUWkSkV)o?`nOcR1ftqRtT+{cDF6GLTtT-Q8qvwv6zi!4HtAy`-;E^MSf!Lr zJ&^z+hy3g~C2xBFT0NHA3Zp-@+IXkH0vXdzarg?+y70NOrm!vD}67=)!=af!eKs6+>7vV|gS@Z)I_vTzAnJ}gB zr#w$QZuAO&EIoDzFhugqeB+2?S)fyC)cXN{K_;ugTR(1u$$qb);LILq<-H$XruMG{P1X{7Z|`r$K38NLj>OdZ}I@S zd4-HjW=j`Z;8fNNUv0D&>R>~e#I(QK;C$UQ4^>9S=5(3 zI?xzsVVieGzWbXTl&6nx&#*+!R3o7Km(XOP3|9xuCPR<&IqM;7*X4N=Sl`n6$iYf~ z(@zz>z}w>p^EBmSwiu!*=itj3VnpcR^z)6BJ>--)G_( zb8Yi12tw0)tV^a#tJxwO+wFX=<`fnurA+BV zH-+(;_`QO~<8^C*S5~bC9K&lUs}#&|U2^xT=xPK*Q<)Tl12*5kSO&dT?5~sXL))!K0C){eF^g3(t*N=tIENp|uG79m@!S z$AAM&h@CmSQZl%aG>~9GOHiU5u&bl%?S|bcMK|bviN2Ito74iwlH@$ogQ7|`K1Syg z8=428mo6Rkk#U-Z4YNirJu4B)dLDTu$cbQU`TlzZMxXFh`!TCFEFFJq8Th$920A3# zls3R2pNt2=ho7I+q_C2Zd!5*={6}(Ma7O7=t$)>as(5|c{f)50Yl!K$Fj*P3_osoC zXv;BzW+modlG1Lhb9J^U78tLY>zi71j zyy;{1UJvZcZE$CIjUvNr0q*HC8d%#ZDUA!ReR=Yj^tR;vOFcj5CdMaUG^6qv@{h~i z!h^8l_2@f9=-M2~4ZgaVPFKT?j-zfxBB(}da382FPSJ#C*u zn_5J_<*fs5$kWSZ{l$&inZQhzSWLGF!PF?pY3gaLX&eG)+zwd+v6;R5>gDNAB`lD8 zs>JDnIG}SpPdA){Tj0c6mCV_s1M#v*Hv7B0*63X`QGu|)Z2I%w(@ygWc+CI}51%TP%AU>L@S}6H49neyz;=Pa-`_vX zGt7&B06{;GF`bbYXyJIs2?b%`zZJ|-KMu;df(*0jSdCftHrkDoz3ikduLU%YaGLO1Vm+1CwcMKQx$o{Y zP{kpT$Oc*g8A}}~44~LkpgqqGNXCrpJIWs8L(Qy zD|}ci-!{VG=PxmD6Q&O}32?Dd@Jg~B-DyhLUN=YZ+Wv?Rx`27@My3?qUA~x;lXv?S z$DjR)#n=7aM;DmJv6Q+cd!I%BIc`i|TqHN#-LfJ`wn`;-&!@n%pm)s|4ddu#^obR` zkAWLA^}SCi9H;T7@uvx=i3tvIf+_|c36hX4Ijw#MjylP>ATgo7hiNk;qA=GGO?5RQ z8s4aE;5QN~TAoV17`x9D1gEDzU3$+uF3W9`Dhqm1GbNt6#j>4o#PXU~BojlX@tEyn z$q4dhr+hqGVB%8Wg{SI;jlQ1&*W2ns`a!XLN^D6nhhjP_r_QutF za#A@nKfjjNois_e4+bNsOkTPr;bGpoAXTMOA-_o7VtgU?2m|rU?<_FqiAPRHg@wsw zu`)WjyLM!g{oV?qB$18W0LNBl-q_D{{~#6isv>#r{;8TrWeX_4=T%SH^l^`H5XE@Z zyw3NO*2P(KP|Y+v<>>&i(;s%=GcUUp|3*E7!9k$E%sJzz$6LRYFwYeVEEs#lQf2h9 zwoi|oKals6BiHoe)DLABtv`YA?Y=eVJ{91*9Bo#pvyka9hx$<)9n95!#2K209#eQS z-1T%%IK3-PGZE~O>Rcq@vWR5;hJ$bH(us^EJ;2=gB8bzhjF>xsgQWYVF3K%A0W3?; zP1jemMXF8B^BMQK@9TQ6i_pu& z{SWaTQ2uI;#Rme{0oJH@@3rXB4a=0KHui3xy^l%R^9R=x!(^fIW2}|$NOQWNHCYqO zLM(=ozI9Yp#C`V2F{4)ZuU$9C;-6VeX5ZC5 z;{KAL@FKRY4lTIQN|{UcC0C=-NV$_0xdOjgHebrC7W!p&%s)xW{oEN0VWsmXMry{z zM_?JtrTu_{2#HWpqpbzm)L>rl+3_x`DR7^rnHzPAEb=*`cY~pRSMCqfSOujg1&c>o z;)~P@D$@2eo3Ef7T@gN9#GKWBq_w_@D665Whi$mQ|E~@ERttx4G zVwg??_lCuXL1b%7$#0p}lY1v{ZwRDVt`M%{R{Nv8lsv2;wl3uvLz6up7B|+Rr9Vu<$LizlgDntiOPh_l*BJJ{{c5yQ=r^zs^BuMY7 z=@;l1KK$Y#zB4QXeM!%&dMI7%E`2O+XX?CpO+=j7wD`2#FAU4=BBlGB-~U`yOczvG z-_#RSg-sbwEeD*czfzaOvdw^NuaV zJ!Tz2es+!MAsL4jv8E00=|R>ZI_Y^*i`J~@EtR(JT+#3VZ0i}2Wjr!ThF!XZ7+aTI zw)xX`+2a!7%_*|e%x#K~baD|5!XrgT_vi#|L+Xqep9dWNsxQ5Q@6oo4G|Tp3-Z$S1 zOz~Ekqi7ZrW0us63Qj64Tk7lfS#~HH`}U^)thHOd^0bj{r|b!( zntJmXC8zN#psMopns_~F0#$g9_%{KoRwEYm9U-@w`cm=qJLQTsFO6mM(RPYVs|1X4 zMYk%ADL4W(8?SQkl6vyUYAd-W!#-mI3cB|5vjF@nwr@zD%IsQE8rM46ed_A!5qn!n zUT5{BL2Q6QgYip-7=4x`c*j;&+t-6zaVhlLc>C)hlSy+b`0Jj%Cf#kK(!}a%$iQ&q zY8Z0h&2z`KKhQFcwnubRrB#raG@Hh6bz`Pzzg3ZGtj<9dA`UdNdp8@*(M)?SM%9?( zkYbw)q@ig%7~Vfe+F&t|-JeQ&tn#GM1~IL_QzT8KC@I|CKRF^^h$b64$~JJsJ}Z8DfX3;nK%xV30cOeOMD@KkmOkq? ziveA*GOLpL+QrXW{2-fNN;tRA4`WB zU(yl9nNmz9WtMC`uT4V}kGragy)Qd>Rnv9X`AheMO^Zz{O&g5b6gpc4CI38}se32<)u^zP8;47g z={BV-%N}GIap^4TKO~JTz>%#7xUbY>koQw;u-;&p#)T9^gEA6dHCqLv2+IcayDR!+ zm3P(Nb1LvTt~2eL^#q`P{0>h_B6~aXr#My|-T5=-oZrVnnFP&^^QNrG4j_x-(BMnK z%~0R~!q;~9^*q$M6+cStcUKJY_DRRWh%Mz;+|$zEVr-+|o0JsWU*2I~?oICG2avWi zDz$0zmS*1YZ0Qmq4nm~)gUU4gYhNxcoFs+Y=n|zxI=P^>#uZStaAD$bEOB%P5f=aG zJ?G5xSGdaZc*l3&9mk7*CEm3`dZ@Q5g<9Fdr0>TYT@3pt7i;LOKj&_&`VcMl_RjXu zK2LdsGH<-YoThR_3HoUT<-#!n#>@XeE}HRT&b}x1Leo<&7b*>O8X35xO*95RD%!J# zq{@*LY)gy)-4uLq5}=G0E9|W0k$+ChlKN5GoW3$%|Hg+?mfXvhDRv2GS2nY3 zPeU@QKyXqYbfGDKwq^)!h*DPKFl#~I_)iu?qRgKx=4BkE=iKG0A&u6+?@{F8pY?+| z^&lFr<2}DsYZkDL1C`*oNlCnMRDH$klGz*6Ztz9#Y(HS>&5PRxeW0jK|0K0xfc9 zOdcbmegdmnM*SkyWOL+Ot17E1JNMu9&&x{~ut~2V$!3av`F|&xl#~naBH!S!6_3f2 z&Q~?N%l{1&s4dG0Qblvajr;Mu6sO-E{7u2GfpRG+Wj1%2C4Qk_9I1D;g`B0N)^G<8 zdrELhm@sPx&*r;VP1~+UznHQyJ>UasXtwI@#J{!P*?$NbnJQGk6Z;c;B7 zXMRA~%Zwap9CaSd-7Cog4R9p&e`a{h)8Yb77K>*hXa%2}AC=~?kL-H&8D}YOJ->PV zet~GC-_Ft+#8ZfXQBsJIPK=y@YLt6$;qfzPJ8i>=_qpowL0%JVDZN?pB5>WD|6TX{ z0_AMSpZXL5hNi;B>w3!x?Cvb+J8D0v0*r5;|#(A`d{##!bSSDoX1UReN0%l(UyUn>`IOd05Y_Bo$&(A79(#!z?m_lUKXM!KElZbTz2V# zxCDw1Ddac<;8+!fXr9NC+nu;K$6P(^ZxDA10IA1Fx$EI4JEO0sPLEUNQsrTKoOX1> z_qCHi%<1kA+ay(U*okm()VVOy6a`R}CZD}4Kw|s0>TEiK6sXI_USSV1@MB3Ir+g&a z#Gz0wWI`cAlSQ$u*`~^sE&lJAf3iU+(=V?D%(jrnV`QjQ2#H4A2N7;DvGSy7wyJGF z2p*DZ_Zn-a-F_cUVxJ=SXWF57PTS^hq`;*(8;F>DPhku3G>4_u)oiqA+lW>`4A@)m zcZK7Re>cK<^ltV;Gpk!ZY@N2Ntn;%VB3cE5WCcqS77jiSMnZqtp<9vU7Lp{?Lr&z@ z3g*+0N2`!ID2z02rldwQJXZ^{A02dt;tq#k;||@&hc zzxznI-69XY&ze-*bqGG9EMPi&m5!rMK$tAr$mb3q()ff_Eyi zMQZks2y4iMYOMnJz$VKClpR8IFSzC7QI(*_uJ*`FDYqlNg%N9!k8LsIKUF5?h~H3y z2$!_Sde?qHA|0JZ3p{FCH@VMMSrtW*z!4FbiT4W_T@g<(Y_Lp9{nThBX6j)!=3?=4 z9?D9taZ;+Vo@xcH1I?6d`XsCT<~YcxW^H-FYd8@juSoC>E^Ejp_#gXKvkmvgOy5L$ zDdQK4v#-2<-xf{g&*kL>KAzm$B>Fxm6X`e3T-Q&PZKrGPNZ$s4Unh2T`rB-=37s4L zzFJiv?0Q%R$G{!t0?aS?KQ9yq%~rC_XZd<8?`{|VbEt9fjYtX%^^FAI?kPobS+n0m z*=9sNCE>;?x+fZ@vP8W}ae-BSpZ`oBqF<7k>L0%xyS}R!(v%>Y*pw)$2P=O6*SrOW zT@Df@C#h=KxpD5XBqeo4F&cwRcA57ErmRl65!Cbj5!CHd7mIs9C{SHHIGQi@d9upv zI(7VnvC@^$`3GOL@0gn=))s({oWnbCzu_imiqo2OU-iFLcnjVDM77|$x`$`YC#r*5 zGCt}HY(?DVgRu=i#`0CzC@hjoP7Tzrh9Ws>PZ(s(z3&$QClo_fXu^qu&xCa>l|}^# zXGOJmwX)@GQCM8Ui^iYsOss74eCKA+t9iXdfOMMFm_=myFcH7%iV`rcv+qH&cJdM) zJhHxqDuMPtxteg4C(ibQX)q{$G!V^q@mV6t)rF7;F5q7!b@tm8B4gW!ZsuZR={qk< zW7#SBDMjQB7n1M`q+Zk230yQUVj;eWa}PF5Q82uZ{(zXvd*pQOhJN)jOVO<1OcI!C zU9Y$uO(g&9vd%sP^yzvzH2!&VGlV>F<wl;J~LlCc)agVyBs5_~+0k0xmfa1;? zKklQ7EA%&_UpoHsI*4XjkU_r1t8FJTW>btlVIXT(;O)La*oGB*5DMz7i!*p~h%fQ= zz2&72y-_1Dh+uhAn`VE0Y2(#;f1~KwF10fQ-fvQqUYK|amSBQr=OKt94U4uUY9|aK zZq1T_F^*GOQUBHvS};WX7o=Qj$aInLC;!A}VXvzKi{!`Jx6g~vC6};wMY?^#!yw%x za!nFl6nc(? zoRU`aHorRJTVRIcIJMJVO z&B)B?pxRxw72&k6mH>^HHUwRL8lbAXNBHO=fzi?QNW|p+*i9nBM>eFMAcsTIiMUS- zF1lUcc?_HWrzg}xio5~H!dF5YOgT6EAn}MTFJHg%Q}7%a{5KRlGG6_3#qOFnRgnc} z7yuDz7zLUK>~1V>#pcItG=98eue+hP?Lnl#UyX{Ox|bxL9XP`YeW z(w_;eQ{q{mHzPQo0n1)~uh}CBDICNBP5cXliYGHfTPNhqwYLW;4WB7qu#?nd+$9gK z=vj%A52cj#d=T`#n8SU2NiH-v5pq0g+3{$$;DwrR_dikzMHhA^q zC0*hHf80SBhT-plZ7B>{2@8tOUgn*6rkUA$%zZJmAzTg~&~H<{lSNx#!BOH;Y4 z(@#Ux-!N#3BV5DtM!7GrVwEwwvALDPX^f=g3_X>z@sSU}g-Q-Lv@O`X(Z2F{ zS1-#H^yG#mYROlVzW4q>BYA{tu{<@zJ;hLN&vZ;2Mks}xc02O)YaS)|7#W0Noh1Rn zkwir!X|$^v(v&P}K+%4Bk9+9V55XP5$8s&;nH9x3=Ek_M3)4Wf-Ded!l#hwH6s~!s zjz8xxY@{xO17h0__k1^b{mr^hq&}=kFS{=0D}bt8d1Elp#V^rTG0IJ&*k_ONrorZ7 z!$T-jav`F5Ex0}?mmKHVV`lBp${>A1`Ee%{(pmubuxl7F_cLNosZD82X(8C21y$)I z@X7s8J9(Zc-%h|d(#na^C!-Xg6kbgp3~;R5tV{m_?H057$cfg!=Yr@)uoUTDV*G~G z_w{PhNR)7Cru76<3C_apc*km^h?iJ}1UsS`7#s-^zhYvh&C+|!dWBsk03Ez0AQ)5^ z{M9ff4qzd#wvMJ0xTqAEt$JF^0Ks*9Y|HO-$i6BA{>vUZR3BjwBp%UzH-`wzO>K4( zuJo3^obnlsHX6M-@f#0+@#bMJ)Ry>v#NrcmAnr3+47)AkO7IQL=v-}&O>2zoS+_yV zm-WS~W8MWhUc)C)ekJo^a4$~0M8V7 ze-nWHTk<(zsIYPqm45J>)^^RIR4xi z&nrEg+!&y&b_qtuGUJxFk)WT*%QW`UOknHACMWt%14Sv3|4xAee2*S9TS$)6;2(Z+ zCGI*B+hN!q#l*^Q%z{G;qKuzl%5w~EWoD#iqgTqeJ-)V?6*VA<7Br5?;i!%d0&G(C zxo-KdJ|wLrL2`{6tny_>RMo4iVV#KOXkQ#PxNQxHS6>(Q`XW@NrCzy)bMD+>%3Jj&_93 zlKz`A%>zm|4hD?H2o_A6^N8Q=Nf)1b5t5dCk5vv-P|_qZEaU1SBQ`KlUs#%EZ6?Qp~6q}x?=Ku z0k-K`e{-036}($pDf{)iN6nc z9gQOU^i}EExd`a;N7k9R(}J~*I`vN3F`4u6lvc%K#k}Qj;pyx z-zR=)Q9Te=No4TQxv{}^FV8tZ8wfa4DYKi1Wz{GafoG01!6oqiO>E=J6D20yOW&Y` zb7Kmk7rCRy7IF*$X)6~qLr@3F12QE?-)(&rHwM|>)gvi1SwL!=@OIRA_Xd-5p>AJ! zM9V^9Rm!z~4uQbrv|^v93kbwxA#3w@QJ#Io{pw`oXu8YWs=*w~Iq>wPE2X;`l*Z|- zs}m%nSddPr&F~0qJ<*wMMS`TVA|dK?RB(v@uCduHOJl}TWg~fWY7CaRa=6F{qAgUr zrBbc30u)2s7GkHQi8nre4|zxI9t2y$`?iEHJ<5Vpf^tl%M&e zGkpHr6KuL|_$>SazDb&9)nm@)nd&Ue8Ur>@Q6ms{E;S^1Axd1xUBDfOCti`h(TGX!k-6V^DJP^Gp_4kXIS3Zd`RY27F( zJxZS)KitQsL}GPJWjt#k+OY%iK2s%WU(0bLu*#q$ro*n}UL~OX&9ZV$07{p{YR?Kww zssfw#SmZ!3y2`Y!D-W~VpK^oi$9+-L(%QLqRLzirZ&$s(7;(oZjm(;phcn>s%IUYO z(d+aG=Iw?va9zM4KU#;Xj=65M|(-9AbEdE?Xv5j%ZPa3Yln zTcNt}REVgU_=Ws)lr@A9i6{+_X32LwY%V*tfo4YV0pGSqWF?t+2!tytpEb~HgbPwG zLv0{Fc^tB1g6KhpK>qO_=jzeB?efr)Vq^H#iJGdjWydw(S6=MOY?HZF+d!EJIvX@2Z0Ji=K1yp8fK| zB{FyaT?rgcEQ2~xLC{~9{;p+hK6BUS%)}p0zRpjNTIjRIS;cFl zk?5*8jq8LG_cn)afqM;z5adrR7ai0}{E%4_fGcPL05k+d@?|1+7?dDv)p}n@DXkK9 z2^&(!?4D5be0cI-a24W9thZh4KFq9cQi`b$n|s;S7%!UElqPx$q=e|KJiv9}66{7^ zOu!{bJ@^qlnaCMOmhhMRocS(1&p~Q1%O7-vVf(Az=L=FC3nkXu1s;Jw8++W%eK2*M zs`p;{U8YVX;)~t^y^3-em=^x$^4ZMN&m%8eV}$@bQqbwe(^CIDj?Zu7ozsiJ;sfU({&m3&nx`muzrcz z63WEIvLq3pgcTQAZ&S$ea-Xww{-K>DQ(*q|Ap+~0K+yh9ZjqJJ6*8{=<{S+X5?gl~ zhYvYI&Ofqohc2us>8(szc%@7C0bXUJmy01`?sGuwqmQSfPcF(@duIVqqJ=?4##Ba zJ}_E7k?{#>>C6jJjFC+7d>6`K^BLl-Ri{$!zq&SmP`q9D98aA~SDeH8Qz9dyWE-&B*K7moG6fl#}(kH?Do^x@#XJuI(Z@Jtf_(hmgG!!=Cs;Ya*vkIaHUNoCs_vyr?X?p=4)7+CzW+kQOsUyjw(uF zsHy!(0%w@MWAV13nCBelvGKhD#_LW`{DFwl1_A0n_s3Hd_NZth#}UDYSvOaH-PSqg zgI815vQ_gYTsntyS&MSYXv!D}7bay#(4&j`bqBm)wdrQ4dvpYameN31*;#u??4hUp;*W+nj%`W1#in`PDpAMVfGn*e884!-eW6;*E4*?Xd5H(zd{O77=zFOWkXgUPuc`Ya9?K_2@`AqvsOQ(5$pwsOk(me3jL1B| zy}rQNlB_=Z0xrz-=)t$Zhw4phy7A_kXndO_VV&5&M{~p}b6QLPR=P{vuaa~y3)DZud zL%a-t^w+CT+7GE1+mS>vXqT)lX)#_Q#?<&IZ!U}}YZ8-%(Y%aDWW{3eEI2V0qoO>rNzWXa}C%RN-1o=tu0 zK$~U#ntziE@ZO5+g+1a@I!l5SV9~N5>*!MN3{rrazw+b@a{J{Az)xl&HcO4V<2RVd zQa9K7tpkKm_SNrmqHl%N_0Fn&0d$Y0jF3k7y&h2)QGXbbEa#N!p&!%-Y#r5k#M^Sx zdJA8|KgG+guSR8WdWP_|gv3l+)!Hgl#1Ucqf8`9!8ApshU0kw;D%MSGN){*@JCwJl z(Mzj0#;1vhI6TiL;#b4)C$7M{%V*Er0xD?TDJYyl8SlHjxM%)DEZ2dGWj))uV5gOP zbnqN{clydnNwGfmO8(Qms)p7fuFA_drXKwu7qFhAk$KeUK=H0>&%3=&Bl<|!JWg%o z<%44ch>*%y9;)k~pno&`1L4;;>oZg&M?DAQf(x4*B{N97>nweD13`GaazZ3~)LDn| z^&aA`1w$x(<%&8T4OQhzzyJO)_Y3cW`NtU!r*)^fOSw)idi4nrtAsuYvcebtr2s8R z5D5t`dzAy7lifM4!R}Y5Ou=zko4okAC4lk7uyTr&9i=rgVtOf5s{+D}+15>-ot%PD zN8RSgZp27oruNI;uEQ^OJYGc!iZ9pn1S)r`e;}pTnvTwD)Uw2n&oA`5H@>`j`4Pxh zoG(VOH}pPN8#ru(jJq3CimRq^`cwWxHfhvup+4@DFFE5Sx1^SzTrbJ5S^D6AN^HSR z)_Y4(pIlPRd!?_cUY}diiO~zl1LSJ5_+8STzoOGj?GWV?S?e z-#!ymg-oSR4q`RU!jxc{$(%MNrc5gd4U5*5fcKdMYiC*%r+=oM_PxJE6khb+Q_NPF zdcukR(gKTLtQWQ#{`op%@n;u9qX^}cqeJ&nfl;NYw4|Uu+L<)ejnOrNVN(sU-Ksy} zZ$(Tj??njyTrPVsz*XiLI7-*-p9HxhgTZdY>F4f;twFE(*B61wX8pFa4tid3$SuvQ zGp^uOG-*zGCW~JwcxX9GxmLpXSb))S?I^%01v!W6KU6?e!=coM5J2^g#C@gP{{Z$g zxKi%Z#eZal%)qkytupa5c&qvq8~rB$U2^Wz>{#C6Q;ocHM=pPD*~O%OeStL$C*s_a zHx%VLf(^0?kAyF({yy8Q_KU!l%AZN92x9vrOKxNy#Qe3!>?q&t)Z)N* z<8iA(G9BKj)N+F+AciGLbJ3@mc(0y-&0OKeXjDqi{FH{X)P%lxpz|QfCV{{OWo!<= zt@MW^sgsJC7SBtKL7Hd`2R$r0=#OA#C&aIGDpHsMRfMF>+cfrFX>jzRn*v6NpEy?5_d=qD71v(M0(hM z@LK2$?K=MO@gG3LIjb*wU)OJELhj>qv=xmLZz|fuw@16x)9mm3O|x@mJ|`aXN2$ON zOKX2y6G2B8^YGpT{|_wE!Dpvd ze|sMAJC^@?@PprG?Wi;H+7}U13O@Ffce=zjjR4ojc=vClsbXEh7B*c&v=*30rvJ9f z6lv~<@o(=b;5RnX6iIu_P}($mHE2SW5OMb}06n8Y68qp4iGPy5MYrJ_cz4^-~y-LklqqhmFa4+`LQDw^~cae(C8dU21jyLf3EYK{1fHO%t%) z%F28!M>F2>>p^j*@9`}$$6nK!xjy4p)+`U8Enf~wJ9l4xw!g|=(h&Au!nz!Ui4u;% zKsbPa>7zj6&#Tb|JK7DHZ2RO&K;(^gRIlDsqI~8(rEr3$EGYMEDDNH1aXw?@@2u1z z?X?%BFLv7cP1S+nQkkK24#<1Lqfga5Z02z5R5`>qDoU;Dq=qNDgKuoMD^|XMvYqp2 zyN)_y9$zLqMifFGZgQXtP;be}iy_B*ZT9bez0S))l^ul*pK8B|a-s`0;2p-NdS_o? zI5TLCHnymWpGklF+j>fS-7bo1+q7V(tvt)o*$mo>4V z;?3T5xj%L)kXDCGP$@S=J+31Zz?B+MsN?wvY+8Fjl&wPjqD<`~mxGI|TurWg`E zf67~1UXyu3$S;3t{;x{>)4%9f(#R(+Df2X~?+7Ly+z1FUadjJ;D2kRZAh01XIEs-N z5s65wwrsw?v$Jcy{VhhLHuAHn%kdd&=iL66-XGvm%3)Q?HvDdCefU}H4aM`4r} zAOsP98(Ph79Im#8ZU7Vx6^r7g-p_lVoY zQ$0uf2IWx8Jv7I43niHZ!wpID&^8iVk9w75N`v`Av-g?CAloMhh1!X8F^*s^?N4R6 zfHK($*h**`X~9fx#A~vew-mU){4SGZSIT|5w#qbV0Cg=uBURsS3AC;i<5$k9Q#K4d zpOA}}wBoP7s=OyJBNg3F4|>}DhtPg}{y3ZX^4-GA;D41HaJ&_<_?xAo-1P(`JedXT zA!%S3#2|!QdTPIIX zQIlOh{+nX(3@cS8XSuB45x2fLYX+3J_sITJ&1n_z?FBN^{5#(y0-Z^fA{C% zE1W{zAMD(Vnm;CQF-kZ-&egPBvmDVeCl=vk+dok5V^y~@C#7;GD~P;!a`v|?z+z(DSzl(*<5xIS%$HN2YYD)Q=n0OA*m{}VonCc15$e5nMq(K$W3u0o@c{% zOKCEzm=ry>mh!*qZ(GO>tv>MuoD%1*fubOceqrv2Z2ESoqjhvKQFuIq%&dET zKZoc*&8@AWASSCW#Iqa}oTQ6ssm~5o&(rvO^+WhmOH;ruJz)}`Ku{zUcNu-7cSoub z{m163C5LE6qEH-qsRvb4y8IqNxA=odLF)?&9w`lb{#*l*FMj3KV}+Gc(Y&G8?8tYK) zWMb2AP4$+W({&EG7EWBX5zB+#XYSXUn!Ik)AATQa{qp(KAG7N(7aoF>#Q4iMh*H_; zc726YDRlV{NToYff{fi#kKd7&7Q#sy`icL-)Hz=*o7&%L=yprWwKKS%Ryzqz0}xq~ z&zH@y{_4Q1vbBLtaQe|!HLfNDt_6|U(eLxK-<^0keTSH4*{F#`(H6XB;b@GiTt*4r zb?1>ZhfTL-od@97#+zc~v~@>l#Foaj^-fn2tJI3U7W!rtFI%4bDC1m8z+PFtgG9@A zIP=$5{o8sxvp6w6jhPR`vO6BH<|$37!a7}_biXm&X*US62`u0}vE@A96O$iax7(bS zRw%@4Fzj0IA6gN*?Ah4t@*fB5+3QcsE;x z*y)dC7i!!bn#%~K79FPKsm!s!%Yc`%^_mhI*op?%f1CPMjlA%)oy1_&)X-Ja;13n; z%(+i`Rme?#`mBuql=!#*5tlBW_HMU=JC>HMs2kjEn__}lSe5cr2~n5jtao7Or}uva z^HLHN@NLu=d0$_jYWq}6g=u3jl|;W#|NM0(g&#sPJC1&lROwxLCqS6G0vaIO5fG?* zUw*dWL;5;&CW9${Ncf)RM?~O{pfL_j&Ug*i)=bt1GyM%t8tkefwX`bTs_IleeZKBA zB#30dH2rN`eDtr5J_8-@x=Fyyi%5cv15MVN9Q#{Nm>2!QSp6=?z2E_}9YBjQ_ z)m@5XA7K8dEds1uN7DZx?%#^#RyEg0`Pv42r5IV}C_CnbP=d=%F_)r41aB~>$||KT zq~H;lBsqP zZ!mLzI^XI*SWg*9T1hBcMQHE^O8Zh3tgb^~VVn-g_zzkdI~-XH!v$vcuC0VAy_|}w z_+g^>h)gZ^An^K1>z>(|YqB3rk$d2w>*WL3+R27ZASq}?Y9fG`I*gbkUpp@{o$dsr zKE~Dfj?uOWmf>~u;P#6wyn>^mcKPSuk<}y2Y+;O29C~MvoPooY?6GNR^>p=LI1MJFF)dH(i|2@)LD8khv@w7(`Tpd4teoERNKFW3c;fmA` z!Q-gIMFYV~I~?|hxi7^fL|l@jwF*~ed~no#%B8F1p8ik?TYay*N2-vkEr_2=7xx?b zlCKpU36`z0mF+K93CCY1$&()1x`Zzdm$kI`Rvd>@#rQl*gS`&+%v)Z_%cH@G;m$#kX1Ey0(xMASiAcS zi8x-P^HFbdP=rr0GX}y6*a&eQFX5Nz-gE3quCbhz$F$fbY0)-_pOj%9G-#4?rHM?L zDIBYYQEWiAQS}=)ju~;ST;3<8;`^2F77s33XtUI|Ti+TlXeXS)L#e%Y{aj;(tEp&D zSMW(oU4!h+9Q%CCa4+RFsjGL;L_%#x^Kgz>c1iQB zLudT*J7MDNAS%g%Ar!7R7X&bN!QU%U=WM4@!VgRWpO%PQUQ|Rm(MF)vi`YHPiM#|7 znXqy%=@xO6o5gjgr-b)uG)7FO&fCZFJsIA~__)1u@8)vzj8pC^M$4)9XiCz9@!Rd7 z5qFy*=d*7f+;k3mk^{cG=9zkB8S>;J!ADd}s9IjZdIs;@;~Q z4yTmMOaWCiL(5gnQ>1R(>W)N1YR|%E<_<$RK2)T@*sIO;bEX0#gQhb{aiXAqh7N$;fyW!fPDjM^tluJ(itA0;slOSf$`KhQ4 zW+y_od!nuc3)|Z+WzSHV`V_KDCC(stAc zYq{cf{N8+CE}{9URuY`zy8axoG+D5;poNUjt`0-6?H$!Urn2?_*&y|0lT4z7|gnQ(D&UWtnITDUare zY7X7cdc7^j{K`V&cfJYk)H|gFET2(YTfSNj!Nq!&l!fLbB8fX(&ps6gbT_ z%|^%ia_t7pIqgAd+w6CB`g^9{1{@aQ;9y?6>4g*;!4h!8x_G=l#7e~QBe?DjNPFPw&ez9+9X`LmoQj^5b*=`!QFpjb<7 zNgdNzF)}{{^v`LoWCw>ue9t^>9se&20F;BV%tP!x1RKx3OZndAy3{jwjSF2)otFp_ zm;TDW^M+U!J#N(YGOO2}n%h@3eXW09qd{{nYJQNu6;JBJ-_pkU=&2L4!gc(HdkbaH zw}3vrcEBPOVFjg55x&OWLD|Oa*sPHA5Iy@^mgX9{f$pv~=Ads~m8(@_$1QC8!S^wR zMvP02+uMv?7WtT)3^^h)n*QtWJ~!|z?)f^^KiPsdP!K_`Du!Cj_#0+x;>Bjw`mklK zvg)M((GazS0XLrJ&F(IUXg6M?GBS&i5d_$LKHXP^OeW`V|H`_#M%oo6)|Jtk>Pp`o zMMTx1?P+S1gxDYL-jFAqV?@mB?Lo#dAV=)8sd+{q7I~Qz50jZKxJ6-Rjik5FKhUwB z{gD5*8jh8vpw*ew$YM*7jO$R#(M1U??b>6>{!$Jvk89UP+16QJI6%su!SX8@wper^ zwN=$H1cQv-q(t;jgtlZsUy97S)}4IqTMHralTzc~z`%R(FzH5pJyWf>*+|8;VLEIP z`Z;n=(NY5`9CDJf6l^-hv0e~6_QYhX>0$Z>i=SC7Mv(*yX+^t#@qANl=D#{{mbvim zaf%aYPLc_IxNliO=_NHjq5lzNy3NR(iqy~A;`5Dv`Z>qN?=;PT6~u`{C+`l@zU@V~ zP^St|I76q~M4Hd{)sr*P4_YSL$92(a!1Tr{+va*S3&A|Lq;reLWe|SBITlKB82TA1 zZ#|ZE;RjKEw$thDLbpIc`E=1p}GdcEg|0IWV!H4<>xFYyEY>viZ^STl` zVC*bGPP+XUaFJ{T(Zpsw2#6-86uIfHBN%LZ!!hi%R=|U?WM{4DTc%O})90%9P~`9HHrWQIS7jL9xmqQH{{7*G+rwAEhzFI>aU;AUTGq z5uftt#w``x$E@pa55OPjE8|!x8upRVD)xPZIqH@4kGU?KH^Zn_)#mMhB7J6NccT=v zmnUQXqI-Ns{O9ctvd!m*=Vwo|4uy8kzn%ZHX*wj=CA!ppH=$%V_NKUgW5P-@5r4np zYyrX@UWRd9qb8HHCgQK&yq^$PZ<`TTo(C+TSqA(97#QhJz~oEPJOfiyQyNSCrWI_kxc!s zG?*Or;B9J>I^#$ohG!kwW5*e>FYXPkQZdICMZXb9hzLa-2t^4s>PUM@fmrS~JEn&z zyT(D3FK&GgQN(GGYR8WpV2Wa?8FJ(rrG4?&oV@4CR}!#V&Y29dH15T8zK^rvXwN#8 zQ@}&U&aZ#93+E$}-j?5?>Un4chczYksU?>KdJ)DuUxiz_N?OoP+R_^zhpOh@P{JY; zY!C9q4;QGWxVG8)%ODW2=IhsCNTK@2o3aX8D@nY6QWt1ChP(+jJhGNS#rZ$b33G@U zm5l>L3&H{$WnSFiacY12XI2yQN}9gtN~Idgdwe@tH;%T^r9woX&HVy>LNMFfJVNq5 zz89U;(~>Vw$sLh|YO&-hXDWQ{g|vS1SY4_ET$pf3W+#Rnedh*~f}nUI?1!m8%ztwgbNwW~hdWtWR zE$U|MdGQX9a^V$J^yI4eO+H-T5F}$eKi!;f_4}Tl7M=iOm?E&NPVfCOhM!Gv7V<;^FMsy1}8|bW_;bTj0Tu zX?*_YcEw}SRsCBe! zcyZ91teDHnxZ?I%Npd=MpgGM2Z=(*&O8@OCm_>#3?CSROZytJ;k6!J$gC0?ANSreH zZv|+u)(8FXlij$%F4ct(ZT@=|>@NK8h#TV`5l_36 zhPFXiWj>(oZ2o?5W@ zsn6=PG(<5Pu)#Qt$KS%Yxj#)gcl|6N&3vg}i+vsz*(=DuTX%2m?TE82@V*tMcIckA zwmD_>&zrbmF_hGyKV!y_Hb=erS4l@R3x<#4^Cj>72SmJ3nM(7 z2x8gzN$tLgCtu4-l-LT#y+*NPltWB5Z|;2St_o8(DHSH>RO&{?DuxMU z<@kPlqoP(HAIyk-0~{tI*YfT@Zu!~#WeBv9h+oSSnS)*4l536HAJB-w@_ouR7=03= zvC0BRLvc%Qp5{->pp{$PxS@(@Mi4PR$GZTV%*gR zediF&BVb>hpNJ2)wyHzBHw=sICcO~#jZ+q$>4iSW@r<+V4=k$+$pWhB@W3gd%3Wekia`nCK9k%&cxANHd(JXn<;_~LsvLT_(qbUUslZjSe zH=%jwzt$d2pNyT3winkxS9Tqlh<*&EKf9UK$xE1-um_%`&r_wpUh1LL)=R=)DqcHJ z95e>x{B&qyz8x{nxg3Cg>UuaJfqh%z z01!`(Gw?VY`*goAiF=VT%A7J{;yIDE3=s}yzb{Pud7kT;BJ7Ef1e~5JlFJ>UU?v#H znfekVrpAYZRQaUslOvvPPjL(gBNQW! zuT|OnD_T~{Kser-6ksXqO~HNtDqx3e(9ooMn@g)*VURYR(nM%HXexYuYJ4e0V>6&@ zIWcF)>s+neZ__Zy{zGI=(v&ac5E(x7@cS5Z(e*p8WLY{B1q`Ai6PHEq;*w7YWcltf zW9*drI>ex#i&>!uY17eN{jy9E`eK#%|HspJ2U6LG{TnBataFTn%9fG6C0iVl>>ZW8 zGAng#naPe2Wo1)FQAxIpkWo@bMn*XZ$B6g3pWplb{(Am;bk2Rg_xHN4&-EFS5M~wh zy0O_n0xE@Of0JPD++9(9D!U6L9qTefjR^fB*g%?pG(J+y$RSsm8 z5=Sg|Mf+M2eYJSc9O|R%1o%@lH74~TE;}Si`dnECv za18{yykF1LV}P3fdCP<$?cXX&B+rd_kdrNcu_#iEE^S4g(&|iZ6I6dvBi;8x_oEWu zy2HBevMzSGmy9&UqxwZB8~l-zuh&AMI`}M<=>v37-pMT|?kx|{h zUk_Sn_4{YLY|?Hp=@LJN-Tjq=)S5J%{MIO4M=p{Xp2vUO$}7zV?;G0%Ae&frKeb;kzm@B80Zcm-?V&V$77~ew+TC# zU+I`@w>2faiAr1l>q0!9Fc{DlMKCndgR+S6M7Gl%catIaOv;0I2Z_E-BI6E%2V@|z ztB%oOFPIf08?ilvIh$rH^XnaXUQ4<5M7MJ=zLe|(4Qp#h-QR&vO%?V+_U9^6A(SZI zj!xmFi4c955k|Ss3$gkx+?t8D;d_F9I`zVhxVRnMGNeQ2NBJd4VZrA({k5D zbpLpNFfV4*wF6wiq`83?bh-wQ7|AfVGKML4u#u5#F1tD6iJ5<(=!Rzb_sVw>dpHk3 zp?HR@2<8o9NiAD+WA%npcb;$*fvbpavU~A37X`0RFc6md;m~rI7V6CEagr!#o(1MS zVuprq8fn1tV9fYc|9+8lgftAZ)(k3LT@~RO;h*hDv>}BtZLpM3dbFw_p4b31fzMCX z$hUs#?QVSNV(HHnYY#3+kY%W~2e7<9)j(OWiV7)cUm;}}F%M{ekhvj+$CW^a^ccf^Lfc=0|q=nXO)1lM*ZrKgYrJ2;HTM;Hm zf)p8v&ZaMHu5@a&!ArXzCgyW&E_t0ct~VM%QBsEAa(i>jM#BW22}84FzXV?bViK?o zorh$Cs)4l^N>`2enxd~M~$pgKfIX{|9W$J*dLAMoIXF}mqGJF9?De5h@QhQWK{-hTiM#(h3ssEVG680 zoAEMo;o@;H_i^kvMNO)366zk*6~`>+gB|gqBzdT;Sb?Ibo8Vb%B`G-Hiw@Dx_qUY8 zC4-^#<7XPtakmnmJ`6eB%u}b}3Ng10NKd=1_pzQgFz4Ry`V7<<<|+0>cjLuhQCQs0 zJ><{Yq4W0E(y8zUm#u|bwV9(#%`CP45tSZ~mqdj{(OZJ=rpfb|3Ol3lQ@6fcTWDO& zWvu-R`#)D?Re@U>F3_g$;fw9i;8R3ZHSaC69j39>U{C*0-mZwOrm0nbaqnPfB*&V9 za6yqT@+N2{Mek}(UK%=4&S5un zB$Y`*&Olb42D!1fzV%~tQcLGQhb9c)`0btuH9HimA`RDtJ>~z_ zwP$H?zpI`sdG+Obd^@AEoQ6wLqT;fE;LOFp62T!DwQ%%Z@S?wZcZqM@#7-|#wfGTz z>b=t72wiE--~8$TaciNyJZ%|k!UFmKJlL&I(BA1v4Bc!K8ch^2SVFGS1D1T}2h5}g z#1xm|N_t-1pzm#-j>0QfUy5W5n;65|-oCh=ESoK9U){s$HkM)pW zE@^D8Bo9M0hjoP`gY$Bfc{m5SV3V!hU{--PY8f z^7mXw+fv;EzolW#mHl=AH$7?PUYR~F zp)3QPKwih{KUl5w2=jY~|A!~mLd-6kbpuIvL%AKX?erti+aJK3C( zHs+UIe5#lED{(?_CZ671fpK9HJe(|Ys&6RQ=MM0oboGg^rD-P#F5x_E$4!NG>>ybq z?_}SbbpAK1FXKOStwC^_IKrlaLM)}32PwryF&tZXKQ3S53xo!X1c%lp}LjtCH4*GW6^dv$pcd0a3Kd^g(T1| zo0Lczw`a^_KKIJf3$Z)tg{yl<3uM>}-Twl)sT7}+mHMjD?XG~ZVj0H4&BZNCI>s27 zw$yBj{F_F0w`Kcz=+A0iJNkVyL<)G@sV`)K7+yt5)-69cxUqj<)*P+~c(tNE6LNRE z`1z=xtqY|mz?^8L^-Ga=h!6xBzMqmuLO0ESPf;Xro*^;a1+rpWJ*ss>6;hylWfU>1;%sF_2iy zz|jHfHd8FOPH<@~E6Yi(yn%XDc$R*5<1cjOJw9go;BZaaRL$Iv99}SxYVrQ;lWoxb z0!>M$WiEL2rfIo>knVx=sPS%$s!3#`JD;}(RbFE4)hr1$lEJJJ6K#^uj?j!a+=FVV zxe`r*>9>Q9wPQ|i*m-$RF;DhPYw2%2h698TmSU8V)^-n$EMGNe?Yf{%; z*NB`}_2SHTJ#oh3^^xNb@}W9KvIlwRQ8}uN;kty|YY<(67+|`Pe|}&vG7hb^TcpOn zg70nbBSSpWKVBqB^(uvdJ7tm(Gt28u{y9-s5!;ezAcGJ1B!YVA37XCYqzl{7E);X} zu5-Qi;dVkauTh$6pN^O916A&I*9aYDpuD7Tq`n1wpF#iC&8e#gbQ11muo(+}_2nVR z!oRA0JjuihuOH**^Q8`)e~9mmMIxu zv=f@bA1ANxLHg1+zRbcuXSS^2ie>q!$T^NxLBVux5=pP3Tv?j^XY2kWBui(hxtqc6 zG;iWB(*x_F7Dq-M_M?nU49C6I7asaRUr@U;_U=2-@21zNX8|OeJW|$@Ddngq(~vM!ZOx z)k%B!%{i+&9Wrsz#yJM6x81iY{s_~OA?WrTM)RKTA?)+|PB&)}#eTjirEivbVb*HS zn5wgFKcJ=ma+npgm=x=z(FK3{H-s%+^JUYQ75O}Zy^u`KzT2#ytdxNU^u^#Zf?LDkB$53 zV``&6Nwrw@U}(nXq}Q;tpUS<`2_4d>G0NdGzPRITpOgMdJ8E(Y(Q-JDY(^=6f8^uK zqb$Rw+&=FbPxLSSbqKrdjFL};4g$%;&QE;Y3m5iV!}$}Z>GO5h-}C34n*X5;gF;}( zq5)(p5vMp=cs4aPr2~(HfbI^`H|f3f5~?tH>5}GkskZv?o&@QWq|cgK#Mk)B*U3p* zSEj{J&$LzaCR{2CMtT3yUg@XJYe^tH^5kGMvGI?t!i!sGfkZEevVjuV+ zq)sGU8G5NKkjL7Es|gwI=0}P})xUwHyx5$-jSmcH#D58@qct6e=b19W2!1Yk@atdC zER1SId|I~)Ana3dlR$8i@ZnPZp1q5p&90yq@C(gb+vbxSs zPkj#RiABl*15@ZlXyiFeUYc8F_KvaRa)vgrBe$SbWg{hXW5tH&Wv?uOA=iS+j_N~2 zrErS(hCl8)7}k?G-#bI1Yirfd6(5y2!U)SapErMH9MSe;rX0<~mxPYu)7}&ovL-hm zE(IpvpLUk(?qNcSwvY*t@+r|o3>=l8A_?cb(>y`u*8k$t2&P>;DF$Foou#$h1cG5eha4i7bUDEuSmfpO)Qyqi07P40bJU*!|r@b56e-dMa$>fe` zB1+fvPTO%eemxOgb<0rxOA;oJ<|wu7W{C<(aT6JS^(T$MEc<-! z(+YS4C`I1*$kTPT(Gj5U+4Gs6r-&I~zbE+3TxNSFM91!Hq$)?gvFY-~(5=vhHLw9m zn~a~k$y;P#rAcMiE){!phALy+;zmNur^4@NkC8fy#(a#XKQ%}&~MY{t$TE^s8TLl z=L49XIAU>h*&J6j{{G+Zn+ss{BZI&%rYeZ;_gW>=7%FTPBpgPNm?^l4rIsf$i9%DL zcMKG{@!o8KZf!ofSr3riE=enkX-m|3O1^v@;SYP~XCfIVp>v=jn{3|=nu$W31&Zg& z@*8QE%hhv`bx-M|8OE!aPoO{VA-5+kb9rSl1d8`*A>3euMpX-58)oiwjsJi?2&Y+t zZ-*WcP+0=ALLUNk`XJv~xH+$pm^2MeKw{z~4u_bPR&0N^HLG;81zl8&vxItWHh6EYHDLd~2iKUD6*z!mzo?X%V^b$Tv2G=VeJp?54Y1K&Q9Ex z?M{NriL)luc~yU*3)!XH3uk~w-uasNLYwE~n|I?v-%%Zt-7%gkxCgVvT*y~tHSJ*0 z3uWU@#nm?qbQ{t!n%8aHJ5LHi~ig~A#WD6y`C^y zN6}zq=KbYb^sfBdoX$eFW;DmyK|-m5oO&qZM1T#OvNWkYcw8(*il!+>{pNma+kX4B zzVL>yw*qXy_#S&zh0!aMXaza+m3<9A2lTj`gBGB-AGeSc=Ks>v`9LA#Ae{GFwf;Fh zaR7D25i8mkMb`yc za7pgp{v8ykr9opxf8lRZW_b{+x$@8daM{4Rj^|<0B)Y^6l1lZg&iS_JS_zfcy2RmE zHQozdtI%WbPlD~-R!T%lRw<65n~~I<@|3sg*fn}qNzLYH%~4Z5RYtgEQt-}qT*1O$7RkAZylK0&UDp-}{D(rNan(yH-AOFm}iV?fcVCz`+ z$({jY(0vk?c%G}Xu!onl^P!UxrR5ke3}g2h@OZnZ-V5*z|H45CHnc@wA+>wNY0cS}RP|yS#IuXV@f}LioJeptW{z;X@Ge(o#9Kgj-d}Sa zE{w%{zzu)r_PaH%Fc%@J60WY(*q&=4AMTzP@FUleo^aOJ_w$_*Ym=@G1)C z8@s%s(&B_qL{KG~v}Fw5H~LhA`%T_xSo)A8xe&wUR=|(bX{9kN7wHZcuw3DA)>$w( zM%PzW&u7)Ss>7)nbb_Dz9&T2jSDcjnGMX3~Y52GhF8!DL>E>5`?0SWDX&r#wku;7! zO!`LmG7wBEvw+8-nOiKB_hNMX(O+d3L8_;?|M#&*Ld3Z3jR!q**p!95l8i#L285Q> z0h-(1<+Y{Cs)XdWuZcoOR~M-f!Q=Qz8v5A6W2}%QRG9g!jDmk$Pqa}Jzt>8sdMozt z1?UcFmJF6tVclkvh1B4DnaIeQeQnJ@fOv}Tl1MnteqQYCCe@@ho=x0FvuW{G1avw) zAh0u?$j5sQCa&tnDaa`W*OhB>k2{*tzuK99$Iu+()Ot~8Y~P=GsI=bt6E-H5FjLc? z*zC5eWXE)j<|eW~LlAUQ?cyCwH$_&>1b!Od?0YE^&@c0Js?mfkxDe9P1l}sDG*vh6 z>DFD()S}A014zA%-_U`Y=Cagc6ZwGrPZ}xk&BKXbVoM(?&}Q$R0>9kVteD*t>2tCS zLIgiuFkSZCt)t}NUa;uyuK}=q(+}v5>8d=Ja*(5dX%ql zzYg{l1`|*J`H}VbWhuX+_j?)N9NCfU{gNc9Rhb`4+&2DF(cW?{rXX?ubZ`Cf{yv@MwjVFnU#P?l%!*p z^3VJOFD6e}8tW4Y8bsj1Y-kjsDj{AJz7R^j_(i-gR=LJR#IDJVDUzOrG+hNdsQO6d z#o+BB?v|ShD+xZ*6rvzhpP4vwP>`MJ{eJRd{q=eBL>XgOT2jhWKg z`Ht&1Bx}GcZ+@DU+oY6EjSzKH{WzmhiGx`e=P-bO)w00E$nclsHNQn4b>D{kIA#8g zr9=il97deDVs|9u*n6BxUa(6BjKROv{7B&~<;Twt64ZzSXA&BtdlF`l#w^nmHT7Z*H zt?l->$Vqc2e@ZVleJ+^c@hRtD4v67BN~fe8C79-EFW2R36%0ojsQzXQK_z|_irD?_*W%@9|zuIGQ-17&7 zS#R&5N4l8JhQsntMIYYglfoqJavVZd^n14D@G7ayK_JW6w^-?~iAUa`|a z^c-R!`m-xhE={?hoppYob=11X!tgrnxj>6mF#K5pu%SNK*Y)Rsg5yUfR_dQcbl#%P zaW0=90?gfbvD5sIuhWA?Xcy&>uKrEM+}nxghi=zR`*^F$8^lUER>O}2>vr)=)Dest zDA^r5`1Bk7~0i}jI&JdjmC`g&b(UBcElmd?GJ_)(`f6-ajh zNeUp%PQ2d#Y{S~az3GwX9a($vn)$YHu>aNRBr%(`t{g3$$b>+tv-_3d+%@xq;jk5z zt67+G^ORJv$Y=U;2@_UnF1*987hXtz*p&<}M!nAaPgy)5A!2yIj1zn52TXKjf6h_S zcqE6mq;%QCm=jj7i~@f6qqW^WB5N&3*v3?hnhQAejL2*HixSR%1x_xT1!KtrPq4iX z3uruEv8zzSraxY|jQ5I`xlK8CR?4Em!_xkr>HI4{pg;au`C|9GE&ajQG3JN=CX3{+ zmBBl*IHPe-{eD8>`~q&^CvHRA3d(Z#v%oQ(?{n2$w~x6HF)}NPnuqw`Lj}<;`2_0t zZy+Jmk&toYZjZ>?yrh=m;>K}!g zQXg0QjC+H`TGFt~UYb;N>dWM^Wh86@N7Q_DplI6*`tAfNvCXfpsMwq!5F64gxYh-^ zJQ69DZmgSeaG_LC`DeJ88K`EgGaYeWyJ2M>@1iPUnELDF(M9R(`4m{RW`b|jqzw$~ z^K9ydi~8`g`1zC^T{U!n!A&Q6c8140f;}#aN=7M zd)=vWZ4#3UW=S7xfQMp4dGh~cX>UjWo-F5LY}G7mV2nA%?|@EW%zyOVIYT|N>^z#D z2Gfp9W zf6B0F8dlI^MPdW1&Hehroj=ie#ZEoSeo0gZpS!iRr9E*8B@o6YO-eh`p}OQi@A6fTEJ&S z`jo4YC7*5b9sH=!JsuJKiS{zXj~WwfVv&_SVCc8oO4lcVC$he4{l6+TUa~i*R)PR$ z?97_$u#-$~z8Auo?bg~w7B5VD?Al+4JL91VY)7?CJdq>@wevB{XJXJ>ZPXT5kyoR9PLwLlK zQ28d%TZeP$!F1*6YVSeqN1^g=QQtAgta2`mMyvY4*Z*I@RuNL|6Xcv*`{k1hci@-% zM8}V?d(3GpUzVaTLGl**vZP(FS4@>*s>>)O-g1d?mIja6g#@wc(L8^!$^@0hg?J^t zwx;03ZAPtlu<{>?QdQ7z%Dm-)N!?o?l~thnwua8j@?Xi7m&OD8y2d4ja6Vom#-_uc z?Z-*-@P?1B`vgkA{kepH5yK?DYA8=xF6SrvKd{;pK6yM7V_T1Ze<3L6>vP?c)zM5b z-8`MuRzo2^*_^opjL5XM*go2wM1DqE7tiqB6OPBTl*J435UyH^UKiKH)%D{aL^A@4 zO~$j_S{J1SCmjk-k5}Qx}G`u?q;#5MGUE#J1$utRm0!Hde2? zuHbhj%ipNv`?Raj*=Y|XL=8ISV8-dYPcUrPwiP~*A5Pa}&wipBuBXGVA4;Xh%Nu=> z{2sj8x*-Q2{Nt`5vbEt6PLnI}EfNYRd!(K9A{dT7O#T47)EAS6jgck_u`Im}<+!Zj zmzZF$vjQ~+CZkmnarBXs)*KN6O=HT&k)d0jR28hxJb}I*(9>`1 zJJm}&He!M|zoc+i1g?m&Bpo_H;@k`RZwo1@yB{z0Ua$90*=`r2A`Bclkzzrm_)}B*9NIx|gEyJf5$Lube zeoHnZ5B~$mpJaP48g~mh+)tw`s%`DbS;+JR965g04V7&*Gy+OLuc-4v{VvO&9uHXp zS52|Q?m)_5%K~G?-oPFc1-Pr!L|!rK_#&{-!eIR&T0&FAEL-4bt#U$`jDmJh)0aK% zcUJntnnVxH{BxWug;#&G6%g&)zLK*$GHZ=bIO}3+sPr8#AQ5?vZ@9D1sCC*K%cObI z+?^ffRJ|;(=5&h`E?G)+OMbS?bMmoxhzSphtboD377*m?9EZ)-IJ5Ktlc|Z+pXUWSu z9{jcOxn0F?yB}{^F@0924tr<_?X@Rbew@r%x3tnWZ68+}dZS@eAz{O2;&vSx7#zZ* zh1nbfvZOVc;#6^*zbQ*`A4Q1cRHt6G!>#G4cB=1Dj--#>y5q63GCRa(%z3Fp~n@jJWD&JfR5F5xLNYTPk+yJdLa!0anJgvf zT_T|FmJO7>Z&%ja=5@~P5c8EomZ|K3L`JjgpU;#_HyR?Q8~J%ijyL{p+GEG)*=EHt zp&M6fy(YUe4)K^~8)4zJ!_}pgq2i;YyPt`F4Ud>>#o7~vbcK4fLXWW7DY`LdNLhKa zuY$@Xt=3N_JoR2cW1`YlBt3Jb@J7!0bB(Wf-4*40fj|1tvZz6`&D_gR^o#KV+L)rJ z)ifm`l)^JD_z>-(zPSm=DizmLB`Ya*HNEf~Xa1O`M3D46^Q=;R{9ZX|FB3|K^~X1c zHy#^#rt_Dc#T&X4#TRGaXwMbE&&Wd7j8X24u>?Fhpx;cg**Mk9f72nAH5)b}Q-mua zy&|t-O2OAo|Mavy*1 z1$`#Wd@F0lHTFNLu7o*rs?WX$_yIw@S*Ze7@%!k%$j%WJ_(fOmDzDE&`s9tg*sL~$ z&=~k^OhoV&;=?!8ng2im;LVPkO$R(%H&F0|T!=Bld=kD)`Pe4Ir&$BaLELz#ModYg z71^ux#r)ql`Zy-?A>bN>VutU4>CEgm14K80!xu>(fZt`Bs-P`?!K7Z@&si^zl}V9k zT?Ko^>rUFea$b}2Lj*1F<@Vc;@3wY@*907=H6SZ`1k{TjJmk-?J+pSRH=f8d;J4MK zkg0w6%WX`5`#St2yNmRjT&TIv1}ZY2pBrSfzcX=f8K>V|1F|l^mB1fnp2sd8Gn4~33?`mOXN!p0XO*sHlIbGVaQp3V^VrLEZzM`==9WU%{a|vubK}OeD4If z8+5Lg^M6li&6*e(BqUGuvJAD*+BxMDd`fVyyjOLDcyT!hA?_=Ibsy3)``|N(Si=sy zFOFH5#z|Y+xb7Qxadb>oWGcQcYNp`W)KJhO zYi)AyArVu2r`?Tt3dU+(gk$)k%H-f8iT=5{`?MdPAHc(ANr{kkhxXSA>gxiu{EQ4b zxtGe+kjciBeV;Q1$5<5rSf=kglX`FV@im*uD_N>{*W>5Xr}#JSI~~{bhE=`q6!=hA zqk1M`YGTVwrZN%9gIDN|(FD+p96yYPt9^JQV_#tZOK3wi4^PY_0XRMw53p_8&fZx| zG`vxkoAVdJd>=L~8NWe2l=1!j!A3mqtzejZ%XP5IZoHuvYda*^J?oMuKZ(=&+1>D4 z+od~3+4KFUk@^8ZSsN`eW`E$8V^q0_XO)^Veski(EJbXG(mhb(f4t|*zOdpI087UB z?Y|H_sMY*~ZE&ft=~vdM(^4Zg&aaxibu zCC|Nc8@#x&03P54?_fQ9;zai_Y)U&Kaf&C=%m_Wj>&%^L(sfsA=VzfO8S3N4l;2_p zL+hzMd8`-i>F^ah%StEA>^umYrm7&FNszrZgMS!#eSklKHc!G>wd#EX`l)BuIz;8D>`x@g?PW)eej@cd)LYgRS*nk15bN(^4F6s)Rn;5W}#xS|B90r@tXQ}S1gicKZ?zgE3NxaHEP^z`^# zh(O>IlKwoESRF}E%Teq^mIQwx)Qy-T=d3vU3-cO+@%n6Uf9I3=Peiz`_27?3&q^cw z|Hc|FcS=#Td0BpX_nr3k*GCKAbeyn`iFjo;sk6Y=J~XAJ%D;Ksez1g9?3M(G;V69{PtL1WjZvnZ&>4(ex^hD+R9ezR;+Z<-Ry@l&3(U%H(0NPv zz4@C>QWK7T0B6jlTdxpoxxzzln##7`Sioi4*!)rBKX}r-!%ljs3H3cm0Q6Q@P;T5c zkcN|u_*Dw|)VYseKI7%yQ1;*gvj(wyPk%4gDCXj?M`Rrzm)o3aIb_cFv{pNPpR2@4 z<73=*Q{-+d&Jr=4xWE6&!(+d}#s}D;%u_uV6v1sk8Bf$*Z!5tzovECTr0H;Ojc$y% z`v|6?qz)!Fe$CT@9cxx4)Fsrn}aZ)lX3h4{Q5w7i7)VUZA`O(aL zMt{%0R#8HSmtB&?64y(k!~*qhZYnon%X{NyUiMkfhZ3R6y@PR&@qxUS_(QORS9`WQoE zdHxKfa3CvMB)iy-JFr(i$HKr?B9eY_0r_gbyB1G<1Kvr~WyX+~ydc6#6Sa9QzHVVY zd<^PUij#G9y$SkCoG0*!qVPdr|6O`=*jyqq@xD=93vFK`!lv;kvcgXo?7_*X1R>&& zt1i$R(`bDeP5kst@S~!*HgX7=&wMXMkHnD_uEFNDnmY(_zpM28ym6nQS;^Um$A1%b zDVv&%NZ8GaP9)7I)poB8#`jp&fC5X#PSNT;##=>!XW{?601B%ib0U99Z+{IOV3fw; zd@WFA%CeyFa!Zmrw39kNuA8=IyjA#&-M>##NT1gX4A1z6PmP|tG9QN@6wjhLvL1=O zKX_^XS6clQ)Pn66PIMp0h^FhK5_^Ui+;44k zh5A70|Es54_xyu6Zai^5(oO>#aem}M)H|`;L{<5 zaiiqTwDx%ZO%gd_K0Gex!s%KAbOlHX7GlrlitA@dWA*JM;<)mvgq0q_-vvY9NA}di z229*l((E5NUBSj%CriKs!ll)}UY6M#|Dy>W`1^gl~*wLF4JC=G&7l_N~ z(-(y>oYY-VzT6S!HFfC#y9LtOE=7UwavwCBW#5~$#vz*oN*yq;%MQp0;CnQ=t)+yC|nxhm3lw}F24 zhBy^YK{&t1Rh0WXGAj6}XP`NIxo}B)MTIQQAP9g4sY;_)p=o!T zZI5*V{L<;~uc4tF-p;GS4++>(J&|{Ka=F8;>X64^3$H_E_aI(MCAV;-SV%Ac{3S1yVc%N_tW&Z7LrG`En&f{u61Ai;oAvun0m!TO5Ru<9` zKnA$!Q#^mkg@{ia46uMG+Cju|jjeQr1lJ-Q<^T&-aYM!Sc5ZR+Y1Q@l^Bdhfw4&E= z>2W;xOH9d4yA)op)6TKgC65$cZT2}EO9)E=AB~%pOukMq7CtTR5+K{<5)VGOqtWlf zeY?jzOS9CXHKRI;z7^bgdDc=F`F*g(L47zLJlsze%&~7sdftHwRf|&*<$dfP^v1M* zY~dWg-i2GC;Jl^g1#?~iH_4y>6>BDPJ6qs-@)ss^W`?7|lYkG4=?hT9?SV(!ywWwcXW3FF6XN7yylzB+ zV;R-oG&&tux-t=VA>-g(Hmw%!P`#52w%oTtL6IYHNhpO-31$u{s;rN4%LQh7nFT#F zVpWIHQy`miL;oOlsT?K;3hsT?K%vn_o)yuI1sb{{WQaxr+1B^t&OUJfUUgpPN`+2q z*J>U37>&Ga>|?TA?a_xB!)9<;_A#2bzp$4GqO#Tuh1B5SPTLk!zjePzMIkNDAhZo^ z(~Uw-g)|qMG?luv$^qz^qg#B==Jk~c*WvlU|2}v6XyHB+!eT-3_CiwEj}FbzGlvKs zhW$(436LR9c1g3p;eL~Y48(c`usmM&T+@h%c&hXmatq%fn^5eazg-~BG^6EnrpH|8hVaj?P49X)f zCP#d!CP8X+cu!gEMo8E8TF8-g8RzTlm+yHhl_eP-qz;<@BbNP~{dx9PgGt-s&sCxv zzwZ6fvkou7?=BT}b9CJ7z1#w9ss2)#^BYTR;>n*8 zMS#0TldxUuOR9K0fg1Qj6jmbWj# zY5TUW`IV#0oX7o-zaMa{=kWk(m_u2Ys+1T{GVujwZfzO-;pODpJR0|+-{54`_O;(x z*eC*1bsCIqq+vXfLqwbzq+-kf+xS5JRC^MP2ZOrgzSj)R2Pc{v4(Z8oun0?U{h6C_hn39&h=nAe-*J5R`={5Hp-B3g z9T>x_I>;AnlrkQh_g1V%@4=3DUo?|xXll!dX^>jUHi?*oT&B7ghl zv!rLUFqiZ%_r3xW7(#Zq6MXEDuKIERF9}%dORVjg<-VMyvI7IlK8Th#awl^_a}*Vu zSvoR@m}frhvqo{^mBe|6l)^ba!2n+p#{Q$KN`4iq{2Rn+a(KnCk9( z>IkEjdkhlLn*3RSP{qPEsKzXh0 zbI;@-jtRL>S(Om#z8d{WM8v?HG9czt3Y|hgpV?ND3Vy0@|s@^#BLW zrIb|q%3Q`VtQw_I2T!P8AF@|K7{!~T=61|e*QoB6+-dE~pMs9DqavFY+)=+?847BI znxuCS9&(8!5NHlpAOFlQw7AsaQENZ)cX)u z#d9xNo>)>p-Tc|xp5o7>`K<&e$H@9GN0=|!pAkzn08eYL#`o`Tf!dJddk>;N&s$!AGTp?`kc%7f8gWMBlGR>v2N7f=88C4l(C^BM}p*0JaeDY+S zP?1)s%P)Wo;{spRU09s5{>RC&izwcdetHkM-wbS5^( z#3B%+Jl`9ajp#k4ky#4`bj}`!k zshj}IRH;A%`_OWl`Kv3!>}*lX2rbZKiz;2dWR+}}=QO68nB)a@JfBa~xVzIih)AT* zLUb)eZMswPgI9V_4j9rIw(d|aX9lc+V}qODQ&RTP=|TEqoJl8WIpk77i)yyJ&qQ+n z3MhItuI`yQm*4ZoT0K_AHt6r%}43Vc|dwz7%?rH(c{KrUri+EyZEvG z9yMuigP|o)MLo6qS}uMAS6aPN7xIT$pL1=9DHw8LWY9%CkHBCf;V}g6U<~T|F6$8b zhzN;OV`LdrGs4v)Pwt;HOR)iRW-*LmPT;v8#o#fI;lqbKy*%9szlPTdv8(5fq*o6S z-Q{|Fci-+or+c*s*J|MgyM_gxhf zDxh%d5clIcfk+bEPmgjQtFZL73xs1&JGTH|qC0dGP~EpM{-G?`&ob zjzC8mg<+f&hcdLwMr#jJ{Ywz}I+t$s9>*-bJ~!8Pwh64KUUX3k%urY609a=*QmOgo z+2ao?YCQfLBun4kVmK3d7UFpqXZ%<$O?O68F-~d+ZDBxr2NLR#>#uK5GwuNTL_O5@ z-V@QCz6^JwEXQV@2R2X3cw!4q_AEqSJV6<$r-ALB7DDciZSX@NK*WL>iWC5JCWdK%A44BM{7DMg8weD`=pp>j2^M;`rqq-+6_FsOlYaRuH1_F|| zfk|UQPsk&dfE^S835-5d(_t>~^jUs?2ZHAfM7`km;TTKILYz`HV%CMIThdoYRmJw{ zE;S;nQOpIm;qVz~=Q?&0Nze!Xtm<62ns4%POnJDRHjmEvUtN;ip{|s;h^RykYuU=zhMmVuKb3Ofq3LtH zQ2BS|IyUqC?W)32PTG$E1&9pQ75)wPNbP!fx6bvrw7`jKfrn?gPvxYnt_7~DW-T#%K=N_nL zp*dI*9)Z$H!60OnHc+)=wP=1+m;OTg3esVm%h4O9{wgbAyA9n_Cb$r00S(cHjOTU6&dRvKL6TlT)%AU@sTrWKxcvcH-j`00 z^4}QK@eCCsQO3h(XcSY%j%K=D{@EqdC4F+0Kp-Ztpc8z`dY~K5<2mj`Uzt zoQ0uId-|B5CTAd$S@hxe*~*@XP}?@YKp?{K?VNzFXG zaV3^l)J~ZXZ|Ou{D{5#C-9%`?8((nJ&ES`!=eO;<4UJYuP6I9 zv^07s0se0gLKLe42P0qIG$mR!f`V4_O?37NrztSZxg0YEU55E~1v!x$gdH9E^YLvN z22^&Bw)Ap2ygcO1fGc+&=`b`}qTU1xkzNVV=x?IKzQ0<^)PBIrr8^`xcPPb%e`Q_o z=18c_&!;iV1v1753{61_9>r-6NzEx1g568EL85|=J$pe{;osF*C4LgLU0aD3mEDQR zCr*iH$pGcNf*Lk*5^5J<96|yF=QWholK5!RC99maN8&igtut(;R)qs?nAYDGkJdSQLGlp?QHj|#?GV>Ruy-*ovVTK=?p}s z9j(()6&Ntm*V|)s4B#cFe#>;5f5I8`y~|H?k8ylYXD4&z!*4Er%BZ7keD<_*7P>ry zSfQQc;uJ1H821AAoNM|!t6ysm$?LV2F`?6`yzDQvW}R$+9^-Qy!sFDXd)w(X;UvH0 zjNjySvi04ao-WNtGli?N={KRg4xoMTjW~y5yufdTlKt*)e3Khf@NT&EURSur1#7P= zl*`kvn-YeSq`V$QNxpj}>DLbochp9x;F{}RTm6gd%^T=>b7Slv?!zJ*GT zu0M*-sV-G1Vs#2|8E?Z)*aR{n{GNoaWKgv3fL<@ovRk{-RN;Ayz$6S1IvtsaTEz*> z#zhvr%bx7R;mL@ZCS1N0zngMFI*|7yznzl>!PKOOHVhi-?*{w59UEfn0FnF zQckvjh}ofrOJ>N)(HzO1%PeVYaWT!nxXwDsnDn9TJhNm;^c&z4jd+-JULeLjOKyvc z{B*{zJ1SPpjuqIA7R8)*=jaPL%)|Jmn(N*rzYQwXV^#DovDlw&iJVRVVDbugmtGKD zGpsR)&BOv|B$Gp!niZ!*$@}1W=ML$r2$5~^B$)x0K=H8uu~WewcIbp5Pv}jyd9I(` z6C7LhY57NpGr)BG{r5|VTCDrSLiW?|1x{l1cY)r+Up+ITh!7_;_qtDaMFpZEj! zhD%M{@;xZ%5iMykRDJaWeh4=IJkJnwUod(9w9`$S$FEtU=0RMYw&`#*WNPSDP4PRX^)_f_&esNAFXKJ=*D7AK zMbWOe=|!`;*7n@g%yyVS&5%RbyRbbu`O}7jO#v${KXSOWTYtPIm$mC~drEFiE?2`V zRMY-x{2B$MT|ukgvJggXX64Ga`@M$Qm`rb?ywk%reopbVoVAFfJ;!UZ2@A@j777QQ z^X1IPE26||3WaM5?e?Ap1-XA{%0)G_>e##YQEYR`c<(6bt(FbkjL;@4XQc)1=RzGpeSuMnx+&)!b zHhGG!e7;oHLx*ICf5naIi_1WZ+o!T1jza=`B1+jNlf4<>q?|fzn%D=6)U!2N*SM1Z zPHODK3+2kI_p%n(+}``D8xqR|<~*>22YHs8n<;277QpoXUdxq*w78a~SBb zp+PHsr>>}aw-vt zEBywKCc`unjP_`2MYinS8M*bl64;$9_%9!jxyKLJd#IB!D&AVP5TQk@iDueYb`D(v zXWYpgz&bC#W86D)Ud!m1+{-^J1Q8U0g3XFXEI+v#YdNIPU2 zmHA2H`4p_{lN0;gf@p`n{by}B04)f)E;`Q-f6MOcStlvT5=8k+5C3LpI)cbve6IhwzDX?5ZG{IfjUWRbb*RB-*GmqS4!cqx7G8)8P!OUK&DE|`iViRGxot$ z=Xg2un{{>(&*O(vz@qpcs?Itp>MnZsfOJSpcY|~b4&5Q$N_T^R=+KRHmm(z%(xG&h zgmg%Q^dJgD2=~nUyLa7t|8wbbhVO9ZoU`|Sp3hV9cN@|gZA&B^l?u6d9>R?3oy3V+ zFzaAs_J`McLWv%De5#j>_hR$}l5&eNWdw_znGDU-dY4(mBAd+CCHJ2_2HTx7AN%XyU2993Q2|4 zCo_7TR6TCZ=#-{=PonrSzpR(#qgt7*LPGLC?NY&xwTOTf|Mrk3X&@d%!rBg8{H#H> z6we{}RF6}}#Y6FppXS+gii`-qxL`ALTc>ny^@CHo%Ck}&o-c$sFVeI&M>)`ZS)w>L z$D|W`x9^B;u^k9KrLcNgqVK$x|W)|Gf4|>dBU@F$C@Byenou?rnw{VK-3U ztCkQ!l)n=yQ72=b(B8YZDkbF%7^Bg9-nk_~7qHf4ER^EN8FIS#tp}q=NK=I&0r0J4 z9yG=+A$zv| zM|14`1ZieF98Jo9FqU~BkBasI%!zqRu3h@w-uR8IUr?#ld+eVX{lOBDljeM`x&ZM( zZT{rT`ZVNae~8aAu9>_}JbJqvAtnPKU}tvc*vP({xoQRtJQ=ZF*_#@^HbWct*&c9o z(;T3|$xECk+K5I}ZxWfKSu{d~*HmUJ0-~{>j$pggbad}ERZ>E<>*WVh>mzOjWoN6^ zI;==ZLMHIp95tRYBz3x|GPnx$~{9+lxlI`_$yA7ZgAI&U_)tw@TOc1kM zvv~a}D@wqw$`*SAE{Y{1V7Z$5(8Q%lf6|)x4zmB-CyDly&;zKzdj})xW>ho9WRr%YNcP3Xscz1HgL4|Cqwx!R&T_O zF_Zdd@5!^u@{z`3uot35LT5BM0~w_Cv4jGECdJg|k=*;pMJgSe{oxktLhUx+6m*I8 z2Iy_{*XQ#{g%$kH0```IZV>CupZ#ZeO=;6pmh<10K##_6dU&(X?ZUWSFA?q<8 ze3w-!Tu4+ee??hm``wIY9(zjiuoDa{57WBBu9$q(IfiNfv7{gK`|5n3B`r|T)xo?7 zkz%>e9f$=beCS_72(_($?96gI!_*&F160lknCCedFZp1l`LKzesxm|6S>;s0PgO?f z(Zi#iA9WuyzxyCA=)t<~&9#Zc5ZN3WI@jcA=VDCC{}%!jFa)O1eSVahO#s64K^T&rq{q;z5 zP%oYPp+}EW)v%lHCX3H#0El!R@$^vEB@nV32bk^veHvLq-sNf$h!USa`y``k0 zPU;_g(c=lAEz$R0$xy zt5x2}Hx>>lGs%@5S|m}5R42$fiJjKbaSZ?F`bR0Siy4z#s|`gb>`0Gj2f$4E0TDIY zwM4uANJ8gDjeZ^;VD zLN>KljNl#eTxtqfUw*&zNSE%zKz^@V7LNebKe>|zR2?Bx8*INO47sn)-&jmCduJfK z`4#-iYuf*<8Os^^H*$|eN84BHKYk;^qAORKa!GzM&sO03l%-xE;$5_cv=mjb&nBU2nAbg(2W~hjYzrPT0^%x&mF9bql$O}459B}q})y> z*N~ozi}fDZaHlA@ufd?j#{5kcPkqj}HxbzPxhiQ^HR3f#1GY%1;xZ(jiJ9+IK|4;p zAX_#K_ODJA9>v`MjI4JEz=He*)Vx_DTJJ+-ai+#UW2d>F;3hGcp;*aJt4x1e?x$Ami-H24%oPx=Q>#$< zS3|hZY|DJZ*3A*LQV`D8kP}kwuXbXn4$yTG5#J*8VmAWk0VdOXkiuSXOqw47fdba4 z_lXS5%NYTwvo@RmS)WwCFd>4vkU>ya@=Zr`S}t`TeAKnZp65FM8JO9x*$&){=5UDV zM$ftE6CXA&O&hKlV$oHl)|!ddwncZ8V~FIw1AWOUvmEDKY}w$P8(VT#ogz?w6T;;nvXBV%*SJF6g{@wtZ+apkg z5f};38W9H^@B6Y9zY=Ql*>t*A#j`Uk51*X3NQ;>09o4VO4<||b-qg`tiHmxy+fh{l z>Xu4Ip2Zxz-M4MXW$=jLzk=8<9ox$2yMmkBp%mtTxQarBOgRDwkmYm7Xo&8ye#0^* z9iB@&?=@Yh84VQHgWO-p0|M~8QI3>o5pxRt313i4e**IWpy$UfFXW{neVXrR!vliD35SULUMnHk(WBuPOqx%B?xE!o7) zOPVxICM&f(va$^be^eQh_7W7-P977&3$3-*LAxI(-_XC@P4hijMiaqgKVz7k2m?mFN#7Ee&acV8R{-0MWOQ~9M24R&Nbed!y;`*NmuWub=RKP3sgY$kz6L`EV z`52-!hKkEQ^ZgUGLePu>=GfL%9rRMwAFK!C_~r8>!_*wY2=aChFLdOdcxv|pvllhI zGkIt}MRh6TsWD^IyS1~D*E#1HKfdYrD&Ld>&A=>zl4Rxk-QmgD5J0O_s^tvqXnryg zkLYG*%;_UsZ;MmHTBl=|frB5K8LiA4IYH#oQ6BphSt=RZg16(>9s1yP5+eI2mtKW( zHa1|e*R-W5&Q_4&Z78t0eRT(#;>jD&?pC(IU{id+$ThbO7$e6Kkf0Ti9c6{&US3V~{+&573Y3FlwQVo)_`VB6uldyb51lUSx<7K|J|Jp$x!?Dt^?*37mF z-Z3c?EcDC`cn2Zy=TK0dR5pX=_@vRvrvpH4rqYZz{QZ0LqUFuG6;>K^BE$W(Cyq5> z=UGpbmwx1IL)nG|?OnrGm`~}ck5iXeSL_jkpI#|iDS~TE(PzK6Rsm3hi1Wi_-Lgmr zrXJ;{HEYc5TsPjs{A(6sh+W@JpNd5v=uMJ2Q*uX>Eel|lu2hNZKEce9DrMgI8M0Ri zl%v0CM(Q0CXERI&=dcy~-z9K%>s)(2et z8IG`_%+a=>Pguz93RnPjknF*n!3%MpY1irKLeJd-kyDJQWpsT0(wxU_Pc8@%KXXJR z?*ir;UpMm)d9?3RK#GNga`$DEc0-*eJs3OO{dBdB$kqsJAveuA97Y&p?3moXc`g2M zcM*>lm()KLvDb`ql{xl~(U1XqbK+)iq`;vvuQ~Bh6Z1BY;IC$a=pJ`&Qp5LvvuLIh zdXH9$Hb?^v)la2ATsHVR$7b16)RDr$o0kLMqMkCy??v7!rN*E)iZF0yz7zcaELE#3 z628am%X;eV^ZWb>KlWZfR%S<||NY+s=(BG&5NbsVA*Jj^t($zi^SFY>cuQiXn|_NK9})=>T%itttqqDN*S zN?#!eVj7t?>mB&!G`;z|-(*MoI=fK9|C5afP8H>0vl%oyt$ z*xrr)4h?k6E4-n=VuiryRh8@A?A%-bL)s-b{j9<0%8iBT0z6hnf6#%-&#Ngw-tEW# zwOGyDZ~zp|Oya}@+rQMvfg7-`@yQ3S{L1zGZE9$q3wSOs`B(<94_=C8R0GvSNK@R1 zUq(3kJa6@(M4?u7m$?O2L2)cYY<9Fg%o0}{$5=vH3K784opM(8!cgm>8TIAQ17jiX zF*+^c@2`F(GIkR)x)U2c5%PSi)lRU{)00CxTKrz?947>XUtl!5=#OBe z%lBen8sxI#vn54&l`eRsqFmQ^x`fOnscA~KbafgIGdXGx7a5k>aB>PrkuAG7Z__W$ zw`dRM;cWW0J+IDwmeFRVo@C_3C@WGu$GBqqreRW%UoBz445JwMsmekKZZ!IJ7-Vno zoK`o@Dhe?z?mhNWRAuG3+~DFX2Bt;jMY6hb9-$id&e7lcuSmRKwxKoD%)uxsiZ&i{ zD+&DHUj#yiY%V`so2FljHw5tKW4&gMC$`=T2-qr2I5&-ZMvA?+15zU>D_;tWu6l%_ zPQrH@GVv-OCVyrJzZ5?G_W*ey6OX)lKAglJK``P&L0m2$sTor?9*%opgFPZ?xL3!R zJ(|X#@)?_ByG>RblR{vuEp7Ap&xVJq{h^K%d#QJTbJex(b7Fr66gpP{wPyiR&H)SV zjWJaNrFB#85zQQ%4P{1nALJ#Be<(4;aV{(V5@VP-?9(GOi}@Mz2~UbQM;k3Mmu)xm z_=lZdRMx2H<}WucOxu8d9W2?ODycY+AJ~4kZ{jF;1Z()_wPXfr;GpctGQVK($Mq*C zmwe;#RP)2@XC9CDFO1x#RN+r$c|vTShbM*(GMDyW8vp{bG<+uIwYcBsX_)7!nUH>A zm^5&;vG`?IM-zRJQLtbJk(80exAZgVB<#iQUm(YX`r=0-5zik+n6 zkV1fW+s?OBq;K$N3X7kA(D3Zvy2jZ_s9=Q?7S5IEQSQ(Z2bo1QVOv(qr@@TV=%IYO zZyVyaqg8*>;{7bMIbiY2ZzO`)={*uHY^&iv+A=TKp+wHL>R)`#99i6-bvyM@`tA?I zXCXJ>@rwV6MrKAI!ViKUs}ZiE5+ZDW+`8`r#`I7l{W4V@&8>jXyWeYi*BPLHv%I~( z7Vt2tJXOgnPtinu6RTc?PuHNa5&4t4sO1!ERSVC2_d-@57gInbh9h|}3^#B&t-iio zg41333YQdF`4%W~9S}ogtUT9ccIzMOS(|-PY9||782j4$1Q6B3wnOfc9Q|JVX$FTr zuHFT}9OdYeokb8MmA^(NK9s7CNtAd;pa#u5z}ai}Rt-bxWbWQFyJGs7PJh(uBb8E) zowt7c4fHb_dIHZS8f+4?R2dN5AA;AMmi&H9igA3i0-t47W@raJ7rtOMbN&8c&}+ZY znMv6>XJ9&^#WToisd*Wc{_&*@YU?6m{8X+!hC=U8}}reeqSSX(8Wp-=+eakU=j7IU&(g^5Xcd&t)LL z3YBH)w{;yzcNhOXv={VwesS>2I9m#idgA)DsY%JW9Hm9La{!oBO~0T9BrQ{wKZy~L=XMlD3t zY_mw^)gxt(_XOk>{i|=bQL0v`7WBH*7o8a`Z@SD;hIEyhM3n^LNnPQW=3tiYiS z7E}nVF6kQy(VH!~PwArH7UUhegebBzZoX}( z!;tW$9d65h1&=+7`4ELiWk(BAZt>hkb7O7CGE_|R!1#p%g`Qy?Kt_nGX*!(%+bm5L z;-Gt8v za1g~#BmfDIDeI}|o!NP(+C5*4&2_d-%46;m zi9_U8>64+6NxMWcI+J2L(eJUXgQfSJ2x$s-?nmx9H$e`AToJZ7@19N?Fpo-M;mp+z zs1~1sraVIr72v3H9s7 z=F6Vjv2KD^{8a;$s{{(Lt=$F?wZdURC0JQZU)a4PgB|hB=`izE#eipG>%ARNW2G-3 z;D4e^l~+&s=IVL$w&IZ%%ytmd>$i-+KA5#}_v+Zp;%eEMH>Q{K8S#xABZ0;9a{To( zU6o6}>T;?MTMd$8qE3&!T_Bf9aiU(u2P19^10x0~Q!e=H`Ot-qUhC*LgH@*LU@?W7 z9P?1H5gGx1wX`ra=sR}^6WeEOS9gi637+TtzG`gX*rc=%>Vh z+=hodLrl8qpd?88FZ$r}4-V?e(XkJh77(^+AJCv12b3jpj{2b`3?KYIbdDz>72F_t z(qEfiua7J#GLeG5@0ovw@^oQ}Ix1Ls``_GvUohoX4fsL&nX&Wf-z7mnz-Ew0Suyg` z(PCW@B5aAk_2FIhwkSw(pw#UInl)~J~_uH*gns-frY*?e{GrsY16moS7|{G066A|g~aOc5P={7gD;OFw$1*F=)go?l+%25#D_4f z;SSutd*E2U^)3p;ra{J@_x9FmsA?p;X$R=ugt3t8W2Djw}w{ z&&sdcMY(TRu)|+WwB1`#+Z-jp+TLjgu9tuQn*gf@d-ioJ{5}BS=C+340sBAvXQnR! zE=t8FS6lBIk46=Ab?tXP#}@CtKg(8 z+ZISz*`X^ApJd#U9>o}%JToIfe@yM*2JCe4X&1!5kX9mL2*9aVTQf@dCksPVH;0&} z(5dit!c?Al^uODc0hE9)#6BnJF&#s-v|R-la*!)+Ng`2{8B1U*tJ;8p8@o|2J#-x1 zZVi|Xf35;^3L2Y|=pYVqb-nhR&M8>k_i5I0c?@JTd_I{9JnJO4R8bjd;slT=bvvt`=b2GtY9!5W~_$@AeCK&cg72_BLMn{n2jd_S2V5< z64HHSjZ$R~_WD8i@=v!&0MF;I^??sgme2lp_O?$$jQbh*E)xj4fsW=lSb(y+l(RTO zd(f1>70ejOjZi%;4rZ_iTIOybq7K6Pc**e6-+(CCTG-vWbi|0-M0>=pL0RNBr%2xa~s2H|!;oRn54| z{1BU~ZVIG}aJx&P)+|gxe)D59q0Qk>aV+ zk)D`$!MAWIJ~_b)pTC$(c-$Lx*_>4T5f(xEC0U9B{(B8*A`p37V-G4_L#QBCWq=JE zkFL<9bBjFUFHRs3TE-SV0MRS<5>v%B@JMQ?QwU@RX$wOK_8|#fRjpgG;2DKH0jOBl zCdG!R`YUMMXC2jit(nsDF~ud&qU+pBZ3O1UY&_9bt+gkyawN;V1du|_k&(|c1jw}A z)5itm!N+w8sf-SA`Z`Z`h}TLV3%) zXOUZojaf|Ot}ukEVu_NDusou44NtaK)`% zEA1;)IHN4w$N`|8zL~v2u%Vc%zRrFK10S6(SegI5)ZH{Yj>x;q<1di}ZGjAO4wtYf z#!m^-@x@r55Aj46=^abcZ!Q2r#s*7XrEiEpyEfmW7YiYh=B6}wxuf^m8x?f-_@g)@ z2&Mb3fXko){VShjft$Wmr_|<93ts(DJaK(gr3MjNZ&YrCYCQox!I9L%^^2ZV9X#`J zA?WxN2r$9zw*&%yG&XfnMPg)uTw;onbdlIed`ifSGy>X(_@%RB9s^zM9wo2WfFy;T^1NPiE_$aK&gTMGfIdEZ|h@^PjeFBtdehTqj&?gNNzHd(&zgv zQ->Z!A1Y=V@Ho&&J~~UvAF)&e{Mbiim~>APf!$KDiXr?bFGpCr?+NGq3x~@T+74Ce zSSPrwx$j4OKtTmkLAx2BK4wC}hd6|~bEWu^2j?lX_4Ym3^pm~Z^)dg-~(J`>p#yMCb3W-W`CHjHCIvXT$QeAEg)QjAzIr&bdUf3VnW%x5_-D9Hzxa8h!;1g}$s%>D&Ii z_dq>Qaw+|c%kF#0#cb|tupiAyvlc9Cg7x`SFz6mCXgiwbgg^IBPP*F>A)H4C5PZ-f zHw;Tr?IRhj&GPy2d9x_P1>u?lQH$f_*@C*nO%>t1X+d?}&vub(l8SR+n+|ky#i?N9 zOJ4&2bplu{UOD`HZQ73rvRMiTdx+93K-%dqA-5Y^U=oz8br>0XaeYaUJNyOM)uL%l z@)C)5yc)|jV0)EUhijLy(9Qf|Yc>@E-#TpdGjP;dDOXVFQ;4`^NqTNeR}s0QwmQOK z(kQO!TbKyTX=H9(j?a5*l6hW<)7Bz}k}$y|onV@HI^oWx$b8e&qXqLI;cs3o=M=8S zv$lY{CVL53n3o``oZ>ITyJwxi6+67~tT;syRh6)lG{vty{R80v#<2d6VwKd<$C#G9 zA6w74+rSl-i#^6YB67KeFjd%mK>U2)~ZUHtFf0)XI2O5QtwG^+CTG9c5 zqYIZ%*`1^hBH|P{GRz8IGS$TgMv&O9$+dAulpS~6nBlT+t>olfJ!4*{IIMj{7;gA zJrLxjuqEd~6OQ>KpE(p?8jRUNZ2Rx2FZ% zox#r(`=UN~CXxI!ahMEueUGyVhURPIz(>Ss0&*o~3N32>4p1dS=o zI!_|RQ@s)p(S!ug7qoe%t*Jy45tb)I&mBRsnM2Kl3k z@F=9ue|29xZz{VUigy7JU!s$rKz?P=XhVE!rD~PWw_88PBM8!VoPfgnbnxJs%w^CuisycjR!b-XbwaP`0wZwh}@#EfHar08c^~b%jz|oGU9Y zt+@G4OB? zER!rC4=HPZmPR8yF$a}Bm3*GUf3>N_}XxSMQ2#U={*q|St`3NvO`u_L&fL*E0G+}dZBvy*x{VB=ODqgEWI6o1}<%c&=2QU@3e>oNIW>bW*6-Oyo( z5K^D4>kd(7YT~l5mIM=RAi6>LSBC4(N?+R85jdTAbAC1Tgg~GS-pGM(BgWfmBnDR+ z9d*mG;!M?Zc0tjT`opj{b5;KnWhaU^m3{9OXrQbi&_;UzSitLH*UsU93R92+%a7(a zWw|NME18q$0FC1^`nb`L;4{?I?&WwJxG+yXh<`bAxS|%HI7{=~&V2)v02HIc$u>Dc zLXJ3t4G;W}0)H|EKhPFZ zb{>9-fCV5#rk44|+jvU#t%`j%SE1d2rvnt#mnhlkicnxe^{omdj%dtqJ=0yU#i;p+b=JsHi zu_5^5qJD#@Jf4n*#iN{>)de8y9|s+>U4=Go#yhWFz%UR6c4tCv;H1r*5*IuKu2)I| z8D+~ri5iVY&!F3tb-*^Uifrb%Qqbc&Dp=GQYf{){$otXOBaR{`u!&POHpUP|tuyPn zMw35yb$zk#9GesV;+qpVV847-CJ`_sS$v+7JM~*zAiC6f7}1jv>n&wnJA`4>A`mYd ziixz(D0)qRIR5q$%wgubpBZ1;Xn~`hY@o_{7$OLd0XVN@w z@@%68Bg2+YSkJy%k4pW==>mdtHF4|_NB}J?R^eb!w_~>lnr_uYD@3PEY%`3gX$MAb zKvoG>@r#pUew6RUrtA!^+Z{e?JSafE_g--~pA2|D@!$Rzh%G$5+S=b&B^Sy|uL^iC z{7DR@GE7KCIZ>;CbW}vYWL+E){ZZnPklU=@W{%| zX6?V{IRfep^+iL>K5QDciTmofob#hS>3A9cQ3CDrXIbB^mT|NkYRHb5*&U(OFI@#c8i&ZX=8QB0 z^svitB~BJT^~~aDUt^h7{{!B{8aRDfge@4}WGNvssTqU-7$n`Vu?SV6Sb@I&+pyM# zQ!Fna!;F8m=*Q8Z@1cZK%HAXH$t>&iNdtxcKSI}m2-K!yL$M&m40NFkZQN3&;bOu( zfo4;Hua6b8%I($OzQl&wII4KkEo(w>*Xj#;fy-2}*U6~r1keaxs#6N6JBR~60F4^B z*||k&xlmxfO(-N!`VH9d4gK3(QA<9d?Fj#zUu5yY8G>1?f(B|>mxCMCX=`!Uc2~=8 zhAFG;bn>6JiobVL8$^8i>Vo+usXX1x5wLS+HQ8w}1*0nTOZ9ry#B=j05$uI0(Wz|J zfbmgSqC&MPSE({etQsbx3GZ41m!p2kC2*1ApPo-}d7Btco=ToW7D_?x%7Ndnx3aN} z9|8d(Amhjw)Jc>R0+bNpeb(Ct6cAEB9(DG>a{K3fKFz})6(SvyZ(v}s2gIxDGmZmW zW@)fFQ4L4z)o!7&2X+%y6n1oc+NY;Th$|L+w_uG*z$QAS<0eBdtmxboRrkxl6=9WU z57N86;5G}*tXyWCt0*8~V!0;K4RYfdeTiirQj)~1LH@!G09=S4(yhe5U`v0>m6S$8 zT;`lGh@>DhF3iU44}TMb?&MI2;8MH2>T4#Lm?n@4{o?6y@;`ZD{6=Boi-H*AXx_44 zFunWDSTy*&b(Jz7gwuBzH-w-A>h0z8FqRltUHFJxlfyKlf2hW3O2W_V&Aw6@s-{UC zQ3j&Bt>Ap-o>&-g;l4j3H(`b319Lx7v4HEckjmq#a%gX^=NC2^L2sE20`ER*ena@} zxj07#J#AU*I>#oCdk5NdgA+XV)3}ru09;%*!?YQG+#%>VJL5hL3yA9*M4tbENLUKU zPj4t=ho>cNi^O|nIzj%z){C$Qa{pa+<2~EuwCFsqPPz}V~S~Ta1O&Kga*H6HSC2F(Ub?`ZNE0D8}0;Clj<#Nu%Yi))o zuZiK*kR*ix@3uM-@>$~#&B)VpW8~RR72p`Pj_Zw$W`H-!sH_b%iNPln7{>th#9cK)+}}dFKnUk&;4s^QomEKBCdM`sprMxi>d7M- zuLFybYL60Scy&kyQ?o!7cxuJQ4Fat7@XQJChTCZk|3Z^>N8MP7@Pg8uYdhwFWs_{_ zgH4^Zv9D#laVf`eH2{BP_{s}J-ieXu#5_xIHXbY|3#xUP=pYkNAO#UP>S>P=M(MfstK0Ou<$bN*e`UUkF-WU6KoE z7Dut(-$34SiG`TcKN`Q)>HXb|&b@S)zv#X;-s&e=naPjO2OJUoDiQ6nYqic+1gV@J z&Q;x*LLu&D)3c84T1>Od#hm9y^1Wqhv9Lb==op-#_P{gb@K_Qi{iDg*P!M4e2Ytw? zC}oQga1{Yz@DSo2-0rq=U<&D@!ZX(?dhPupJ-Qx*8)Spg^crG_(2j)U^9Y|~tWXnhUvaya;fJ~xIp0Ts^4Y-bR6418H$_aW#nhK0ILQ*H{>sra;o?u&NqI75@#h`9QQK% zIMg!6IQ}nGwi_8kPm+R}*e-~#6z@t_t`$H-vq7oeu+{upiOD&Aq)rJu*_213)Nx`Yy3}`74c}t}V(9%ewf&X) zhT`iMrHu3jDWW`+W;3XCN$%kEzro^biL>7u&$a{j)%UpJS-%i*VT>B1j`M-_i3?KaE39Rks=T}r$7 z_wNwVN=e-FM1TFmYSzB@u^(8$c=c2;z$1%C7!)-$leM7#2J{r0V@ z75x5+=aRJUT6hvS2N@Ajvk=VSvwJ#{%D+ryFqk5_l<3`ns(;zQ>aa9Ocl#y1j+xV% zj-Y;}@G?ZW-^5A-jk_5&&%*AXP}r%-Ee=))5cQ4ZU36(HQ}TapB!ED!DKfs2nh zoPcL~a4&w0I^fT=ZEj1aeKyeBq_3VKdgVskrh`t2^|vy7^iBqkGV8RvWGOFh8<1`A zqN#2REWYHdJ?#l+ub*HQ{@#pNZj%c*MJ))WZZ^17{)7^h}&=si403=rWb5X0u{UuCMvT!4&6CVjckb+6xPeG1y9`n!U5 zj^UVAZ1No`rG$dzUwtiA_f`ves#w&2$t3;-Uf87W`2K7y_pZZc^4JD5aXJq}O>NAJvE`ASm~2zd`QdLhPI z4i9BWmKs$oYN~}C%vZGY!8%(t`3}E-qj9ezW&pX>Qs!a#xuWho>i{pdhQ7je4G3pZ z!>!Srw4jwGz7@?BhtpZP1LwQ4)TnDVvX&VJ8hbqC7*%+vw8XOjF_4KUtt<=$R`ngKvw%vqDB^0-m`rD=ukL&txRR%)_e#E=w?9z zra_~c-UR(kvr(^|dRfwtRZj0}bM=c)P{e25-*^=G4x}x|<57Xh&1V<KIh3dwyqMEia6u~gr1y@9eb%|-#-NG zN^qUrjDaWenK0XTA@$@Xy4}GfWAnk*sKoIQ0lxH$rjZ zCWu*HtT+x7%wIG==86N=G}*gVT#`zI7pKCToi8*s7V5-9xTrl_kJfm1qA zXKN(u~r^y68=LPtP-{#y|m79c!fpenPVVz zGbOSeBMlS^Wbs18kc_8}Cg9%f>VmTQre=dcX(ED(j+483?;kTNMeF9>&>!@Jf09n` z@d!Pf$E({SyWU>lrJe&j$AO0RvT7B9G?uoijv5GD5aTQT085?^MtVHMwGmXLBaQ+; z1Kn-Tp{kkZVYsX8ra|>HGDm^2(iEt9tQi;zQm9?Zui)Z<+;WXsoB=~dwY+y^gKl*H zpeOW|i^LsyVru_Y)e+!(f2dNGcvkEh3PD#}?`FeWJ=?DPmR>3l!ibSu2JhY~%YRkk z88eyr3HSfG>?;I@NSRi2ovSR$UIz8+pbhoRuOW~pB$$aQ@Z~qP*B{{dQ!vYq2%6B@ z{&JPEpj-~CAx-bqbkwVBv7H{AavVA#{jB*4YoSnUN+~@Lv&`V=7Fh_ z499!f>9cr34@!Wbh_5U6!?_;CM8{egmUAD|zK(^-J3o7`IjkW@MuN9zyw ze$#U0pF&IrLojIBZx;@8Wa?i*{XuK&qA)<=0K=ml++a1C=P`r(y`k&Z_8>3th`{RkHD@GfAmSG&J}2FN;12+T-X=~vxNnfH zs|1x(gwX$kv$NU#=$@4{sD0eO(*lTCRGd1XdxYlFl+b&lPBb2PrW1rzi{+1g>&_VZVlHkt+Neixp22s z-hb2qeSL7l=Lrzf2lo1G;Hfgj9nsTQWeQdy3!>PMe)-n@Uy}(cY#T?mZ>aU{-$NE2 zJQ+jy@X*fIdtMO{x{t-Gg&$7!MxG59@y`-cw!l}}S&v3k$#6;yL0 z*yIT4)8>CYEor`hLO{*Gsnvnm*tB)x%lusu_^z1Ezc=5rk{YaXMSqW2+e=%Syymn| zw+PQpfIC_M3>2GCJ>;Qf1^D=QVL9Iaa?vsAb})3)*JtXim4IQvRPMTtFQVSmEYqXT zL-s%*9Ga~OL!$z?CxEB%83!HfqwJU|eBC0d2JX-T2LC5(uu4`b3ygy`59=H zQ=*7YCO=hBV6E zNuEV$2bl1W13ek$;ns}%n|xjxhT8ZRu#jv(SEm#;PetfO$Zy@tf~VFmaZxBXz_lTxE}cLi zBOG#I4qxnY-JskBXK?~Ni)XKmUMoB=9Gv#yQ46B#W?cmjn+F} z5O6o?@}&no8!!j>t+A{=1JIt=ag}j{&4Sxn`-q>KfS}nU5Rb>W?uw++%yHR-A4##i zbz`AoKj;K5=2yI6w0)-zN}?TdXRisPhu(3}de5laa}*!^umH4yInNE9QzjNox+!v1 zdW9!WyKMb6Sj_s7`G56rak$OtnM{zK z27go)zf}K?xjh0BER{1aVjV6mexI>y(mq}=AyF!N%=q3P%w#Dl^@kS=e<@r}P0Sa6 z#>a*5K5|<%pxX834H9|b>KaWV%+W`Xi?4grLRs%}Wk8itM@kvaw=_H(2h6h>+=2#7 z?6)$-F0dqOXN`AD*4|PGm#J*M3v-~a;H~V>sy6Lr@m`EJFRQW7wq+D2s9wm529?aY z4q;~o)@cj0#_hKC;*R5Inq9J7=V0f*nW{Rf7_Og&cAw_-iiYA`~U zC*CZgZ^GCuE(_d*LjC`Ofv@2B1dvBqRb6T{TPrG`vLuZNAzqnVz(OwKcO3LdjpYgmgAUf`k9@ zdn+z}bj#v$q~tfUAcu2e|6gDUu`p5w2gzD$oK>DxFeCvN3; z|0!v$VcB_^x*{fi5)ExyE_pgK@^5W&a{kyJHbe#dp~bf$xZ)3j&acvIVty*Xj>brx zm(ywoXs77Whbf(_7|u@dcgoXRKVeqxB&}5)7|nc=7H|iKl=D!&%nDAi#5w}C~)Xt|KOjUZK*$h@AM0f(R ztFBhS4}3>q5CN$dL#`+x1jvIi=v|A|fTr9K@F2+g)pZO8i?b475j|#X*xn!CE7YOjBI+INka&43BUVeYnK(FF8&7Le;J%edf%l{=rW)R&;xu1iQ3zbOykeP3! zy1OTE7*J^$&#r@(o1EElqo3@y?}uYkWl3?77Wy&h>$OUoIdRq27JYyH9{s()hgFzq z|Eh+(H$zWctWR%ARUI;Iq%}6-n(WZR*Z8L19Lw=4hWQlp!acLDBn`W-K&oekxr)Y> zt!wsRtZknugguYdem_Vw8w%j!Y{cG-5Sunp=)=2z9T>`_CJgE^4vnxP994R}Vi5)( zte7c=Kuxnl=9-rxoC~f`WUU`Pr9964Hyud7ixuco+{VyC_gROE+3Km+ASI*vR^HZj%GitC;rOn;J+QM~(1I2GMD3qM!O`w?^Cm&#>KRpn;*teZgxz=40#Pp)`2Y zOu8)mbpjn~1N_|>ZKq2s#)D2cf-Z6h5L3*et;FrOhx=O!9Yex_qh@2T^g8h?0r^vt z%*1ipcgGCV?Hkr%d;$gy8FljNm-}M5l`m$>Js^!Tjl3NCVoI0xxp)L4iyQbcgL@LZ zGXn^tF-2~oR^jV4@~S1B%ZB+#TLVpx9y`p|hp=B`7lUv|n4k z)Y*-86$;1D1+?VfFqxWvotBx;a4O?dNHllQ8kdW7zRv%p5fS)n82zwzMNR z7qVj8r09_9k1hGLuco&X$pp$Q~hk9V_4a z`TSnL|N1BAoaed6bzSdOXjdW4+VnayqaoH-%=m{F7Rg5XPc(RorfJoyS>DP=+DDjz zbV#nn8;WU|OK5A()OV#S8$ZCeUH@nIn%2clK0%EN9M~4+8lOd*($@W0we{kjQFY5G zj#`;yfk`5nPr@?C%Lleh2Y(yn)hc|WotJwLj4_{9+;FxkpqUD!wSldUwHfF?123^u zH^;MA&bc|1snD-{q@vrR|5@e=%Ed6CPnnZOf5KZDvYX-iBr9$Hru9-CA+Y7deaJV5 zV0}8=8QaI2aNaO2;u6%*k!9)j>Cs~@Ie1$JsyX@NBPC#J5)25?6Qo45sXIoxIF3%g zvD@hfxtEFJZcVbjU9dTsP}~}!cVa#CfZcCS3baq8-TB4P=7lO3_y}4|) zbqI?%3UWLo%R^E&>IKslz3RCS z49YbVY4$;(|1@zA0a5w_VMx1fTA`UWEZe;(EPEap&x-}$5Bhtbe3GD{UW@=ByQUr( zeD#Oe?<%gUnatNeC)k}Q@SjgJ`s<7ztmj<-Aj8d7v4kiX8YB7lmX;G4F0{?pY&kq7 zvgFOwyGGBnK|<(A1f%FH<9^oSbKqj*{9ofyops7|wQ`QULvWO$W5N*^@`jLhFs)dX zSu`L=D41r=*t=!v`cL7sXg0|GbiE|T;q3H$cl~VAONn%k?yj?&X#yT0`bNBjE%=y? zw;hZCf88gS>4Qh2rN4OOSZf`-`)OMB;kY8YSHSK4vUuftlF)D5y2#yfpsoOEY)SYB$D9ShRIiF;~w zx()&4b=Y`vErzd+KZQ-paMyg2mG#jo$jwveR&M_KXlkm>8E0w9`WY~zn_55)$Ln`d zUWdJ3u4}Lx0rP%J|4pAW$Dzc5+dcrZ*h7?VA?HcGr*D#t;}@;DyjLwAlhL<~sf7K?vP-=Gd_Iv|+um ztHh7k8utehEqvF>h5XK3Id0(6iFR<|PAb&aHv?A99QIknm@b&ZG%$hmyiMFEK-*cR z_UC++{c*enNftagWd)vV3*xcF>xM3)b-%^QvuoR&0<;1^Vq2kIeArO9SH?+~%gCZuZ*h)%hNeSka|v zoIM^m)EvwY+6#(|$?nu~v(7?#^4mKo0xe2oEqSn zqCe1*j)7HlOQH;%fsa#h={a#j`zElCZpqJ~U8j+wkjj6L8OyV5Q z2e6c&8kif(ewtr0dTezk3LcKC0-A<5w=U*;b$$+k7`SlFf!CWte3!SNYa0f={YKXJ zwjZK|bMgKK#ol45FNT+N7*A*Au&>d*rHOk%niNj6!!B22wSwgH8cxhT@M8BE}95rvM7 z>ZsZ@)k(a2-oKh4el?OnN z2j+LdD=dC7X+a*0OEh*Xjz1 zF9LXziRx4Q`wxUYiz3TO*TnT}jRNjpe#IuFfX&lB80$1Vbk6gmZ0@Vre%m5`TYbtVB>++|B%w_) zN)V=k@r$oeip7@S=c6F_ZamU5#k6_z57xSDulU=7T&Y719Ph@$Ey0QBDmd@b)het^ z!B3@7ei7Z@_k_V8=IXd+_EKoeU9$Ykam3c?iNorLGWUO4%_^!S^gu?TBn_(?? zWTcb%NaajpmMR|cN?jixj4(5K0r~a@C|0zJQyy;2Q}CE%0H)*&#s|7pVhl5SfwGht z9WY0y2CF5I0qnY+;;H7ZDVh%kw1ZcHH4z-qReK0;om~<3U#KssnhZgsZUafODo7KN zz7!h*9y;o;ki!m1SRjbcf)Z;4fS-R^Ntxm48WtQr2_`hog^Wnbq*r3e)CrjSd7hY{hnna(H(jy8Pyn~@2> zAyUOiuQp85Cv`vM#DJvv5X_vZ2X9XIew)G-_yZ}>)=fDAhNu_ z2*h10CizJ%%foWiuMEIf=2k!<*P>TzL3Bo9WDEE%D<6(PwCLqrCSg^@n^A0S7e|sh zcMg1d-%EbI=i8G5m9>MM$rO>|Ao+ERfy|vKv|xpz9!8c#@Czva z`vnvuq#^X-;BQ<0f`*7ng{o2$&45znI7}5xlfiVn4tyh$B5*K>kWELEdRi)XqIMhS zcmro911%a|Ga+h6mbZc#&eAQA(PcyO{T?0187EmFwWY6v)>RBe(1Z%-Kjtw|S3$Lw z%HTB^8lx89M@RuoRDplT5f^_EP4gKuPcIvJa{wbAZoyFZz2ss0rfJ)dgG5ITQNhDeW)On4xkXx?z@fN`gdS8NQ;k$b{oY6sx;KUh{qjGQu z3D{^P9m=rL1Ve|m|Kon%Tfha!p7F$& zI@E9Tzc`xQbgw{vphb`g9Qd7j) z-N90)Aa>{3$FIfYV8==bC8$t#9RhLTy6aSe90PEpeLOA-3MB5xJ?A}4AYv|_a(?rv z1oQB)rv_r_P{z?M;tc))q}U=|P-s;Ds&eJ34Ecpq52QLQpQ&kICO!!e=h5xmw_tedy%#m3D-Qb%L>pp&Xv6eEMRsH?E zOkcXqQkgbkp(718Ddl$-+ZRMCJa`9>A_GtbRFb(XT#zBGqF5ga!uTALA#zY%FSSd5 zIKM+(z+E`H^Is?~Sl1--L75JjZY{&B_h&DjxBa_x@dgk{Hh2qWOjL)n%&!S?zIfXK z@rE!Y=O|rywCCw`8!K`CH1H~W7O41s5GXBeYW>~-%<93rRQwDFZ4KSefc%y3=|7Gc zVKD7)t-2Iphk4jS*6SkxjHc61H#h~!t>sJQuQmbGX54bGtLZPOUPPggrE3{Fj}COD zIZh+b!au%Q%ydYQ5CYPqOLQE2dNi4y7A>t_;*)_qFnB@P!A=M41Y$Qlv$DFDQvS$~!S9HwDtY+l9*OeI{){PhN+-Y<8vjbzSoNwAJw9WdP40|m#6 zEGzi+{J0^XdF#(uS_wh$tQ3^cz-6{x1swbl3WfiUf^bk=nj=INpeB}H%2Rt0@kWdJ znVOCMR`q0acqPbdvMM-~EmTgsdwo<+OxgV2q-{{UJLk&~@0ZASFFWNw=BG@uZT-+~ zksSK8e*Dp?=!ZTo3=u}~LI_3S^aTO_z8$b@@`xi~VxhLx0K~$QOA9eCK7;|SYT7?} zjxqqpMibtPY63tIk2j#QQ%TP-DZV82C=RQB_zJXZ*@_Ys5={>c&G&-OUI7-QnBzwS zvfxh;8XR#AvJzaNX##j5&0&XWIW7oR7L#Les^Zwd<1WJvoWk6hA9MaX0M%C}CgDSE z64uo^F<=%N+BhI(YcPpS${jm$a(>ISwC4IBbr77DBKOq@SOWt6m%}NCf#)noF!eU> zirBAT0UY4Dk;_IT`qmS0f&fWK0S1Phi`wDLxa8Ugq#(}IX9wIuZA3pF_UwUrTm*3H zGZMeX-&c|}+D9Yv}ciJ<${q>P4F$Rd4 z%!L1;D#a2o^26$#Kn~#BXk5q8(iWOVNTzl#h*po5&P(nAuI}Ce!@6>!RI9p)fy44~f72!=%BP{CDtnziue_1sHlGBca(88*IQo!~+}zQTvozCcuY3eGDsn zTJ<#wxBK?p?X@z7Td9haKgz@VZ%v=-XR>6+!m?96ZIPfr;h_*)x;rxtG_kioA#9E?44}Gj{i6*G| z5UdvJQRV}rS`Qfs_EP2K{U$+Ct{{UVEkI|L<42Iuch_IU>%`fET_mLV>nP|1s8_N9 z-x!H}XM{4EBRD<)1$@Q68~PGFORf%#_|Gxgw^{j!m#7sFh|p<35^pNlW=6K6&Ay2< zcnT_lpk^5f zLdP5ixr9995kygt3LAjj0w+ISv^AMf*Bt6weqZklUu)<5$H))TEz5B5XI((TOW=K{ zp=eor=)q%9i$O7KIy>7GoovG+;+w0Z*s~qzK+&r;xwd86=HEj0=G@vJM5(&WT4L6- zA|lSXE+=D-4+`Rdql39W8%}@FQWEklS`_<~&A0QnOGNndj^e8i(R6w>M_TYb4=-tg z114|xz|HxXq1D}DP7k&X5HSm4*f>=cDD*Z!JP1c^ggXH#`t=|FGTjm`BacK@>Tx_{ zr{XkdWTcZkOw8S(BwdD)#Cjp3^C__v3X44YEmtdX&K`CAbt;+$-@y*>df!+wkF?Ja zQC7F>aGgU6Gzba%?Bu2eg)X!BD_O2>)PUNLbD1kdDqub-n@jL zP}$|EP&C4OkR29w0a!1nA5o3v@X08!s7TQEfM#JO*4&!%hC>$C2K4eOT%G{KkF*Jp zp7mB>^ocPFFw5YMx$u|C2HR3;Px5k$!ffYBaN+_nqF&_V+n4#P3?p3Ymm z#W_$wKPtFup^}JsP2BZi!|WDq^MS0cCq@Q)VMzg85h`w2?6G8|BQdScz!@rw;AWlo z`sd~7@Ktcf9iaTWe!{nZ1sq69iNh_!uWQIJ2_*LBnyQO3I^SOdwx(*}nzu zPC30tE1tSbmEh&aoyBbf(uaxq5n4G_lu1dw5r;;@iatHYTDI-i-#{gh#r(F6^wLo0lVCV+AecX~w$#OWR>&pTnkDXH=l6Q%LWQyv~2VZjm zA&y#D3hr`=k!{k8qnH)B22pq$aHp>TO8o8V=q_pc3-xrOfYa5h*S#6u@GFo*LX^%C zJ0;H188y_+l5R#abesM-xGJ=Y26_Svt_!U#v!GCrin-(-Py46Oh>`l{6-an5LsUzM>b0R{nV|P4GC(q z!I?Mx5E4%t@e^zsIL0b&0dDaIb=eiRIOu&*I(VNrgkN~h^@fs`nAHy=Obm5k1@T}R z2ns2dJmcgkRm2O1l;Y~~s1dTynKf}a{^tGPCHLp^KVx-LPe!psOK!^t4S_+^bpHqZ zI&qdUWJatgq29&bmwmd^A7zgI^FbmaF#?Gw5CmrcYVxYA?H65?Zxt6Gs;7Aim9_au z$rB&Yfgf+j&tl9mAUqxoJ`%mY+OZ5uppBv(nL3k0L9T9ESn6LAnTVT?x zp}^i@T4ydR%4^=TE+tdCNQR_G;ifZyzTz&3}6=bGr(NfB&v8O8n0E zyfhsVTuDDPB}a(L@KjVov|m*NOm?L&efruP*tt*+!Lppl_leMquB`zlzdEY&Yp8)K zE*!jIay0y9<_TiKrR!!+arGBvr08(Gq(%^|7%rZ_8utCgLfNiraU9TGydRfT92o$s z&i17Q;}TQ)%fovzY|8VrPTq^ZCFej>;wG@8D_uq67)Fl~IX{LBx~ntDrsgOJzfmFp+dURfe6m z>Vd!!r=lF^yNE>{(zj0DcFGMCv)(;^Z6oE8hb1kq50Ote2u&qm>{)^(J)@RBz+g7d zX!BimB=A%(x19b8xOT~}UfGS}btxlSqF=y02s@}(N_oov-wS{r@GkbLr{0nUqY;`^W;bnk&=`EBNv9T2{EG%K48%k%?W8k$x>5>`++3skl~2xXMuHsBc(3>L7p2Ri8V z7t+U)MI|Qh?jhriY5@;mYLaXXPlKu2Bz&7VQ6|!3FQy|5^ma%S@&b2a;g=^k_LE(9 zH}0ReN{-|U`y7s@Sd7OG4$%%lsr#*bx`xs_WS@!f?m9`T-?)*8fN}QCdOs(HwQ#~?+90XY~7@2PRUq1i?%2J^T zJh^|g_cn9UQlZ*eeKYaV23|qXEoC(zGnMd;*cQsc>Vr?;ya7=*P6+?<-^cdvJ--%G zv zQC$jF6((jtVq)}h8TA`PioPvJCqmR)LygA6`K9CjR$U`%k`|~pd(MB3Dh<%IS;8tY zqwD4U{HLH)Q?0Vs2h`x%pluyEO}M28X>Q*^l~v(!#vq9DNE#L!2qP2(S@7zZH7v?B zza;a#1p2&we9#sT|H+82B5-Ta3?uns3TkA8Zo1<#Osu$HfH1loe(JgK>*E+MZqq)5UHb}`+3VsKO& z2oOX1C$e0&OX3eG1bj2Z5Zl4FTu57w{6nDd^Z79qS=m-+HK3(vd7|PYPZ8k%_n@WQ$mQ?P znw3@=&lN?LUAYG-P&gwkm=~y?F^PpP--RhfgK#VvXYIF zyMKlwHUTX=ES`bPJuDRm$R_f@_(coRuK!N@weYU2a0&NOVMkGd6J?-)aG)X_;!mzD zs(cr$?@BHD0!Fe$+X`cBlVBjIvL1>hiQlC_Tjo1fUp^U+c0mLBH64|1`8F-^>N%iS z@5MTPv^+*f$ykhL&!ejGK9|vL5a=G*(#YXm;=tb#fnws_EL@G{#n5MZkI@N~b*@mU zsIVtEaYzdYtMdQir7s=3v+#6ZBGvGgyK`a!t3F#ywspbH9suB3DdsmQ34hT{Fp~$v zp%!#dWeYf5B(ffTS26}wu??g#97iVK%bUc2@*5oM0Y?Xipbff%`wnmRbj4_~w%WN10KwF6Bwji97hx=rmdJ#b=qlh=pnk8JzEu!290i zDKbGH#uN=|98NYYo_j1`3d+~Jo614ieZ*8e2%!oFJp5nYuj}c+LLLPL;ne%V{D$Aj zSa6nE9!H_)&CHX*9_>k_V>&VAT_!I>r3~d40p!Bd9-pK<&Ax0!>KT{tX%>WWjmOs^EF6V z=3yj}u;L|sHCQUAT8DZXwV)%q&C7}6oMH~@&8$~|(daCIIX;pJoKemh29y5~%q8(o zKjjgiSft~SI4b20!V1qyFrQAuzoKopU1OAO$bu@5!FFPv_(if`;&f)MWX{+r>AYJ3 z{;=e-=hcmA-Q5C&^bR?mZ#wNj4jPj4zdvovWCq-+Q|U^U>Oyy7%xNs3;Ior`TdIZS(~A@RY~1n~0@+VEMsc2P|$fLA<$qxm6+^m`;MD zcoK~j8zKE6V>&VsF%mochXX(v*nxl@VtbzsTRqo;PDtm8G{ zfTS?grlq_5!t|-_5ZM8r^76k z?Iv=!T{_F=1u{4UV&omYTs~MYbic!+|K5ya!Z~;W89tD_1omL`Q?GF|q6Ox3iHKo; z^F)>z`^0^)0op2`CgF*OF0Zjtk;byZL z!08cY0Q;@i_+RzyCEpLguP3$Lx?fJE-C(&rS@y=vUTy#cy;wrS!g(2OJaZL$WDO{S7#kgGyZ|a@X*DDH#19()Jh_8rzYVIVyDADW3Df zackJD2jvR&JbyA(b0;S0ZG_@x1(FtefoRp3%_~?9Duy1{E>a#2`)d?U$BLhlx>3X^YR#%2M|~14-*J zO4;;GVU~K3jL-qIe7=b+i%#g@- zp#7xm+fxnmUdK|m08LawaFO;R87a$aS0D(UwLj45CQQ+_k-5FDyM7MFcxAo}uOaK2>myLIAj!lwV@2T;aZxGWg}5=K{v4fH>F67A$7~_Q$y$DLGZeqU z(}(6Vw(6;F6$a2d%Tk&P1l*`;T(#}^?$=?Qimgceq5^mkE_#KJ6NBg!{JSiE<5v0# z{Ac#_-sHU4(_)Uc6zulLUYRwvqoHqGow~Aoh2Co0x#mu~h5~E%#0HxNj@pr|r$VB{ zuDw~obysAU9*{hsl7iJn#q|9H zb8lHHGd0A13)`sq+PUU+#l|@fKTb}$`JMGrP_$nzzRs4X4xlWtU+>wvN_>j_T4sOF zb>3;eJqqDb6Pgu;Oyn$fARz^))NL0BnM`qJe7|N6v4#EP+wGG(?m+6&^>VvT-nI+8NK2JyNrA{<_4fiM2Yg?>udo!Lc5 zl+p?^D;lM<59Jk1q=I*WAS@w6n{3@ z&VhB1V?{@_W5GUGxuM!->TshDsy0DG7q-O<%=bXFp;5bd!4GnR8O4b7E1ZTNd%q4{ z9VgOH>%70fGp*?(%cg4WIAZz@G~+d$Oh&e89UZz=oNHCY0)_BT9rb0PmaUUv3gzMP(Kn37hb ziGMaTuN_9P7Wn40K$k8U)Ccy>Z%l5dk0f{KqGi>I+4~l$FAl7F<%F$uE!nReKzEwR zbO>-bjxSH8B!8Z!i|9=Mh^Oo$X|}@2MdbCGZNW&(S=y{OzTLY7BS*e$IJF*M$#*Xm zEhv;;;&x*sI~&kQ^gh=sjxKe-X-V>xtt`>J#>6p^J(zlb31@Xs|CrHx_ytOwT7Plg zM~4BhlStydrQQF_SZKO#p<1szy0JF_(QuXYJ<-A zfg4K;#ujW88Z7aT!v6&&{^93pZnmWRhwV&`Ya|&M+vJXvRPOK=VMv2$gfNX z(=ytcQLPq<8V-9bB%(%@gt-~{QPDh230G3*FZrbPB;M2pC;F(5XLR3eS0o?un$#ni zqQOCBGO)*T&RF}9gIapH1z}E@5}6K@#E?m*rJK2{dK%vHh8ZoKfRP36A;asd@ky)= zOCFK;jn!sADRlP|0P~^^k9wu$?0HelCbcIE4L8nw<|GW(dajexviFr|ANtqwx*9jd z`WcU8D)yOJNI7LPpoP#yzER>&B z<2K$#iXr&80_G;(*||uf5v6FC&Ei*^FcoPBX6H4r8e}|+65o^MqLNuws5V~|pon%B z*~C}ZG|1dUtW|RBWdQIk5qtP^k~Jiy`x}WA&aY2ByxpJWBDGnWrZK|w{n>QB95gPxjS!q$|>YX$V6Mn4c-RqpfBA+RX;ICn|e}T;3ALc_B zot`uUJ^?jyCVCAy)gm*Lb1W2dING(8r+;6?eapwBL%6(+yzuI@L?=}Hq6hO=3i9L6 zqEG#eTK)KW_9};si=cg_$`~b8rLnf|YoaOD^0<815r#4QS?$HV z;PkDAyZm%(Zm=vP?}N0}%4uYO+$lEKFM=%t+$fPKdm!Xy?UO??u;;X^P03$@e&;)& znn}vj{uX!Rm5oA%hk53RWZJuWApZ-7-xqz1u<<^&t5j(BXY0aYG?}`*Q3)&(0N9i2 zdn@w!4LH4e(&d5zPZC1l75vAFfg{>l>Fv(Ad*WzS3xT~;z@7JckibU5X^G&1( z&XDND=;M*cz0L!IiE3w<*zO^URV0VQq6Jk|6bOZ$ddX?4KMR@d4B@wo*@>nTQ;(0E z*q)I79=Ra;M(e>&jkNg~HzoO7)1u92hj@R6T zTl`hx=Q=ClFy0baZ)R`%3z8WS7~+?t^+ET7Bei6DoTGXo+(Aod{jdIF{Q3{8ryEJ6 z6^`~<>ruNyVCk^}(EIl2kC@~KRIup9B^!R>J>V;%;AMTvl=kGL@+$XS^=#mGd){bl zI43Nl3)wN;jKp=*`%R@@ZbtfeF#zu)Ug{omGBv#xALb*tZ0ATvN#)^{u)oVYiLR#P zauH5^V$0uN8Zi2hcV;I6-Cs|#nG)4uuBtp7FPAWWAC1=P6yr}=Fw7Gflq&=YQ|t47 z!imIhb7gVcni9$VO+(Lry~^(MD3v?Fu=R+Uw+{Ocwj4wH-x|hSKaLFEHk7sJC2s@a zu7riuSzVSeP8++=U2ppohV)-b8x8Z)EHtGD%KkEswNUrurM<%)}8vB4yDOS54gCGUS6AD-@#@ykoPgVp0PvW zRRBwc*+i+s2@bmtMtcTHYtEyT z^Qc8ej}4$=O%{F-uDho{=l<`X;x^pLlw%h+Pou4dlAh^{O|Ns(QQ*Wr@Y1bo6^U>-XgM}LFsc!=IUHd^b!IJI@9EC* z1);UcqwcP#kKQIsA?&z)IX*c&6C-A~*4wkap**yycX}y^I=y6pRcR+D$kMrdCV!{e zep&E@<~QfDjSKtLY}`{fJ@X`&7*z!rdlYg^&t2u)8^1qdN(>ipXqwZ79i8h`n2-Ow z2YsHxi0^rgnx^A5xp26# zO!yzW>~nqv?YrZ%iuqsI?Pact$r!@svlegu_BJ&}A)B0%{9RlyFyvMjKFh`5+8DH3Sx zE%TI+{kkXABy}VWkgfO&)PV*w-}@}@+Z-J;w*G7t^852JMbfPPd=^d|PbY7bD>I+qT(>J6lxNtBg;7^f({r8`pd zz}iv6oFS232D5HrhHmuhsthtPCSB&jGFqSG7+123hKMD)ruqRzVt&6`eUjfr46!vHk)#L`zre z9Sr5m_Nb0Hac30ZY!VUIr#-I`<+6GGmc@s#Iq@G73`2x4*k3kRg8*kI@*EKBLZb5m z=%~YlLl$>xtsfLV=PDjXzK~O;M7{=IIK}={_M+rU`R1_5zif7i_$DM8WX0|La>*tA zSd{ln8@dlVf>|G^2OrGZF28>mIrVA*j614QZ}hzP_Tj&xCA_2xpD{Ij09=-O<{&>z zLiu7{V{(7}HMHcs^2rFaB3v(MSgXb~c4<KzF(JQ!Sy}pQ*Pt1NJ)8E{TU&Y3f z8I7el*r&9*T1e^vIsE4m!6D_hC;5QIsGE~l)X_|^G|{1e<)k?FOqqj?n)Qjli`#7L z&tXzR7nFE1m%y$yChiD?aKFVhea^S*@#lgIBcub6!PkEq{$h_t7OK+x9Y_)1_VRyv zjifVsCX91!1%fT!Fc1jS=nUU}i%Wnt&1)n73~CU0ISz#kXyo9PSGAY3rocXqIBVeu z?E=@|5g^r$;9>o$ zheCGTQyc%eypFr@7uI~Icy=T&X|wY)dQ=-?odVKr#%nq2sr3HM0eFk=V7DjFOTZ;s z&mB!9FwL1eU4}UnipJ4GF+6hc?#mY0AE4<6dT(gwocYbTQv<5)2KZ5$G77D zV%jn@V1`uP(B=kjA<2T_46+Qgsw~%MF)DIh%3-|m)2Y!bU8TA*7>=?GdPSO1dcyZy zmcLP2kliv4k}v=LP73p}0FDPw`4g5&l_YrGuLFvYO9Qd$!>!?#S>I;jFJn^g+r;}u z92^$G1(*cMH1;8Rsz_sulpMtlv-6x5$P_c4xt4kK1Rl_NKeW_-Vzx+!->3$w<$M0R z-jE)(QE;9&2MnIrosiJcY^|GkP$NYAOw^@Cah6>2ag$Lzn&ygG<)e67C*Un{Zh#&6UDD37!O+;e?K>^12~e>;O+N{ffmSFr->+Vsx&16l*^frwdk}+&`zdU z_ORI?Qdc=AVl=t9aC-}xU;wj@MVnUmI9nW|NHaCzvpJ+EC5A=*lql#V$9E(1%^yKs zF4@=>cC%-U=&dYVT9!ERjo{Ozx|h9VBb@AvF57l?}jT%@$}Hj4=Lcfq+!>v<2fn2 z&bF}=jyKgD2F(JKA%!???z^gI{-Gu`@e&yGAd~~Ol1II_a@oV9jVgVy57QCv+{e@1jTE)brpz)5p_t%a!treegSBBW>b+;o4xFbo zAnUtGdX|}ZVVq8p#C4JHU~z3Afe-U-3sf&p-3O;=j!? zF^UYDK}8vUqJtHg%A-P2AB;LB_u7uQUP%d~h<<^L@w4J&ZNM(cG3$JqsH9;%0Qip4 zWl7KI6DiO0Zto@kF}J$Z^g6C>@WC(9TNv;03?LFd&%4TWBa&2IzuvL9O@8gzjnkH# zXcZ}d$joNk2fR(9Dh@@h21bIa-u(>E@xRLzRCZl`m}18{6*^D-MF-~P$tf@vBGnCR z(}yLd>yEI{&7KjxH09t>Mg3}Y<6>oS*W8Y@!0p-&U>*xj#egij83o*0aLPZPqW=K73CQa|dq+{2SkyviMQ zLRM&D>avOBOUOZv>s9)p>;*#xfwxzSg`&b1y`gW@Cj5ax+0)QFg^t$e z>pcxRO8J^FZL~z|@?`dZwP6Xs23x5NaHcl!k_BwKs3f0P%H%p$M9BvA+ji}7RDb(? z4+suXl&mXj@(-d)vD__xg`E(8N_xh~9;2#=+J;bw73S;{@9ASbSgX9{+22``Pr)?i z5**v$%#i&1DKt@v3h@qL$V;FMO7XHoIT0f~fLGnskEBLwKN$QM74U_~c#eISieckP z&V0&J9aZm|EDDg2sUOX-Kq(#}@Uz^*loC_Qr-Om!i5cgF zYdkuA@}QGS<<4Oj9^a%8om3+R4Ee)r%D^b<>tco!TnC_3OYZs1Ae&Ykfb2y80L zDJou~B4=D=3gg?_Fq_~#{X467@WGs)+Lc^MmbjDv9Zvs|C=IF7rHo0Y#x?|*%4(0j zKKV1g5rW4{#6$l}`oA}UAn5ITUQyL32v}JaEkN=Rvs*qF!w^&`q}8i)wAyV%D&&xi zLqF5_@8(KPq8B(6X1?VyrO0IbT?uE$_(t>?Fj>fW{{Zv4nkUq*d}^o%KHIkTBUvmh z<fd4J8Pt~_@gxgZcZl16f)P1D8d4vfzer5)eS zN)qyOMDISOd^C(+N2M)$=ME;uqq`Yj3#eoPiGuW%Qndv3aK5<`F(x~lGg`vha5%Cc zB$|pypWjmRCindM>1fjz*Noq}V^YTzo0++pd3)RCO)d_a?@C!QM2I{1c0uWXOkD{G zI`vm-Nf~-ouQ1^L^$5oc{>_z%q^hWr%X=(OcR<1t5y)Rn<@Z?X82j>Ke+^%onIt%s zcxfY%n{yUn7XRUGT1Ouxk&0|u9!sww%3%)$4CL=?bp~6kLlN?u*IgEGCUXSZbQsXk zEI0~wQ&L|cR2T-VkY(N0>5mosWZdVQlZ7@{j0WTSKz8pE&PK|!T@eamBo}&R;M%92 z2+6s(Q+bN94NgB;A0G8H&z@D>9Lb_ts202cDW)6t#7EU%0X*a@p7NQS90N)--~6-s zChj!k?PE8049AP;s%5{GC^ifq0S*B}&RwuPUc}MqtfBVHqJrSUd1$kerJp*_{a%|G zV$k1zzB4^CqIkMxcC`_Kc2NOH(PZrZG*jmU`e;c5z!`I$qyDudPZoe9*S-0GHfHr@ zw^7gP()pt!2{54Be7-k7J0d)FSHLIRLjkhF%xAj$&(E2O0i%Uc)`y`|{1o4R&}3;2 zh~~OJybCZn`LZ;>q#DTgb8o-(Sd+3#VD5b|%1@y2 z3AYHiVByM|soq02Ym9C$nMJ32XNDfaf?dApKTc}lcw841H3 z%1&xE?i$6fB^eDJ%1`>hHjEIk>7Cqx{gP;hp@Lrmf|FFpIk0)Xt7y;p)FL4BL(2== z%`(@HP}^MKq@{8E%uDn+Oqv8k3&deKyq^A02t)`Gkk1U_`rJdPlRIwz94Igh`REHT z`G2%AX~)A3PS>yefLBfV`AHoGN}K*abPly0Cw_~~-FncqToA*HOUkBs!nC%g`4Bjm zk|xpHi|k$rOJ@hU!-WU(yyR4cle=$K7-vB}43a z>`&suK$+{57vIZ^5yc#&v=1C7aUVa~nX9Eh{h^8?*(LsG<2=ADn{0o?vcevBs}B61 ze!qCbwC>ELog@pG67yT>?0j?}YorwAY23zZzl3G6;v}}2%uiiK7d|f_F#?c6yOwxi zC*poKbTjWyYa%Ywl?xxr(!q0lGW;1-4b|sS&t#Y3L@f%ql=T5X^W^&&2(2*F9vqPB zk_KmV$m8*>-3}RYMP=V#HGl5 zkl-Dh%78FpQ%zk8_i}YaeKIF|pdzwimQy`Yo!NT^Z1I~hedik8FumVre93}G%I@I+ zAFO7w-KONf?vSJW1bY6mGO#k`C{@#X?JK3O0 zidI{f5`}S5elU&9^+Bi+ziOdGdNwjlY8qeVLgfbhAErcl4B)VE=3j2R>gZU})X^6O zSsiHeysc~3QV6EJ5^u}FCZzjYvH;X0Sl5kXu9n+r2^KZgnunta`%`1@6}o{EYE$AW za+oi@Xd#u|83@eeyyKG1(cfovWD1K^K7{+F7Bg$#RSSV0+CTU_$j%M$o&xs;*1IA( z40@6cz^h-jYoqqJzyDYt10HZ)3Vg5n%pJ(}qz1AtYBqnBr-=mvn#{z|Ct&H~@)3u1 z#zvxE9@{VwI5T{WIG>Q=-O+b*t6?|Djc0(4MZFb9FDRnr1Bfz-*^qxA;Y#17>) z&KxY@@!oqqqAf)khNiTNjZeK6kO|V9yJV&LnZ$;a>hy@lI3D6eWghOB+GpCy12cv} zrlp7u{A50`zZZSmt#dH-9J2rogpB#`A&u-dTi%qSEbK@vNLU%@IlrcJxDIDhBMv;f zfIY)-N)yGGrI$9W)i$>>=>FH=!9F+uMc^IWTtZs$v8le+UjIVFJeZ-G=Qn=$d2zmP zy&4NZBW6BP5-98s&`TE-5Y-+BbmI7DOZh!_KH6Wdi}=)s-vQPWhZWyGmm(Wc@GUdo zZi}JLdsMlqCfO1A6sZ1zCJ>_*1`yds9n7)L0j8kUQ!sQ|DlvDqlm>(Y?azKM{n=X^Aytg}nO5OC&Y0KaQQt%27m%(TQ4%{SsZ2I1>l0FI|BL@CO79A0I z_=Lq~qKp3CT3hn3hvhdp)u{4nX$d+_6c3Xd!zQH>=e!NQpOyb`g{@-*^Wkrp=~gE; zV!QEmnP*+&tGT^)mR?t00%Fp;;7oUSRR8oyy-EjzzLUl=Ok1oxjTfDyYXLBg=w^o~ zWvFFCq#<)cvH#KZ-QiUK@Bf@mIY?G030Wa~lf8F#Rz@TvGLn&X%-8M>{kR_kH+j8Bu&M~H{42ebHkD>sttRzv z5u-4NVKlDK9b|YmutZgQ~w@Bpmn8K;@kK5(0kHr8sVlhC9B zKJuSP)Ahpau`a2^u_t(q7{#-?w!2^S^Fc6ICv69uFSo3y;B#XT~( zKW--^ujd33F8-{pg@6yQvSOHSkLp&(oe}sy@G<=Jr*P)i8Kif0OUw;ziFr?%Ma7x>HII3D#g^ljY`}lvXiIXWO`w^z;8VsUoo)q>l^it2a3!Xz$V)!|U^btjawhgScv!})hE=0& z-m>X2TX^IQLb%TA_@t=>L-B-;d$N3!aPvr4FdtoQY7rxC$#@a*mZihM{wpCz<3eu! zc|{g!MRAj&7hUS}@xSUEw5IFDyQ*VI-KJbRuQQSdxP7ZRB*P^wz{Bkhx|aG!PXK&Q zylM3J%0^szRH_=S&d9C-7N~isdoxcVU}v!0ytymky&^!<&QBmMKt5^i1|N~CorYdj zI3!U}a8`CP#HUI#ZY`;clRBxBJSigZ)SotCPrK0jSs+kw_d20pdiT(E!GbeWnr$E* z90~H@jp{;exDMtWlHiis;@}RiD^OCm51Ouw1nb~r?_TAo zG0#*NcwI2%GY!U?HrAeRW{fy06tqXjh$@dz&F%;Xl=Qq4de5B=kEK-#h+{_ z8vHEf@JgJ_9ZWaUkLhB+E5A6L`g=LcPH0+8xN5R?)s$Lv(HRt$LbjJEt9kGGZ;B3V zq_$i&YAU_3^SW2Y_9BO!s{r`x)IV*8R_o+2r97^B&24b-0x2s8?$qmwz**`Su}SJ&`0JYQr$Kaa}CK3BiJ>JUaJb9}O@c@xR!T@g39&6JE2I0DH~%j>jB zwdIO#H_GUN49dA8UlL^z9e5Q*oxc()(EaDGLvvDl<&7UUzC9p!Sv*c{j~4!!A{uke z?Uh397d<+ zI9!~pui zltK2`*$dE!y!hs?}C#nWFP9@u6TT`XtvAKM`YK;SDy)xoFFd`DKWO_SFU<=o&n{UI{ z)$X+D^JV*~^>b};e{t}ui}iD2NCohVX88q4NwC%=BGByo*kQ*8-0xlc_GG(5nW+*!p zUX$8T1ZNwH%zFW&)NvyPCIc^d3p;!hiXg6(jcA?!)wu)OvNW>Lt@bOK@@grsHH0UX zpoHs3!(p^A9R!_l@1N9v3>&=nj}^NZ`N3!4gQoQBWI8OI^!H>ec$=R3QzFaA(h zpnq;$i62+I1&GFTj^z#0K$5^Dg?7qOJQ2;v0E^3nwz(;Gw(TD8ijsQShXkq{OJe0r zjCVe4`tU3nll^}FLcGfMBFDw=J#WoQgT}WNL>qkaEoQ|jmucsQ)IXF@797gB z$0L@i-E;aUrhgUS`jeXh8Y>ZH9Yq;9`tf7}*+a8Q?W2m8Ota$-V%FOkawA&j=swpk_NT;ni(rVTt;X(? z1YV|HZ`G<%Beb*&5djAq-b9D6i1{Buds@HpzQgYy%Z7{M*63zK)MC_cg#ZVd5J?g& z4T6BjCIwdh0tO=8AsJGYX|3 zp8NR&5w8eNC%>W^w5-|k1Ah%UY#fm8_u!4jzEynO^k>-EIm)5=s)sufZqi{BQ~LXs z=nYV1p{vu7Hygri@!b+6tU)*Y`Z<~ z9JRFw!3PrU5=QIuVWQe$fU!uXd(MTos^-?ugl>fLP!PJR8Hot2ZDUZKcaIcrAS_O)v0RL({T2FezZ1Zs^3;XuJ#Jw-{L!EV< zXBBnL9?G_Rz;T85^^e5q{(RZ5`HZTDBTWHq+bqQHjp{wMEJ5oX}N>!wEkf09Ye|6sF ztVNfITV3J3AAEFpV_`tKG3d()yylI+#KCUIJXTo`L7V1*OUy}`R;u%;=jxUair%l_ zU4_~c?~-1*y621RZ8iAWIvd6+)PQ*e`IxC=C^@fSedC8uKNqT~hAYvQ$ z;UjpAgt*5QTFo!G!|~easTtLM#WBaytlAFZxVLC%k<>xqnyt?wz=i$$1R!!EaCM9& z{DJvtTR#%$ApGu)VZGR$2SN18mjym-j8_?tG)V&Qo5d8Kg91~)cM^hgrbfyqdcO^{ zu(4k@t-`Iu2NMbeM&;?F(F2tm{gG#MQq}u~*#J9H;5xt15OS%qrd~3L;&rR-_CQhM zs8{cA#mmK8q#*3fQtX%c%fUgqK+m|$62G3w88j`EB}kKBl2e# z@E50kQCHhC%r>#?yhhJ^+wUVF5KoEN;vJ?)5`ss*E>b+=$n(htW#$dUGjcsc`pF@H zRP$cv2a}*LsM6M#S51Aj$bzb8k`B3EA`hpQ)1XglBy7A%W->CnWNvyvQdVXZnuH|v zOAwv$`YMkU!#?RgmPfa&m2UqP(KVr-ldZa0#yXtVAoVRrSx}JZ}@DlK)Ro@3RU+^ej2O-AsUxYq@UB8 z`);AUm;-VoSX6_hj)(4VQ7@XKrPPza-oc1|$)r#y`ynr<&i9wUA10XU8b?35h1dhC zS1UAZm{K)`k+y`#u^b3sc@ea{TrIUP@`>e>$pnTL4GID-pWT8(y&eMrY^;hd_lpFE zTth>L(wc}bGE0=$KoWXV?nU!psbKo!p{_ked=dC(3%FGz%IC77J^_<}3=)*6h26+Y z+(9jWL}kuKSa;q?SyU3=2_H(@$5&ujaF=rSXdea|MDmx52sC0WiyJF%1Sr1#>;BIn z!SYT1acT%kM-Lk-KxHf3#Tl|Fw?jkd{>?ojmt-aqr}Zzu7EiahRXjKEF)q=NChgi2t=^-4Hwco%6CR zU(AqgLeaSsL9g0wr$vAevz1PDAw4ki?G4J;II0{a)BtL37*8qCk({fzeVQ%oW*c=S zB7~jFmxDS0IoMCS6b;-N8UQwDj5Lc@-m2|?Pj){@SHAcUtgVh;5t8ux4YNW9e_ zq3%YW8eVVKdAGL8ZiVr%ridxt4x0^Nom6Glz{=Cn_m|0Lj9oSA-)8Bj`{Dh1$>9N!x}-h6Y)A&F%Q zV5ucHmZq(-!x_v4jnfZoQ^Ba}a@`HNP*3*6(0~rQO;8;_(U742h~zEIe4D?<=X71y zACpjkBz_*9Q(`4V93)Eya0h`fZ(}77L#Wem^%aiTFcr8N{-T2c6@D{dM#!=aO?66w11Tn6d$_q~jLUbrYM(+J zJh#o{MYjUWxZ*VwJm4p62iXYNDjEH03=czg;JVBl|6$Zw4_ zFt*FXOiLV*742B2wc0{I;P!ej`&o{zrs(IRijvJiIJK50m9Bk_#Bpc|4DivY5He&0 z1U&|=zI8qIVCI zzKm$7K1*c4b&W|-d$|i;IJ1z)1BUaGZ{kDf=tz$bU_!@W&oCf@Ld&Hta{bXHNgD(A zsen5Xc8}X&61kp7!b@~BPrEUtValbQ>dJJ-p-uHo;aPt$_f&1;VS7|?Nymgl-N#G< zuRL0l)0!+C0OxiDZM;lL%1VgRyVRC`gw#=xk}2`dO|zs$Y2$)uXV-Z_zvF#*g$AZw zdwUB8t#i169F?OD92G67pM-6?QydiP(v7uW*^58Dia3p8A-0T~3Zb|bUQ%eNlPLs# zJ?#_BY zTG;AfBx4CuN&-P1!%d2fH^SrSJTT3*b^u7 zU|!Zz<74|>Wi}yK2oGmhmo~VR4ZXY2*Pp~C(|+<7 zB;tI>@*`qnWB41KhV54$rjvrfM|uR^at*A%7<`MbpVPzRp4;$*3+j8Mt&h_pX~p80oYlzE%sgWm!y{Ev@xsp6hO zdV&m7oTtFZpF4?mFNBzH@xEjyO$?6wnG56K2YqS+j0zYhy1~WdjDX<2kM?Lr++nsff37bz^b9sG4Veh^3yeqcG3py#mgV(pE8sU4qux%H8bFcCldQsT_2mu! z%{1`-x4txTnwn~s4abUTWqNQtb9jt8NzbaV{YXKVtBnE+T9L9~?x-r$xA5U^;d%(Z zQG9AMW4FhZ6IkZ)sXQl!Y5{AFCM`Bo#X>Wi$RN6_Iz?NUbwkV)o#x^*+6XCzTRQ|`~Kx0xO(+F9E>}ysBc=rrt$)6jPl-Z=>W<#W*NaeqnmjYOdSpKbdd%$O$ z>+iX^&drJWBvrf3v#E6YsK(Z}@x0*v5ezwore75bSJBDdYW?F{PITYiaY<69F{YDLsu?+_*N-ZJBz zB;-VP!XRkvx>V?yG4(5bpAE}b^|eDA;Q}3<9l;-^c~tL3+gdkS^`L2NdQ!C4)@@>T z*7Q%VZIvjpUSx?XC}esy}kSxWHW-0T%ic51iB_;4}p@p{gz1s+LE1SRje`vlBLqK(iI3IPRoZ>3Ty z52SY}mPx1CC9o6GSq3q+EbQi9;E~n6=Lr1Wy=o3Yh2#!gjL*ScM`RlKw%)SwU`zi{ zMDwcL*^Z;>wG{^4+N4iI@)#WoW};}p&-+GJ_6%`Cs71}iRvokjqA_%A?~f982TU*4 zZM*bc2Q@9}U0&k5Ha6Zj0QnQdO?dSxwXNIgfv;BEQ>L4gfhh;|4-`R+Kw2WdlXfRV z>AJ~);^NkdS;{gCeb>9@gADyzwdcjrQ(%nL>hqWH2(hxy&PO%BD!E(jcL!Kt??1xKaN8JHJbKD`D4CxX$?-YjX!sKr$7U{yqxG=> za5H-Lo1h#hfOxxjBec&o%`vpjOyQ^(T&Iz+FzDZM5fNVEEV^5o^b z<0ij$Ia=C~AlXy5D8tA~-4b>_72o!0?=kfn5S(f2 zcp#K$I%I_J+T#!JGG7UBoE+`#SqKDc99A8B4}z~8jYqPV&{^Av4LefHGmNDH*73Rp zzR;SHjOOjN>Re*MKbv_Bo0Yx?qmw)?S{-<2l4|WF)N^#YfAF`nFo`_4K9d{_f~Ni_ zJ5GG+?Rsn1xWFZPw6}17iT5;AC{UE+-zYg+_dyN|zmvv^?%!*ng1&!KI=DZ8w}vJ3 z$2(u?1$SPoJsrN}&9{0O!~gwstDbIgCnrYiYq`m2K$1_!UEfG)UyRn+=)VV{pzUWE z`GwNS^o#uXSOw!F&1CQRr?fU{;O;6#-qzcgfV>NvVh!jkT32N>(Ek(yzH-X5o6xqG zu%|9K(5&1=+cRuHLe+WpMUt7%8qRDrdKVn^JaBvD=O-m1+8Fm!3u_yGR3mpb0dBUc zoqRx1xU?kxCkGBQw*&FyLrUx+nI||4wn3!fRaOUOf;t@sX2uN{OOitlyTbAQ>PHi; z>D6j$-gc4I;o&}XHcJg$Qxow$RGB;pBnUF@wx*j&v@meA*L-%JKguWk>oQ5nhL=8p@kr$~v>$d}TN2iu>>@8mwAq<)WCNN$0cJ_@7BxZ@0_ z$e(M3A`K8h!$|OQSQ3t{uCHNUr{ZK>!(ERb8XtEFxSnSC&VBG%Xme1n3gGU?j;BZx z_&!SSE+1HO>^eYV{Q#p7!YxiGjXxWzKKx9p+S+GcN!?@^^_GTo_W&a0Lhe2N_W937 zN9M8-T7KpX0}F_@75z4#qa>v_fv!kYld!SOhFhQHdDIf3NWh77mvuW$5MV*g@#I#Qk&e)DZT zPo<|?atwV)2wcSIL%u)QGf#xV{ZG=Fu9f@wngNRQBCYsD?&ZL+2?YEw z|KH=L#J#mfRibBXAz}P0`94vO$P#A?7w?Umd|!S#%)j>e_eJ{=gKF1+z(rD4c3f5b zRAM#jKn3m2)-MOspFTLWB_-1x!3Q~9C(j$Was+0|27mk(bEpI%V2#gF*BVP7um9VH zyo~wv?)=b6jDF(D*>%FkZ=>Pk+cq*YF!SpSxu0BlW&W`L{ARS?eW#AVki} z*u6|)q*p{|g-Xf9s}gi#Sydvk=suxv1dppzKQQX(?Lmk{o79~tnH+X5HXkU|%04f3 z(^zwZNGr0dnyM-MpNkr2jo#;2!qYUt&pVb#{lJScjQLprH|9FS{Z`G-S7ZnKQxAa{FF4cy5qvw(Jp3e@sg|@9w!~ zR7|Zi%oVTi;e4YwoA~O^6VjjXR>h>aDECRq=0cn4-5uv`7Om)B*!}Y%_vPuBZ4Wzo zwzB_^HfxZ<&i56w%Z?-9h!3VTs^NM)5<+*@Y5zesZ|t<9&1n=QhQ;+fBfP(9#Zf6% zRa(^Yu=QqBtQ|A|QOcsgR>J_dp;`&sn8CYo{j8<3E#@GcrsFB))X2NmY1`Hpi!eE? zYFOev1Gn+N-UpQeFH}ee{vf3oBPF9sR^s+3GIIv{p_td>pr<-K7BlxEZxOR#%V2Oj7hY${zGU!E=GtzE zkz*D2SODE6N!f)XRn<$C_ISn73|jQ4{kHgXu|7`#Y&XF68E@G^P+W51Ls6HxPxVi$ zZ|_w=_3ky91jG=(vi@66JZ{C!f?GD9d)FQA+R42XcF_tx(b~UhbKRLv+=q7a#do{6 zuZw7S_r5<0l3`z`^1n$MC;OF#)|7mh{%}tp9@dg%yyK0UPXLbmASOAJA-{C)^GxL6 z6_72%D}ieGasq;{2i2?Y{}pfEJ044RyJdonjnoX(clG3~>fvi5$$)+3YDSpWh!MeM z7~fCG4G9YxI)=KsKmy!^`m&($o(d1z z^$cyZLQE^zp6Zx0Xbc)>eTlp_DHQxc$Z-;#y*{@KbFd2u1qS2F`)Z6T{QB&3iXqYb zeIks0CQJNm*GY;BoMq&?l_LcMPFe8$ValR0E*V2B(U9%dutT>m-yD5?q4WZ^ zanpAsj;frtg?ALcVf1=tq+`j|raMM*C3zyfnp}qlbPQTlxK3X=X1?aM6?Wx(4zs1j~;l5f!fbJT* z^Wf4^qH4>vFMKrhu>T*8w~n3K zb=~hgJE@q3D4etY{m8jmZ(z*BR__zz&Wf=fDqXyv;G6keB!g`_*y=ri4YzRp>NbPE zfm2VAT}B(lUDJ3s|C)$L8n=H18cK#-4*n8K@GR=(ip0B$&SyOz4#;+Y(^XxjU|%8I zouG0`3A%a*_`+K(0&ZN?V&{+`K*2WS_=-LMN87?@Xp(==Q#xy~GZ&pSM~iOKW6Qm{ zup>m^8=}SYBI-8Qq>p1#3%;8x8WtAQ^O zN&(=H%srkV*kWvC5F}tH*bc^>eK6Fm<5z>np+f9C8sf zV)U3cfC&{0{UI84OXY|B3PsH-zVb|W#>=HY^D*})DlBI~!nGX`BhqXj(J)xXpv8yg z$Wx{ld(l<*kOM0!tax&`Lnyyn^zs638S{9eL$~0fv0HEbE<7_b57s#dhr zS2IsNN7C;>GoIu?bN7nM&Vs=H2nqdxn9A@V7XV9xSh51Wc4(g{5>nl2W7hn?!A-XMVeAEX@|wP8QcAWsGKop)X;`t`s<^z8J@3Hj98le_cJYk$^KHuX$`pT zQmi+-D5V}aQp5BBC9Gf|lbycF=1j6&+SNZ$%<+BD$Tjp!9_`CL7$9(=coNfq zi947JCf9TxkBw(k@~+Uj*ZF(vkTkC4u9TV4-)Q4Qkf#ws=!Cv>5Z2o`UcqR7IOc(( zMMuuf7sm>pogsuM5zvk#DvNeT&95_Ud}jK$-IL5kEvbGp=mHS| zAP$c+`f{BV-UwivtG1`y`s)n{W{IOk^FDyk^7TNW?#=$@QOGnLfbUSbw|3*;_7~ei zMpZ%jg!X1Ac(YVquw?KN+#q&bPBL-23hjF9kRg4V!WWX6P_#!N@O8(1RqEgAcGKbF z`y5!kTK4Ko7xi0m1!}ivE@?ksj`hax5X^|`4CLT?;BG+M_7oeMTMSH_973LjR{8z; zt5}lK8DPTeJNVn3#3kt1{vr8I5=i>bQ&HN?XY;d!8V-tg(HQ*!DgnMy-O)O=bespO zg&}GyEJI}$eWTvJX9~$J$^IRw{BPEBcA3~$!Le|NT*XFmgb+G#0HtU`W`bJC9o{2U zHX92uLzpDo+mAdi%`T6m5M@D@L-?7tOx@?bJ&2vyNMwB%5Eh5{w=T)05e&W6YNoVI z#tST~L|NDPRO`m$Z!|~5-e&VhTC>^!3NPgcZr=Dl=bJ|MSzI0lc~RlHuRk(?pb=E8 z>|1i|5JSM1!AAWaEg~xY2E_Rp zVppubZ|`Z!+l{>W`V|Mig(9JZD~yH=1Emm%SLP+ZUvg*&&|4905ny+!h|=Pz2JQM4 zFh_Oz4bFf^Yk97GY_!$rCI&NcpU245Mf(01@S7V^tJaQ|MgXM^G|7IE{oFvE{^dD# zf~PRBFDI@9Uu-x0z<18i72g$&Y3bi0@OO0Ym?M$i(mYSaXYeMAMR*Ogd?x9wze{9L z<|xWm7=&Mq5t+kywB!r@1?p)bx*ETZi#iZ9q8K3lRKOL#2xwV)EE~XOuFDh~D}kc6 zJp_E)UzPvU^uDWwD#|m_ni|b~1WWQFQwHeK!McoR$cY5uKR%x**@9Rye|P#VD`TO_sBC@{bSmJ;}aM>;a@8ZWkkW4 z1Afk^>g0JY9Pn&vC=E2u1QJfw>iZD3gK;~5{=v{lf(m>(U%6VIc8${yF+_1U z3p1~6WwXka7kwd2eF%#W`O#8FL3&{G-Dg)JGqMh>yFae)zy#Q=>&9;ams?`IAin}+8FhJ6@o(l zd!A@=dc0K_J5xM`35)ayr|7Pxiy(A}m2BgD00(o6k-j z+k(9^f=qoZc$W8iNAdryDtr2XgWUu*E*H8@aLEk@iKf65JORs>`UZuw7)MP)IBo6f zb&R6i0F1hL^Ys%Qq*Q6g;?e#t|6Xl3e^z2dQ+DrvEA(qhOA4=*_#vhLM`WfSg!Tab z9UqI1v2Jq9UE}fLhgBmwY9XL|m=g2@KJ~vT-&c<+RXl-LuIl_gE#ZI9$O;qp#~s)} z_=#H!wJ3){*oRlO7z$oqf-jQi#<`UC1xB}&VDY#9z=_hxnzY{K`{8!#Z6hmI|Hou@~x){mT zV7s!Ek8iC68|Z1esuTD6B8Wk*vU>UsYY2zH2L9@{e;q8_W&vMhuRpMt{cjt^pfN4K ze|~&60gZ|rz!oPgXHW}YEH2)4{Kkog@AJUp%dI<}K%F20TeGJ%r;z=3&hh}Xkc!Co zB6qVmO7$=Drs)OIHht;KEZ<=eF07u)$1D!tc^2U}(XEfD%bx3HgLftRIrV2>SBBpw zQYFtz%}5xY_(sdQj1O0JxzAT2iZJ9zyE6mr0|6pO_V*``i}4U%G1FD_mRiUdJcsEOLagpk^=|{CA@|l zVGg^9MsG1yNowao1$ret+d$^^^RI4r0)B{e=#@7D4(%P$R~9S9(ptjV_X}U4iV{v} zY%nSPX98pKuXYI>S8*T1cBc(#9FQesepF4Z$qT*0EtZqZ>DTC*k->h@Z2-ne2mWa* zzfzt?h|K5t2S||j_GTLc0ECn!G!$lAyLIz1gz!4T8W)fVG>(tkLwUlMy#<5t7Yb5a zdOZnHu>b}JKE$)W$9o#rl1g$02YuVgNj57xF-ck;vNJBn<4o5q3^B&8z!^!?@MM{c zZ>g_hK2d)p5}Ih~eUE;iMeGX{b<5J4v9D$1Ys@G` zX;fyCOb-61NeP;eXFDsuzI{hR(wxB?H;lV!KYQ?`_`hGnDvZK-BbE7)dd^_ZIwzMP zl3)DzmN0GF<9Yb=9K_{zHl$EcdAZiDR(6Y9^1D-q!C64vj2znC3|joKLItY^ZxS&Dm`}64O-JbPx_jI=x{p|1JtBi( zX`1KT%+Ue=y8&CyZf?K@^vu^Skhe}HU-kl91z1&b`JbHajoc!&y#l|BXg)uuk{$>- zgu&-7iO?fqkFy6$nZ(5<5LNj$bRJOn%izTRox^*O>%YC&fL2aXPk5&O9{43%Eq7xr zE;_})d8*q$KHfv13ER3gK6weBZ7NzNkk1i0$?HJtaSvw|;&sSGla~?(N)+Cd;2*>5 z#HM>q;ba2u9I*DM8(*)~wUt1Z_n=qtML#i?W${W8+Wx?@*v#R^2BJ7aZkCHc^?D)t z81Cv>;JIzH3KaQ3&z*pIlSM1#=aY9Memg0YvhhCS{ny8d(AHkZLa{N~yoZb^TKc)C zLEp2Zd+Fnfg`J5e(mJzgx*M3Id}bxU`xMLlp9+BkCS|y#)9{TJsap z;KO}WK+kPoq83qg0xC!fT98CmfCYkeSCTYa-c zU|RsWWAlsk=d4a(Um+r&D=;@9L#i)CfpYkRTdJDL#{fn*q%B!~5Wr4Y^{~Ip9g|os z8ziS9D@YoElQs*dP+PGT+ymn2Pli;?-kQ2Q)kqR(NK5*Ju#|0$DhIrYfjv7t+%N@a z&@40(#JAV$a&Gg#SbqS3p&)HBu{?bynq+1}qO|u%K!3q)PD}30yA0QTbJjirzjmtn z&QnzNv;9SA)0Ji+I{=?-cgW?snqwl|7i$qoEk66RxlVt9*F=uU{hz|9@Xn%ohLoSy zH?Hwvvbq7bS16Uw4r*+l9_9{f-7-h*vyi)}4Jhob|7eH4<=6CG*rvw6zg4|$L??1z z@BJ`=wjSc#r5HG{)j*C9^#K{x%}H6$DBoCsx!DDJ#PzVKicXJF;-NOFId+`4NU$wn5uze zEwwqR;x4Q|qN8 z`Z@Q!QPo#C`Ooa9E>R0~sVO27+*x4Y?ugB4yb|JE`{MAl5H3>g(d0WpvG_BWH5!6U z9)A>6&yTdL;i}E8Lb+d3-Z~aXhN-MO{EkYjf=q(eQEqe&MuY;<&4QSnM2oLSxSlPA#PF~M9 zc=dzN(_v`XK_(rkF4)bO0}6^d&p9OlXq)u0yGgw$XH zwoF>PzYMzYzTWq_i`uF$hw3_hi4fxZ{PG;_cJ71T=~80b9G22KCtB#Ave=NV)(<%i z^oraYpg7|85|_dO4>_)x^EHq8@GXiut-CcC2H)ozwCd1nnDLb-E9y(3_?E|FlXo@Q zu%J$Trt?sMcfKQ<5O@G)A|M$$S13^MTjpyr#1FIORSj1VYT$5gif{GI6DurHrujMb zD~XEtRKa|ubg7@w()H~0BL-xXtN*F3hN&fBvL#6cp9cOB)YI@+!TPJ)~* zh4g0;!ISMfjNVmZ*f__92zlqI5apgQ{cAEf=*zQaBvN;MG|om+oxrecRBlI74Yj|K z{iR*_FH-j+hb$r+oB*qg<3pQo(ND>-dgO3=u5`a`U3!Hhbvea{^wd*B(bx58Q+j_m z*14%%y7$B%O#b~e!0ThK-;|E_azSiJJ))83Xg>aTRfe6iz|-bg$%Dv{4~MqjNfvA| zq2Jyc78`2kJQwAqRJ|oxbpktjw~UlPg(ZgD{@8Z3=w-9PfcDO|(YgJ_8^1vz=Ejwh z(|a3{C%f+`*%f0FxsZbXnWJD84Y?<*uBp}TSd8oiW2&Aeu&?l#0M~P-<6kKrQ`Zm3 zRqT%elnsUk#hMo5BM_Vg?C;@_Ohb$;tFcwIplN~JZ#65q3Ax{h%@rTYkz)#RP`R2# ziA4qysd%KnnZj5Ka%rv&4%be(Mot&pu*mr=_bSYw+%z?DUTh$J2@a9RPAroQD0edH z4e5>czp;9kQfBVYK87jTi;cTCThlyRGXFvQyNy@#f^-|~Q07lvfZ4j4Zi^9-H`bla zrs;kC?ps=oFvz#50>PK&H9`*BEk! z1M|Ul>-if4X^pSkWuck;&{(*J>Rf*b0|jTR*}qU>dTh;t_cE#H%z*hjcDZ`KBFCQ? z&)lzGFx6>;i{u5HNhnV((jH_q!ksvAUP3{0T#>J?B5X#f(n8=K2+?(zGtl($e%A1e zHKTBzZ%mSmV~!aS^K99l2;#_m`PuI3vi_X~2a_YQ!MDGVrrgWSqgU(>dVq`m_y@cV zEZxt%Bx80cxVX$bUg&Y}Y?5{llSKaH%>Rlww7`CvphIfcvzf%c4XcbXLc%fLGTgY1kJ8~)pGMF_bFez919@$gV&GWv4B@f; zX3i8aa!tFy8QjEnvf6I!#8!zEszb8V<;^9TdE1%4u+7_a@Af$0 zakU^5=Y=@#y(;pTYL}Zs(_{!R zBo@-A+`&=_;xGD%n%RS;1jy0X6O9=;@$-eU(|JE`GERd6Gm}4Nd*7&#A`=I7c|5G< z0Ce8LK+l{wcO9g$6o^1A{VnH>jo@pvs5^54f>R`xP304FQz`q4Sy`swuYp>Qza%n) zv!_u~S8f&=fEm$%*YhK)It;Urh!Y=Vdv_n}`#USF4Y^CG2~|IA&V+II`uV5WLYZYl zwViTpE6avghSSA8A|0jwP?QnYHf+ZEMV(*{Q! zetHAKWC;*M{(Tsdo9;twAykTW6<>%*)5Ha0?M|C*Ic{I)hLQq~yLV{!4;XAaIlw+waA(9u@*0bYUoKo?-g~5s5(F%_{ialCN|Gc| zOi7Dr33KRD8p$MR*>lZ@57T^9O5GsgA{6@EE{)oK5`#zYR8n=qrbyh^CP({&!o3C+ zs7mXKk>?>07l3ZM5IAhf5J!wUuIOl^3#6AyT-cAS@ds{6>A0Oqwe9SpRnL8So5hBB zR?nFhY{pa)-3svCZ_>cyr}d2g<5t)_M@m0q1+m^4q0d_w|4m+pvef9HU;A62J9e7> zPksJa*}dC$@?>*4Ro)@JtE(Ek1t+f}VbZRvxC|utPo!~}vMHomU>NzM#@`kv+_qH1 zP05S5+Cii}M_UxS=QfD&m{KZ!7bMSg7#*C<$$IH#c%8PF%(HX9*C?;&m%Wa!~r?!cr6sDBzN(pGFTv z#l@g9rH;=EHr1$!P*Tn%N;phcT|O%-sk_+Tzh6pldWY$GhkBp8Is@Las?v7V6PjhK#rM<*31q2BA>=Na&pzK&IrWvtf&9YLUNu2e^)tvx&F_dh;C1hkUg5lKBWgM^F$^}EQhuO$jm(d7(U zz1ABMyX!+F^0Ug%%cgYhEW8{lQpCdux*Q4J9afYAbHHCZ*-7w<(fT7oa=8CaVy$|3 ziY6?;@ZId&PGX)`M#K_Cdcp+e3Afg>#~HN3LA1m3E5U)RSu(p?g(pTO`Bhv)hDwt! z7=;r>+&BlHRr1WwUkv{y5CAJzAp*IJU9lmTGoe~?MJ7!`Jo&y3pYT!eQh8@$2iKnQqLnG+=udyT;-zg!@l&Z;P^xf^}k&ItuKPQuz|pu z0^cX(S7}wa^iO>HeG;~C>EvkqULDIip;$gAy#?gj`Pn%!L5@VR13%{`twfY)8q=`+ z^%vblSwuuOLPUFwF%{q~ zk1#zidNu#^JCHz=c(WEJMOTD9ja0=Tvq!L!)MF2pC_}roPm@^2z6UvvCy-uB$yDCA z(ROBewe@pQ?oNzB9hs4y)jW`yPBNny2y8{G-gmqIbIXyYZfbismMTxLjaF_Pf>IM{ ztj{w%v6^Mm4(f5`vE6yj(*&7EQ&0ARJ5=u_T((hxNN*Iwy@te|u3otWe!2F~l;U!8 zufNn-x!)!!7kUvN8MqokJle_By~d}#+mT*ZO4%|Q6X)oz5GJl}BUKrE`A&_ll*BJG zVc%Z7n^jV7gnQhV<3q=%s72BjZXd2s*FjJAGFEpG!!!xkl!SXXm~A+4bSFi8v5jMh zV?p67pO)M}Ag+`a=msyRZuwM0MKe}Br-%(RT3S~3-1y31(-#e)l2+wBWOUY(ja>qM zW}B^nTK~yT`20ISHYqb|fd4Ka`ZolJZ9;x(WMkpxx8Ra4fuQ(bY*8H2EHLpdJvJOR zJ>We%`3vNd;9v4lhzCNKec#~{Wy?$^;#@Ka=+E4DM5xwfMwsr*#rgJ#!VLUf=?4W-J50WuJQ!V0x7aGaY_WAK|vU+KML= z??}-ftMx@_t19Xa)erx(llW2Xz7Kc46OPe3#MS(FRQp2_^{?OXAqiHVR2n1eSz$XR zA6?8Fl*(f%8=MsDW%RRF_1<-_h4`i)Jq=|P#oLxIg_H7GD*0TSn)5uuJLyFQ!iIO7S zNJ-tfeLwH}e(xRk54b2RU#voKB3VNzO*s zl!>~@8QYZwJvP5Tre@}X29@WD8*QOZP%@x@7(6o|;!LOaFt>$e zn5Fmu`-2~M6gL@kk`mLy22@}D9)qT1G-}yIM7A-apGS3(^ZZ|h?ZS+!7$+1$)G+hD z)9BeoCH}6BEHu$QtxsJ9LWZ`CSDz)9xa6kEBvGvm6kR zF#wFvi=uIWvSSr|%}(ZjpF ztg0fAKWW^#b%(<6fsNjelTNkLtDG}e?}JJ>;0(0m?RZ@MoASji%{%Ce+ekt(1x)=yTr*OZ91%bjusvc4g4nfnelR+@GV@JOVPAd;s`N!)E7n@va zERwHsxh~<_fK5HzoIijqopg^*2RE-QqW=l%`9OY-ie-;s=+9vwUz9>%`Q%reLb~Q0 zg`YFqr8~9P4Yoi6!Ex!);y^FRq+?TLaY<^eQL+QKo6e%iA$1R*hcjlm0$b26Cx3fcTIsl zr3wSCh+(3NgwxM{UnLy8qAnd3;g^LM@l+vk5O|}1?I)EV12vWg$ueeZ^dE77dntC5 z_m;~ed-R(#l-3MzLPz|}e|Z&3PL5$*?wDs?3g4u&0=dr&if(?3aZgsGrQ4uKYH+n~ zY|I%6{9B9EdTyOtYocvRDwo48kN(=@#>)1&4$g)?0WnzXe zk==S9ARB>y?gk47+Oq1?D^Pk>is?-H$xf}gt&A|e!|ZLr*A1w@Wn_uTHNxtHYnVnX95lY0?`i7_2#Uo z?@O>IF~bHcN8@5dZyQ_wxJVljaU3F5VCIs=TPP}JtaE4WkX2{0;IngS9M{R>FTNaq z_=q&S)p-@4+rSgvZKl>*pxlH2b>@5Zr%whYAJ!3>z{%mn*%&UOHZwb8k* zwQg|f36x@pz%@blL*&Js?!-I2JdT+8S8vKV2}jK$5MIMf2qaR6jjMoZvHv{){_ zB;%nkV;9++gAn&dW5F$5sdRt>#1V%ZbC`(VJ;m>@VlpwsIZr$Q4*3{C^}wlO@%(YQ zpdZe_*Xx$Ho$16fcZOJPW2;hLIh{$3>*j)VF-zJrg5&kitC*`O5Zg-Zsw=+ihxooF zib0s~$uhTCq4m^vsOrXa&LXBlh&}Wa90OaIp@2Sc|KWK3lgWzFQG```-%O*8-TWQZ z!^Q#&R3TP-p%f`y8>EPd%dEnjO!=N7YxlIjCE5h?8dGY?Cz~_9z&*MI9%UMQw|TN> zQ`?{dNSfTVC|!k68BYU(L!T92rYMUW#*+m&{u`Vqp7qc$Ol1uWk9cm=H^4w_pl( z`rcr{P%5%iK9GNjT^P-;2H30ZBK7PpaoZwX!AqIzSzPNe*Qmx$tFS zcPmVSy^jH3v3f7o_<3n3b^RQB?iu;*`t}8IJXuKlBgBJI7+KVm&@gLg__x)b0DjmrzI(I9Y}kX}1$wF{uO<^|e{9WXe5_rMb0l3!wPjb!owiONo35 z?#sPFuWP6SRkk?7C$0_b+|&501c@E0J^_VP@qnh-K|L@qVp3ArwyZjTN0h2g&}pZC z)4Me(H66;91N1e{oR0!sl_`C|){6bsU?5-+P}KS!wPg{ZIY;ZK!-`>+J$MCmOlMZ# zlsFYVjYxk$>@&4HVmK^5JXJ9xs(He2qVJJ`JSBWZZ&DwBpH z-Mer1(@H_PWF_kj5{y&YFKL&yQuX+^GKMRmUfGoSrqR}@{*ve3x?KD+;*PPb9O(Cw5fEcN59`sxu>}yR z6-(|R=D+b-d+OgvKmfMA{a=OSS1~atq=*f*{e?GL>zQhbY@%NfgR1tyYFKFc^gEUXDEn4ljVbu=?zf-Ta3s)&7=m_XAm)b~uuAsC%2{yiV zaH@%=`9>EUOzv9ET4>(cf`@ak1r;x54XLxxaGROjs>BM9)nj*+5ebrei;cy1Z;E_f zH94StaLP7PM0!u{-$5^I^~dLyNLZs)@Q_d|%S=YQ{65q5nX^CTvjgcJ()S6kDB zd!W;(W7jaSbf&)>Ra#Rb%zmHiSqhILTrY_@58dLE47sFqNm(qSYz1(5zbvv!J@(+p zgYMbAKg$7}RD7)dcLv4axGG2!S|hy1lF8Dv23Xp%Bnf3rSf7Dyk>t>LG>c-GAnL_U z)R$P;%gXDQQ!CM^VG9|^%F`xw4QO*97{KQ?gFE z3R8ZQ{eVY_J2>OKy6w4Y4@8FH-({o~{6}RD*H@M+dUm4z;(C0s<0u~qD)E;b;YaJ! zR&J4AyVF)0MIz8};S*F)Y`pD70&^KsB%E@HjhAnh4V>q^XT^Jtv=1m1R^MJES5^$=xK0{jI}VAa87{j^N`+U5^bv~#t1Suh zwW0LI*;&HM_q2Yg=n>PuK|=~PM&_B#ZRr=G_);|S!8Wg?^PYJrKY1Sq#k5Q1R1aiN z_eYj~comW&CTuCn_aa}$5S$#?gwJ`fzvZxrEJ{_rpIIQFK@k@EM>HZXvl)+zb?ek` z%OZ_5RjS<%@cqCW{BqAftC8O^d!SDuHC{Shd;W zqgxDquo9=%A2HU*XUWC3%)*Ta>#Ai69!bf6sYNLlzg-b#5h=gil+x3ge@O`3Ls1G1 z@00}7deXPdNrD~}UDO#Y{VS^mlR2*5z?-9ILXZ<6g&M2$z(&nKk8wlkBQT7;lYuaH z^J#04-$*Uw|u+N#_qA z&w&SWrl;7s=SJnZm&*d16J&?aQ?>`=^ff0>5ME-r6=7pvA*pcydG^dRU(dZwl-^jF zoDt!AGr|?Gd-c5jVeaM6ViuysE<-gg%Dz=ispczLU6y>RBOQ!)w%PGWIWVMm6hALW zP+oAtOICgh%oDS`dg%lLd0ePgQ^S*vo(@iJQ(T zHngJj8=%B24laK6pnbNp@;wB$u5Z*#FUvsn5r#6LRwAvqX27G%WWJ(Xq^INL^8xrc z7o-uC#;Qa(Os)V;(e4PmKK#OlML+aR^>=V{kQq}c;LK^9O~<)th3FFebqzpBG8B$H zkaFO#s1I%TS}S47P~fe+WwxNx1T~d4${cHFUi{FLb}qMGdV||&%!t#9;VC8J3QmLb zMU;O%F%c$R=TeULGdT;wb;T3tyBCDG?0Ev0|Mr!40PFb8-|o+Toxq7(!Z)03d%er7 zM8?*)3Y!Y9f|M#^xcCp*5B^xYvPQe(AqQqDs^#`kV=Ve9-#1_`jqpgad#}@*y+Eyh zdP%khg}T{Wa+ju3b{0@ zmDRSnL1|~Bfa%1?;R6`(s+@;MV^e2A{}!Daiqpj8eOt+17O)Ba!$+$>B#~Bl8DGis zeX6D@lL1=5JRXNWAu{uLEDivYl0YQx*dPrCRlex>({P6`zy|1!&HDpB zn*S~mMB6j{03Hb*Jv$S^`k9`KnZ=EzIJd$>UV?vr4;n6Y2dzQwBjd=&K9jdkWV`%d zau2*6Pgs4w?LuJ;4c*fn-C=ue2JGpBr!hEPHqjZ|QHp)H6ZX;S(J!7ty|zTmJpKge za)bPdkeIhrZXW8j^P^RTTx#RiFC*@jJe06tyomP($rnVE)K1a*^>ZMc8h6Nj2GE(Y2}vk=2CPgURt>71QDVCfA~_Mwm`yltrLJUH^<*%nialIB zY>yevQ$KU&HF!BqT}xLD3G+qg#=sdSa$6LfE7a1lNXSbs$EpN{+hYKK@KWV<8Y;m* ztf+e21DDhcs$@rg7=)gmD3Su z)jOFz_!k3pKq_hne{6SHqv`SDR~1TGdVLA@rzkuDNHESkrO-uhTSR$@m<_e*k(Z$7 z+#r|njO@mHxllRf%4P5wJaz0Q?E}*)tJztmTeSxnj@QQy-iq*^3W(=!Z}{V!MIo)! zq(z5yPtn55j3jhHmc_zI!r}Lq0P)eLY>3DE7*4GwkQxYCr2|?d&5ZG5LHo{}HUZo1 zBfp{2MO#!p#Eh3Z!O%8=Nt7@GZHu;~W!BA?)5_y+g=ah2bL&pr7C+s(`w`Us@3#FY zG8BHRe%@A)M^^YYywCuzB*J{!soGqDL~DRjZZb^t9&P56i2D>%Jl>e-*3pVl&alZ) z3JKUI_U(abn8d8FtyQ?-9$9$7gtZcp{wIjUl*xS&#>IG-6;s=LvOa{eBz^qsS`%`rANq7aCQ>SC4NI>SI^JB*5vP zw^?q}3zul+EJYL_6hK->Z#pU;8@rR-meA<7$a#P`Bb??ZM-u{Qc3&7(d z!X>r8HmdmF|I$Iqgarbbrv?7<;r{Ys9{~wKUz}|PTuA=@8~*$cc?LG=f3edkz}5@s z6lpO#|NI*v3jT*a00p;yMj|%`gCFctdHSD`g~}DcZ>n$q0)vmg>`oY&Qr5pTF}X6x zKmPTF8ANXT&!)}#e}=)TB@XN2k#IlLfB!4`0jx|NuYD2se~%0tztiC6-=DJ~|L=dP zh{A8a`RGYs|L>9g&l>4}2KWD`?f;xMKhBsc-5$9Bo&n|1aD?+Z1)(uf z4|ppeR;kl-xwx>K#h-!4^y|?FQDgWtu!W;22kKNH{NVecmr2kk3A)>d_d@qEqus9| z$QsbH#v7a{p!1-)oQXVF_GBEqAGibz6th6erdR%KwajMz_L|ZkWK5yRm?%Hq;Dah8 z6W#}pZ6XM}tRha$3h!vcSxn)_P8F>x{!IU>C30l3`-u)2uz`t6)o2;w2_fpOw}LzR zm-CI!4gn6X`I0USV1d)ISDxU>TEmnJtD2X71#5bBWSoP30!AEpLdg7(JJ4E&G{ zyCb+m+z&S0cy#~eZR9NhZ9;o)S}AeP6f)hJSn%RIb#K5r-Wbsa#a*$E(1NKhf)|`; zspIYE=W+|wdoUzCJflPCGoZHz=1Wbm@k$Q|c>P>K4!}LgC7S_e_!YJH=rCM>`S>YM zab+xlQzv+qC1eoJni&I9(9HUrcRC7jtJ=Ce-nIoCM_ORX%=)u6v61iG`up%q5Z)(G z>>`+iXPKc8>qJEH8?^8>U;iK({Ku|g6&(vl=}cYwO2OmdUf|nBlpsnp@STBU;U8(J zc&;VJ^OjK(b5`3b;}`b@)y6*PW1)N;=eL#<%(arb6ss8c02M2X&mMscac?4b2^ zoAirjCB49u4XbXS z9U`Yp*THIZydZ982}06yhX}SA;<{-Creizn<=#sVfk2cEb)wq^B=VMkya-qt1*QFg z8=3bPlMRJ-ifBMNUfCM-p{J`u*N1Ce=1Mtwg)&?#R1`-$9I+-+3yIwXg8OXBN3qLe6c(0pS$xi{0cOeedjn zIcg4i_iY027z7|*V1ui94QsH`K`C7BtousUa1#XaXPKVNP!7|uOlGr;!mDj6RSA$$ z5F#F={5gnOR7Qk|zj!Jvc@*;r6jiy95SWQi9S0u|ix?9kl>bB^HO6<}XfBDsLeN8z0W6kv2nXN$ zYWkx48lhtFbOdrD)App3I}cGHV5dof19N(F_}f(sE$TMB$p~U~38+q*%>MU7m_3-3 zdq5{ znc%a^5SEX?5Rq2zP27b=I+acfEuY!ek-Z6+;ymHdn(q36k^v%ro5~6xBZ9b4WAk(o zQh(KnZO{St(zi0H5sId~GQyE*ZmvBZH(13ua39-DiZ#Z&0^M^=OEJySc z(6{%$^)6~<6e0x&$kfP*`6{)L-BAKW)iOZ@2P~+T8^_0M8z8kgMy{31QxAB(12IdQG-c|J8j0u>@9gf*v|*^wzC0P<*Gyw zE`BT@(p+dbnxCh@Ov4hl%&4c|s1&)xn=rcwW>heX@Ju?p>NO!&46nRA z>aMnb=FRLWO+)Ib~(GeGmVxIn&ezO`H2~XLbH!`c{X)xohN&)%QB+o&eSM)}_09Z8WsPTZf<;GQ{Up z7!Ksozr=7J5LZ4Be3XTP&SX?kXPC0kl&|4+?y!oTx zQv~DW;Rn!9fk@|hzKSoZ{3`ai>@Eu~Rj4H%*NyZ`LsWNz$r$PTwCzVq8)telCkzTB z%2@daD~g*#FWxGMUjTg!Ry6Hh*T|IzxN}0AFTqi(?Q~eT%Ao6#$-+JmLj@&WW(Q=C zR~&rQtBbWvz#pbcw!`SYSC?V_dCQ8y7q+`R!>yWjpXXdlw4fw$2OvdAbh+Hn2}DAtl&g^5{L0Icl&bJo%W|6oGvFo=K869(|UWo3CwanKypl_8*syzc4xLS+kHBHOp~n?cnk zy1h6k3}RjJrQx^Y&(8>m(emgGa9sC%97e0=!JLTFu2xIn{!^!ur#1^6QH{D*Lxcwl z^~L9UGR55l(#!liM@$-TPV~EvOa98sk3O~T8#!f7*WX5*7w>-j zc{NH{FZbM%Zq8iqW8TN#quJYtw7(YI;`#6?m|O4^0U6lg|BMh{d~(8Jx-@SQ8yow( zo;KYGfn_cc5)!t}mWk@g(brkseEa=_&&PK{Is^${EhlYxHSVmJjGnZdtFPmQyUk{c z-j5KMEjCIzA)o50q@zk^xLR zo3`2k65ht)$Ov4kqM*Lr^LKP)Cr)y%lio)tWHR>{)palVzpWbB*B1uKVgH;$k>oFU z1eYk%Z!8QIr>)`#$|*HIs=Q}8AbIQeJX*F+#J(+((bgN98!wG3FS8*f+^TMfMKmld za&RA?^uM}({vmafFx#W_r*QWJgu|3;+!A}w_Z?-Puf+N$p&iLHk2;zZ@HW(N%r&)& zMxM=6F!l__A8e)HK%D$G;RJoKZW_o8-Jo21^Gpvu8E|SOXH6*=-Rh||1>KBC85s+G zKmM*%p8LkM2Wdl02kki}twdhK92T?5sW1*r_m>uLXj#m6R>uk-mHh63+^se229O)_ zF~&+CJ@-Yt8CC;^OMJ>A>E4S-fos7Bg5gq{@T2e>lAe2|t0&(-devo=PwPejv)rWs z#ZXKg&QJTZ)?iiX4n_BAr2Efe)l%iukI-Je3y{P;30{=gy}C7DU)WuDzU$-qH+Bk5 z)P=oi8!<^bDiwLG5mrR^^WtFPO%uYk9soraPGQuRH*I=DOrb2`!F2G0fh#ngmYnf& zE{jq0i^c}*n=J5G@F1!+{K}2C^v81w^8esD^!~!oX5PU}sRRE@{HN%Z&2kzZJ&mkGu@~4LRXWF?G}eXfx7Kwi;IUI&#`E*JsyNJ#tWrl@ zTzB`Tw6FY%*DA%`RJC3ZPBs!P-7K9BrT(;!F<`9IyngaCD!qXs>bR9sTCDQ<$%5}1 zMcf4n@_FKP9#AH;IC9rQyx+R|g!pylP!zmMuM=ng8?3U;~`Sp7=1_$ZCR1VwvdFrEC=rW(KN=|GFm1LXMo~KjftseDy;=jyTI-W;^ zEv3rI9oGCbdM=!DwTg^I_PMpkBQ5b%e5Mw6eM+rVWFKrn)mNIwSaRULr9vDu-xyZB z>M<6jVkpuQ6k`vy$5yMqd&6+v&YkAN{UnuB?@zroI<`DG$Q&P5_&i8)(JtLi~^ z`?Z8sQ2g3$iH8O;_bASu!+!)?ZQEtEFDxfKl0u=)0KLVhT^NB)s5m32@xEp13H{2PbKHviRGbl@#{pXKs=0S!VS zhaaHrmZdyRe$%$~tNjh|iXGul-CjlniGvk%Oa*Q!L*gWX;%`jr-VrglPmdlwNi}UT z8mlB*WGy84W1e)m3jiDk@N%a;BGtZEto{bniHGi|O{i+;Wd zk=7r5L6Gt5_?>g?KQ4{r{#bT-_h%>xz1WQ``Bzlo&9$cmiKjv-_#273zl*rF8OcPL z%8Eg1C%PVcO^+v9Kyg1IWiHOldMwsdy6Eld#=Tm z%&MGrIG^xwec22tq|bGqk}xuV6-l1*M0RJgu?)AP8LdVlFlL57T%4f6tzVM<;0ew4 zRQA&H3h|DVLE1M-g15%YS2b#NZG#Fus4TyoxxryTCi`eH{xoBow-k?9#cu;%>SmX7 zx4XpX%zMRzbhzdt%q46r*%xnLn=#F};v@S)va72y)R)Q0nhxMs}>BMO^?#gXxCKDSzagn+aKB z0IS~x>a4HV;<MkMn%QK4r-sfFe*>A?}9PdVa zB_N0bp^Zd2W7zuF^==mF$g!k1Ypmm{VIR<%c+7K>c$Mo`dkmLPf_7ud>jf?gv*3HdV<5evf~^jrY~4BvNCo>3}9JNNEeRHd3Zo6sInC zX>naPr8v&Fnow)~$Getu@a?qyum?A1k~7T@OCCoPo~ z8RdVzFWIq*dZ(QdFKJ~O=c~WzUcDYUB|a|6b-^`PVoQ>J@(~`5=WU-;65dp$sOWRe z!FYWnG^G+O9Qq(i#6S3Q7(hr(M|d|7XZ&2flzYfJ|I`bAVWM%tdRruBh~dI=jI|5T zQLAFNQIj$t064yB_d{~*&izvtY`KN*+J)}sDGzH#s!N5U@2Ds8_BjfbPO^-pM-ach z_!ADFx&GS~#_W@fFoy9I+sJs7&~+Sj$M%O|o~2Mg>L0PE@ImMGL8&3EL4!Kt?Rm^* zqQD(~vAPicucN$N4+a%w&1R?~U5h^L<#hB#%UQ#e1|@PCv-#C*KgC7yYCB zUWXb;d_^^jyU;QBF*7yz(|vv{C+k0IU0PrHeXXxP*j*bo8+UB+ZLc_YLs~7knG^Rh zb=IWI?qTU;_DMB7;0AucI0{Si>lYcYh$R)R4*IV*69^tV&vq_+`B-r?h0Qnl37YX# zOi0gk>+@etLB#Zm?*6-7Tb@VtXE7N#oXiBx~g3fg-{r9dmW&8Gd zP#}c>;><QqM`q&E0^?7aK%D&CxId`7- zA;gxq{CY%dii&<^RL9SqD3A#0mX!ok0D*v+SW4NveY;!UPU zOjD$_jvjyisL%F~gy6!i}Ta>>?!>xPa)i|+RA{?6{5M(Jd#}p%5?K2#U5AyTN zqg5TdjY4H??v8;!L)qMVNzorITEkR9@Vx!=WK5FaQ|#gXR-r^w-^r;)nu4RC5iWwp zFh|Z~=D8nG+Gd4#k9dzk#$#aj`~=HhI$j@f2%%5*^IyYX5_pyf615}@F3G)93|FSY z;8J8w{(LG2bGn7X?2s`@&r|#Dt%hFk*$8ym^E%vfdSp=3k7X%Y|D3>+(sYl^&M)+*gMInmd=m6hA4LYLVtv~%Oi&xgvNtVtv#CntaLm^Yv{SDhKJ zt??O@kfUEM$cy2O>$|G5nNq&(aZQ@Sfz%0HJ;!5YKks~4SM;QQw?(Y^%8KK=g(^#Ae< zIX|(j`PUP>n}G#L=pL8?;)*j}c2)7|NfQ^C^b8`R%>_9q?%ZAgavwR@ef>>%JW4 z)gQI4b+EoK!0QmLW%^t8rKvD}$!s{dU}P=;@7u~%N)tuKun);; zx80Ia(()oAzX?wR<_6)y?K_r7@Yzgh9`3PxMWI+{nCcqJwPfyZ4 zW#pm$@s0g7A@W9rVsME*qMK%4!c17C$wBkL891@toc436X@jU3a1RbFhiP>;$-z}T z_Q}h5=m%P_G|owacaYo!;29hQWDL;^lFq2~IdbH3j>Nb|dq0GzmyzjOB9!X|Lf9oU z!!sSV63S(Be-Tz(^ABLpUVpzK2Q5h zmYpb+3ic5SITAXOz{p4sIX;&Dw3EfaboyR__uq&9@CMu!AzqTe9X(BBl$xy5bRfeO zZ|QkTN!OmtD{r$6O7(m8BYy^yo{zr;CpbF`i#(%bIva!JI-|`{7|lgiRaI5_DD(^o z`9xvKw8e9-+tOsQs2mkoQeo@+)-cv}3JHjQ0WBqeU%d)7tXOywgpu7=@RZ;5=W=jz z{s~NB>)-sktpf3ND~KfW?YWLf_E@cvb@Z?1AjB zF9~1QMtBS=?q9#Cl_iIjIfN}#4ljj6t})5bqDT{Niyn`{9?t$)=m3rK#H?$XN%DZg zfScu4Xkjde`X62gplN>|sG)dFj_`Gpu_|o{V!p(Jf6y-tnqM|z2P9qLDLD& zp@|KPUP&pg-gZA}(jk;z@{xvyxRK{A-a+jOifYsoWlGPeJR(kz<^4aO2N7PowV#YL zF&%F-L@i(7e(&{U$c$FQ5m$)yYj4b#4>;}r!SOct$kQ6IvZMV-(YOcasyd}^k%2bM zA16p%V&Jh8?VJ_5P?&XVf5c(t4+2s0Kc$1W2MM!mz(qlG zrZM$XY${HXcjTUN`Q2xpfZaQ9&Zv$hjePWax&T(x-k4-0h^SYFSN5q(H)WhJ58C9t zt7;;@DL1t6N`PBiDCbCLH%nL?DSHW|p&P}If17oUx|*Lb7x`|@^(4WbQCLNDgWX^i zvD3)|-^Bj%d+MK4gsp~{uyx357zP1~#`QB&>Ud?>aahUKE2+6|#Dmm@aOW3GFe6H( z+I}n-e7Wem+21KIbdR&ecOro%aHDknA`JW;jTQzAlYlLxoaB4)_=n`{Of4Jm@ z3+1G+AYBQ~t^n!a0~d%5{jhy_2djXB7c(2A8?b8PL}CyN8E-Sfz*Fs@p}q?O?)Pf~ zn=;eXFmX+)u&mQvzljmLCu0G7{RM5R62WVu14KxRZ@wEkm zzvo={i~brX%UW>k$%T4L>=hsH-ABnX0NAvPz}BO|_LCIW?E%bZJBZbNap!WIW3{$K&hma5d+DoQK!!)yJ zp^~vN0(h_ky+aq7*6Dfto@Y@J49;tWx}TQY@(7F1UNf@@#`zunT$eT*PIjbZi;2Yz z!RlnoPSM$P1R!|_>1ykcXIVA!-U0BL2wp~tper-#y7hdWyItTZlsH@M+=z#p%DfHdlIftb8>bM8 z-=rq%-~g;)vekDTfA4iUcvGi@Y+XdQ3{KcgU&U;krdnsh4K$EXCcBH3YmWqxwmeb> z$sXAnubT`%3&X@&!y6~8Kku%*UV;DyHBqq7uBK7%gd(2|wZhbAxOyL;b%yo*)B2C1 zUpV3WLDAU+jH6gvpPxwrKM@u9A=5qqH-D7MI8Wn1me)fz_1{2Gzzv z)h1t)pmk>E>k*v2B_no&1-C?*ek5>bTz;em43MIWEg)6q_!PyQWHzVsuEOc(wG=_i z;MvS0s2Aj#)H>_Ho@g^#`35On4axTBq{JFcIs`iS34elZZw9naiBQ1*S$&&LUA^ZpstKlhG;IR#ZTCl-dsi{ndDb+D*p2j#G?cc@{hvBp(lq*8xjP;7{N$WSt z;4_qx)5O&Av62zou2BJpUNVL0>)ToYy`=jmYLUxf|}rPo2d0 zx!LX)g+tAdotgUc>b};(^1VKZ@;Ov=l+}AdNx?&|URZkfTKVKyqg3Ey!ZjK=q2*i& zbB~{&9XnoMfN9reU(dgCq>A4gfAQuF)Yif*G>;Fgmp6<{&HVVO$_Qx27nsBcq~N??6%MR8QFzCeVre&;Hh2RTNTyxaasgA2zf1xnAHtJ6|rb`iV)3*U<8g1v}C7 z4!D7;R=AjXm%4T%xFQE$pXjAcyK#&Jen`tqO?fxl88%9s%US*Fz#@(?mxncBsssXL9_vcl}1& z`8Fd|M3=Cw+sf#@qP>1G?}P6Xiw_Z$VolObGwqFWbxBzyNgI*!NWv#>Vhv@-Od{6NaE>|rPJg?B_G*;6cS3Eo9{G1Ih4?DXm3eZ* z!c9ZljaGg(AWq!>$$WCQ%3ji6z~}g|&7*yhV1k8)p)sVp%DPXXXa8~K-OsTpbe<4Z z_PX_ctn%I$Pnz8Yaw{kTmBxnW?z{mbve6-6&ixiy%pSY^Xz}b4OVJ#L#%UEgHEoVv zHpAk`SS87L&0V6a3oL4Qcv(0O_(xFQWt!OTej&9aGxXr~96}{oi8FQH8MGNHO1XIR zRd`vV<`xjF9(XOqPuDR;2>b=cOf8Ypt~BoIRE3Y9p$fJGRmu>Scdg}mgmy%G4=9ESzk@B7A#NDO#ts>f( zD~*|$_%ib<*n(kTXz;;kRay!P(!-RQ@zQ~sd#H*+25yJo;@aAV;GmAgI&5ElK$rmwzAJq zCdxP&CCZTuG0@IO`GbQ&hLTgH&7<}*6M3}ccA1j3<%hgS>Zx;6qD1PMk18qZKJj;X zOrm&2BC>bQz$tw-QZ!QusS?DS57mjxB)%yk8Mv%H|4_v# z@wWUmvUs2qDFgaka-{r6B#Q;X<@Cp3NZT)+w1_FEhj6 zR?daGsE}s%V<^B7fx;sScj4r*l|s(_?NAzbF_p?4+^2{1;`Y3^3UoK}nh&62sat83 zPdTymasywl7x*1ZiI>+n3cqeZHpSsdW!B<;Gw zY_UC4`DQTOG?L_xN}%~0{kIt&8LTuNATSW+C6vB5g=-s>(0F7`%$#0r!8Ispo3K?y z{&p1dXX_f;x?zpx46Nc=rV4cC^u(FK=e3}vtIBNeH&03%JU_f4I|ijpCm|1vNhkC1 zIzfP-(MH};*~V5lZOSYd8x+3tlNGb>#qt`z>ooA2TdFp-7aO9wUnJUtsedk<0a0fP zfSLP$?2DhY8F5FL9uHn#53DL9^!mnEbgyT`%f+J@GLrkCM*jHpqGNkmO z6f8$3-FD1k4lnuoSw9dg>h89g+YC%J3+r7P(c)Ni_4{D6UQXJ2)@-oZThhIsbzRVT zX|(3Cd<+(kz&4jw`++L4(M2V$4XaTiRnrVelL{PCh8mvCFb3079;tq_;(h!xmG(Jq zM&0qQ@}|@*arXs-p`f4?R91xe$KA!lT>&=n&)DlnTaE40>xYjFgRkoc{7#q)Nt0A#^wLM9{}||C$W+ZLf#Mc zS_3^x7C&nWY~7r@k@C-dPfkMj2*AIF@2CId@H?SskK>A};m{@EYJG}YU!7w7%U~ga zSiIeF_9l`sQ#5p4x%+JCaywb8C~o~zcLF5iVO8{fGsxPUqRE0gOj$FVYKy8h`k9S! z+=QO`j#Q)YgEjODX&M9Xv6;^mGX)g$j+sUAtwk3a4Kp?Uy!x$O40mK5Gv&igBP* z(QxGB!IzJqY&nOUQ0Kb93RQ`lf}bzw8D^*aVG68htP6P@jZCi)Oz*#kiio^MuuX`Y zTuq5X$^u3IOYddR>ZF#_;0L7tQ~-kC4Mc-#G<OKQL(vvxz0upq)F9hnDf?G z3~>p%FrVy&U@wRMsH%D}7z=`w2azVBR}84MPm?jcK0ql)&~u2bq#&F?i?8|5 zu19bJP55TVpdz_U?l*CWwR!g@kC8kJNo4Nai9R{=;|#9>2I=x(MDy^yC?mm+-l(gc z(V3dR1y;>Mn^otT6cQK81igkx)7{voSYq%+yhZqt+;Dc2rI1Y zVhi48Ya3Mr;2|kFSD!y9F*wj4F;K>Fft*uUvGh%^2!R8%#_a<99*Idvojd3*>L@k* zJk8_V1?Gg6#W0_#5D%w8DtwNILbQQ@v|3O0=-~?`lFjL96L{mV!_nFWf=9FHE5nx~ zlc8gm>elY4jIYrrB9Val>Kh9`YAd4Z9+_Pd<9|^Lodwf7W*vME(#G}kZ!pS)q{(|GM8v^-#WSiZCS z1`*5iJ4K>;6QcDlf9r4@kP+^@h2zRS1xLrkyp~Gxx;~uhaTf}7-{h!gAv%D|M%YsW zM)R&dtf%ju6opm&ct(5OqS)i3phfMOY~y$KW8CWuA9NZw3w+AxWRGn496o;S7UD>J z{=)y4IStR=?__a@+uMTQtxyK4yeO^-DRNsRwz zSU`9%9QULrtck_hDT6*(+RNp+4ASns310O&`K8q>#|LZrQ^6mc-S%}660u(#7P71v zVC?lBIUKK;IhevJzD={!XZj`=N)L-%oSd&NMW3=eU9J-uY(!qP z%V*Hv0Oiovyr&fXXJYBqntT4b{S;$!9Rh1oJOQjf#;Thu)^`al*A7m>A$T3sO(}8= ztqSsHGvJKJo>d6N$#^0)XXo-FqbfDvQ4Kgv1Aez@_$@sRkf{7S!qcc2%Er0Mv~fy{ zO7Q=spX=f0DZF`2K|!IwxYtL*%}m2lB?VaX1()rw_#w#;)LbpIE#`NeDty={#b5~b zX_Px5s2nBi>eHL@xY~gya+$JTm(^rG?^*KbzQ#DzZv^v){Fw;)rOTzs(}pj2kCCVH z3xqL8g^NOBEuk)q9Ss+{``(ab<7K;TOkbVT?X~=J;D5{i6QBR(=IMKkH!6wT^XrFK zrQ%^GiSSg}q)Cdr%2?Y3FN71WQH@^=z14~THzPx$nh>c>HM|mbUyc@FA)=eAFzxFg znm75TnSXO$K*<15Cp@9xa7HP;072t?f-n!zy?R~+Np(EAP#Ui%A!v#$r z9Ue@#qCp1F(mOX&BQ`9iHJoqg^i=CJqGHfreU*fIIP(^m5m z12~>?RItZa)R66k3XL&iM2C+VyvMw@cbfC;hBC$v&F)wR>0xW^ z-izGKQ6enf1x9y)eo@5K9C4CGYnJ@e9nJDGJ$V<{Ol@D&iC84D4XO_t{UND$dDtm? z$AB(SJw?{*eHj_yN0*^L)4_TH*(2x_e?63BhD}R=2$`-`Orn%C|YOfeECCc)9J$7MjaugXx4dw#A{{0 zi3P^O=?oSp8K!xg@BjW-x!9;UT(*;acR0MN`7JI#v$pwo+Y@SA%fIX#=AgWA}j_-D1SMU!ru6b5Dy3 zeFLCCi8C2Uk&eyxtlM6c#PoV>WS|Z76C6Xvw;l|a@Sz3#!|8Z8 zuH(3b*S4iwu5OTFmWjp*kwx{tF#zz1=>{sz_M*Ii{F&!-a;#HrZz^wZ;NDo?at62a z;w;@izdzLy@YoN|4D1oaBR{SvFS8KVB+BKfCCmUH`s*bw019FN%6=9Rz=d{RW)2^z zI%W2$pTqY*;9_89BMbwHzAQp;KDb(1m5kh^a+JYsX;hRTbKlH?_6Bm^yLA()FRw+I zOgwg5Z$QC$%hs-kSI9&p?HE%ra{A}c#9;`8L^}w&IG$eiiG9)ouax8ixY-DK{IK`u4u z>U;@#iU890{-^-_t9G_}1% zhL_(ZWnaLca$#N+!r~&JAd`D_5`Go0kASBi#89oXxd{`8v*O%`V3*Vu&1B<8ys-~~ z!e=-P-Y7T#%9$El0<4DzUO^)r8U?i!k0ZL^B7rdgbDy0mw}G5-5*5jOh5wG{Mo^n$ zz#dR2!&kSUqe7gVXQlmEs!gr`%Z}fMxzfhib1_@QV%%`UYy%`j*?b0gEWvE zhs6Nu5*H948QQ>p0SD%n=JJy`{+dwhk`^$+Bn}rF=ii{?0rNAqrdJqyrlwbNyp{q? zC?**@nLk%9kfouH6@C4q-U6oWTSy2~s*I3jc=U?2nGNEtAh)z|BR%5D(35|u23Us@aS>FLWI+fTvxPZfX$U7TryTouYkM(bBD zPfY!YmU?Vob#{9GWUP#}>5tn~6TVaA@kCiB85uW__j{wZ#w3}f-L>$UB5&|p{C*2K z9k&i_X9d&UWw)FBpB+UYu@!r?A$)!cN82CxhoCYJT_r*j-3!?6+y_#IE`ACdHvK2) zofIy&;o%eIQYEg3U!_t3PE@;cM^I z{+9h%as1r!XdDg5uK98C!U+QC{0r@& zMkHf{XfUM=6-u4H*TXvJvp(zl7ktIoe|1{;1>mmwAz-OCpb3;)=0< zsTVZXF2bk!C0G*u@3o}=|EK*QdTL-nxZdRK-9gsE#11;@5EYDbiqH!~yY$B_Op_O@ zhl7N<9a=TErxTz80B%Xgn!4o?(ISh*t`&)n@pjajGJx`aaCSQV4EG4J0i6yfBBxF4 z;M_*{CcEQ!CNI{_2^lufvCe88o63Fp0gYzn=ht_i-*^~LmJc5{@R4QQBS1Nlbes4g zJxh9z7~LH9Zu!W3*F==F^}%4hol_PrYrl<-L;C<+By(ThY);>30@$YQKUcanZV;`J zg^0`-NTI#QFrsAl`vHGCEAH4_O}@$v+s87KMLQFlH;77qvH@k)HI37O_D^@j#>$e* zZ;ddyqi}&Mh@ASbDPZ@@`!`W-`dTe7>BrL3f)nNlCuR{sHTmYOn&gu56xz`43SSYv z3+$J6`zJUn+PI(jCC$1YB)cyI)q(A}MLTIF|2~Fw6z||%1Y|T*Dsw*$^f-|?V85*o zEd;9qYq_d}!)K?~c|6THFy5ypXH$6o;}7OM(_u@5kaip;kvyy$M7Izdt+f+E zt1W2h>n4NdQf@`SN8^)jAMqv1x(s0{um?(A9`p17+asNMK!MVPC;(JzXt3_&l1X^d zj|_t72GXR6xE%x!gjoSP!sV=$kX%o^ee{ha=O8rZS{K>d71jLkz6N|PMZrOXF)X!k zyqLWD0Fv49tU9v=A*w;0)piiJ;n%akU!-aqr3Zn{=tp^Q19F=+O|)0E7ycl#S?LX) zxXUfN!SfgRKi{{~DE&~P?xblr^Xne~Cv-Q*#`n$XyHpRX_ii^D_v$Xb6y_;ooiUd` znc@*Wprkey^qb3f^Fg>eBNj}zC{XeRuQXrLM=;-n=?3-CDj$_r!*NOKtx(dMdnDP@H?(T zN6E!-ysAYC}G1PLuQL-Vj11PW55NlUD~?nsaJ7!NRTjFg({#^VO#zLclyPGU7V5>4KUGnO;S9CycGF#D%M+C)?7wa)YBUGm-M# zs0xK#Sr)|p?PEfYcuSx>j{SV&%xk6)XUbM$#v)OG;nPV-Mhr;9u;-Rn@++VknWaMx zUObW^wG>|lwUEIzIv*J%br)xCi6Y$3UHrP+%i#22Q1komV~4COKUKW6@6fp&v~YH| zk6{IT>pR?c)|;HzGs_G^;=DBh(fPgY7h`NI5$SO>Tbb}QkZ!P0hJg;`3qcFVT-Ep@ z%E!>?>pU%q`4Q(ZTsNAI2(;M@_bU<3svaWXFN)E>D@7L`=vLTMaoSmN@e)cTR}h_= z`t@xy+tyxvwg5v!KJ|19o;Zs0U%Eh6ZlUY<0fd;Q)q ztTx#zCTR&rv$~OoL=F*@o9D3hxw*B0baXp}i4@l3!~mh(>`MNFEIXS2%(zn(9{Bo% zH;67W*o1bTvA4;}(qL5>uK&SR`dgY$mXZlclpQ){?oSz3(k7nNhz~#{&aD$J!~YCU z2Cbnt<8Z4*gX~B zgk*3cbP(Aacaf5#fC9rVS;G54*C@_@RPvkf+h_M+_1%Uk7vBL{tY1ArST_Oh>MvYm z>(MN=;!|0bA=CcJWlTaiTJ8MYjl=`=zdewCSq6yx47e1zV3oIFUnWg)o1{@+aW!@V z$NB)Zdu#APam}C(4D&#lIT{lTeO1g$dckBaxOX530Y$QQbTkI)1+)%uiuSHDRImZ19H9zTTBA|B@ zQhwjuuhCH&BA4;WrJCx=JwP(--j$&9-uOP?X^c(;J=6zviP3DV>5}mo1ChGC7+@sG+>qpReG2ym2lt7O=_=#TK@>Ix~RimM`m`5gnnd=gR{AJO8~ zIXs2o)L1t8l~Xb~TwoWxtnJkkq-+VwoCc)o*m9+##*yop4*h@qn4J`}40Xwwm=`{R z$G%#SaF0@Edteh$dHSF}vVPVBN}Ha-?w^LF$(>)D6~M!@0?hp+KyM@EaDOOR%I~)s zI`9K9M2C*qR?pp^J}%humDg7D z)s}YYbkdP##iLhNG9F#YStrjL+?tas%Pduy!UVz*KVS>nr>8&^82N_e=A*LP(_WA> zjS%ZX{j#-!@8p2SZLq-L-78S7azym~!@dqZ8xbp|*RqwfWI`q!D^8&Ul(KxZi=R0&F!$x3o&9Cgj6}+g;_^*r}3DpAw^_rQqMonp1I?u!{Bbi7l%jO2dJHNo~gODDT%dtv1-7` zm~oD>58fHDwu~%0p1g5NG5otpYk<^CN`@S=IXUolTQ#~p;s|$8>+OmYhJuf+hN#LO zUe=0v6D^R;U*2^m=u^SAtD(W)a%hz*F;|~&cmx)7U6Z5cSnH?In*-=G$JupH7G&Q&8ac?wnbg> zc*W6w_{vmye0x;f#7AgdcB4G|NireLI{RCRAX6k(jS3WkbGXa)hY~;|m+3Z< zj}1;R&~PThv|S!%orjkn!`8&Hz+-n~_LDTltddT3mvw;yAo;Z&8-p_4%IOl1haPk&>m1zqcwmX)2&beeAY3#przmMBMSx7hvq<54)E zZYkTSFZbDDS{Axjs%M6+p59CXlos12rT0dQOts@l&TS=deuLkIgJZo8fK~D%|NO&| z_tAdaHohbr%xzZX-aFs4c@urlGsB@t^olZuVw*)X5u~6z?>-dZj ztt4Un^G#Z+OI@bcF-l}sNl5%18~TqI^=b4^9M%mF5)I;oPA*Ml>l~6t86I&P#qSZH znoYX}{MWJO{?yMqiTpHIK)2}At-X)MY7diK9ZBw+b3@^=`M&M>XBJl0Td9!0MAprl zH9e3awF*7r;>Pp?UxzH4ZTp!#j+g!z(qz_z&K6myPNtn&90#6H#SJc&Mx?JBd3{39MNvD9i`4({de8_gHTaoyeDs`fg3wB&J$Tz8Z*`MQl@ zmv^Oqd1{#);lp`abfek5-Dj@6MQbb2Pv@6rs!H(zD5v|De46}+BS(02#CYVz>;5mu z19QOWi#9VTSrD?GlzTHvB9tN@)t@`=P`e$z-2xbs5cN?^vZ(#Hr-Kf-$p^|L zT~kCeoaPdqh+{J|Joq*=lwz33$knEOkV(1X7$_ROny$faNRJJvqJwyz*W^1SL%a$3^01thHkST9R|jJ2f8Mxx1l z2~{LbFLS2qSJ28utfD*eEw>O#C2PDxPd_zi(Zn}okc@?=8Ee39;vZ#S0nR+%VnWan zaz7a=%_?BQw&BKK)tD{n{5*>@rtfm1_8RyloPm_-$f;J4B@3Sl(*s7@!ACosXTAU112a# zlEvf=WLQNuC8%G9hS8-aiCr#OUr}SgRu2{2eH)Bwj)17y_i^fXjSUI^SbXy(3}mjk zwJg2pMk;UTv&djg%|tZ;N+j{K6{lbth{Hg0`c-{z)LCbfl4z*=Qi!yj{|)>buba_C zyj1TV>T@jtf0TP;bdoBZf1i!PjUf$rRe_Soc#4bKLB)=RO$hsJ{qh`Yz4B4C_DB_y6enej$ePR_WG{bLAC%#zmLr!^Wv;Ap@d z6QT5gm{uaikm&c1Vry}(V@8i}-N0}AWsOZ?e%A~y**-BBa5woUOSK5fDam5K>qH5N zZ}{or0mlX1h{y!A1vjtFXw;>kcV578Lu#c{?Zc}mB#$YV9jD>4*rmH=D;H&rvW(-j^R<2K2AJLWMcClT>> Suggestion for Experiment {} has been initialized.\n".format( - self.experiment_name)) - - def _get_experiment_param(self): - # this function need to - # 1) get the number of layers - # 2) get the I/O size - # 3) get the available operations - # 4) get the optimization direction (i.e. minimize or maximize) - # 5) get the objective name - # 6) get the algorithm settings - - # Get Search Space - self.opt_direction = self.experiment.spec.objective.type - self.objective_name = self.experiment.spec.objective.objective_metric_name - - nas_config = self.experiment.spec.nas_config - - graph_config = nas_config.graph_config - self.num_layers = int(graph_config.num_layers) - self.input_sizes = list(map(int, graph_config.input_sizes)) - self.output_sizes = list(map(int, graph_config.output_sizes)) - - search_space_raw = nas_config.operations - search_space_object = SearchSpace(search_space_raw) - self.search_space = search_space_object.search_space - self.num_operations = search_space_object.num_operations - - self.print_search_space() - - # Get Experiment Algorithm Settings - settings_raw = self.experiment.spec.algorithm.algorithm_setting - self.algorithm_settings = parseAlgorithmSettings(settings_raw) - - self.print_algorithm_settings() - - def _setup_controller(self): - - with self.tf_graph.as_default(): - - self.controller = Controller( - num_layers=self.num_layers, - num_operations=self.num_operations, - controller_hidden_size=self.algorithm_settings['controller_hidden_size'], - controller_temperature=self.algorithm_settings['controller_temperature'], - controller_tanh_const=self.algorithm_settings['controller_tanh_const'], - controller_entropy_weight=self.algorithm_settings['controller_entropy_weight'], - controller_baseline_decay=self.algorithm_settings['controller_baseline_decay'], - controller_learning_rate=self.algorithm_settings["controller_learning_rate"], - controller_skip_target=self.algorithm_settings['controller_skip_target'], - controller_skip_weight=self.algorithm_settings['controller_skip_weight'], - controller_name="Ctrl_" + self.experiment_name, - logger=self.logger) - - self.controller.build_trainer() - - def print_search_space(self): - if self.search_space is None: - self.logger.warning( - "Error! The Suggestion has not yet been initialized!") - return - - self.logger.info( - ">>> Search Space for Experiment {}".format(self.experiment_name)) - for opt in self.search_space: - opt.print_op(self.logger) - self.logger.info( - "There are {} operations in total.\n".format(self.num_operations)) - - def print_algorithm_settings(self): - if self.algorithm_settings is None: - self.logger.warning( - "Error! The Suggestion has not yet been initialized!") - return - - self.logger.info(">>> Parameters of LSTM Controller for Experiment {}\n".format( - self.experiment_name)) - for spec in self.algorithm_settings: - if len(spec) > 22: - self.logger.info("{}:\t{}".format( - spec, self.algorithm_settings[spec])) - else: - self.logger.info("{}:\t\t{}".format( - spec, self.algorithm_settings[spec])) - - self.logger.info("") - - -class EnasService(api_pb2_grpc.SuggestionServicer, HealthServicer): - def __init__(self, logger=None): - super(EnasService, self).__init__() - self.is_first_run = True - self.experiment = None - if logger == None: - self.logger = getLogger(__name__) - FORMAT = '%(asctime)-15s Experiment %(experiment_name)s %(message)s' - logging.basicConfig(format=FORMAT) - handler = StreamHandler() - handler.setLevel(INFO) - self.logger.setLevel(INFO) - self.logger.addHandler(handler) - self.logger.propagate = False - else: - self.logger = logger - - if not os.path.exists("ctrl_cache/"): - os.makedirs("ctrl_cache/") - - def ValidateAlgorithmSettings(self, request, context): - self.logger.info("Validate Algorithm Settings start") - graph_config = request.experiment.spec.nas_config.graph_config - - # Validate GraphConfig - # Check InputSize - if not graph_config.input_sizes: - return self.SetValidateContextError(context, "Missing InputSizes in GraphConfig:\n{}".format(graph_config)) - - # Check OutputSize - if not graph_config.output_sizes: - return self.SetValidateContextError(context, "Missing OutputSizes in GraphConfig:\n{}".format(graph_config)) - - # Check NumLayers - if not graph_config.num_layers: - return self.SetValidateContextError(context, "Missing NumLayers in GraphConfig:\n{}".format(graph_config)) - - # Validate each operation - operations_list = list( - request.experiment.spec.nas_config.operations.operation) - for operation in operations_list: - - # Check OperationType - if not operation.operation_type: - return self.SetValidateContextError(context, "Missing operationType in Operation:\n{}".format(operation)) - - # Check ParameterConfigs - if not operation.parameter_specs.parameters: - return self.SetValidateContextError(context, "Missing ParameterConfigs in Operation:\n{}".format(operation)) - - # Validate each ParameterConfig in Operation - parameters_list = list(operation.parameter_specs.parameters) - for parameter in parameters_list: - - # Check Name - if not parameter.name: - return self.SetValidateContextError(context, "Missing Name in ParameterConfig:\n{}".format(parameter)) - - # Check ParameterType - if not parameter.parameter_type: - return self.SetValidateContextError(context, "Missing ParameterType in ParameterConfig:\n{}".format(parameter)) - - # Check List in Categorical or Discrete Type - if parameter.parameter_type == api_pb2.CATEGORICAL or parameter.parameter_type == api_pb2.DISCRETE: - if not parameter.feasible_space.list: - return self.SetValidateContextError(context, "Missing List in ParameterConfig.feasibleSpace:\n{}".format(parameter)) - - # Check Max, Min, Step in Int or Double Type - elif parameter.parameter_type == api_pb2.INT or parameter.parameter_type == api_pb2.DOUBLE: - if not parameter.feasible_space.min and not parameter.feasible_space.max: - return self.SetValidateContextError(context, "Missing Max and Min in ParameterConfig.feasibleSpace:\n{}".format(parameter)) - - if parameter.parameter_type == api_pb2.DOUBLE and (not parameter.feasible_space.step or float(parameter.feasible_space.step) <= 0): - return self.SetValidateContextError(context, "Step parameter should be > 0 in ParameterConfig.feasibleSpace:\n{}".format(parameter)) - - # Validate Algorithm Settings - settings_raw = request.experiment.spec.algorithm.algorithm_setting - for setting in settings_raw: - if setting.name in algorithmSettingsValidator.keys(): - if setting.name in enableNoneSettingsList and setting.value == "None": - continue - setting_type = algorithmSettingsValidator[setting.name][0] - setting_range = algorithmSettingsValidator[setting.name][1] - try: - converted_value = setting_type(setting.value) - except: - return self.SetValidateContextError(context, "Algorithm Setting {} must be {} type".format(setting.name, setting_type.__name__)) - - if setting_type == float: - if converted_value <= setting_range[0] or (setting_range[1] != 'inf' and converted_value > setting_range[1]): - return self.SetValidateContextError(context, "Algorithm Setting {}: {} with {} type must be in range ({}, {}]".format( - setting.name, converted_value, setting_type.__name__, setting_range[0], setting_range[1] - )) - - elif converted_value < setting_range[0]: - return self.SetValidateContextError(context, "Algorithm Setting {}: {} with {} type must be in range [{}, {})".format( - setting.name, converted_value, setting_type.__name__, setting_range[0], setting_range[1] - )) - else: - return self.SetValidateContextError(context, "Unknown Algorithm Setting name: {}".format(setting.name)) - - self.logger.info("All Experiment Settings are Valid") - return api_pb2.ValidateAlgorithmSettingsReply() - - def SetValidateContextError(self, context, error_message): - context.set_code(grpc.StatusCode.INVALID_ARGUMENT) - context.set_details(error_message) - self.logger.info(error_message) - return api_pb2.ValidateAlgorithmSettingsReply() - - def GetSuggestions(self, request, context): - if self.is_first_run: - self.experiment = EnasExperiment(request, self.logger) - experiment = self.experiment - if request.request_number > 0: - experiment.num_trials = request.request_number - self.logger.info("-" * 100 + "\nSuggestion Step {} for Experiment {}\n".format( - experiment.suggestion_step, experiment.experiment_name) + "-" * 100) - - self.logger.info("") - self.logger.info(">>> RequestNumber:\t\t{}".format(experiment.num_trials)) - self.logger.info("") - - with experiment.tf_graph.as_default(): - saver = tf.compat.v1.train.Saver() - ctrl = experiment.controller - - controller_ops = { - "loss": ctrl.loss, - "entropy": ctrl.sample_entropy, - "grad_norm": ctrl.grad_norm, - "baseline": ctrl.baseline, - "skip_rate": ctrl.skip_rate, - "train_op": ctrl.train_op, - "train_step": ctrl.train_step, - "sample_arc": ctrl.sample_arc, - "child_val_accuracy": ctrl.child_val_accuracy, - } - - if self.is_first_run: - self.logger.info(">>> First time running suggestion for {}. Random architecture will be given.".format( - experiment.experiment_name)) - with tf.compat.v1.Session() as sess: - sess.run(tf.compat.v1.global_variables_initializer()) - candidates = list() - for _ in range(experiment.num_trials): - candidates.append( - sess.run(controller_ops["sample_arc"])) - - # TODO: will use PVC to store the checkpoint to protect against unexpected suggestion pod restart - saver.save(sess, experiment.ctrl_cache_file) - - self.is_first_run = False - - else: - with tf.compat.v1.Session() as sess: - saver.restore(sess, experiment.ctrl_cache_file) - - result = self.GetEvaluationResult(request.trials) - - # TODO: (andreyvelich) I deleted this part, should it be handle by controller? - # Sometimes training container may fail and GetEvaluationResult() will return None - # In this case, the Suggestion will: - # 1. Firstly try to respawn the previous trials after waiting for RESPAWN_SLEEP seconds - # 2. If respawning the trials for RESPAWN_LIMIT times still cannot collect valid results, - # then fail the task because it may indicate that the training container has errors. - if result is None: - self.logger.warning( - ">>> Suggestion has spawned trials, but they all failed.") - self.logger.warning( - ">>> Please check whether the training container is correctly implemented") - self.logger.info(">>> Experiment {} failed".format( - experiment.experiment_name)) - return [] - - # This LSTM network is designed to maximize the metrics - # However, if the user wants to minimize the metrics, we can take the negative of the result - - if experiment.opt_direction == api_pb2.MINIMIZE: - result = -result - - self.logger.info(">>> Suggestion updated. LSTM Controller Training\n") - log_every = experiment.algorithm_settings["controller_log_every_steps"] - for ctrl_step in range(1, experiment.algorithm_settings["controller_train_steps"]+1): - run_ops = [ - controller_ops["loss"], - controller_ops["entropy"], - controller_ops["grad_norm"], - controller_ops["baseline"], - controller_ops["skip_rate"], - controller_ops["train_op"] - ] - - loss, entropy, grad_norm, baseline, skip_rate, _ = sess.run( - fetches=run_ops, - feed_dict={controller_ops["child_val_accuracy"]: result}) - - controller_step = sess.run(controller_ops["train_step"]) - if ctrl_step % log_every == 0: - log_string = "" - log_string += "Controller Step: {} - ".format(controller_step) - log_string += "Loss: {:.4f} - ".format(loss) - log_string += "Entropy: {:.9} - ".format(entropy) - log_string += "Gradient Norm: {:.7f} - ".format(grad_norm) - log_string += "Baseline={:.4f} - ".format(baseline) - log_string += "Skip Rate={:.4f}".format(skip_rate) - self.logger.info(log_string) - - candidates = list() - for _ in range(experiment.num_trials): - candidates.append( - sess.run(controller_ops["sample_arc"])) - - saver.save(sess, experiment.ctrl_cache_file) - - organized_candidates = list() - parameter_assignments = list() - - for i in range(experiment.num_trials): - arc = candidates[i].tolist() - organized_arc = [0 for _ in range(experiment.num_layers)] - record = 0 - for l in range(experiment.num_layers): - organized_arc[l] = arc[record: record + l + 1] - record += l + 1 - organized_candidates.append(organized_arc) - - nn_config = dict() - nn_config['num_layers'] = experiment.num_layers - nn_config['input_sizes'] = experiment.input_sizes - nn_config['output_sizes'] = experiment.output_sizes - nn_config['embedding'] = dict() - for l in range(experiment.num_layers): - opt = organized_arc[l][0] - nn_config['embedding'][opt] = experiment.search_space[opt].get_dict() - - organized_arc_json = json.dumps(organized_arc) - nn_config_json = json.dumps(nn_config) - - organized_arc_str = str(organized_arc_json).replace('\"', '\'') - nn_config_str = str(nn_config_json).replace('\"', '\'') - - self.logger.info( - "\n>>> New Neural Network Architecture Candidate #{} (internal representation):".format(i)) - self.logger.info(organized_arc_json) - self.logger.info("\n>>> Corresponding Seach Space Description:") - self.logger.info(nn_config_str) - - parameter_assignments.append( - api_pb2.GetSuggestionsReply.ParameterAssignments( - assignments=[ - api_pb2.ParameterAssignment( - name="architecture", - value=organized_arc_str - ), - api_pb2.ParameterAssignment( - name="nn_config", - value=nn_config_str - ) - ] - ) - ) - - self.logger.info("") - self.logger.info(">>> {} Trials were created for Experiment {}".format( - experiment.num_trials, experiment.experiment_name)) - self.logger.info("") - - experiment.suggestion_step += 1 - - return api_pb2.GetSuggestionsReply(parameter_assignments=parameter_assignments) - - def GetEvaluationResult(self, trials_list): - completed_trials = dict() - failed_trials = [] - for t in trials_list: - if t.status.condition == api_pb2.TrialStatus.TrialConditionType.SUCCEEDED: - target_value = None - for metric in t.status.observation.metrics: - if metric.name == t.spec.objective.objective_metric_name: - target_value = metric.value - break - - # Take only the first metric value - # In current cifar-10 training container this value is the latest - completed_trials[t.name] = float(target_value) - - if t.status.condition == api_pb2.TrialStatus.TrialConditionType.FAILED: - failed_trials.append(t.name) - - n_completed = len(completed_trials) - self.logger.info(">>> By now: {} Trials succeeded, {} Trials failed".format( - n_completed, len(failed_trials))) - for tname in completed_trials: - self.logger.info("Trial: {}, Value: {}".format( - tname, completed_trials[tname])) - for tname in failed_trials: - self.logger.info("Trial: {} was failed".format(tname)) - - if n_completed > 0: - avg_metrics = sum(completed_trials.values()) / n_completed - self.logger.info("The average is {}\n".format(avg_metrics)) - - return avg_metrics diff --git a/pkg/suggestion/v1alpha3/skopt/__init__.py b/pkg/suggestion/v1alpha3/skopt/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/pkg/suggestion/v1alpha3/skopt/base_service.py b/pkg/suggestion/v1alpha3/skopt/base_service.py deleted file mode 100644 index 29f0c57cd2b..00000000000 --- a/pkg/suggestion/v1alpha3/skopt/base_service.py +++ /dev/null @@ -1,127 +0,0 @@ -import datetime -import logging -import skopt - -from pkg.suggestion.v1alpha3.internal.constant import INTEGER, DOUBLE, CATEGORICAL, DISCRETE, MAX_GOAL -from pkg.suggestion.v1alpha3.internal.trial import Assignment - -logger = logging.getLogger(__name__) - - -class BaseSkoptService(object): - """ - Refer to https://github.com/scikit-optimize/scikit-optimize . - """ - - def __init__(self, - base_estimator="GP", - n_initial_points=10, - acq_func="gp_hedge", - acq_optimizer="auto", - random_state=None, - search_space=None): - self.base_estimator = base_estimator - self.n_initial_points = n_initial_points - self.acq_func = acq_func - self.acq_optimizer = acq_optimizer - self.random_state = random_state - self.search_space = search_space - self.skopt_optimizer = None - self.create_optimizer() - self.succeeded_trials = 0 - # List of recorded Trials names - self.recorded_trials_names = [] - - def create_optimizer(self): - skopt_search_space = [] - - for param in self.search_space.params: - if param.type == INTEGER: - skopt_search_space.append(skopt.space.Integer( - int(param.min), int(param.max), name=param.name)) - elif param.type == DOUBLE: - skopt_search_space.append(skopt.space.Real( - float(param.min), float(param.max), "log-uniform", name=param.name)) - elif param.type == CATEGORICAL or param.type == DISCRETE: - skopt_search_space.append( - skopt.space.Categorical(param.list, name=param.name)) - - self.skopt_optimizer = skopt.Optimizer( - skopt_search_space, - base_estimator=self.base_estimator, - n_initial_points=self.n_initial_points, - acq_func=self.acq_func, - acq_optimizer=self.acq_optimizer, - random_state=self.random_state) - - def getSuggestions(self, trials, request_number): - """ - Get the new suggested trials with skopt algorithm. - """ - logger.info("-" * 100 + "\n") - logger.info("New GetSuggestions call\n") - skopt_suggested = [] - loss_for_skopt = [] - if len(trials) > self.succeeded_trials or self.succeeded_trials == 0: - self.succeeded_trials = len(trials) - if self.succeeded_trials != 0: - logger.info("Succeeded Trials changed: {}\n".format(self.succeeded_trials)) - for trial in trials: - if trial.name not in self.recorded_trials_names: - self.recorded_trials_names.append(trial.name) - trial_assignment = [] - for param in self.search_space.params: - parameter_value = None - for assignment in trial.assignments: - if assignment.name == param.name: - parameter_value = assignment.value - break - if param.type == INTEGER: - trial_assignment.append(int(parameter_value)) - elif param.type == DOUBLE: - trial_assignment.append(float(parameter_value)) - else: - trial_assignment.append(parameter_value) - skopt_suggested.append(trial_assignment) - loss_value = float(trial.target_metric.value) - if self.search_space.goal == MAX_GOAL: - loss_value = -1 * loss_value - loss_for_skopt.append(loss_value) - - if loss_for_skopt != [] and skopt_suggested != []: - logger.info("Running Optimizer tell to record observation") - logger.info("Evaluated parameters: {}".format(skopt_suggested)) - logger.info("Objective values: {}\n".format(loss_for_skopt)) - t1 = datetime.datetime.now() - self.skopt_optimizer.tell(skopt_suggested, loss_for_skopt) - logger.info("Optimizer tell method takes {} seconds".format((datetime.datetime.now()-t1).seconds)) - logger.info("List of recorded Trials names: {}\n".format(self.recorded_trials_names)) - - else: - logger.info("Succeeded Trials didn't change: {}\n".format(self.succeeded_trials)) - - logger.info("Running Optimizer ask to query new parameters for Trials\n") - - return_trial_list = [] - - for i in range(request_number): - skopt_suggested = self.skopt_optimizer.ask() - logger.info("New suggested parameters for Trial: {}".format(skopt_suggested)) - return_trial_list.append( - BaseSkoptService.convert(self.search_space, skopt_suggested)) - - logger.info("GetSuggestions return {} new Trials\n\n".format(request_number)) - return return_trial_list - - @staticmethod - def convert(search_space, skopt_suggested): - assignments = [] - for i in range(len(search_space.params)): - param = search_space.params[i] - if param.type == INTEGER: - assignments.append(Assignment(param.name, skopt_suggested[i])) - elif param.type == DOUBLE: - assignments.append(Assignment(param.name, skopt_suggested[i])) - elif param.type == CATEGORICAL or param.type == DISCRETE: - assignments.append(Assignment(param.name, skopt_suggested[i])) - return assignments diff --git a/pkg/suggestion/v1alpha3/skopt/service.py b/pkg/suggestion/v1alpha3/skopt/service.py deleted file mode 100644 index edc3a24bc68..00000000000 --- a/pkg/suggestion/v1alpha3/skopt/service.py +++ /dev/null @@ -1,74 +0,0 @@ -import logging - -from pkg.apis.manager.v1alpha3.python import api_pb2 -from pkg.apis.manager.v1alpha3.python import api_pb2_grpc -from pkg.suggestion.v1alpha3.internal.search_space import HyperParameterSearchSpace -from pkg.suggestion.v1alpha3.internal.trial import Trial, Assignment -from pkg.suggestion.v1alpha3.skopt.base_service import BaseSkoptService -from pkg.suggestion.v1alpha3.internal.base_health_service import HealthServicer - - -logger = logging.getLogger(__name__) - - -class SkoptService(api_pb2_grpc.SuggestionServicer, HealthServicer): - - def __init__(self): - super(SkoptService, self).__init__() - self.base_service = None - self.is_first_run = True - - def GetSuggestions(self, request, context): - """ - Main function to provide suggestion. - """ - algorithm_name, config = OptimizerConfiguration.convertAlgorithmSpec( - request.experiment.spec.algorithm) - if algorithm_name != "bayesianoptimization": - raise Exception("Failed to create the algorithm: {}".format(algorithm_name)) - - if self.is_first_run: - search_space = HyperParameterSearchSpace.convert(request.experiment) - self.base_service = BaseSkoptService( - base_estimator=config.base_estimator, - n_initial_points=config.n_initial_points, - acq_func=config.acq_func, - acq_optimizer=config.acq_optimizer, - random_state=config.random_state, - search_space=search_space) - self.is_first_run = False - - trials = Trial.convert(request.trials) - new_trials = self.base_service.getSuggestions(trials, request.request_number) - return api_pb2.GetSuggestionsReply( - parameter_assignments=Assignment.generate(new_trials) - ) - - -class OptimizerConfiguration(object): - def __init__(self, base_estimator="GP", - n_initial_points=10, - acq_func="gp_hedge", - acq_optimizer="auto", - random_state=None): - self.base_estimator = base_estimator - self.n_initial_points = n_initial_points - self.acq_func = acq_func - self.acq_optimizer = acq_optimizer - self.random_state = random_state - - @staticmethod - def convertAlgorithmSpec(algorithm_spec): - optimizer = OptimizerConfiguration() - for s in algorithm_spec.algorithm_setting: - if s.name == "base_estimator": - optimizer.base_estimator = s.value - elif s.name == "n_initial_points": - optimizer.n_initial_points = int(s.value) - elif s.name == "acq_func": - optimizer.acq_func = s.value - elif s.name == "acq_optimizer": - optimizer.acq_optimizer = s.value - elif s.name == "random_state": - optimizer.random_state = int(s.value) - return algorithm_spec.algorithm_name, optimizer diff --git a/pkg/ui/v1alpha3/README.md b/pkg/ui/v1alpha3/README.md deleted file mode 100755 index cce5150e697..00000000000 --- a/pkg/ui/v1alpha3/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# Katib User Interface - -This is the source code for the Katib UI. Current version of Katib UI is v1alpha3. On the official Kubeflow website [here](https://www.kubeflow.org/docs/components/hyperparameter-tuning/experiment/#running-the-experiment-from-the-katib-ui) you can find information how to use Katib UI. -We are using [React](https://reactjs.org/) framework to create frontend and Go as a backend. - -We are using [Material UI](https://material-ui.com/) to design frontend. Try to use Material UI components to implement new Katib UI features. - -## Folder structure - -1. `Dockerfile` and file to serve the UI `main.go` you can find under [cmd/ui/v1alpha3](https://github.com/kubeflow/katib/tree/master/cmd/ui/v1alpha3). - -2. Go backend you can find under [pkg/ui/v1alpha3](https://github.com/kubeflow/katib/tree/master/pkg/ui/v1alpha3). - -3. React frontend you can find under [pkg/ui/v1alpha3/frontend](https://github.com/kubeflow/katib/tree/master/pkg/ui/v1alpha3/frontend). - -## Requirements - -To make changes to the UI you need to install: - -- Tools, defined [here](https://github.com/kubeflow/katib/blob/master/docs/developer-guide.md#requirements). - -- `Node` (10.13 or later) and `npm` (6.13 or later). You can find [here](https://nodejs.org/en/download/) how to download it. - -## Development - -While development you have different ways to run Katib UI. - -### First time - -1. Clone the repository. - -2. Go to `/frontend` folder. - -3. Run `npm install` to install all dependencies. - -It will create `/frontend/node_modules` folder with all dependencies from `package.json`. If you want to add new package, edit `/frontend/package.json` file with new dependency. - -### Start frontend server - -If you want to edit only frontend without connection to the backend, you can start frontend server in your local environment. For it, run `npm run start` under `/frontend` folder. You can access the UI using this URL: `http://localhost:3000/`. - -### Serve UI frontend and backend - -You can serve Katib UI locally. To make it you need to follow these steps: - -1. Run `npm run build` under `/frontend` folder. It will create `/frontend/build` directory with optimized production build. - -2. Go to `cmd/ui/v1alpha3`. - -3. Run `main.go` file with appropriate flags. For example, if you clone Katib repository to `/home` folder, run this command: - -``` -go run main.go --build-dir=/home/katib/pkg/ui/v1alpha3/frontend/build --port=8080 -``` - -After that, you can access the UI using this URL: `http://localhost:8080/katib/`. - -## Production - -To run Katib UI in Production, after all changes in frontend and backend, you need to create an image for the UI. Under `katib` repository run this: `docker build . -f cmd/ui/v1alpha3/Dockerfile -t ` to build image. You can modify UI [deployment](https://github.com/kubeflow/katib/blob/master/manifests/v1alpha3/ui/deployment.yaml#L24) with your new image. After this, follow [these steps](https://www.kubeflow.org/docs/components/hyperparameter-tuning/hyperparameter/#accessing-the-katib-ui) to access Katib UI. - -## Code style - -To make frontend code consistent and easy to review we use [Prettier](https://prettier.io/). You can find Prettier config [here](https://github.com/kubeflow/katib/tree/master/pkg/ui/v1alpha3/frontend/.prettierrc.yaml). -Check [here](https://prettier.io/docs/en/install.html), how to install Prettier CLI to check and format your code. - -### IDE integration - -For VSCode you can install plugin: "Prettier - Code formatter" and it will pick Prettier config automatically. - -You can edit [settings.json](https://code.visualstudio.com/docs/getstarted/settings#_settings-file-locations) file for VSCode to autoformat on save. - -```json - "settings": { - "editor.formatOnSave": true - } -``` - -For others IDE see [this](https://prettier.io/docs/en/editors.html). - -### Check and format code - -Before submitting PR check and format your code. To check your code run `npm run format:check` under `/frontend` folder. To format your code run `npm run format:write` under `/frontend` folder. -If all files formatted you can submit the PR. - -If you don't want to format some code, [here](https://prettier.io/docs/en/ignore.html) is an instruction how to disable Prettier. diff --git a/pkg/ui/v1alpha3/backend.go b/pkg/ui/v1alpha3/backend.go deleted file mode 100644 index 01a022f685a..00000000000 --- a/pkg/ui/v1alpha3/backend.go +++ /dev/null @@ -1,291 +0,0 @@ -package v1alpha3 - -import ( - "encoding/json" - "log" - "net/http" - - "github.com/ghodss/yaml" - "google.golang.org/grpc" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/controller-runtime/pkg/client" - - experimentv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - api_pb_v1alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" - common_v1alpha3 "github.com/kubeflow/katib/pkg/common/v1alpha3" - "github.com/kubeflow/katib/pkg/util/v1alpha3/katibclient" -) - -func NewKatibUIHandler() *KatibUIHandler { - kclient, err := katibclient.NewClient(client.Options{}) - if err != nil { - log.Printf("NewClient for Katib failed: %v", err) - panic(err) - } - return &KatibUIHandler{ - katibClient: kclient, - } -} - -func (k *KatibUIHandler) connectManager() (*grpc.ClientConn, api_pb_v1alpha3.ManagerClient) { - conn, err := grpc.Dial(common_v1alpha3.GetDBManagerAddr(), grpc.WithInsecure()) - if err != nil { - log.Printf("Dial to GRPC failed: %v", err) - return nil, nil - } - c := api_pb_v1alpha3.NewManagerClient(conn) - return conn, c -} - -func (k *KatibUIHandler) SubmitYamlJob(w http.ResponseWriter, r *http.Request) { - //enableCors(&w) - var data map[string]interface{} - - json.NewDecoder(r.Body).Decode(&data) - - job := experimentv1alpha3.Experiment{} - if yamlContent, ok := data["yaml"].(string); ok { - err := yaml.Unmarshal([]byte(yamlContent), &job) - if err != nil { - log.Printf("Unmarshal YAML content failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - err = k.katibClient.CreateExperiment(&job) - if err != nil { - log.Printf("CreateExperiment from YAML failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - } - -} - -func (k *KatibUIHandler) SubmitParamsJob(w http.ResponseWriter, r *http.Request) { - //enableCors(&w) - var data map[string]interface{} - - json.NewDecoder(r.Body).Decode(&data) - if data, ok := data["postData"]; ok { - jsonbody, err := json.Marshal(data) - if err != nil { - log.Printf("Marshal data for HP job failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - job := experimentv1alpha3.Experiment{} - if err := json.Unmarshal(jsonbody, &job); err != nil { - log.Printf("Unmarshal HP job failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - dataMap := data.(map[string]interface{}) - job.TypeMeta = metav1.TypeMeta{ - APIVersion: "kubeflow.org/v1alpha3", - Kind: "Experiment", - } - job.ObjectMeta = metav1.ObjectMeta{ - Name: dataMap["metadata"].(map[string]interface{})["name"].(string), - Namespace: dataMap["metadata"].(map[string]interface{})["namespace"].(string), - } - err = k.katibClient.CreateExperiment(&job) - if err != nil { - log.Printf("CreateExperiment for HP failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - } -} - -func (k *KatibUIHandler) DeleteExperiment(w http.ResponseWriter, r *http.Request) { - experimentName := r.URL.Query()["experimentName"][0] - namespace := r.URL.Query()["namespace"][0] - - experiment, err := k.katibClient.GetExperiment(experimentName, namespace) - if err != nil { - log.Printf("GetExperiment failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - err = k.katibClient.DeleteExperiment(experiment) - if err != nil { - log.Printf("DeleteExperiment failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} - -// FetchTrialTemplates gets all trial templates in all namespaces -func (k *KatibUIHandler) FetchTrialTemplates(w http.ResponseWriter, r *http.Request) { - - trialTemplatesViewList, err := k.getTrialTemplatesViewList() - if err != nil { - log.Printf("getTrialTemplatesViewList failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - TrialTemplatesResponse := TrialTemplatesResponse{ - Data: trialTemplatesViewList, - } - response, err := json.Marshal(TrialTemplatesResponse) - if err != nil { - log.Printf("Marshal templates failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Write(response) -} - -//AddTemplate adds template to ConfigMap -//TODO: Add functionality to create new ConfigMap -func (k *KatibUIHandler) AddTemplate(w http.ResponseWriter, r *http.Request) { - var data map[string]interface{} - json.NewDecoder(r.Body).Decode(&data) - - edittedNamespace := data["edittedNamespace"].(string) - edittedConfigMapName := data["edittedConfigMapName"].(string) - edittedName := data["edittedName"].(string) - edittedYaml := data["edittedYaml"].(string) - - newTemplates, err := k.updateTrialTemplates(edittedNamespace, edittedConfigMapName, edittedName, edittedYaml, "", ActionTypeAdd) - if err != nil { - log.Printf("updateTrialTemplates failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - TrialTemplatesResponse := TrialTemplatesResponse{ - Data: newTemplates, - } - response, err := json.Marshal(TrialTemplatesResponse) - if err != nil { - log.Printf("Marhal failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Write(response) - -} - -// EditTemplate edits template in ConfigMap -func (k *KatibUIHandler) EditTemplate(w http.ResponseWriter, r *http.Request) { - - var data map[string]interface{} - json.NewDecoder(r.Body).Decode(&data) - - edittedNamespace := data["edittedNamespace"].(string) - edittedConfigMapName := data["edittedConfigMapName"].(string) - edittedName := data["edittedName"].(string) - edittedYaml := data["edittedYaml"].(string) - currentName := data["currentName"].(string) - - newTemplates, err := k.updateTrialTemplates(edittedNamespace, edittedConfigMapName, edittedName, edittedYaml, currentName, ActionTypeEdit) - if err != nil { - log.Printf("updateTrialTemplates failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - TrialTemplatesResponse := TrialTemplatesResponse{ - Data: newTemplates, - } - response, err := json.Marshal(TrialTemplatesResponse) - if err != nil { - log.Printf("Marhal failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Write(response) -} - -// DeleteTemplate delete template in ConfigMap -// TODO: Add functionality to delete configMap if there is no templates -func (k *KatibUIHandler) DeleteTemplate(w http.ResponseWriter, r *http.Request) { - - var data map[string]interface{} - json.NewDecoder(r.Body).Decode(&data) - - edittedNamespace := data["edittedNamespace"].(string) - edittedConfigMapName := data["edittedConfigMapName"].(string) - edittedName := data["edittedName"].(string) - - newTemplates, err := k.updateTrialTemplates(edittedNamespace, edittedConfigMapName, edittedName, "", "", ActionTypeDelete) - if err != nil { - log.Printf("updateTrialTemplates failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - TrialTemplatesResponse := TrialTemplatesResponse{ - Data: newTemplates, - } - - response, err := json.Marshal(TrialTemplatesResponse) - if err != nil { - log.Printf("Marhal failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Write(response) -} - -func (k *KatibUIHandler) FetchNamespaces(w http.ResponseWriter, r *http.Request) { - - // Get all available namespaces - namespaces, err := k.getAvailableNamespaces() - if err != nil { - log.Printf("GetAvailableNamespaces failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - response, err := json.Marshal(namespaces) - if err != nil { - log.Printf("Marshal namespaces failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Write(response) -} - -// FetchExperiment gets experiment in specific namespace. -func (k *KatibUIHandler) FetchExperiment(w http.ResponseWriter, r *http.Request) { - experimentName := r.URL.Query()["experimentName"][0] - namespace := r.URL.Query()["namespace"][0] - - experiment, err := k.katibClient.GetExperiment(experimentName, namespace) - if err != nil { - log.Printf("GetExperiment failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - response, err := json.Marshal(experiment) - if err != nil { - log.Printf("Marshal Experiment failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Write(response) -} - -// FetchSuggestion gets suggestion in specific namespace -func (k *KatibUIHandler) FetchSuggestion(w http.ResponseWriter, r *http.Request) { - suggestionName := r.URL.Query()["suggestionName"][0] - namespace := r.URL.Query()["namespace"][0] - - suggestion, err := k.katibClient.GetSuggestion(suggestionName, namespace) - if err != nil { - log.Printf("GetSuggestion failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - response, err := json.Marshal(suggestion) - if err != nil { - log.Printf("Marshal Suggestion failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Write(response) -} diff --git a/pkg/ui/v1alpha3/frontend/.gitignore b/pkg/ui/v1alpha3/frontend/.gitignore deleted file mode 100755 index 495881eb157..00000000000 --- a/pkg/ui/v1alpha3/frontend/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# package-lock -package-lock.json - -# build -/build diff --git a/pkg/ui/v1alpha3/frontend/.prettierrc.yaml b/pkg/ui/v1alpha3/frontend/.prettierrc.yaml deleted file mode 100644 index 669e14df18c..00000000000 --- a/pkg/ui/v1alpha3/frontend/.prettierrc.yaml +++ /dev/null @@ -1,5 +0,0 @@ -singleQuote: true -printWidth: 100 -trailingComma: all -tabWidth: 2 -arrowParens: avoid diff --git a/pkg/ui/v1alpha3/frontend/config/env.js b/pkg/ui/v1alpha3/frontend/config/env.js deleted file mode 100644 index b0344c5a83e..00000000000 --- a/pkg/ui/v1alpha3/frontend/config/env.js +++ /dev/null @@ -1,93 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const paths = require('./paths'); - -// Make sure that including paths.js after env.js will read .env variables. -delete require.cache[require.resolve('./paths')]; - -const NODE_ENV = process.env.NODE_ENV; -if (!NODE_ENV) { - throw new Error( - 'The NODE_ENV environment variable is required but was not specified.' - ); -} - -// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use -var dotenvFiles = [ - `${paths.dotenv}.${NODE_ENV}.local`, - `${paths.dotenv}.${NODE_ENV}`, - // Don't include `.env.local` for `test` environment - // since normally you expect tests to produce the same - // results for everyone - NODE_ENV !== 'test' && `${paths.dotenv}.local`, - paths.dotenv, -].filter(Boolean); - -// Load environment variables from .env* files. Suppress warnings using silent -// if this file is missing. dotenv will never modify any environment variables -// that have already been set. Variable expansion is supported in .env files. -// https://github.com/motdotla/dotenv -// https://github.com/motdotla/dotenv-expand -dotenvFiles.forEach(dotenvFile => { - if (fs.existsSync(dotenvFile)) { - require('dotenv-expand')( - require('dotenv').config({ - path: dotenvFile, - }) - ); - } -}); - -// We support resolving modules according to `NODE_PATH`. -// This lets you use absolute paths in imports inside large monorepos: -// https://github.com/facebook/create-react-app/issues/253. -// It works similar to `NODE_PATH` in Node itself: -// https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders -// Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored. -// Otherwise, we risk importing Node.js core modules into an app instead of Webpack shims. -// https://github.com/facebook/create-react-app/issues/1023#issuecomment-265344421 -// We also resolve them to make sure all tools using them work consistently. -const appDirectory = fs.realpathSync(process.cwd()); -process.env.NODE_PATH = (process.env.NODE_PATH || '') - .split(path.delimiter) - .filter(folder => folder && !path.isAbsolute(folder)) - .map(folder => path.resolve(appDirectory, folder)) - .join(path.delimiter); - -// Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be -// injected into the application via DefinePlugin in Webpack configuration. -const REACT_APP = /^REACT_APP_/i; - -function getClientEnvironment(publicUrl) { - const raw = Object.keys(process.env) - .filter(key => REACT_APP.test(key)) - .reduce( - (env, key) => { - env[key] = process.env[key]; - return env; - }, - { - // Useful for determining whether we’re running in production mode. - // Most importantly, it switches React into the correct mode. - NODE_ENV: process.env.NODE_ENV || 'development', - // Useful for resolving the correct path to static assets in `public`. - // For example, . - // This should only be used as an escape hatch. Normally you would put - // images into the `src` and `import` them in code to get their paths. - PUBLIC_URL: publicUrl, - } - ); - // Stringify all values so we can feed into Webpack DefinePlugin - const stringified = { - 'process.env': Object.keys(raw).reduce((env, key) => { - env[key] = JSON.stringify(raw[key]); - return env; - }, {}), - }; - - return { raw, stringified }; -} - -module.exports = getClientEnvironment; diff --git a/pkg/ui/v1alpha3/frontend/config/jest/cssTransform.js b/pkg/ui/v1alpha3/frontend/config/jest/cssTransform.js deleted file mode 100644 index 8f65114812a..00000000000 --- a/pkg/ui/v1alpha3/frontend/config/jest/cssTransform.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -// This is a custom Jest transformer turning style imports into empty objects. -// http://facebook.github.io/jest/docs/en/webpack.html - -module.exports = { - process() { - return 'module.exports = {};'; - }, - getCacheKey() { - // The output is always the same. - return 'cssTransform'; - }, -}; diff --git a/pkg/ui/v1alpha3/frontend/config/jest/fileTransform.js b/pkg/ui/v1alpha3/frontend/config/jest/fileTransform.js deleted file mode 100644 index 4ed6bdb005d..00000000000 --- a/pkg/ui/v1alpha3/frontend/config/jest/fileTransform.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -const path = require('path'); - -// This is a custom Jest transformer turning file imports into filenames. -// http://facebook.github.io/jest/docs/en/webpack.html - -module.exports = { - process(src, filename) { - const assetFilename = JSON.stringify(path.basename(filename)); - - if (filename.match(/\.svg$/)) { - return `const React = require('react'); - module.exports = { - __esModule: true, - default: ${assetFilename}, - ReactComponent: React.forwardRef((props, ref) => ({ - $$typeof: Symbol.for('react.element'), - type: 'svg', - ref: ref, - key: null, - props: Object.assign({}, props, { - children: ${assetFilename} - }) - })), - };`; - } - - return `module.exports = ${assetFilename};`; - }, -}; diff --git a/pkg/ui/v1alpha3/frontend/config/paths.js b/pkg/ui/v1alpha3/frontend/config/paths.js deleted file mode 100644 index c24b4dd1f84..00000000000 --- a/pkg/ui/v1alpha3/frontend/config/paths.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; - -const path = require('path'); -const fs = require('fs'); -const url = require('url'); - -// Make sure any symlinks in the project folder are resolved: -// https://github.com/facebook/create-react-app/issues/637 -const appDirectory = fs.realpathSync(process.cwd()); -const resolveApp = relativePath => path.resolve(appDirectory, relativePath); - -const envPublicUrl = process.env.PUBLIC_URL; - -function ensureSlash(inputPath, needsSlash) { - const hasSlash = inputPath.endsWith('/'); - if (hasSlash && !needsSlash) { - return inputPath.substr(0, inputPath.length - 1); - } else if (!hasSlash && needsSlash) { - return `${inputPath}/`; - } else { - return inputPath; - } -} - -const getPublicUrl = appPackageJson => - envPublicUrl || require(appPackageJson).homepage; - -// We use `PUBLIC_URL` environment variable or "homepage" field to infer -// "public path" at which the app is served. -// Webpack needs to know it to put the right - - - - - - - - - - - - - - - - - - Katib UI - - - -
- - - diff --git a/pkg/ui/v1alpha3/frontend/public/logo.png b/pkg/ui/v1alpha3/frontend/public/logo.png deleted file mode 100644 index a0120a540892c8d63fb07ce6a1bd8cc80e29b67e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81189 zcmY&=bwE^G_cn}hB~(&SO1eW)=@^g>X^;j1rI9WvMd>c-?(PnyhEO`Cq#NmmZ_l8< zzwe)W?|9EXd+(Lcde%Dn$-fl8i$R2egoJcgQbI%#3F($05)w)c+JE3roXRnA!M~7g z6~%>-ihhu+fgkAaB-Cw@kO;y5AjCy}n>+}XK#?Rxgp{3-H>YnWB&x)o?Ap$_W>+8R zWO;`g4&sIPe=I`9FZhTZzFK6Yy^%*Rb@zir=~mIU##Mf}H>HrMvU$EI`G?Qp-l-Cd ziPYW)xyMP@wzRPnPi=R4S*+@huV(sgv)j%dyZvx(-Z8XEcAeQLDICX!A|az-!zjG` zR`}VAa%!ADsjhz?+=|^>d3;(fYf|~*;icYGn|q!8_sv z<1_d#a!=?9s%d;&C)d)lqIhlyeP+Oa+ojIJ?IUkFi(^mgy+RDw;7=hzzG8%iqHf4- zAbxyA3)DUB|IMzw%V2P@QmJb6kz~fK`c4=>iCSr&Wxe%Lvg_6yF$&^*!jw>9f^cFX zPQ))4%scgSU)L$Z@bvRk?N z1;fu7n$=QMJ{A*mkL9#P^$er%u>YCdqs`xfZGm-mKi4~&?>dm5;~>QG`-P`>FP70H z;>QE6x!!syA~9L_X7*)9$u_aO?!wFB57OOn)ppIQ3X>|I?9(Us-3a0cLTxxfjEfB4 zo1EAy(@{KIhQzvQ@QmoxN|+;ckXtRBJ-wp#30Z)4y~S2S_7HcB!OfQMq`{UflJjsm zp=B_XbmwYL9Blh?j7g5PojsFt*m@_~`+6_r*D>$UpT)E88x31UsI=HOa%DgZ4bAjy zqd>@Y8)KMl_JE^vfD`6BZs$n#7Vo=VThLi?@X=ARpyS2`VYy#hE#gVE3`VGMbRK>u z1$<9Kmj05o)4PgwS7v3t`wayjo$;YkOVv`V#nlzn?>E{t3AT@N9)3e8pS+(2D%^nu zfp71*0#Q=6h9oX-fGHvOtP&kt%^_guS}VKQ4L*()`P6NYP%9tjz@3{umj zMG5wstA=isE!Pg@)QT+oHjeF7@ta%4M0Ph*HW?g;RL$Ccb}I>|N2Dg?Bu3}i?~k+(4oNVA$;&7v=|Z* zZBf9+Xu}%5clapW<5j}@#vca7(*7RiYP47FEG%*}MWcztybh0aso+8+56weDSI<)< z@qz#7m(#mIC8muOOCvNj5?~FX6FVoBM`DBVypikiog?I!9Y2w-)#@7hWKWdxv-bj2Gk8)rQ z^WZYYC2cixLkX-KTOD7in&LYDCE$8Oa3fGMpa(LHCWKe4GCeNKtu3pQaf4o!zRIj1 znsF4I#bPDj_;Sf%d2s)yD(98O?{sbmd}T^MiUbT}E7-OX*b9^qBKy7FK6CeeaC&jH zI9_Ll4Myi3O1<9iQjR+1ryaH5KazA=BCG|1OHRR*68}9DZgd|po=p?vvYEY4R+hcU z8+92>>9mDvKombbVZHu+1#26w)Ewooe7RwG58?VSX>izvhC(fb9;-YpU)8Q9vWssL z?_s^Ln0#w1>;mbqlls(6yddVL?(e}DKhs4LgwUWI(Eq6&XDtCZ1Nkkl&r9E}qB0Y# zLMtoYym`lyZAhgjQ?GC)_?l&%_~+R3rUY5~AEJmDDhqa;YOp#W0(XXKq&T#93{g#< z#_`3~Jl@blfk{CLVk`$Hr}|&tyIjG{Cv1*WdHnL`tPEgfLY=l9T+T3^6icIhO7YlY zX-WsFqXFN!vKD0Lz}>jU(p%S!D_Jz>+QG712>D=xc>3vgRzF;^Etpm zHaVSflD}ADeBrk?Xqr0H_=%-+vGlFgQjC@WZsE`xppI|$f~$AIuemztbhm6dDGer% znSIg5SM=3f&jS4;f5o#s7GB4x9CusQ`0OAY61X18vB5c^<0kmv$8Vh!_ay_RN`D<@ zt5r2A_KqFboi2VeA>8s6yD6=*)7t6k9M>PK2L%)mglC+vwg~n&MGTR{_bh~NIfsmj zN%^xWin+bQE%mJ~#FKMq&Z{Z578%t*c*KCldp@r|5-cqwa7DCU& zcpk_Xd7^%rsk3e{^z43xr$UHS*9B&EfysqZzjmq{Lax1FA-nAYGyKZ$yw0)?pVu`U zL`>!cM2<#zIr`p1q16j?hUTAqidXBqGSf>;(MK!`gfDx&Kn-8Up{$&@DjsFP z8l^${;==|yi;pZ6w_LFOb*XgK?6Z}xC5J&*2sfrCAg7St{FV>b%_@p%%#8NB4ACiD z@MwO9E!B%LAs&26zy$+^0Ck|yH+TcH^_J56dX{z;Yt%!U zUKH;9df~+gCl8(ma;)Z?#Yd;{JiM=UC)|5BvxR>u@W7Kcehr9IUe`$PPSMD*UwdW! zq`aH?G_GQFOoCFCa6W0U5*zbD=6v^;>#fy5-Sf@w<<*~S^6lV(m0kku`k`S<>lxTp z3o55xyGxRpXqNf@vLf_2YJ17w^GTxE#=FFLrJm{@upDgIEm=X*fP7<}C}CRlgHzlZ_W z`Jk?=nQP>bx_yi+){Se85gN071zrBKrDSdUy~)k>`t5OIHVN#PbSfN~KwrXlT(n3Z z0?~W}q7-fQ#VTQSL?i#H?WM-5M-tkDO3mscnCMt*$2e0w>hwl+DD5b#^LEE#E$9>(tgr3mxbY`y~+Q zyBR{4Pe>4F+WwLTXMcy`7(@LWEEt;(T_0;mPuB}%$zF#qHFbt&n)`*O)3v314I-@Q zKpAMCfKcfzZzY1<`u@H#m(`GnQW{&hXyUaBBc0g(Ax~}5#r@FE2gy%%PYA1vVh?R= zrB0&}`LP9rD|XK3eqdKLlKVLpret^wO34x8%>p!jubwtR@r(I!mxH-Fc zR@v_XH*6W;jQVxN2dF@cI(ouN`z7J*`#XwFI^j>WllBSQP|5qnTOO3_bbepqEKanS zOV)lL0Cpe`^#UjT&p6=&_;GOmfy392BduvFk791uHPLsyvY)+t9|CPchxtypl{&4g zR2RqY%QtBgk9`D>pD;j$m$Nx6C_JGv=z+YhZq93=gCShObutY6%sZ^1n8JFGkqz7* zh2%P-8YqNqg_5YhFaV{c8Mj6C^wIriHa6tAD=R8kY)?8xW@Sb=|3JUd; zfG(}>M{T^5Mbi%Z7o@26yIRa}5oLk3ae5>GtbU@CZ?+lwNm^JO!TtIv#?E@}Ym_qV z$64APy-h><8dl?_4!@+;Mdp>^DzO4MXYXj#MjyPQ5PFG9Jd=|?u(3qAbYX5_Edcq% zOiuNN#pZI>e9icDIiQ+(N*hL?#S1pW=V6U>s*B3ZjQk$|y;FLNZ z&$K#%7@g@!{f0M_c_C`|t>fjpbN;s#E)xW$03Lglz!Tl!kA60gceGNDE`o;A+RqdX z5{xuV$6aU0?*gxVjhwFIYi2(&+Nn93=R@c~E#RvLUwVN*cUQuFMy&_~8Rb9hFAc9> zXe*1eM(-V7Q#PX{BHuG2gd3RNFvr8^^-eu;KdqEZRi^r~OfcczB?YcZ?>q_8`z$JL z!F%)fe*Rk2A++wwQsacDGsr|DNM87;y-M9}%{9)4o4iXX&Upy%3DX5GebHF0^$_k` z#;;2CBW);?Bd9l(_N0sPAAlr(A9??kOl&~aG}p#)?Vtf7LS`@lI9~Li6R6_{nv6!3 zwXwCbhX!sb=F)DPf5I9UsVI_H69lW{b)xQgmBSA=H^<-naI@I}a;Y8-O-x-6h?-MhJa^Q}|!{ z51{IjCL=zT4y+MzepEL5jH}NfXm>!aJNp#u=8>Z%UcAvO!@a3Y$>C$s1-QutfaQ6a~$v}S(-kBoHafhA)wKD&aGAW9HC zdZt~)`*7&dye2U@nEgc3$9mZEl`!W&)JmXWzf)_;xn%#oS;t@cVs^%M2=_D&9+1&u zfHG>fZ#N1dd8I=RnK)P??b|Y5`M6`!!?V&6CPcU9&M;}{Ml=ue!-~5n0`h^}^%c7~t^$YnzGxME^uY~aTLBZ{i zzYc-8b3l-zdpfRckro5fc+HeyL)jefvj3YDf>y&!?l)oEozqjrSHD4P-}kUen2Hz} z9JVi#l?y~aTLJhnL5}7T%#cpwfF?5mOOldc%{@^N7znZ;O5l_DN{$%wrrqpnrb?+K zQ$u)Qy#TV=AB!KwhR)@*EG}(y5{ODQlPAl2$N(hgB?O-Mfd5$Rd1uh+VAb=d9uEx# zjX@yAkOOh*_cpg$AT$NC@IzNH?U}}&dSRkR3{Ghol=sB~{6deA(}!C-+L~(Y4>zwj z$^)$6$B+Y%j8C729-eb@tTc4fd!z(uRPY4Z&hyT;S6pur8hhs^Tb`13#S)+n(3P53 zF#%Xf2FkdaRw_dCl1C5JDNRiqw7!yk=vGQ?@Z!Y?HxE25-Jv88VZYMtwbQ9{`<~$Q zA9v(5{2XFHun$YEK`nWQ@!hgEjgpwmS?IvJ4V*Y|;kyl23I##v{3F4D&XJhv!o*sN zw&@Hr;Km=pLT;y_Rdz@!!K;#{oTgI4Pw59yiUkJ3Ip{;%ZC_wh$4jDy;`=t z$kqLDim(hpAIR5$(|&T@skK2VBluD_zgtZ&uFXXC+O`~&U+`t(s2R%c`GH?9S5jNI zbX}dNFSNN`9@+tI!mBz=w4^sUFe9(JV=F$EG|I8A=geJ88!0N-B2TB~S*%;N;eisdL~YaAGr7efzcFXzie49T`1UFkjZif}^73N>)jLgpfG+_t{C z`7-J0VyPGhxI#)Z5RC_(4#FQJSdEhu@D*Zus#i=4Pu#xB{RfY{u`L0#mZ}!cX@{L~ z4k7l_9H<#!YREHsOB;zxb=WXrz4>#_=lD!+x%eBe7@Daw!ujDIZ|&rq1i2K(4Ea(QnK6|v_vYT%izR<3kak!8c| zb%zPi(+9ZrrIH+Q(4cx#6B|7}KGANcx-2g-Ego!*a(J})1| zvZ1dBkQxiP^4=V+4Lb0v{$VXGU9#&GzG$b~3(hzF3*2B8Fghn>14~X?ho$J}wq#gM zPY=MKHh}&1rJ`%lyoL1ErUyRzrAISa6h(?A(tS#mKDZ(3?2#X`1W1#1#LK)rSJAXe zI+j^~YeNm9fIqN+qA7+mKR`6(Cwz|DF$s@iDT)>`m(s|#d5loxDhjZ383C>HSts%H z=RYlznyKtaGhP7WC=JyTT&P(M&8H-%KIcS*Dh6Dx62)+Rps*7>&YGsb6inQW z-f$?;K2hwj<^lo|rUEL7(-acNhP_O&Jk8?d##zbVi*XTh2;&0Y18%tq+54&)pt>xm zF`Qc5SmLsqufM}~2{O+j@X0QV@sH4#Xv4+k0-|QNh4>p>+;luLbO^al;d5b!yoCo~&IJyTP-m~aG-CsbrpyLQagB@l$izj!WXNJZ0O>%{BqySjx= zm8dyLRN{c@Bo$91pR0vV@7?VbPk=44$DY5J>^Q04sO17^4hh1|tk=8$#6Z=;)$%xK zJ?SZr?TOSX55$?RCBCkqxm`=I2vY`xak*Xs59vd1m5P&;WfjZQ8t=S>l=)+C>0~7;sX??Jj=wuZQwK~FB39t$*Js=3} zoVzA^TFPdj`}BNf#`WYLPzfLe_B9iZuve)NEL)z8oA4-Zy@aX#owf3KL}mj>SO%KM zekGZIk_o3F^4|twKLDXV4(L?>T=u&wxZ(AUGh!q%^XeXu^-7oiu=mKI3( zm+6UI9<{Ak{Ko@cA%=jTuVDc}vWk8e`+*FcN%$OVbj|E>S`_-C^R5HeKUy40W>C>C zV7c*Zm&vgp_Auj-#UKcT5^EgTfPtce(+EmZ*=$dP_l-^i)HamzpWR3YxKDVLr1Sgo zI_=o}G~t#9>hc=b zDKw+b-!VDAI}7--_R~T>kpmcs<``>sM<&JnG^^S~TsOTkiS!knF^~b=Xg5(N=R4ka z+I`umo@U>O+7!0tfMWo1iVdc3$7nU=H(dAg-F(F+_b|*~XkG{{LVttY!>-|xzg2S9 zvA;odj515%;t6#J7;CB1ZIMx!QogzD6#v{ft@j5XKecum@r@E|7|CsWk8+(ZKD(VC zU9N2N%5l$`zWYG&zmn(phJvWH&FsbD?YUePL6E#qa&L%OBV%J-R;AJGHDB{~Ml|+O zC@V!M9vll;$FCZ`LM2i)|B{;sV~jnxNGdrBb4QT%aOYC)@ld}y-y3cHah(U~1cYzx zDFA^!+F=}9tc6~diHF#xwZ{+_MtA8_I!pbf#lI1Rwr3`*i0PIt)h3#a@V}M#1kZO8 za4Wx06D%~BPXTw0f&{1PHXse0!Q+%Xw~$bnxC52yaBguL9vw zf7YYO9ouV{=@F4m7NdYw$YX}j9)1bTo`;y6Eum}4j#R2Y|~9|jv7r8I#SUV8^Mk< zv#(hnlX_XdEoNgQRy;%B$_ZH9_t#%b=qbH9D*59YfRvg8nA}dQMuI$uFN}ksD z`$&HC4L1Hl_c0+jQY2DkaM#?$fkbQcJ19JnI zWvbanONawbBfN}#ws#A69)n@@2}Qho0)iI-XI(>=_=VNg(_6UfwApQ8w!)VummFJV&G~DNJ%so0et7e~A761I@=L3BJ68pDz zgsUIvZW>AS0AU>x^O<<2{9PB|30gx;Dxt-*j;}7qitK}KyO~6aVgHr{d4$e5ZdXok zue)>k{@Q93Ao$I%H8THnI^dv2jnA^kPq2EU{^t&N`iRewF$B2}Xp@gF3%MDEws`y* ze_o=>piTr|60EOE_jkpga6SwC62N<%%FNm&A2_yi=ah3rt6^w~R|TBeeczT0BjSyK zv>!_#etf!s@_N~Q5JTix5C=Vw)2kj@s9JDew8;Ww_vD%v8USiYP~10C;6QL6czpeg zo;k2eqY;bMz2GN`Z2$4ipQYq_$m*S&CKkg+@ng?sShd5xKIK5M0qK(2ar-_$|4mDX zLHAm8X*Hxvnx^HCPLLqlkPdTSCfl{qk#hG>XpmaaFO6n$^mk_jOqa33Gn>>vUpEah zxdKlVM0f=Mkf7HaezE&%g$58``<>qB&NyD!AVYpyebXP+_NOVd8Y>U$fG+wne} zq<}{O@=$-z-Y50aYvW6rmI;^d7&~q6K-@ubewr(*nT!7HIpJ7LESBWbnKaEq;`m8P z5;!%9SP4i7_dMm5`|(x@Kl#SPHpN@m0D0M*VeH>?Y1h`{)o`d+Y9gq9O!b|04tN(EllL}rlvtVdv=KmZEI3>n| zA%?DrkibDTEA8nM^SW$XK8PidP%VvQLLf?3!PLpUbV{`z-|^l+$U8*m5OKvI&nH`A z8#^8M@{28X$4+cGQn?7dWPpjYD=Z`wpsvp}uYC_5&>hfV>*aZXe3RrrzG4RajL(un z$F-?~kEN6T;k;V;oz6A13}&E6_WQT%DCCc?g0i_CL}YT6rhUclz>^&OmMtpC=|`PW zXB{)+URK++CSC4o26%V8P{0+@<(<0Ryy~L92T*ovf%Z=G#J{uymQE2ocFp+RY0u)S z*?c+AMo8ws%d-pWd5|Ha=j7y2)>SRzw&+)SfJc!gJ%h^s+wcXlbL8%Qnjz+@&BFGEctJ* zvqFpF&FldW(aYcS!C(3Ohq#YOp1%N{!umCvZtU3f^~HxqxQN zv{dOAA7yQEWeSEeZc;XPhfOH4c~+v4OD;22NcWHSd@=UdbD zN8QU0hoXm1r36-uR}>j^1l@n*aUm+Y8`HsfkQ>D|#A~_Z+gUtb`ermDhdfjQ#F{XS zVuler&5Ts@4jXmhO;9VZlf$W*8vQ4#T?b96_FRMW9_B&q#qPhdxciQ0Ivqd3?Iy=j;H&*uq0_~t zuc{iDci={M*#GBIo}QRMFr#@X8@$*!d*AOy$_yiv;(DbNI;F$6Gprw%DJIt&L_PAOH{n1n-_im`eqyg z9^EoPKy8fI9F8BU>o~&in=9eNdAGO7Qxo_MwL`Z=|APZ1XGCBodgrgdhUrNN(MX(; zCu{Bq=x@7I4J@)|C**A-Q;yuUY>eRI83X2Ib9wJg z|Mgka_Xxw8@pE>rD5bxl1Q~@7w?vNhKKG9mJ`B0>P&jpd(BU+}Vxb%n7;L@MC_)RM z@SlL}E3;d*6fmBFxfvZ2HOMFSeR7*uQ82Iv%0Uh7Gzs-`K`p(opnN@NF>gDsyXJJ$z2}^KnAR-&_N_)1C@A0wTxJT+aq1VZydd4LcGqO1XsyyjhQ$ zXf$r(F5DepiooWjTeP?nK|^Fa67zBxXE~&{MFQ<#th7areZ$_jFJ?@R53DY==I)i< z2Y>!6t|3JK7LhM1Jyl!H`ewOUHn>pG;0SfqD$JEMBgMxxS_Cou0^hHJz!$$N_uHEF*A1_x9$w-^$SC>zL8tM^*hpVrXRWe)3#(OZ7c@o)Jz{qJKx9!tv$8KYAz5 z-k|URa(AcEy72AYp7?CzLa|zcQ0V{E*o0;*{$#6-aBYrA-&Rm}cm4CJd+4!!bM73RF72N&(hrmce`c`!eGCct7TU>%9nEkTyQJ}&-%gSQAm9BzoYk| zRE*k2YP7pL_IZEA?3KOyV`e`($Ob&675m@6r*u*BOk8 zIAeZk`&Y}JYLGBW0^g%<4p zqomjmnwit?5B3}Ig@``>9-Vg!`MXf{?2a0-d%cDbam)&GESz`FL4{z z#NPi>EcS2p7UQhU6Payipu8l!^I2%C|J|T6C%vF+mLd398Y04Ydd5H|^)>usnuOYD zDKLen7dRIDQB(P8Y5D#>0(vK(_#yho6$-fQa?T&ox4G^Z-KLU*kA5H&;#m#RSo4GT zIKKT<_1(@!LXSi$MjRmh~+U`;x#5zXNr@uiN z}y$S*wG zCNA0MVW0ED@%2EC1DrgN2!UDJskIGyHj1tZ-|U+~8H^9raB z{ey7W8J?pq(HbR9^e}<`DqcA3=lV>8ai5^ohHmxtUzLDqB+0FcG}IXmAv-~UCoklW zitkFLoV}Hm{(BhEcEaiW)p`Qm@#GDP0R6THPLXFuA!Kwf#?m1>Xr%wk3BN_5Gv`mV z+X+pqh$$%cN5`61Up`3=J<0w*FPnqlAE8|k)C>ZnRD19dD~-zEoB8A?6ziXe9--Q` zmSB<<9F+>i?Lh(PyfsWNY?}U{>>ebE<8QY0@!+*5*5$4goexARw!VdIQ*#BtqMRgj`>bBDCEnMIM?BuL}XF@_XB%2uT zV&WJ^9Y>A(ag!k*C;X7Nf3OX4`zNOlIKHL?zW2mt5>*j9F?YkVmZj1UhFf@`t$(GC z1o6Uvxe8?!qqy8IGfVJh=5222D`E^_8IZDmbgLQ9?r+e?MiYaQX&RoU>#b^=L~-sF zJ^qid?H69y+;5YIf72D3m*+6vm-J!AnK7R^9m7FXOD$Sc3Z72-q=)wgwo;h>Zt8gr z(NG&@HH+KwXsuZN3~ZR#U#O%1vtqW;+0Z}WgbneMi0mYI@s5~%9fGbdX8wyS_g8}~ zo{`Y1->=oXjsGqRW(c6B81my(^cT!O0fxbS3>%V-^ym5iUPgfYLYN?0Gt5Cy0yapC z*@r$kpgfG;x0OQo_f$|lh(@dlUK|-cX2Gpz2{)~UugS1}yWhv2Wd8s_Dt14QhK6Fh z&tYoK!!>(=0r-m_lNJW4+O`f;oWVzLZXU%>@EnkNi~dq@A1Io=8uOs{43pzWBu-fz zlvfDeP5tv^Do+2sPyE8RPX|}g(A9}v>GKS8y@%jtoeSyywN@YMP1sf~(; z+=HP57%XP&`)m|jj56AokZ^RmW9$bqZkL7CKQgDdPtP*C-nJICelVe8`gIuNxv7ML zoSa!_WFF^_d<8iH$5+}1A6G_titUd!7Xsd)D@TjUg_B)UYBi>D-U4;|-3+`@x3@DY zl-g!@%#K&V*azZ(i=Uygq9Tbr<%%qcN`(Zn`SLWP!IK_2N-Amx9s%?lTDc~8JtK0( zU(y7wKdubl`tD=1K#5rpV?9*KjEk;*Z~FMk2v#}&LoT*dN@9+kGR70ciW#vaPf_hZ*RIedL5g&{8$)n+f!>h_Dz&mOff zd0`lLs^c5qHs-Scg4!R2}*hqSO&ZBKs|GWEeeD@_c%bK*@;a z7Mf|m-*M)Scu5BxwU7EI%6ch9=I*Gg*?qx)EAYlct>OQ35ZfB|y;?h6@*b9>er z?`W^fpihVKH&hVD2(jI;QXf+6Pbd6$b8oa-sDkngIf?GTb6kh@0>xAlCWluFVY;V2jBu8=^k;Ir*)x_n37TJ_3`iNQzaLYOdD zQQpR-j+Aqu^PAQWeq6dg==gR&Ym_S%9&+aS>kjIecZ!4ah73`936@^bFRi8HIG=BQ z8y$G4COXhNV{j**QBloJuc7X@YhQgop0FX4o}F4|yLs!oCitYVfKdHNplaL)GE4ox zL+&IvU%1L@n2^i&zrGobX0V|1t8J)sB$9;T-nK9a$p2XQ+OLOz@;bX!S?( z+zYfn4F8nHprxI1*x8V0DxS^KnVw|`c%hab(Dx`GH>#t0MVB&)aO`@aWU@BqQ##)3 zv*Xu@bocX-D%RN;HH#4d_|dsq(3LK_*Za3j z^Etrau&0)O-pmF(*K!5AN2}I@>k`+RS)zaP({JIF42gW2Aq$0IM*HqwMip&=6CypG zgVqkaaK8UekF#B4Dm>0kRqc1NlGSFCHyR05o=vy%)fw}Dm?X)n zMG;MQsHZkGi9mJwpwzqIkGwbZ2US|4jc05Ot4C=str5!QD`&P#e$JXQW)6BFx%cES zA<*}5n#^TA^lW#>G2g@4?7GiyD?NaajW~bXN+9Q6Wyg6^_ptyv%woGeLBA|4Rc_}12uFn zOK5q8%}E9owlfi8&KyeahOFt^N~`A}Fkazz84-Oz$aLtsH6m1HK?nv|A<+tM=O zNRV!h+$)!B?d&@$)v$}F1c65r;$3(`d4LN0aHvT5!3KT zxg*v)?5|{w>Zwvlm&0nQ)+{2YE(?DZO0T9#XOd{vMIvTf!O+kJu_(>6tp!v;lwOFS zMrzOvySTq)e(F|b{JSsb{l>jNSXW*i(waxP{_G*LCQo*qnMiMN;L^`%@<$tS#Hu>; z^zn9gD=yDc8`nQ@-cz$TIAhb}cQ^EN8M-h%^bx23C>WYbcy35E@db{Pwq8Ab8&A0F zw-yYr25)eZxIS#c_BGLstEa@Yc;kp_qkm!P)?fL&W@!J*H8HAwmO7q=LpgllD=s_l z$Yy=>WNy)Uf15iJ$H4iNt9ZU3f0b_ge?KQwFh%Uu6u5B9HW~N>K!^8Xp{tiT z$8)vrowD51WAy}Au|F(B%UwiJ!Cwkp_dPU_o<@s(`XpRs{*mf^6}HXo2M0Xc6Yrq> zr{)210=d_b$NDOw>jk3E*JH30z1-v_VzBzN%qDx}wC+iB5rT3=tL=bMSw-F4FZ#Z8 zgTI{CjjLm*v|MeNj-i%^P)>%G43z1-O0^uIwtBuvWEx*pnbEe_I=ijP`JVbKeQd(z zuB}+Eu3$xRzLvYxS1vFx`9dE{jim7oC@nLKq)RhXZf}It8cN;_x1g9Wwa^TO09_ls ziOS1`g`|;8%uE>W&v)FDK4FI;l`r&0L_`e9CLvRo1AsmQWlN z2XNu(s{Vbfz^q#<3#EZ|C%%a$N}n+TVh63sZh(R|WMt{(7?tgqoAHOU%gWCD4MD!r zd}ZFQ@i{?q1E0+5q&Sw3$;J_DgzI=a4-$e=W`&%~(y0Gt|6 zmU_#T4=hn>B!2$ViziE{gO?(io440}3u~Nuri=41<2#OcdsVeA#;QZ8DK_X9wlMd8 zHOa!7RxFrA`ji35rNo{5BY==Mz`1Oi&itkbg-LqFRvH1zlx?F8T5rCm`cg+3niwp} zaeqz8(%Q*hnV{KWICXS5n|%6otZ}{dZBXQ?^X07RXb8iWh8X#XFa@&0qDp!AZMGlz znBC<8`uEgfRykAT7%tuyWCQ#NgYiI3+ml=hU%S7ab{wSQ=w_66HrqFnd;j{`2gBY^ zKl=wv-ntylu6Jg|tXA1SuMqZ9>=K&X|gc<=GL$p+fo7V^d2+wc$MR>UYClh z{^FXj@JfHtYw1JtN3q;A@;dW5cyE;*g1i%{JyfH2FMJ6(A6u4ZqQn=*ecARM-8$Y< z=(#p=YR2Itb|0v~h&51+96Wo2Ue_vZf&q(L4%>^vJ*T+lH%aRLB>+YRPCXMu@f=uI zoz)Zia{nlyprs_wm&aaJWh|itFH1FNo|0^H_v{Vr)0fH}?j=o|Q$KUJr=6hwPRhr; z&nzo6t~!3L*CjVhSv_KNqSCV)W0yL1!b{AV0IxSnU)ilaBs5RRtysU->|Jm`zu_*S z@(_pNjC^_@Ww8VmwX6hz{n!udYN-{(LF0WN&aFCw*@4`-yA2G8~UD& z_UR}b?TT?cLV30idoTYZ2OYO8aQuS1iwn?KA%b0ForH(^g zc`jJfz!45IuP{Lva`&rsd;YqY@9p;WD=(KgRG3EC&MgOW(q~+RgU;G-`K`nq@+a+- z=jez$EjnoxQ}j}P7X!Nze2nLDD<9G*TKg^Lj)xu z*wF;X9=F&HY}CcjCyF0U<_kFdpjQdkyEk`&LlfB|cYe>v`ojQS*My@Xj+YWYXnF4= zjRb{OO7E~n8Jd44F7^F0NP-P<*vcCUCRi%DkGn;Wsd<7LuA-6fB$qjTpx_pZ^s3xLk^{UJ_TgJ(HdYslWG!(Q?#jerESrH5q5sRs(219c6eG@#uq14?i6TZK>f?+L30yxP>wPjm(WxbJajqdpX^(IlR`etIFu@9qFoo zF>U-%S1!9ff7v1JJCgK-fQ8Y59#Es8$I=y`AWryOwI$dtkmwuU@eHHuqelL&Nj*?Z zv0F|N97{y5PI!WpHL^I+{;+eoZ5TC8oWS?xB}(vt7J$vR^9RIV`iJ>sOo>ObJZRtE zl%?1OEt&+Xw|^pQIEs=d>3R45mn4`;xo}e4Fq*rW9^l8JIkk{Tw>SQplDJxTNQ%vY zmv*-d4#$4b0H37t}$&;&^hvJ`)4sou7^|KG!8ECzHo(OOakt0BbpNzAZ2+JTnI<|Qu#RlBlc<-q4uI` z+_$h)6%$S@<^#Ko$~v^>-E!^Dyp}(%%bPL(N~LMXsdRENg2(S9&lkeWWLcPD?AJdR zg%`Y6+4RyB$kaCbzTNOO+~kid*sUpiNmhBZWyrCuarNEH({HR(l-Qyc|s+xE+)JjQsGh9 z7ST(k8M$N-aD5EB${@7vE?~U>i_}!{k)y-vXYfH_!PB{WZ$=ePto!2nr;#+c0kas6 zd-GWp9Wo>H8OoNy(?ZGRFr)KVzh20ZD&N)&=c{^!uQ2gLX+MmfE`CsPP%|bn@k>Nv zU+c?=&`)bwtc|>kFJR@Z!~JWcvVZ?B0GdCX4KxoDXqv$o#oI{}Fa8Fz#!#s(Q^}_E zoP);0eAgo2VZ-iOw)Y{df#4;-0J{3RYSJThLH9+z)3y(&TzoNEH(`$rWs^w7{FElt zoGiAn8}F^5+WUp=yMB1=#OHR-<_a@-rOx!^O~Wj|`#BT)sSVeRo!=KMJoe}{c>N6# zc%105<+Ny~TM5v&e4yfQ=ZRfy3>?rWKFX0Pvsm~U#6*h>Z}JGFA01qowz5knL9)pJ zWoOUS7m_g_w9@wMhO$kCnu*VIj*)Rl8b3neG1$9D^OeI&s+N(V`~8Fb!q%MINfHeb z6@^tN9nLD~8cQ_QD1UKs?fnq0SkUw}vRt`})p%;R*~Ey0;2PfJ8k@;obWCS2n{-fl zu|F)7s))kpHr=h*6zjT5FeHn$*a_OF_eh3Ke;-R@{N^ghDfBc@R5+R<;b(Rb*NVII zD-F^W2d()(gLN@TREF-7=d;13FI3U1l-?S}g!1>lhqi}Djy`&x@hXT|Co)Av$3`03 z!I`_gMev5e8jK*c*zOOnQ;Y;Gv7sKf$|}FUu_wlNbMNNamzx|ubnxLAODbMnMaE9t zpB?w$D&jEbPAKW)kmF_P@n+N4)7iv%Jj}LQinfP|>q&kXVxmb*rpEXABOBs|Hu7_o zAK@Pd{8U^obK`q5z)`@MM@08l?Y%)tC&8=>WN8Plw*D}V!?XzWuy&v3T0R#}5JJVh z-Xc19cJG}w)a-Mhwm1zrJTQY6#mG|Qtk@?1_?nSz+dX-`l)dBZz8^&=9hV_=teg65 z$0vT7{-~Y&4Z9j@GOY34L^Wi%*|=a*e^B|y+ygn3jKS{^IS3y7b6gOyVo)~gDVvWVr0r+d>Z(@aba3-<;Rky{x1*tY_bLC<8g9LeNLI z`7$cdz;?a`BF5c-MfwG{-w5v*Va<46Jnhu={u+BTfzk59>(|IYk-x)H(4p`{oB*-# zAfJXAKb+@{(&5cA!bdzWliWvU9;&quT%n&4FRSK0nu>B3K7u{0&4_;b3JxrFtJ=mAzrr;Q^1|ciF5h32F3*sKXA$Ho+YCxLnS1 zBlt6|80yvXELX#k8a+RnbAaZdh|^^xMbto1=R>UOc2}MEYa{nmcxmfv_`jY|+Cgs7 zfFT&&^rqx?`ia>jo=7eVyiXBtl*2=vPlm7^>!Nk*I$LSc_&t%(Cy=<@H}jhH7GxM! z!?c|#1$m@yrgFI%u*2wDmSq`Y6iU{MK)w0GRq)N1Em7G}g(?re*-5-N=S&vVhWtdQ zr=mU}I!DfxwsW%N{9vSTUCsTt9${)HTp>Edh}-ldU>gm#iZt|gDz%p$1J3quCmNEB zKC+dIxEbPBy&fwGh=yroQlFDHy7i7e+Hl8^oxfL>GB< z<}6{SRW@cG)iHL@E-$rHd2ds|A@F^uJk7=oDc8lBvH7vURj&>xyj)w&DG`YOTW#<* z5v2nKE(L-J#ZYgd)z0oM*mNPW-mU2NZpUf(U5Y+Y`ZG8&Hby{@bgUnWIY`45YnNs zpMT-`$t-ap`u%zb{lco7_#_!Q8sCHAZc?&s@^`gc=Lh0?MlXErejR^Md`zB5vrRn*(uP* zg-NOy(^z_+SiDxBi%G^T>M@mS^wH#j!^jaAa02*9-al25d%uS`M24pTCj=e zX1S^f)b5D}yvKEBM0e3+9orSq8QoAI!QA6opq7d-6_mPC%j~P>k(T;c&NR>;%>47#Y$QD6{^9HFPeo#&093; ztK5=@Awn`_KW$z$3cWs~Gjg8rmek$Y;9j5*vA~io}yXjMpZ-FsSo8i^eK8$@Br=S(s=DXh|1o zzi<+?>3QDOd)Cwc4ouI%$1@i{!3*0mDm@UJ9lzHz_)lVG+gim_rV{}4)jzcR*3dh! z@G;8kC+U=7SAx|m30xx6ht+NmDa@xP!w(vqJEQWGXPP@6xf89y2BAY9J^!9RGTwQ5vO{uREwh+AQEzQ}xx?dh`DibU%3!RCd zTze+?a?3c_2JtuWbUj;$%-O>m;``KklY5otoYa}eX!WXiUe9)(+Z=?u*t>RQ%!Dv+ zb7L#9?X1Zgd{(H=BUC1HSJIdge7MonTg~<`t?4{pdwMqOB74zkJ$FT8Wa{&t`$}NM zsXzYFYUlhU=I6C%Me132zTV8FEQBE=VvG|9kA69pqTY<2pn#gxPL5i`Ll1T5s#lPjV8mXA>FPkR%9nFR+TFCT)+`+&pDPFx zSd%<=wks_gc`z|W*x%8s2>#X;Q*El2?S0xH3E}9-j-RCBKHiNM-m8dw*MuI4Z&K-` zVKgQ&&hRu}Sypr}?A9#LlEI6iC55s?SKVasqm!d(Z_JCcahkY2$rP@xDRE8G;U8fQ zuB{t_gt-oDU2pLOk4!OLWukE2;+84X4Dr3(m}f95MU9U-GmCp`<8)J!8#(6bgifC( zAR77D6;S)ybn`tU@vqS`#WGwgG^+wkE^!~imPj)g@HiO;1XbPCpZLmcMTrg-Q9z`ySoI};1-;q!GpUy1pm(D zdGD>SZdGb3f0%vF-o3k5uU_3lapZQ4*v}sJJ?eWkOo7y}_fIO4Yqa+E^2g*@x#S_N zP&dEH+<))ZN~TZrs{wxTe;gb9deGj)+>eD>O`p;D6)wS30-#UuCj!qIO(=)5Y)Caa zg)tRKFQ0PMaBuQd`W&9K{m0+ll(Y)EV}Ti7AH#D}mQB@>UpZV7fVTg{JLWDUh|V9M z3dT?ql^en>16)pL!79U7`IGFw)Cano=52n3ie?cu-Jfuo#5p=(8;x;XwDhumU{oXx zZ($aOsNX7?ZTokxU|9aAY6`(~nYU(f|8;Ppvpz5IS9s4Xmj`;=DB(}up;tvR_h z0faHeP2Df^-MBac#J+!XHQ=BNuJ|2$9kBS4(QJgEns1=3RXcRym-hOP0uO^X4nWwF zNl{BTB#uxf!F5`ld zt03N%jX$NGJpgSIqj)Gzo+t;U_(9wMuHYY3YDS0O;jFan;(hYAm9m_A1JSMs6d`iM z^RJh4Ib*Ahr}i_3D15M&V!H5+!_*q-&z(o@opy)zE>Au+#h)vhUXq);4BEO{-WhG1 z@UfuR2k};Sn1f7+w8=@F#GEdO$&CZ?TRlZz{>ERE;~sZ@EBQ{3iUh{D`osYSs`1sM zVRuSD0oqQ{*^s!B?fzGM(8;32$TByOTzt`PtZBds5iBqs*KMUgF(88MqKZcUyOLP> z*_22X^a&m}(+%oMH@UR6WBU{*J*bi>yoGVtGvwLdOGefiSRyaC=Py9<+r76j`MIS0 zVJhX&)JZR|jkh2s^>cxB@W9z=ekn3IUSJOAj#OAN_-$V_qSwEK8d;wA%6~4Ze_K)I z5gy#j_h+Y@+##`BpL+4@dm`+;uSWP-g>%i`qpJK3oQ=T4oNU#tigA@hZTAKRNfLJa zFxL{x4LXT?9A4oy4~xsklKk?z=IW}Z(^?k}qvqx;WS z+fQQkXTOgGI{0Hx;AwpP1jV^4jBmhk;RMdvtF%%G=Tso|B+!l^pZ_7-OeLiD`lspK zt$=qF=B@s*>3((7|?F_r3x+M*wu-0Hs$C-*f0x zF=x?0t11WcR%t?&@v;PvM7z;Hd_;VUC|fIWD(By}@?3DwNll@J$R6GcME z+W?~;8JFUdG?VmQKC489-&^i)@e$WExvV(V~XX>dPD4sBg>E>IV8h9t-I47v+#4&RC#38iZZmGhuf)po?3-i#^&P-yN54_z^w?n_qR-6GW ztZrwH{nC65k709Hr>5<_zZMOPetPC{s%W(pG(Mq7NALQ(SB<5fkPf9QEG^8(Iv$Ws ztr&?U#1VYo++4W*lu0G^*8$K7n}dPUKJ<==ZIdFlS+m{vi65C|Sr)J?vs9>pZKbk6 ztDC~)+7qEb9zV5H=puqlPmFa-^H6(2X_xwIxm%1H3a^9WUIqaT#H?HQOIH)$2){>b zk%o+L$^o6Olg!3}bLM#)z*d9(UzqxxO=-8 zh{<@poPOyfwBwsEpdKNMz57^_O!#ScX<=5pW>N7HnCw!MDtB91-uFRPcyG2dm8uL7 zfQ)3A0=o->+77|F<&EH!m@ko5bD#%x7US3=E^^GcLf_n@oS(zLln&h`#@(7@&f~D- zMvfIY`}mhlo48QzFd|JKg@^d|{Gs0kL7rf~b zVb<(vf0GQq@5~R*gE53hXIY_YPa1$-;}w26aBF{Zak!b?IH_$7iZ!RZ52;muizkmB_>Ge{e6k$(FD2LcATENVoz zRLrHBeF$OxO$egRIob;e^FQZ*i&|d7rhAg0n+=%t3H|jKBjvozkt=l6>epcCv^*(D-R@*A0 zNJt{kUVc_!(F365{aLX#Uo#AU6mRCDn~qSs>5>akMjrodwplxR!`a=*dD_oRC0K20 zkKDz~z>-y{dq%pzC^Mw2Rks?E%Zclh>xbejQ{9|ihka;h$t-gUHt2q5UQFv^?LU|To}Wom*xA10r!tgJN^|=`km@c0m<;c$6nM~0I-9|M9MHQ8 z0hN!F#@qIz6qwt#Q|}v#75oZypnm{8YQlD#l&-2%{HvYkzWw$|a=48d;YK0TeTkIl zPH8~4dEd3k%n@(jm^v@J`j7*d`0@C`6%T$%Us&^uk+xie`rO=pVkUkTO|XY205?%) zZl*99%?dV6@LUHaEbAP~PFHdD6N%T~^nT0zHDo}_c7@>iVB2?VLUnOqnldmd&(zrv ztEMG;P97t#=`TuRQZbI~?3{Ev#8S8oR0=L6iAiU>t~Fs7$);t!N+py%K(74F^qe;i~C%vKVxdjN^}f*3KdCLq5z9FJ_A6aJ?Y=GdCnIk_>xbQXdmt&loQuhc?7j}@ zJZd;6n7!uH!>sm~8$@oAR;DaIhh2+$oX7@xmV-KT;D)`lGUHwr6E|Q8lY++kiTo4H z%jwZZ!9BI^v`i*nN2bXuwdAsU%mYgop(izZ7@(h<2Sk3OoGs5`Y;yo^fNGsf3v0x1 z+Zt}sc$~k>oXF^;-QKxnBG$L1U0r$oh1<`QQJ-zrzC)Q3m|CH>HQFz9mk14>MglbY zJ$<}6X{)c6Ks(K+SZ@AyY5lf-8RCY zBcrM*db+lr59TiTu3|-wCc4j52`XVu6Kq2a8X0m}9Q&SsNxyvVhs#P4_4k`j1ST@p z>u$({3INzhg0RT4`Jb+@An8L3;z>OTFxKjv+rzvj=)_KeC_!Rs*~Ax@th3eEZuQ_T zMt%8rCq4?b_K!jj*ksIACKp!muNF@?IPmG2W$1t*m`t77-+m&>r2YOG>HIYZJd!Bj z3v`IO#GC~SRPz_QJWpfxjy0Ww_J%CK)ovXcQrzNcxwQq22}sI+lTaRN`q^lPp=MCW`(IhTBM- z?`k~18hSh?xrMn6A;FyvkfE{$Ta#$;|c-UZj$L*5}6p+iR9uz zz8IG$g)@G@3CxLi9Y(2o1#AxIBF4$x(;eWs&3A@yyii;#0LWB!mOO+;1W4&D&v`Qf z_J?+{c2p&MxpgpAWp=jwRN^2Ab=ct3acU9gad4~5Sg-pLzZ#Op@jy|CY0<}XWCM~m zF!|u}ppTfdH_Ac^+lZiC$0T+E^jCg8W_6Wp^oL?->HdIsm&pDS&>oPKcIV zy2-Pd7lV_VJ~U{2;7M9|kJQwy?9rmwi2~QiW!@I`RW#2Z+Iq(2sB*OW>L#*O)s@~} zOE7h^m^7~5|K&-EqeRrk>*1Cn+V*w!`_XqIauOL_W^!0t-)Zb!&Z*B-CjjsbDN=Xt z{{#uB&KPBc_qxhw&}gUJd!!|yg+Kj2n!le0-n@+*kuky28{W7S?RzPyo{z@szq@PO zvj--;MEf3sb&5Q;o3W*O?f{&^*tLu{5i|2C7J6Jb77E8&1DIHC%ZFv&;XpwPT*ca8 zPHV6+$z^I_XZTK|K|4xqR8jpdJO9(#@VzYbw8f|6G^Jfn6^A|gSMeBiSXZ;#&$)Gz z0Mksib*fnMF4s8K48*NLsvnY7x70KzN{qpL&6JD3WN^V!691Gw8ggSAVh5mSoSYaV z-NaT#Qyr?=*|jNyxcCTg(8N3e=rm62&dZ9oZ@vxfR8x#Zf4=j3&r_?a^k$6_Ci!=9 zE~2aWS)>$z06-hC_pYKi8{PnNHDcKPK4P+m0%(YerX^5$#$ho68k zY5%YCFC8eL{=wn|DmIp z^=cYa?+j>Kv6h9Fm0SZ3v=L9+I@@&Dbbioj7kz9hD`Tf&kU9 zvQcpb^{$F%?tw*#AdDq#!4beIsdBtoD8%+CoGleHxcA$uY7VY<6JnxtySticD=5Vb zwY0b|qUT?W3C^SLSTNz(QNpK3rm-iD@9x9?1{aSvn*OPKTh1^K-|pPotE?rI3@w7Db;YYnHrve^7o5GCDE92Ky@BEG*If}zu1dE zQb##G#-&&RikPdBv#N;IaOHLrIN|6;%PTB^bUDCuvOkxAth3dvTJHmY5%N{E}si16` zyY2OJwYS$Z=B_)k1w1bg1&M!k57G7 zh6J`7UkT?F^9guJBX*eNj0vKL_hWbNX=|LBuDObvWN)lnE=%QpllQ~c+)MUojQ`SY z?@1Wg$vik(UB7atRc}ww1KnstN=qaw&#&VX6x4mham78#nj%qv@4C|K!9J+-TR+VL zgaJHmXD5$>gV=Awx2LT-r#eo(C$~$j2I6aywIl%Lp%q;NOx$ho(b+zp{J8%|40?U@ z&s#Khhk+Z)$NE!X0s}NJW}1%PnSrw~Fb*^gn!y^6j7&T`;qYLD(a5JMSYhb0XtB)z`yj{6{atpkqahX}ZNC~>+Dmm!E0 z7-@+_I>pp%97nbYu<#G0O!Xy_KF?W7M~^GIZx=7NQl_sL7yP#+FrV|g$J4%uHy(dm zl0X9pN_E|1B%j7n)j}qQ3<~+sMQNYg3j-Sth~PR-6R3J)(!G;6#TC=!HIknyTbrPeXqK57=qnQ@f5i z8+v-IX*EgAQvI%{xc>TcNAZi!A2;gxWbdW;S}^!o=1xORc@hZzDl`hE#TaK~Lj&V` zp(1|lLkzEJ7aP?zJDT5TDDIdQ1a#VC702JmZvaOA_w6Jb*8S^T`u)1nxsKyGjJ0O7 z1B?oR^g$XbK9jyM9AA%Z*Du>EiguYR8>k>_VrWTW;V=_?d|8f%%+0bEF+XokG#ZjE0@;AXqp})sv%fcW`_s%hg!nZg*1^E{C`g zcgSR08O0V`m`oM`0rycBqQU6>JMmj$R0Al2iEZYVc^g~GO?~)MS*gdN5KnFkV}$R_ zrZhAq+;(CvEei&iV`$y{Ctq|>5We}(!I2Moyc6vwQQ@k!AO7;~8VkS8-HU|B$jE#D zFEk`76HwC5a&Rd$MTH0$M!gvPV;B&*z;AWQAoH8{{#9=*c1G`wBEBR_ey;N!IzAQo z;XqWjeP7TQK6E&LK?o=Z^5*kr)*gbd2|^Ia=}40K^+hG**?33%XTXCWNC+OT0K>M$ z<%l7mwBSGn5__wRS{5%Urre5!H7aCxR^bpceywhF(F;Pss?R(PHh!=?`c=9Tbbn@~ z=)WprL(_>uthliuQG!@LT!9&_ivglJd@qLatCI#RG|UCD_hn+oo z6yf1M3JU)Gv#hixW#_#njPD_3s2#Km)F4-#kNcBv);Xf`f?4~|X{@Y|i&46HyD%LP zBg6IIula{UsV;~5_s6r<+3!@c6eyg|TD*87gvzqYgctMYALQc}{`xd58(lbCYBJN2 zI8$!?l{T7A5|4cMM2>@R7*g3y-E}EJLp@fMj{$|^^2~r7IJ*N3)Q0)o^W(e) zc8)rrdEoc%+CVp&fY%Y64liTo*^f$d#VnROXXWv4;l#h%|E?=lJuMUnK-EG(kBjt> zdGrhRlBh6~Uyy$hyvD-qwjSEyl-S~5=i(Oi#io6XjPhNmJ$=`c(Q}b+%Vcn zWuFxFKxH;nghsQrF(~Tn!>ge zj3re zaiRS4xiZKXSyQfX4AsL*n?LS=4K9e7I7PC%voo08+9JR3wi=bo0TCKlE6u;3*BmW>I)TJx9<9 zDyzaLXCJ=btDL{yz7-d`ovKya-OY>oVlefO>WHr2P+a_6H8Ov6-<839r%7UX8bvD` zkxpDZJ6JTuRq07-+9yv~Oy_mw?cI1>gh#$$ zC}6&aY{&TP%7X%82}XeeK6<>DhOkO=`i4fjoV>pYQbR?`Pfq{By>4=vh?3R1ln*@r z{Uz7%^PWWq&IuCsUfNLRQSfyc`-jPMy*ovE_TBF$;f}<_aB!u^vz@1nG0A8xzO(SH zZoJrlwX~sa)c7%rgcQX={I`-vDIz<=qy7dfT>!J#OLjypjIlANS6eHHCEwijj7C#e zm6c?a*}gnKiUDSvg|7PzX{pzU5Au4G6!0MSP{K%N7&4uRN-=z}ZDArIB!K7g_dkRF z8+-y<{nR8BY(M-Pg$2ZNdt$AA)rx|5xE%b@G5Yz&mxe;WBwFs4o9{yv6((GA(gK;? z`yqvPeOK%ug|UkYvXatT^%5t%gYo&=<;*Z2Oi2jQ{SqYtxSwnRg|~b+4CgQy0U4h( z^4`INje}G$&;DjcXB&l&wUZReMzaK-)A%S9U8VkLX{p-S#i-`K>ZZ}*@q`2eBG}0d zn-SjoaJwYz3Y0*Wgyz&y0BWEr9*fB>nIE1O8>y6(^0B)SBUaCUWjAT8?=-huk>ElN zqkvkkC4X62$vFIFQ{`Mq;WV1Bp77DkxmQA;<<|fzjBEqw(Jz7w^s<+EEf2!Xsi@ z7*V$U@D92t|0fLl>*anOtn4+-+Gw7Yvfw~=a6t1HWP|r^uQGFCvk7Zz-i#~%$V|iK zLHI^EXLp*8fUih?2j|`M#BtW@7*-t;iCb}##Cc@z>0G7$h26@KHhbXe@p=(HlZjXC z{xSIrr-8epfY`{3M7DGU86%uVgkZ~OSt`1T&6C~`CYcXR-0z^6<^9#` z^|fRBm;qOUnl?;`6YD=kTf5XXjD}pPrMvrkt`)68q7=t$O1pzs$_hPE*DS?&>RWj_ zxhPi%a$M$uR(Hx3RkSS0<=uMf-6axm_ZGti@h81~Izp4t1Z)ZzM|no7-grLpY>Mg$ z0ltNNBQM=~;t9Udfn;88YzHY+mXi9-`neq|r&|COG)76Bh0tl1IguV;yi6h^?>zO; z;Eo+te5jC}Ais3D_e^EL!ejhuv2H*W{#OeAGOg@x|C^B&TA7XO^dLdi4R@qtm>J=< z{yd)E&3oudX@8vfVmVMcM`x6IyXsS!Tle_GvCO&d(brsZuDt{5l+p&5vWanM{>3?Q z4!tjB-^2Uj(OFHZbv* zm=Nnj1iYiu0PJnS&Z30Oh2fo+U@~wYiS>CQW69)Yb$dt>!|{;QWfi-uw^MA1`X?5d z{zVXY$hzOvCDX;nj)Ekg8Sgy8cV&BL%KAjP?bO(L3=Y|hgtf+h(P0@=DJ#iC&9Ucd zywtYWBO+_oLJr*mcNgUOL4^+bF*LWo6FQv#oC1f=H${@k%^i$AF}|f)>nuZ!o?<@? z!R)jl(@x8C_++;GAb$xD#VjI7*RtB&9k{kQ)7P7^f`qmkj{A`b6I!q*0~$1?t;hnP zsHCZ_4s@^Q#ijyOy!v}G;=B06)41%B%VCgJg~clnj0PK#UdM^iy2qrYp!@FJhP$Yb z8

;a3V1dj_#&P^_pg_GBeG`y5x`ITYoNYX-x5!X9GOpK| zug^InBBu*mqTVRNAuYk8E%qW<&=YjFA(-!&P)=puE6g`d2!%*I^hI611X@P!MoJue zbuf<>SmR~D0z)M-mOU+IQ>$*4&FINf79EF~0Gt4cS_=dD+6hWcru|h#=DChdFuy3p zX&eEuHdJ?3q#1;298pH%74chjAJIbMknj@Le?{!EU2Cn@Ksn5s8U z!7M}hO`I&iUlZ=j=bI@nVchua+K40DhBO!+z?%sYZ$Z1KSo3oL(B{1dr!fohLw%IC z>l~XSC(A$J*#sT5T(E|muBB~QoE7&YccQ^K*Fo^B-tv_kEGO8PTSANGT>+qON?TjI ztmH80LiRV3aQ{DZgM!jfrSwDHh#N5zyWH{53x(1h#>?t4(`!j=7{b6vxbF2rd*A^a z;=R)_zgdiM@k9V8W;_uRe#^n8#aT91c4GiR?Y&#$CAu*++45fp!3E&5enYj7W8)a6 z|4JwbfxHAkoG|fsg>yw*bR3SMV{Nki%sugxElT}OzQnMZHxDj z^HCHT6yVPf?fI4P(OVC;>aAnxyZOh%L(9U0 zr;QVF1R4Mr;9w{X6|=qKvjO~Q18gWA67l-!PDc?}Wi^~GKk?r$qQt@3wPQFtQ-4Nq z*93o+kI*fK7e(|~sIWY885=Sx;7_KRT#W<1vW$edj|x0NXKPL) zNQ?6Jw8VHpR?4FIFrhseBHyL=q2sXcav|Yw+9+thJ9-9&6IGn%+dT1fKJ^8O#QwLM zJ`$v_Uk2Y}8=net744dpEaH3_7IONy!wyHqHAxjcM#_hV4`VV#db%80rV7%9W&-9# zE}7bo)LE(tOKwr`eBiS9_!@FW?k;m&9dD(R(jW-F_`qowrc~R;F2M7Un)WTiW3ZO% zU3UFiJ3O&y4tB$U1WJz{e>1xYZGofCv%oKd zjdb7*bBG%iRsM{Ok?{C?c|Q&L$cl$6`h*=3W+q{y^Nq4tQzG)U^3TyD+s8ODJ>&+F zkpJEdl>q9w;!7oq7dLm+kob4|VdE$jOX-<%mU@y%Iru0B=_98>=x;9)Pu&5G!-Ki$ zYq5i2-^epKdDG1V+MX(W&m+}1jeXcoTohMM3IaQ*PKXhmk{rIa$>}w#h*;Ga!qG?} zBQM6-AV>7(0|p2I7eq-6Vkts}zK~&t2CdVlEQbh3p}gmZMN8v93(}C_fQ_{|<*lQk z$Qi&)#Kgv&t2`B^XK7ix`hPKNOmguYd0tpwXqQnRIK)8e*w%;a~*b#OC?h{0Mc zJv;SB6n%1ri?Z@Ar+P_gBPTc{Q9HsQ; zTA?Z~Z(K(f5Fae%vub;O^cKjZI}AyRD=Y{-=Nn-%>LbP3m+28Zg*#hoJw5bOI+rkZ z$0aRD^hIb5rMa*pF}2*){T`Y2bU(;oL>E?;(~v5f`%<`Acc3z3ra7Jn>@5Ix5O@KtTkUn|ln zzG)<(3V^ct2&JX^P&zlD=hj=zZQ1!=Ep7B*h-&kssXiSSlU%qGC2H^-*teBu-M>d5 ziFr5F)_K``*Pv3u20!qtHF35Rc`=<1DlrxJ^%%K#AX!=57rgs%68?Ho21G!F+3e02 z#%%7d;-vBI;>gM-;Ev?4Al(r7ggty|Y3nvS#mi}2u@OS!Ou}QVQ2G5dlNl|*hvUq; zIC6hCh$ei+lyquwek=lvSY^=0tUM)uCV$`K^p#fOp0p3=^f#p0vQS~A=A+P6!jiuJ zQ~^o{;(=h#AoLQL{Y0QnAFav=iZy z$4z*Jj&MZpY#=sdjA!h8)no;+5Fugssd0eT5h+Evy7;$@sVcLzxc@}ZPfSYZHAu6# zQ_@9lLzGxWh^59y;7~=tLco9{ryw@u(BJsT`yB#J?LX9?+JCY1k|45fpx(f}gKH^w z>4}xRe0M4N65jIkS&o60&`X#TV)%x_e!9cD=0{-7eAT-1RZbxxLbJkfDoSoVmEy?E zjfA^(knq+S&;?^`*G`-MphQ;dmItBJ_#>oHjNMfj_UoQmpn-9XhRSk^C zLfDjoEHQ$#Z(+KetdaA6YcmVORwr?*jt(RwCxS!?VFYk!nJlh-F}3ep!B6p85x5=X zLSw7<^Mc33Fhd6xV>mnb2zrpA$s+=5CE@}?M6jWwevEg+ zUTg$y1Zoe#f4S8C_{Qcc=||L+AchbZMRC!|>iEQE>_Xq!7>Z4m4MhSE=V2S83N-YaoJ_qk1N$BTXNez5JWax7*{aFH5DjR+Dg8Wd z_64kgoCd}+tseM&U+>EtraH{JD3haLmIC{rWk%dgTVJs$AXFc6gBn?e>ryv}B zNzAy4$ITxDl2Pw!sOWX6`-AfO|HRvy$pH!DsY-vL>$8TSDKI@B5hb^Y+~fOf-! zd%`&=ml!p|KMm%Z%Q$!`JSh`RK@Q|Mp6aUV+(&ZV%XFXu9qzj|XY_k-pSW^qQBt7Y zG);(Jt6Ph?LAzJJ3bh1{xvz`*ylArfEH6iQw*qH7l)_6DZ22RFdYm=Yv|eh1DY9LmXdX0o4<4lNM7kv`f7$%~QSUXJJsGOpOY>{)ZgUZv282gPdIVg26#GCw7MHFf9Nl*hz047Z z+*d|o(v&5F?-AT74r9k=&En%KIE*Y04{iqqpZxDZzIQG>4?|dNg`KtkSOLRye{zpx zY@=4hki{518ll=jf?VYfjyS18c>)1IR`kL!o))(}NwT7u|J9^gFPJl4O#f2T<7V9J zgHQd@*3j*;oSg1}m?qXDn@Z{I=_)K`5*o^dqbM5DxSv4IS33C0UgrCv?E;WlvT;J# zh}qzm*#iIpHq8uX+cb&n?*-qD7`SR zKlZx5zXwR2¬g@U*-RXFF}k4TDv`+)sse5LH%eiV8Zlet<)Znk}iPhLxFRq@KvT zNgDn{Hd?3pQv?G!Ee(EUh;Q|5?f;AZ$kayLv)!TEUFw4^&PwVwlpdna_^+-1N00P_N>H(eXM z-;$7Pyy1D^Zo%}L3&*W>>o(87J*g#}LX9C|WX<`Blop0UY5EiWL6bxKs`lzIm6w$s zR2$8U@7k!_+F;Sl-%AMIvRWv}*na$2B;@pUeZX1+H+euU&QBj>DEWW8#VDZ00jZ|X z6_@cA>``M~Ie8Y7-eXc~KrhMlG}GBE6(Nal*waje+tFbKs}l{^v~R+m9?@ArOAC+? zt!Q;x=J8WX3rJv-dnTg|W}`248fGdK`0CYr$P3i8iSvwNDy`2ogIm7l$>L`n~8hher|3(ERM}Q z$Z)C@kl8c6{c!2H5k0Bh!75^tJ!*33^GALQ6?sSua4CHkubUumkMYOy;&szgjFW$E z{1a+Vb6#&DT&Oh@Mgk~I02=~Wk>rBw`}9NUtcSp_?V9;Jor--v9^q&Q{jB;fB+jYm zp4tx43}*i1=YcOdz71=~Or>>rg>wmURyYU&HGcE5ncYWt zS;(F5m~G(xAi;l+f~u$>SSh|eV?W#_2Ao4r0~>>jG&7IU;X8(HOlV^?R95{ljor!A ziL{g@z=8PWMVgI&<#oc&L=LFYn|{PZKNbFUb=)ssZA-o)05)E>*21}x#Pfzv-fA}&5(}&uI4D5K9Q!M?%(;-$-pg9 zXb0Jt4|(5ITA^JpXX@@4I82HNV+YvYcAR6zFeL~kF!~S-L$)pP!(@g{uo?7l&SSZU zdn4Q$uABB=-g8$fb$Rpgu&?uwrAiOp#$w@2#7M5Dy6-7)p4r*h7)Vqm2N6pZC1|{V zSp3v<6It9(Hb)-*Vzoju+gHjPwAWv04an}+|FXm}|DRa^IuYQ_jt}aKrWN#8u!3ooXYIo&497f~62Fn|$ZrtL0agxy}rA zpeR5)p1B^jic|=6JLSC<<3Xf8v zZk+=3&EF7eE4urwen6$vSkcv!H(V1^51kaVMMrsur|Hzp#R%mSnd|Jzinio9=*qG) zthki@w}%;{0$ws+9XtMtCzl5ECo~qg;F;FL)rN_Zi&VqY3E+qekO|-exYZt?9v05qz;`z>M*?DgA_BZv7 zSGt%NBgsX)i9UFAWp7rJV6P*gr%5wFEHZs+8 z#Uk&&!FZk<5{1I-G$~rZsTtA~*!Pjr2&2z1{Q+vcfM;U*44Ffc`RjcI$1J4|BRZG2 z{qVB}4^Zlqco(V#XARV-4NZ+jdoO(qNk85sP1BqtaXwY}y!KO$aT^oJa}elLS*v@% zR;?{cnz~A_t*uELh0agMx(_PbptJh%jPXcuZW+3k1&c{l#;xsldDoZPOgYgGs-O5_ z_+aG|KC6mWP1)T*f)S@6F%&c?>GS0vfy!9Qlh zDTx|C{6`Mu_=lno9I*ja7c{N!J3;ua*j%8P>G>lpPYgLIVg9etn$dcI|QOepx+;C_9KKfyD?0=bI4FhTk9*g5W|=4%3+C1<9C2?&!Zt zeC;cL?ilpR6E%>kn z`{;|kyVygDb$)KiQP(so=k@r@bGbKWo-ZNoSy98U0TYrL42?zaETI>>d|F~9wz z)Bi3vDw99N4gN=3P`zC)9i2Mch60kRqvG};5U(~gywwP+yh{Uu&*+bI!rrM} z)>qM!$T8vau5+Vd{l$xhlf@^DTL=73Y$e_17lhBk?Zp`%RV5l%IP<&zi$8U;J@Fp} z>h-bjHxf0@g4I?w;|Qn@Hi|Wz+)>iia;QB&mz~RES)QL5WG4yW43KeLAm*5JfK12=mW!z|3Nl|IS57_BW9d zq|95#*mmE2Fildmz=$QqFNpG58ZHOgKA>@90 zpiRa&^u6rxPC642_tiF%7UrlI!9_GiP$x37*=JU&-Q87l{5N5_Q=MgLW?LJdZhRIS z@{UeiwqRjog2hajaRwjFYWw~qRUQVH%=G_ATQ#T{&WxI-7!Af)To%G!cL@+X=HO$Z zwc}H8<)cVT%u&M?EDmNI>J4gx5h=XHL7jTc^xIQF7i7c}-VINgK~o2dnz*-}7h-2! zaWZERHaeVWwxCz)3jUA{Uu5YC*GKQ%g0P4AUztxC?(f|IBHZ&H(ZG|yq-b#3qttl1 z7!lVb&6zUTg% zu+?g*tSng_bW3H0wv{SysNfY*A)$1Xy?Uo-9zLL%k0#0K&tjsC1>w8-oe>XxRf$23 zsz(YaH&Q+zdNTt(+|eT3_7T-*tn<4jd0S}cl2$!0x%;lv$ZZssE^K3M{f#igo42*x zVZZ4A4g3oGe{TeQ?vZX>{$MQEVD{;3t&GU}yzF}`HX*;QrPV=2BQSjl$Kk)5IjAK5 zOE#~%c%fb5q)2IKTYF%DtIXY+mQlz0NSmG76z*q2-}(5s@_1$9{lbaBve>!zwDeo& zGc`POJV1yxSo8ek!t59Q=f}YyGaw9Y1Gk`lFxzkKW8HhX`MA^UIEQk!#3Aw}<83G> zI_Zt+)R^hRf%K$YmuCe9IG^Xg5hORmkyI%RT}@TV!3akdOAjyxG+=_4BGS?Np)D}T z+jphKYo-rd^!@+9BRFQjLx!JJ?dyAm(#7PR7$$U!X{V8ZO7v=YrDOjvx7i&Qgb7jJ zxxq8P)AM|u)2hk%GjqQ4#Bl3_0Mq8UhTm{Frsf&Ed+o&xIY0CscAkXE#2Mii4^4K7 z15)>Nu#~Rqz!x=j%uQ16EJE(lC(;4JI>u4%jwjMfmOgHy*c@07T?#VKv*IxdjSN|tE5lg^S)Ol8^!7GK=E zHa?j3GQ(+v_{TN8t>Lyh?;f_YC1f+TN^x2co!J%w0N*_@eT+WT`@bXIBbk!R2@g$8 zP0Ac97}hlO3bpR5=X>HLyxAEhk&q#_&+75h<@oby`gC$TSs~+KAU1=VCZ1>%jpp|l zLO2izmvE0SCqs--YcU~TITnwDR(&ndOiHa*mY>mhOi{WO`$r2HWSE7`z>yG;Xz-HL zS84FuG|fHXmiaArJwVNU6j>N#cqFA_;Cgj?HtM;Hu|WEeX(EedcS8{a$!_G02Ood} z)ZS7IU2fgYCj%Ik`vM#QwO5g8OiK_nlp2NNFl3HcRM&vnu97r5Bk4k#Xzc;uI+cyI z?F3*{qUQ=Y|EuXtLz551mt-qgGqvHe&f6XH8ONLid7Omz;<9chTD;2)V!gZPI6Bw` zJo=wn<7KxWky<>luo2Bd_tRpi`j;8To@w_g*rrrR(juI$-5T6k#|rrZ7uM;2wMG6T z@|gGnJW5)oh~G7J$FL38N`AqYKwd%iCjVRT!2|k8+sk6C3z^gC%AO=u3{G|<6;NY~Dy~B8 z+UJb=nJB%_j46z3-UfeB(bY_%egEkUDp5D+MawZH_T*x*ylxw3=aJKQYFmDmw*XkVXg$&|VUw{*j@W%MWogeRlB*fTDSM*zcdC*e}Jd-m-@e%ubgF$f$7pb30Xu#F|6%kVo(Hl zDPknZy06R`Qp3l&?4QXpDD!OoZEFB3^xtgFf4M5ECY{Gv4)W60{uV(3+gJiwggp5D z{o&z(BzY=nx?HK{k`jpkLe#&NkY}1=39}=SezljPvv#N;{wI6s#fnviRyyC zyY^$iQsVff!dceHUTwc&f8^P}2epOP06NoGBCHSNE(xJlJl5J?lJiKxf1oI&-*;h* zReZz9!YdH3oKPDt>sMcf1_nhpBs~t_>Wr0$k|=9nkkdzC;r7705#4j~Os?WQ(p#e& zx|`mQtpX8%2EM}j>`=&f%-}++DeIV|mo=Bj;24$-2bSfINKo6q-2esLU|xH#rj4Z7 z|FQqC<-H711(h=W^{WB7R_j@7O=#oM3Jllp(_UpI7+5p9pY2xlXW%xji8bFp(m1 zG-tO!4IcM`9XT!q4F7HF6f}2M&J-@G`+{t0mD%(a z&wv`(UK4QXJgtB+fn3R@kjt7G2KeDuaOk2W?|JgsM_o0;7Z_kCxaG4#u3x|`t62x@ zH6a4b(Wz^WVoa}nY}7yh7+&f>*Zm)tJ1$G?v=tp$lC~tsXVZ`^V%kEZ$VY_z`yWcN zga<%=esfv%ZnLiuGLQ2qCha?LL_tKqP%NkD&mgd+z6Aa>HLp_2Lfw8xF3UkZ4CCS` zNyF^#QkYy-@Iw<1!r$CT1G+iO!kNf^7rvXBA-TZiuA`{0=S??B?roj&tcNIz9>Zd%kmsjJ7^ z!@bO2Jd1Msxw@_wk134h$HRpC>~n%cGr*HFK+>!cZdO=t|9?b%by!v3^EF(qq_lu^ zhje#$hcr^s-HmihN=kQkOQUp2gMc(hclUcPpYQK^pNBs$C-$D1y=KjtIdRbt7?|8X z9&v0OG6yleZb9(#(|#_ynetDJF~?Y zxY6b5b^ogLpHYHZ!;L|f3~DSRPI4zJUO`BY-v%wZpOb6( z;+E9v$OW~v_$EYC&@vB5u2IW0{9X*2hJsO_ePTtGa<-}v#=x>-jbcAk^X#OzcLuoGSYRAv|QfYCXqK3wRrRA@U6S}UaZ^Z};KGZtz>Zr8TX8yg$;k&;Umn2=u_iVOE% zoNF>(Ug-@EGks4J!FO*`F>fAlZ#lUr7gO|F@1e5V^f4trPoSam7d1Bc2Mx!lq4a2| ziT^ZSMyqpY2Xmr;uiHiAM7ZSkV0xZR{?Cj;S@jdsk!c%5t_u9+NeMf})m!dhmgkuV zoG~nIJgo+sdLO%S@2YG%=Dlug4O2kW47b;|W&#a4$8B3@nk3HhL$3(0Lj^TO$%lMZ z3!)RDbWXWR+4 zXRyEtM(@4%?pjp(odtD3O`ohB9S|ALL#3XFG2e`jlkuKHC*eDCVrrsKHK~?ja zM700$54+^2ew{*z$r+jR?nH+DEvDw}%GiPAGD__FAekb=& zsHIbp%Uc=!HC*^RftI&YJv=;RTF&EZReoW64|ES-AzMa9Z z{c`4KhbPme!x?za8Z=(?hPHfbu?0v*%CciMkD?-)sPeY?w4l4&^!pBU$cgh{)h&n8Fj1yF?p!3M}qwq1Jwn){uEq&&el(MSMH@t2z? zs`HeFrI7D`6OXEWY4_z`cF>1L*in*`m3Qz+G4yR{)05+%dA$elEw^s;6{#kXPgwsL z1hmeF+ndVj=mjTPQUqAIjmvg((ID>`Oicp%kj+L;_oW|-r`NZBNqh42-uYrLnt|c6 ze}|!A$57KhTaA*` z6Xg-{i0jVa%1wYozQX(;WJyQ6MP?ErNJ}XxZI+>rW+G^#^XRvk+~aYX8dR%}lk$=! zxN4=`Hz7sk*;BTSb)RD()$h7-aO4l7zQ4KV+`MTY+9N*)9@yXi2%fv7=EHheSN=Zr zwhwOadyiUIqw;k>-L|zK#Yk*=l0XU9$TXf^eXywDBkK|$NBUS|M~KE+1T>; zmP>rw_u8_b5=xy_UGM|il&S1vOn(})o+R}CJ8^RnPEYO<5vJpd!hU15xig%^ouzOS z)cx@h{0zh?{|JQM3$AeZ92=9xdj+`49n&b;skCThHI?Pcg7Av=8+tr4I%3xUR%KU7 znCt*Hys1Hq({AsYrCoROj{(xXko|uk!zi$uV`po+*d`9AS;G~ zC!i(?6khcR=-j}CS$NJg_J4ypg%-1RVvmod#_1>JN!@YjINeRlk-Z9JGUcLHRj^o) zMTG+D18Z>=`2E9E26S3gC8sh{Zje|VC$p9uiS&VQnLBsIDfy?tm7SQf_47$%kJcsm zH{aoh(ZE8X>hi*W*DHq2>UzX%6seu=l2v7OH2;y2Iaz?3BO}p$*-Va6wWdK#@}2oY zslrt(n`|ItCpkeqT8^jQ#rQjk9{d6P6*AAYuZthjl-A7tK4$St@M8I&v$=ci7QT zGam+o62!X7Ip#?vuW(ve7#3P8gCm6j?s_puyUenJ+tN2-2=1q7GxP>|F@m! zHT!N90Od(AfH{IiesdF$47`?&=-LWh7)JR#-rT3!-kN&8Q=Pu)A~Uc$PrKV^!Dw6z ztuqyHBsPfDtEgd%yLH)c$WP$tKNB{51A06%9$LLgb{!;eM4_SAS!Y7^0k)GF8JhG? zP<4l7;yKg%CQ{?xP&56du+zBK{6MIRXwhBpl;m3q{qtkm8i=@j#X3i<@xGs`&BPZa zni263jM9L*^Ph*bqP-W~Xw4*dEgce1(wZZ!-%l)x$Rhj>0+1LvNOb?{S}uqQY36HQ z$B2TThu{yWfy@-F$(r_w-{T)Jr-OK-jD|LX#$l@sqMs1XP+C)NreEdnzzH5B?38gO z{y@JMhurenoL7dO!zmV4=QU}v#{6-g!JmaJ%UO}&=XLjfwi!0LM95PO(dVUtU)y#( zBMy%}8>omkxA5%xaBu+yCYk90ID1uvOd6Q~sF@7mj2th>rC#}AA$x06o6r+)K&+859F-}Bm<;%%Rs`gUL-yCtn-79E zFrc$l;}d-pIKom%FF3BD2BIZF*84{ zT>G7~5!%uXcy^9j@{ZL1GWleGv2!ij_M~lsx?px|*eJH^TFE2G+5!dUI2SHj_y)AI z+dTTyx}Sj3-w^=lEZO z9RNuawhAh=VVlq<%PRlHon5n};j08%yoKN~dPzfs@$>gs;QLJh+sk8|N|A`@53-0} zOn;-Pa1kQ|_HQ@k21+{U8gzYgoPJgT6-nc;k`t*KFGoVizYDK{p+EfOT}q_i{x4%# zQOxu)DslK<+zy7ALR+iAWt+Je6FM*+tLv{)RnCAgkrBdnwmwQ{u#@4l!wy+^qjK^8 zO5w~gP%r~_dH@{$af{R#u(X^cBpbfl77kxUNxh8p7-rd9L``$I#II;W ztO!{@Ptav^POk*%k=m*{U0iO+r}2;~$e?cl%^`sCC<}L!^3Y$jt$swol|dP)pj1EQ zC!>S-$*!oOv>j+*ij@lfQZuY|_f8@D^O3yl#9G`3Wi0{=`0~@~C+o7Iqi;-ztTizK zJMK)s^y>oT9Z(>f-HPro@uN1fQ@MFhi;MiSbnqieY7c4jJRFi0G~~Vy=x84=h9d6$ z7{Z}OyF81&Zr$?A!iYS?#wX*ls*H0GHDe9epC!PIea z=;jft&-Z>8u;ymBguXqNQIhrR$@%|F(*l6DvbeZbE;0mab0GcDR<}+gRsFEPZvRJ! zb7r!Zd4%@qB8;!|DxM6ZEa`tjlY7k5UPrJI5=Eqs0{7)KV^jB99umY4NK*V&L~|ATfFy05nFOB8d~1iqYmNfx zuUO_>h)L7{krfosgd-eZfW@*BB6z{D9XGj1X%}Dc@Zc2&1F z7Goou$zz|qZRT-~kGk__2x@x!aHQ2R3O)G@`APfV@2P_Uw(A6tC#_HvCflpoad;A{ zoKmvpG2y2*{oUcWu3e{~flG1;1Nli5nZrd$2u1SrUS`vwbum{{$+Xr-KC!vQz4iA- z_t)Zsm#bZ&+xOeMS0fhpzgia9?Mj~Ozp#YACmMNB9|#=R*()H zEr1`sWCR7LQT{Kyc!3^c4m;1M_Uucle}18?+=*k^Jm;VcyHnUh9Sy_Bh9D<@9{9gL zAuJ*}FHM~>F*9vy?jMihB{)XNxAE?_4qRs@7U{UW2fq|6jOD0O>5$nd4*G6TLHzT* zsBqpmEz0b3e_U(6Rw*SR>(6?pz6RI!#a<^E>^}213V^?81p`m+vqJwABzz*YUtqps zJs~c06yHY`WHu;n4)F8$%g+1ePq3gCb9A#ISk|AfEI}}N_d|c$a>ugfbbrWwJ1Nq< zA^7Ce94Y485qI~euUuaC(IiUjuk2G1wF4?sx-&OH>*9xN?d7gkoeM$8?lKVGBYM3J zu6H!Y_i1hRSu<7NQ5`6la^KlKK`Up44T0Dpi3Ys%6e?YIsw=a`sJc;cAtCD`=fL*< zmF^fB@x8>YnkbIvE4yL>20E!^>XCs>IE0IC*fC7`w?ai(@}M)NdM>C%-AkWZFGai^ z2OPv?=rAa+1Q!HQ%6QeZH*8Vj@))y5Zg-)e0R4A?gmuJyTf5yBkgcEi=I;P?{6o!e z@5)$#5#yoaQhG>c-|RRF5V1 z3$H2N*Lg3BJyaHfkIY06V`Rtpu|LX>XYGI3`kiP0aL)Xn^brv&xrD%DZS}$*VL)5+ zoT5ey@o|jWwg2V)ffyDE{0+f#*f-#@&jI*NcT}eYWe;yosFzFwSj2E3OC`(_03gu& zb$6t9DM*@YnMVwllXgDW8WBzL7;3-caNEO12Sj>#z5R_7B7|pjR23yb%O>65EgF%w zUssSGs7EYobk_YCrN4e}8fHttiq8Lg(~)W2ei9|$Fz=PyWu^-t*4N7MM%xASJ5TE& z#;tBVeZ6wnK7`BKlM+lmf4BH%FI#Ra_-RMygt(ij@|E91-dJAP-@scyr}oRD73Oy% zfK7KC1P=`-0Z2m3Eo@zF60mWAZVwk$Q4Az~NP51VVp-mBzH=zWx(c6(m&nfa)7O+! zuw6__QH|f&{XKHEI=@qo`C5lViv)Y1|H?Z4ot)j5cVuPLlq5z4l~hTi{ZnxP)5z2;9=AfPQU7s>1Z|6+KS z&L~E`wCRJENG=GMxELraU%OmctWIN%RvFF%(hb>9U6Y-Nf-w(YmBk4zMds}_XN0Eb@ zZJ-3p=+OGly49R3V?Ubd*O4 z^ub+4=3|I8*c<_iZsp?sh{UA95Sz;qR0?@JwB&Ae^M6y^nL)xxrS7EvKC8)UFnHR> zh0)aK8=)=*jcbgI67nuF;NW}|{j$sdZi7FWsJsP5!Z zWmYWzf{gAY1%3DGNm8H{k_jB_eJyg&?IU8pMvZx1IE^A+8kb-!Y`8^+-#|aI%mJsh zW+ue>HM28`OAvHl33WM)wOJgdWhOa78ve!T-bGQ7+Iz692mff6ZsA}wUF3M}9OYz@2mv(XOTjXK5pTqZV z1jMNLY?{?OaEFP6=WW4akROGA0Fl8r=-k~36CNF2?=}h1DnC8X&-{*Sbh*6O#GKun z7qZUH_hx7#`8^^xgQM1St9{OO8%cp)I)Xduo;l_)1P&{cRV7-PzW#y|S<*i`&>j=Ofmg)I3N z#w}18XZQW?E4LIgb2S0r-yvK5<}X%egTZY7IQP1y0Of5CSF;rkYTLm%+4B4R*P2~8 zHuST?lb!b7qEy~&XX;Xj7`Bniutu^CMeOATnzq9$W0NOK!Z9QwG^0)S6kuL1GkPk{ zTZ(?gyy+z2X9v+y4cJdN4ICAyl)9X?+q_sg0u>|xB1!;g?tAfoGvTBUl}`w^UWUWq zuTv(2v&R#eJk(z%J+B4KaKwQ0&QH>J+V?~GT}>^iO@{~JvIaAwaj6Ou#w0&N=kzh4 z^BapkF?}fL1wVm5H7o|5Lp*~d1Am_MQy zo-EUJE!(f%h?gLS&(&)Annc%F0A%dTH%L~saHbFlKtcf>ftO)-)7ao9bGdRE!al*z z1q=juANf_Rv1^?xGn46mlOC<* znXBtrF;rOEagv=XC+2ju#8xu&9+(pWyfhk^f9vk&q&izn@L=GlRSbWzqAis_KWb9U zhpN{1=BX(A;&32_c}d~$ui-5UC^Pp{l2WI>lsfVv!5e`n8O4v!N$-#V$YIm!MREVM zh__l=HeS%n-Fk3NS~i^bN~eo|_22sTTnrq2jna)c2S+q7*O6C5)(u^G4YzSY{9Kk5 zuziph7RG{R`QTO@BQ)5>vr)i--^fs?I{OVOL~SgtabQmNJ0QTB^yX_|K*o|&?~7M| zB?_6zp_6t0eC(XRvu0Z~(@0+fCK#mFP3={mG9JOHzmq_JbwKeoS;8P;Z!MFJ=JJp~ z!Bhz@bQu{XUl7db8MH40yuSCT^0v*2xpNb^+>njN-+62R#8Nju*n?7Au6n?S!!{lB z$rR_`PmDPXZj;aGZ+qng$<~(beT-3wsuBz+1D`OC^H*0vH`fA`f+w1vW+3u{}$#AbOis)r&^~)q#|aj{wQE$KX;=rF@4xkh-|hh0ZF{BI5zOyI^*5l zUEWn`!Gpo6@n{vw@w)W&1*Uu1@lBV%=|tlr{+Jjolq|A)njq@2GJUdjOng0CpMXr@ z_xWN^*F?3b_iVx8(zw2j$yL*rz6K8ZkQXWK)Nik-UJc{N#W|U*O0MYpk`_n{`GEH# z%<|WLjzTsQg`-+>Ph$APl^{j081vzV0-)wf#$iOGvnZ|&**0KiQT(F7Ok42Ej~{KT zt{H<=P+{_%Wox)?Z92Zc6&H@zcpTs$#yNwD_SFmL_oO*hLFKf9sM@b6nLVO9t@w7- z{!hUKCH5*^H$E2nWP0_?Oj=hzUg?fdOos#)DT%#N`?vOkzmU60r$0NyR_IO4(s?G= zjG7mt%;qBg_Y7-98Z*;$@R#{a#QFW4&a!=UnWWY+XSl2^gM^Bx0tGCb3w0NWG<3)Y zJ5SFR4glMWh6{?n6gRaT8XjafTh=&b`k`p-?I1Cvx#jq`P}Q{r7V^yPU`3|iIi3|I z#Zvcq6+!w>4cf6~Z%f7YrrQ3YIP)gUuG{=wkjy?-?+RvTW5}}WEK#GqC*`J;F+FpEWN& z*yC9ggHR)`qQ+!$UXQeH<4}b-{m{F3XNpI_3L zY$^&BQ4lcBcbI4*Irc4D*`^jr9Lo(GnO=RI;&uLzt2Y(Bj~2m>I@rI#FUiyKv8lT- zH=UHB5Baa#I}{_1UnwO?@u4l(_D_Wqw+ZZ9kL_VgK1$SOJK@<948XOiz;^99{^#`= z>^B-4A07atkf)zu-~5qHY|iMLfJvu_+r?Lj+6uL()U>TNnn{2tqff^b_lKw590# zx|(y%c+&Eou>dfwhQiV>GUA)J?J>>}4}uq8v&#$=w!g277W{+7S1vmP%z|1H`}e}% z4k#c2q;T3*u&V|CizfP@s07*s@`}jND|22G+fFYNoP;r=QtNRNP+oms*mQO z-lYLo4gU->IvFojZ8&+^b7xB9yBwGnXDsk-%^V4y(WFDKUj z&xLb}qGLhUnvZegSS_VTt_x>zsX){HJl6yw3d;Od9B>OxpxP{GTIkqo`)b|FGQwm7 zN+=a+wc4hR?-FEyQEc+cI`xnS;$6~#M*bsfr!&h+0SO2)GZEX5f~O$6|BKWFaJE3}Arv^E?Go!12mo+6-8e>od_!x`N?)8-RZz?< z*8NkJegx6l9}}zTB*6ax5lv&C3JS15o#3)ouM94S8{<=a%4=9;6z$-F3ZuIQsUJhl zloM!kB$TEJD6_X`_svxEqNPep!ql;_VWNAQo-!NkoSkz%eXgdY z;&%Cjh~LEWis8V}*WLUbL^o4qv(7WssZHRBL01rp_LkOzPCSLu$rV4c?q-`mL}~MY zF*yGLzQMg~GW5^WvAoI;liHSLA~uuGuBZWh9!aYd%PenM>`Z>y2Pds;28bN1h8r3{ zyD)S`euiiIX=UCHgL%vZ+jM3#b!NzXrUi+sU?m%evjcl?MMiH{HDgdeJ*e2!`r zY_ZDC+7IIRUo6v6^78>d3WAq^pDd3vK1~GHp*LT;SJ=t9H{J{UxbW}~<)EA%g`f+P zj}dO~_j>~AJ+HA&e>bh;>uK~1-uDvteGq=!6C5Cv1W(XI8VR*!sF3LDb4AiM{>=Qx zM;FLcYB&SDs|Z9L9V^_cNr8sWseC5FY2_fEuT+$@n}*G}tgAGDAeD3_k1Aq83muR^ zK+YLh3_}*0A%(01)T)epeF+Q0Lhcj=z$k6hU`=$}dY2hms!X5KU}3DJAoGK$s2mp6 zd;*1E)I+v)%!!UmMg^`!96Xt)-W?uHJ7Xv_eJ{$IjG4UIkIRK1m~T zEBkH!LE!*^#8&wmgwF?Ql9F;_!nCJ?UG2jHR-Fz5t^S=*XP&h4Jg48RqP?y4tZpnW zt#VnNMOgR5&;IRf``PKq`z*s|G5xOX4bhLoye1((5P;+K0_?H+hZ-x)+7JJNFk&60 zo0RS6ntH|e&MX+Xr+#ozHyA)t@Mu3a0QqML3w%TUfEcQvb!HN!Y$mwzYY_T-{hst) z07JL!%tZUBD3UQeDR!=N=0Wh67AXnG$513+7ZT zaArXI@LpUP9DrT_PG{Nx=rSsUO_{TjSJfYim#7UZ>#+nzP5zgYHI?9X9gL3^A6|N> zo2tMAu4Dx!;7Y3gz+=;>-=_o68>yzfO=FH%*O$6IbU3pTFYIzchHyYBUK%v=8!#HL z)pbUl3t!_wH>0B>3>8#9Ce2IYd7--Ra^5NDPeHh)XRYn;PMhBh02{?3EgVlo^GW~F z>aC6)Pr`a!s)aOa1ZBWJ7FyI(0=p~6N@dbDcuwj{7`g@pwZ zqLD_Sp#|Xo=8BY_q_~-(t9v%sdn}!mj{#Il)N{J%blXBA5|~kZq*1n zy$&a{2^g9VJ+5SS+leW+v2TASprZE|g-?K(S$x1LSAP5P8dF38;q$x$kZ__cf%^~8 zz^$#dVOhEc_)8>#TGgYZs-5yo()BEUsRnD4Km|*BG=o+FP})fV{4@mO%V4TO$(6`~r_k{Ft3-bhcV+TnAGTmt7t3g45B9yrYg8=|wn^Y}=c+OXC(t88vna&D>s zdb@59Q2fmLu_F^tjbrW=Cn>(t_$l^U9Bz!(Cm4auN}=s16Ys{^KuAq~lFVVDl!x6i zxXFjt&&0faiQKaTZ`Wpq&EZm z%)x80e(TRyTtX@q1T!!xpvQ%O&!%s;m*;&KYu$xw8>9fN%M-$1par3jviya*DQ{7R zZl(0Zpj2W!kzVs1d`{i_dl59!p<@G81)`AJp()jkJq`U<2q-s12gSR11Nj7FMVH~0ZPaPN~`S)WWjN}V&6SqSep^+))=#2O3=kxEU1pm`~WM~pm|Y7KIaee|t7 zzjZ}2H=6|7_0RD|6@dr3K#MCN(y#jBx>=^0G|}2?wQ^V z?fePh0792v0)?pwXATNq>7@^p)E~aJ4|qvXj`u(CE$t=<*vfwOxLE112;X3(fpFVC zAR?L8W+REAx!q47q(tDUi-MCQ&WSvLk2y3K-{7I(RoV!Ajkt$Wg@k-@wA~@{S-60e zAN5Ise+nN5oGYB=W#eAd!66dc`A=x$@jTv%Ja=r=1(OTYv*VYv%@~w`?Kc2iwQ6-8 z+ci$*RnC_!guxf=sCHWmmbU>gbY@?uWKepO;d>C8MMyBf!7dLBc<=UuwL;RiO~37? zPukLa>lla!uC6k>mIq8-Rns0~!Tc!qH|I%|*}H0lWf34C)m8DYa!*h%-XGmvAqnzNCYk6s z-eehg_pF%wS^dyNW@9_c3De|cJ035?UQ+^x?|Cf9KKMs`c9QUXcKNfZSa=y^6s#~R zkgRL;om9_w;+lb?6HV&1)g1NE%3D7cA$v#J4 z%UXa28bBaXQ1X@)s6@Y)^2hOdscUyxeCTiVPb2@&YNT>1VXPyqxkVqY+KJzEos)Ir zEBr};)T~dE_Jejh&t))enGPD5guAjv^y+A?mlhZ-nuw|NP$4I-m+rZ70wsV91~d(m z<>y6&O-XW+{l$qB84MnB7B^_j1%Wxdqg+&J3}w37=bU^dHzGp zk0=X(|JV(7ZOd_V`vLDw?gelm6)|GOl#whp@<^afVc#5V1(>F?qHx~*an^C6_|1@C zeqK9PVmLFfx#+M&rT=I%ynTBTOo$bkQ~dsK7JyWlKm!cOjf^Du&$3s<{X(D+zkyg~ z<}Kru0GpHfU>fP}x>(W34rC0-8jEQl>ka)!A-aml$r3QwMqaqW*GS~ZG;Dsftd0d% z&W#Wyl`<@euhA`HY2lzVG{hZ^Vxr7A%2y)VUpW&$zMK*MlG=N5_volnrG7aInVNDi zp~K#)=b1%dpgP4-aIkhLv0!g=+G0IQo>BtBzzTDLrd|?L6#c}S_m#g{0w*KenDVau zAcVQ~pxBdqvX+b{F*E?R;GPkrd@#WBud+jZI_5D&bT7mES}XcN=DhQ(4sT9P$<2fv z&|zL}tAU+<7&G!!OIyuePMH|6@b{qf5!BfyUU{OwF)E;2Y7R*_#i|9YLdxnh@C}U9 z1v%tL767Dl@%q~OUEa^9Be@J;FBiXNU2lQSL|Kb{YtQ3y+qi(DbLl(jP{Zz}u9%HT zA#myiA)LzgnKhR`;4S_@voD0*tnJ0(Hc5WpKaokZwE4*NY`lWOi*pPVZ-dF1-J~(} z`p;Lbrsl)ib{C?xLSGw-**IGKeFS7&?RO z#ubvrM|mxr5tEOB!2@!rC(W5loCC85js|1Aw+wE(jQ8*$Npv*Un={8@zu;B@jHl~V zs}0lwD6mPS7YU6El-Iqk*HJw-z{QEVncit5xb%3wsk@EB+`sLg8bpI{f=do4e?t@AQ|x+bEH zTvxVgWdaL|S8%mh?zx|TU{YN^*K4sQA%_2x3iZNa$8?fs@Fz7u?;a&=l#zVwse+!t zH%lFdxK<@)QXOp~+Fz&Tq%4%k>->s$`LM=F;@o^Nr_N&QR&(xBd2i{eE?rt7X8PT; zh@03TJm{KYLej1^4NxciseicM=OAG9j^?@|s(9du{Bqc!-8`uWjE-K5zguvbqH%?G zB-T<@SZ2JdM@f4dJ^AbWChoIP+oagzc=P_AMaSc+UrJ`0n6ZaFL?Ywg`G2Ye`Bfd2 zbZuZn72Cn!dy{#H8pm!$sb4YmaSQ~z5NIVrf(;LEzRsB>lEVcwe~x$dXY2fMOg@SG z97<0hS9#Mn0z+9lgt0+*xk-mcuS4e!ASpkfLN1^WktMuXb2o7U&N@f5>fceW%VSK; zXW|ZSkBEeTDEM$6R;xf^r0v!)1GOUE`RdR3nG}@6542X21a;y3SR0hT(m!om3ugkw zK(_w!bdeb8unBnhUNiuv{aKz~xSxK{id(cVEWFa3gMyrk=!{PDNu^FSp5KonMZE?V zJSqXCd!6h2u7JX4kaZ)@GKDM4$!u`3?JqqyX|>?il;Rq?Zz{?65rtP?P*-CR4)hb= zAv{kJ=LDax&P_zKhX0410uae6c&h5WW@l%fFta{9$ZD9GfS~a)ek7&PmLY&TuF_Gw zGEIBGZK20uzQ_Ar$)D`CZDr#O)S738tEx#AJhvYC7%_Vm@>@o6F9 z;#}CxGr0$B=6`fI>b#e9m8{0AiGaP6t^Hm z{-ef#Zlb4j>#S2JC-ALE2J&wzC zd63UOAF-~9+#^7MeVbmD-&GXn&^r3rP|e)1T~O@vHMs*&HRaWoK-=9BdiP*kLs(BN zk4s%g$T}J~lw&E6Z5}I*TA9?vbPkLxPs~m-jAALl0@F(fd*wnhkmP*~-u$lsnXLY& zLc8S4-KA~CsdFrccbI+v(BCI&xN$8P`OBOjZWEX|^xUr4Nw)02(Ilvlj34wCMO!U9 zA=a&V`hic!bRjPO-N4ToB-3pPDzq8~=m=VY%-`v@OMWix#K6iwIjj}5H{4dYXCGq4 zK|%9jDC2|gZ>+6L>hZ0yX8GAZU1&a*G%l*V!$#S&a>2-O4p zli;NZ?4qhlwfNx9R4Ujj@a{oj@-Y16*sfQt_VE;Zaq16Yz5&2o5gytg;jV#t*z`^t zBsI#aArgOFR@^xG_(DiIjLeyeTkyAtP^ajfzI=iUmYF|L9;FyMOBkNo7)Q1RCk?y< z9+rhe_Z!PKkkh9VY_){mB&;X7n8f8{VWOeQRj_{C#L}Kx*)Dq7USOfP0&ks=_6SMs ze>l)|Ix3R9zprWUh!-t&`4`OogeRo{AvOpUHeB_iFTcNO4P@Mv1_-bi=1Mhn?Y&DS zZT910jeX2}5a7iGsGv%I-zmTcKl;!Sgc#~>>!t{Z%|S1C^YBOi?pZ~05h{;BR9E4V z>AisHg>IAmDF_{9kGKNi;NMa}h1rmxXWXEdXt5l{V#wg%Gp+%eWLaSawB5|@Oi249 zHYG-j-B2niWJBkmF#g96@qyp zhD;`*n(V@e9Oq{MKi*Aup9zCLN|}$dK1+#ruAFt_0RmnsYKLL*ZIK+k4vgilqTwxp zNaTy)I@2FBfeW<`;bguq)z$MVdXepaOx*P~#LsRU(a%^!gQ&>YP9H0PDlB<|_8Vt; z!1Kk^Oh`tpB*zxDT~T7qKQJl&Jg}@s!8n`}U(?4D$w}$bQ%d51UnoX+Y!2C`*R~1$ zl}A+KTAAOo_pQUv$>cMJo~v0_)lohxWWxQU(L?6>Hq#?%vQ22^H%cHUu4^~0YphG6 z#J?lFW-^}gc#jMsh1X^0N(Vk_g8a?+v@&R*br0YHQ9A?Z%HRjTb=Zr(WmUI{X1sj< z&3W$;%O5hC&P1Pc`R;Lx*-Kuz>kj^OF4mYRWydS;;nZm9OOG*L^@qVL86uzrv3C$;xBC72TwV~}PR(4c3yczmp;vc9KDcKK4Je2u zbynINdOp02uVi))s3%1e3z<{NG&cxqi;HNR%28En{e>zlq0yrWNl7G2REP}3S}dZi z?$nV`v22B>^+W$g#UO_iGF9~B6S~O5oUJK9nMyl%9t!yR$#GQKAJs0eNT74* zAKwhX1Te!7;uQLEG_|`pzqcxsyaBx({EHt-D=Ox?mz~HegrGk84xc-qIy3!QA*WdA zG<5Oj%)#6$QfWrrU;)wGLM3csOS^maa5{fsbMe5b5>ZJEPrIg44a(`cK%4&&)e7g z`*$Y|YuW@a8{pA1uB3{PXREBfJ)GMfIbKpGPgbTE1peQy*EPaS<`&5fU?%MPw3@Ml9A);_3yCCD)V4T*rTO_~3=|CO$z=!=o28A)Y6@!Z&X-hvnK0S4 z5z7@YZx-`@@l8cagoIdM;)PKpqSwk>mJy@hZGGxN&4V37i+o<4Tnk*1L{!D7ZB}2C z&`+cMWxkhduHMwnX32z$f1#YXNS@H#j6>M;s}5{{{t+(mcB7qJ#Uzb+d+bN5**FAUdai)yweGyca^It| z>qL9EbSGu(L$#b@8G-MgYgIYNg|x3yxMtIk1x_Y@?2m+%_;%dUZrq_z{y}5mN_$~a+M|6vduggsJjL)=5rrNLpx`+f5Ol6EO8>E&TcaaYUnzn=) z<=?S&LXoIr_1$g^h37J3+zlc}O#Otqs&^J-PSC_;82+VO; z{(0fJcHu5Aj=oLt^>KeJ{+y!os5X8>MfdVo*!54q8()Tmb}{-j?)w7;^&kTT7U;rH z7`wi57NzLGICaCTsoctlYw;G=Q2YAzU8ix)yLGY1nO$}}P=`Y2!T1@LYJj4;(pkV51x?t**{fyQ3Y!DtE=!2;! zKp&7O>_Ja0bu%Z<4TsyARzqw{A7jP?-N0WF+g9J&t`|+XZ*R7A(|4=E=2p zk37W#dE!hAe<}Zby>{PDEeZ<2FciivIlfe6!7qd3;2ZvsGG<@yUPqQt1D|nm2ECt{ ze_x<`oEdBPvASd7+xa=Yg;Y-Q!9aYa&BEl5B-{ALgu0_9`HNYC`eaZNn4g#rI3V{W*$~4m@2HyJnnBd2o zMvbI)1oqg!NS7|CbtaOZT8fx%2onmiPwqF<_tjf0UEE_61pi7=x|f^^cUyy4-&_A_ zaya( z@A(Uh>grTNvnbKT`)|poe^+1Z>+GZC75fuDN&|sT6J+byVs|(u_507aa#%}hUEqlM zHM{CrI=3);&QS=I=J1Lql@Z?V;wv0b)n5=VRp{&VXgA(@CA`DBY)4oeE+D$w&#Guh zZy#9A&N}iv&p;*AEnvJq?5=1~QUn*J-pS9I5`sUX?|NE)mwlHkl7k;m zbSKs{^evo)m1dJH(=Nkfs6&{SD`2IjP;9x=BL6`$BCb|gDZz_^I^fUbul13r0D;zx ziZ}Kpgl!nhX71Z5@mwxDbh6FT?cXt>aiaugwA9a+GT0@_bFtQ@85{Jnmwu&}8IRLS zDU8~dH(*l*Y$@b0ac|}%$|+{?&Q7g7RoH)kGyWL`_QH!}=`oV5$TG0JhzY*GB40jv z%adc^CDkTiz>aYL5jbY7F_xC9&rQ!Mj_3dn>)dDbqh3%RwyXz*9-bE3)l;wg zy9XJ1m&a8P@zVa4+R*q5u>6m!VVz|;t|^_rXzG7!$|O|myn!WLlFHa3NmXN< z@KViJr+Bsoftdv9Q|wO5isnv=jfNwK250}5>0xIBaOvHF6mgalPnXUQk&ebpa;6VK zrj9?eVjxR{eI|g``q?MF)!y=^IfMJA0cJ)jc6U3#Mut=#bWXTES+qZ85L#+xHC7FT zh{yY|x~u+{LM57`FI*8XAR*%@%w$ zY1Q?qPNt)_<=`%h485|GXCFqeEL;tSq^7el-!x<9r$j&Wu6$QwxBn=U09Fk@zWG3r zoQxlWmUd!-F=Ss8Zs=vVCrNLF?^FLeM}@hAy@=u*NtXFKk}~CWOpP)vFWS1e7K#-a zHHtI;F!3RvVFh%6MHg3@#{gI zxr~F1xAIMHbF4cj!80O8VO*oY0Lj=)tyKV3$#<{}oS$vwRXoZ1iu z2U@_66Ej*h(9^pfw`msp0=@<=-qZ!(wIiQX>op;{y<0s9N5X|Soa*I(C%Z#6QN9X% z;qxVxFiZd7DU0fAEm5NSO6&SO^=u8ltflb)`Zj|2IKPvAKH*H5dl#4bSQq7| zvxrDxcfe{|r`H=Rkk~a+9`$h9I1Z2}f&R-*uVd0Ozg3G^*C9!br^C*9_4b1kFM)o; zfJ698kKib6?0T4!pC$Os{j>Hs_WPXm)v?@aluD}q0{m^E7Zh#e8+NN{IFbl^n;auj z;(@JA{H{fl4vJ=ATBc9=EtovU8BRzaK#uxB4JV6-xiBw2!GnVOVr^X@Adl$(vG`PUIX|2{GLDH z{rG&rK7pI!Y_XMI=Xz@NdanWZ z7Y^nQ3+=^DSY{uzU_J2-)^9(-%dcX9f7MlFXBDHbC9)XmbTR?xkWyY8_Rfz6zEWt9 zF_d;1$C6W{rs^`#mJDhNtzSTQTz<;u>~5S;9&;ht)h<@T!Ge5A8p+Yj2*yxn}jwS66)ES8qH|+uXzi2;-660F}6-^nRB;M2%;6VRgGP04xeR zj9(7^{5;u7(S|BPmX-oImGW0Cia@0+GB(}WT7&H>}B>skk+Gxc0y9FTQ|9lzz+ z@V69-R1A|B*(|LAoDw_<{pDaw-yUrdxf9ofWV%K*jOI66_jJ5m7pN=L{E}Lrrl+TZ zTfCS!RwfyGLOGmHQ$Ia^6nX?efT(|^ntn6CD&93E7<-D}=rhfJY@szV@x`-}a`-S8 z{7XYmV4l=yedwP&hZP8et{@TC#C+rabn!`-d$KB}zmC(AaAdorf7yLIY6OJu=z6K|?LdCVM?{NkcSs*4Pb2M3WC(qfm(owUD7*~Qfe zGI4&?X8&T9`pN71b;}#KxVny)Y|)Al7@AF3{|5H`O{(196k9|zbn3XwQPC|^TNS@H zAV)(#c@p(=^00kcMeD>XgofZC4p5Vt+rutb=0Smmf2PQG;p^|Y@WrwtMa4cP zgD1qBbhy0hL?+453Z1Tus2XgBX399eQQ9p06u4i0&s~^_E(#CL@+%dKMzh!E;JA-~ zS~BJj`qs+RJk~Phd5mdy$K=t10W=%CBE`crT&xvk+W2HJi_LO!mHEql*mpW_(8OG| zb-KB4NG1Coq0W^Tq}K7LB;V!xd!Qt2vZ7*>=Qe{qNyP(Rm@6*=7_92lvmZ@>O8Re< zl^`$TDWL9kkLB)}VgB1CR(vGKf#`5m9n zOF4Rb+WyAXeMePMv>;5{0B|uzZ+9y5+n2>gSrP!-8B8i{7sXuBTC9ER=3!sNGhp+$ zGSvwF9aO}9@$0AEEGeEwQ|SDBaW1GyoyVY z-KltI3+6im;4w}2s9@XL=H8*#**=rkH6x^+d{Lm?w+vd-EqUD6wwZ?KODA*B=aC!C z4=mw3jv+6A&1SL4mW?~jdx6>NbzPLIjC&YJB! zN4Vn``50)9pXSjA+yhOKK9ieU(AR;zJu&)@fxd(F=3{RfQ#6dV^gJzwbcJ=Q1~$p4 z;wis~eDJ`Mdh4;KH1K_mbmq#-3GESo=jA_h;>()=UzulA_TwSOidXr=Rj+a!@h?x= z=z!gCHHIE$D>RK%UfwBRhmA4r(wZv)>#G@qV@cudClLj!@>5%l0;-w7TGR&?AE9M3 z^O7CO=|#z&gDB~g7Q&v3Gr#GrJy(;d@-${M*(e*8e+VcLrNwei+M0IHA7%Nj+5irU zgA524F%8CFW2JDwb##~pggcbGbi6A++zN6JG>;GXz;r~d%O|07IvjL9)M9I=!c_@0 z-`UmU(3M9Lv)*~p1SqM2Pw10AV|JoEs_PIb^EZlA0i(lMTM5c3Ek?9;F_a6YJnQ(j zstT)Lyt$JE|KMW)?|B1mhxiaN;~!1n3Axb>=8Qm{#^*~((egi~Ds?rSp>l%%c}jC7 zu&T~wtg(=LaeHiC(>vNlXS9eYWWx=@PYSN%^59BIGO49yVdOI8KeD3{L?uhL%+C({ zCB?OwbJF@gJ>e4$!9M{ef3_D6mtNgSzJAk14m&%Yyq5q`xciomx?nl;h_JSPGmrg@ z^Fey`cZ=x4FGy;+vuLxjMT1SYG&6f22;7+?m{uON76{8L=)_;?P^@RS63Nj0 zM+7}{EpMX>y%?LH9}@$*Kd=MwD_26vqygipq3$drKd;2&hyT&{nHHG&?=$9a9YqcM zqsP~U0fht`ra)?bD%rT@0Y|O|kIPsT_O|^?SWu$#zf<}P_JfKJ5hj0J+ub-S5I`j8 zHdaa#&!%UkOGLZt=yx8EM&7C~U;%w)V=^|}Ug&zz*)x_0v?Qz|J3lc`+D0Sxa0y1=Rr%1`WnSI_OBNI**GI$*152_3OZwjmo2A=X$8bQ zgYjV7)*etnzJ<$*B#Vca2n6;Lg?(UJ1PG?|)#UART#M)pKbLfI>@@y{BJcq{K5?3- z@C2@+iJrVrju%?bKHWXxA`=?KtR`Eu!+lc8_XW2IF(9^<)6=8xt>>~Y-N|EF6GxaP z`PY9xre{G(4sXRq43#xd6e#UIc7PLo24e%7)&yHbF9M7iFQ4Dgg!ED|5C0BDoG}p* zgL>8b!-S2|j|^y|q=2VHR^&h|_Kkso&QEZtcmk8w6{Q2|{I>~uZ5C7kUua{0ts z?6K*orp8xb^I>$$zveg&Gv#iL%7;I%)ZWkaX$PXtCdwbat=Gr4>X(7sf5>+b0K{E9 zR}kAf$Ra8S|CZWLmb8*NCuR_hb!Sg#PoAy8JEoXC&~xb(rCZ~H^?E*qlrr$oA|I}o zS)cO;RcR33E%hXRW*0v)d_LB=242Q|rwsPyq#2fOKFXutJ){}V zm&Yu{s?J}H>U$@kQR1KkfP7h#$G!PUu(2U;%)}2a!cvvh24XK@sNie#FiUo_u+@R| zgeHzw0>1r|M@gRG#k03PQbpP;yjgDWhr@IjcQ$g#X5PE>Ie$3%S~;zd08xAof+*is za!tn((2kd|4ZAKL=%Mw!TYAW1-dn(xj|{nF0{39PGXhX@evhX7=yQPN-eEnH;U`D2%h!l6oCJs_U~`zWYUnlLv%ZGuPKD|1t3*+9hFd29 z&MmX|^iJq2Iv{hTxsplnBzb3fotM0%x)igL)-0a$;^@u~&tw;QRCMr^kCe(+g2Bx| z0cTYy&E1!!w7z~PT`@VYSt;e?on0f!0w~G78HVixr?$muh*Cav?>VD=>QPSwx@!a@F$hb^9el+ zTP(t+YA0eZgKkxR544Z@dU=rIxZg)zj{Px+>&=6zOs-|7Xdkx%cM; z@_K-C)?08!wo=2hUM|aRmcfvRYZ7XIdG1W{8_}S(p_bcJjQY6h5N0irIe6_!)L0uA ztx$t;L0mK6EVlM76yw{WWu`e5+F$wQK4PUtBL!qOUMyn=DZoEZF+~b@^n&l64_=Ce zND47p-rXfF07~W`i`=(lTN40ZFp6o%ssd|;Hlw(>;3y{1-L|4=b#HdI#!h`5+%~Xt z%+WcqpV3wXDdghg^zzs`PpnxaVfuRq5wlX=qK^!S@Ap-a%2*i&9ea`{0U`uQbqhcl82~B=(AuYtaQkMe>ij%XxC4qferD%=$uam$Oi(Q%W{%qM z9ySDpX_(Ccyke;l5wPQp(&|N0rB9evW`NFs3qEvKpubfVEM2ygRdgK5uv@cwLBGiA zt1==%bKxxCou!Ok&J6^{?REitLHL+bU^VkJ;cEAnwbC)wrdxacNfL!s=*LpyQ^zu? zqe%s-L*bv1vms7!>y~$qZnsAH_6tpJ=q*-$e1R(AW*vW4k5i1sTu}#vcwA=7ZVU?7 z$*Ner=JW_Gu*;Xd75RGrZ@z5aJ0uE2G0G(EP<;?w#9^M=44iawld(B3&Vc;v1=}r7 z(hh>;3bvnG;}zq%MiT{s(@;Kxm1f;WSNhFM-R0L8Uf8*Xy)b*WBFfj{typ9(Y9l)_ zQs~9p*e_ZcfPKY>34Rb51H`OswVQVV+v$@w;6Xs}(ng#5cD7JtRO2U+d#phUG6m|L zYoAPM16xt$jce8ZmUPnpkwPA*Uyksup|F$S$M;+ev=YFKj|?ND)XXue8QpzUidpQj zQILPTH7goKgm6Opk)NcxtOhQKnrM)^H#iO-v#_-+aqMyM>#L8$^{l0`nq(*|4%o+7 z@w3FSs$RtLHN(W9UA&K?WErvYyuu*BR&1aQLQKNM8n-wN9z{5xk)PfN zIdYvV*4h3OZJCh1zCCL+!e=NR2^!CdTlNIjc{Yd2Kg$Jm`eyC9Qt2oG^!k0qxV*{j z+G~QSsenWQ-T1Jmu+>6YY9QQj03TUZ{OXQBsh089X_GKQb75iM*6;Sf!L+9!xu)^q zAy}P2uQ})Gc_kSPSpMnq5f};7%{wCtE;1>Bmp$w!Mcu^#R*V&d{;#3n3cWsVZ_c=T zMB(5xAZ{eAKh8i7;vjy62KQK5o_TFB-Md8&L}b8QKZH4_)W6CQux0=n`Tl+ML(V~c ziPxDaw6MGs26~%khyTGC4^X+@!G8D{9$=AN!%sk%J3Orc4*mpw5L!G?_!yIaVy2Z; z|H~19;MAuNDF<&@+<;0YV!a)x04T(L7OOy+b=hb-)g~K!hc? ziA2jvxI>Ms4*=T#;gTWXJyfM>dU}RCT6!wE&OR>T_Cqh&GRFD}*4nS1bWgKAMTf@~=_OA$2ZS24G7fL*5FK9tXc>92qpmM6I@u5G)g(xB$5t8==%^#%`J^yG&OpK>O#mH(0 zjx@&HA7^g?WL(LxobQL^B=Hap|@xA76( zto6%+fOcXpp5Hg^pa6divM6NDK0;gu6z-z96<-Zjc?n zXU{;*dut#dX7dy&0qx(#*!ntgAHe2-ACOEIXO(7P7p58=#=!o$Nf$-d-!3)AB&)Cp ze9K%L)S3^Nh9w|`$b%dabO%fT&}NImzFIPn+->@vjy9*VMi|Sc_w$x?-_P72c6`i0 zz>?nl`+dm{ZsEmk|MK z7`i&~;+X)aR2yM&L`eb{Ko8@!7h4ME7}5VEO8{=oL~Z}NGl~R6j=izWU1G-QKiS4_ zoIZAYFpb>i%EoN#6_0eFYF-jLhcEBJQFu09L7+st$bvRv=WbdY<~gRO5X*sz2;eOc zkP!o%GHdU54CXsjox^mW?(ik;eYhpJ@84eeAB!}G1+O0zRAAo*5C}#XpT9$jiKy~0 zKebA9CEx}s0KR5nbu3|?Nt=(QNZ$;1BjGeKCdjSuqv$J$$!!#q?Hb1I&}6V=L-(O; zop&*FB~+k~YHnR4l{#pb{-CG|U}0x=i=h2&3i3_?mDanbXxQ&lT*f3G(vza&zu^H` z`srsGlmfJhc-=;(XKzrbURkdtzU_d93`gLFDQ@T`i4%1Wp z=P3k#6BZ?+8VB}yo@GR!W*}W&Yv5*hg+5IB+QHX0pOWc9@7%up!L3f4(N_dy8N^1p zjreU4+sJOXJK)wR*eZ8c#=%@MGxziS{+zl+MsU}8Rf?SN&VppY94<1k5|!QvUeGy-UaN$4*;;$iS%(GLuqw+DJrVGWHEJ7&vhC; zLVx?r9wWNj;s#G39_p(#K@TE70& zXtc&<5y-Z`6ZhfGfjaG<~q6L`Q;7xYKrvR#XY(TPWg18KEt@wYMD}+Ef4L%rbWOo9lripzQJSC9u8lc@jIphGs^d-2q2L zX3P94sPQfhdyZD;R9NjeaY9i(4*Zq{xb+Cor1*j?V-WZR12wpyBR3a+mGBx3Wtod6 zKm~a@f`4rcnQrTOD&hyY^dJCgI3|f&&p@d-JJZ8_(%DAE`6@2(h@Qu`iJMF_}>;8N7ZUg+d8=j9$ggx6P=2bW;>aT@ZxnN}nO-8Igkms5uZM z!uwAUz0SKN-8IT0x4fM(s@$rOU$;fc!HNJ%+!-db%JJ?h3$>(=o*B0NA0pYGk8OIY z0B>xDKSQZP%UO#9Vy1Vp*&fUvfAwQkxd+71C;qvM@ncOIngW?MJ;GEd6j~Rl~#?3jC!pHLy zaaa7l{_e#L4=4fn5i-9)9!M7M)*@P3{}Qg@4l4T7jwoBHpZp;#F=WjVLe(CC&d9_6 zZg{t=I4X%E6z{w1H2l|vY|~G1$p8Diix}`&r*|70-{oH=5$fM64 z9Y@_WdpVf@jE)abjxB!j=|WM74P}5L*|3Y>wg7-F=ZT^&jN+;1PN##0mZ9!J!&Wig zs;5&DZk3m2GF>-KS5iqZ`g|+F)_A_%bE>KVt_BsZ)TgJ`udF`Z1HB@iJR&CRegJ-h7S_XjtQ@#f`23oqD zdc%^=>$M>mfyZOA>9Hme>AG@>uN@!9HHANXTJ$(-;R4~H;Mk1_r-}D^sY-4ex0I>-OT)nZf8K^{?jUkorKZIfCjwhmmr=f@v4^(EL-|tKT8-LI{)Q&brJEG zVzg_)@Sld3_JNv6A5@$9Ls^Z|gc<8_^!BB$7!qYPrbIwrS%2a~nbj*p;*%j+Qm-;O z*o%AcH`s5wErc&5R`c;T3shsm^-ALOHmszJ7(R%3PFJXBLFa+-`sk=Szzc5L8d8eakzktFJS5R5YeNm2%_7U(1JD&&xX2ks z=>2Cb6k3YY1uq|k{>22$6BFn&N7y|o)%WoaExY}XTA;AB77`i%fgV3upDu@z>9`aQyf? zUsm}tBezrS?(nV&Pdmr0YHYE{n)r)W8w~V|Bi4@UC}>OpWzPZ?|DGbDB2QIwJDKAV z7wEE2O3|nl&tCia<~mmeais9=XX(vd@S(lB%6E48Y`00z>%I6Py}BqAp~4s3Sy%nk zBMhlxvU*@P69S<`WekCp5Q*5!~ z=ZEtUI45I^p8+w^C9U9MThBBz_tUHH-slnol_2v?oYzN<|AwbFOU|yJTd8xG-6jk3 z_`rmr^S}GR>!LEO4%>1NVIdwZS4};>%W`>%9_=$cno2nxa}Wj);EzPY=br-~hdp&k z#4Y#Aq0p0LP~9dDzZ9Q4)}L<%zmTOaCwg8yO^Cz!n;sWsR)&CC*}njtsVq+ZJ$f9p z^()YdrZ(O-a#cL1?{9TGVyr^WMdkg%JnjkwHvD?%JD;naIw5^%BADU`d8Oe5JqS9Yjg_f$nMd6qch2Pu)I8 zmvjo}O(@sjHMM4+iCn6S=5A-eqJY%@%P2$3b!FO1c)3F8K&-*2-=du!avu5A#olrC zU}5iyNb0shX{BfWyAa1Lk%U{pltSNF{h4;b>pb1HcSxT^1AdhhxGxFzcK*%tCX*7HaT|6yRl!_*}1@wh5CIy+_C{X*mRFl z-%K)(?okinMPn<^t$*D8`2my!I8~mJoTdhFKh+mDdSJ;igYY?Z!>r$J%ogjenF@m7 z{=cyN2Im>MK|}k!d*WXeWTdreaXfAwHlLS={J!CceHT`(nX5s?PS8^7w6-C~@fY*1 z#f)Mp_+Dt%2Dn#7w6*uj6hc3f7x_CBynu)-RJ7|5vJXkOs7r=PMR-0x)IHi5Hl%;tbh3ztmUv{Z)$lx}_fs!T+C~QA2bF04|9fd4a3NBId@C*QM&FelkMQYNY}BuA?(3Ja|7(37YMMqi7%I-Du35I?kfiaKgrcj9k(wgqF>o(sA#T5tAo71L zM-2(Gg#tr@Ve9CsX~r(v+DR9yYXcfJUF2DYZuD>cu6PEFwgpMHy@9bh6lKx*)JaY# zVruVOiM#SpKKm+;@3-8h1+u25G0~lU*&%+RMlNjLj@~*Mw&KAhMNz?3+-J|DmsZoA zOdLaudiK@^(6Yag{_y%snlPe#hDr?xE3wG0p~H%p^eRbp@(L}#dAjsdu{hnC)zdN6 zUwM(vF1l|Dl0Ar#bb)}@U_mNc?&uLI!X;|bGCWbQ1NDP97@O;TIy}`3f@Px`aVUM; zUOs#rMC3OvL;n(*;g;>-pcXY^c)>y#8*Fysjo@fV_gu%I^1Sdsx}9=FZ#1;9K(3+0 zN`l=|Y8;tqie&2wWA*mr5S>$oRXt$N48`s&#u^6R9tKWJegA$HE_k&X_7M4UoGM1n zrJXl9CBcN}$m469YS&AxPBs1E0*`29;m#Wh=KW7DtNiEa$i{{BW#4qIU-MIBjYnNA z-plx0LHUT*++dYFgT%|QL@L+FToW&a-Cc(2m2Zq+ag%_SLzLS){BA0;-P4;N5n7I; zOJv6*^_vXq(?POfmzaz#z%(9FI-6Ph=Wapw+?_{PUwp_z_bQmGsO$Lhcg(m@#T6KBf}HE3oSD10|5AcT4X9Rv)%M2ginqPPT&hQLdNv6)KN2($iS@5dD|d367vfKUzDA1Cq+EJ0FdUwE z9C)-?_rM8?zF&nbA9|cO4)r(I+YayuLY&3yzEjAz;V||tH@=Fsicg}N z9AeEaEEL^pO3U+8Wj~ImqH|3d?^nb_V@b^};34dFs^Ni;;FBw|EM1Ak12aLZzsX=9 zYc9{QjvgOdIGJ|mt$g>CJ>0#xRCXEe2-AW2YGiL$nEGKTW{=`Vs2CjTi8T0hrTx?| z=8HLzwE|bpHiR@^DgK?Od?;FpIzY5kb-$`@+~CnLq&yLz1Ya z)LchIH~8QYz6V(llF}Fn0>2w5Fa6gZMzo^`t6W}A<1yMM)Mh-~UisWmX)$DwHZbuJ z>nSnS-Uk7GRgL+XXw#<9fj(idysm>-V^fVjG1Rzt+*dV>W^apVJZ#4LcNm6hz0=R1 zWnItxqj-u2R=qpJ96mgb+(2YPwMg{#=B1J$dGdIKl{1QC`sP@$GGlXgy_QB7)`^^gcAvv;6Qe5&YGB@ubSTt%%+~T!-^I z;vMvF;a7)Kx$9*J{o2{3P4pb@%0?gWlp}lt^Gpqu9Uc6VY}#5Go#%)V<8D-kQ*y-) z93fT^L%-G11oGC0?C1~v6@x|Ng18bafF2iQS^<8fpBs(-lwzWDydG;?1c`0QH{FCM~Ry4a>IMvFMnF+#|UEv`3rW9U>1 zCii0M>{|T+CybVD5w9q6(@fpfqqU&YG_6r+zMOj05^eQqdF#XmFKqbl7x3l^Q|xM} zZTOGXp3L8{)ET!d;^zy8WE`7kU;v!(MA;nJm~FV&w@l6g!d*I`=qGmK^L!x`#a^c- zl^3ryWYmtFKA-T%o}RFZP}ThMTUnHgORjzBSGq(-b@ueb#p5i#M35n~R6W-djrel2 z{)q(@CL}qEgVp^rKaRpWJ6EA8Z^l-si_ScsWA|>0JxzompEbBbEJi~NNSpWg@C$4- zGHNppUL*ySI+G+HSiP>xnIDMBS@q%*QDcUt{j)L@jO9~3u&>;dEeya^4o9$Ux5Rcu zHj@Xvx1whu4xiOCEGy;2KUSAfMF+VJ`KY$PW-I{lHOx;~J#!DAk#ir&%^j;fH(5F3hp~b5vX` zYLBBOs*)D=b8V{M2Wgyk6Z~1;UQet!ZG2aoI7z;*FP@R17Z^VBr3t_pDT}!<0$^xj zQe-9WIsE3a^)no>-)eh^TXmRueM~HtG4oTPXoAg2;=M5MC0gjbKH8?9Ci&NB+kna^hrGB^jgH;nx{s9Gzh?JiBXemveK%-P3H0X0+@u$uI1(jEW`wXXidm+xR{o>xH~_k~ic0RJFwumRbP4-p|xD=PRGk zQ*oQgQb*xEn}9H`ymWVRTn$P;$EI!XdRlaD_@#@1n_{VjVzrk)*aUBEfHN_?v;orQ z*f!1hYkB|j^k{PBH%(%ur;uWE=Bh97FF08(a7=ZXu`;= zH2UA=stW&Y*vd)2(G((u=%K?y5|4&RmHdYN5MXD0>hnk`1;OaNWa|^z4ct6E`a#)^ETZ*mSZeA z9nMyNV7*3Kw zdx%htSWXWCp?yw!_qdd2T-fccde}_m#2?SIDVF-t#dMAb zGId4kmQ1#N%9_EDH|NbJf*;%2C__(eB5iov5Ryn`oZoWq;* zSv*GNdHP(=Zgx3m4=OdIBaYf_g#i!Dp2&1*{&Ka}dIqe=u+TU;0cfZTF1P%}j%^=kf`Xg(=|xRTB6 z%L25lbw^iad4u7WlxzJ4gpNkM09+QPSysx9xvE9{^|aqE+q_G zYLo=Z7A*QG7amK$&Xs#SbGoS`u69D^JL&lAP+G!B)#U8cjBsJP6nrixRd}mlIB`GC zk5!5%aXBp$N_&#$!Cl{P_FkgWSZMjuE#~Y8HHp$6=v6Qgi3I^l2mw&JfqefPFIC^w zpbMCZ>j>5AjOddsj$yyhtZFG&^&k7t1PcOYbCgw#fAeEy5nLf00YE%q+c?~7)}X?r zaa$N2(a?Ih*|xv?rdOf-Z_}`Ff7EpMs}Inxi-AXJ`XN}t_Fvb#GkV83BfBW9DozDt z-;e+k8?88q6Z4{F*Axvg-!n@jyZdU`pAy95U;9&bX4?piYK#AQ?6i_>fEi`+kv05$ z@x8#KYPT`N&(E{rlm5qp05GggPt5UbZeN+_W^afO@5i_$wsQ-ficTbsdkgp{8piJ& z_ZG|&R2}yxX_U0OrO_->8Sj+12TNx6AG9UzNQk;-=*y7x2CAV@3gpQ@QLhvzy#D9< zJV)8^tSo5QqgF-pLnvwpOAVhiJu!o*2bd%qiS6MF7+Fc z3auTL^im?f3b7|`F+QQvbN4KAd8z=sfoN-NyY-cA;jiy>z?BS=n23IlBo>pJ#l`op z|A3NohQ=_8_{dzW)-uaD*de2<4b0OJb7z1%86)Y3N>5!juN_>i0E7OLZslXMnzHKL$_)M$y+VG#}|Fr_E=Z4At_L)xQ2`RcY3A&t|6(o^h zV6yVHLZ!0{X$XVW-laa!wz*`a{g5ohV>Tk*B_zU=`ZUpa-y^kT9FmGE%Arv88Onb~ z;^(<#B;Pp4Y}->;L}yVlZBuDr93h`od{e+p23SE;?VOHy5q6zOC5N;wFo{Hi)xON7 zmy2A*qRA?>f<^jIA%sLr7l|m|1`+&c@^N2}j;6N0=$NC+Ag++H;22BxA?f9~BIkQr za~1Ra*#zlbSHj|!V7{_I3h+2EVY7fKJcDEGYr2*>NHXWN$~>fz1&lUj-j|qW2JY3m zE8~wC`ptYQ5oLaxRW!Xqxl>ja^40#frVnuHLvjyDSITz_3QzpoG5*$Ou;nTS1+YtT z&RSxRh~kb7M5YC(eIMBmAO-f%yQ4!_Fn@8{Z`w-~SSj|I+yBM<7@&lf)S5k}67*vC zpl;_ulp6|LuL4sm|3N|@kj&b$kZAn3mC`~O|L983aN5Sool9c_xUOihgOa}gLCw<9dDWzL8psB4a@Tqa)=3#jtnJ^%QvoP`SmNt%Tzi24_?58q`{hK%=WZGqt|e1trh8_mV{V{fkf zP1sYLtX9;xlyTyDMFv1MoOlXyk&QlV&4Y><)5<)l`bXMxy?+J_fs*b5W}LA=i9D5# zkDRs$lrMBlf$t#ZXQGG#v!95M2LYeO!jZhGR@05kA@%GLA8@$_rOLs)fZ0D*yA3l@ zs)-xOt~oIbZ__ZQ7r<3XPW05B#3wbKGcBSS8LxwU=-hpy3w-2B@<1*vl*A%cn-PbO ze!R2;z334I`fv2j=Ip=BqB;D){na1M8?VenImJI4lYv{#7YpS=6`O(g$y8ca7X&pp zh8Fg*g{J=bd>{f`ZQOA!Nk~blV%05sU8pyto9 zj6&!GSq86v$LpYKP5qVYkjwS zy6re1l5BwoHv@);hGy!5b!%RLFUEPmW7wXXC5#xQhsb5}Ajo!DU^2(C4G)1Lau`Zd zH1uEev?KHTFrxy82C}F+SzN?90As_^((IY;(+6gVj2)h8J3az8rLGl-Dyj#EB)F~Y zl(8wL#a&d3f2I7m%7SBfcR2x!PI-EtPo&|47KtbSE(tKINAWWhV5pruvC>lyfQmA8 z?)TR}%;$%M#9cGO-?bx(z?*Th>xjann+Q32|G1HtlJPU+wvSM*eh+?%!>DH9b5pS? z!BC^H89V=!lS&(C{!8x~q)+Ia_GnOqWpc-AfmU>Bbg3byJgoIIij419WN1Ag;iVa`T@Zm@rJ^#e)TX<&A3$4#v%Y`cj&y)q)2SXBmi_vU;D_aJb{Sx* z$=~UJ7DtAvt|_D^kQcZ}_2dE64S2%Mt_lY_}lhxKT4!Hni%%=qm7d*hl?;MOeA*^|vg&%dE9gR>;E!Rvu-(;?6uyBP_C@n%RbU#5qb4AK%BG*8Ht5@2BIMkn$f~9U1{zoT=%<)!~%Y!3@9C2M&-xk?wTTZ>^f$W+QowV zG%ms+^a&3K=y>F_l)jq3Y7 zraKs|T90dCy(8slCV8ptA-k#;&_nB$xx)A%B|e4~GIC98pO3&#RJN+V4_h&~g$`hY z?DL+yS>xdZX=A*>=R#Ct9OyhWgXCnbz-xQo zR6YV+0P}u@;QjJeSLgwbf$wR2QCU}L2P?6!uDjxKg?d@zP3CDjFcc8^7drRe+M3SQ zY^=fX!Bn74_4&m_OjClG75$e@s^n#U(`Nh8h*O@Q{C7Q@TB5-%+C+jC2TxT4S9`L! zW3K(^$JjV-?{qRy>5E*l^K`e`0}u`O&WL?=yGui6kFMgk5QZFfKcn+SN($K?+Cr7< z6*o?{v`@HyA2d_4YuDjSnsk=3)i zr$<<)gsvjw8?u&gRwDm26EgFNwrh(2`bSGkDq}X(MlaEvLK(IjRFm2a8{Zg{;O@PX z5K|wYHTB;?G%V|-S>m_qCS%WeyF^}n30f3W8;*X(ndyEWv|gFn>{#F~qUdhLLzNfv z4qzWRRiVN_y*NF-DYVn$FDzfJGyZJ{)N<=wo6ub37Mc#QHss;kBgCu2p`tpo`u^ z%>&t|$tn3~=ZCu`*8)vd`cH2$6AcGs=s)jB1mUN3u_yb1I+Q%2mxeui-a#U39Nk|& z5`&5|+4J`${C+jQENW*!NP?p0eI>U~Bw>7W2R?3{lZ*MQpys1qsYREG^U(nJ5L z*YwFOeP*z7BDh~Ei6RBoUzGAvB`jw{C{TO4Eu^KyCI&;THy-C$#*(Ho&Sdb_z{A^)Eu9{Hs0I|9am;$0Ti;Fa9CiVEIbJiRV3jej`j79tw<=S|LYpX>PzRO zB4(?vCp_)Uc*y3WcYh)>fj8jLTN~A0uPm+BB6o9d07yhdHZ8}MV;CPLrJ4tE;u@R9f=t7Ry2 zvLs7S;H$QIj3X5_jLkXvDPVr`Hx8Qw7wJQ4c7!E$Vo(ju z=Z5^WJtm1mnwS`_GG-b;BTC4W^9m7sbdER;wx3&L77LznXB1tl3vWCB36zgX8YQ#7 zH=!q}(fE}pAHH2TRjWJKP&E-3*VKQ5HxXO+O2E0+z-at?VAw(z+OFUR0d4h+7V2b8euj7^m%3i~ke?815#HOG?Aehw zf42-WYwG{^S6`tEI=d7n@>ufhp1Q8J*!j8}{I-=sh=UOm0(Kub&>SUAQB7z)Ud|F@ z_p4uo(CSjDo(C7;o^Mz-3gBkUy84J-GT($OZA{=I!yG1Jij~lkSjlg`k6y$#Z|AdY zj$GVzbhz9qE}p7hB^r4v833A-d2y8`t><{h_fWzLH0n zbf#MNdiVLJ^hssCPbFqJ-Z$h(b90_0uPje#u{Bx5FNpsW)!Vf{E{iQTYCR4u#y21b zF3MXmx9!KN<{?voZm~es^YRMqLv2|t{3MQ??+s~Cod=fAV^02V3hsPN`3tCvhD{H< zq?q8u@eEsGyh1-J-(ce~m9X#+A!cKp-yM8l0Ct zL=SmH_}02cSdShocYRh#O|FdbKf-A8^8cxV3#88QQH+(`Q9Vn@vG>6S$MvAtan%mD z$TLH66K);hE;()FV^~YfNRDGWz1#t+N>ZYhmx}|R-elN|lF&YCcqg)(vx+nQ5F7h^ zHg;d)oh?h+KJk<2RVS^e&=wvE6qVc(j7UDV1Uk1VAshaawZ*L})P>3AV8?DH_p*$g z&u@J-{7Jug0$46e5cP8~7cG$TM6XWn^gz|Le@kn4?GwyuheGgabPw}Nq0O-v(0wCN z1{m?r9liXm7a5*2{Uu$UOZnWUsu#8*MN5T~Ls!|^O%_3VuXiUeb7yC#c1?f1fBzk! zcKBQ0u#YXRZlSaAgbApqvN^JDZB>icDGiRxXbLU&MLs>(#z- z6Q^SAV_h7=m27;ZQ^$QKX|&t*ywGDzjpF(}knCciF3&C=vk|*747x&))wPj4+YnTONz(Rs+2@gvL=#cnufAw-x+J!cUcm~($o_nBwI9=8rjzg!`RC<#?siv zV5k^l3o{e5SmvFcf8*_ZIv>ub`**JMyU%@H*M08<5MvFlZ=e2sd=4 zS=jB_gCI0_B&R~{!|8v0fI~TdL0NRa#dmAsfK3?zpA<1&{sdE zEz7G)Z=mk5XK>hYAgI(A<(DZmL}IQKKA+fB?}9d2T#sMG%F3veXT5N>4{NwR|IWHg zRv5sJ&WE*No|v*=`dF~dhfVxjJtuoH+V%I4pDKbe{nmqpeb`>G7hESNac`JVa(tS5 zQuFnqVWRtyl#I2Wb=a3t&5%|?+av8$E^Y_jjd|l|d1q;tADJ1rs&M!mcLO_0rcYzTlboH@ zTFu!WFt|2UGbvJV7L!jM*RsFl>Zu{2TNbLseEgv2V_I1Q3~g>9j&4H~mu?+pC~lz* z#cESj*p|a}b$>T8+|3w!iBJX<;Oo;1`IcHxTV&&{ZPXlfxYeMTe(-dq=$fnFq7EPD z^Bb4%+>2l4*sh<|V(z?M6O8WmZ$m?ESBiRUv{P1TA7K$eWi#Qsm4V|_3~qz@3p7IJ z<;Y_f7uPsnmfXMcFxP5^82sVaT4TA9le0OyN1f=uksaSS=TqF}&m8W)VTea~Bnm^Ak@Yu6 zug042>PyIpNMjdW0o#2EHgf9)v-op&QQ=lsg&1vna&|dJK_1Z_bnU`Fg5qHLI*c2Wxwyz@9cJuxrrFHHgPHBn>PuaI@2odAFc$RF zLJalYo1vIHsZ(E}b9IMiJaX9dOu`CNiBZ03?XG;jmengtv4HySOh^NPR)N`_R_V? z5nnWzOQRfDH=kSlM2RM2DAZ2l`7Jxz3a*2G>+KBu!2Fs$+l~47HT6lA7_xuz_eB}=^hrOxRn^=;7yHaM&p}DQ`-Rc%6X)>cXY3b${g8ekKVvn zAGKyPV--=}5YzTf$BAw83vI#me614Kp31GaC;4~f8&v?)hBfcFBUFzdLI-UpvpLe5 zB0y$dAoa^N1tty_mL<%uMo5gGjQ^dYvzfkT5Lf=m!Z9!F z(KXQ%TnT;l0U3~HN6CweF7LhdTMq{-vHMzO+*bZ5R$lq@%q4v}yci9N7lW9pYz7#- zKSCtEa2ty%{k^}jiESAPudA(6PC*&DgSm%;#^)#?R9zUeHW2Nt;Gps_e%vR6d12(hLZ_8gCp2z-)BiZ)Y@#aL1btae zG9;`Zr%;)BWj;TcExio`1d%XLGT~XYdf6KBS|t08Yr9QXtLND65N@_so8EDv2KGtF z37xYW7vObncO@t_A4qVQc=u#3IGC}Coe>M!ydH|!&55AX35)Y6u2d&oKV$uLK}VrK z-ex41yMIAim!T$VEz&yzj~(-|baC4sOdAQ8k`E@co%V{czt4b|G}r=mpx%sRI0 zz;^G?)eyBn>}G|9Y__mBt1(ZpESXGt*jsu$Q_q1d9}D)r(ds20{)ef(tZ_flevaw?yTB0Z>H}xcKnwknGbpV3)`@1VfljS(H392;}t&_pNRCS5wM>b zH=@MY*WoM}EbMX~!{j;N$^KLg$`U#-AS7-etyq_me$S(7fb?oXGQ|7W>ofz!q)t0- z$>!-iHtpLg^KFYY(}FwMTn#w%oi-d$al03&_0jUmVJUy*1ecTPQ!YNd0~^KOvd7fD z%y^#5*D5?073UVi59uWBy!dv)>fY%OW!vC#(fach+g+g1e|`AWi^OOdxkZ}|5m^?-NR$^y?m}6tuQ>c=a2V9ZEN;xk@ zV!wB7giIu0L~~3C)<3J~HWU5)LeyLq?>npWR>h?6My7$z3R(<7!b0Qpq)hre-~GGH zxzwP+SeWgc8*YIk2XG(7#120gewvSvJ7hg*UGp-ZTt$6 zyYku!LB4*0^7Z$vlI#GZJVeuD93irAjzyw6GOdzM=&BhH2Z5bbcAL^^roY#1XF6&i zP6RB3z{7AcKC0Bel;ONoC4G}2YpQ=jr6NjUmO1$}b|qdxpv7Gp8hoDw%^x-qEZeDD z1~Er1f7B3Z?zjv(m5_91LFL3w*#39BCAk{>sq?FCyZyFRjcSbzU3m0|c1yTfc$gQx z=lUA2oB;Ht{I_}B{w@~tbu&3`B-O60F-Ro*M!sOnt&K&3&Ca^lCxjGc@9ekB?>p8u zgffB2gFv`Pkpk6RDfhmA=pye>WPT;=G949#FW14;zWdtu6`Lw>X5vW@<<7X!@f8z> z7Wn`=S1m6x-?5M>g~=c((C|uGE>TfJby_)44Yh>bm#cLDkmjmSt#prbM`i~Lg_6Wp zm!}XuN=^$x(UAsPaynVb4N*2tD-#>jz0$az(2&X{@5=lpVu(9-i{U2c{}QHB6T*~?AC63jF08&uzdk&@Cp;Rp z47n5U+mLoA7b_{lU%(h{^sJdA2e564_E%lnrYeZ{$(uz14tMdE*-4*?X|A8aESv>r;1Z6MR7v0a zKDROFA%QX-lP*w5WN?<;-7+79gwwU=jp1PBM@MpmUrQN`snz7EjnZ&&$Hp(LuI%{- zMTKkrHk~?4S`>V5y2ng^6=$n-EY@xuVYClvdFovDbRYZjs%h%8W8k~`NkBuPnt+5C z*sdnqN=RW6I?fh-F995#5g_&9ghFKD8XQ1Wv@pFAae9y=I?ulvD#b%MC7DeI5-dt?qO$Jm1r#cjl>b zBv1~1{L-wN$Xx*@Qyyk}W|!zWkUB8p>6;KjE9)m+B*Rv6n+%ZAwKZ!i_yGeH=g)Wv zUMS!wD5kK=b^Gmh=EvoJ=}cmTJ|;=lIm>e;?p=tl>~SYJd2L~(=?#OV=l`<|g?ciP z^Td~P#sUms?FM+)EFz2a-L1yA{mn=hT^j4w7OsXkmb*;=<7SgK5=gG~^%i6>tCI?k z9XY#UA5Nt`yfXF{!f7 zqjNF#*J@@(W~L{nknZ)H%-f)j`b?H?m0&$3RBLVyAl8tU z(mi)1YIrGr;2dpX>aYzWv|UoVq}SpX8UcBH>$4Mb7t0^v(;?H#H!rdlOc|E`!{Y(B*&N1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;et.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0?parseFloat((s.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((s.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=s.match(/ Gecko\/\d+/),t.isOpera=typeof opera=="object"&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(s.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(s.split(" Chrome/")[1])||undefined,t.isEdge=parseFloat(s.split(" Edge/")[1])||undefined,t.isAIR=s.indexOf("AdobeAIR")>=0,t.isAndroid=s.indexOf("Android")>=0,t.isChromeOS=s.indexOf(" CrOS ")>=0,t.isIOS=/iPad|iPhone|iPod/.test(s)&&!window.MSStream,t.isIOS&&(t.isMac=!0),t.isMobile=t.isIOS||t.isAndroid}),ace.define("ace/lib/dom",["require","exports","module","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("./useragent"),i="http://www.w3.org/1999/xhtml";t.buildDom=function o(e,t,n){if(typeof e=="string"&&e){var r=document.createTextNode(e);return t&&t.appendChild(r),r}if(!Array.isArray(e))return e;if(typeof e[0]!="string"||!e[0]){var i=[];for(var s=0;s=1.5:!0;if(typeof document!="undefined"){var s=document.createElement("div");t.HI_DPI&&s.style.transform!==undefined&&(t.HAS_CSS_TRANSFORMS=!0),!r.isEdge&&typeof s.style.animationName!="undefined"&&(t.HAS_CSS_ANIMATION=!0),s=null}t.HAS_CSS_TRANSFORMS?t.translate=function(e,t,n){e.style.transform="translate("+Math.round(t)+"px, "+Math.round(n)+"px)"}:t.translate=function(e,t,n){e.style.top=Math.round(n)+"px",e.style.left=Math.round(t)+"px"}}),ace.define("ace/lib/oop",["require","exports","module"],function(e,t,n){"use strict";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),ace.define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./oop"),i=function(){var e={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta",91:"MetaLeft",92:"MetaRight",93:"ContextMenu"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,"super":8,meta:8,command:8,cmd:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9","-13":"NumpadEnter",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",111:"/",106:"*"}},t,n;for(n in e.FUNCTION_KEYS)t=e.FUNCTION_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);for(n in e.PRINTABLE_KEYS)t=e.PRINTABLE_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);return r.mixin(e,e.MODIFIER_KEYS),r.mixin(e,e.PRINTABLE_KEYS),r.mixin(e,e.FUNCTION_KEYS),e.enter=e["return"],e.escape=e.esc,e.del=e["delete"],e[173]="-",function(){var t=["cmd","ctrl","alt","shift"];for(var n=Math.pow(2,t.length);n--;)e.KEY_MODS[n]=t.filter(function(t){return n&e.KEY_MODS[t]}).join("-")+"-"}(),e.KEY_MODS[0]="",e.KEY_MODS[-1]="input-",e}();r.mixin(t,i),t.keyCodeToString=function(e){var t=i[e];return typeof t!="string"&&(t=String.fromCharCode(e)),t.toLowerCase()}}),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function a(e,t,n){var a=u(t);if(!i.isMac&&s){t.getModifierState&&(t.getModifierState("OS")||t.getModifierState("Win"))&&(a|=8);if(s.altGr){if((3&a)==3)return;s.altGr=0}if(n===18||n===17){var f="location"in t?t.location:t.keyLocation;if(n===17&&f===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&a===3&&f===2){var l=t.timeStamp-o;l<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1);if(!a&&n===13){var f="location"in t?t.location:t.keyLocation;if(f===3){e(t,a,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&a&8){e(t,a,n);if(t.defaultPrevented)return;a&=-9}return!!a||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,a,n):!1}function f(){s=Object.create(null)}var r=e("./keys"),i=e("./useragent"),s=null,o=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n.call(e,window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",i,!0),t.removeListener(document,"dragstart",i,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",i,!0),t.addListener(document,"dragstart",i,!0),i},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){function c(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}function h(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)}var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",c),i.isOldIE&&t.addListener(e,"dblclick",h)})};var u=!i.isMac||!i.isOpera||"KeyboardEvent"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[u(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;r(e,"keydown",function(e){o=e.keyCode}),r(e,"keypress",function(e){return a(n,e,o)})}else{var u=null;r(e,"keydown",function(e){s[e.keyCode]=(s[e.keyCode]||0)+1;var t=a(n,e,e.keyCode);return u=e.defaultPrevented,t}),r(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,"keyup",function(e){s[e.keyCode]=null}),s||(f(),r(window,"focus",f))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var l=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+l++,i=function(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())};t.addListener(n,"message",i),n.postMessage(r,"*")}}t.$idleBlocked=!1,t.onIdle=function(e,n){return setTimeout(function r(){t.$idleBlocked?setTimeout(r,100):e()},n)},t.$idleBlockId=null,t.blockIdle=function(e){t.$idleBlockId&&clearTimeout(t.$idleBlockId),t.$idleBlocked=!0,t.$idleBlockId=setTimeout(function(){t.$idleBlocked=!1},e||100)},t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.row0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;nDate.now()-50?!0:r=!1},cancel:function(){r=Date.now()}}}),ace.define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/clipboard","ace/lib/keys"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("../lib/dom"),o=e("../lib/lang"),u=e("../clipboard"),a=i.isChrome<18,f=i.isIE,l=i.isChrome>63,c=400,h=e("../lib/keys"),p=h.KEY_MODS,d=i.isIOS,v=d?/\s/:/\n/,m=function(e,t){function z(){S=!0,n.blur(),n.focus(),S=!1}function X(e){e.keyCode==27&&n.value.lengthN&&x[s]=="\n")o=h.end;else if(rN&&x.slice(0,s).split("\n").length>2)o=h.down;else if(s>N&&x[s-1]==" ")o=h.right,u=p.option;else if(s>N||s==N&&N!=T&&r==s)o=h.right;r!==s&&(u|=p.shift);if(o){var a=t.onCommandKey({},u,o);if(!a&&t.commands){o=h.keyCodeToString(o);var f=t.commands.findKeyCommand(u,o);f&&t.execCommand(f)}T=r,N=s,L("")}};document.addEventListener("selectionchange",s),t.on("destroy",function(){document.removeEventListener("selectionchange",s)})}var n=s.createElement("textarea");n.className="ace_text-input",n.setAttribute("wrap","off"),n.setAttribute("autocorrect","off"),n.setAttribute("autocapitalize","off"),n.setAttribute("spellcheck",!1),n.style.opacity="0",e.insertBefore(n,e.firstChild);var m=!1,g=!1,y=!1,b=!1,w="";i.isMobile||(n.style.fontSize="1px");var E=!1,S=!1,x="",T=0,N=0;try{var C=document.activeElement===n}catch(k){}r.addListener(n,"blur",function(e){if(S)return;t.onBlur(e),C=!1}),r.addListener(n,"focus",function(e){if(S)return;C=!0;if(i.isEdge)try{if(!document.hasFocus())return}catch(e){}t.onFocus(e),i.isEdge?setTimeout(L):L()}),this.$focusScroll=!1,this.focus=function(){if(w||l||this.$focusScroll=="browser")return n.focus({preventScroll:!0});var e=n.style.top;n.style.position="fixed",n.style.top="0px";try{var t=n.getBoundingClientRect().top!=0}catch(r){return}var i=[];if(t){var s=n.parentElement;while(s&&s.nodeType==1)i.push(s),s.setAttribute("ace_nocontext",!0),!s.parentElement&&s.getRootNode?s=s.getRootNode().host:s=s.parentElement}n.focus({preventScroll:!0}),t&&i.forEach(function(e){e.removeAttribute("ace_nocontext")}),setTimeout(function(){n.style.position="",n.style.top=="0px"&&(n.style.top=e)},0)},this.blur=function(){n.blur()},this.isFocused=function(){return C},t.on("beforeEndOperation",function(){if(t.curOp&&t.curOp.command.name=="insertstring")return;y&&(x=n.value="",U()),L()});var L=d?function(e){if(!C||m&&!e||b)return;e||(e="");var r="\n ab"+e+"cde fg\n";r!=n.value&&(n.value=x=r);var i=4,s=4+(e.length||(t.selection.isEmpty()?0:1));(T!=i||N!=s)&&n.setSelectionRange(i,s),T=i,N=s}:function(){if(y||b)return;if(!C&&!_)return;y=!0;var e=t.selection,r=e.getRange(),i=e.cursor.row,s=r.start.column,o=r.end.column,u=t.session.getLine(i);if(r.start.row!=i){var a=t.session.getLine(i-1);s=r.start.rowi+1?f.length:o,o+=u.length+1,u=u+"\n"+f}u.length>c&&(s=x.length&&e.value===x&&x&&e.selectionEnd!==N},O=function(e){if(y)return;m?m=!1:A(n)&&(t.selectAll(),L())},M=null;this.setInputHandler=function(e){M=e},this.getInputHandler=function(){return M};var _=!1,D=function(e,r){_&&(_=!1);if(g)return L(),e&&t.onPaste(e),g=!1,"";var i=n.selectionStart,s=n.selectionEnd,o=T,u=x.length-N,a=e,f=e.length-i,l=e.length-s,c=0;while(o>0&&x[c]==e[c])c++,o--;a=a.slice(c),c=1;while(u>0&&x.length-c>T-1&&x[x.length-c]==e[e.length-c])c++,u--;f-=c-1,l-=c-1;var h=a.length-c+1;return h<0&&(o=-h,h=0),a=a.slice(0,h),!r&&f==a.length&&!o&&!u&&!l?"":(b=!0,a&&!o&&!u&&!f&&!l||E?t.onTextInput(a):t.onTextInput(a,{extendLeft:o,extendRight:u,restoreStart:f,restoreEnd:l}),b=!1,x=e,T=i,N=s,a)},P=function(e){if(y)return R();if(e&&e.inputType){if(e.inputType=="historyUndo")return t.execCommand("undo");if(e.inputType=="historyRedo")return t.execCommand("redo")}var r=n.value,i=D(r,!0);(r.length>c+100||v.test(i))&&L()},H=function(e,t,n){var r=e.clipboardData||window.clipboardData;if(!r||a)return;var i=f||n?"Text":"text/plain";try{return t?r.setData(i,t)!==!1:r.getData(i)}catch(e){if(!n)return H(e,t,!0)}},B=function(e,i){var s=t.getCopyText();if(!s)return r.preventDefault(e);H(e,s)?(d&&(L(s),m=s,setTimeout(function(){m=!1},10)),i?t.onCut():t.onCopy(),r.preventDefault(e)):(m=!0,n.value=s,n.select(),setTimeout(function(){m=!1,L(),i?t.onCut():t.onCopy()}))},j=function(e){B(e,!0)},F=function(e){B(e,!1)},I=function(e){var s=H(e);if(u.pasteCancelled())return;typeof s=="string"?(s&&t.onPaste(s,e),i.isIE&&setTimeout(L),r.preventDefault(e)):(n.value="",g=!0)};r.addCommandKeyListener(n,t.onCommandKey.bind(t)),r.addListener(n,"select",O),r.addListener(n,"input",P),r.addListener(n,"cut",j),r.addListener(n,"copy",F),r.addListener(n,"paste",I),(!("oncut"in n)||!("oncopy"in n)||!("onpaste"in n))&&r.addListener(e,"keydown",function(e){if(i.isMac&&!e.metaKey||!e.ctrlKey)return;switch(e.keyCode){case 67:F(e);break;case 86:I(e);break;case 88:j(e)}});var q=function(e){if(y||!t.onCompositionStart||t.$readOnly)return;y={};if(E)return;setTimeout(R,0),t.on("mousedown",z);var r=t.getSelectionRange();r.end.row=r.start.row,r.end.column=r.start.column,y.markerRange=r,y.selectionStart=T,t.onCompositionStart(y),y.useTextareaForIME?(n.value="",x="",T=0,N=0):(n.msGetInputContext&&(y.context=n.msGetInputContext()),n.getInputContext&&(y.context=n.getInputContext()))},R=function(){if(!y||!t.onCompositionUpdate||t.$readOnly)return;if(E)return z();if(y.useTextareaForIME)t.onCompositionUpdate(n.value);else{var e=n.value;D(e),y.markerRange&&(y.context&&(y.markerRange.start.column=y.selectionStart=y.context.compositionStartOffset),y.markerRange.end.column=y.markerRange.start.column+N-y.selectionStart)}},U=function(e){if(!t.onCompositionEnd||t.$readOnly)return;y=!1,t.onCompositionEnd(),t.off("mousedown",z),e&&P()},W=o.delayedCall(R,50).schedule.bind(null,null);r.addListener(n,"compositionstart",q),r.addListener(n,"compositionupdate",R),r.addListener(n,"keyup",X),r.addListener(n,"keydown",W),r.addListener(n,"compositionend",U),this.getElement=function(){return n},this.setCommandMode=function(e){E=e,n.readOnly=!1},this.setReadOnly=function(e){E||(n.readOnly=e)},this.setCopyWithEmptySelection=function(e){},this.onContextMenu=function(e){_=!0,L(),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,o){w||(w=n.style.cssText),n.style.cssText=(o?"z-index:100000;":"")+(i.isIE?"opacity:0.1;":"")+"text-indent: -"+(T+N)*t.renderer.characterWidth*.5+"px;";var u=t.container.getBoundingClientRect(),a=s.computedStyle(t.container),f=u.top+(parseInt(a.borderTopWidth)||0),l=u.left+(parseInt(u.borderLeftWidth)||0),c=u.bottom-f-n.clientHeight-2,h=function(e){s.translate(n,e.clientX-l-2,Math.min(e.clientY-f-2,c))};h(e);if(e.type!="mousedown")return;t.renderer.$isMousePressed=!0,clearTimeout(V),i.isWin&&r.capture(t.container,h,$)},this.onContextMenuClose=$;var V,J=function(e){t.textInput.onContextMenu(e),$()};r.addListener(n,"mouseup",J),r.addListener(n,"mousedown",function(e){e.preventDefault(),$()}),r.addListener(t.renderer.scroller,"contextmenu",J),r.addListener(n,"contextmenu",J),d&&K(e,t,n)};t.TextInput=m}),ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/useragent"],function(e,t,n){"use strict";function o(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e));var n=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];n.forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function u(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}function a(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else if(e.start.row==e.end.row-1&&!e.start.column&&!e.end.column)var n=t.column-4;else var n=2*t.row-e.start.row-e.end.row;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}var r=e("../lib/useragent"),i=0,s=550;(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var i=this.editor,s=e.getButton();if(s!==0){var o=i.getSelectionRange(),u=o.isEmpty();(u||s==1)&&i.selection.moveToPosition(n),s==2&&(i.textInput.onContextMenu(e.domEvent),r.isMozilla||e.preventDefault());return}this.mousedownEvent.time=Date.now();if(t&&!i.isFocused()){i.focus();if(this.$focusTimeout&&!this.$clickSelection&&!i.inMultiSelectMode){this.setState("focusWait"),this.captureMouse(e);return}}return this.captureMouse(e),this.startSelect(n,e.domEvent._clicks>1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;if(!this.mousedownEvent)return;this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select")},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=a(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=a(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>i||t-this.mousedownEvent.time>this.$focusTimeout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=this.editor;this.$lastScroll||(this.$lastScroll={t:0,vx:0,vy:0,allowed:0});var n=this.$lastScroll,r=e.domEvent.timeStamp,i=r-n.t,o=i?e.wheelX/i:n.vx,u=i?e.wheelY/i:n.vy;i=1&&t.renderer.isScrollableBy(e.wheelX*e.speed,0)&&(f=!0),a<=1&&t.renderer.isScrollableBy(0,e.wheelY*e.speed)&&(f=!0);if(f)n.allowed=r;else if(r-n.allowedt.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
"),i.setHtml(f),i.show(),t._signal("showGutterTooltip",i),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+"px",v.top=d.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t._signal("hideGutterTooltip",i),t.removeEventListener("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.moveCursorToPosition(e),S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.selection.fromOrientedRange(m),t.isFocused()&&!w&&t.$resetCursorStyle(),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.$resetCursorStyle()}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e)),i.addListener(c,"dragend",this.onDragEnd.bind(e)),i.addListener(c,"dragenter",this.onDragEnter.bind(e)),i.addListener(c,"dragover",this.onDragOver.bind(e)),i.addListener(c,"dragleave",this.onDragLeave.bind(e)),i.addListener(c,"drop",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.$resetCursorStyle(),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),ace.define("ace/mouse/touch_handler",["require","exports","module","ace/mouse/mouse_event","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./mouse_event").MouseEvent,i=e("../lib/dom");t.addTouchListeners=function(e,t){function y(){var e=window.navigator&&window.navigator.clipboard,r=!1,s=function(){var n=t.getCopyText(),s=t.session.getUndoManager().hasUndo();g.replaceChild(i.buildDom(r?["span",!n&&["span",{"class":"ace_mobile-button",action:"selectall"},"Select All"],n&&["span",{"class":"ace_mobile-button",action:"copy"},"Copy"],n&&["span",{"class":"ace_mobile-button",action:"cut"},"Cut"],e&&["span",{"class":"ace_mobile-button",action:"paste"},"Paste"],s&&["span",{"class":"ace_mobile-button",action:"undo"},"Undo"],["span",{"class":"ace_mobile-button",action:"find"},"Find"],["span",{"class":"ace_mobile-button",action:"openCommandPallete"},"Pallete"]]:["span"]),g.firstChild)},o=function(n){var i=n.target.getAttribute("action");if(i=="more"||!r)return r=!r,s();if(i=="paste")e.readText().then(function(e){t.execCommand(i,e)});else if(i){if(i=="cut"||i=="copy")e?e.writeText(t.getCopyText()):document.execCommand("copy");t.execCommand(i)}g.firstChild.style.display="none",r=!1,i!="openCommandPallete"&&t.focus()};g=i.buildDom(["div",{"class":"ace_mobile-menu",ontouchstart:function(e){n="menu",e.stopPropagation(),e.preventDefault(),t.textInput.focus()},ontouchend:function(e){e.stopPropagation(),e.preventDefault(),o(e)},onclick:o},["span"],["span",{"class":"ace_mobile-button",action:"more"},"..."]],t.container)}function b(){g||y();var e=t.selection.cursor,n=t.renderer.textToScreenCoordinates(e.row,e.column),r=t.container.getBoundingClientRect();g.style.top=n.pageY-r.top-3+"px",g.style.right="10px",g.style.display="",g.firstChild.style.display="none",t.on("input",w)}function w(e){g&&(g.style.display="none"),t.off("input",w)}function E(){f=null,clearTimeout(f);var e=t.selection.getRange(),r=e.contains(h.row,h.column);if(e.isEmpty()||!r)t.selection.moveToPosition(h),t.selection.selectWord();n="wait",b()}function S(){f=null,clearTimeout(f),t.selection.moveToPosition(h);var e=p>=2?t.selection.getLineRange(h.row):t.session.getBracketRange(h);e&&!e.isEmpty()?t.selection.setRange(e):t.selection.selectWord(),n="wait"}function x(){c+=60,l=setInterval(function(){c--<=0&&(clearInterval(l),l=null),Math.abs(d)<.01&&(d=0),Math.abs(v)<.01&&(v=0),c<20&&(d=.9*d),c<20&&(v=.9*v);var e=t.session.getScrollTop();t.renderer.scrollBy(10*d,10*v),e==t.session.getScrollTop()&&(c=0)},10)}var n="scroll",s,o,u,a,f,l,c=0,h,p=0,d=0,v=0,m,g;e.addEventListener("contextmenu",function(e){if(!m)return;var n=t.textInput.getElement();n.focus()}),e.addEventListener("touchstart",function(e){var i=e.touches;if(f||i.length>1){clearTimeout(f),f=null,u=-1,n="zoom";return}m=t.$mouseHandler.isMousePressed=!0;var l=t.renderer.layerConfig.lineHeight,g=t.renderer.layerConfig.lineHeight,y=e.timeStamp;a=y;var b=i[0],w=b.clientX,x=b.clientY;Math.abs(s-w)+Math.abs(o-x)>l&&(u=-1),s=e.clientX=w,o=e.clientY=x,d=v=0;var T=new r(e,t);h=T.getDocumentPosition();if(y-u<500&&i.length==1&&!c)p++,e.preventDefault(),e.button=0,S();else{p=0;var N=t.selection.cursor,C=t.selection.isEmpty()?N:t.selection.anchor,k=t.renderer.$cursorLayer.getPixelPosition(N,!0),L=t.renderer.$cursorLayer.getPixelPosition(C,!0),A=t.renderer.scroller.getBoundingClientRect(),O=function(e,t){return e/=g,t=t/l-.75,e*e+t*t};if(e.clientX_?"cursor":"anchor"),_<3.5?n="anchor":M<3.5?n="cursor":n="scroll",f=setTimeout(E,450)}u=y}),e.addEventListener("touchend",function(e){m=t.$mouseHandler.isMousePressed=!1,l&&clearInterval(l),n=="zoom"?(n="",c=0):f?(t.selection.moveToPosition(h),c=0,b()):n=="scroll"?(x(),e.preventDefault(),w()):b(),clearTimeout(f),f=null}),e.addEventListener("touchmove",function(e){f&&(clearTimeout(f),f=null);var i=e.touches;if(i.length>1||n=="zoom")return;var u=i[0],l=s-u.clientX,c=o-u.clientY;if(n=="wait"){if(!(l*l+c*c>4))return e.preventDefault();n="cursor"}s=u.clientX,o=u.clientY,e.clientX=u.clientX,e.clientY=u.clientY;var h=e.timeStamp,p=h-a;a=h;if(n=="scroll"){var m=new r(e,t);m.speed=1,m.wheelX=l,m.wheelY=c,10*Math.abs(l)1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a),f()};var f=function(){!a.basePath&&!a.workerPath&&!a.modePath&&!a.themePath&&!Object.keys(a.$moduleUrls).length&&(console.error("Unable to infer path to ace from script src,","use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes","or with webpack use ace/webpack-resolver"),f=function(){})};t.init=l,t.version="1.4.6"}),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/mouse/touch_handler","ace/config"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop_handler").DragdropHandler,f=e("./touch_handler").addTouchListeners,l=e("../config"),c=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,"click",this.onMouseEvent.bind(this,"click")),r.addListener(u,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener([u,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),f(e.container,e);var l=e.renderer.$gutter;r.addListener(l,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(l,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(l,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(l,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),r.addListener(u,"mousedown",n),r.addListener(l,"mousedown",n),i.isIE&&e.renderer.scrollBarV&&(r.addListener(e.renderer.scrollBarV.element,"mousedown",n),r.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle("default"):s.setCursorStyle("")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor,s=this.editor.renderer;s.$isMousePressed=!0;var o=this,a=function(e){if(!e)return;if(i.isWebKit&&!e.which&&o.releaseMouse)return o.releaseMouse();o.x=e.clientX,o.y=e.clientY,t&&t(e),o.mouseEvent=new u(e,o.editor),o.$mouseMoved=!0},f=function(e){n.off("beforeEndOperation",c),clearInterval(h),l(),o[o.state+"End"]&&o[o.state+"End"](e),o.state="",o.isMousePressed=s.$isMousePressed=!1,s.$keepTextAreaAtCursor&&s.$moveTextAreaToCursor(),o.$onCaptureMouseMove=o.releaseMouse=null,e&&o.onMouseEvent("mouseup",e),n.endOperation()},l=function(){o[o.state]&&o[o.state](),o.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){f(e)});var c=function(e){if(!o.releaseMouse)return;n.curOp.command.name&&n.curOp.selectionChanged&&(o[o.state+"End"]&&o[o.state+"End"](),o.state="",o.releaseMouse())};n.on("beforeEndOperation",c),n.startOperation({command:{name:"mouse"}}),o.$onCaptureMouseMove=a,o.releaseMouse=r.capture(this.editor.container,a,f);var h=setInterval(l,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!="contextmenu")return;this.editor.off("nativecontextmenu",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(c.prototype),l.defineOptions(c.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimeout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=c}),ace.define("ace/mouse/fold_handler",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";function i(e){e.on("click",function(t){var n=t.getDocumentPosition(),i=e.session,s=i.getFoldAt(n.row,n.column,1);s&&(t.getAccelKey()?i.removeFold(s):i.expandFold(s),t.stop());var o=t.domEvent&&t.domEvent.target;o&&r.hasCssClass(o,"ace_inline_button")&&r.hasCssClass(o,"ace_toggle_wrap")&&(i.setOption("wrap",!i.getUseWrapMode()),e.renderer.scrollCursorIntoView())}),e.on("gutterclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}var r=e("../lib/dom");t.FoldHandler=i}),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){"use strict";var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e=="function"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:"insertstring"},o=u.exec("insertstring",this.$editor,t)),o&&this.$editor._signal&&this.$editor._signal("keyboardActivity",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);return this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){return this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),ace.define("ace/lib/bidiutil",["require","exports","module"],function(e,t,n){"use strict";function F(e,t,n,r){var i=s?d:p,c=null,h=null,v=null,m=0,g=null,y=null,b=-1,w=null,E=null,T=[];if(!r)for(w=0,r=[];w0)if(g==16){for(w=b;w-1){for(w=b;w=0;C--){if(r[C]!=N)break;t[C]=s}}}function I(e,t,n){if(o=e){u=i+1;while(u=e)u++;for(a=i,l=u-1;a=t.length||(o=n[r-1])!=b&&o!=w||(c=t[r+1])!=b&&c!=w)return E;return u&&(c=w),c==o?c:E;case k:o=r>0?n[r-1]:S;if(o==b&&r+10&&n[r-1]==b)return b;if(u)return E;p=r+1,h=t.length;while(p=1425&&d<=2303||d==64286;o=t[p];if(v&&(o==y||o==T))return y}if(r<1||(o=t[r-1])==S)return E;return n[r-1];case S:return u=!1,f=!0,s;case x:return l=!0,E;case O:case M:case D:case P:case _:u=!1;case H:return E}}function R(e){var t=e.charCodeAt(0),n=t>>8;return n==0?t>191?g:B[t]:n==5?/[\u0591-\u05f4]/.test(e)?y:g:n==6?/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(e)?A:/[\u0660-\u0669\u066b-\u066c]/.test(e)?w:t==1642?L:/[\u06f0-\u06f9]/.test(e)?b:T:n==32&&t<=8287?j[t&255]:n==254?t>=65136?T:E:E}function U(e){return e>="\u064b"&&e<="\u0655"}var r=["\u0621","\u0641"],i=["\u063a","\u064a"],s=0,o=0,u=!1,a=!1,f=!1,l=!1,c=!1,h=!1,p=[[0,3,0,1,0,0,0],[0,3,0,1,2,2,0],[0,3,0,17,2,0,1],[0,3,5,5,4,1,0],[0,3,21,21,4,0,1],[0,3,5,5,4,2,0]],d=[[2,0,1,1,0,1,0],[2,0,1,1,0,2,0],[2,0,2,1,3,2,0],[2,0,2,33,3,1,1]],v=0,m=1,g=0,y=1,b=2,w=3,E=4,S=5,x=6,T=7,N=8,C=9,k=10,L=11,A=12,O=13,M=14,_=15,D=16,P=17,H=18,B=[H,H,H,H,H,H,H,H,H,x,S,x,N,S,H,H,H,H,H,H,H,H,H,H,H,H,H,H,S,S,S,x,N,E,E,L,L,L,E,E,E,E,E,k,C,k,C,C,b,b,b,b,b,b,b,b,b,b,C,E,E,E,E,E,E,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,E,E,E,E,E,E,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,E,E,E,E,H,H,H,H,H,H,S,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,C,E,L,L,L,L,E,E,E,E,g,E,E,H,E,E,L,L,b,b,E,g,E,E,E,b,g,E,E,E,E,E],j=[N,N,N,N,N,N,N,N,N,N,N,H,H,H,g,y,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,N,S,O,M,_,D,P,C,L,L,L,L,L,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,C,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,N];t.L=g,t.R=y,t.EN=b,t.ON_R=3,t.AN=4,t.R_H=5,t.B=6,t.RLE=7,t.DOT="\u00b7",t.doBidiReorder=function(e,n,r){if(e.length<2)return{};var i=e.split(""),o=new Array(i.length),u=new Array(i.length),a=[];s=r?m:v,F(i,a,i.length,n);for(var f=0;fT&&n[f]0&&i[f-1]==="\u0644"&&/\u0622|\u0623|\u0625|\u0627/.test(i[f])&&(a[f-1]=a[f]=t.R_H,f++);i[i.length-1]===t.DOT&&(a[i.length-1]=t.B),i[0]==="\u202b"&&(a[0]=t.RLE);for(var f=0;f=0&&(e=this.session.$docRowCache[n])}return e},this.getSplitIndex=function(){var e=0,t=this.session.$screenRowCache;if(t.length){var n,r=this.session.$getRowCacheIndex(t,this.currentRow);while(this.currentRow-e>0){n=this.session.$getRowCacheIndex(t,this.currentRow-e-1);if(n!==r)break;r=n,e++}}else e=this.currentRow;return e},this.updateRowLine=function(e,t){e===undefined&&(e=this.getDocumentRow());var n=e===this.session.getLength()-1,s=n?this.EOF:this.EOL;this.wrapIndent=0,this.line=this.session.getLine(e),this.isRtlDir=this.$isRtl||this.line.charAt(0)===this.RLE;if(this.session.$useWrapMode){var o=this.session.$wrapData[e];o&&(t===undefined&&(t=this.getSplitIndex()),t>0&&o.length?(this.wrapIndent=o.indent,this.wrapOffset=this.wrapIndent*this.charWidths[r.L],this.line=tt?this.session.getOverwrite()?e:e-1:t,i=r.getVisualFromLogicalIdx(n,this.bidiMap),s=this.bidiMap.bidiLevels,o=0;!this.session.getOverwrite()&&e<=t&&s[i]%2!==0&&i++;for(var u=0;ut&&s[i]%2===0&&(o+=this.charWidths[s[i]]),this.wrapIndent&&(o+=this.isRtlDir?-1*this.wrapOffset:this.wrapOffset),this.isRtlDir&&(o+=this.rtlLineOffset),o},this.getSelections=function(e,t){var n=this.bidiMap,r=n.bidiLevels,i,s=[],o=0,u=Math.min(e,t)-this.wrapIndent,a=Math.max(e,t)-this.wrapIndent,f=!1,l=!1,c=0;this.wrapIndent&&(o+=this.isRtlDir?-1*this.wrapOffset:this.wrapOffset);for(var h,p=0;p=u&&hn+s/2){n+=s;if(r===i.length-1){s=0;break}s=this.charWidths[i[++r]]}return r>0&&i[r-1]%2!==0&&i[r]%2===0?(e0&&i[r-1]%2===0&&i[r]%2!==0?t=1+(e>n?this.bidiMap.logicalFromVisual[r]:this.bidiMap.logicalFromVisual[r-1]):this.isRtlDir&&r===i.length-1&&s===0&&i[r-1]%2===0||!this.isRtlDir&&r===0&&i[r]%2!==0?t=1+this.bidiMap.logicalFromVisual[r]:(r>0&&i[r-1]%2!==0&&s!==0&&r--,t=this.bidiMap.logicalFromVisual[r]),t===0&&this.isRtlDir&&t++,t+this.wrapIndent}}).call(o.prototype),t.BidiHandler=o}),ace.define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/lang"),s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=function(e){this.session=e,this.doc=e.getDocument(),this.clearSelection(),this.cursor=this.lead=this.doc.createAnchor(0,0),this.anchor=this.doc.createAnchor(0,0),this.$silent=!1;var t=this;this.cursor.on("change",function(e){t.$cursorChanged=!0,t.$silent||t._emit("changeCursor"),!t.$isEmpty&&!t.$silent&&t._emit("changeSelection"),!t.$keepDesiredColumnOnChange&&e.old.column!=e.value.column&&(t.$desiredColumn=null)}),this.anchor.on("change",function(){t.$anchorChanged=!0,!t.$isEmpty&&!t.$silent&&t._emit("changeSelection")})};(function(){r.implement(this,s),this.isEmpty=function(){return this.$isEmpty||this.anchor.row==this.lead.row&&this.anchor.column==this.lead.column},this.isMultiLine=function(){return!this.$isEmpty&&this.anchor.row!=this.cursor.row},this.getCursor=function(){return this.lead.getPosition()},this.setSelectionAnchor=function(e,t){this.$isEmpty=!1,this.anchor.setPosition(e,t)},this.getAnchor=this.getSelectionAnchor=function(){return this.$isEmpty?this.getSelectionLead():this.anchor.getPosition()},this.getSelectionLead=function(){return this.lead.getPosition()},this.isBackwards=function(){var e=this.anchor,t=this.lead;return e.row>t.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.$isEmpty?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){this.$setSelection(0,0,Number.MAX_VALUE,Number.MAX_VALUE)},this.setRange=this.setSelectionRange=function(e,t){var n=t?e.end:e.start,r=t?e.start:e.end;this.$setSelection(n.row,n.column,r.row,r.column)},this.$setSelection=function(e,t,n,r){var i=this.$isEmpty,s=this.inMultiSelectMode;this.$silent=!0,this.$cursorChanged=this.$anchorChanged=!1,this.anchor.setPosition(e,t),this.cursor.setPosition(n,r),this.$isEmpty=!o.comparePoints(this.anchor,this.cursor),this.$silent=!1,this.$cursorChanged&&this._emit("changeCursor"),(this.$cursorChanged||this.$anchorChanged||i!=this.$isEmpty||s)&&this._emit("changeSelection")},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.wouldMoveIntoSoftTab=function(e,t,n){var r=e.column,i=e.column+t;return n<0&&(r=e.column-t,i=e.column),this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(r,i).split(" ").length-1==t},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.wouldMoveIntoSoftTab(e,n,-1)&&!this.session.getNavigateWithinSoftTabs()?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t);this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var i=this.session.getFoldAt(e,t,1);if(i){this.moveCursorTo(i.end.row,i.end.column);return}this.session.nonTokenRe.exec(r)&&(t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t));if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}this.session.tokenRe.exec(s)&&(t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0),this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t=0,n,r=/\s/,i=this.session.tokenRe;i.lastIndex=0;if(this.session.tokenRe.exec(e))t=this.session.tokenRe.lastIndex;else{while((n=e[t])&&r.test(n))t++;if(t<1){i.lastIndex=0;while((n=e[t])&&!i.test(n)){i.lastIndex=0,t++;if(r.test(n)){if(t>2){t--;break}while((n=e[t])&&r.test(n))t++;if(t>2)break}}}}return i.lastIndex=0,t},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column),r;t===0&&(e!==0&&(this.session.$bidiHandler.isBidiRow(n.row,this.lead.row)?(r=this.session.$bidiHandler.getPosLeft(n.column),n.column=Math.round(r/this.session.$bidiHandler.charWidths[0])):r=n.column*this.session.$bidiHandler.charWidths[0]),this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var i=this.session.screenToDocumentPosition(n.row+e,n.column,r);e!==0&&t===0&&i.row===this.lead.row&&i.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[i.row]&&(i.row>0||e>0)&&i.row++,this.moveCursorTo(i.row,i.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0;var i=this.session.getLine(e);/[\uDC00-\uDFFF]/.test(i.charAt(t))&&i.charAt(t-1)&&(this.lead.row==e&&this.lead.column==t+1?t-=1:t+=1),this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList&&e.length>1){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),ace.define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}},this.getCurrentTokenRange=function(){var e=this.$rowTokens[this.$tokenIndex],t=this.getCurrentTokenColumn();return new r(this.$row,t,this.$row,t+e.value.length)}}).call(i.prototype),t.TokenIterator=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","rparen","paren","punctuation.operator"],a=["text","paren.rparen","rparen","paren","punctuation.operator","comment"],f,l={},c={'"':'"',"'":"'"},h=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},p=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},d=function(e){this.add("braces","insertion",function(t,n,r,i,s){var u=r.getCursorPosition(),a=i.doc.getLine(u.row);if(s=="{"){h(r);var l=r.getSelectionRange(),c=i.doc.getTextRange(l);if(c!==""&&c!=="{"&&r.getWrapBehavioursEnabled())return p(l,c,"{","}");if(d.isSaneInsertion(r,i))return/[\]\}\)]/.test(a[u.column])||r.inMultiSelectMode||e&&e.braces?(d.recordAutoInsert(r,i,"}"),{text:"{}",selection:[1,1]}):(d.recordMaybeInsert(r,i,"{"),{text:"{",selection:[1,1]})}else if(s=="}"){h(r);var v=a.substring(u.column,u.column+1);if(v=="}"){var m=i.$findOpeningBracket("}",{column:u.column+1,row:u.row});if(m!==null&&d.isAutoInsertedClosing(u,a,s))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(s=="\n"||s=="\r\n"){h(r);var g="";d.isMaybeInsertedClosing(u,a)&&(g=o.stringRepeat("}",f.maybeInsertedBrackets),d.clearMaybeInsertedClosing());var v=a.substring(u.column,u.column+1);if(v==="}"){var y=i.findMatchingBracket({row:u.row,column:u.column+1},"}");if(!y)return null;var b=this.$getIndent(i.getLine(y.row))}else{if(!g){d.clearMaybeInsertedClosing();return}var b=this.$getIndent(a)}var w=b+i.getTabString();return{text:"\n"+w+"\n"+b+g,selection:[1,w.length,1,w.length]}}d.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"(",")");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"[","]");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){var s=r.$mode.$quotes||c;if(i.length==1&&s[i]){if(this.lineCommentStart&&this.lineCommentStart.indexOf(i)!=-1)return;h(n);var o=i,u=n.getSelectionRange(),a=r.doc.getTextRange(u);if(a!==""&&(a.length!=1||!s[a])&&n.getWrapBehavioursEnabled())return p(u,a,o,o);if(!a){var f=n.getCursorPosition(),l=r.doc.getLine(f.row),d=l.substring(f.column-1,f.column),v=l.substring(f.column,f.column+1),m=r.getTokenAt(f.row,f.column),g=r.getTokenAt(f.row,f.column+1);if(d=="\\"&&m&&/escape/.test(m.type))return null;var y=m&&/string|escape/.test(m.type),b=!g||/string|escape/.test(g.type),w;if(v==o)w=y!==b,w&&/string\.end/.test(g.type)&&(w=!1);else{if(y&&!b)return null;if(y&&b)return null;var E=r.$mode.tokenRe;E.lastIndex=0;var S=E.test(d);E.lastIndex=0;var x=E.test(d);if(S||x)return null;if(v&&!/[\s;,.})\]\\]/.test(v))return null;var T=l[f.column-2];if(!(d!=o||T!=o&&!E.test(T)))return null;w=!0}return{text:w?o+o:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.$mode.$quotes||c,o=r.doc.getTextRange(i);if(!i.isMultiLine()&&s.hasOwnProperty(o)){h(n);var u=r.doc.getLine(i.start.row),a=u.substring(i.start.column+1,i.start.column+2);if(a==o)return i.end.column++,i}})};d.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){if(/[)}\]]/.test(e.session.getLine(n.row)[n.column]))return!0;var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},d.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},d.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},d.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},d.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},d.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},d.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},d.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(d,i),t.CstyleBehaviour=d}),ace.define("ace/unicode",["require","exports","module"],function(e,t,n){"use strict";var r=[48,9,8,25,5,0,2,25,48,0,11,0,5,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,18,116,2,1,3,3,9,0,2,2,2,0,2,19,2,82,2,138,2,4,3,155,12,37,3,0,8,38,10,44,2,0,2,1,2,1,2,0,9,26,6,2,30,10,7,61,2,9,5,101,2,7,3,9,2,18,3,0,17,58,3,100,15,53,5,0,6,45,211,57,3,18,2,5,3,11,3,9,2,1,7,6,2,2,2,7,3,1,3,21,2,6,2,0,4,3,3,8,3,1,3,3,9,0,5,1,2,4,3,11,16,2,2,5,5,1,3,21,2,6,2,1,2,1,2,1,3,0,2,4,5,1,3,2,4,0,8,3,2,0,8,15,12,2,2,8,2,2,2,21,2,6,2,1,2,4,3,9,2,2,2,2,3,0,16,3,3,9,18,2,2,7,3,1,3,21,2,6,2,1,2,4,3,8,3,1,3,2,9,1,5,1,2,4,3,9,2,0,17,1,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,5,4,4,2,2,3,3,0,7,0,15,9,18,2,2,7,2,2,2,22,2,9,2,4,4,7,2,2,2,3,8,1,2,1,7,3,3,9,19,1,2,7,2,2,2,22,2,9,2,4,3,8,2,2,2,3,8,1,8,0,2,3,3,9,19,1,2,7,2,2,2,22,2,15,4,7,2,2,2,3,10,0,9,3,3,9,11,5,3,1,2,17,4,23,2,8,2,0,3,6,4,0,5,5,2,0,2,7,19,1,14,57,6,14,2,9,40,1,2,0,3,1,2,0,3,0,7,3,2,6,2,2,2,0,2,0,3,1,2,12,2,2,3,4,2,0,2,5,3,9,3,1,35,0,24,1,7,9,12,0,2,0,2,0,5,9,2,35,5,19,2,5,5,7,2,35,10,0,58,73,7,77,3,37,11,42,2,0,4,328,2,3,3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,2,3,3,14,2,56,2,3,3,66,5,0,33,15,17,84,13,619,3,16,2,25,6,74,22,12,2,6,12,20,12,19,13,12,2,2,2,1,13,51,3,29,4,0,5,1,3,9,34,2,3,9,7,87,9,42,6,69,11,28,4,11,5,11,11,39,3,4,12,43,5,25,7,10,38,27,5,62,2,28,3,10,7,9,14,0,89,75,5,9,18,8,13,42,4,11,71,55,9,9,4,48,83,2,2,30,14,230,23,280,3,5,3,37,3,5,3,7,2,0,2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,67,1,20,0,29,0,14,0,17,4,60,12,5,0,4,11,18,0,5,0,3,9,2,0,4,4,7,0,2,0,2,0,2,3,2,10,3,3,6,4,5,0,53,1,2684,46,2,46,2,132,7,6,15,37,11,53,10,0,17,22,10,6,2,6,2,6,2,6,2,6,2,6,2,6,2,6,2,31,48,0,470,1,36,5,2,4,6,1,5,85,3,1,3,2,2,89,2,3,6,40,4,93,18,23,57,15,513,6581,75,20939,53,1164,68,45,3,268,4,27,21,31,3,13,13,1,2,24,9,69,11,1,38,8,3,102,3,1,111,44,25,51,13,68,12,9,7,23,4,0,5,45,3,35,13,28,4,64,15,10,39,54,10,13,3,9,7,22,4,1,5,66,25,2,227,42,2,1,3,9,7,11171,13,22,5,48,8453,301,3,61,3,105,39,6,13,4,6,11,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,5,15,17,6,13,1,25,2,33,4,2,134,20,9,8,25,5,0,2,25,12,88,4,5,3,5,3,5,3,2],i=0,s=[];for(var o=0;o2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),u==Infinity&&(u=E,s=!1,o=!1),l&&u%f!=0&&(u=Math.floor(u/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new f(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,a=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new l(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new f(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new l(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);a.start.row==c&&(a.start.column+=h),a.end.row==c&&(a.end.column+=h),t.selection.fromOrientedRange(a)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)if(e[t]){var n=e[t],i=n.prototype.$id,s=r.$modes[i];s||(r.$modes[i]=s=new n),r.$modes[t]||(r.$modes[t]=s),this.$embeds.push(t),this.$modes[t]=s}var o=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4?this.$splitAndapplyLargeDelta(e,2e4):(i(this.$lines,e,t),this._signal("change",e))},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length-t+1,i=e.start.row,s=e.start.column;for(var o=0,u=0;o20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,r==-1&&(r=t),s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.row=r)break}if(e.action=="insert"){var f=i-r,l=-t.column+n.column;for(;or)break;a.start.row==r&&a.start.column>=t.column&&(a.start.column==t.column&&this.$bias<=0||(a.start.column+=l,a.start.row+=f));if(a.end.row==r&&a.end.column>=t.column){if(a.end.column==t.column&&this.$bias<0)continue;a.end.column==t.column&&l>0&&oa.start.column&&a.end.column==s[o+1].start.column&&(a.end.column-=l),a.end.column+=l,a.end.row+=f}}}else{var f=r-i,l=t.column-n.column;for(;oi)break;if(a.end.rowt.column)a.end.column=t.column,a.end.row=t.row}else a.end.column+=l,a.end.row+=f;else a.end.row>i&&(a.end.row+=f);if(a.start.rowt.column)a.start.column=t.column,a.start.row=t.row}else a.start.column+=l,a.start.row+=f;else a.start.row>i&&(a.start.row+=f)}}if(f!=0&&o=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column,c=this.getFoldAt(u,a,1),h=this.getFoldAt(f,l,-1);if(c&&h==c)return c.addSubFold(o);c&&!c.range.isStart(u,a)&&this.removeFold(c),h&&!h.range.isEnd(f,l)&&this.removeFold(h);var p=this.getFoldsInRange(o.range);p.length>0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(tl)break}while(s&&a.test(s.type));s=i.stepBackward()}else s=i.getCurrentToken();return f.end.row=i.getCurrentTokenRow(),f.end.column=i.getCurrentTokenColumn()+s.value.length-2,f}},this.foldAll=function(e,t,n){n==undefined&&(n=1e5);var r=this.foldWidgets;if(!r)return;t=t||this.getLength(),e=e||0;for(var i=e;i=e){i=s.end.row;try{var o=this.addFold("...",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s)return t.children||t.all?this.removeFold(s):this.expandFold(s),s;var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range))return this.removeFold(s),s}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{","<":">",">":"<"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,u),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;e.addSession(this),this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.mergeUndoDeltas=!1},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}else this.$syncInformUndoManager=function(){}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},hasUndo:function(){},hasRedo:function(){},reset:function(){},add:function(){},addSelection:function(){},startNewGroup:function(){},addSession:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.setNavigateWithinSoftTabs=function(e){this.setOption("navigateWithinSoftTabs",e)},this.getNavigateWithinSoftTabs=function(){return this.$navigateWithinSoftTabs},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;for(var n=e.length-1;n!=-1;n--){var r=e[n];r.action=="insert"||r.action=="remove"?this.doc.revertDelta(r):r.folds&&this.addFolds(r.folds)}!t&&this.$undoSelect&&(e.selectionBefore?this.selection.fromJSON(e.selectionBefore):this.selection.setRange(this.$getUndoSelection(e,!0))),this.$fromUndo=!1},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;for(var n=0;ne.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,f=s.start,o=f.row-a.row,u=f.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new l(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new l(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$bidiHandler.markAsDirty(),this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),o=this.$wrapData,u=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,o){var u;if(e!=null){u=this.$getDisplayTokens(e,a.length),u[0]=n;for(var f=1;fr-b){var w=f+r-b;if(e[w-1]>=c&&e[w]>=c){y(w);continue}if(e[w]==n||e[w]==s){for(w;w!=f-1;w--)if(e[w]==n)break;if(w>f){y(w);continue}w=f+r;for(w;w>2)),f-1);while(w>E&&e[w]E&&e[w]E&&e[w]==a)w--}else while(w>E&&e[w]E){y(++w);continue}w=f+r,e[w]==t&&w--,y(w-b)}return o},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(a):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var u=f[l],i=this.$docRowCache[l],h=e>f[c-1];else var h=!c;var p=this.getLength()-1,d=this.getNextFoldLine(i),v=d?d.start.row:Infinity;while(u<=e){a=this.getRowLength(i);if(u+a>e||i>=p)break;u+=a,i++,i>v&&(i=d.end.row+1,d=this.getNextFoldLine(i,d),v=d?d.start.row:Infinity),h&&(this.$docRowCache.push(i),this.$screenRowCache.push(u))}if(d&&d.start.row<=i)r=this.getFoldDisplayLine(d),i=d.start.row;else{if(u+a<=e||i>p)return{row:p,column:this.getLine(p).length};r=this.getLine(i),d=null}var m=0,g=Math.floor(e-u);if(this.$useWrapMode){var y=this.$wrapData[i];y&&(o=y[g],g>0&&y.length&&(m=y.indent,s=y[g-1]||y[y.length-1],r=r.substring(s)))}return n!==undefined&&this.$bidiHandler.isBidiRow(u+g,i,g)&&(t=this.$bidiHandler.offsetToCol(n)),s+=this.$getStringScreenWidth(r,t-m)[1],this.$useWrapMode&&s>=o&&(s=o-1),d?d.idxToPosition(s):{row:i,column:s}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()},this.isFullWidth=m}.call(d.prototype),e("./edit_session/folding").Folding.call(d.prototype),e("./edit_session/bracket_match").BracketMatch.call(d.prototype),o.defineOptions(d.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$useWrapMode=!1,this.setUseWrapMode(!0)))},initialValue:"auto"},indentedSoftWrap:{set:function(){this.$useWrapMode&&(this.$useWrapMode=!1,this.setUseWrapMode(!0))},initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){e=parseInt(e),e>0&&this.$tabSize!==e&&(this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize"))},initialValue:4,handlesSet:!0},navigateWithinSoftTabs:{initialValue:!1},foldStyle:{set:function(e){this.setFoldStyle(e)},handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId},handlesSet:!0}}),t.EditSession=d}),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";function u(e,t){function n(e){return/\w/.test(e)||t.regExp?"\\b":""}return n(e[0])+e+n(e[e.length-1])}var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i,o){return r=new s(e,n,i,o),n==o&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start)?(r=null,!1):!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=u;n--)if(c(n,Number.MAX_VALUE,e))return;if(t.wrap==0)return;for(n=a,u=o.row;n>=u;n--)if(c(n,Number.MAX_VALUE,e))return};else var f=function(e){var n=o.row;if(c(n,o.column,e))return;for(n+=1;n<=a;n++)if(c(n,0,e))return;if(t.wrap==0)return;for(n=u,a=o.row;n<=a;n++)if(c(n,0,e))return};if(t.$isMultiLine)var l=n.length,c=function(t,i,s){var o=r?t-l+1:t;if(o<0)return;var u=e.getLine(o),a=u.search(n[0]);if(!r&&ai)return;if(s(o,a,o+l-1,c))return!0};else if(r)var c=function(t,r,i){var s=e.getLine(t),o=[],u,a=0;n.lastIndex=0;while(u=n.exec(s)){var f=u[0].length;a=u.index;if(!f){if(a>=s.length)break;n.lastIndex=a+=1}if(u.index+f>r)break;o.push(u.index,f)}for(var l=o.length-1;l>=0;l-=2){var c=o[l-1],f=o[l];if(i(t,c,t,c+f))return!0}};else var c=function(t,r,i){var s=e.getLine(t),o,u;n.lastIndex=r;while(u=n.exec(s)){var a=u[0].length;o=u.index;if(i(t,o,t,o+a))return!0;if(!a){n.lastIndex=o+=1;if(o>=s.length)return!1}}};return{forEach:f}}}).call(o.prototype),t.Search=o}),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||(e.isDefault?-100:0)}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;if(this.$checkCommandState!=0&&e.isAvailable&&!e.isAvailable(t))return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:o("Alt-E","F4"),exec:function(e){i.loadModule("./ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:o("Alt-Shift-E","Shift-F4"),exec:function(e){i.loadModule("./ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",description:"Select all",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",description:"Center selection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",description:"Go to line...",bindKey:o("Ctrl-L","Command-L"),exec:function(e,t){typeof t=="number"&&!isNaN(t)&&e.gotoLine(t),e.prompt({$type:"gotoLine"})},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",description:"Fold all",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",description:"Fold other",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",description:"Unfold all",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",description:"Find next",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",description:"Find previous",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",description:"Select or find next",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",description:"Select or find previous",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",description:"Find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",description:"Overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",description:"Select to start",bindKey:o("Ctrl-Shift-Home","Command-Shift-Home|Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",description:"Go to start",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",description:"Select up",bindKey:o("Shift-Up","Shift-Up|Ctrl-Shift-P"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",description:"Go line up",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",description:"Select to end",bindKey:o("Ctrl-Shift-End","Command-Shift-End|Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",description:"Go to end",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",description:"Select down",bindKey:o("Shift-Down","Shift-Down|Ctrl-Shift-N"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",description:"Go line down",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",description:"Select word left",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",description:"Go to word left",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",description:"Select to line start",bindKey:o("Alt-Shift-Left","Command-Shift-Left|Ctrl-Shift-A"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",description:"Go to line start",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",description:"Select left",bindKey:o("Shift-Left","Shift-Left|Ctrl-Shift-B"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",description:"Go to left",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",description:"Select word right",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",description:"Go to word right",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",description:"Select to line end",bindKey:o("Alt-Shift-Right","Command-Shift-Right|Shift-End|Ctrl-Shift-E"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",description:"Go to line end",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",description:"Select right",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",description:"Go to right",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",description:"Select page down",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",description:"Page down",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",description:"Go to page down",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",description:"Select page up",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",description:"Page up",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",description:"Go to page up",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",description:"Scroll up",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",description:"Scroll down",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",description:"Select line start",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",description:"Select line end",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",description:"Toggle recording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",description:"Replay macro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",description:"Jump to matching",bindKey:o("Ctrl-\\|Ctrl-P","Command-\\"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",description:"Select to matching",bindKey:o("Ctrl-Shift-\\|Ctrl-Shift-P","Command-Shift-\\"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",description:"Expand to matching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",description:"Pass keys to browser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",description:"Copy",exec:function(e){},readOnly:!0},{name:"cut",description:"Cut",exec:function(e){var t=e.$copyWithEmptySelection&&e.selection.isEmpty(),n=t?e.selection.getLineRange():e.selection.getRange();e._emit("cut",n),n.isEmpty()||e.session.remove(n),e.clearSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",description:"Paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",description:"Remove line",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",description:"Duplicate selection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",description:"Sort lines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",description:"Toggle comment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",description:"Toggle block comment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",description:"Modify number up",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",description:"Modify number down",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",description:"Replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",description:"Undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",description:"Redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",description:"Copy lines up",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",description:"Move lines up",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",description:"Copy lines down",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",description:"Move lines down",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",description:"Delete",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",description:"Backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",description:"Cut or delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",description:"Remove to line start",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",description:"Remove to line end",bindKey:o("Alt-Delete","Ctrl-K|Command-Delete"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestarthard",description:"Remove to line start hard",bindKey:o("Ctrl-Shift-Backspace",null),exec:function(e){var t=e.selection.getRange();t.start.column=0,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineendhard",description:"Remove to line end hard",bindKey:o("Ctrl-Shift-Delete",null),exec:function(e){var t=e.selection.getRange();t.end.column=Number.MAX_VALUE,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",description:"Remove word left",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",description:"Remove word right",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",description:"Outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",description:"Indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",description:"Block outdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",description:"Block indent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",description:"Insert string",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",description:"Insert text",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",description:"Split line",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",description:"Transpose letters",bindKey:o("Alt-Shift-X","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",description:"To uppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",description:"To lowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",description:"Expand to line",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",description:"Join lines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",description:"Invert selection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}var s=this.selection.toJSON();this.curOp.selectionAfter=s,this.$lastSel=this.selection.toJSON(),this.session.getUndoManager().addSelection(s),this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"&&e!="ace"){this.$keybindingId=e;var n=this;g.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.onCursorChange(),this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this}),e&&e.bgTokenizer&&e.bgTokenizer.scheduleStart()},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||i.computedStyle(this.container).fontSize},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=t.findMatchingBracket(e.getCursorPosition());if(n)var r=new p(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)var r=t.$mode.getMatching(e.session);r&&(t.$bracketHighlight=t.addMarker(r,"ace_bracket","text"))},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf("tag-open")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value=="<"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column,r=t.end.column,i=e.getLine(t.start.row),s=i.substring(n,r);if(s.length>5e3||!/[\w\d]/.test(s))return;var o=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:s}),u=i.substring(n-1,r+1);if(!o.test(u))return;return o},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText(),t=this.session.doc.getNewLineCharacter(),n=!1;if(!e&&this.$copyWithEmptySelection){n=!0;var r=this.selection.getAllRanges();for(var i=0;iu.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e);n.insert(i,e),s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var h=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},h)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e,t){if(!t)return this.keyBinding.onTextInput(e);this.startOperation({command:{name:"insertstring"}});var n=this.applyComposition.bind(this,e,t);this.selection.rangeCount?this.forEachSelection(n):n(),this.endOperation()},this.applyComposition=function(e,t){if(t.extendLeft||t.extendRight){var n=this.selection.getRange();n.start.column-=t.extendLeft,n.end.column+=t.extendRight,this.selection.setRange(n),!e&&!n.isEmpty()&&this.remove()}(e||!this.selection.isEmpty())&&this.insert(e,!0);if(t.restoreStart||t.restoreEnd){var n=this.selection.getRange();n.start.column-=t.restoreStart,n.end.column-=t.restoreEnd,this.selection.setRange(n)}},this.onCommandKey=function(e,t,n){return this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.selection.isEmpty()&&this.selection.selectLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var i=new p(0,0,0,0);for(var r=e.first;r<=e.last;r++){var s=t.getLine(r);i.start.row=r,i.end.row=r,i.end.column=s.length,t.replace(i,n[r-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&n=u&&o<=a&&(n=t,f.selection.clearSelection(),f.moveCursorTo(e,u+r),f.selection.selectTo(e,a+r)),u=a});var l=this.$toggleWordPairs,c;for(var h=0;hp+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(e)},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection());var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.selection.selectAll()},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g))for(;f=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.session.unfold(e),this.selection.setSelectionRange(e);var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.session.getUndoManager().undo(this.session),this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.session.getUndoManager().redo(this.session),this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",i.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))},this.prompt=function(e,t,n){var r=this;g.loadModule("./ext/prompt",function(i){i.prompt(r,e,t,n)})}}.call(w.prototype),g.defineOptions(w.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.textInput.setReadOnly(e),this.$resetCursorStyle()},initialValue:!1},copyWithEmptySelection:{set:function(e){this.textInput.setCopyWithEmptySelection(e)},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.$keybindingId},handlesSet:!0},value:{set:function(e){this.session.setValue(e)},get:function(){return this.getValue()},handlesSet:!0,hidden:!0},session:{set:function(e){this.setSession(e)},get:function(){return this.session},handlesSet:!0,hidden:!0},showLineNumbers:{set:function(e){this.renderer.$gutterLayer.setShowLineNumbers(e),this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER),e&&this.$relativeLineNumbers?E.attach(this):E.detach(this)},initialValue:!0},relativeLineNumbers:{set:function(e){this.$showLineNumbers&&e?E.attach(this):E.detach(this)}},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",displayIndentGuides:"renderer",showGutter:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",hasCssTransforms:"renderer",maxPixelHeight:"renderer",useTextareaForIME:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimeout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",navigateWithinSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"});var E={getText:function(e,t){return(Math.abs(e.selection.lead.row-t)||t+1+(t<9?"\u00b7":""))+""},getWidth:function(e,t,n){return Math.max(t.toString().length,(n.lastRow+1).toString().length,2)*n.characterWidth},update:function(e,t){t.renderer.$loop.schedule(t.renderer.CHANGE_GUTTER)},attach:function(e){e.renderer.$gutterLayer.$renderer=this,e.on("changeSelection",this.update),this.update(null,e)},detach:function(e){e.renderer.$gutterLayer.$renderer==this&&(e.renderer.$gutterLayer.$renderer=null),e.off("changeSelection",this.update),this.update(null,e)}};t.Editor=w}),ace.define("ace/undomanager",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){for(var n=t;n--;){var r=e[n];if(r&&!r[0].ignore){while(n0){a.row+=i,a.column+=a.row==r.row?s:0;continue}!t&&l<=0&&(a.row=n.row,a.column=n.column,l===0&&(a.bias=1))}}function f(e){return{row:e.row,column:e.column}}function l(e){return{start:f(e.start),end:f(e.end),action:e.action,lines:e.lines.slice()}}function c(e){e=e||this;if(Array.isArray(e))return e.map(c).join("\n");var t="";e.action?(t=e.action=="insert"?"+":"-",t+="["+e.lines+"]"):e.value&&(Array.isArray(e.value)?t=e.value.map(h).join("\n"):t=h(e.value)),e.start&&(t+=h(e));if(e.id||e.rev)t+=" ("+(e.id||e.rev)+")";return t}function h(e){return e.start.row+":"+e.start.column+"=>"+e.end.row+":"+e.end.column}function p(e,t){var n=e.action=="insert",r=t.action=="insert";if(n&&r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.start,e.start)<=0))return null;m(e,t,1)}else if(n&&!r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.end,e.start)<=0))return null;m(e,t,-1)}else if(!n&&r)if(o(t.start,e.start)>=0)m(t,e,1);else{if(!(o(t.start,e.start)<=0))return null;m(e,t,1)}else if(!n&&!r)if(o(t.start,e.start)>=0)m(t,e,1);else{if(!(o(t.end,e.start)<=0))return null;m(e,t,-1)}return[t,e]}function d(e,t){for(var n=e.length;n--;)for(var r=0;r=0?m(e,t,-1):o(e.start,t.start)<=0?m(t,e,1):(m(e,s.fromPoints(t.start,e.start),-1),m(t,e,1));else if(!n&&r)o(t.start,e.end)>=0?m(t,e,-1):o(t.start,e.start)<=0?m(e,t,1):(m(t,s.fromPoints(e.start,t.start),-1),m(e,t,1));else if(!n&&!r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.end,e.start)<=0)){var i,u;return o(e.start,t.start)<0&&(i=e,e=y(e,t.start)),o(e.end,t.end)>0&&(u=y(e,t.end)),g(t.end,e.start,e.end,-1),u&&!i&&(e.lines=u.lines,e.start=u.start,e.end=u.end,u=e),[t,i,u].filter(Boolean)}m(e,t,-1)}return[t,e]}function m(e,t,n){g(e.start,t.start,t.end,n),g(e.end,t.start,t.end,n)}function g(e,t,n,r){e.row==(r==1?t:n).row&&(e.column+=r*(n.column-t.column)),e.row+=r*(n.row-t.row)}function y(e,t){var n=e.lines,r=e.end;e.end=f(t);var i=e.end.row-e.start.row,s=n.splice(i,n.length),o=i?t.column:t.column-e.start.column;n.push(s[0].substring(0,o)),s[0]=s[0].substr(o);var u={start:f(t),end:r,lines:s,action:e.action};return u}function b(e,t){t=l(t);for(var n=e.length;n--;){var r=e[n];for(var i=0;i0},this.canRedo=function(){return this.$redoStack.length>0},this.bookmark=function(e){e==undefined&&(e=this.$rev),this.mark=e},this.isAtBookmark=function(){return this.$rev===this.mark},this.toJSON=function(){},this.fromJSON=function(){},this.hasUndo=this.canUndo,this.hasRedo=this.canRedo,this.isClean=this.isAtBookmark,this.markClean=this.bookmark,this.$prettyPrint=function(e){return e?c(e):c(this.$undoStack)+"\n---\n"+c(this.$redoStack)}}).call(r.prototype);var s=e("./range").Range,o=s.comparePoints,u=s.comparePoints;t.UndoManager=r}),ace.define("ace/layer/lines",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=function(e,t){this.element=e,this.canvasHeight=t||5e5,this.element.style.height=this.canvasHeight*2+"px",this.cells=[],this.cellCache=[],this.$offsetCoefficient=0};(function(){this.moveContainer=function(e){r.translate(this.element,0,-(e.firstRowScreen*e.lineHeight%this.canvasHeight)-e.offset*this.$offsetCoefficient)},this.pageChanged=function(e,t){return Math.floor(e.firstRowScreen*e.lineHeight/this.canvasHeight)!==Math.floor(t.firstRowScreen*t.lineHeight/this.canvasHeight)},this.computeLineTop=function(e,t,n){var r=t.firstRowScreen*t.lineHeight,i=Math.floor(r/this.canvasHeight),s=n.documentToScreenRow(e,0)*t.lineHeight;return s-i*this.canvasHeight},this.computeLineHeight=function(e,t,n){return t.lineHeight*n.getRowLength(e)},this.getLength=function(){return this.cells.length},this.get=function(e){return this.cells[e]},this.shift=function(){this.$cacheCell(this.cells.shift())},this.pop=function(){this.$cacheCell(this.cells.pop())},this.push=function(e){if(Array.isArray(e)){this.cells.push.apply(this.cells,e);var t=r.createFragment(this.element);for(var n=0;ns&&(a=i.end.row+1,i=t.getNextFoldLine(a,i),s=i?i.start.row:Infinity);if(a>r){while(this.$lines.getLength()>u+1)this.$lines.pop();break}o=this.$lines.get(++u),o?o.row=a:(o=this.$lines.createCell(a,e,this.session,f),this.$lines.push(o)),this.$renderCell(o,e,i,a),a++}this._signal("afterRender"),this.$updateGutterWidth(e)},this.$updateGutterWidth=function(e){var t=this.session,n=t.gutterRenderer||this.$renderer,r=t.$firstLineNumber,i=this.$lines.last()?this.$lines.last().text:"";if(this.$fixedWidth||t.$useWrapMode)i=t.getLength()+r-1;var s=n?n.getWidth(t,i,e):i.toString().length*e.characterWidth,o=this.$padding||this.$computePadding();s+=o.left+o.right,s!==this.gutterWidth&&!isNaN(s)&&(this.gutterWidth=s,this.element.parentNode.style.width=this.element.style.width=Math.ceil(this.gutterWidth)+"px",this._signal("changeGutterWidth",s))},this.$updateCursorRow=function(){if(!this.$highlightGutterLine)return;var e=this.session.selection.getCursor();if(this.$cursorRow===e.row)return;this.$cursorRow=e.row},this.updateLineHighlight=function(){if(!this.$highlightGutterLine)return;var e=this.session.selection.cursor.row;this.$cursorRow=e;if(this.$cursorCell&&this.$cursorCell.row==e)return;this.$cursorCell&&(this.$cursorCell.element.className=this.$cursorCell.element.className.replace("ace_gutter-active-line ",""));var t=this.$lines.cells;this.$cursorCell=null;for(var n=0;n=this.$cursorRow){if(r.row>this.$cursorRow){var i=this.session.getFoldLine(this.$cursorRow);if(!(n>0&&i&&i.start.row==t[n-1].row))break;r=t[n-1]}r.element.className="ace_gutter-active-line "+r.element.className,this.$cursorCell=r;break}}},this.scrollLines=function(e){var t=this.config;this.config=e,this.$updateCursorRow();if(this.$lines.pageChanged(t,e))return this.update(e);this.$lines.moveContainer(e);var n=Math.min(e.lastRow+e.gutterOffset,this.session.getLength()-1),r=this.oldLastRow;this.oldLastRow=n;if(!t||r0;i--)this.$lines.shift();if(r>n)for(var i=this.session.getFoldedRowCount(n+1,r);i>0;i--)this.$lines.pop();e.firstRowr&&this.$lines.push(this.$renderLines(e,r+1,n)),this.updateLineHighlight(),this._signal("afterRender"),this.$updateGutterWidth(e)},this.$renderLines=function(e,t,n){var r=[],i=t,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>n)break;var u=this.$lines.createCell(i,e,this.session,f);this.$renderCell(u,e,s,i),r.push(u),i++}return r},this.$renderCell=function(e,t,n,i){var s=e.element,o=this.session,u=s.childNodes[0],a=s.childNodes[1],f=o.$firstLineNumber,l=o.$breakpoints,c=o.$decorations,h=o.gutterRenderer||this.$renderer,p=this.$showFoldWidgets&&o.foldWidgets,d=n?n.start.row:Number.MAX_VALUE,v="ace_gutter-cell ";this.$highlightGutterLine&&(i==this.$cursorRow||n&&i=d&&this.$cursorRow<=n.end.row)&&(v+="ace_gutter-active-line ",this.$cursorCell!=e&&(this.$cursorCell&&(this.$cursorCell.element.className=this.$cursorCell.element.className.replace("ace_gutter-active-line ","")),this.$cursorCell=e)),l[i]&&(v+=l[i]),c[i]&&(v+=c[i]),this.$annotations[i]&&(v+=this.$annotations[i].className),s.className!=v&&(s.className=v);if(p){var m=p[i];m==null&&(m=p[i]=o.getFoldWidget(i))}if(m){var v="ace_fold-widget ace_"+m;m=="start"&&i==d&&in.right-t.right)return"foldWidgets"}}).call(a.prototype),t.Gutter=a}),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.elt=function(e,t){var n=this.i!=-1&&this.element.childNodes[this.i];n?this.i++:(n=document.createElement("div"),this.element.appendChild(n),this.i=-1),n.style.cssText=t,n.className=e},this.update=function(e){if(!e)return;this.config=e,this.i=0;var t;for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}if(this.i!=-1)while(this.ip,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"";if(this.session.$bidiHandler.isBidiRow(t.start.row)){var f=t.clone();f.end.row=f.start.row,f.end.column=this.session.getLine(f.start.row).length,this.drawBidiSingleLineMarker(e,f,n+" ace_br1 ace_start",r,null,i)}else this.elt(n+" ace_br1 ace_start","height:"+o+"px;"+"right:0;"+"top:"+u+"px;left:"+a+"px;"+(i||""));if(this.session.$bidiHandler.isBidiRow(t.end.row)){var f=t.clone();f.start.row=f.end.row,f.start.column=0,this.drawBidiSingleLineMarker(e,f,n+" ace_br12",r,null,i)}else{u=this.$getTop(t.end.row,r);var l=t.end.column*r.characterWidth;this.elt(n+" ace_br12","height:"+o+"px;"+"width:"+l+"px;"+"top:"+u+"px;"+"left:"+s+"px;"+(i||""))}o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var c=(t.start.column?1:0)|(t.end.column?0:8);this.elt(n+(c?" ace_br"+c:""),"height:"+o+"px;"+"right:0;"+"top:"+u+"px;"+"left:"+s+"px;"+(i||""))},this.drawSingleLineMarker=function(e,t,n,r,i,s){if(this.session.$bidiHandler.isBidiRow(t.start.row))return this.drawBidiSingleLineMarker(e,t,n,r,i,s);var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;this.elt(n,"height:"+o+"px;"+"width:"+u+"px;"+"top:"+a+"px;"+"left:"+f+"px;"+(s||""))},this.drawBidiSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=this.$getTop(t.start.row,r),a=this.$padding,f=this.session.$bidiHandler.getSelections(t.start.column,t.end.column);f.forEach(function(e){this.elt(n,"height:"+o+"px;"+"width:"+e.width+(i||0)+"px;"+"top:"+u+"px;"+"left:"+(a+e.left)+"px;"+(s||""))},this)},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),this.elt(n,"height:"+o+"px;"+"top:"+s+"px;"+"left:0;right:0;"+(i||""))},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;this.elt(n,"height:"+o+"px;"+"top:"+s+"px;"+"left:0;right:0;"+(i||""))}}).call(s.prototype),t.Marker=s}),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/layer/lines","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("./lines").Lines,u=e("../lib/event_emitter").EventEmitter,a=function(e){this.dom=i,this.element=this.dom.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this),this.$lines=new o(this.element)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.MAX_LINE_LENGTH=1e4,this.$updateEolChar=function(){var e=this.session.doc,t=e.getNewLineCharacter()=="\n"&&e.getNewLineMode()!="windows",n=t?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=n)return this.EOL_CHAR=n,!0},this.setPadding=function(e){this.$padding=e,this.element.style.margin="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;nl&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),l=a?a.start.row:Infinity);if(u>i)break;var c=s[o++];if(c){this.dom.removeChildren(c),this.$renderLine(c,u,u==l?a:!1),f&&(c.style.top=this.$lines.computeLineTop(u,e,this.session)+"px");var h=e.lineHeight*this.session.getRowLength(u)+"px";c.style.height!=h&&(f=!0,c.style.height=h)}u++}if(f)while(o0;i--)this.$lines.shift();if(t.lastRow>e.lastRow)for(var i=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);i>0;i--)this.$lines.pop();e.firstRowt.lastRow&&this.$lines.push(this.$renderLinesFragment(e,t.lastRow+1,e.lastRow))},this.$renderLinesFragment=function(e,t,n){var r=[],s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=this.$lines.createCell(s,e,this.session),f=a.element;this.dom.removeChildren(f),i.setStyle(f.style,"height",this.$lines.computeLineHeight(s,e,this.session)+"px"),i.setStyle(f.style,"top",this.$lines.computeLineTop(s,e,this.session)+"px"),this.$renderLine(f,s,s==u?o:!1),this.$useLineGroups()?f.className="ace_line_group":f.className="ace_line",r.push(a),s++}return r},this.update=function(e){this.$lines.moveContainer(e),this.config=e;var t=e.firstRow,n=e.lastRow,r=this.$lines;while(r.getLength())r.pop();r.push(this.$renderLinesFragment(e,t,n))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/(\t)|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\uFEFF\uFFF9-\uFFFC]+)|(\u3000)|([\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3001-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF])/g,u=this.dom.createFragment(this.element),a,f=0;while(a=o.exec(r)){var l=a[1],c=a[2],h=a[3],p=a[4],d=a[5];if(!i.showInvisibles&&c)continue;var v=f!=a.index?r.slice(f,a.index):"";f=a.index+a[0].length,v&&u.appendChild(this.dom.createTextNode(v,this.element));if(l){var m=i.session.getScreenTabSize(t+a.index);u.appendChild(i.$tabStrings[m].cloneNode(!0)),t+=m-1}else if(c)if(i.showInvisibles){var g=this.dom.createElement("span");g.className="ace_invisible ace_invisible_space",g.textContent=s.stringRepeat(i.SPACE_CHAR,c.length),u.appendChild(g)}else u.appendChild(this.com.createTextNode(c,this.element));else if(h){var g=this.dom.createElement("span");g.className="ace_invisible ace_invisible_space ace_invalid",g.textContent=s.stringRepeat(i.SPACE_CHAR,h.length),u.appendChild(g)}else if(p){t+=1;var g=this.dom.createElement("span");g.style.width=i.config.characterWidth*2+"px",g.className=i.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",g.textContent=i.showInvisibles?i.SPACE_CHAR:p,u.appendChild(g)}else if(d){t+=1;var g=this.dom.createElement("span");g.style.width=i.config.characterWidth*2+"px",g.className="ace_cjk",g.textContent=d,u.appendChild(g)}}u.appendChild(this.dom.createTextNode(f?r.slice(f):r,this.element));if(!this.$textToken[n.type]){var y="ace_"+n.type.replace(/\./g," ace_"),g=this.dom.createElement("span");n.type=="fold"&&(g.style.width=n.value.length*this.config.characterWidth+"px"),g.className=y,g.appendChild(u),e.appendChild(g)}else e.appendChild(u);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);if(r<=0||r>=n)return t;if(t[0]==" "){r-=r%this.tabSize;var i=r/this.tabSize;for(var s=0;s=o)u=this.$renderToken(a,u,l,c.substring(0,o-r)),c=c.substring(o-r),r=o,a=this.$createLineElement(),e.appendChild(a),a.appendChild(this.dom.createTextNode(s.stringRepeat("\u00a0",n.indent),this.element)),i++,u=0,o=n[i]||Number.MAX_VALUE;c.length!=0&&(r+=c.length,u=this.$renderToken(a,u,l,c))}}n[n.length-1]>this.MAX_LINE_LENGTH&&this.$renderOverflowMessage(a,u,null,"",!0)},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;sthis.MAX_LINE_LENGTH)return this.$renderOverflowMessage(e,n,r,i);n=this.$renderToken(e,n,r,i)}},this.$renderOverflowMessage=function(e,t,n,r,i){n&&this.$renderToken(e,t,n,r.slice(0,this.MAX_LINE_LENGTH-t));var s=this.dom.createElement("span");s.className="ace_inline_button ace_keyword ace_toggle_wrap",s.textContent=i?"":"",e.appendChild(s)},this.$renderLine=function(e,t,n){!n&&n!=0&&(n=this.session.getFoldLine(t));if(n)var r=this.$getFoldLineTokens(t,n);else var r=this.session.getTokens(t);var i=e;if(r.length){var s=this.session.getRowSplitData(t);if(s&&s.length){this.$renderWrappedLine(e,r,s);var i=e.lastChild}else{var i=e;this.$useLineGroups()&&(i=this.$createLineElement(),e.appendChild(i)),this.$renderSimpleLine(i,r)}}else this.$useLineGroups()&&(i=this.$createLineElement(),e.appendChild(i));if(this.showInvisibles&&i){n&&(t=n.end.row);var o=this.dom.createElement("span");o.className="ace_invisible ace_invisible_eol",o.textContent=t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,i.appendChild(o)}},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=this.$updateOpacity.bind(this)};(function(){this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)r.setStyle(t[n].style,"opacity",e?"":"0")},this.$startCssAnimation=function(){var e=this.cursors;for(var t=e.length;t--;)e[t].style.animationDuration=this.blinkInterval+"ms";setTimeout(function(){r.addCssClass(this.element,"ace_animate-blinking")}.bind(this))},this.$stopCssAnimation=function(){r.removeCssClass(this.element,"ace_animate-blinking")},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.$stopCssAnimation(),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible){this.$stopCssAnimation();return}this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));if(r.HAS_CSS_ANIMATION)this.$startCssAnimation();else{var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()}},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+(this.session.$bidiHandler.isBidiRow(n.row,e.row)?this.session.$bidiHandler.getPosLeft(n.column):n.column*this.config.characterWidth),i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.isCursorInView=function(e,t){return e.top>=0&&e.tope.height+e.offset||o.top<0)&&n>1)continue;var u=this.cursors[i++]||this.addCursor(),a=u.style;this.drawCursor?this.drawCursor(u,o,e,t[n],this.session):this.isCursorInView(o,e)?(r.setStyle(a,"display","block"),r.translate(u,o.left,o.top),r.setStyle(a,"width",Math.round(e.characterWidth)+"px"),r.setStyle(a,"height",e.lineHeight+"px")):r.setStyle(a,"display","none")}while(this.cursors.length>i)this.removeCursor();var f=this.session.getOverwrite();this.$setOverwrite(f),this.$pixelPos=o,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(i.prototype),t.Cursor=i}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=32768,a=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.inner.textContent="\u00a0",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(a.prototype);var f=function(e,t){a.call(this,e),this.scrollTop=0,this.scrollHeight=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px",this.$minWidth=0};r.inherits(f,a),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){this.scrollTop=this.element.scrollTop;if(this.coeff!=1){var e=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-e)/(this.coeff-e)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return Math.max(this.isVisible?this.width:0,this.$minWidth||0)},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=this.setScrollHeight=function(e){this.scrollHeight=e,e>u?(this.coeff=u/e,e=u):this.coeff!=1&&(this.coeff=1),this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=e,this.element.scrollTop=e*this.coeff)}}.call(f.prototype);var l=function(e,t){a.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(l,a),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(l.prototype),t.ScrollBar=f,t.ScrollBarV=f,t.ScrollBarH=l,t.VScrollBar=f,t.HScrollBar=l}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.$recursionLimit=2,this.window=t||window;var n=this;this._flush=function(e){n.pending=!1;var t=n.changes;t&&(r.blockIdle(100),n.changes=0,n.onRender(t));if(n.changes){if(n.$recursionLimit--<0)return;n.schedule()}else n.$recursionLimit=2}};(function(){this.schedule=function(e){this.changes=this.changes|e,this.changes&&!this.pending&&(r.nextFrame(this._flush),this.pending=!0)},this.clear=function(e){var t=this.changes;return this.changes=0,t}}).call(i.prototype),t.RenderLoop=i}),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/event"),u=e("../lib/useragent"),a=e("../lib/event_emitter").EventEmitter,f=256,l=typeof ResizeObserver=="function",c=200,h=t.FontMetrics=function(e){this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),this.$measureNode.innerHTML=s.stringRepeat("X",f),this.$characterSize={width:0,height:0},l?this.$addObserver():this.checkForSizeChanges()};(function(){r.implement(this,a),this.$characterSize={width:0,height:0},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",u.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(e){e===undefined&&(e=this.$measureSizes());if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$addObserver=function(){var e=this;this.$observer=new window.ResizeObserver(function(t){var n=t[0].contentRect;e.checkForSizeChanges({height:n.height,width:n.width/f})}),this.$observer.observe(this.$measureNode)},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer||this.$observer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=o.onIdle(function t(){e.checkForSizeChanges(),o.onIdle(t,500)},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(e){var t={height:(e||this.$measureNode).clientHeight,width:(e||this.$measureNode).clientWidth/f};return t.width===0||t.height===0?null:t},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,f);var t=this.$main.getBoundingClientRect();return t.width/f},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$observer&&this.$observer.disconnect(),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)},this.$getZoom=function e(t){return t?(window.getComputedStyle(t).zoom||1)*e(t.parentElement):1},this.$initTransformMeasureNodes=function(){var e=function(e,t){return["div",{style:"position: absolute;top:"+e+"px;left:"+t+"px;"}]};this.els=i.buildDom([e(0,0),e(c,0),e(0,c),e(c,c)],this.el)},this.transformCoordinates=function(e,t){function r(e,t,n){var r=e[1]*t[0]-e[0]*t[1];return[(-t[1]*n[0]+t[0]*n[1])/r,(+e[1]*n[0]-e[0]*n[1])/r]}function i(e,t){return[e[0]-t[0],e[1]-t[1]]}function s(e,t){return[e[0]+t[0],e[1]+t[1]]}function o(e,t){return[e*t[0],e*t[1]]}function u(e){var t=e.getBoundingClientRect();return[t.left,t.top]}if(e){var n=this.$getZoom(this.el);e=o(1/n,e)}this.els||this.$initTransformMeasureNodes();var a=u(this.els[0]),f=u(this.els[1]),l=u(this.els[2]),h=u(this.els[3]),p=r(i(h,f),i(h,l),i(s(f,l),s(h,a))),d=o(1+p[0],i(f,a)),v=o(1+p[1],i(l,a));if(t){var m=t,g=p[0]*m[0]/c+p[1]*m[1]/c+1,y=s(o(m[0],d),o(m[1],v));return s(o(1/g/c,y),a)}var b=i(e,a),w=r(i(d,o(p[0],b)),i(v,o(p[1],b)),b);return o(c,w)}}).call(h.prototype)}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./layer/gutter").Gutter,u=e("./layer/marker").Marker,a=e("./layer/text").Text,f=e("./layer/cursor").Cursor,l=e("./scrollbar").HScrollBar,c=e("./scrollbar").VScrollBar,h=e("./renderloop").RenderLoop,p=e("./layer/font_metrics").FontMetrics,d=e("./lib/event_emitter").EventEmitter,v='.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;text-align: left;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;box-sizing: border-box;min-width: 100%;contain: style size layout;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;contain: style size layout;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {position: absolute;top: 0;left: 0;right: 0;padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {contain: strict;position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;contain: strict;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: transparent;color: inherit;z-index: 1000;opacity: 1;}.ace_composition_placeholder { color: transparent }.ace_composition_marker { border-bottom: 1px solid;position: absolute;border-radius: 0;margin-top: 1px;}[ace_nocontext=true] {transform: none!important;filter: none!important;perspective: none!important;clip-path: none!important;mask : none!important;contain: none!important;perspective: none!important;mix-blend-mode: initial!important;z-index: auto;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;height: 1000000px;contain: style size layout;}.ace_text-layer {font: inherit !important;position: absolute;height: 1000000px;width: 1000000px;contain: style size layout;}.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {contain: style size layout;position: absolute;top: 0;left: 0;right: 0;}.ace_hidpi .ace_text-layer,.ace_hidpi .ace_gutter-layer,.ace_hidpi .ace_content,.ace_hidpi .ace_gutter {contain: strict;will-change: transform;}.ace_hidpi .ace_text-layer > .ace_line, .ace_hidpi .ace_text-layer > .ace_line_group {contain: strict;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {transition: opacity 0.18s;}.ace_animate-blinking .ace_cursor {animation-duration: 1000ms;animation-timing-function: step-end;animation-name: blink-ace-animate;animation-iteration-count: infinite;}.ace_animate-blinking.ace_smooth-blinking .ace_cursor {animation-duration: 1000ms;animation-timing-function: ease-in-out;animation-name: blink-ace-animate-smooth;}@keyframes blink-ace-animate {from, to { opacity: 1; }60% { opacity: 0; }}@keyframes blink-ace-animate-smooth {from, to { opacity: 1; }45% { opacity: 1; }60% { opacity: 0; }85% { opacity: 0; }}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;box-sizing: border-box;}.ace_line .ace_fold {box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_inline_button {border: 1px solid lightgray;display: inline-block;margin: -1px 8px;padding: 0 5px;pointer-events: auto;cursor: pointer;}.ace_inline_button:hover {border-color: gray;background: rgba(200,200,200,0.2);display: inline-block;pointer-events: auto;}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_mobile-menu {position: absolute;line-height: 1.5;border-radius: 4px;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;background: white;box-shadow: 1px 3px 2px grey;border: 1px solid #dcdcdc;color: black;}.ace_dark > .ace_mobile-menu {background: #333;color: #ccc;box-shadow: 1px 3px 2px grey;border: 1px solid #444;}.ace_mobile-button {padding: 2px;cursor: pointer;overflow: hidden;}.ace_mobile-button:hover {background-color: #eee;opacity:1;}.ace_mobile-button:active {background-color: #ddd;}',m=e("./lib/useragent"),g=m.isIE;i.importCssString(v,"ace_editor.css");var y=function(e,t){var n=this;this.container=e||i.createElement("div"),i.addCssClass(this.container,"ace_editor"),i.HI_DPI&&i.addCssClass(this.container,"ace_hidpi"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.$gutter.setAttribute("aria-hidden",!0),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new o(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new u(this.content);var r=this.$textLayer=new a(this.content);this.canvas=r.element,this.$markerFront=new u(this.content),this.$cursorLayer=new f(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new c(this.container,this),this.scrollBarH=new l(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new p(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.margin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$keepTextAreaAtCursor=!m.isIOS,this.$loop=new h(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._signal("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,d),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin(),i.setStyle(this.scroller.style,"line-height",this.lineHeight+"px")},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarH.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar(),this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR)},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var s=0,o=this.$size,u={width:o.width,height:o.height,scrollerHeight:o.scrollerHeight,scrollerWidth:o.scrollerWidth};r&&(e||o.height!=r)&&(o.height=r,s|=this.CHANGE_SIZE,o.scrollerHeight=o.height,this.$horizScroll&&(o.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",s|=this.CHANGE_SCROLL);if(n&&(e||o.width!=n)){s|=this.CHANGE_SIZE,o.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,i.setStyle(this.scrollBarH.element.style,"left",t+"px"),i.setStyle(this.scroller.style,"left",t+this.margin.left+"px"),o.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()-this.margin.h),i.setStyle(this.$gutter.style,"left",this.margin.left+"px");var a=this.scrollBarV.getWidth()+"px";i.setStyle(this.scrollBarH.element.style,"right",a),i.setStyle(this.scroller.style,"right",a),i.setStyle(this.scroller.style,"bottom",this.scrollBarH.getHeight());if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)s|=this.CHANGE_FULL}return o.$dirty=!n||!r,s&&this._signal("resize",u),s},this.onGutterResize=function(e){var t=this.$showGutter?e:0;t!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,t,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):this.$computeLayerConfig()},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e),this.session.$bidiHandler.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=Math.round(this.characterWidth*this.$printMarginColumn+this.$padding)+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(this.$isMousePressed)return;var e=this.textarea.style,t=this.$composition;if(!this.$keepTextAreaAtCursor&&!t){i.translate(this.textarea,-100,0);return}var n=this.$cursorLayer.$pixelPos;if(!n)return;t&&t.markerRange&&(n=this.$cursorLayer.getPixelPosition(t.markerRange.start,!0));var r=this.layerConfig,s=n.top,o=n.left;s-=r.offset;var u=t&&t.useTextareaForIME?this.lineHeight:g?0:1;if(s<0||s>r.height-u){i.translate(this.textarea,0,0);return}var a=1,f=this.$size.height-u;if(!t)s+=this.lineHeight;else if(t.useTextareaForIME){var l=this.textarea.value;a=this.characterWidth*this.session.$getStringScreenWidth(l)[0],u+=2}else s+=this.lineHeight+2;o-=this.scrollLeft,o>this.$size.scrollerWidth-a&&(o=this.$size.scrollerWidth-a),o+=this.gutterWidth+this.margin.left,i.setStyle(e,"height",u+"px"),i.setStyle(e,"width",a+"px"),i.translate(this.textarea,Math.min(o,this.$size.scrollerWidth-a),Math.min(s,f))},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.setMargin=function(e,t,n,r){var i=this.margin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,this.$updateCachedSize(!0,this.gutterWidth,this.$size.width,this.$size.height),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender"),this.session&&this.session.$bidiHandler&&this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig()|this.$loop.clear();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig()|this.$loop.clear())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),i.translate(this.content,-this.scrollLeft,-n.offset);var s=n.width+2*this.$padding+"px",o=n.minHeight+"px";i.setStyle(this.content.style,"width",s),i.setStyle(this.content.style,"height",o)}e&this.CHANGE_H_SCROLL&&(i.translate(this.content,-this.scrollLeft,-n.offset),this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$changedLines=null,this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){this.$changedLines=null,e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&(e&this.CHANGE_GUTTER||e&this.CHANGE_LINES?this.$gutterLayer.update(n):this.$gutterLayer.scrollLines(n)),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$changedLines=null,this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER?this.$showGutter&&this.$gutterLayer.update(n):e&this.CHANGE_CURSOR&&this.$highlightGutterLine&&this.$gutterLayer.updateLineHighlight(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var r=n<=2*this.lineHeight,i=!r&&e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||i!=this.$vScroll){i!=this.$vScroll&&(this.$vScroll=i,this.scrollBarV.setVisible(i));var s=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,s,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=t.scrollerHeight+this.lineHeight,l=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=l;var c=this.scrollMargin;this.session.setScrollTop(Math.max(-c.top,Math.min(this.scrollTop,i-t.scrollerHeight+c.bottom))),this.session.setScrollLeft(Math.max(-c.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+c.right)));var h=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+l<0||this.scrollTop>c.top),p=a!==h;p&&(this.$vScroll=h,this.scrollBarV.setVisible(h));var d=this.scrollTop%this.lineHeight,v=Math.ceil(f/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-d)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),f=t.scrollerHeight+e.getRowLength(g)*w+b,d=this.scrollTop-y*w;var S=0;if(this.layerConfig.width!=s||u)S=this.CHANGE_H_SCROLL;if(u||p)S|=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),p&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:f,maxHeight:i,offset:d,gutterOffset:w?Math.max(0,Math.ceil((d+t.height-t.scrollerHeight)/w)):0,height:this.$size.scrollerHeight},this.session.$bidiHandler&&this.session.$bidiHandler.setContentWidth(s-this.$padding),S},this.$updateLines=function(){if(!this.$changedLines)return;var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(tthis.$textLayer.MAX_LINE_LENGTH&&(e=this.$textLayer.MAX_LINE_LENGTH+30),Math.max(this.$size.scrollerWidth-2*this.$padding,Math.round(e*this.characterWidth))},this.updateFrontMarkers=function(){this.$markerFront.setMarkers(this.session.getMarkers(!0)),this.$loop.schedule(this.CHANGE_MARKER_FRONT)},this.updateBackMarkers=function(){this.$markerBack.setMarkers(this.session.getMarkers()),this.$loop.schedule(this.CHANGE_MARKER_BACK)},this.addGutterDecoration=function(e,t){this.$gutterLayer.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){this.$gutterLayer.removeGutterDecoration(e,t)},this.updateBreakpoints=function(e){this.$loop.schedule(this.CHANGE_GUTTER)},this.setAnnotations=function(e){this.$gutterLayer.setAnnotations(e),this.$loop.schedule(this.CHANGE_GUTTER)},this.updateCursor=function(){this.$loop.schedule(this.CHANGE_CURSOR)},this.hideCursor=function(){this.$cursorLayer.hideCursor()},this.showCursor=function(){this.$cursorLayer.showCursor()},this.scrollSelectionIntoView=function(e,t,n){this.scrollCursorIntoView(e,n),this.scrollCursorIntoView(t,n)},this.scrollCursorIntoView=function(e,t,n){if(this.$size.scrollerHeight===0)return;var r=this.$cursorLayer.getPixelPosition(e),i=r.left,s=r.top,o=n&&n.top||0,u=n&&n.bottom||0,a=this.$scrollAnimation?this.session.getScrollTop():this.scrollTop;a+o>s?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-ui?(i=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n;if(this.$hasCssTransforms){n={top:0,left:0};var r=this.$fontMetrics.transformCoordinates([e,t]);e=r[1]-this.gutterWidth-this.margin.left,t=r[0]}else n=this.scroller.getBoundingClientRect();var i=e+this.scrollLeft-n.left-this.$padding,s=i/this.characterWidth,o=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),u=this.$blockCursor?Math.floor(s):Math.round(s);return{row:o,column:u,side:s-u>0?1:-1,offsetX:i}},this.screenToTextCoordinates=function(e,t){var n;if(this.$hasCssTransforms){n={top:0,left:0};var r=this.$fontMetrics.transformCoordinates([e,t]);e=r[1]-this.gutterWidth-this.margin.left,t=r[0]}else n=this.scroller.getBoundingClientRect();var i=e+this.scrollLeft-n.left-this.$padding,s=i/this.characterWidth,o=this.$blockCursor?Math.floor(s):Math.round(s),u=Math.floor((t+this.scrollTop-n.top)/this.lineHeight);return this.session.screenToDocumentPosition(u,Math.max(o,0),i)},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+(this.session.$bidiHandler.isBidiRow(r.row,e)?this.session.$bidiHandler.getPosLeft(r.column):Math.round(r.column*this.characterWidth)),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition=e,e.cssText||(e.cssText=this.textarea.style.cssText),e.useTextareaForIME=this.$useTextareaForIME,this.$useTextareaForIME?(i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor(),this.$cursorLayer.element.style.display="none"):e.markerId=this.session.addMarker(e.markerRange,"ace_composition_marker","text")},this.setCompositionText=function(e){var t=this.session.selection.cursor;this.addToken(e,"composition_placeholder",t.row,t.column),this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;this.$composition.markerId&&this.session.removeMarker(this.$composition.markerId),i.removeCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText=this.$composition.cssText,this.$composition=null,this.$cursorLayer.element.style.display=""},this.addToken=function(e,t,n,r){var i=this.session;i.bgTokenizer.lines[n]=null;var s={type:t,value:e},o=i.getTokens(n);if(r==null)o.push(s);else{var u=0;for(var a=0;a50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})}}).call(f.prototype);var l=function(e,t,n){var r=null,i=!1,u=Object.create(s),a=[],l=new f({messageBuffer:a,terminate:function(){},postMessage:function(e){a.push(e);if(!r)return;i?setTimeout(c):c()}});l.setEmitSync=function(e){i=e};var c=function(){var e=a.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};return u.postMessage=function(e){l.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.length)c()}),l};t.UIWorkerClient=l,t.WorkerClient=f,t.createWorker=a}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length&&this.$onRemoveRange(e)},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.cursor),s=this.session.documentToScreenPosition(this.anchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)g--;if(g>0){var y=0;while(r[y].isEmpty())y++}for(var b=g;b>=y;b--)r[b].isEmpty()&&r.splice(b,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges(),u.ranges[0]&&u.fromOrientedRange(u.ranges[0]);var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var p=e.getLine(l).length;return new r(f,u,l,p)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}',t.$id="ace/theme/textmate";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./range").Range;(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action=="add";for(var u=i+1;u0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(o.prototype),t.LineWidgets=o}),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
"),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/range","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./range").Range,o=e("./editor").Editor,u=e("./edit_session").EditSession,a=e("./undomanager").UndoManager,f=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.require=e,typeof define=="function"&&(t.define=define),t.edit=function(e,n){if(typeof e=="string"){var s=e;e=document.getElementById(s);if(!e)throw new Error("ace.edit can't find div #"+s)}if(e&&e.env&&e.env.editor instanceof o)return e.env.editor;var u="";if(e&&/input|textarea/i.test(e.tagName)){var a=e;u=a.value,e=r.createElement("pre"),a.parentNode.replaceChild(e,a)}else e&&(u=e.textContent,e.innerHTML="");var l=t.createEditSession(u),c=new o(new f(e),l,n),h={document:l,editor:c,onResize:c.resize.bind(c,null)};return a&&(h.textarea=a),i.addListener(window,"resize",h.onResize),c.on("destroy",function(){i.removeListener(window,"resize",h.onResize),h.editor.container.env=null}),c.container.env=c.env=h,c},t.createEditSession=function(e,t){var n=new u(e,t);return n.setUndoManager(new a),n},t.Range=s,t.Editor=o,t.EditSession=u,t.UndoManager=a,t.VirtualRenderer=f,t.version=t.config.version}); (function() { - ace.require(["ace/ace"], function(a) { - if (a) { - a.config.init(true); - a.define = ace.define; - } - if (!window.ace) - window.ace = a; - for (var key in a) if (a.hasOwnProperty(key)) - window.ace[key] = a[key]; - window.ace["default"] = window.ace; - if (typeof module == "object" && typeof exports == "object" && module) { - module.exports = window.ace; - } - }); - })(); - \ No newline at end of file diff --git a/pkg/ui/v1alpha3/frontend/public/scripts/bootstrap.min.js b/pkg/ui/v1alpha3/frontend/public/scripts/bootstrap.min.js deleted file mode 100644 index 534d533433a..00000000000 --- a/pkg/ui/v1alpha3/frontend/public/scripts/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.0.0 (https://getbootstrap.com) - * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,n){"use strict";function i(t,e){for(var n=0;n0?i:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(n){t(n).trigger(e.end)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var s in n)if(Object.prototype.hasOwnProperty.call(n,s)){var r=n[s],o=e[s],a=o&&i.isElement(o)?"element":(l=o,{}.toString.call(l).match(/\s([a-zA-Z]+)/)[1].toLowerCase());if(!new RegExp(r).test(a))throw new Error(t.toUpperCase()+': Option "'+s+'" provided type "'+a+'" but expected type "'+r+'".')}var l}};return e=("undefined"==typeof window||!window.QUnit)&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,i.supportsTransitionEnd()&&(t.event.special[i.TRANSITION_END]={bindType:e.end,delegateType:e.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),i}(e),L=(a="alert",h="."+(l="bs.alert"),c=(o=e).fn[a],u={CLOSE:"close"+h,CLOSED:"closed"+h,CLICK_DATA_API:"click"+h+".data-api"},f="alert",d="fade",_="show",g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.removeData(this._element,l),this._element=null},e._getRootElement=function(t){var e=P.getSelectorFromElement(t),n=!1;return e&&(n=o(e)[0]),n||(n=o(t).closest("."+f)[0]),n},e._triggerCloseEvent=function(t){var e=o.Event(u.CLOSE);return o(t).trigger(e),e},e._removeElement=function(t){var e=this;o(t).removeClass(_),P.supportsTransitionEnd()&&o(t).hasClass(d)?o(t).one(P.TRANSITION_END,function(n){return e._destroyElement(t,n)}).emulateTransitionEnd(150):this._destroyElement(t)},e._destroyElement=function(t){o(t).detach().trigger(u.CLOSED).remove()},t._jQueryInterface=function(e){return this.each(function(){var n=o(this),i=n.data(l);i||(i=new t(this),n.data(l,i)),"close"===e&&i[e](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),o(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),o.fn[a]=g._jQueryInterface,o.fn[a].Constructor=g,o.fn[a].noConflict=function(){return o.fn[a]=c,g._jQueryInterface},g),R=(m="button",E="."+(v="bs.button"),T=".data-api",y=(p=e).fn[m],C="active",I="btn",A="focus",b='[data-toggle^="button"]',D='[data-toggle="buttons"]',S="input",w=".active",N=".btn",O={CLICK_DATA_API:"click"+E+T,FOCUS_BLUR_DATA_API:"focus"+E+T+" blur"+E+T},k=function(){function t(t){this._element=t}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=p(this._element).find(S)[0];if(i){if("radio"===i.type)if(i.checked&&p(this._element).hasClass(C))t=!1;else{var s=p(n).find(w)[0];s&&p(s).removeClass(C)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!p(this._element).hasClass(C),p(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!p(this._element).hasClass(C)),t&&p(this._element).toggleClass(C)},e.dispose=function(){p.removeData(this._element,v),this._element=null},t._jQueryInterface=function(e){return this.each(function(){var n=p(this).data(v);n||(n=new t(this),p(this).data(v,n)),"toggle"===e&&n[e]()})},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),p(document).on(O.CLICK_DATA_API,b,function(t){t.preventDefault();var e=t.target;p(e).hasClass(I)||(e=p(e).closest(N)),k._jQueryInterface.call(p(e),"toggle")}).on(O.FOCUS_BLUR_DATA_API,b,function(t){var e=p(t.target).closest(N)[0];p(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),p.fn[m]=k._jQueryInterface,p.fn[m].Constructor=k,p.fn[m].noConflict=function(){return p.fn[m]=y,k._jQueryInterface},k),j=function(t){var e="carousel",n="bs.carousel",i="."+n,o=t.fn[e],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h="next",c="prev",u="left",f="right",d={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load"+i+".data-api",CLICK_DATA_API:"click"+i+".data-api"},_="carousel",g="active",p="slide",m="carousel-item-right",v="carousel-item-left",E="carousel-item-next",T="carousel-item-prev",y={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},C=function(){function o(e,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(y.INDICATORS)[0],this._addEventListeners()}var C=o.prototype;return C.next=function(){this._isSliding||this._slide(h)},C.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},C.prev=function(){this._isSliding||this._slide(c)},C.pause=function(e){e||(this._isPaused=!0),t(this._element).find(y.NEXT_PREV)[0]&&P.supportsTransitionEnd()&&(P.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},C.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},C.to=function(e){var n=this;this._activeElement=t(this._element).find(y.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var s=e>i?h:c;this._slide(s,this._items[e])}},C.dispose=function(){t(this._element).off(i),t.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},C._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},C._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},C._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},C._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(y.ITEM)),this._items.indexOf(e)},C._getItemByDirection=function(t,e){var n=t===h,i=t===c,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===c?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},C._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),s=this._getItemIndex(t(this._element).find(y.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:s,to:i});return t(this._element).trigger(r),r},C._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(y.ACTIVE).removeClass(g);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(g)}},C._slide=function(e,n){var i,s,r,o=this,a=t(this._element).find(y.ACTIVE_ITEM)[0],l=this._getItemIndex(a),c=n||a&&this._getItemByDirection(e,a),_=this._getItemIndex(c),C=Boolean(this._interval);if(e===h?(i=v,s=E,r=u):(i=m,s=T,r=f),c&&t(c).hasClass(g))this._isSliding=!1;else if(!this._triggerSlideEvent(c,r).isDefaultPrevented()&&a&&c){this._isSliding=!0,C&&this.pause(),this._setActiveIndicatorElement(c);var I=t.Event(d.SLID,{relatedTarget:c,direction:r,from:l,to:_});P.supportsTransitionEnd()&&t(this._element).hasClass(p)?(t(c).addClass(s),P.reflow(c),t(a).addClass(i),t(c).addClass(i),t(a).one(P.TRANSITION_END,function(){t(c).removeClass(i+" "+s).addClass(g),t(a).removeClass(g+" "+s+" "+i),o._isSliding=!1,setTimeout(function(){return t(o._element).trigger(I)},0)}).emulateTransitionEnd(600)):(t(a).removeClass(g),t(c).addClass(g),this._isSliding=!1,t(this._element).trigger(I)),C&&this.cycle()}},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s=r({},a,t(this).data());"object"==typeof e&&(s=r({},s,e));var l="string"==typeof e?e:s.slide;if(i||(i=new o(this,s),t(this).data(n,i)),"number"==typeof e)i.to(e);else if("string"==typeof l){if("undefined"==typeof i[l])throw new TypeError('No method named "'+l+'"');i[l]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(e){var i=P.getSelectorFromElement(this);if(i){var s=t(i)[0];if(s&&t(s).hasClass(_)){var a=r({},t(s).data(),t(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(t(s),a),l&&t(s).data(n).to(l),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(d.CLICK_DATA_API,y.DATA_SLIDE,C._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(y.DATA_RIDE).each(function(){var e=t(this);C._jQueryInterface.call(e,e.data())})}),t.fn[e]=C._jQueryInterface,t.fn[e].Constructor=C,t.fn[e].noConflict=function(){return t.fn[e]=o,C._jQueryInterface},C}(e),H=function(t){var e="collapse",n="bs.collapse",i="."+n,o=t.fn[e],a={toggle:!0,parent:""},l={toggle:"boolean",parent:"(string|element)"},h={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+".data-api"},c="show",u="collapse",f="collapsing",d="collapsed",_="width",g="height",p={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},m=function(){function i(e,n){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(n),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var i=t(p.DATA_TOGGLE),s=0;s0&&(this._selector=o,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var o=i.prototype;return o.toggle=function(){t(this._element).hasClass(c)?this.hide():this.show()},o.show=function(){var e,s,r=this;if(!this._isTransitioning&&!t(this._element).hasClass(c)&&(this._parent&&0===(e=t.makeArray(t(this._parent).find(p.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(e=null),!(e&&(s=t(e).not(this._selector).data(n))&&s._isTransitioning))){var o=t.Event(h.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){e&&(i._jQueryInterface.call(t(e).not(this._selector),"hide"),s||t(e).data(n,null));var a=this._getDimension();t(this._element).removeClass(u).addClass(f),this._element.style[a]=0,this._triggerArray.length>0&&t(this._triggerArray).removeClass(d).attr("aria-expanded",!0),this.setTransitioning(!0);var l=function(){t(r._element).removeClass(f).addClass(u).addClass(c),r._element.style[a]="",r.setTransitioning(!1),t(r._element).trigger(h.SHOWN)};if(P.supportsTransitionEnd()){var _="scroll"+(a[0].toUpperCase()+a.slice(1));t(this._element).one(P.TRANSITION_END,l).emulateTransitionEnd(600),this._element.style[a]=this._element[_]+"px"}else l()}}},o.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(c)){var n=t.Event(h.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",P.reflow(this._element),t(this._element).addClass(f).removeClass(u).removeClass(c),this._triggerArray.length>0)for(var s=0;s0&&t(n).toggleClass(d,!i).attr("aria-expanded",i)}},i._getTargetFromElement=function(e){var n=P.getSelectorFromElement(e);return n?t(n)[0]:null},i._jQueryInterface=function(e){return this.each(function(){var s=t(this),o=s.data(n),l=r({},a,s.data(),"object"==typeof e&&e);if(!o&&l.toggle&&/show|hide/.test(e)&&(l.toggle=!1),o||(o=new i(this,l),s.data(n,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),i}();return t(document).on(h.CLICK_DATA_API,p.DATA_TOGGLE,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var i=t(this),s=P.getSelectorFromElement(this);t(s).each(function(){var e=t(this),s=e.data(n)?"toggle":i.data();m._jQueryInterface.call(e,s)})}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),W=function(t){var e="dropdown",i="bs.dropdown",o="."+i,a=".data-api",l=t.fn[e],h=new RegExp("38|40|27"),c={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,CLICK:"click"+o,CLICK_DATA_API:"click"+o+a,KEYDOWN_DATA_API:"keydown"+o+a,KEYUP_DATA_API:"keyup"+o+a},u="disabled",f="show",d="dropup",_="dropright",g="dropleft",p="dropdown-menu-right",m="dropdown-menu-left",v="position-static",E='[data-toggle="dropdown"]',T=".dropdown form",y=".dropdown-menu",C=".navbar-nav",I=".dropdown-menu .dropdown-item:not(.disabled)",A="top-start",b="top-end",D="bottom-start",S="bottom-end",w="right-start",N="left-start",O={offset:0,flip:!0,boundary:"scrollParent"},k={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)"},L=function(){function a(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var l=a.prototype;return l.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(u)){var e=a._getParentFromElement(this._element),i=t(this._menu).hasClass(f);if(a._clearMenus(),!i){var s={relatedTarget:this._element},r=t.Event(c.SHOW,s);if(t(e).trigger(r),!r.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof n)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var o=this._element;t(e).hasClass(d)&&(t(this._menu).hasClass(m)||t(this._menu).hasClass(p))&&(o=e),"scrollParent"!==this._config.boundary&&t(e).addClass(v),this._popper=new n(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===t(e).closest(C).length&&t("body").children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(f),t(e).toggleClass(f).trigger(t.Event(c.SHOWN,s))}}}},l.dispose=function(){t.removeData(this._element,i),t(this._element).off(o),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},l.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},l._addEventListeners=function(){var e=this;t(this._element).on(c.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},l._getConfig=function(n){return n=r({},this.constructor.Default,t(this._element).data(),n),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},l._getMenuElement=function(){if(!this._menu){var e=a._getParentFromElement(this._element);this._menu=t(e).find(y)[0]}return this._menu},l._getPlacement=function(){var e=t(this._element).parent(),n=D;return e.hasClass(d)?(n=A,t(this._menu).hasClass(p)&&(n=b)):e.hasClass(_)?n=w:e.hasClass(g)?n=N:t(this._menu).hasClass(p)&&(n=S),n},l._detectNavbar=function(){return t(this._element).closest(".navbar").length>0},l._getPopperConfig=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset,{placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i);if(n||(n=new a(this,"object"==typeof e?e:null),t(this).data(i,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},a._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(E)),s=0;s0&&r--,40===e.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},p._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},p._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right

',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},f="show",d="out",_={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,INSERTED:"inserted"+o,CLICK:"click"+o,FOCUSIN:"focusin"+o,FOCUSOUT:"focusout"+o,MOUSEENTER:"mouseenter"+o,MOUSELEAVE:"mouseleave"+o},g="fade",p="show",m=".tooltip-inner",v=".arrow",E="hover",T="focus",y="click",C="manual",I=function(){function a(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var I=a.prototype;return I.enable=function(){this._isEnabled=!0},I.disable=function(){this._isEnabled=!1},I.toggleEnabled=function(){this._isEnabled=!this._isEnabled},I.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p))return void this._leave(null,this);this._enter(null,this)}},I.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},I.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var s=t.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),o=P.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&t(r).addClass(g);var l="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:v},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(p),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d&&e._leave(null,e)};P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(this.tip).one(P.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},I.hide=function(e){var n=this,i=this.getTipElement(),s=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==f&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(s),s.isDefaultPrevented()||(t(i).removeClass(p),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[y]=!1,this._activeTrigger[T]=!1,this._activeTrigger[E]=!1,P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(i).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},I.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},I.isWithContent=function(){return Boolean(this.getTitle())},I.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},I.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},I.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(m),this.getTitle()),e.removeClass(g+" "+p)},I.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},I.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},I._getAttachment=function(t){return c[t.toUpperCase()]},I._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==C){var i=n===E?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,s=n===E?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(s,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},I._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},I._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T:E]=!0),t(n.getTipElement()).hasClass(p)||n._hoverState===f?n._hoverState=f:(clearTimeout(n._timeout),n._hoverState=f,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===f&&n.show()},n.config.delay.show):n.show())},I._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T:E]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d&&n.hide()},n.config.delay.hide):n.hide())},I._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},I._getConfig=function(n){return"number"==typeof(n=r({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},I._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},I._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},I._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},I._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(g),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i),s="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,s),t(this).data(i,n)),"string"==typeof e)){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return i}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return o}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=a,I._jQueryInterface},I}(e),x=function(t){var e="popover",n="bs.popover",i="."+n,o=t.fn[e],a=new RegExp("(^|\\s)bs-popover\\S+","g"),l=r({},U.Default,{placement:"right",trigger:"click",content:"",template:''}),h=r({},U.DefaultType,{content:"(string|element|function)"}),c="fade",u="show",f=".popover-header",d=".popover-body",_={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},g=function(r){var o,g;function p(){return r.apply(this,arguments)||this}g=r,(o=p).prototype=Object.create(g.prototype),o.prototype.constructor=o,o.__proto__=g;var m=p.prototype;return m.isWithContent=function(){return this.getTitle()||this._getContent()},m.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-popover-"+e)},m.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},m.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(f),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(d),n),e.removeClass(c+" "+u)},m._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},m._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(a);null!==n&&n.length>0&&e.removeClass(n.join(""))},p._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s="object"==typeof e?e:null;if((i||!/destroy|hide/.test(e))&&(i||(i=new p(this,s),t(this).data(n,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(p,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return l}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return n}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return h}}]),p}(U);return t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),K=function(t){var e="scrollspy",n="bs.scrollspy",i="."+n,o=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+".data-api"},c="dropdown-item",u="active",f={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d="offset",_="position",g=function(){function o(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+f.NAV_LINKS+","+this._config.target+" "+f.LIST_ITEMS+","+this._config.target+" "+f.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var g=o.prototype;return g.refresh=function(){var e=this,n=this._scrollElement===this._scrollElement.window?d:_,i="auto"===this._config.method?n:this._config.method,s=i===_?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n,r=P.getSelectorFromElement(e);if(r&&(n=t(r)[0]),n){var o=n.getBoundingClientRect();if(o.width||o.height)return[t(n)[i]().top+s,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},g.dispose=function(){t.removeData(this._element,n),t(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},g._getConfig=function(n){if("string"!=typeof(n=r({},a,n)).target){var i=t(n.target).attr("id");i||(i=P.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return P.typeCheckConfig(e,n,l),n},g._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},g._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},g._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},g._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;){this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=P,t.Alert=L,t.Button=R,t.Carousel=j,t.Collapse=H,t.Dropdown=W,t.Modal=M,t.Popover=x,t.Scrollspy=K,t.Tab=V,t.Tooltip=U,Object.defineProperty(t,"__esModule",{value:!0})}); -//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/pkg/ui/v1alpha3/frontend/public/scripts/d3.v5.min.js b/pkg/ui/v1alpha3/frontend/public/scripts/d3.v5.min.js deleted file mode 100644 index e9db321be9b..00000000000 --- a/pkg/ui/v1alpha3/frontend/public/scripts/d3.v5.min.js +++ /dev/null @@ -1,2 +0,0 @@ -// https://d3js.org v5.12.0 Copyright 2019 Mike Bostock -!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t=t||self).d3=t.d3||{})}(this,function(t){"use strict";function n(t,n){return tn?1:t>=n?0:NaN}function e(t){var e;return 1===t.length&&(e=t,t=function(t,r){return n(e(t),r)}),{left:function(n,e,r,i){for(null==r&&(r=0),null==i&&(i=n.length);r>>1;t(n[o],e)<0?r=o+1:i=o}return r},right:function(n,e,r,i){for(null==r&&(r=0),null==i&&(i=n.length);r>>1;t(n[o],e)>0?i=o:r=o+1}return r}}}var r=e(n),i=r.right,o=r.left;function a(t,n){return[t,n]}function u(t){return null===t?NaN:+t}function c(t,n){var e,r,i=t.length,o=0,a=-1,c=0,f=0;if(null==n)for(;++a1)return f/(o-1)}function f(t,n){var e=c(t,n);return e?Math.sqrt(e):e}function s(t,n){var e,r,i,o=t.length,a=-1;if(null==n){for(;++a=e)for(r=i=e;++ae&&(r=e),i=e)for(r=i=e;++ae&&(r=e),i0)return[t];if((r=n0)for(t=Math.ceil(t/a),n=Math.floor(n/a),o=new Array(i=Math.ceil(n-t+1));++u=0?(o>=y?10:o>=_?5:o>=b?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(o>=y?10:o>=_?5:o>=b?2:1)}function w(t,n,e){var r=Math.abs(n-t)/Math.max(0,e),i=Math.pow(10,Math.floor(Math.log(r)/Math.LN10)),o=r/i;return o>=y?i*=10:o>=_?i*=5:o>=b&&(i*=2),n=1)return+e(t[r-1],r-1,t);var r,i=(r-1)*n,o=Math.floor(i),a=+e(t[o],o,t);return a+(+e(t[o+1],o+1,t)-a)*(i-o)}}function A(t,n){var e,r,i=t.length,o=-1;if(null==n){for(;++o=e)for(r=e;++or&&(r=e)}else for(;++o=e)for(r=e;++or&&(r=e);return r}function T(t){for(var n,e,r,i=t.length,o=-1,a=0;++o=0;)for(n=(r=t[i]).length;--n>=0;)e[--a]=r[n];return e}function S(t,n){var e,r,i=t.length,o=-1;if(null==n){for(;++o=e)for(r=e;++oe&&(r=e)}else for(;++o=e)for(r=e;++oe&&(r=e);return r}function k(t){if(!(i=t.length))return[];for(var n=-1,e=S(t,E),r=new Array(e);++n=0&&(e=t.slice(r+1),t=t.slice(0,r)),t&&!n.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}})}function X(t,n){for(var e,r=0,i=t.length;r0)for(var e,r,i=new Array(e),o=0;o=0&&"xmlns"!==(n=t.slice(0,e))&&(t=t.slice(e+1)),$.hasOwnProperty(n)?{space:$[n],local:t}:t}function Z(t){var n=W(t);return(n.local?function(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}:function(t){return function(){var n=this.ownerDocument,e=this.namespaceURI;return e===V&&n.documentElement.namespaceURI===V?n.createElement(t):n.createElementNS(e,t)}})(n)}function Q(){}function K(t){return null==t?Q:function(){return this.querySelector(t)}}function J(){return[]}function tt(t){return null==t?J:function(){return this.querySelectorAll(t)}}function nt(t){return function(){return this.matches(t)}}function et(t){return new Array(t.length)}function rt(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=n}rt.prototype={constructor:rt,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,n){return this._parent.insertBefore(t,n)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var it="$";function ot(t,n,e,r,i,o){for(var a,u=0,c=n.length,f=o.length;un?1:t>=n?0:NaN}function ct(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function ft(t,n){return t.style.getPropertyValue(n)||ct(t).getComputedStyle(t,null).getPropertyValue(n)}function st(t){return t.trim().split(/^|\s+/)}function lt(t){return t.classList||new ht(t)}function ht(t){this._node=t,this._names=st(t.getAttribute("class")||"")}function dt(t,n){for(var e=lt(t),r=-1,i=n.length;++r=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var Mt={};(t.event=null,"undefined"!=typeof document)&&("onmouseenter"in document.documentElement||(Mt={mouseenter:"mouseover",mouseleave:"mouseout"}));function Nt(t,n,e){return t=At(t,n,e),function(n){var e=n.relatedTarget;e&&(e===this||8&e.compareDocumentPosition(this))||t.call(this,n)}}function At(n,e,r){return function(i){var o=t.event;t.event=i;try{n.call(this,this.__data__,e,r)}finally{t.event=o}}}function Tt(t){return function(){var n=this.__on;if(n){for(var e,r=0,i=-1,o=n.length;r=m&&(m=b+1);!(_=g[m])&&++m=0;)(r=i[o])&&(a&&4^r.compareDocumentPosition(a)&&a.parentNode.insertBefore(r,a),a=r);return this},sort:function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=ut);for(var e=this._groups,r=e.length,i=new Array(r),o=0;o1?this.each((null==n?function(t){return function(){this.style.removeProperty(t)}}:"function"==typeof n?function(t,n,e){return function(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}}:function(t,n,e){return function(){this.style.setProperty(t,n,e)}})(t,n,null==e?"":e)):ft(this.node(),t)},property:function(t,n){return arguments.length>1?this.each((null==n?function(t){return function(){delete this[t]}}:"function"==typeof n?function(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}:function(t,n){return function(){this[t]=n}})(t,n)):this.node()[t]},classed:function(t,n){var e=st(t+"");if(arguments.length<2){for(var r=lt(this.node()),i=-1,o=e.length;++i=0&&(n=t.slice(e+1),t=t.slice(0,e)),{type:t,name:n}})}(t+""),a=o.length;if(!(arguments.length<2)){for(u=n?St:Tt,null==e&&(e=!1),r=0;r>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1):(n=on.exec(t))?gn(parseInt(n[1],16)):(n=an.exec(t))?new mn(n[1],n[2],n[3],1):(n=un.exec(t))?new mn(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=cn.exec(t))?yn(n[1],n[2],n[3],n[4]):(n=fn.exec(t))?yn(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=sn.exec(t))?Nn(n[1],n[2]/100,n[3]/100,1):(n=ln.exec(t))?Nn(n[1],n[2]/100,n[3]/100,n[4]):hn.hasOwnProperty(t)?gn(hn[t]):"transparent"===t?new mn(NaN,NaN,NaN,0):null}function gn(t){return new mn(t>>16&255,t>>8&255,255&t,1)}function yn(t,n,e,r){return r<=0&&(t=n=e=NaN),new mn(t,n,e,r)}function _n(t){return t instanceof Jt||(t=vn(t)),t?new mn((t=t.rgb()).r,t.g,t.b,t.opacity):new mn}function bn(t,n,e,r){return 1===arguments.length?_n(t):new mn(t,n,e,null==r?1:r)}function mn(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}function xn(){return"#"+Mn(this.r)+Mn(this.g)+Mn(this.b)}function wn(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function Mn(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function Nn(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=NaN),new Sn(t,n,e,r)}function An(t){if(t instanceof Sn)return new Sn(t.h,t.s,t.l,t.opacity);if(t instanceof Jt||(t=vn(t)),!t)return new Sn;if(t instanceof Sn)return t;var n=(t=t.rgb()).r/255,e=t.g/255,r=t.b/255,i=Math.min(n,e,r),o=Math.max(n,e,r),a=NaN,u=o-i,c=(o+i)/2;return u?(a=n===o?(e-r)/u+6*(e0&&c<1?0:a,new Sn(a,u,c,t.opacity)}function Tn(t,n,e,r){return 1===arguments.length?An(t):new Sn(t,n,e,null==r?1:r)}function Sn(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function kn(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(240-t)/60:n)}Qt(Jt,vn,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:dn,formatHex:dn,formatHsl:function(){return An(this).formatHsl()},formatRgb:pn,toString:pn}),Qt(mn,bn,Kt(Jt,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new mn(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new mn(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:xn,formatHex:xn,formatRgb:wn,toString:wn})),Qt(Sn,Tn,Kt(Jt,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new Sn(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new Sn(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),n=isNaN(t)||isNaN(this.s)?0:this.s,e=this.l,r=e+(e<.5?e:1-e)*n,i=2*e-r;return new mn(kn(t>=240?t-240:t+120,i,r),kn(t,i,r),kn(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));var En=Math.PI/180,Cn=180/Math.PI,Pn=.96422,zn=1,Rn=.82521,Dn=4/29,qn=6/29,Ln=3*qn*qn,Un=qn*qn*qn;function On(t){if(t instanceof Yn)return new Yn(t.l,t.a,t.b,t.opacity);if(t instanceof Vn)return $n(t);t instanceof mn||(t=_n(t));var n,e,r=jn(t.r),i=jn(t.g),o=jn(t.b),a=Fn((.2225045*r+.7168786*i+.0606169*o)/zn);return r===i&&i===o?n=e=a:(n=Fn((.4360747*r+.3850649*i+.1430804*o)/Pn),e=Fn((.0139322*r+.0971045*i+.7141733*o)/Rn)),new Yn(116*a-16,500*(n-a),200*(a-e),t.opacity)}function Bn(t,n,e,r){return 1===arguments.length?On(t):new Yn(t,n,e,null==r?1:r)}function Yn(t,n,e,r){this.l=+t,this.a=+n,this.b=+e,this.opacity=+r}function Fn(t){return t>Un?Math.pow(t,1/3):t/Ln+Dn}function In(t){return t>qn?t*t*t:Ln*(t-Dn)}function Hn(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function jn(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Xn(t){if(t instanceof Vn)return new Vn(t.h,t.c,t.l,t.opacity);if(t instanceof Yn||(t=On(t)),0===t.a&&0===t.b)return new Vn(NaN,0=1?(e=1,n-1):Math.floor(e*n),i=t[r],o=t[r+1],a=r>0?t[r-1]:2*i-o,u=r180||e<-180?e-360*Math.round(e/360):e):ce(isNaN(t)?n:t)}function le(t){return 1==(t=+t)?he:function(n,e){return e-n?function(t,n,e){return t=Math.pow(t,e),n=Math.pow(n,e)-t,e=1/e,function(r){return Math.pow(t+r*n,e)}}(n,e,t):ce(isNaN(n)?e:n)}}function he(t,n){var e=n-t;return e?fe(t,e):ce(isNaN(t)?n:t)}Qt(ie,re,Kt(Jt,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new ie(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new ie(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=isNaN(this.h)?0:(this.h+120)*En,n=+this.l,e=isNaN(this.s)?0:this.s*n*(1-n),r=Math.cos(t),i=Math.sin(t);return new mn(255*(n+e*(Wn*r+Zn*i)),255*(n+e*(Qn*r+Kn*i)),255*(n+e*(Jn*r)),this.opacity)}}));var de=function t(n){var e=le(n);function r(t,n){var r=e((t=bn(t)).r,(n=bn(n)).r),i=e(t.g,n.g),o=e(t.b,n.b),a=he(t.opacity,n.opacity);return function(n){return t.r=r(n),t.g=i(n),t.b=o(n),t.opacity=a(n),t+""}}return r.gamma=t,r}(1);function pe(t){return function(n){var e,r,i=n.length,o=new Array(i),a=new Array(i),u=new Array(i);for(e=0;eo&&(i=n.slice(o,i),u[a]?u[a]+=i:u[++a]=i),(e=e[0])===(r=r[0])?u[a]?u[a]+=r:u[++a]=r:(u[++a]=null,c.push({i:a,x:be(e,r)})),o=we.lastIndex;return o180?n+=360:n-t>180&&(t+=360),o.push({i:e.push(i(e)+"rotate(",null,r)-2,x:be(t,n)})):n&&e.push(i(e)+"rotate("+n+r)}(o.rotate,a.rotate,u,c),function(t,n,e,o){t!==n?o.push({i:e.push(i(e)+"skewX(",null,r)-2,x:be(t,n)}):n&&e.push(i(e)+"skewX("+n+r)}(o.skewX,a.skewX,u,c),function(t,n,e,r,o,a){if(t!==e||n!==r){var u=o.push(i(o)+"scale(",null,",",null,")");a.push({i:u-4,x:be(t,e)},{i:u-2,x:be(n,r)})}else 1===e&&1===r||o.push(i(o)+"scale("+e+","+r+")")}(o.scaleX,o.scaleY,a.scaleX,a.scaleY,u,c),o=a=null,function(t){for(var n,e=-1,r=c.length;++e=0&&n._call.call(null,t),n=n._next;--Je}function dr(){ir=(rr=ar.now())+or,Je=tr=0;try{hr()}finally{Je=0,function(){var t,n,e=Qe,r=1/0;for(;e;)e._call?(r>e._time&&(r=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:Qe=n);Ke=t,vr(r)}(),ir=0}}function pr(){var t=ar.now(),n=t-rr;n>er&&(or-=n,rr=t)}function vr(t){Je||(tr&&(tr=clearTimeout(tr)),t-ir>24?(t<1/0&&(tr=setTimeout(dr,t-ar.now()-or)),nr&&(nr=clearInterval(nr))):(nr||(rr=ar.now(),nr=setInterval(pr,er)),Je=1,ur(dr)))}function gr(t,n,e){var r=new sr;return n=null==n?0:+n,r.restart(function(e){r.stop(),t(e+n)},n,e),r}sr.prototype=lr.prototype={constructor:sr,restart:function(t,n,e){if("function"!=typeof t)throw new TypeError("callback is not a function");e=(null==e?cr():+e)+(null==n?0:+n),this._next||Ke===this||(Ke?Ke._next=this:Qe=this,Ke=this),this._call=t,this._time=e,vr()},stop:function(){this._call&&(this._call=null,this._time=1/0,vr())}};var yr=I("start","end","cancel","interrupt"),_r=[],br=0,mr=1,xr=2,wr=3,Mr=4,Nr=5,Ar=6;function Tr(t,n,e,r,i,o){var a=t.__transition;if(a){if(e in a)return}else t.__transition={};!function(t,n,e){var r,i=t.__transition;function o(c){var f,s,l,h;if(e.state!==mr)return u();for(f in i)if((h=i[f]).name===e.name){if(h.state===wr)return gr(o);h.state===Mr?(h.state=Ar,h.timer.stop(),h.on.call("interrupt",t,t.__data__,h.index,h.group),delete i[f]):+fbr)throw new Error("too late; already scheduled");return e}function kr(t,n){var e=Er(t,n);if(e.state>wr)throw new Error("too late; already running");return e}function Er(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}function Cr(t,n){var e,r,i,o=t.__transition,a=!0;if(o){for(i in n=null==n?null:n+"",o)(e=o[i]).name===n?(r=e.state>xr&&e.state=0&&(t=t.slice(0,n)),!t||"start"===t})}(n)?Sr:kr;return function(){var a=o(this,t),u=a.on;u!==r&&(i=(r=u).copy()).on(n,e),a.on=i}}(e,t,n))},attr:function(t,n){var e=W(t),r="transform"===e?qe:zr;return this.attrTween(t,"function"==typeof n?(e.local?function(t,n,e){var r,i,o;return function(){var a,u,c=e(this);if(null!=c)return(a=this.getAttributeNS(t.space,t.local))===(u=c+"")?null:a===r&&u===i?o:(i=u,o=n(r=a,c));this.removeAttributeNS(t.space,t.local)}}:function(t,n,e){var r,i,o;return function(){var a,u,c=e(this);if(null!=c)return(a=this.getAttribute(t))===(u=c+"")?null:a===r&&u===i?o:(i=u,o=n(r=a,c));this.removeAttribute(t)}})(e,r,Pr(this,"attr."+t,n)):null==n?(e.local?function(t){return function(){this.removeAttributeNS(t.space,t.local)}}:function(t){return function(){this.removeAttribute(t)}})(e):(e.local?function(t,n,e){var r,i,o=e+"";return function(){var a=this.getAttributeNS(t.space,t.local);return a===o?null:a===r?i:i=n(r=a,e)}}:function(t,n,e){var r,i,o=e+"";return function(){var a=this.getAttribute(t);return a===o?null:a===r?i:i=n(r=a,e)}})(e,r,n))},attrTween:function(t,n){var e="attr."+t;if(arguments.length<2)return(e=this.tween(e))&&e._value;if(null==n)return this.tween(e,null);if("function"!=typeof n)throw new Error;var r=W(t);return this.tween(e,(r.local?function(t,n){var e,r;function i(){var i=n.apply(this,arguments);return i!==r&&(e=(r=i)&&function(t,n){return function(e){this.setAttributeNS(t.space,t.local,n(e))}}(t,i)),e}return i._value=n,i}:function(t,n){var e,r;function i(){var i=n.apply(this,arguments);return i!==r&&(e=(r=i)&&function(t,n){return function(e){this.setAttribute(t,n(e))}}(t,i)),e}return i._value=n,i})(r,n))},style:function(t,n,e){var r="transform"==(t+="")?De:zr;return null==n?this.styleTween(t,function(t,n){var e,r,i;return function(){var o=ft(this,t),a=(this.style.removeProperty(t),ft(this,t));return o===a?null:o===e&&a===r?i:i=n(e=o,r=a)}}(t,r)).on("end.style."+t,Dr(t)):"function"==typeof n?this.styleTween(t,function(t,n,e){var r,i,o;return function(){var a=ft(this,t),u=e(this),c=u+"";return null==u&&(this.style.removeProperty(t),c=u=ft(this,t)),a===c?null:a===r&&c===i?o:(i=c,o=n(r=a,u))}}(t,r,Pr(this,"style."+t,n))).each(function(t,n){var e,r,i,o,a="style."+n,u="end."+a;return function(){var c=kr(this,t),f=c.on,s=null==c.value[a]?o||(o=Dr(n)):void 0;f===e&&i===s||(r=(e=f).copy()).on(u,i=s),c.on=r}}(this._id,t)):this.styleTween(t,function(t,n,e){var r,i,o=e+"";return function(){var a=ft(this,t);return a===o?null:a===r?i:i=n(r=a,e)}}(t,r,n),e).on("end.style."+t,null)},styleTween:function(t,n,e){var r="style."+(t+="");if(arguments.length<2)return(r=this.tween(r))&&r._value;if(null==n)return this.tween(r,null);if("function"!=typeof n)throw new Error;return this.tween(r,function(t,n,e){var r,i;function o(){var o=n.apply(this,arguments);return o!==i&&(r=(i=o)&&function(t,n,e){return function(r){this.style.setProperty(t,n(r),e)}}(t,o,e)),r}return o._value=n,o}(t,n,null==e?"":e))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var n=t(this);this.textContent=null==n?"":n}}(Pr(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},remove:function(){return this.on("end.remove",function(t){return function(){var n=this.parentNode;for(var e in this.__transition)if(+e!==t)return;n&&n.removeChild(this)}}(this._id))},tween:function(t,n){var e=this._id;if(t+="",arguments.length<2){for(var r,i=Er(this.node(),e).tween,o=0,a=i.length;o0&&(r=o-P),M<0?d=p-z:M>0&&(u=c-z),x=wi,B.attr("cursor",Ci.selection),I());break;default:return}mi()},!0).on("keyup.brush",function(){switch(t.event.keyCode){case 16:R&&(g=y=R=!1,I());break;case 18:x===Ni&&(w<0?f=h:w>0&&(r=o),M<0?d=p:M>0&&(u=c),x=Mi,I());break;case 32:x===wi&&(t.event.altKey?(w&&(f=h-P*w,r=o+P*w),M&&(d=p-z*M,u=c+z*M),x=Ni):(w<0?f=h:w>0&&(r=o),M<0?d=p:M>0&&(u=c),x=Mi),B.attr("cursor",Ci[m]),I());break;default:return}mi()},!0),Ht(t.event.view)}bi(),Cr(b),s.call(b),U.start()}function F(){var t=D(b);!R||g||y||(Math.abs(t[0]-L[0])>Math.abs(t[1]-L[1])?y=!0:g=!0),L=t,v=!0,mi(),I()}function I(){var t;switch(P=L[0]-q[0],z=L[1]-q[1],x){case wi:case xi:w&&(P=Math.max(S-r,Math.min(E-f,P)),o=r+P,h=f+P),M&&(z=Math.max(k-u,Math.min(C-d,z)),c=u+z,p=d+z);break;case Mi:w<0?(P=Math.max(S-r,Math.min(E-r,P)),o=r+P,h=f):w>0&&(P=Math.max(S-f,Math.min(E-f,P)),o=r,h=f+P),M<0?(z=Math.max(k-u,Math.min(C-u,z)),c=u+z,p=d):M>0&&(z=Math.max(k-d,Math.min(C-d,z)),c=u,p=d+z);break;case Ni:w&&(o=Math.max(S,Math.min(E,r-P*w)),h=Math.max(S,Math.min(E,f+P*w))),M&&(c=Math.max(k,Math.min(C,u-z*M)),p=Math.max(k,Math.min(C,d+z*M)))}h1e-6)if(Math.abs(s*u-c*f)>1e-6&&i){var h=e-o,d=r-a,p=u*u+c*c,v=h*h+d*d,g=Math.sqrt(p),y=Math.sqrt(l),_=i*Math.tan((Zi-Math.acos((p+l-v)/(2*g*y)))/2),b=_/y,m=_/g;Math.abs(b-1)>1e-6&&(this._+="L"+(t+b*f)+","+(n+b*s)),this._+="A"+i+","+i+",0,0,"+ +(s*h>f*d)+","+(this._x1=t+m*u)+","+(this._y1=n+m*c)}else this._+="L"+(this._x1=t)+","+(this._y1=n);else;},arc:function(t,n,e,r,i,o){t=+t,n=+n,o=!!o;var a=(e=+e)*Math.cos(r),u=e*Math.sin(r),c=t+a,f=n+u,s=1^o,l=o?r-i:i-r;if(e<0)throw new Error("negative radius: "+e);null===this._x1?this._+="M"+c+","+f:(Math.abs(this._x1-c)>1e-6||Math.abs(this._y1-f)>1e-6)&&(this._+="L"+c+","+f),e&&(l<0&&(l=l%Qi+Qi),l>Ki?this._+="A"+e+","+e+",0,1,"+s+","+(t-a)+","+(n-u)+"A"+e+","+e+",0,1,"+s+","+(this._x1=c)+","+(this._y1=f):l>1e-6&&(this._+="A"+e+","+e+",0,"+ +(l>=Zi)+","+s+","+(this._x1=t+e*Math.cos(i))+","+(this._y1=n+e*Math.sin(i))))},rect:function(t,n,e,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +e+"v"+ +r+"h"+-e+"Z"},toString:function(){return this._}};function ao(){}function uo(t,n){var e=new ao;if(t instanceof ao)t.each(function(t,n){e.set(n,t)});else if(Array.isArray(t)){var r,i=-1,o=t.length;if(null==n)for(;++ir!=d>r&&e<(h-f)*(r-s)/(d-s)+f&&(i=-i)}return i}function xo(t,n,e){var r,i,o,a;return function(t,n,e){return(n[0]-t[0])*(e[1]-t[1])==(e[0]-t[0])*(n[1]-t[1])}(t,n,e)&&(i=t[r=+(t[0]===n[0])],o=e[r],a=n[r],i<=o&&o<=a||a<=o&&o<=i)}function wo(){}var Mo=[[],[[[1,1.5],[.5,1]]],[[[1.5,1],[1,1.5]]],[[[1.5,1],[.5,1]]],[[[1,.5],[1.5,1]]],[[[1,1.5],[.5,1]],[[1,.5],[1.5,1]]],[[[1,.5],[1,1.5]]],[[[1,.5],[.5,1]]],[[[.5,1],[1,.5]]],[[[1,1.5],[1,.5]]],[[[.5,1],[1,.5]],[[1.5,1],[1,1.5]]],[[[1.5,1],[1,.5]]],[[[.5,1],[1.5,1]]],[[[1,1.5],[1.5,1]]],[[[.5,1],[1,1.5]]],[]];function No(){var t=1,n=1,e=M,r=u;function i(t){var n=e(t);if(Array.isArray(n))n=n.slice().sort(yo);else{var r=s(t),i=r[0],a=r[1];n=w(i,a,n),n=g(Math.floor(i/n)*n,Math.floor(a/n)*n,n)}return n.map(function(n){return o(t,n)})}function o(e,i){var o=[],u=[];return function(e,r,i){var o,u,c,f,s,l,h=new Array,d=new Array;o=u=-1,f=e[0]>=r,Mo[f<<1].forEach(p);for(;++o=r,Mo[c|f<<1].forEach(p);Mo[f<<0].forEach(p);for(;++u=r,s=e[u*t]>=r,Mo[f<<1|s<<2].forEach(p);++o=r,l=s,s=e[u*t+o+1]>=r,Mo[c|f<<1|s<<2|l<<3].forEach(p);Mo[f|s<<3].forEach(p)}o=-1,s=e[u*t]>=r,Mo[s<<2].forEach(p);for(;++o=r,Mo[s<<2|l<<3].forEach(p);function p(t){var n,e,r=[t[0][0]+o,t[0][1]+u],c=[t[1][0]+o,t[1][1]+u],f=a(r),s=a(c);(n=d[f])?(e=h[s])?(delete d[n.end],delete h[e.start],n===e?(n.ring.push(c),i(n.ring)):h[n.start]=d[e.end]={start:n.start,end:e.end,ring:n.ring.concat(e.ring)}):(delete d[n.end],n.ring.push(c),d[n.end=s]=n):(n=h[s])?(e=d[f])?(delete h[n.start],delete d[e.end],n===e?(n.ring.push(c),i(n.ring)):h[e.start]=d[n.end]={start:e.start,end:n.end,ring:e.ring.concat(n.ring)}):(delete h[n.start],n.ring.unshift(r),h[n.start=f]=n):h[f]=d[s]={start:f,end:s,ring:[r,c]}}Mo[s<<3].forEach(p)}(e,i,function(t){r(t,e,i),function(t){for(var n=0,e=t.length,r=t[e-1][1]*t[0][0]-t[e-1][0]*t[0][1];++n0?o.push([t]):u.push(t)}),u.forEach(function(t){for(var n,e=0,r=o.length;e0&&a0&&u0&&o>0))throw new Error("invalid size");return t=r,n=o,i},i.thresholds=function(t){return arguments.length?(e="function"==typeof t?t:Array.isArray(t)?_o(go.call(t)):_o(t),i):e},i.smooth=function(t){return arguments.length?(r=t?u:wo,i):r===u},i}function Ao(t,n,e){for(var r=t.width,i=t.height,o=1+(e<<1),a=0;a=e&&(u>=o&&(c-=t.data[u-o+a*r]),n.data[u-e+a*r]=c/Math.min(u+1,r-1+o-u,o))}function To(t,n,e){for(var r=t.width,i=t.height,o=1+(e<<1),a=0;a=e&&(u>=o&&(c-=t.data[a+(u-o)*r]),n.data[a+(u-e)*r]=c/Math.min(u+1,i-1+o-u,o))}function So(t){return t[0]}function ko(t){return t[1]}function Eo(){return 1}var Co={},Po={},zo=34,Ro=10,Do=13;function qo(t){return new Function("d","return {"+t.map(function(t,n){return JSON.stringify(t)+": d["+n+"]"}).join(",")+"}")}function Lo(t){var n=Object.create(null),e=[];return t.forEach(function(t){for(var r in t)r in n||e.push(n[r]=r)}),e}function Uo(t,n){var e=t+"",r=e.length;return r9999?"+"+Uo(t,6):Uo(t,4)}(t.getUTCFullYear())+"-"+Uo(t.getUTCMonth()+1,2)+"-"+Uo(t.getUTCDate(),2)+(i?"T"+Uo(n,2)+":"+Uo(e,2)+":"+Uo(r,2)+"."+Uo(i,3)+"Z":r?"T"+Uo(n,2)+":"+Uo(e,2)+":"+Uo(r,2)+"Z":e||n?"T"+Uo(n,2)+":"+Uo(e,2)+"Z":"")}function Bo(t){var n=new RegExp('["'+t+"\n\r]"),e=t.charCodeAt(0);function r(t,n){var r,i=[],o=t.length,a=0,u=0,c=o<=0,f=!1;function s(){if(c)return Po;if(f)return f=!1,Co;var n,r,i=a;if(t.charCodeAt(i)===zo){for(;a++=o?c=!0:(r=t.charCodeAt(a++))===Ro?f=!0:r===Do&&(f=!0,t.charCodeAt(a)===Ro&&++a),t.slice(i+1,n-1).replace(/""/g,'"')}for(;a=(o=(v+y)/2))?v=o:y=o,(s=e>=(a=(g+_)/2))?g=a:_=a,i=d,!(d=d[l=s<<1|f]))return i[l]=p,t;if(u=+t._x.call(null,d.data),c=+t._y.call(null,d.data),n===u&&e===c)return p.next=d,i?i[l]=p:t._root=p,t;do{i=i?i[l]=new Array(4):t._root=new Array(4),(f=n>=(o=(v+y)/2))?v=o:y=o,(s=e>=(a=(g+_)/2))?g=a:_=a}while((l=s<<1|f)==(h=(c>=a)<<1|u>=o));return i[h]=d,i[l]=p,t}function da(t,n,e,r,i){this.node=t,this.x0=n,this.y0=e,this.x1=r,this.y1=i}function pa(t){return t[0]}function va(t){return t[1]}function ga(t,n,e){var r=new ya(null==n?pa:n,null==e?va:e,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function ya(t,n,e,r,i,o){this._x=t,this._y=n,this._x0=e,this._y0=r,this._x1=i,this._y1=o,this._root=void 0}function _a(t){for(var n={data:t.data},e=n;t=t.next;)e=e.next={data:t.data};return n}var ba=ga.prototype=ya.prototype;function ma(t){return t.x+t.vx}function xa(t){return t.y+t.vy}function wa(t){return t.index}function Ma(t,n){var e=t.get(n);if(!e)throw new Error("missing: "+n);return e}function Na(t){return t.x}function Aa(t){return t.y}ba.copy=function(){var t,n,e=new ya(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return e;if(!r.length)return e._root=_a(r),e;for(t=[{source:r,target:e._root=new Array(4)}];r=t.pop();)for(var i=0;i<4;++i)(n=r.source[i])&&(n.length?t.push({source:n,target:r.target[i]=new Array(4)}):r.target[i]=_a(n));return e},ba.add=function(t){var n=+this._x.call(null,t),e=+this._y.call(null,t);return ha(this.cover(n,e),n,e,t)},ba.addAll=function(t){var n,e,r,i,o=t.length,a=new Array(o),u=new Array(o),c=1/0,f=1/0,s=-1/0,l=-1/0;for(e=0;es&&(s=r),il&&(l=i));if(c>s||f>l)return this;for(this.cover(c,f).cover(s,l),e=0;et||t>=i||r>n||n>=o;)switch(u=(nh||(o=c.y0)>d||(a=c.x1)=y)<<1|t>=g)&&(c=p[p.length-1],p[p.length-1]=p[p.length-1-f],p[p.length-1-f]=c)}else{var _=t-+this._x.call(null,v.data),b=n-+this._y.call(null,v.data),m=_*_+b*b;if(m=(u=(p+g)/2))?p=u:g=u,(s=a>=(c=(v+y)/2))?v=c:y=c,n=d,!(d=d[l=s<<1|f]))return this;if(!d.length)break;(n[l+1&3]||n[l+2&3]||n[l+3&3])&&(e=n,h=l)}for(;d.data!==t;)if(r=d,!(d=d.next))return this;return(i=d.next)&&delete d.next,r?(i?r.next=i:delete r.next,this):n?(i?n[l]=i:delete n[l],(d=n[0]||n[1]||n[2]||n[3])&&d===(n[3]||n[2]||n[1]||n[0])&&!d.length&&(e?e[h]=d:this._root=d),this):(this._root=i,this)},ba.removeAll=function(t){for(var n=0,e=t.length;n1?r[0]+r.slice(2):r,+t.slice(e+1)]}function Ea(t){return(t=ka(Math.abs(t)))?t[1]:NaN}var Ca,Pa=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function za(t){if(!(n=Pa.exec(t)))throw new Error("invalid format: "+t);var n;return new Ra({fill:n[1],align:n[2],sign:n[3],symbol:n[4],zero:n[5],width:n[6],comma:n[7],precision:n[8]&&n[8].slice(1),trim:n[9],type:n[10]})}function Ra(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function Da(t,n){var e=ka(t,n);if(!e)return t+"";var r=e[0],i=e[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}za.prototype=Ra.prototype,Ra.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var qa={"%":function(t,n){return(100*t).toFixed(n)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.round(t).toString(10)},e:function(t,n){return t.toExponential(n)},f:function(t,n){return t.toFixed(n)},g:function(t,n){return t.toPrecision(n)},o:function(t){return Math.round(t).toString(8)},p:function(t,n){return Da(100*t,n)},r:Da,s:function(t,n){var e=ka(t,n);if(!e)return t+"";var r=e[0],i=e[1],o=i-(Ca=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,a=r.length;return o===a?r:o>a?r+new Array(o-a+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+ka(t,Math.max(0,n+o-1))[0]},X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}};function La(t){return t}var Ua,Oa=Array.prototype.map,Ba=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function Ya(t){var n,e,r=void 0===t.grouping||void 0===t.thousands?La:(n=Oa.call(t.grouping,Number),e=t.thousands+"",function(t,r){for(var i=t.length,o=[],a=0,u=n[0],c=0;i>0&&u>0&&(c+u+1>r&&(u=Math.max(1,r-c)),o.push(t.substring(i-=u,i+u)),!((c+=u+1)>r));)u=n[a=(a+1)%n.length];return o.reverse().join(e)}),i=void 0===t.currency?"":t.currency[0]+"",o=void 0===t.currency?"":t.currency[1]+"",a=void 0===t.decimal?".":t.decimal+"",u=void 0===t.numerals?La:function(t){return function(n){return n.replace(/[0-9]/g,function(n){return t[+n]})}}(Oa.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",f=void 0===t.minus?"-":t.minus+"",s=void 0===t.nan?"NaN":t.nan+"";function l(t){var n=(t=za(t)).fill,e=t.align,l=t.sign,h=t.symbol,d=t.zero,p=t.width,v=t.comma,g=t.precision,y=t.trim,_=t.type;"n"===_?(v=!0,_="g"):qa[_]||(void 0===g&&(g=12),y=!0,_="g"),(d||"0"===n&&"="===e)&&(d=!0,n="0",e="=");var b="$"===h?i:"#"===h&&/[boxX]/.test(_)?"0"+_.toLowerCase():"",m="$"===h?o:/[%p]/.test(_)?c:"",x=qa[_],w=/[defgprs%]/.test(_);function M(t){var i,o,c,h=b,M=m;if("c"===_)M=x(t)+M,t="";else{var N=(t=+t)<0;if(t=isNaN(t)?s:x(Math.abs(t),g),y&&(t=function(t){t:for(var n,e=t.length,r=1,i=-1;r0){if(!+t[r])break t;i=0}}return i>0?t.slice(0,i)+t.slice(n+1):t}(t)),N&&0==+t&&(N=!1),h=(N?"("===l?l:f:"-"===l||"("===l?"":l)+h,M=("s"===_?Ba[8+Ca/3]:"")+M+(N&&"("===l?")":""),w)for(i=-1,o=t.length;++i(c=t.charCodeAt(i))||c>57){M=(46===c?a+t.slice(i+1):t.slice(i))+M,t=t.slice(0,i);break}}v&&!d&&(t=r(t,1/0));var A=h.length+t.length+M.length,T=A>1)+h+t+M+T.slice(A);break;default:t=T+h+t+M}return u(t)}return g=void 0===g?6:/[gprs]/.test(_)?Math.max(1,Math.min(21,g)):Math.max(0,Math.min(20,g)),M.toString=function(){return t+""},M}return{format:l,formatPrefix:function(t,n){var e=l(((t=za(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(Ea(n)/3))),i=Math.pow(10,-r),o=Ba[8+r/3];return function(t){return e(i*t)+o}}}}function Fa(n){return Ua=Ya(n),t.format=Ua.format,t.formatPrefix=Ua.formatPrefix,Ua}function Ia(t){return Math.max(0,-Ea(Math.abs(t)))}function Ha(t,n){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Ea(n)/3)))-Ea(Math.abs(t)))}function ja(t,n){return t=Math.abs(t),n=Math.abs(n)-t,Math.max(0,Ea(n)-Ea(t))+1}function Xa(){return new Ga}function Ga(){this.reset()}Fa({decimal:".",thousands:",",grouping:[3],currency:["$",""],minus:"-"}),Ga.prototype={constructor:Ga,reset:function(){this.s=this.t=0},add:function(t){$a(Va,t,this.t),$a(this,Va.s,this.s),this.s?this.t+=Va.t:this.s=Va.t},valueOf:function(){return this.s}};var Va=new Ga;function $a(t,n,e){var r=t.s=n+e,i=r-n,o=r-i;t.t=n-o+(e-i)}var Wa=1e-6,Za=1e-12,Qa=Math.PI,Ka=Qa/2,Ja=Qa/4,tu=2*Qa,nu=180/Qa,eu=Qa/180,ru=Math.abs,iu=Math.atan,ou=Math.atan2,au=Math.cos,uu=Math.ceil,cu=Math.exp,fu=Math.log,su=Math.pow,lu=Math.sin,hu=Math.sign||function(t){return t>0?1:t<0?-1:0},du=Math.sqrt,pu=Math.tan;function vu(t){return t>1?0:t<-1?Qa:Math.acos(t)}function gu(t){return t>1?Ka:t<-1?-Ka:Math.asin(t)}function yu(t){return(t=lu(t/2))*t}function _u(){}function bu(t,n){t&&xu.hasOwnProperty(t.type)&&xu[t.type](t,n)}var mu={Feature:function(t,n){bu(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r=0?1:-1,i=r*e,o=au(n=(n*=eu)/2+Ja),a=lu(n),u=Eu*a,c=ku*o+u*au(i),f=u*r*lu(i);Cu.add(ou(f,c)),Su=t,ku=o,Eu=a}function Uu(t){return[ou(t[1],t[0]),gu(t[2])]}function Ou(t){var n=t[0],e=t[1],r=au(e);return[r*au(n),r*lu(n),lu(e)]}function Bu(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function Yu(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function Fu(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function Iu(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function Hu(t){var n=du(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}var ju,Xu,Gu,Vu,$u,Wu,Zu,Qu,Ku,Ju,tc,nc,ec,rc,ic,oc,ac,uc,cc,fc,sc,lc,hc,dc,pc,vc,gc=Xa(),yc={point:_c,lineStart:mc,lineEnd:xc,polygonStart:function(){yc.point=wc,yc.lineStart=Mc,yc.lineEnd=Nc,gc.reset(),zu.polygonStart()},polygonEnd:function(){zu.polygonEnd(),yc.point=_c,yc.lineStart=mc,yc.lineEnd=xc,Cu<0?(ju=-(Gu=180),Xu=-(Vu=90)):gc>Wa?Vu=90:gc<-Wa&&(Xu=-90),Ju[0]=ju,Ju[1]=Gu},sphere:function(){ju=-(Gu=180),Xu=-(Vu=90)}};function _c(t,n){Ku.push(Ju=[ju=t,Gu=t]),nVu&&(Vu=n)}function bc(t,n){var e=Ou([t*eu,n*eu]);if(Qu){var r=Yu(Qu,e),i=Yu([r[1],-r[0],0],r);Hu(i),i=Uu(i);var o,a=t-$u,u=a>0?1:-1,c=i[0]*nu*u,f=ru(a)>180;f^(u*$uVu&&(Vu=o):f^(u*$u<(c=(c+360)%360-180)&&cVu&&(Vu=n)),f?t<$u?Ac(ju,t)>Ac(ju,Gu)&&(Gu=t):Ac(t,Gu)>Ac(ju,Gu)&&(ju=t):Gu>=ju?(tGu&&(Gu=t)):t>$u?Ac(ju,t)>Ac(ju,Gu)&&(Gu=t):Ac(t,Gu)>Ac(ju,Gu)&&(ju=t)}else Ku.push(Ju=[ju=t,Gu=t]);nVu&&(Vu=n),Qu=e,$u=t}function mc(){yc.point=bc}function xc(){Ju[0]=ju,Ju[1]=Gu,yc.point=_c,Qu=null}function wc(t,n){if(Qu){var e=t-$u;gc.add(ru(e)>180?e+(e>0?360:-360):e)}else Wu=t,Zu=n;zu.point(t,n),bc(t,n)}function Mc(){zu.lineStart()}function Nc(){wc(Wu,Zu),zu.lineEnd(),ru(gc)>Wa&&(ju=-(Gu=180)),Ju[0]=ju,Ju[1]=Gu,Qu=null}function Ac(t,n){return(n-=t)<0?n+360:n}function Tc(t,n){return t[0]-n[0]}function Sc(t,n){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nQa?t+Math.round(-t/tu)*tu:t,n]}function Ic(t,n,e){return(t%=tu)?n||e?Yc(jc(t),Xc(n,e)):jc(t):n||e?Xc(n,e):Fc}function Hc(t){return function(n,e){return[(n+=t)>Qa?n-tu:n<-Qa?n+tu:n,e]}}function jc(t){var n=Hc(t);return n.invert=Hc(-t),n}function Xc(t,n){var e=au(t),r=lu(t),i=au(n),o=lu(n);function a(t,n){var a=au(n),u=au(t)*a,c=lu(t)*a,f=lu(n),s=f*e+u*r;return[ou(c*i-s*o,u*e-f*r),gu(s*i+c*o)]}return a.invert=function(t,n){var a=au(n),u=au(t)*a,c=lu(t)*a,f=lu(n),s=f*i-c*o;return[ou(c*i+f*o,u*e+s*r),gu(s*e-u*r)]},a}function Gc(t){function n(n){return(n=t(n[0]*eu,n[1]*eu))[0]*=nu,n[1]*=nu,n}return t=Ic(t[0]*eu,t[1]*eu,t.length>2?t[2]*eu:0),n.invert=function(n){return(n=t.invert(n[0]*eu,n[1]*eu))[0]*=nu,n[1]*=nu,n},n}function Vc(t,n,e,r,i,o){if(e){var a=au(n),u=lu(n),c=r*e;null==i?(i=n+r*tu,o=n-c/2):(i=$c(a,i),o=$c(a,o),(r>0?io)&&(i+=r*tu));for(var f,s=i;r>0?s>o:s1&&n.push(n.pop().concat(n.shift()))},result:function(){var e=n;return n=[],t=null,e}}}function Zc(t,n){return ru(t[0]-n[0])=0;--o)i.point((s=f[o])[0],s[1]);else r(h.x,h.p.x,-1,i);h=h.p}f=(h=h.o).z,d=!d}while(!h.v);i.lineEnd()}}}function Jc(t){if(n=t.length){for(var n,e,r=0,i=t[0];++r=0?1:-1,A=N*M,T=A>Qa,S=v*x;if(tf.add(ou(S*N*lu(A),g*w+S*au(A))),a+=T?M+N*tu:M,T^d>=e^b>=e){var k=Yu(Ou(h),Ou(_));Hu(k);var E=Yu(o,k);Hu(E);var C=(T^M>=0?-1:1)*gu(E[2]);(r>C||r===C&&(k[0]||k[1]))&&(u+=T^M>=0?1:-1)}}return(a<-Wa||a0){for(l||(i.polygonStart(),l=!0),i.lineStart(),t=0;t1&&2&c&&h.push(h.pop().concat(h.shift())),a.push(h.filter(of))}return h}}function of(t){return t.length>1}function af(t,n){return((t=t.x)[0]<0?t[1]-Ka-Wa:Ka-t[1])-((n=n.x)[0]<0?n[1]-Ka-Wa:Ka-n[1])}var uf=rf(function(){return!0},function(t){var n,e=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),n=1},point:function(o,a){var u=o>0?Qa:-Qa,c=ru(o-e);ru(c-Qa)0?Ka:-Ka),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),t.point(o,r),n=0):i!==u&&c>=Qa&&(ru(e-i)Wa?iu((lu(n)*(o=au(r))*lu(e)-lu(r)*(i=au(n))*lu(t))/(i*o*a)):(n+r)/2}(e,r,o,a),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),n=0),t.point(e=o,r=a),i=u},lineEnd:function(){t.lineEnd(),e=r=NaN},clean:function(){return 2-n}}},function(t,n,e,r){var i;if(null==t)i=e*Ka,r.point(-Qa,i),r.point(0,i),r.point(Qa,i),r.point(Qa,0),r.point(Qa,-i),r.point(0,-i),r.point(-Qa,-i),r.point(-Qa,0),r.point(-Qa,i);else if(ru(t[0]-n[0])>Wa){var o=t[0]0,i=ru(n)>Wa;function o(t,e){return au(t)*au(e)>n}function a(t,e,r){var i=[1,0,0],o=Yu(Ou(t),Ou(e)),a=Bu(o,o),u=o[0],c=a-u*u;if(!c)return!r&&t;var f=n*a/c,s=-n*u/c,l=Yu(i,o),h=Iu(i,f);Fu(h,Iu(o,s));var d=l,p=Bu(h,d),v=Bu(d,d),g=p*p-v*(Bu(h,h)-1);if(!(g<0)){var y=du(g),_=Iu(d,(-p-y)/v);if(Fu(_,h),_=Uu(_),!r)return _;var b,m=t[0],x=e[0],w=t[1],M=e[1];x0^_[1]<(ru(_[0]-m)Qa^(m<=_[0]&&_[0]<=x)){var T=Iu(d,(-p+y)/v);return Fu(T,h),[_,Uu(T)]}}}function u(n,e){var i=r?t:Qa-t,o=0;return n<-i?o|=1:n>i&&(o|=2),e<-i?o|=4:e>i&&(o|=8),o}return rf(o,function(t){var n,e,c,f,s;return{lineStart:function(){f=c=!1,s=1},point:function(l,h){var d,p=[l,h],v=o(l,h),g=r?v?0:u(l,h):v?u(l+(l<0?Qa:-Qa),h):0;if(!n&&(f=c=v)&&t.lineStart(),v!==c&&(!(d=a(n,p))||Zc(n,d)||Zc(p,d))&&(p[0]+=Wa,p[1]+=Wa,v=o(p[0],p[1])),v!==c)s=0,v?(t.lineStart(),d=a(p,n),t.point(d[0],d[1])):(d=a(n,p),t.point(d[0],d[1]),t.lineEnd()),n=d;else if(i&&n&&r^v){var y;g&e||!(y=a(p,n,!0))||(s=0,r?(t.lineStart(),t.point(y[0][0],y[0][1]),t.point(y[1][0],y[1][1]),t.lineEnd()):(t.point(y[1][0],y[1][1]),t.lineEnd(),t.lineStart(),t.point(y[0][0],y[0][1])))}!v||n&&Zc(n,p)||t.point(p[0],p[1]),n=p,c=v,e=g},lineEnd:function(){c&&t.lineEnd(),n=null},clean:function(){return s|(f&&c)<<1}}},function(n,r,i,o){Vc(o,t,e,i,n,r)},r?[0,-t]:[-Qa,t-Qa])}var ff=1e9,sf=-ff;function lf(t,n,e,r){function i(i,o){return t<=i&&i<=e&&n<=o&&o<=r}function o(i,o,u,f){var s=0,l=0;if(null==i||(s=a(i,u))!==(l=a(o,u))||c(i,o)<0^u>0)do{f.point(0===s||3===s?t:e,s>1?r:n)}while((s=(s+u+4)%4)!==l);else f.point(o[0],o[1])}function a(r,i){return ru(r[0]-t)0?0:3:ru(r[0]-e)0?2:1:ru(r[1]-n)0?1:0:i>0?3:2}function u(t,n){return c(t.x,n.x)}function c(t,n){var e=a(t,1),r=a(n,1);return e!==r?e-r:0===e?n[1]-t[1]:1===e?t[0]-n[0]:2===e?t[1]-n[1]:n[0]-t[0]}return function(a){var c,f,s,l,h,d,p,v,g,y,_,b=a,m=Wc(),x={point:w,lineStart:function(){x.point=M,f&&f.push(s=[]);y=!0,g=!1,p=v=NaN},lineEnd:function(){c&&(M(l,h),d&&g&&m.rejoin(),c.push(m.result()));x.point=w,g&&b.lineEnd()},polygonStart:function(){b=m,c=[],f=[],_=!0},polygonEnd:function(){var n=function(){for(var n=0,e=0,i=f.length;er&&(h-o)*(r-a)>(d-a)*(t-o)&&++n:d<=r&&(h-o)*(r-a)<(d-a)*(t-o)&&--n;return n}(),e=_&&n,i=(c=T(c)).length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),o(null,null,1,a),a.lineEnd()),i&&Kc(c,u,n,o,a),a.polygonEnd());b=a,c=f=s=null}};function w(t,n){i(t,n)&&b.point(t,n)}function M(o,a){var u=i(o,a);if(f&&s.push([o,a]),y)l=o,h=a,d=u,y=!1,u&&(b.lineStart(),b.point(o,a));else if(u&&g)b.point(o,a);else{var c=[p=Math.max(sf,Math.min(ff,p)),v=Math.max(sf,Math.min(ff,v))],m=[o=Math.max(sf,Math.min(ff,o)),a=Math.max(sf,Math.min(ff,a))];!function(t,n,e,r,i,o){var a,u=t[0],c=t[1],f=0,s=1,l=n[0]-u,h=n[1]-c;if(a=e-u,l||!(a>0)){if(a/=l,l<0){if(a0){if(a>s)return;a>f&&(f=a)}if(a=i-u,l||!(a<0)){if(a/=l,l<0){if(a>s)return;a>f&&(f=a)}else if(l>0){if(a0)){if(a/=h,h<0){if(a0){if(a>s)return;a>f&&(f=a)}if(a=o-c,h||!(a<0)){if(a/=h,h<0){if(a>s)return;a>f&&(f=a)}else if(h>0){if(a0&&(t[0]=u+f*l,t[1]=c+f*h),s<1&&(n[0]=u+s*l,n[1]=c+s*h),!0}}}}}(c,m,t,n,e,r)?u&&(b.lineStart(),b.point(o,a),_=!1):(g||(b.lineStart(),b.point(c[0],c[1])),b.point(m[0],m[1]),u||b.lineEnd(),_=!1)}p=o,v=a,g=u}return x}}var hf,df,pf,vf=Xa(),gf={sphere:_u,point:_u,lineStart:function(){gf.point=_f,gf.lineEnd=yf},lineEnd:_u,polygonStart:_u,polygonEnd:_u};function yf(){gf.point=gf.lineEnd=_u}function _f(t,n){hf=t*=eu,df=lu(n*=eu),pf=au(n),gf.point=bf}function bf(t,n){t*=eu;var e=lu(n*=eu),r=au(n),i=ru(t-hf),o=au(i),a=r*lu(i),u=pf*e-df*r*o,c=df*e+pf*r*o;vf.add(ou(du(a*a+u*u),c)),hf=t,df=e,pf=r}function mf(t){return vf.reset(),Nu(t,gf),+vf}var xf=[null,null],wf={type:"LineString",coordinates:xf};function Mf(t,n){return xf[0]=t,xf[1]=n,mf(wf)}var Nf={Feature:function(t,n){return Tf(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r0&&(i=Mf(t[o],t[o-1]))>0&&e<=i&&r<=i&&(e+r-i)*(1-Math.pow((e-r)/i,2))Wa}).map(c)).concat(g(uu(o/d)*d,i,d).filter(function(t){return ru(t%v)>Wa}).map(f))}return _.lines=function(){return b().map(function(t){return{type:"LineString",coordinates:t}})},_.outline=function(){return{type:"Polygon",coordinates:[s(r).concat(l(a).slice(1),s(e).reverse().slice(1),l(u).reverse().slice(1))]}},_.extent=function(t){return arguments.length?_.extentMajor(t).extentMinor(t):_.extentMinor()},_.extentMajor=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],u=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),u>a&&(t=u,u=a,a=t),_.precision(y)):[[r,u],[e,a]]},_.extentMinor=function(e){return arguments.length?(n=+e[0][0],t=+e[1][0],o=+e[0][1],i=+e[1][1],n>t&&(e=n,n=t,t=e),o>i&&(e=o,o=i,i=e),_.precision(y)):[[n,o],[t,i]]},_.step=function(t){return arguments.length?_.stepMajor(t).stepMinor(t):_.stepMinor()},_.stepMajor=function(t){return arguments.length?(p=+t[0],v=+t[1],_):[p,v]},_.stepMinor=function(t){return arguments.length?(h=+t[0],d=+t[1],_):[h,d]},_.precision=function(h){return arguments.length?(y=+h,c=zf(o,i,90),f=Rf(n,t,y),s=zf(u,a,90),l=Rf(r,e,y),_):y},_.extentMajor([[-180,-90+Wa],[180,90-Wa]]).extentMinor([[-180,-80-Wa],[180,80+Wa]])}function qf(t){return t}var Lf,Uf,Of,Bf,Yf=Xa(),Ff=Xa(),If={point:_u,lineStart:_u,lineEnd:_u,polygonStart:function(){If.lineStart=Hf,If.lineEnd=Gf},polygonEnd:function(){If.lineStart=If.lineEnd=If.point=_u,Yf.add(ru(Ff)),Ff.reset()},result:function(){var t=Yf/2;return Yf.reset(),t}};function Hf(){If.point=jf}function jf(t,n){If.point=Xf,Lf=Of=t,Uf=Bf=n}function Xf(t,n){Ff.add(Bf*t-Of*n),Of=t,Bf=n}function Gf(){Xf(Lf,Uf)}var Vf=1/0,$f=Vf,Wf=-Vf,Zf=Wf,Qf={point:function(t,n){tWf&&(Wf=t);n<$f&&($f=n);n>Zf&&(Zf=n)},lineStart:_u,lineEnd:_u,polygonStart:_u,polygonEnd:_u,result:function(){var t=[[Vf,$f],[Wf,Zf]];return Wf=Zf=-($f=Vf=1/0),t}};var Kf,Jf,ts,ns,es=0,rs=0,is=0,os=0,as=0,us=0,cs=0,fs=0,ss=0,ls={point:hs,lineStart:ds,lineEnd:gs,polygonStart:function(){ls.lineStart=ys,ls.lineEnd=_s},polygonEnd:function(){ls.point=hs,ls.lineStart=ds,ls.lineEnd=gs},result:function(){var t=ss?[cs/ss,fs/ss]:us?[os/us,as/us]:is?[es/is,rs/is]:[NaN,NaN];return es=rs=is=os=as=us=cs=fs=ss=0,t}};function hs(t,n){es+=t,rs+=n,++is}function ds(){ls.point=ps}function ps(t,n){ls.point=vs,hs(ts=t,ns=n)}function vs(t,n){var e=t-ts,r=n-ns,i=du(e*e+r*r);os+=i*(ts+t)/2,as+=i*(ns+n)/2,us+=i,hs(ts=t,ns=n)}function gs(){ls.point=hs}function ys(){ls.point=bs}function _s(){ms(Kf,Jf)}function bs(t,n){ls.point=ms,hs(Kf=ts=t,Jf=ns=n)}function ms(t,n){var e=t-ts,r=n-ns,i=du(e*e+r*r);os+=i*(ts+t)/2,as+=i*(ns+n)/2,us+=i,cs+=(i=ns*t-ts*n)*(ts+t),fs+=i*(ns+n),ss+=3*i,hs(ts=t,ns=n)}function xs(t){this._context=t}xs.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,n){switch(this._point){case 0:this._context.moveTo(t,n),this._point=1;break;case 1:this._context.lineTo(t,n);break;default:this._context.moveTo(t+this._radius,n),this._context.arc(t,n,this._radius,0,tu)}},result:_u};var ws,Ms,Ns,As,Ts,Ss=Xa(),ks={point:_u,lineStart:function(){ks.point=Es},lineEnd:function(){ws&&Cs(Ms,Ns),ks.point=_u},polygonStart:function(){ws=!0},polygonEnd:function(){ws=null},result:function(){var t=+Ss;return Ss.reset(),t}};function Es(t,n){ks.point=Cs,Ms=As=t,Ns=Ts=n}function Cs(t,n){As-=t,Ts-=n,Ss.add(du(As*As+Ts*Ts)),As=t,Ts=n}function Ps(){this._string=[]}function zs(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function Rs(t){return function(n){var e=new Ds;for(var r in t)e[r]=t[r];return e.stream=n,e}}function Ds(){}function qs(t,n,e){var r=t.clipExtent&&t.clipExtent();return t.scale(150).translate([0,0]),null!=r&&t.clipExtent(null),Nu(e,t.stream(Qf)),n(Qf.result()),null!=r&&t.clipExtent(r),t}function Ls(t,n,e){return qs(t,function(e){var r=n[1][0]-n[0][0],i=n[1][1]-n[0][1],o=Math.min(r/(e[1][0]-e[0][0]),i/(e[1][1]-e[0][1])),a=+n[0][0]+(r-o*(e[1][0]+e[0][0]))/2,u=+n[0][1]+(i-o*(e[1][1]+e[0][1]))/2;t.scale(150*o).translate([a,u])},e)}function Us(t,n,e){return Ls(t,[[0,0],n],e)}function Os(t,n,e){return qs(t,function(e){var r=+n,i=r/(e[1][0]-e[0][0]),o=(r-i*(e[1][0]+e[0][0]))/2,a=-i*e[0][1];t.scale(150*i).translate([o,a])},e)}function Bs(t,n,e){return qs(t,function(e){var r=+n,i=r/(e[1][1]-e[0][1]),o=-i*e[0][0],a=(r-i*(e[1][1]+e[0][1]))/2;t.scale(150*i).translate([o,a])},e)}Ps.prototype={_radius:4.5,_circle:zs(4.5),pointRadius:function(t){return(t=+t)!==this._radius&&(this._radius=t,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push("Z"),this._point=NaN},point:function(t,n){switch(this._point){case 0:this._string.push("M",t,",",n),this._point=1;break;case 1:this._string.push("L",t,",",n);break;default:null==this._circle&&(this._circle=zs(this._radius)),this._string.push("M",t,",",n,this._circle)}},result:function(){if(this._string.length){var t=this._string.join("");return this._string=[],t}return null}},Ds.prototype={constructor:Ds,point:function(t,n){this.stream.point(t,n)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var Ys=16,Fs=au(30*eu);function Is(t,n){return+n?function(t,n){function e(r,i,o,a,u,c,f,s,l,h,d,p,v,g){var y=f-r,_=s-i,b=y*y+_*_;if(b>4*n&&v--){var m=a+h,x=u+d,w=c+p,M=du(m*m+x*x+w*w),N=gu(w/=M),A=ru(ru(w)-1)n||ru((y*E+_*C)/b-.5)>.3||a*h+u*d+c*p2?t[2]%360*eu:0,S()):[g*nu,y*nu,_*nu]},A.angle=function(t){return arguments.length?(b=t%360*eu,S()):b*nu},A.precision=function(t){return arguments.length?(a=Is(u,N=t*t),k()):du(N)},A.fitExtent=function(t,n){return Ls(A,t,n)},A.fitSize=function(t,n){return Us(A,t,n)},A.fitWidth=function(t,n){return Os(A,t,n)},A.fitHeight=function(t,n){return Bs(A,t,n)},function(){return n=t.apply(this,arguments),A.invert=n.invert&&T,S()}}function Vs(t){var n=0,e=Qa/3,r=Gs(t),i=r(n,e);return i.parallels=function(t){return arguments.length?r(n=t[0]*eu,e=t[1]*eu):[n*nu,e*nu]},i}function $s(t,n){var e=lu(t),r=(e+lu(n))/2;if(ru(r)0?n<-Ka+Wa&&(n=-Ka+Wa):n>Ka-Wa&&(n=Ka-Wa);var e=i/su(rl(n),r);return[e*lu(r*t),i-e*au(r*t)]}return o.invert=function(t,n){var e=i-n,o=hu(r)*du(t*t+e*e);return[ou(t,ru(e))/r*hu(e),2*iu(su(i/o,1/r))-Ka]},o}function ol(t,n){return[t,n]}function al(t,n){var e=au(t),r=t===n?lu(t):(e-au(n))/(n-t),i=e/r+t;if(ru(r)=0;)n+=e[r].value;else n=1;t.value=n}function Ml(t,n){var e,r,i,o,a,u=new Sl(t),c=+t.value&&(u.value=t.value),f=[u];for(null==n&&(n=Nl);e=f.pop();)if(c&&(e.value=+e.data.value),(i=n(e.data))&&(a=i.length))for(e.children=new Array(a),o=a-1;o>=0;--o)f.push(r=e.children[o]=new Sl(i[o])),r.parent=e,r.depth=e.depth+1;return u.eachBefore(Tl)}function Nl(t){return t.children}function Al(t){t.data=t.data.data}function Tl(t){var n=0;do{t.height=n}while((t=t.parent)&&t.height<++n)}function Sl(t){this.data=t,this.depth=this.height=0,this.parent=null}hl.invert=function(t,n){for(var e,r=n,i=r*r,o=i*i*i,a=0;a<12&&(o=(i=(r-=e=(r*(ul+cl*i+o*(fl+sl*i))-n)/(ul+3*cl*i+o*(7*fl+9*sl*i)))*r)*i*i,!(ru(e)Wa&&--i>0);return[t/(.8707+(o=r*r)*(o*(o*o*o*(.003971-.001529*o)-.013791)-.131979)),r]},gl.invert=Ks(gu),yl.invert=Ks(function(t){return 2*iu(t)}),_l.invert=function(t,n){return[-n,2*iu(cu(t))-Ka]},Sl.prototype=Ml.prototype={constructor:Sl,count:function(){return this.eachAfter(wl)},each:function(t){var n,e,r,i,o=this,a=[o];do{for(n=a.reverse(),a=[];o=n.pop();)if(t(o),e=o.children)for(r=0,i=e.length;r=0;--e)i.push(n[e]);return this},sum:function(t){return this.eachAfter(function(n){for(var e=+t(n.data)||0,r=n.children,i=r&&r.length;--i>=0;)e+=r[i].value;n.value=e})},sort:function(t){return this.eachBefore(function(n){n.children&&n.children.sort(t)})},path:function(t){for(var n=this,e=function(t,n){if(t===n)return t;var e=t.ancestors(),r=n.ancestors(),i=null;for(t=e.pop(),n=r.pop();t===n;)i=t,t=e.pop(),n=r.pop();return i}(n,t),r=[n];n!==e;)n=n.parent,r.push(n);for(var i=r.length;t!==e;)r.splice(i,0,t),t=t.parent;return r},ancestors:function(){for(var t=this,n=[t];t=t.parent;)n.push(t);return n},descendants:function(){var t=[];return this.each(function(n){t.push(n)}),t},leaves:function(){var t=[];return this.eachBefore(function(n){n.children||t.push(n)}),t},links:function(){var t=this,n=[];return t.each(function(e){e!==t&&n.push({source:e.parent,target:e})}),n},copy:function(){return Ml(this).eachBefore(Al)}};var kl=Array.prototype.slice;function El(t){for(var n,e,r=0,i=(t=function(t){for(var n,e,r=t.length;r;)e=Math.random()*r--|0,n=t[r],t[r]=t[e],t[e]=n;return t}(kl.call(t))).length,o=[];r0&&e*e>r*r+i*i}function Rl(t,n){for(var e=0;e(a*=a)?(r=(f+a-i)/(2*f),o=Math.sqrt(Math.max(0,a/f-r*r)),e.x=t.x-r*u-o*c,e.y=t.y-r*c+o*u):(r=(f+i-a)/(2*f),o=Math.sqrt(Math.max(0,i/f-r*r)),e.x=n.x+r*u-o*c,e.y=n.y+r*c+o*u)):(e.x=n.x+e.r,e.y=n.y)}function Ol(t,n){var e=t.r+n.r-1e-6,r=n.x-t.x,i=n.y-t.y;return e>0&&e*e>r*r+i*i}function Bl(t){var n=t._,e=t.next._,r=n.r+e.r,i=(n.x*e.r+e.x*n.r)/r,o=(n.y*e.r+e.y*n.r)/r;return i*i+o*o}function Yl(t){this._=t,this.next=null,this.previous=null}function Fl(t){if(!(i=t.length))return 0;var n,e,r,i,o,a,u,c,f,s,l;if((n=t[0]).x=0,n.y=0,!(i>1))return n.r;if(e=t[1],n.x=-e.r,e.x=n.r,e.y=0,!(i>2))return n.r+e.r;Ul(e,n,r=t[2]),n=new Yl(n),e=new Yl(e),r=new Yl(r),n.next=r.previous=e,e.next=n.previous=r,r.next=e.previous=n;t:for(u=3;uh&&(h=u),g=s*s*v,(d=Math.max(h/g,g/l))>p){s-=u;break}p=d}y.push(a={value:s,dice:c1?n:1)},e}(sh);var dh=function t(n){function e(t,e,r,i,o){if((a=t._squarify)&&a.ratio===n)for(var a,u,c,f,s,l=-1,h=a.length,d=t.value;++l1?n:1)},e}(sh);function ph(t,n,e){return(n[0]-t[0])*(e[1]-t[1])-(n[1]-t[1])*(e[0]-t[0])}function vh(t,n){return t[0]-n[0]||t[1]-n[1]}function gh(t){for(var n=t.length,e=[0,1],r=2,i=2;i1&&ph(t[e[r-2]],t[e[r-1]],t[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function yh(){return Math.random()}var _h=function t(n){function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,1===arguments.length?(e=t,t=0):e-=t,function(){return n()*e+t}}return e.source=t,e}(yh),bh=function t(n){function e(t,e){var r,i;return t=null==t?0:+t,e=null==e?1:+e,function(){var o;if(null!=r)o=r,r=null;else do{r=2*n()-1,o=2*n()-1,i=r*r+o*o}while(!i||i>1);return t+e*o*Math.sqrt(-2*Math.log(i)/i)}}return e.source=t,e}(yh),mh=function t(n){function e(){var t=bh.source(n).apply(this,arguments);return function(){return Math.exp(t())}}return e.source=t,e}(yh),xh=function t(n){function e(t){return function(){for(var e=0,r=0;rr&&(n=e,e=r,r=n),function(t){return Math.max(e,Math.min(r,t))}}function Uh(t,n,e){var r=t[0],i=t[1],o=n[0],a=n[1];return i2?Oh:Uh,i=o=null,l}function l(n){return isNaN(n=+n)?e:(i||(i=r(a.map(t),u,c)))(t(f(n)))}return l.invert=function(e){return f(n((o||(o=r(u,a.map(t),be)))(e)))},l.domain=function(t){return arguments.length?(a=Sh.call(t,zh),f===Dh||(f=Lh(a)),s()):a.slice()},l.range=function(t){return arguments.length?(u=kh.call(t),s()):u.slice()},l.rangeRound=function(t){return u=kh.call(t),c=Ae,s()},l.clamp=function(t){return arguments.length?(f=t?Lh(a):Dh,l):f!==Dh},l.interpolate=function(t){return arguments.length?(c=t,s()):c},l.unknown=function(t){return arguments.length?(e=t,l):e},function(e,r){return t=e,n=r,s()}}function Fh(t,n){return Yh()(t,n)}function Ih(n,e,r,i){var o,a=w(n,e,r);switch((i=za(null==i?",f":i)).type){case"s":var u=Math.max(Math.abs(n),Math.abs(e));return null!=i.precision||isNaN(o=Ha(a,u))||(i.precision=o),t.formatPrefix(i,u);case"":case"e":case"g":case"p":case"r":null!=i.precision||isNaN(o=ja(a,Math.max(Math.abs(n),Math.abs(e))))||(i.precision=o-("e"===i.type));break;case"f":case"%":null!=i.precision||isNaN(o=Ia(a))||(i.precision=o-2*("%"===i.type))}return t.format(i)}function Hh(t){var n=t.domain;return t.ticks=function(t){var e=n();return m(e[0],e[e.length-1],null==t?10:t)},t.tickFormat=function(t,e){var r=n();return Ih(r[0],r[r.length-1],null==t?10:t,e)},t.nice=function(e){null==e&&(e=10);var r,i=n(),o=0,a=i.length-1,u=i[o],c=i[a];return c0?r=x(u=Math.floor(u/r)*r,c=Math.ceil(c/r)*r,e):r<0&&(r=x(u=Math.ceil(u*r)/r,c=Math.floor(c*r)/r,e)),r>0?(i[o]=Math.floor(u/r)*r,i[a]=Math.ceil(c/r)*r,n(i)):r<0&&(i[o]=Math.ceil(u*r)/r,i[a]=Math.floor(c*r)/r,n(i)),t},t}function jh(t,n){var e,r=0,i=(t=t.slice()).length-1,o=t[r],a=t[i];return a0){for(;hc)break;v.push(l)}}else for(;h=1;--s)if(!((l=f*s)c)break;v.push(l)}}else v=m(h,d,Math.min(d-h,p)).map(r);return n?v.reverse():v},i.tickFormat=function(n,o){if(null==o&&(o=10===a?".0e":","),"function"!=typeof o&&(o=t.format(o)),n===1/0)return o;null==n&&(n=10);var u=Math.max(1,a*n/i.ticks().length);return function(t){var n=t/r(Math.round(e(t)));return n*a0))return u;do{u.push(a=new Date(+e)),n(e,o),t(e)}while(a=n)for(;t(n),!e(n);)n.setTime(n-1)},function(t,r){if(t>=t)if(r<0)for(;++r<=0;)for(;n(t,-1),!e(t););else for(;--r>=0;)for(;n(t,1),!e(t););})},e&&(i.count=function(n,r){return ad.setTime(+n),ud.setTime(+r),t(ad),t(ud),Math.floor(e(ad,ud))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(n){return r(n)%t==0}:function(n){return i.count(0,n)%t==0}):i:null}),i}var fd=cd(function(){},function(t,n){t.setTime(+t+n)},function(t,n){return n-t});fd.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?cd(function(n){n.setTime(Math.floor(n/t)*t)},function(n,e){n.setTime(+n+e*t)},function(n,e){return(e-n)/t}):fd:null};var sd=fd.range,ld=6e4,hd=6048e5,dd=cd(function(t){t.setTime(t-t.getMilliseconds())},function(t,n){t.setTime(+t+1e3*n)},function(t,n){return(n-t)/1e3},function(t){return t.getUTCSeconds()}),pd=dd.range,vd=cd(function(t){t.setTime(t-t.getMilliseconds()-1e3*t.getSeconds())},function(t,n){t.setTime(+t+n*ld)},function(t,n){return(n-t)/ld},function(t){return t.getMinutes()}),gd=vd.range,yd=cd(function(t){t.setTime(t-t.getMilliseconds()-1e3*t.getSeconds()-t.getMinutes()*ld)},function(t,n){t.setTime(+t+36e5*n)},function(t,n){return(n-t)/36e5},function(t){return t.getHours()}),_d=yd.range,bd=cd(function(t){t.setHours(0,0,0,0)},function(t,n){t.setDate(t.getDate()+n)},function(t,n){return(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*ld)/864e5},function(t){return t.getDate()-1}),md=bd.range;function xd(t){return cd(function(n){n.setDate(n.getDate()-(n.getDay()+7-t)%7),n.setHours(0,0,0,0)},function(t,n){t.setDate(t.getDate()+7*n)},function(t,n){return(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*ld)/hd})}var wd=xd(0),Md=xd(1),Nd=xd(2),Ad=xd(3),Td=xd(4),Sd=xd(5),kd=xd(6),Ed=wd.range,Cd=Md.range,Pd=Nd.range,zd=Ad.range,Rd=Td.range,Dd=Sd.range,qd=kd.range,Ld=cd(function(t){t.setDate(1),t.setHours(0,0,0,0)},function(t,n){t.setMonth(t.getMonth()+n)},function(t,n){return n.getMonth()-t.getMonth()+12*(n.getFullYear()-t.getFullYear())},function(t){return t.getMonth()}),Ud=Ld.range,Od=cd(function(t){t.setMonth(0,1),t.setHours(0,0,0,0)},function(t,n){t.setFullYear(t.getFullYear()+n)},function(t,n){return n.getFullYear()-t.getFullYear()},function(t){return t.getFullYear()});Od.every=function(t){return isFinite(t=Math.floor(t))&&t>0?cd(function(n){n.setFullYear(Math.floor(n.getFullYear()/t)*t),n.setMonth(0,1),n.setHours(0,0,0,0)},function(n,e){n.setFullYear(n.getFullYear()+e*t)}):null};var Bd=Od.range,Yd=cd(function(t){t.setUTCSeconds(0,0)},function(t,n){t.setTime(+t+n*ld)},function(t,n){return(n-t)/ld},function(t){return t.getUTCMinutes()}),Fd=Yd.range,Id=cd(function(t){t.setUTCMinutes(0,0,0)},function(t,n){t.setTime(+t+36e5*n)},function(t,n){return(n-t)/36e5},function(t){return t.getUTCHours()}),Hd=Id.range,jd=cd(function(t){t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCDate(t.getUTCDate()+n)},function(t,n){return(n-t)/864e5},function(t){return t.getUTCDate()-1}),Xd=jd.range;function Gd(t){return cd(function(n){n.setUTCDate(n.getUTCDate()-(n.getUTCDay()+7-t)%7),n.setUTCHours(0,0,0,0)},function(t,n){t.setUTCDate(t.getUTCDate()+7*n)},function(t,n){return(n-t)/hd})}var Vd=Gd(0),$d=Gd(1),Wd=Gd(2),Zd=Gd(3),Qd=Gd(4),Kd=Gd(5),Jd=Gd(6),tp=Vd.range,np=$d.range,ep=Wd.range,rp=Zd.range,ip=Qd.range,op=Kd.range,ap=Jd.range,up=cd(function(t){t.setUTCDate(1),t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCMonth(t.getUTCMonth()+n)},function(t,n){return n.getUTCMonth()-t.getUTCMonth()+12*(n.getUTCFullYear()-t.getUTCFullYear())},function(t){return t.getUTCMonth()}),cp=up.range,fp=cd(function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCFullYear(t.getUTCFullYear()+n)},function(t,n){return n.getUTCFullYear()-t.getUTCFullYear()},function(t){return t.getUTCFullYear()});fp.every=function(t){return isFinite(t=Math.floor(t))&&t>0?cd(function(n){n.setUTCFullYear(Math.floor(n.getUTCFullYear()/t)*t),n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0)},function(n,e){n.setUTCFullYear(n.getUTCFullYear()+e*t)}):null};var sp=fp.range;function lp(t){if(0<=t.y&&t.y<100){var n=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return n.setFullYear(t.y),n}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function hp(t){if(0<=t.y&&t.y<100){var n=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return n.setUTCFullYear(t.y),n}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function dp(t){return{y:t,m:0,d:1,H:0,M:0,S:0,L:0}}function pp(t){var n=t.dateTime,e=t.date,r=t.time,i=t.periods,o=t.days,a=t.shortDays,u=t.months,c=t.shortMonths,f=wp(i),s=Mp(i),l=wp(o),h=Mp(o),d=wp(a),p=Mp(a),v=wp(u),g=Mp(u),y=wp(c),_=Mp(c),b={a:function(t){return a[t.getDay()]},A:function(t){return o[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return u[t.getMonth()]},c:null,d:Hp,e:Hp,f:$p,H:jp,I:Xp,j:Gp,L:Vp,m:Wp,M:Zp,p:function(t){return i[+(t.getHours()>=12)]},Q:Nv,s:Av,S:Qp,u:Kp,U:Jp,V:tv,w:nv,W:ev,x:null,X:null,y:rv,Y:iv,Z:ov,"%":Mv},m={a:function(t){return a[t.getUTCDay()]},A:function(t){return o[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return u[t.getUTCMonth()]},c:null,d:av,e:av,f:lv,H:uv,I:cv,j:fv,L:sv,m:hv,M:dv,p:function(t){return i[+(t.getUTCHours()>=12)]},Q:Nv,s:Av,S:pv,u:vv,U:gv,V:yv,w:_v,W:bv,x:null,X:null,y:mv,Y:xv,Z:wv,"%":Mv},x={a:function(t,n,e){var r=d.exec(n.slice(e));return r?(t.w=p[r[0].toLowerCase()],e+r[0].length):-1},A:function(t,n,e){var r=l.exec(n.slice(e));return r?(t.w=h[r[0].toLowerCase()],e+r[0].length):-1},b:function(t,n,e){var r=y.exec(n.slice(e));return r?(t.m=_[r[0].toLowerCase()],e+r[0].length):-1},B:function(t,n,e){var r=v.exec(n.slice(e));return r?(t.m=g[r[0].toLowerCase()],e+r[0].length):-1},c:function(t,e,r){return N(t,n,e,r)},d:Rp,e:Rp,f:Bp,H:qp,I:qp,j:Dp,L:Op,m:zp,M:Lp,p:function(t,n,e){var r=f.exec(n.slice(e));return r?(t.p=s[r[0].toLowerCase()],e+r[0].length):-1},Q:Fp,s:Ip,S:Up,u:Ap,U:Tp,V:Sp,w:Np,W:kp,x:function(t,n,r){return N(t,e,n,r)},X:function(t,n,e){return N(t,r,n,e)},y:Cp,Y:Ep,Z:Pp,"%":Yp};function w(t,n){return function(e){var r,i,o,a=[],u=-1,c=0,f=t.length;for(e instanceof Date||(e=new Date(+e));++u53)return null;"w"in o||(o.w=1),"Z"in o?(i=(r=hp(dp(o.y))).getUTCDay(),r=i>4||0===i?$d.ceil(r):$d(r),r=jd.offset(r,7*(o.V-1)),o.y=r.getUTCFullYear(),o.m=r.getUTCMonth(),o.d=r.getUTCDate()+(o.w+6)%7):(i=(r=n(dp(o.y))).getDay(),r=i>4||0===i?Md.ceil(r):Md(r),r=bd.offset(r,7*(o.V-1)),o.y=r.getFullYear(),o.m=r.getMonth(),o.d=r.getDate()+(o.w+6)%7)}else("W"in o||"U"in o)&&("w"in o||(o.w="u"in o?o.u%7:"W"in o?1:0),i="Z"in o?hp(dp(o.y)).getUTCDay():n(dp(o.y)).getDay(),o.m=0,o.d="W"in o?(o.w+6)%7+7*o.W-(i+5)%7:o.w+7*o.U-(i+6)%7);return"Z"in o?(o.H+=o.Z/100|0,o.M+=o.Z%100,hp(o)):n(o)}}function N(t,n,e,r){for(var i,o,a=0,u=n.length,c=e.length;a=c)return-1;if(37===(i=n.charCodeAt(a++))){if(i=n.charAt(a++),!(o=x[i in gp?n.charAt(a++):i])||(r=o(t,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}return b.x=w(e,b),b.X=w(r,b),b.c=w(n,b),m.x=w(e,m),m.X=w(r,m),m.c=w(n,m),{format:function(t){var n=w(t+="",b);return n.toString=function(){return t},n},parse:function(t){var n=M(t+="",lp);return n.toString=function(){return t},n},utcFormat:function(t){var n=w(t+="",m);return n.toString=function(){return t},n},utcParse:function(t){var n=M(t,hp);return n.toString=function(){return t},n}}}var vp,gp={"-":"",_:" ",0:"0"},yp=/^\s*\d+/,_p=/^%/,bp=/[\\^$*+?|[\]().{}]/g;function mp(t,n,e){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length;return r+(o68?1900:2e3),e+r[0].length):-1}function Pp(t,n,e){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(n.slice(e,e+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),e+r[0].length):-1}function zp(t,n,e){var r=yp.exec(n.slice(e,e+2));return r?(t.m=r[0]-1,e+r[0].length):-1}function Rp(t,n,e){var r=yp.exec(n.slice(e,e+2));return r?(t.d=+r[0],e+r[0].length):-1}function Dp(t,n,e){var r=yp.exec(n.slice(e,e+3));return r?(t.m=0,t.d=+r[0],e+r[0].length):-1}function qp(t,n,e){var r=yp.exec(n.slice(e,e+2));return r?(t.H=+r[0],e+r[0].length):-1}function Lp(t,n,e){var r=yp.exec(n.slice(e,e+2));return r?(t.M=+r[0],e+r[0].length):-1}function Up(t,n,e){var r=yp.exec(n.slice(e,e+2));return r?(t.S=+r[0],e+r[0].length):-1}function Op(t,n,e){var r=yp.exec(n.slice(e,e+3));return r?(t.L=+r[0],e+r[0].length):-1}function Bp(t,n,e){var r=yp.exec(n.slice(e,e+6));return r?(t.L=Math.floor(r[0]/1e3),e+r[0].length):-1}function Yp(t,n,e){var r=_p.exec(n.slice(e,e+1));return r?e+r[0].length:-1}function Fp(t,n,e){var r=yp.exec(n.slice(e));return r?(t.Q=+r[0],e+r[0].length):-1}function Ip(t,n,e){var r=yp.exec(n.slice(e));return r?(t.Q=1e3*+r[0],e+r[0].length):-1}function Hp(t,n){return mp(t.getDate(),n,2)}function jp(t,n){return mp(t.getHours(),n,2)}function Xp(t,n){return mp(t.getHours()%12||12,n,2)}function Gp(t,n){return mp(1+bd.count(Od(t),t),n,3)}function Vp(t,n){return mp(t.getMilliseconds(),n,3)}function $p(t,n){return Vp(t,n)+"000"}function Wp(t,n){return mp(t.getMonth()+1,n,2)}function Zp(t,n){return mp(t.getMinutes(),n,2)}function Qp(t,n){return mp(t.getSeconds(),n,2)}function Kp(t){var n=t.getDay();return 0===n?7:n}function Jp(t,n){return mp(wd.count(Od(t),t),n,2)}function tv(t,n){var e=t.getDay();return t=e>=4||0===e?Td(t):Td.ceil(t),mp(Td.count(Od(t),t)+(4===Od(t).getDay()),n,2)}function nv(t){return t.getDay()}function ev(t,n){return mp(Md.count(Od(t),t),n,2)}function rv(t,n){return mp(t.getFullYear()%100,n,2)}function iv(t,n){return mp(t.getFullYear()%1e4,n,4)}function ov(t){var n=t.getTimezoneOffset();return(n>0?"-":(n*=-1,"+"))+mp(n/60|0,"0",2)+mp(n%60,"0",2)}function av(t,n){return mp(t.getUTCDate(),n,2)}function uv(t,n){return mp(t.getUTCHours(),n,2)}function cv(t,n){return mp(t.getUTCHours()%12||12,n,2)}function fv(t,n){return mp(1+jd.count(fp(t),t),n,3)}function sv(t,n){return mp(t.getUTCMilliseconds(),n,3)}function lv(t,n){return sv(t,n)+"000"}function hv(t,n){return mp(t.getUTCMonth()+1,n,2)}function dv(t,n){return mp(t.getUTCMinutes(),n,2)}function pv(t,n){return mp(t.getUTCSeconds(),n,2)}function vv(t){var n=t.getUTCDay();return 0===n?7:n}function gv(t,n){return mp(Vd.count(fp(t),t),n,2)}function yv(t,n){var e=t.getUTCDay();return t=e>=4||0===e?Qd(t):Qd.ceil(t),mp(Qd.count(fp(t),t)+(4===fp(t).getUTCDay()),n,2)}function _v(t){return t.getUTCDay()}function bv(t,n){return mp($d.count(fp(t),t),n,2)}function mv(t,n){return mp(t.getUTCFullYear()%100,n,2)}function xv(t,n){return mp(t.getUTCFullYear()%1e4,n,4)}function wv(){return"+0000"}function Mv(){return"%"}function Nv(t){return+t}function Av(t){return Math.floor(+t/1e3)}function Tv(n){return vp=pp(n),t.timeFormat=vp.format,t.timeParse=vp.parse,t.utcFormat=vp.utcFormat,t.utcParse=vp.utcParse,vp}Tv({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var Sv=Date.prototype.toISOString?function(t){return t.toISOString()}:t.utcFormat("%Y-%m-%dT%H:%M:%S.%LZ");var kv=+new Date("2000-01-01T00:00:00.000Z")?function(t){var n=new Date(t);return isNaN(n)?null:n}:t.utcParse("%Y-%m-%dT%H:%M:%S.%LZ"),Ev=1e3,Cv=60*Ev,Pv=60*Cv,zv=24*Pv,Rv=7*zv,Dv=30*zv,qv=365*zv;function Lv(t){return new Date(t)}function Uv(t){return t instanceof Date?+t:+new Date(+t)}function Ov(t,n,r,i,o,a,u,c,f){var s=Fh(Dh,Dh),l=s.invert,h=s.domain,d=f(".%L"),p=f(":%S"),v=f("%I:%M"),g=f("%I %p"),y=f("%a %d"),_=f("%b %d"),b=f("%B"),m=f("%Y"),x=[[u,1,Ev],[u,5,5*Ev],[u,15,15*Ev],[u,30,30*Ev],[a,1,Cv],[a,5,5*Cv],[a,15,15*Cv],[a,30,30*Cv],[o,1,Pv],[o,3,3*Pv],[o,6,6*Pv],[o,12,12*Pv],[i,1,zv],[i,2,2*zv],[r,1,Rv],[n,1,Dv],[n,3,3*Dv],[t,1,qv]];function M(e){return(u(e)=1?Ny:t<=-1?-Ny:Math.asin(t)}function Sy(t){return t.innerRadius}function ky(t){return t.outerRadius}function Ey(t){return t.startAngle}function Cy(t){return t.endAngle}function Py(t){return t&&t.padAngle}function zy(t,n,e,r,i,o,a){var u=t-e,c=n-r,f=(a?o:-o)/xy(u*u+c*c),s=f*c,l=-f*u,h=t+s,d=n+l,p=e+s,v=r+l,g=(h+p)/2,y=(d+v)/2,_=p-h,b=v-d,m=_*_+b*b,x=i-o,w=h*v-p*d,M=(b<0?-1:1)*xy(_y(0,x*x*m-w*w)),N=(w*b-_*M)/m,A=(-w*_-b*M)/m,T=(w*b+_*M)/m,S=(-w*_+b*M)/m,k=N-g,E=A-y,C=T-g,P=S-y;return k*k+E*E>C*C+P*P&&(N=T,A=S),{cx:N,cy:A,x01:-s,y01:-l,x11:N*(i/x-1),y11:A*(i/x-1)}}function Ry(t){this._context=t}function Dy(t){return new Ry(t)}function qy(t){return t[0]}function Ly(t){return t[1]}function Uy(){var t=qy,n=Ly,e=py(!0),r=null,i=Dy,o=null;function a(a){var u,c,f,s=a.length,l=!1;for(null==r&&(o=i(f=to())),u=0;u<=s;++u)!(u=s;--l)u.point(g[l],y[l]);u.lineEnd(),u.areaEnd()}v&&(g[f]=+t(h,f,c),y[f]=+e(h,f,c),u.point(n?+n(h,f,c):g[f],r?+r(h,f,c):y[f]))}if(d)return u=null,d+""||null}function f(){return Uy().defined(i).curve(a).context(o)}return c.x=function(e){return arguments.length?(t="function"==typeof e?e:py(+e),n=null,c):t},c.x0=function(n){return arguments.length?(t="function"==typeof n?n:py(+n),c):t},c.x1=function(t){return arguments.length?(n=null==t?null:"function"==typeof t?t:py(+t),c):n},c.y=function(t){return arguments.length?(e="function"==typeof t?t:py(+t),r=null,c):e},c.y0=function(t){return arguments.length?(e="function"==typeof t?t:py(+t),c):e},c.y1=function(t){return arguments.length?(r=null==t?null:"function"==typeof t?t:py(+t),c):r},c.lineX0=c.lineY0=function(){return f().x(t).y(e)},c.lineY1=function(){return f().x(t).y(r)},c.lineX1=function(){return f().x(n).y(e)},c.defined=function(t){return arguments.length?(i="function"==typeof t?t:py(!!t),c):i},c.curve=function(t){return arguments.length?(a=t,null!=o&&(u=a(o)),c):a},c.context=function(t){return arguments.length?(null==t?o=u=null:u=a(o=t),c):o},c}function By(t,n){return nt?1:n>=t?0:NaN}function Yy(t){return t}Ry.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:this._context.lineTo(t,n)}}};var Fy=Hy(Dy);function Iy(t){this._curve=t}function Hy(t){function n(n){return new Iy(t(n))}return n._curve=t,n}function jy(t){var n=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?n(Hy(t)):n()._curve},t}function Xy(){return jy(Uy().curve(Fy))}function Gy(){var t=Oy().curve(Fy),n=t.curve,e=t.lineX0,r=t.lineX1,i=t.lineY0,o=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return jy(e())},delete t.lineX0,t.lineEndAngle=function(){return jy(r())},delete t.lineX1,t.lineInnerRadius=function(){return jy(i())},delete t.lineY0,t.lineOuterRadius=function(){return jy(o())},delete t.lineY1,t.curve=function(t){return arguments.length?n(Hy(t)):n()._curve},t}function Vy(t,n){return[(n=+n)*Math.cos(t-=Math.PI/2),n*Math.sin(t)]}Iy.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,n){this._curve.point(n*Math.sin(t),n*-Math.cos(t))}};var $y=Array.prototype.slice;function Wy(t){return t.source}function Zy(t){return t.target}function Qy(t){var n=Wy,e=Zy,r=qy,i=Ly,o=null;function a(){var a,u=$y.call(arguments),c=n.apply(this,u),f=e.apply(this,u);if(o||(o=a=to()),t(o,+r.apply(this,(u[0]=c,u)),+i.apply(this,u),+r.apply(this,(u[0]=f,u)),+i.apply(this,u)),a)return o=null,a+""||null}return a.source=function(t){return arguments.length?(n=t,a):n},a.target=function(t){return arguments.length?(e=t,a):e},a.x=function(t){return arguments.length?(r="function"==typeof t?t:py(+t),a):r},a.y=function(t){return arguments.length?(i="function"==typeof t?t:py(+t),a):i},a.context=function(t){return arguments.length?(o=null==t?null:t,a):o},a}function Ky(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n=(n+r)/2,e,n,i,r,i)}function Jy(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n,e=(e+i)/2,r,e,r,i)}function t_(t,n,e,r,i){var o=Vy(n,e),a=Vy(n,e=(e+i)/2),u=Vy(r,e),c=Vy(r,i);t.moveTo(o[0],o[1]),t.bezierCurveTo(a[0],a[1],u[0],u[1],c[0],c[1])}var n_={draw:function(t,n){var e=Math.sqrt(n/My);t.moveTo(e,0),t.arc(0,0,e,0,Ay)}},e_={draw:function(t,n){var e=Math.sqrt(n/5)/2;t.moveTo(-3*e,-e),t.lineTo(-e,-e),t.lineTo(-e,-3*e),t.lineTo(e,-3*e),t.lineTo(e,-e),t.lineTo(3*e,-e),t.lineTo(3*e,e),t.lineTo(e,e),t.lineTo(e,3*e),t.lineTo(-e,3*e),t.lineTo(-e,e),t.lineTo(-3*e,e),t.closePath()}},r_=Math.sqrt(1/3),i_=2*r_,o_={draw:function(t,n){var e=Math.sqrt(n/i_),r=e*r_;t.moveTo(0,-e),t.lineTo(r,0),t.lineTo(0,e),t.lineTo(-r,0),t.closePath()}},a_=Math.sin(My/10)/Math.sin(7*My/10),u_=Math.sin(Ay/10)*a_,c_=-Math.cos(Ay/10)*a_,f_={draw:function(t,n){var e=Math.sqrt(.8908130915292852*n),r=u_*e,i=c_*e;t.moveTo(0,-e),t.lineTo(r,i);for(var o=1;o<5;++o){var a=Ay*o/5,u=Math.cos(a),c=Math.sin(a);t.lineTo(c*e,-u*e),t.lineTo(u*r-c*i,c*r+u*i)}t.closePath()}},s_={draw:function(t,n){var e=Math.sqrt(n),r=-e/2;t.rect(r,r,e,e)}},l_=Math.sqrt(3),h_={draw:function(t,n){var e=-Math.sqrt(n/(3*l_));t.moveTo(0,2*e),t.lineTo(-l_*e,-e),t.lineTo(l_*e,-e),t.closePath()}},d_=Math.sqrt(3)/2,p_=1/Math.sqrt(12),v_=3*(p_/2+1),g_={draw:function(t,n){var e=Math.sqrt(n/v_),r=e/2,i=e*p_,o=r,a=e*p_+e,u=-o,c=a;t.moveTo(r,i),t.lineTo(o,a),t.lineTo(u,c),t.lineTo(-.5*r-d_*i,d_*r+-.5*i),t.lineTo(-.5*o-d_*a,d_*o+-.5*a),t.lineTo(-.5*u-d_*c,d_*u+-.5*c),t.lineTo(-.5*r+d_*i,-.5*i-d_*r),t.lineTo(-.5*o+d_*a,-.5*a-d_*o),t.lineTo(-.5*u+d_*c,-.5*c-d_*u),t.closePath()}},y_=[n_,e_,o_,s_,f_,h_,g_];function __(){}function b_(t,n,e){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+n)/6,(t._y0+4*t._y1+e)/6)}function m_(t){this._context=t}function x_(t){this._context=t}function w_(t){this._context=t}function M_(t,n){this._basis=new m_(t),this._beta=n}m_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:b_(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:b_(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},x_.prototype={areaStart:__,areaEnd:__,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x2=t,this._y2=n;break;case 1:this._point=2,this._x3=t,this._y3=n;break;case 2:this._point=3,this._x4=t,this._y4=n,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+n)/6);break;default:b_(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},w_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var e=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+n)/6;this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break;case 3:this._point=4;default:b_(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},M_.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,n=this._y,e=t.length-1;if(e>0)for(var r,i=t[0],o=n[0],a=t[e]-i,u=n[e]-o,c=-1;++c<=e;)r=c/e,this._basis.point(this._beta*t[c]+(1-this._beta)*(i+r*a),this._beta*n[c]+(1-this._beta)*(o+r*u));this._x=this._y=null,this._basis.lineEnd()},point:function(t,n){this._x.push(+t),this._y.push(+n)}};var N_=function t(n){function e(t){return 1===n?new m_(t):new M_(t,n)}return e.beta=function(n){return t(+n)},e}(.85);function A_(t,n,e){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-n),t._y2+t._k*(t._y1-e),t._x2,t._y2)}function T_(t,n){this._context=t,this._k=(1-n)/6}T_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:A_(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2,this._x1=t,this._y1=n;break;case 2:this._point=3;default:A_(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var S_=function t(n){function e(t){return new T_(t,n)}return e.tension=function(n){return t(+n)},e}(0);function k_(t,n){this._context=t,this._k=(1-n)/6}k_.prototype={areaStart:__,areaEnd:__,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:A_(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var E_=function t(n){function e(t){return new k_(t,n)}return e.tension=function(n){return t(+n)},e}(0);function C_(t,n){this._context=t,this._k=(1-n)/6}C_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:A_(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var P_=function t(n){function e(t){return new C_(t,n)}return e.tension=function(n){return t(+n)},e}(0);function z_(t,n,e){var r=t._x1,i=t._y1,o=t._x2,a=t._y2;if(t._l01_a>wy){var u=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*u-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*u-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>wy){var f=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,s=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*f+t._x1*t._l23_2a-n*t._l12_2a)/s,a=(a*f+t._y1*t._l23_2a-e*t._l12_2a)/s}t._context.bezierCurveTo(r,i,o,a,t._x2,t._y2)}function R_(t,n){this._context=t,this._alpha=n}R_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;default:z_(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var D_=function t(n){function e(t){return n?new R_(t,n):new T_(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function q_(t,n){this._context=t,this._alpha=n}q_.prototype={areaStart:__,areaEnd:__,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:z_(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var L_=function t(n){function e(t){return n?new q_(t,n):new k_(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function U_(t,n){this._context=t,this._alpha=n}U_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:z_(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var O_=function t(n){function e(t){return n?new U_(t,n):new C_(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function B_(t){this._context=t}function Y_(t){return t<0?-1:1}function F_(t,n,e){var r=t._x1-t._x0,i=n-t._x1,o=(t._y1-t._y0)/(r||i<0&&-0),a=(e-t._y1)/(i||r<0&&-0),u=(o*i+a*r)/(r+i);return(Y_(o)+Y_(a))*Math.min(Math.abs(o),Math.abs(a),.5*Math.abs(u))||0}function I_(t,n){var e=t._x1-t._x0;return e?(3*(t._y1-t._y0)/e-n)/2:n}function H_(t,n,e){var r=t._x0,i=t._y0,o=t._x1,a=t._y1,u=(o-r)/3;t._context.bezierCurveTo(r+u,i+u*n,o-u,a-u*e,o,a)}function j_(t){this._context=t}function X_(t){this._context=new G_(t)}function G_(t){this._context=t}function V_(t){this._context=t}function $_(t){var n,e,r=t.length-1,i=new Array(r),o=new Array(r),a=new Array(r);for(i[0]=0,o[0]=2,a[0]=t[0]+2*t[1],n=1;n=0;--n)i[n]=(a[n]-i[n+1])/o[n];for(o[r-1]=(t[r]+i[r-1])/2,n=0;n1)for(var e,r,i,o=1,a=t[n[0]],u=a.length;o=0;)e[n]=n;return e}function K_(t,n){return t[n]}function J_(t){var n=t.map(tb);return Q_(t).sort(function(t,e){return n[t]-n[e]})}function tb(t){for(var n,e=-1,r=0,i=t.length,o=-1/0;++eo&&(o=n,r=e);return r}function nb(t){var n=t.map(eb);return Q_(t).sort(function(t,e){return n[t]-n[e]})}function eb(t){for(var n,e=0,r=-1,i=t.length;++r0)){if(o/=h,h<0){if(o0){if(o>l)return;o>s&&(s=o)}if(o=r-c,h||!(o<0)){if(o/=h,h<0){if(o>l)return;o>s&&(s=o)}else if(h>0){if(o0)){if(o/=d,d<0){if(o0){if(o>l)return;o>s&&(s=o)}if(o=i-f,d||!(o<0)){if(o/=d,d<0){if(o>l)return;o>s&&(s=o)}else if(d>0){if(o0||l<1)||(s>0&&(t[0]=[c+s*h,f+s*d]),l<1&&(t[1]=[c+l*h,f+l*d]),!0)}}}}}function vb(t,n,e,r,i){var o=t[1];if(o)return!0;var a,u,c=t[0],f=t.left,s=t.right,l=f[0],h=f[1],d=s[0],p=s[1],v=(l+d)/2,g=(h+p)/2;if(p===h){if(v=r)return;if(l>d){if(c){if(c[1]>=i)return}else c=[v,e];o=[v,i]}else{if(c){if(c[1]1)if(l>d){if(c){if(c[1]>=i)return}else c=[(e-u)/a,e];o=[(i-u)/a,i]}else{if(c){if(c[1]=r)return}else c=[n,a*n+u];o=[r,a*r+u]}else{if(c){if(c[0]=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,n),this._context.lineTo(t,n);else{var e=this._x*(1-this._t)+t*this._t;this._context.lineTo(e,this._y),this._context.lineTo(e,n)}}this._x=t,this._y=n}},ab.prototype={constructor:ab,insert:function(t,n){var e,r,i;if(t){if(n.P=t,n.N=t.N,t.N&&(t.N.P=n),t.N=n,t.R){for(t=t.R;t.L;)t=t.L;t.L=n}else t.R=n;e=t}else this._?(t=sb(this._),n.P=null,n.N=t,t.P=t.L=n,e=t):(n.P=n.N=null,this._=n,e=null);for(n.L=n.R=null,n.U=e,n.C=!0,t=n;e&&e.C;)e===(r=e.U).L?(i=r.R)&&i.C?(e.C=i.C=!1,r.C=!0,t=r):(t===e.R&&(cb(this,e),e=(t=e).U),e.C=!1,r.C=!0,fb(this,r)):(i=r.L)&&i.C?(e.C=i.C=!1,r.C=!0,t=r):(t===e.L&&(fb(this,e),e=(t=e).U),e.C=!1,r.C=!0,cb(this,r)),e=t.U;this._.C=!1},remove:function(t){t.N&&(t.N.P=t.P),t.P&&(t.P.N=t.N),t.N=t.P=null;var n,e,r,i=t.U,o=t.L,a=t.R;if(e=o?a?sb(a):o:a,i?i.L===t?i.L=e:i.R=e:this._=e,o&&a?(r=e.C,e.C=t.C,e.L=o,o.U=e,e!==a?(i=e.U,e.U=t.U,t=e.R,i.L=t,e.R=a,a.U=e):(e.U=i,i=e,t=e.R)):(r=t.C,t=e),t&&(t.U=i),!r)if(t&&t.C)t.C=!1;else{do{if(t===this._)break;if(t===i.L){if((n=i.R).C&&(n.C=!1,i.C=!0,cb(this,i),n=i.R),n.L&&n.L.C||n.R&&n.R.C){n.R&&n.R.C||(n.L.C=!1,n.C=!0,fb(this,n),n=i.R),n.C=i.C,i.C=n.R.C=!1,cb(this,i),t=this._;break}}else if((n=i.L).C&&(n.C=!1,i.C=!0,fb(this,i),n=i.L),n.L&&n.L.C||n.R&&n.R.C){n.L&&n.L.C||(n.R.C=!1,n.C=!0,cb(this,n),n=i.L),n.C=i.C,i.C=n.L.C=!1,fb(this,i),t=this._;break}n.C=!0,t=i,i=i.U}while(!t.C);t&&(t.C=!1)}}};var bb,mb=[];function xb(){ub(this),this.x=this.y=this.arc=this.site=this.cy=null}function wb(t){var n=t.P,e=t.N;if(n&&e){var r=n.site,i=t.site,o=e.site;if(r!==o){var a=i[0],u=i[1],c=r[0]-a,f=r[1]-u,s=o[0]-a,l=o[1]-u,h=2*(c*l-f*s);if(!(h>=-Ub)){var d=c*c+f*f,p=s*s+l*l,v=(l*d-f*p)/h,g=(c*p-s*d)/h,y=mb.pop()||new xb;y.arc=t,y.site=i,y.x=v+a,y.y=(y.cy=g+u)+Math.sqrt(v*v+g*g),t.circle=y;for(var _=null,b=Db._;b;)if(y.yLb)u=u.L;else{if(!((i=o-Pb(u,a))>Lb)){r>-Lb?(n=u.P,e=u):i>-Lb?(n=u,e=u.N):n=e=u;break}if(!u.R){n=u;break}u=u.R}!function(t){Rb[t.index]={site:t,halfedges:[]}}(t);var c=Tb(t);if(zb.insert(n,c),n||e){if(n===e)return Mb(n),e=Tb(n.site),zb.insert(c,e),c.edge=e.edge=lb(n.site,c.site),wb(n),void wb(e);if(e){Mb(n),Mb(e);var f=n.site,s=f[0],l=f[1],h=t[0]-s,d=t[1]-l,p=e.site,v=p[0]-s,g=p[1]-l,y=2*(h*g-d*v),_=h*h+d*d,b=v*v+g*g,m=[(g*_-d*b)/y+s,(h*b-v*_)/y+l];db(e.edge,f,p,m),c.edge=lb(f,t,null,m),e.edge=lb(t,p,null,m),wb(n),wb(e)}else c.edge=lb(n.site,c.site)}}function Cb(t,n){var e=t.site,r=e[0],i=e[1],o=i-n;if(!o)return r;var a=t.P;if(!a)return-1/0;var u=(e=a.site)[0],c=e[1],f=c-n;if(!f)return u;var s=u-r,l=1/o-1/f,h=s/f;return l?(-h+Math.sqrt(h*h-2*l*(s*s/(-2*f)-c+f/2+i-o/2)))/l+r:(r+u)/2}function Pb(t,n){var e=t.N;if(e)return Cb(e,n);var r=t.site;return r[1]===n?r[0]:1/0}var zb,Rb,Db,qb,Lb=1e-6,Ub=1e-12;function Ob(t,n,e){return(t[0]-e[0])*(n[1]-t[1])-(t[0]-n[0])*(e[1]-t[1])}function Bb(t,n){return n[1]-t[1]||n[0]-t[0]}function Yb(t,n){var e,r,i,o=t.sort(Bb).pop();for(qb=[],Rb=new Array(t.length),zb=new ab,Db=new ab;;)if(i=bb,o&&(!i||o[1]Lb||Math.abs(i[0][1]-i[1][1])>Lb)||delete qb[o]}(a,u,c,f),function(t,n,e,r){var i,o,a,u,c,f,s,l,h,d,p,v,g=Rb.length,y=!0;for(i=0;iLb||Math.abs(v-h)>Lb)&&(c.splice(u,0,qb.push(hb(a,d,Math.abs(p-t)Lb?[t,Math.abs(l-t)Lb?[Math.abs(h-r)Lb?[e,Math.abs(l-e)Lb?[Math.abs(h-n)=u)return null;var c=t-i.site[0],f=n-i.site[1],s=c*c+f*f;do{i=o.cells[r=a],a=null,i.halfedges.forEach(function(e){var r=o.edges[e],u=r.left;if(u!==i.site&&u||(u=r.right)){var c=t-u[0],f=n-u[1],l=c*c+f*f;lr?(r+i)/2:Math.min(0,r)||Math.max(0,i),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}Xb.prototype=Hb.prototype,t.FormatSpecifier=Ra,t.active=function(t,n){var e,r,i=t.__transition;if(i)for(r in n=null==n?null:n+"",i)if((e=i[r]).state>mr&&e.name===n)return new Lr([[t]],gi,n,+r);return null},t.arc=function(){var t=Sy,n=ky,e=py(0),r=null,i=Ey,o=Cy,a=Py,u=null;function c(){var c,f,s=+t.apply(this,arguments),l=+n.apply(this,arguments),h=i.apply(this,arguments)-Ny,d=o.apply(this,arguments)-Ny,p=vy(d-h),v=d>h;if(u||(u=c=to()),lwy)if(p>Ay-wy)u.moveTo(l*yy(h),l*my(h)),u.arc(0,0,l,h,d,!v),s>wy&&(u.moveTo(s*yy(d),s*my(d)),u.arc(0,0,s,d,h,v));else{var g,y,_=h,b=d,m=h,x=d,w=p,M=p,N=a.apply(this,arguments)/2,A=N>wy&&(r?+r.apply(this,arguments):xy(s*s+l*l)),T=by(vy(l-s)/2,+e.apply(this,arguments)),S=T,k=T;if(A>wy){var E=Ty(A/s*my(N)),C=Ty(A/l*my(N));(w-=2*E)>wy?(m+=E*=v?1:-1,x-=E):(w=0,m=x=(h+d)/2),(M-=2*C)>wy?(_+=C*=v?1:-1,b-=C):(M=0,_=b=(h+d)/2)}var P=l*yy(_),z=l*my(_),R=s*yy(x),D=s*my(x);if(T>wy){var q,L=l*yy(b),U=l*my(b),O=s*yy(m),B=s*my(m);if(p1?0:t<-1?My:Math.acos(t)}((Y*I+F*H)/(xy(Y*Y+F*F)*xy(I*I+H*H)))/2),X=xy(q[0]*q[0]+q[1]*q[1]);S=by(T,(s-X)/(j-1)),k=by(T,(l-X)/(j+1))}}M>wy?k>wy?(g=zy(O,B,P,z,l,k,v),y=zy(L,U,R,D,l,k,v),u.moveTo(g.cx+g.x01,g.cy+g.y01),kwy&&w>wy?S>wy?(g=zy(R,D,L,U,s,-S,v),y=zy(P,z,O,B,s,-S,v),u.lineTo(g.cx+g.x01,g.cy+g.y01),S>a,f=i+2*u>>a,s=_o(20);function l(r){var i=new Float32Array(c*f),l=new Float32Array(c*f);r.forEach(function(r,o,s){var l=+t(r,o,s)+u>>a,h=+n(r,o,s)+u>>a,d=+e(r,o,s);l>=0&&l=0&&h>a),To({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a),Ao({width:c,height:f,data:i},{width:c,height:f,data:l},o>>a),To({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a),Ao({width:c,height:f,data:i},{width:c,height:f,data:l},o>>a),To({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a);var d=s(i);if(!Array.isArray(d)){var p=A(i);d=w(0,p,d),(d=g(0,Math.floor(p/d)*d,d)).shift()}return No().thresholds(d).size([c,f])(i).map(h)}function h(t){return t.value*=Math.pow(2,-2*a),t.coordinates.forEach(d),t}function d(t){t.forEach(p)}function p(t){t.forEach(v)}function v(t){t[0]=t[0]*Math.pow(2,a)-u,t[1]=t[1]*Math.pow(2,a)-u}function y(){return c=r+2*(u=3*o)>>a,f=i+2*u>>a,l}return l.x=function(n){return arguments.length?(t="function"==typeof n?n:_o(+n),l):t},l.y=function(t){return arguments.length?(n="function"==typeof t?t:_o(+t),l):n},l.weight=function(t){return arguments.length?(e="function"==typeof t?t:_o(+t),l):e},l.size=function(t){if(!arguments.length)return[r,i];var n=Math.ceil(t[0]),e=Math.ceil(t[1]);if(!(n>=0||n>=0))throw new Error("invalid size");return r=n,i=e,y()},l.cellSize=function(t){if(!arguments.length)return 1<=1))throw new Error("invalid cell size");return a=Math.floor(Math.log(t)/Math.LN2),y()},l.thresholds=function(t){return arguments.length?(s="function"==typeof t?t:Array.isArray(t)?_o(go.call(t)):_o(t),l):s},l.bandwidth=function(t){if(!arguments.length)return Math.sqrt(o*(o+1));if(!((t=+t)>=0))throw new Error("invalid bandwidth");return o=Math.round((Math.sqrt(4*t*t+1)-1)/2),y()},l},t.contours=No,t.create=function(t){return Rt(Z(t).call(document.documentElement))},t.creator=Z,t.cross=function(t,n,e){var r,i,o,u,c=t.length,f=n.length,s=new Array(c*f);for(null==e&&(e=a),r=o=0;rt?1:n>=t?0:NaN},t.deviation=f,t.dispatch=I,t.drag=function(){var n,e,r,i,o=Vt,a=$t,u=Wt,c=Zt,f={},s=I("start","drag","end"),l=0,h=0;function d(t){t.on("mousedown.drag",p).filter(c).on("touchstart.drag",y).on("touchmove.drag",_).on("touchend.drag touchcancel.drag",b).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function p(){if(!i&&o.apply(this,arguments)){var u=m("mouse",a.apply(this,arguments),Bt,this,arguments);u&&(Rt(t.event.view).on("mousemove.drag",v,!0).on("mouseup.drag",g,!0),Ht(t.event.view),Ft(),r=!1,n=t.event.clientX,e=t.event.clientY,u("start"))}}function v(){if(It(),!r){var i=t.event.clientX-n,o=t.event.clientY-e;r=i*i+o*o>h}f.mouse("drag")}function g(){Rt(t.event.view).on("mousemove.drag mouseup.drag",null),jt(t.event.view,r),It(),f.mouse("end")}function y(){if(o.apply(this,arguments)){var n,e,r=t.event.changedTouches,i=a.apply(this,arguments),u=r.length;for(n=0;nc+d||if+d||ou.index){var p=c-a.x-a.vx,v=f-a.y-a.vy,g=p*p+v*v;gt.r&&(t.r=t[n].r)}function u(){if(n){var r,i,o=n.length;for(e=new Array(o),r=0;r=a)){(t.data!==n||t.next)&&(0===s&&(d+=(s=la())*s),0===l&&(d+=(l=la())*l),d1?(null==e?u.remove(t):u.set(t,d(e)),n):u.get(t)},find:function(n,e,r){var i,o,a,u,c,f=0,s=t.length;for(null==r?r=1/0:r*=r,f=0;f1?(f.on(t,e),n):f.on(t)}}},t.forceX=function(t){var n,e,r,i=sa(.1);function o(t){for(var i,o=0,a=n.length;o=.12&&i<.234&&r>=-.425&&r<-.214?u:i>=.166&&i<.234&&r>=-.214&&r<-.115?c:a).invert(t)},s.stream=function(e){return t&&n===e?t:(r=[a.stream(n=e),u.stream(e),c.stream(e)],i=r.length,t={point:function(t,n){for(var e=-1;++eAc(r[0],r[1])&&(r[1]=i[1]),Ac(i[0],r[1])>Ac(r[0],r[1])&&(r[0]=i[0])):o.push(r=i);for(a=-1/0,n=0,r=o[e=o.length-1];n<=e;r=i,++n)i=o[n],(u=Ac(r[1],i[0]))>a&&(a=u,ju=i[0],Gu=r[1])}return Ku=Ju=null,ju===1/0||Xu===1/0?[[NaN,NaN],[NaN,NaN]]:[[ju,Xu],[Gu,Vu]]},t.geoCentroid=function(t){tc=nc=ec=rc=ic=oc=ac=uc=cc=fc=sc=0,Nu(t,kc);var n=cc,e=fc,r=sc,i=n*n+e*e+r*r;return i2?t[2]+90:90]):[(t=e())[0],t[1],t[2]-90]},e([0,0,90]).scale(159.155)},t.geoTransverseMercatorRaw=_l,t.gray=function(t,n){return new Yn(t,0,0,null==n?1:n)},t.hcl=Gn,t.hierarchy=Ml,t.histogram=function(){var t=v,n=s,e=M;function r(r){var o,a,u=r.length,c=new Array(u);for(o=0;ol;)h.pop(),--d;var p,v=new Array(d+1);for(o=0;o<=d;++o)(p=v[o]=[]).x0=o>0?h[o-1]:s,p.x1=o1)&&(t-=Math.floor(t));var n=Math.abs(t-.5);return oy.h=360*t-100,oy.s=1.5-1.5*n,oy.l=.8-.9*n,oy+""},t.interpolateRdBu=lg,t.interpolateRdGy=dg,t.interpolateRdPu=qg,t.interpolateRdYlBu=vg,t.interpolateRdYlGn=yg,t.interpolateReds=Jg,t.interpolateRgb=de,t.interpolateRgbBasis=ve,t.interpolateRgbBasisClosed=ge,t.interpolateRound=Ae,t.interpolateSinebow=function(t){var n;return t=(.5-t)*Math.PI,ay.r=255*(n=Math.sin(t))*n,ay.g=255*(n=Math.sin(t+uy))*n,ay.b=255*(n=Math.sin(t+cy))*n,ay+""},t.interpolateSpectral=bg,t.interpolateString=Me,t.interpolateTransformCss=De,t.interpolateTransformSvg=qe,t.interpolateTurbo=function(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(34.61+t*(1172.33-t*(10793.56-t*(33300.12-t*(38394.49-14825.05*t)))))))+", "+Math.max(0,Math.min(255,Math.round(23.31+t*(557.33+t*(1225.33-t*(3574.96-t*(1073.77+707.56*t)))))))+", "+Math.max(0,Math.min(255,Math.round(27.2+t*(3211.1-t*(15327.97-t*(27814-t*(22569.18-6838.66*t)))))))+")"},t.interpolateViridis=sy,t.interpolateWarm=ry,t.interpolateYlGn=Bg,t.interpolateYlGnBu=Ug,t.interpolateYlOrBr=Fg,t.interpolateYlOrRd=Hg,t.interpolateZoom=Fe,t.interrupt=Cr,t.interval=function(t,n,e){var r=new sr,i=n;return null==n?(r.restart(t,n,e),r):(n=+n,e=null==e?cr():+e,r.restart(function o(a){a+=i,r.restart(o,i+=n,e),t(a)},n,e),r)},t.isoFormat=Sv,t.isoParse=kv,t.json=function(t,n){return fetch(t,n).then(oa)},t.keys=function(t){var n=[];for(var e in t)n.push(e);return n},t.lab=Bn,t.lch=function(t,n,e,r){return 1===arguments.length?Xn(t):new Vn(e,n,t,null==r?1:r)},t.line=Uy,t.lineRadial=Xy,t.linkHorizontal=function(){return Qy(Ky)},t.linkRadial=function(){var t=Qy(t_);return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t},t.linkVertical=function(){return Qy(Jy)},t.local=qt,t.map=uo,t.matcher=nt,t.max=A,t.mean=function(t,n){var e,r=t.length,i=r,o=-1,a=0;if(null==n)for(;++o=r.length)return null!=t&&e.sort(t),null!=n?n(e):e;for(var c,f,s,l=-1,h=e.length,d=r[i++],p=uo(),v=a();++lr.length)return e;var a,u=i[o-1];return null!=n&&o>=r.length?a=e.entries():(a=[],e.each(function(n,e){a.push({key:e,values:t(n,o)})})),null!=u?a.sort(function(t,n){return u(t.key,n.key)}):a}(o(t,0,so,lo),0)},key:function(t){return r.push(t),e},sortKeys:function(t){return i[r.length-1]=t,e},sortValues:function(n){return t=n,e},rollup:function(t){return n=t,e}}},t.now=cr,t.pack=function(){var t=null,n=1,e=1,r=jl;function i(i){return i.x=n/2,i.y=e/2,t?i.eachBefore(Vl(t)).eachAfter($l(r,.5)).eachBefore(Wl(1)):i.eachBefore(Vl(Gl)).eachAfter($l(jl,1)).eachAfter($l(r,i.r/Math.min(n,e))).eachBefore(Wl(Math.min(n,e)/(2*i.r))),i}return i.radius=function(n){return arguments.length?(t=Il(n),i):t},i.size=function(t){return arguments.length?(n=+t[0],e=+t[1],i):[n,e]},i.padding=function(t){return arguments.length?(r="function"==typeof t?t:Xl(+t),i):r},i},t.packEnclose=El,t.packSiblings=function(t){return Fl(t),t},t.pairs=function(t,n){null==n&&(n=a);for(var e=0,r=t.length-1,i=t[0],o=new Array(r<0?0:r);e0&&(d+=l);for(null!=n?p.sort(function(t,e){return n(v[t],v[e])}):null!=e&&p.sort(function(t,n){return e(a[t],a[n])}),u=0,f=d?(y-h*b)/d:0;u0?l*f:0)+b,v[c]={data:a[c],index:u,value:l,startAngle:g,endAngle:s,padAngle:_};return v}return a.value=function(n){return arguments.length?(t="function"==typeof n?n:py(+n),a):t},a.sortValues=function(t){return arguments.length?(n=t,e=null,a):n},a.sort=function(t){return arguments.length?(e=t,n=null,a):e},a.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:py(+t),a):r},a.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:py(+t),a):i},a.padAngle=function(t){return arguments.length?(o="function"==typeof t?t:py(+t),a):o},a},t.piecewise=function(t,n){for(var e=0,r=n.length-1,i=n[0],o=new Array(r<0?0:r);eu!=f>u&&a<(c-e)*(u-r)/(f-r)+e&&(s=!s),c=e,f=r;return s},t.polygonHull=function(t){if((e=t.length)<3)return null;var n,e,r=new Array(e),i=new Array(e);for(n=0;n=0;--n)f.push(t[r[o[n]][2]]);for(n=+u;n0?a[n-1]:r[0],n=o?[a[o-1],r]:[a[n-1],a[n]]},c.unknown=function(t){return arguments.length?(n=t,c):c},c.thresholds=function(){return a.slice()},c.copy=function(){return t().domain([e,r]).range(u).unknown(n)},Nh.apply(Hh(c),arguments)},t.scaleSequential=function t(){var n=Hh(Bv()(Dh));return n.copy=function(){return Yv(n,t())},Ah.apply(n,arguments)},t.scaleSequentialLog=function t(){var n=Qh(Bv()).domain([1,10]);return n.copy=function(){return Yv(n,t()).base(n.base())},Ah.apply(n,arguments)},t.scaleSequentialPow=Fv,t.scaleSequentialQuantile=function t(){var e=[],r=Dh;function o(t){if(!isNaN(t=+t))return r((i(e,t)-1)/(e.length-1))}return o.domain=function(t){if(!arguments.length)return e.slice();e=[];for(var r,i=0,a=t.length;i0)for(var e,r,i,o,a,u,c=0,f=t[n[0]].length;c=0?(r[0]=o,r[1]=o+=i):i<0?(r[1]=a,r[0]=a+=i):r[0]=o},t.stackOffsetExpand=function(t,n){if((r=t.length)>0){for(var e,r,i,o=0,a=t[0].length;o0){for(var e,r=0,i=t[n[0]],o=i.length;r0&&(r=(e=t[n[0]]).length)>0){for(var e,r,i,o=0,a=1;a0)throw new Error("cycle");return o}return e.id=function(n){return arguments.length?(t=Hl(n),e):t},e.parentId=function(t){return arguments.length?(n=Hl(t),e):n},e},t.style=ft,t.sum=function(t,n){var e,r=t.length,i=-1,o=0;if(null==n)for(;++i=0;--i)u.push(e=n.children[i]=new ch(r[i],i)),e.parent=n;return(a.parent=new ch(null,0)).children=[a],a}(i);if(c.eachAfter(o),c.parent.m=-c.z,c.eachBefore(a),r)i.eachBefore(u);else{var f=i,s=i,l=i;i.eachBefore(function(t){t.xs.x&&(s=t),t.depth>l.depth&&(l=t)});var h=f===s?1:t(f,s)/2,d=h-f.x,p=n/(s.x+h+d),v=e/(l.depth||1);i.eachBefore(function(t){t.x=(t.x+d)*p,t.y=t.depth*v})}return i}function o(n){var e=n.children,r=n.parent.children,i=n.i?r[n.i-1]:null;if(e){!function(t){for(var n,e=0,r=0,i=t.children,o=i.length;--o>=0;)(n=i[o]).z+=e,n.m+=e,e+=n.s+(r+=n.c)}(n);var o=(e[0].z+e[e.length-1].z)/2;i?(n.z=i.z+t(n._,i._),n.m=n.z-o):n.z=o}else i&&(n.z=i.z+t(n._,i._));n.parent.A=function(n,e,r){if(e){for(var i,o=n,a=n,u=e,c=o.parent.children[0],f=o.m,s=a.m,l=u.m,h=c.m;u=oh(u),o=ih(o),u&&o;)c=ih(c),(a=oh(a)).a=n,(i=u.z+l-o.z-f+t(u._,o._))>0&&(ah(uh(u,n,r),n,i),f+=i,s+=i),l+=u.m,f+=o.m,h+=c.m,s+=a.m;u&&!oh(a)&&(a.t=u,a.m+=l-s),o&&!ih(c)&&(c.t=o,c.m+=f-h,r=n)}return r}(n,i,n.parent.A||r[0])}function a(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function u(t){t.x*=n,t.y=t.depth*e}return i.separation=function(n){return arguments.length?(t=n,i):t},i.size=function(t){return arguments.length?(r=!1,n=+t[0],e=+t[1],i):r?null:[n,e]},i.nodeSize=function(t){return arguments.length?(r=!0,n=+t[0],e=+t[1],i):r?[n,e]:null},i},t.treemap=function(){var t=hh,n=!1,e=1,r=1,i=[0],o=jl,a=jl,u=jl,c=jl,f=jl;function s(t){return t.x0=t.y0=0,t.x1=e,t.y1=r,t.eachBefore(l),i=[0],n&&t.eachBefore(Zl),t}function l(n){var e=i[n.depth],r=n.x0+e,s=n.y0+e,l=n.x1-e,h=n.y1-e;l=e-1){var s=u[n];return s.x0=i,s.y0=o,s.x1=a,void(s.y1=c)}for(var l=f[n],h=r/2+l,d=n+1,p=e-1;d>>1;f[v]c-o){var _=(i*y+a*g)/r;t(n,d,g,i,o,_,c),t(d,e,y,_,o,a,c)}else{var b=(o*y+c*g)/r;t(n,d,g,i,o,a,b),t(d,e,y,i,b,a,c)}}(0,c,t.value,n,e,r,i)},t.treemapDice=Ql,t.treemapResquarify=dh,t.treemapSlice=fh,t.treemapSliceDice=function(t,n,e,r,i){(1&t.depth?fh:Ql)(t,n,e,r,i)},t.treemapSquarify=hh,t.tsv=ia,t.tsvFormat=Wo,t.tsvFormatBody=Zo,t.tsvFormatRows=Qo,t.tsvParse=Vo,t.tsvParseRows=$o,t.utcDay=jd,t.utcDays=Xd,t.utcFriday=Kd,t.utcFridays=op,t.utcHour=Id,t.utcHours=Hd,t.utcMillisecond=fd,t.utcMilliseconds=sd,t.utcMinute=Yd,t.utcMinutes=Fd,t.utcMonday=$d,t.utcMondays=np,t.utcMonth=up,t.utcMonths=cp,t.utcSaturday=Jd,t.utcSaturdays=ap,t.utcSecond=dd,t.utcSeconds=pd,t.utcSunday=Vd,t.utcSundays=tp,t.utcThursday=Qd,t.utcThursdays=ip,t.utcTuesday=Wd,t.utcTuesdays=ep,t.utcWednesday=Zd,t.utcWednesdays=rp,t.utcWeek=Vd,t.utcWeeks=tp,t.utcYear=fp,t.utcYears=sp,t.values=function(t){var n=[];for(var e in t)n.push(t[e]);return n},t.variance=c,t.version="5.12.0",t.voronoi=function(){var t=ib,n=ob,e=null;function r(r){return new Yb(r.map(function(e,i){var o=[Math.round(t(e,i,r)/Lb)*Lb,Math.round(n(e,i,r)/Lb)*Lb];return o.index=i,o.data=e,o}),e)}return r.polygons=function(t){return r(t).polygons()},r.links=function(t){return r(t).links()},r.triangles=function(t){return r(t).triangles()},r.x=function(n){return arguments.length?(t="function"==typeof n?n:rb(+n),r):t},r.y=function(t){return arguments.length?(n="function"==typeof t?t:rb(+t),r):n},r.extent=function(t){return arguments.length?(e=null==t?null:[[+t[0][0],+t[0][1]],[+t[1][0],+t[1][1]]],r):e&&[[e[0][0],e[0][1]],[e[1][0],e[1][1]]]},r.size=function(t){return arguments.length?(e=null==t?null:[[0,0],[+t[0],+t[1]]],r):e&&[e[1][0]-e[0][0],e[1][1]-e[0][1]]},r},t.window=ct,t.xml=ua,t.zip=function(){return k(arguments)},t.zoom=function(){var n,e,r=$b,i=Wb,o=Jb,a=Qb,u=Kb,c=[0,1/0],f=[[-1/0,-1/0],[1/0,1/0]],s=250,l=Fe,h=I("start","zoom","end"),d=500,p=150,v=0;function g(t){t.property("__zoom",Zb).on("wheel.zoom",M).on("mousedown.zoom",N).on("dblclick.zoom",A).filter(u).on("touchstart.zoom",T).on("touchmove.zoom",S).on("touchend.zoom touchcancel.zoom",k).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function y(t,n){return(n=Math.max(c[0],Math.min(c[1],n)))===t.k?t:new Hb(n,t.x,t.y)}function _(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i===t.y?t:new Hb(t.k,r,i)}function b(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function m(t,n,e){t.on("start.zoom",function(){x(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){x(this,arguments).end()}).tween("zoom",function(){var t=this,r=arguments,o=x(t,r),a=i.apply(t,r),u=null==e?b(a):"function"==typeof e?e.apply(t,r):e,c=Math.max(a[1][0]-a[0][0],a[1][1]-a[0][1]),f=t.__zoom,s="function"==typeof n?n.apply(t,r):n,h=l(f.invert(u).concat(c/f.k),s.invert(u).concat(c/s.k));return function(t){if(1===t)t=s;else{var n=h(t),e=c/n[2];t=new Hb(e,u[0]-n[0]*e,u[1]-n[1]*e)}o.zoom(null,t)}})}function x(t,n,e){return!e&&t.__zooming||new w(t,n)}function w(t,n){this.that=t,this.args=n,this.active=0,this.extent=i.apply(t,n),this.taps=0}function M(){if(r.apply(this,arguments)){var t=x(this,arguments),n=this.__zoom,e=Math.max(c[0],Math.min(c[1],n.k*Math.pow(2,a.apply(this,arguments)))),i=Bt(this);if(t.wheel)t.mouse[0][0]===i[0]&&t.mouse[0][1]===i[1]||(t.mouse[1]=n.invert(t.mouse[0]=i)),clearTimeout(t.wheel);else{if(n.k===e)return;t.mouse=[i,n.invert(i)],Cr(this),t.start()}Vb(),t.wheel=setTimeout(function(){t.wheel=null,t.end()},p),t.zoom("mouse",o(_(y(n,e),t.mouse[0],t.mouse[1]),t.extent,f))}}function N(){if(!e&&r.apply(this,arguments)){var n=x(this,arguments,!0),i=Rt(t.event.view).on("mousemove.zoom",function(){if(Vb(),!n.moved){var e=t.event.clientX-u,r=t.event.clientY-c;n.moved=e*e+r*r>v}n.zoom("mouse",o(_(n.that.__zoom,n.mouse[0]=Bt(n.that),n.mouse[1]),n.extent,f))},!0).on("mouseup.zoom",function(){i.on("mousemove.zoom mouseup.zoom",null),jt(t.event.view,n.moved),Vb(),n.end()},!0),a=Bt(this),u=t.event.clientX,c=t.event.clientY;Ht(t.event.view),Gb(),n.mouse=[a,this.__zoom.invert(a)],Cr(this),n.start()}}function A(){if(r.apply(this,arguments)){var n=this.__zoom,e=Bt(this),a=n.invert(e),u=n.k*(t.event.shiftKey?.5:2),c=o(_(y(n,u),e,a),i.apply(this,arguments),f);Vb(),s>0?Rt(this).transition().duration(s).call(m,c,e):Rt(this).call(g.transform,c)}}function T(){if(r.apply(this,arguments)){var e,i,o,a,u=t.event.touches,c=u.length,f=x(this,arguments,t.event.changedTouches.length===c);for(Gb(),i=0;i=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a); -}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}}),r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var _a,ab=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?_a:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),_a={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ab[b]||r.find.attr;ab[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ab[g],ab[g]=e,e=null!=c(a,b,d)?g:null,ab[g]=f),e}});var bb=/^(?:input|select|textarea|button)$/i,cb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function db(a){var b=a.match(L)||[];return b.join(" ")}function eb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,eb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,eb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,eb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=eb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+db(eb(c))+" ").indexOf(b)>-1)return!0;return!1}});var fb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(fb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:db(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var gb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!gb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,gb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var hb=/\[\]$/,ib=/\r?\n/g,jb=/^(?:submit|button|image|reset|file)$/i,kb=/^(?:input|select|textarea|keygen)/i;function lb(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||hb.test(a)?d(a,e):lb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d); -});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)lb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)lb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&kb.test(this.nodeName)&&!jb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ib,"\r\n")}}):{name:b.name,value:c.replace(ib,"\r\n")}}).get()}}),r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="
",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var mb=a.jQuery,nb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=nb),b&&a.jQuery===r&&(a.jQuery=mb),r},b||(a.jQuery=a.$=r),r}); diff --git a/pkg/ui/v1alpha3/frontend/public/scripts/mode-xml.js b/pkg/ui/v1alpha3/frontend/public/scripts/mode-xml.js deleted file mode 100644 index 709c38bf526..00000000000 --- a/pkg/ui/v1alpha3/frontend/public/scripts/mode-xml.js +++ /dev/null @@ -1,8 +0,0 @@ -ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.start.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:"",next:"start"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.end.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|(",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:t},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e&&e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getSelectionRange().start,a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=a.getCurrentTokenColumn()+f.value.length;if(o.column/.test(r.getLine(o.row).slice(o.column)))return;while(!u(f,"tag-name")){f=a.stepBackward();if(f.value=="<"){f=a.stepForward();break}}var h=a.getCurrentTokenRow(),p=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var d=f.value;h==o.row&&(d=d.substring(0,o.column-p));if(this.voidElements.hasOwnProperty(d.toLowerCase()))return;return{text:">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value==="-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":this.getCommentFoldWidget(e,n)},this.getCommentFoldWidget=function(e,t){return/comment/.test(e.getState(t))&&/";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return this.getCommentFoldWidget(e,n)&&e.getCommentFoldRange(n,e.getLine(n).length);var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column"},this.createWorker=function(e){var t=new f(["ace"],"ace/mode/xml_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/xml"}.call(l.prototype),t.Mode=l}); (function() { - ace.require(["ace/mode/xml"], function(m) { - if (typeof module == "object" && typeof exports == "object" && module) { - module.exports = m; - } - }); - })(); - \ No newline at end of file diff --git a/pkg/ui/v1alpha3/frontend/public/scripts/popper.min.js b/pkg/ui/v1alpha3/frontend/public/scripts/popper.min.js deleted file mode 100644 index 0f20d2a8959..00000000000 --- a/pkg/ui/v1alpha3/frontend/public/scripts/popper.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/* - Copyright (C) Federico Zivolo 2017 - Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). - */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:e?e.ownerDocument.documentElement:document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var l=a.commonAncestorContainer;if(e!==l&&t!==l||i.contains(n))return p(l)?l:r(l);var f=s(e);return f.host?d(f.host,t):d(e,s(t).host)}function a(e){var t=1=o.clientWidth&&i>=o.clientHeight}),l=0i[e]&&!t.escapeWithReference&&(n=_(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=X,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var i;if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var n=o.element;if('string'==typeof n){if(n=e.instance.popper.querySelector(n),!n)return e;}else if(!e.instance.popper.contains(n))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',g=a?'bottom':'right',u=L(n)[l];d[g]-us[g]&&(e.offsets.popper[m]+=d[m]+u-s[g]),e.offsets.popper=c(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=J(_(s[l]-u,v),0),e.arrowElement=n,e.offsets.arrow=(i={},pe(i,m,Math.round(v)),pe(i,h,''),i),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(k(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=y(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=x(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case le.FLIP:p=[i,n];break;case le.CLOCKWISE:p=q(i);break;case le.COUNTERCLOCKWISE:p=q(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=x(i);var a=e.offsets.popper,l=e.offsets.reference,f=X,m='left'===i&&f(a.right)>f(l.left)||'right'===i&&f(a.left)f(l.top)||'bottom'===i&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,w=-1!==['top','bottom'].indexOf(i),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),y&&(r=K(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=C(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[o]-(s?n[p?'width':'height']:0),e.placement=x(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.right":">",'"':""","'":"'","`":"`"},P=h.invert(L),W=function(r){var t=function(n){return r[n]},n="(?:"+h.keys(r).join("|")+")",e=RegExp(n),u=RegExp(n,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};h.escape=W(L),h.unescape=W(P),h.result=function(n,r,t){h.isArray(r)||(r=[r]);var e=r.length;if(!e)return h.isFunction(t)?t.call(n):t;for(var u=0;u/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var J=/(.)^/,U={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},V=/\\|'|\r|\n|\u2028|\u2029/g,$=function(n){return"\\"+U[n]};h.template=function(i,n,r){!n&&r&&(n=r),n=h.defaults({},n,h.templateSettings);var t,e=RegExp([(n.escape||J).source,(n.interpolate||J).source,(n.evaluate||J).source].join("|")+"|$","g"),o=0,a="__p+='";i.replace(e,function(n,r,t,e,u){return a+=i.slice(o,u).replace(V,$),o=u+n.length,r?a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":t?a+="'+\n((__t=("+t+"))==null?'':__t)+\n'":e&&(a+="';\n"+e+"\n__p+='"),n}),a+="';\n",n.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{t=new Function(n.variable||"obj","_",a)}catch(n){throw n.source=a,n}var u=function(n){return t.call(this,n,h)},c=n.variable||"obj";return u.source="function("+c+"){\n"+a+"}",u},h.chain=function(n){var r=h(n);return r._chain=!0,r};var G=function(n,r){return n._chain?h(r).chain():r};h.mixin=function(t){return h.each(h.functions(t),function(n){var r=h[n]=t[n];h.prototype[n]=function(){var n=[this._wrapped];return u.apply(n,arguments),G(this,r.apply(h,n))}}),h},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(r){var t=e[r];h.prototype[r]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==r&&"splice"!==r||0!==n.length||delete n[0],G(this,n)}}),h.each(["concat","join","slice"],function(n){var r=e[n];h.prototype[n]=function(){return G(this,r.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},h.prototype.valueOf=h.prototype.toJSON=h.prototype.value,h.prototype.toString=function(){return String(this._wrapped)},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}(); \ No newline at end of file diff --git a/pkg/ui/v1alpha3/frontend/public/scripts/viz.js b/pkg/ui/v1alpha3/frontend/public/scripts/viz.js deleted file mode 100644 index dcea5d4d2e6..00000000000 --- a/pkg/ui/v1alpha3/frontend/public/scripts/viz.js +++ /dev/null @@ -1,213 +0,0 @@ -/* -Viz.js 1.7.1 (Graphviz 2.40.1, Expat 2.1.0, Emscripten 1.37.9) -Copyright (c) 2014-2017 Michael Daines -Licensed under MIT license - -This distribution contains other software in object code form: - -Graphviz -Licensed under Eclipse Public License - v 1.0 -http://www.graphviz.org - -Expat -Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. -Licensed under MIT license -http://www.libexpat.org - -zlib -Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler -http://www.zlib.net/zlib_license.html -*/ -(function(global) { -var Module = function(Module) { - Module = Module || {}; - var Module = Module; - -var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=console.log;if(!Module["printErr"])Module["printErr"]=console.warn;var nodeFS;var nodePath;Module["read"]=function read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return xhr.response}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){abort("NO_DYNAMIC_EXECUTION=1 was set, cannot eval")}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}if(!Module["quit"]){Module["quit"]=(function(status,toThrow){throw toThrow})}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];if(!func){abort("NO_DYNAMIC_EXECUTION=1 was set, cannot eval")}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){var __cxa_demangle_func=Module["___cxa_demangle"]||Module["__cxa_demangle"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}var PAGE_SIZE=16384;var HEAP;var buffer;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which adjusts the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];if(!Math["trunc"])Math["trunc"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math["trunc"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var ASM_CONSTS=[(function($0,$1){{var path=Pointer_stringify($0);var data=Pointer_stringify($1);FS.createPath("/",PATH.dirname(path));FS.writeFile(PATH.join("/",path),data)}})];function _emscripten_asm_const_iii(code,a0,a1){return ASM_CONSTS[code](a0,a1)}STATIC_BASE=8;STATICTOP=STATIC_BASE+197520;__ATINIT__.push();allocate([0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,32,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,32,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,2,16,0,0,0,0,0,0,0,0,0,0,0,0,16,64,200,47,0,0,8,0,0,0,1,0,0,0,0,0,0,0,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,150,64,0,0,0,0,0,128,150,64,4,144,195,0,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,32,3,2,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,66,64,0,0,0,0,0,0,66,64,0,0,0,0,0,32,131,64,0,0,0,0,0,192,136,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,64,0,0,0,0,0,0,66,64,0,0,0,0,0,32,131,64,0,0,0,0,0,192,136,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,176,193,0,0,0,0,0,0,0,0,0,0,0,16,64,104,54,0,0,147,0,0,0,1,0,0,0,0,0,0,0,64,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,16,0,2,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,0,176,193,0,0,0,0,0,0,0,0,0,0,0,0,0,68,58,0,0,16,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,64,32,62,3,0,0,0,0,0,0,0,0,0,0,16,64,76,59,0,0,122,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,255,255,255,255,255,255,239,127,255,255,255,255,255,255,239,127,255,255,255,255,255,255,239,255,255,255,255,255,255,255,239,255,0,0,0,0,0,0,248,63,51,51,51,51,51,51,211,63,60,0,0,0,0,0,0,0,154,153,153,153,153,153,169,63,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,4,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,51,51,51,51,51,51,243,63,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,154,153,153,153,153,153,233,63,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,7,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,255,255,255,255,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,51,51,51,51,51,211,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,128,70,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,153,153,153,153,153,217,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,51,51,51,51,51,227,63,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,20,174,71,225,122,228,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,1,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,40,86,0,0,1,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,128,102,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,128,102,64,154,153,153,153,153,153,217,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,128,102,64,123,20,174,71,225,122,228,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,128,70,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,1,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,37,117,2,154,8,27,218,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,44,212,154,230,29,167,234,63,106,222,113,138,142,228,232,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,93,220,70,3,120,11,226,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,208,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,93,220,70,3,120,11,226,63,93,220,70,3,120,11,226,63,93,220,70,3,120,11,226,63,13,113,172,139,219,104,220,63,100,93,220,70,3,120,237,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,16,122,54,171,62,87,229,63,210,111,95,7,206,25,231,63,120,11,36,40,126,140,227,63,181,21,251,203,238,201,225,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,88,168,53,205,59,78,213,63,136,133,90,211,188,227,216,63,210,111,95,7,206,25,231,63,120,11,36,40,126,140,227,63,196,66,173,105,222,113,236,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,181,21,251,203,238,201,225,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,181,21,251,203,238,201,225,63,120,11,36,40,126,140,227,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,134,56,214,197,109,52,238,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,120,11,36,40,126,140,227,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,166,10,70,37,117,2,222,63,0,0,0,0,0,0,224,63,88,168,53,205,59,78,213,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,13,113,172,139,219,104,220,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,106,222,113,138,142,228,232,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,88,168,53,205,59,78,213,63,136,133,90,211,188,227,216,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,210,111,95,7,206,25,231,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,13,113,172,139,219,104,220,63,244,108,86,125,174,182,222,63,17,54,60,189,82,150,201,63,244,108,86,125,174,182,222,63,59,1,77,132,13,79,225,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,62,232,217,172,250,92,197,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,130,115,70,148,246,6,199,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,7,240,22,72,80,252,220,63,162,180,55,248,194,100,214,63,88,168,53,205,59,78,213,63,13,113,172,139,219,104,220,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,208,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,196,66,173,105,222,113,236,63,0,0,0,0,0,0,208,63,127,217,61,121,88,168,209,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,120,11,36,40,126,140,227,63,210,111,95,7,206,25,231,63,196,66,173,105,222,113,236,63,19,242,65,207,102,213,211,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,16,122,54,171,62,87,229,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,210,111,95,7,206,25,231,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,244,108,86,125,174,182,214,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,196,66,173,105,222,113,236,63,16,122,54,171,62,87,229,63,245,219,215,129,115,70,204,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,136,133,90,211,188,227,216,63,1,77,132,13,79,175,226,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,1,77,132,13,79,175,226,63,1,77,132,13,79,175,226,63,1,77,132,13,79,175,226,63,181,21,251,203,238,201,225,63,204,93,75,200,7,61,240,63,16,122,54,171,62,87,229,63,16,122,54,171,62,87,229,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,120,11,36,40,126,140,227,63,106,222,113,138,142,228,232,63,210,111,95,7,206,25,231,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,16,122,54,171,62,87,229,63,181,21,251,203,238,201,225,63,44,212,154,230,29,167,234,63,210,111,95,7,206,25,231,63,106,222,113,138,142,228,232,63,16,122,54,171,62,87,229,63,106,222,113,138,142,228,232,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,120,11,36,40,126,140,227,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,134,56,214,197,109,52,238,63,16,122,54,171,62,87,229,63,16,122,54,171,62,87,229,63,120,11,36,40,126,140,227,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,166,10,70,37,117,2,222,63,181,21,251,203,238,201,225,63,72,191,125,29,56,103,204,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,224,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,72,191,125,29,56,103,204,63,72,191,125,29,56,103,204,63,0,0,0,0,0,0,224,63,72,191,125,29,56,103,204,63,44,212,154,230,29,167,234,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,224,63,210,111,95,7,206,25,231,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,2,154,8,27,158,94,213,63,224,190,14,156,51,162,208,63,2,154,8,27,158,94,213,63,1,77,132,13,79,175,226,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,62,232,217,172,250,92,197,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,29,56,103,68,105,111,200,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,231,29,167,232,72,46,225,63,162,180,55,248,194,100,214,63,72,191,125,29,56,103,204,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,211,188,227,20,29,201,209,63,120,11,36,40,126,140,227,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,240,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,240,63,211,188,227,20,29,201,209,63,234,149,178,12,113,172,215,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);allocate([181,21,251,203,238,201,225,63,106,222,113,138,142,228,232,63,0,0,0,0,0,0,240,63,152,221,147,135,133,90,215,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,196,66,173,105,222,113,236,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,72,191,125,29,56,103,204,63,120,11,36,40,126,140,227,63,134,56,214,197,109,52,238,63,120,11,36,40,126,140,227,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,81,160,79,228,73,210,14,64,180,200,118,190,159,58,53,192,58,34,223,165,212,37,213,191,243,130,62,71,154,46,138,63,159,229,121,112,119,214,249,191,126,253,16,27,44,156,230,63,150,236,216,8,196,235,204,63,205,206,162,119,42,224,208,63,176,227,191,64,16,32,237,191,173,161,212,94,68,219,216,63,59,161,124,230,81,150,118,63,211,110,112,249,122,132,123,63,129,204,206,162,119,42,228,191,209,173,215,244,160,160,200,63,106,223,55,25,176,63,132,63,190,202,144,25,94,255,132,63,28,150,6,126,84,195,196,191,165,73,41,232,246,226,35,64,169,217,3,173,192,144,193,63,8,196,144,65,147,105,137,63,250,68,158,36,93,51,208,191,1,240,153,54,45,194,94,63,13,156,125,47,207,148,151,63,137,181,248,20,0,227,137,63,229,169,88,70,52,203,177,191,143,0,201,207,161,103,166,191,92,181,198,251,204,180,136,63,77,164,143,84,58,179,144,63,230,199,4,161,97,214,160,191,199,105,103,28,19,247,130,191,42,127,107,229,45,112,92,191,228,87,98,84,8,154,117,63,209,241,135,85,114,4,183,63,149,212,9,104,34,60,51,192,100,35,16,175,235,119,16,192,167,33,170,240,103,120,199,63,218,255,0,107,213,174,193,63,78,40,68,192,33,84,247,191,170,72,133,177,133,32,245,63,157,104,87,33,229,39,246,63,77,46,198,192,58,142,205,63,89,107,40,181,23,209,220,191,3,63,170,97,191,39,204,63,166,71,83,61,153,127,218,63,182,129,59,80,167,60,174,63,81,76,222,0,51,223,185,191,245,118,149,255,218,11,166,63,212,165,53,188,15,246,148,63,31,173,32,188,44,220,144,63,40,44,241,128,178,201,35,64,35,90,225,76,2,138,183,63,72,163,101,81,150,41,127,63,187,180,134,247,193,158,147,63,23,168,123,83,71,125,160,191,33,43,174,224,109,148,139,63,51,115,220,132,214,30,181,191,160,120,132,137,245,252,143,63,105,53,36,238,177,244,145,191,184,205,51,122,94,191,106,63,146,62,173,162,63,52,205,191,126,176,231,198,79,62,152,191,7,35,155,80,45,199,164,63,62,24,194,123,88,185,145,191,45,124,125,173,75,141,198,63,0,0,0,64,251,33,249,63,0,0,0,0,45,68,116,62,0,0,0,128,152,70,248,60,0,0,0,96,81,204,120,59,0,0,0,128,131,27,240,57,0,0,0,64,32,37,122,56,0,0,0,128,34,130,227,54,0,0,0,0,29,243,105,53,204,5,1,0,16,43,0,0,3,0,0,0,56,45,0,0,3,0,0,0,16,48,0,0,3,0,0,0,216,48,0,0,3,0,0,0,40,50,0,0,3,0,0,0,160,53,0,0,3,0,0,0,220,56,0,0,3,0,0,0,236,46,0,0,3,0,0,0,164,57,0,0,3,0,0,0,172,58,0,0,3,0,0,0,56,63,0,0,3,0,0,0,92,61,0,0,0,0,0,0,252,44,0,0,0,0,0,0,232,47,0,0,0,0,0,0,56,48,0,0,0,0,0,0,0,50,0,0,0,0,0,0,80,50,0,0,0,0,0,0,180,56,0,0,0,0,0,0,136,46,0,0,0,0,0,0,124,57,0,0,0,0,0,0,132,58,0,0,0,0,0,0,16,63,0,0,0,0,0,0,52,61,0,0,4,0,0,0,96,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,176,217,2,0,192,217,2,0,208,217,2,0,224,217,2,0,240,217,2,0,0,218,2,0,16,218,2,0,32,218,2,0,192,217,2,0,192,217,2,0,0,218,2,0,0,218,2,0,31,0,0,0,63,0,0,0,127,0,0,0,0,0,0,0,207,134,1,0,1,0,0,0,208,43,0,0,104,0,0,0,4,0,0,0,229,9,1,0,1,0,0,0,72,44,0,0,136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,136,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,1,0,0,0,143,6,1,0,1,0,0,0,0,0,0,0,168,0,0,0,2,0,0,0,153,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,3,0,0,0,163,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,4,0,0,0,177,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,5,0,0,0,187,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,6,0,0,0,200,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,9,1,0,1,0,0,0,236,45,0,0,24,1,0,0,1,0,0,0,239,9,1,0,1,0,0,0,236,45,0,0,24,1,0,0,2,0,0,0,245,9,1,0,1,0,0,0,236,45,0,0,24,1,0,0,3,0,0,0,254,9,1,0,1,0,0,0,236,45,0,0,24,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,10,1,0,1,0,0,0,0,0,0,0,112,1,0,0,1,0,0,0,18,10,1,0,1,0,0,0,0,0,0,0,112,1,0,0,2,0,0,0,29,10,1,0,1,0,0,0,0,0,0,0,56,1,0,0,3,0,0,0,43,10,1,0,1,0,0,0,0,0,0,0,56,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,1,0,0,0,6,0,0,0,2,0,0,0,2,0,0,0,7,0,0,0,2,0,0,0,0,0,0,0,143,25,2,0,148,2,2,0,37,4,2,0,101,10,2,0,92,17,2,0,155,21,2,0,27,25,2,0,44,25,2,0,0,0,0,0,114,10,1,0,1,0,0,0,80,47,0,0,168,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,10,1,0,1,0,0,0,0,0,0,0,200,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,126,10,1,0,1,0,0,0,96,48,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,182,11,1,0,1,0,0,0,0,0,0,0,32,2,0,0,2,0,0,0,192,11,1,0,1,0,0,0,0,0,0,0,88,2,0,0,0,0,0,0,201,11,1,0,1,0,0,0,0,0,0,0,88,2,0,0,3,0,0,0,210,11,1,0,1,0,0,0,0,0,0,0,88,2,0,0,0,0,0,0,220,11,1,0,1,0,0,0,0,0,0,0,32,2,0,0,3,0,0,0,232,11,1,0,1,0,0,0,0,0,0,0,32,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,3,0,0,0,9,0,0,0,3,0,0,0,3,0,0,0,10,0,0,0,4,0,0,0,0,0,0,0,143,25,2,0,148,2,2,0,101,10,2,0,37,4,2,0,155,21,2,0,92,17,2,0,44,25,2,0,27,25,2,0,0,0,0,0,0,0,0,0,165,13,1,0,255,255,255,255,100,49,0,0,144,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,13,1,0,255,255,255,255,0,0,0,0,176,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,142,1,0,1,0,0,0,120,50,0,0,232,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,25,0,0,0,26,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,12,0,0,0,5,0,0,0,4,0,0,0,13,0,0,0,5,0,0,0,3,0,0,0,165,17,1,0,179,17,1,0,201,17,1,0,13,251,2,0,215,17,1,0,230,17,1,0,235,17,1,0,9,18,1,0,13,251,2,0,27,18,1,0,75,18,1,0,13,251,2,0,105,18,1,0,145,18,1,0,159,18,1,0,206,18,1,0,2,19,1,0,19,19,1,0,56,19,1,0,91,19,1,0,97,19,1,0,125,19,1,0,154,19,1,0,181,19,1,0,214,19,1,0,240,19,1,0,18,20,1,0,49,20,1,0,87,20,1,0,111,20,1,0,143,20,1,0,172,20,1,0,208,20,1,0,220,20,1,0,13,251,2,0,231,20,1,0,13,21,1,0,49,21,1,0,87,21,1,0,13,251,2,0,141,21,1,0,165,21,1,0,178,21,1,0,225,21,1,0,220,20,1,0,13,251,2,0,238,21,1,0,247,21,1,0,24,22,1,0,83,22,1,0,158,22,1,0,242,22,1,0,20,23,1,0,41,23,1,0,64,23,1,0,86,23,1,0,110,23,1,0,13,251,2,0,132,23,1,0,159,23,1,0,195,23,1,0,231,23,1,0,12,24,1,0,13,251,2,0,45,24,1,0,71,24,1,0,89,24,1,0,102,24,1,0,115,24,1,0,135,24,1,0,150,24,1,0,158,24,1,0,179,24,1,0,193,24,1,0,255,24,1,0,10,25,1,0,220,20,1,0,13,251,2,0,16,25,1,0,28,25,1,0,43,25,1,0,91,19,1,0,13,251,2,0,62,25,1,0,103,25,1,0,133,25,1,0,149,25,1,0,166,25,1,0,173,25,1,0,188,25,1,0,204,25,1,0,16,26,1,0,23,26,1,0,91,19,1,0,13,251,2,0,33,26,1,0,77,26,1,0,88,26,1,0,97,26,1,0,106,26,1,0,123,26,1,0,140,26,1,0,160,26,1,0,220,20,1,0,13,251,2,0,172,26,1,0,188,26,1,0,202,26,1,0,216,26,1,0,229,26,1,0,242,26,1,0,8,27,1,0,17,27,1,0,32,27,1,0,45,27,1,0,62,27,1,0,220,20,1,0,13,251,2,0,73,27,1,0,104,27,1,0,13,251,2,0,122,27,1,0,137,27,1,0,185,27,1,0,195,27,1,0,208,27,1,0,221,27,1,0,234,27,1,0,247,27,1,0,250,27,1,0,13,251,2,0,254,27,1,0,13,251,2,0,33,28,1,0,82,28,1,0,129,28,1,0,152,28,1,0,179,28,1,0,206,28,1,0,220,20,1,0,13,251,2,0,234,28,1,0,13,251,2,0,18,29,1,0,30,29,1,0,49,29,1,0,68,29,1,0,89,29,1,0,110,29,1,0,114,29,1,0,91,19,1,0,13,251,2,0,126,29,1,0,13,251,2,0,142,29,1,0,156,29,1,0,168,29,1,0,181,29,1,0,213,29,1,0,235,29,1,0,13,251,2,0,255,29,1,0,72,30,1,0,142,30,1,0,190,30,1,0,241,30,1,0,248,30,1,0,31,31,1,0,70,31,1,0,13,251,2,0,75,31,1,0,0,0,0,0,0,0,0,0,0,73,1,0,1,0,0,0,0,0,0,0,8,3,0,0,1,0,0,0,191,31,1,0,1,0,0,0,0,0,0,0,8,3,0,0,2,0,0,0,249,72,1,0,1,0,0,0,0,0,0,0,64,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,0,0,0,0,0,0,0,36,0,0,0,37,0,0,0,6,0,0,0,38,0,0,0,39,0,0,0,40,0,0,0,41,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,4,0,0,0,47,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,15,0,0,0,7,0,0,0,5,0,0,0,16,0,0,0,6,0,0,0,0,0,0,0,172,1,2,0,182,1,2,0,137,50,1,0,251,1,2,0,54,2,2,0,88,2,2,0,94,2,2,0,143,25,2,0,133,2,2,0,148,2,2,0,177,2,2,0,188,2,2,0,222,2,2,0,20,3,2,0,74,3,2,0,133,3,2,0,187,3,2,0,221,3,2,0,236,3,2,0,29,4,2,0,37,4,2,0,79,38,1,0,88,38,1,0,66,4,2,0,97,38,1,0,140,4,2,0,106,38,1,0,150,4,2,0,115,38,1,0,160,4,2,0,239,4,2,0,42,5,2,0,127,38,1,0,101,5,2,0,112,5,2,0,181,5,2,0,195,5,2,0,13,6,2,0,27,6,2,0,41,6,2,0,52,6,2,0,101,6,2,0,165,6,2,0,173,6,2,0,181,6,2,0,240,6,2,0,38,7,2,0,50,7,2,0,142,50,1,0,62,7,2,0,72,7,2,0,83,7,2,0,112,7,2,0,166,7,2,0,101,10,2,0,135,10,2,0,147,10,2,0,82,13,2,0,131,13,2,0,175,13,2,0,229,13,2,0,242,13,2,0,20,14,2,0,54,14,2,0,63,14,2,0,137,14,2,0,147,14,2,0,216,14,2,0,14,15,2,0,25,15,2,0,158,15,2,0,179,15,2,0,135,38,1,0,189,15,2,0,199,15,2,0,253,15,2,0,61,16,2,0,75,16,2,0,159,16,2,0,174,16,2,0,189,16,2,0,12,17,2,0,150,50,1,0,76,17,2,0,86,17,2,0,92,17,2,0,136,17,2,0,175,17,2,0,192,17,2,0,203,17,2,0,16,18,2,0,85,18,2,0,100,18,2,0,116,18,2,0,134,18,2,0,150,18,2,0,166,18,2,0,179,18,2,0,189,18,2,0,243,18,2,0,252,18,2,0,60,19,2,0,79,19,2,0,155,50,1,0,87,19,2,0,141,19,2,0,180,19,2,0,234,19,2,0,17,20,2,0,31,20,2,0,85,20,2,0,159,20,2,0,233,20,2,0,244,20,2,0,42,21,2,0,47,21,2,0,76,21,2,0,105,21,2,0,116,21,2,0,155,21,2,0,179,21,2,0,233,21,2,0,31,22,2,0,43,22,2,0,82,22,2,0,93,22,2,0,142,22,2,0,191,22,2,0,136,61,1,0,230,22,2,0,18,23,2,0,72,23,2,0,126,23,2,0,136,23,2,0,165,23,2,0,229,23,2,0,27,24,2,0,161,50,1,0,51,24,2,0,95,24,2,0,134,24,2,0,188,24,2,0,249,24,2,0,27,25,2,0,33,25,2,0,44,25,2,0,83,25,2,0,0,0,0,0,216,142,1,0,1,0,0,0,240,53,0,0,120,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,215,73,1,0,1,0,0,0,0,0,0,0,152,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,0,0,0,0,0,0,0,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,18,0,0,0,8,0,0,0,6,0,0,0,19,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,189,39,1,0,1,0,0,0,4,57,0,0,208,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,39,1,0,1,0,0,0,0,0,0,0,240,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,0,0,0,0,0,0,0,53,0,0,0,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,55,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,21,0,0,0,9,0,0,0,7,0,0,0,22,0,0,0,8,0,0,0,0,0,0,0,137,50,1,0,143,25,2,0,148,2,2,0,142,50,1,0,166,7,2,0,101,10,2,0,150,50,1,0,136,17,2,0,60,19,2,0,155,50,1,0,116,21,2,0,155,21,2,0,136,61,1,0,161,50,1,0,27,25,2,0,44,25,2,0,0,0,0,0,166,50,1,0,1,0,0,0,204,57,0,0,40,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,50,1,0,1,0,0,0,0,0,0,0,72,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,57,0,0,0,58,0,0,0,10,0,0,0,59,0,0,0,60,0,0,0,61,0,0,0,62,0,0,0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,65,0,0,0,66,0,0,0,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,24,0,0,0,11,0,0,0,8,0,0,0,25,0,0,0,9,0,0,0,0,0,0,0,251,1,2,0,30,60,1,0,143,25,2,0,148,2,2,0,177,2,2,0,41,60,1,0,47,60,1,0,58,60,1,0,65,60,1,0,188,2,2,0,20,3,2,0,73,60,1,0,79,60,1,0,90,60,1,0,187,3,2,0,221,3,2,0,37,4,2,0,97,60,1,0,140,4,2,0,160,4,2,0,42,5,2,0,107,60,1,0,181,5,2,0,195,5,2,0,13,6,2,0,118,60,1,0,27,6,2,0,126,60,1,0,135,60,1,0,149,60,1,0,159,60,1,0,240,6,2,0,168,60,1,0,50,7,2,0,83,7,2,0,112,7,2,0,174,60,1,0,183,7,2,0,226,7,2,0,11,8,2,0,46,8,2,0,87,8,2,0,122,8,2,0,163,8,2,0,198,8,2,0,239,8,2,0,18,9,2,0,59,9,2,0,94,9,2,0,135,9,2,0,170,9,2,0,211,9,2,0,246,9,2,0,31,10,2,0,66,10,2,0,101,10,2,0,181,60,1,0,135,10,2,0,193,60,1,0,175,13,2,0,20,14,2,0,216,14,2,0,206,60,1,0,189,16,2,0,219,60,1,0,76,17,2,0,92,17,2,0,229,60,1,0,136,17,2,0,175,17,2,0,192,17,2,0,244,60,1,0,6,61,1,0,203,17,2,0,85,18,2,0,100,18,2,0,116,18,2,0,134,18,2,0,150,18,2,0,22,61,1,0,33,61,1,0,44,61,1,0,166,18,2,0,60,19,2,0,65,19,2,0,49,61,1,0,58,61,1,0,67,61,1,0,83,61,1,0,90,61,1,0,141,19,2,0,180,19,2,0,234,19,2,0,31,20,2,0,47,21,2,0,76,21,2,0,98,61,1,0,155,21,2,0,105,61,1,0,43,22,2,0,114,61,1,0,93,22,2,0,122,61,1,0,191,22,2,0,136,61,1,0,230,22,2,0,18,23,2,0,143,61,1,0,165,23,2,0,229,23,2,0,153,61,1,0,27,24,2,0,51,24,2,0,134,24,2,0,163,61,1,0,177,61,1,0,188,24,2,0,195,24,2,0,249,24,2,0,27,25,2,0,44,25,2,0,83,25,2,0,0,0,0,0,195,61,1,0,1,0,0,0,212,58,0,0,128,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,61,1,0,1,0,0,0,0,0,0,0,160,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,0,0,0,69,0,0,0,0,0,0,0,0,0,0,0,70,0,0,0,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0,0,0,0,0,27,0,0,0,12,0,0,0,9,0,0,0,28,0,0,0,10,0,0,0,0,0,0,0,65,66,0,0,221,162,1,0,65,73,0,0,183,162,1,0,65,82,0,0,138,162,1,0,65,88,0,0,242,162,1,0,66,32,0,0,46,165,1,0,66,73,0,0,63,165,1,0,67,66,0,0,119,163,1,0,67,79,0,0,101,163,1,0,67,88,0,0,132,163,1,0,72,32,0,0,168,163,1,0,72,66,0,0,178,163,1,0,72,73,0,0,62,164,1,0,72,88,0,0,193,163,1,0,72,98,0,0,242,163,1,0,72,105,0,0,37,164,1,0,72,114,0,0,215,163,1,0,72,120,0,0,8,164,1,0,73,32,0,0,80,165,1,0,75,66,0,0,9,163,1,0,75,73,0,0,81,163,1,0,75,82,0,0,61,163,1,0,75,88,0,0,42,163,1,0,78,66,0,0,80,164,1,0,78,73,0,0,151,164,1,0,78,82,0,0,175,164,1,0,78,88,0,0,123,164,1,0,80,65,0,0,16,165,1,0,80,66,0,0,204,164,1,0,80,73,0,0,0,165,1,0,80,88,0,0,236,164,1,0,82,32,0,0,7,167,1,0,83,32,0,0,31,165,1,0,90,68,0,0,141,165,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,109,72,1,0,255,255,255,255,132,61,0,0,216,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,113,72,1,0,255,255,255,255,0,0,0,0,248,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,121,72,1,0,1,0,0,0,72,67,0,0,0,0,0,0,16,0,0,0,129,72,1,0,1,0,0,0,72,67,0,0,0,0,0,0,17,0,0,0,137,72,1,0,1,0,0,0,72,67,0,0,0,0,0,0,17,0,0,0,146,72,1,0,1,0,0,0,72,67,0,0,0,0,0,0,17,0,0,0,154,72,1,0,1,0,0,0,72,67,0,0,0,0,0,0,19,0,0,0,162,72,1,0,1,0,0,0,76,67,0,0,0,0,0,0,20,0,0,0,170,72,1,0,1,0,0,0,76,67,0,0,0,0,0,0,21,0,0,0,178,72,1,0,1,0,0,0,76,67,0,0,0,0,0,0,21,0,0,0,187,72,1,0,1,0,0,0,76,67,0,0,0,0,0,0,21,0,0,0,195,72,1,0,1,0,0,0,76,67,0,0,0,0,0,0,22,0,0,0,203,72,1,0,1,0,0,0,80,67,0,0,0,0,0,0,23,0,0,0,212,72,1,0,1,0,0,0,80,67,0,0,0,0,0,0,24,0,0,0,221,72,1,0,1,0,0,0,80,67,0,0,0,0,0,0,24,0,0,0,231,72,1,0,1,0,0,0,80,67,0,0,0,0,0,0,24,0,0,0,240,72,1,0,1,0,0,0,80,67,0,0,0,0,0,0,25,0,0,0,249,72,1,0,1,0,0,0,84,67,0,0,0,0,0,0,25,0,0,0,0,73,1,0,1,0,0,0,84,67,0,0,0,0,0,0,26,0,0,0,6,73,1,0,1,0,0,0,88,67,0,0,0,0,0,0,10,0,0,0,15,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,11,0,0,0,23,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,12,0,0,0,31,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,12,0,0,0,40,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,12,0,0,0,48,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,14,0,0,0,56,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,14,0,0,0,63,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,13,0,0,0,71,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,5,0,0,0,79,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,6,0,0,0,87,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,7,0,0,0,95,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,7,0,0,0,104,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,7,0,0,0,112,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,9,0,0,0,120,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,9,0,0,0,127,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,8,0,0,0,135,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,0,0,0,0,143,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,1,0,0,0,152,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,2,0,0,0,161,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,2,0,0,0,171,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,2,0,0,0,180,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,4,0,0,0,189,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,4,0,0,0,197,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,3,0,0,0,206,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,18,0,0,0,215,73,1,0,1,0,0,0,72,67,0,0,0,0,0,0,27,0,0,0,223,73,1,0,1,0,0,0,100,67,0,0,0,0,0,0,28,0,0,0,231,73,1,0,1,0,0,0,100,67,0,0,0,0,0,0,29,0,0,0,239,73,1,0,1,0,0,0,100,67,0,0,0,0,0,0,29,0,0,0,248,73,1,0,1,0,0,0,100,67,0,0,0,0,0,0,29,0,0,0,0,74,1,0,1,0,0,0,100,67,0,0,0,0,0,0,30,0,0,0,8,74,1,0,1,0,0,0,104,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,115,77,1,0,116,67,0,0,1,0,0,0,144,67,0,0,0,0,0,0,0,0,0,0,72,0,0,0,73,0,0,0,1,0,0,0,0,0,0,0,207,134,1,0,0,0,0,0,132,67,0,0,140,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,4,0,0,0,24,1,0,0,48,1,0,0,176,0,0,0,152,85,1,0,157,85,1,0,161,85,1,0,168,85,1,0,172,85,1,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,161,90,1,0,80,68,0,0,1,0,0,0,168,68,0,0,0,0,0,0,0,0,0,0,74,0,0,0,75,0,0,0,76,0,0,0,77,0,0,0,78,0,0,0,79,0,0,0,80,0,0,0,81,0,0,0,82,0,0,0,83,0,0,0,84,0,0,0,75,0,0,0,85,0,0,0,75,0,0,0,86,0,0,0,87,0,0,0,88,0,0,0,89,0,0,0,0,0,0,0,174,90,1,0,0,0,0,0,96,68,0,0,208,219,2,0,1,0,0,0,180,90,1,0,0,0,0,0,104,68,0,0,208,219,2,0,2,0,0,0,184,90,1,0,0,0,0,0,112,68,0,0,208,219,2,0,3,0,0,0,189,90,1,0,0,0,0,0,120,68,0,0,208,219,2,0,4,0,0,0,195,90,1,0,0,0,0,0,128,68,0,0,208,219,2,0,5,0,0,0,201,90,1,0,0,0,0,0,152,68,0,0,208,219,2,0,6,0,0,0,211,90,1,0,0,0,0,0,160,68,0,0,208,219,2,0,7,0,0,0,217,90,1,0,0,0,0,0,136,68,0,0,208,219,2,0,7,0,0,0,221,90,1,0,0,0,0,0,136,68,0,0,208,219,2,0,7,0,0,0,226,90,1,0,0,0,0,0,144,68,0,0,208,219,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,48,0,0,0,0,0,0,0,1,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,0,0,0,0,105,104,1,0,129,104,1,0,160,104,1,0,189,104,1,0,220,104,1,0,227,104,1,0,236,104,1,0,105,104,1,0,110,104,1,0,117,104,1,0,122,104,1,0,11,104,1,0,29,104,1,0,43,104,1,0,57,104,1,0,71,104,1,0,78,104,1,0,93,104,1,0,105,104,1,0,0,0,0,0,13,251,2,0,0,0,0,0,74,19,2,0,1,0,0,0,37,107,1,0,7,0,0,0,233,106,1,0,3,0,0,0,245,38,2,0,5,0,0,0,45,107,1,0,15,0,0,0,189,142,1,0,8,0,0,0,189,142,1,0,16,0,0,0,53,107,1,0,4,0,0,0,53,107,1,0,17,0,0,0,58,107,1,0,5,0,0,0,58,107,1,0,2,0,0,0,64,107,1,0,6,0,0,0,71,107,1,0,4,0,0,0,83,107,1,0,7,0,0,0,91,107,1,0,7,0,0,0,107,107,1,0,5,0,0,0,113,107,1,0,8,0,0,0,136,107,1,0,8,0,0,0,113,107,1,0,9,0,0,0,145,107,1,0,7,0,0,0,153,107,1,0,10,0,0,0,179,107,1,0,7,0,0,0,187,107,1,0,11,0,0,0,213,107,1,0,6,0,0,0,220,107,1,0,12,0,0,0,250,107,1,0,9,0,0,0,220,107,1,0,13,0,0,0,4,108,1,0,8,0,0,0,13,108,1,0,14,0,0,0,46,108,1,0,8,0,0,0,55,108,1,0,18,0,0,0,88,108,1,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,12,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,3,0,0,0,33,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,4,0,0,0,34,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,64,0,0,0,176,71,0,0,192,71,0,0,6,0,0,0,4,0,0,0,204,71,0,0,6,0,0,0,8,0,0,0,6,0,0,0,4,0,0,0,212,71,0,0,0,4,0,0,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,193,121,1,0,53,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,9,0,0,0,11,0,0,0,8,0,0,0,10,0,0,0,92,73,0,0,224,72,0,0,68,73,0,0,1,0,0,0,1,0,0,0,10,0,0,0,22,0,0,0,11,0,0,0,90,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,7,0,0,0,2,0,0,0,5,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,3,0,0,0,14,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,16,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,6,0,0,0,1,0,0,0,1,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,1,0,0,0,1,0,0,0,11,0,0,0,1,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,19,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,1,0,0,0,30,0,0,0,1,0,0,0,1,0,0,0,19,0,0,0,1,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,19,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,39,0,0,0,40,0,0,0,41,0,0,0,19,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,46,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,47,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,48,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,5,0,0,0,1,0,0,0,6,0,0,0,7,0,0,0,7,0,0,0,1,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,3,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,128,0,0,0,166,180,1,0,135,180,1,0,77,125,1,0,179,180,1,0,171,180,1,0,185,180,1,0,0,0,0,0,83,129,1,0,92,129,1,0,99,129,1,0,113,129,1,0,167,179,1,0,207,180,1,0,120,129,1,0,127,129,1,0,1,0,0,0,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,131,1,0,8,0,0,0,3,0,0,0,38,131,1,0,42,131,1,0,11,0,0,0,6,0,0,0,213,142,1,0,54,131,1,0,2,0,0,0,1,0,0,0,57,131,1,0,61,131,1,0,4,0,0,0,2,0,0,0,66,131,1,0,70,131,1,0,4,0,0,0,4,0,0,0,75,131,1,0,80,131,1,0,5,0,0,0,5,0,0,0,86,131,1,0,90,131,1,0,4,0,0,0,7,0,0,0,95,131,1,0,99,131,1,0,5,0,0,0,9,0,0,0,105,131,1,0,109,131,1,0,4,0,0,0,10,0,0,0,114,131,1,0,119,131,1,0,4,0,0,0,12,0,0,0,124,131,1,0,15,136,1,0,0,0,0,0,1,0,0,0,23,136,1,0,1,0,0,0,0,0,0,0,162,179,1,0,1,0,0,0,1,0,0,0,74,19,2],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+10240);allocate([248,134,1,0,49,0,0,0,0,0,0,0,0,0,0,0,208,174,1,0,16,0,0,0,116,31,2,0,128,0,0,0,241,134,1,0,64,0,0,0,59,161,1,0,16,0,0,0,243,134,1,0,64,0,0,0,0,0,0,0,0,0,0,0,191,134,1,0,1,0,0,0,198,134,1,0,2,0,0,0,203,134,1,0,3,0,0,0,249,167,1,0,4,0,0,0,93,158,1,0,5,0,0,0,207,134,1,0,6,0,0,0,74,19,2,0,8,0,0,0,211,134,1,0,33,0,0,0,215,134,1,0,34,0,0,0,219,134,1,0,34,0,0,0,223,134,1,0,1,0,0,0,228,134,1,0,7,0,0,0,234,134,1,0,39,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,140,1,0,49,140,1,0,0,0,0,0,80,6,0,0,210,142,1,0,213,142,1,0,216,142,1,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,255,255,255,255,149,142,1,0,155,142,1,0,74,19,2,0,0,0,0,0,100,0,0,0,101,0,0,0,102,0,0,0,100,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,9,0,0,0,43,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,167,1,0,144,85,0,0,176,6,0,0,0,0,0,0,38,158,1,0,144,85,0,0,224,6,0,0,0,0,0,0,255,166,1,0,144,85,0,0,16,7,0,0,0,0,0,0,46,158,1,0,144,85,0,0,16,7,0,0,0,0,0,0,51,158,1,0,144,85,0,0,64,7,0,0,0,0,0,0,58,158,1,0,168,85,0,0,64,7,0,0,0,0,0,0,64,158,1,0,144,85,0,0,112,7,0,0,0,0,0,0,68,158,1,0,144,85,0,0,160,7,0,0,0,0,0,0,74,19,2,0,144,85,0,0,208,7,0,0,0,0,0,0,77,158,1,0,144,85,0,0,208,7,0,0,0,0,0,0,87,158,1,0,144,85,0,0,128,6,0,0,0,0,0,0,93,158,1,0,144,85,0,0,0,8,0,0,0,0,0,0,101,158,1,0,144,85,0,0,48,8,0,0,0,0,0,0,111,158,1,0,144,85,0,0,96,8,0,0,0,0,0,0,125,158,1,0,144,85,0,0,144,8,0,0,0,0,0,0,131,158,1,0,144,85,0,0,192,8,0,0,0,0,0,0,140,158,1,0,144,85,0,0,240,8,0,0,0,0,0,0,148,158,1,0,144,85,0,0,32,9,0,0,0,0,0,0,157,158,1,0,144,85,0,0,80,9,0,0,0,0,0,0,165,158,1,0,144,85,0,0,128,9,0,0,0,0,0,0,170,158,1,0,144,85,0,0,176,9,0,0,0,0,0,0,174,158,1,0,144,85,0,0,224,9,0,0,0,0,0,0,181,158,1,0,144,85,0,0,16,10,0,0,0,0,0,0,187,158,1,0,144,85,0,0,64,10,0,0,0,0,0,0,197,158,1,0,192,85,0,0,112,10,0,0,0,0,0,0,206,158,1,0,144,85,0,0,176,6,0,0,0,0,0,0,211,158,1,0,144,85,0,0,176,6,0,0,0,0,0,0,221,158,1,0,144,85,0,0,160,10,0,0,0,0,0,0,228,158,1,0,144,85,0,0,208,10,0,0,0,0,0,0,241,158,1,0,144,85,0,0,0,11,0,0,0,0,0,0,255,158,1,0,144,85,0,0,48,11,0,0,0,0,0,0,13,159,1,0,144,85,0,0,96,11,0,0,0,0,0,0,25,159,1,0,144,85,0,0,144,11,0,0,0,0,0,0,38,159,1,0,144,85,0,0,192,11,0,0,0,0,0,0,47,159,1,0,144,85,0,0,240,11,0,0,0,0,0,0,57,159,1,0,144,85,0,0,32,12,0,0,0,0,0,0,66,159,1,0,144,85,0,0,80,12,0,0,0,0,0,0,74,159,1,0,144,85,0,0,128,12,0,0,0,0,0,0,82,159,1,0,144,85,0,0,176,12,0,0,0,0,0,0,91,159,1,0,144,85,0,0,224,12,0,0,0,0,0,0,95,159,1,0,144,85,0,0,16,13,0,0,0,0,0,0,106,159,1,0,144,85,0,0,64,13,0,0,0,0,0,0,110,159,1,0,144,85,0,0,112,13,0,0,0,0,0,0,120,159,1,0,144,85,0,0,160,13,0,0,0,0,0,0,129,159,1,0,144,85,0,0,208,13,0,0,0,0,0,0,137,159,1,0,144,85,0,0,0,14,0,0,0,0,0,0,150,159,1,0,144,85,0,0,48,14,0,0,0,0,0,0,162,159,1,0,144,85,0,0,96,14,0,0,0,0,0,0,173,159,1,0,144,85,0,0,144,14,0,0,0,0,0,0,189,159,1,0,144,85,0,0,192,14,0,0,0,0,0,0,203,159,1,0,144,85,0,0,240,14,0,0,0,0,0,0,218,159,1,0,144,85,0,0,32,15,0,0,0,0,0,0,228,159,1,0,144,85,0,0,80,15,0,0,0,0,0,0,237,159,1,0,144,85,0,0,128,15,0,0,0,0,0,0,247,159,1,0,144,85,0,0,176,15,0,0,0,0,0,0,1,160,1,0,144,85,0,0,224,15,0,0,0,0,0,0,8,160,1,0,144,85,0,0,16,16,0,0,0,0,0,0,15,160,1,0,144,85,0,0,64,16,0,0,0,0,0,0,25,160,1,0,216,85,0,0,0,0,0,0,0,0,0,0,32,160,1,0,216,85,0,0,0,0,0,0,0,0,0,0,2,158,1,0,240,85,0,0,0,0,0,0,0,0,0,0,40,160,1,0,8,86,0,0,112,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,0,0,0,92,0,0,0,23,0,0,0,4,0,0,0,2,0,0,0,12,0,0,0,93,0,0,0,92,0,0,0,23,0,0,0,5,0,0,0,0,0,0,0,13,0,0,0,91,0,0,0,92,0,0,0,23,0,0,0,4,0,0,0,2,0,0,0,12,0,0,0,94,0,0,0,95,0,0,0,24,0,0,0,6,0,0,0,3,0,0,0,14,0,0,0,96,0,0,0,97,0,0,0,23,0,0,0,7,0,0,0,0,0,0,0,15,0,0,0,91,0,0,0,92,0,0,0,23,0,0,0,8,0,0,0,2,0,0,0,12,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,42,161,1,0,49,161,1,0,0,0,0,0,57,161,1,0,59,161,1,0,174,31,2,0,61,161,1,0,12,0,0,0,4,0,0,0,6,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,9,0,0,0,8,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,41,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,51,0,0,0,52,0,0,0,53,0,0,0,54,0,0,0,55,0,0,0,56,0,0,0,57,0,0,0,58,0,0,0,61,0,0,0,62,0,0,0,63,0,0,0,64,0,0,0,65,0,0,0,66,0,0,0,67,0,0,0,68,0,0,0,71,0,0,0,72,0,0,0,73,0,0,0,74,0,0,0,75,0,0,0,76,0,0,0,77,0,0,0,78,0,0,0,81,0,0,0,82,0,0,0,83,0,0,0,84,0,0,0,85,0,0,0,86,0,0,0,87,0,0,0,88,0,0,0,138,162,1,0,154,162,1,0,167,162,1,0,0,0,0,0,0,0,0,0,4,0,0,0,172,162,1,0,0,0,0,0,0,0,0,0,183,162,1,0,154,162,1,0,167,162,1,0,0,0,0,0,206,162,1,0,5,0,0,0,172,162,1,0,0,0,0,0,214,162,1,0,221,162,1,0,154,162,1,0,237,162,1,0,0,0,0,0,0,0,0,0,6,0,0,0,172,162,1,0,24,179,1,0,0,0,0,0,242,162,1,0,154,162,1,0,237,162,1,0,0,0,0,0,206,162,1,0,7,0,0,0,172,162,1,0,24,179,1,0,214,162,1,0,9,163,1,0,22,163,1,0,237,162,1,0,0,0,0,0,0,0,0,0,10,0,0,0,36,163,1,0,24,179,1,0,0,0,0,0,42,163,1,0,22,163,1,0,237,162,1,0,0,0,0,0,214,162,1,0,11,0,0,0,36,163,1,0,24,179,1,0,214,162,1,0,61,163,1,0,22,163,1,0,75,163,1,0,0,0,0,0,0,0,0,0,8,0,0,0,36,163,1,0,0,0,0,0,0,0,0,0,81,163,1,0,22,163,1,0,75,163,1,0,0,0,0,0,214,162,1,0,9,0,0,0,36,163,1,0,0,0,0,0,214,162,1,0,101,163,1,0,101,163,1,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,109,163,1,0,0,0,0,0,0,0,0,0,119,163,1,0,101,163,1,0,24,179,1,0,0,0,0,0,0,0,0,0,14,0,0,0,109,163,1,0,24,179,1,0,0,0,0,0,132,163,1,0,101,163,1,0,24,179,1,0,0,0,0,0,206,162,1,0,15,0,0,0,109,163,1,0,24,179,1,0,214,162,1,0,152,163,1,0,101,163,1,0,0,0,0,0,0,0,0,0,206,162,1,0,13,0,0,0,109,163,1,0,0,0,0,0,214,162,1,0,168,163,1,0,168,163,1,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,172,162,1,0,0,0,0,0,0,0,0,0,178,163,1,0,168,163,1,0,24,179,1,0,0,0,0,0,0,0,0,0,18,0,0,0,172,162,1,0,24,179,1,0,0,0,0,0,193,163,1,0,168,163,1,0,24,179,1,0,0,0,0,0,206,162,1,0,19,0,0,0,172,162,1,0,24,179,1,0,214,162,1,0,215,163,1,0,168,163,1,0,0,0,0,0,232,163,1,0,0,0,0,0,20,0,0,0,172,162,1,0,0,0,0,0,0,0,0,0,242,163,1,0,168,163,1,0,24,179,1,0,232,163,1,0,0,0,0,0,22,0,0,0,172,162,1,0,24,179,1,0,0,0,0,0,8,164,1,0,168,163,1,0,24,179,1,0,232,163,1,0,206,162,1,0,23,0,0,0,172,162,1,0,24,179,1,0,214,162,1,0,37,164,1,0,168,163,1,0,0,0,0,0,232,163,1,0,206,162,1,0,21,0,0,0,172,162,1,0,0,0,0,0,214,162,1,0,62,164,1,0,168,163,1,0,0,0,0,0,0,0,0,0,206,162,1,0,17,0,0,0,172,162,1,0,0,0,0,0,214,162,1,0,80,164,1,0,102,164,1,0,24,179,1,0,0,0,0,0,0,0,0,0,26,0,0,0,36,163,1,0,24,179,1,0,0,0,0,0,123,164,1,0,102,164,1,0,24,179,1,0,0,0,0,0,214,162,1,0,27,0,0,0,36,163,1,0,24,179,1,0,214,162,1,0,151,164,1,0,102,164,1,0,0,0,0,0,0,0,0,0,214,162,1,0,25,0,0,0,36,163,1,0,0,0,0,0,214,162,1,0,175,164,1,0,102,164,1,0,198,164,1,0,0,0,0,0,0,0,0,0,24,0,0,0,36,163,1,0,0,0,0,0,0,0,0,0,204,164,1,0,218,164,1,0,24,179,1,0,0,0,0,0,0,0,0,0,30,0,0,0,36,163,1,0,24,179,1,0,0,0,0,0,236,164,1,0,218,164,1,0,24,179,1,0,0,0,0,0,214,162,1,0,31,0,0,0,36,163,1,0,24,179,1,0,214,162,1,0,0,165,1,0,218,164,1,0,0,0,0,0,0,0,0,0,214,162,1,0,29,0,0,0,36,163,1,0,0,0,0,0,214,162,1,0,16,165,1,0,218,164,1,0,198,164,1,0,0,0,0,0,0,0,0,0,28,0,0,0,36,163,1,0,0,0,0,0,0,0,0,0,31,165,1,0,31,165,1,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,38,165,1,0,0,0,0,0,0,0,0,0,46,165,1,0,57,165,1,0,24,179,1,0,0,0,0,0,0,0,0,0,2,0,0,0,36,163,1,0,24,179,1,0,0,0,0,0,63,165,1,0,57,165,1,0,24,179,1,0,0,0,0,0,214,162,1,0,3,0,0,0,36,163,1,0,24,179,1,0,214,162,1,0,80,165,1,0,57,165,1,0,0,0,0,0,0,0,0,0,214,162,1,0,1,0,0,0,36,163,1,0,0,0,0,0,214,162,1,0,7,167,1,0,57,165,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,163,1,0,0,0,0,0,0,0,0,0,93,165,1,0,119,165,1,0,134,165,1,0,0,0,0,0,214,162,1,0,33,0,0,0,36,163,1,0,0,0,0,0,214,162,1,0,141,165,1,0,154,165,1,0,0,0,0,0,0,0,0,0,0,0,0,0,34,0,0,0,38,165,1,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,10,0,0,0,45,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,168,1,0,198,0,0,0,60,168,1,0,193,0,0,0,67,168,1,0,194,0,0,0,73,168,1,0,192,0,0,0,80,168,1,0,145,3,0,0,86,168,1,0,197,0,0,0,92,168,1,0,195,0,0,0,99,168,1,0,196,0,0,0,104,168,1,0,146,3,0,0,109,168,1,0,199,0,0,0,116,168,1,0,167,3,0,0,120,168,1,0,33,32,0,0,127,168,1,0,148,3,0,0,133,168,1,0,208,0,0,0,137,168,1,0,201,0,0,0,144,168,1,0,202,0,0,0,150,168,1,0,200,0,0,0,157,168,1,0,149,3,0,0,165,168,1,0,151,3,0,0,169,168,1,0,203,0,0,0,174,168,1,0,147,3,0,0,180,168,1,0,205,0,0,0,187,168,1,0,206,0,0,0,193,168,1,0,204,0,0,0,200,168,1,0,153,3,0,0,205,168,1,0,207,0,0,0,210,168,1,0,154,3,0,0,216,168,1,0,155,3,0,0,223,168,1,0,156,3,0,0,226,168,1,0,209,0,0,0,233,168,1,0,157,3,0,0,236,168,1,0,82,1,0,0,242,168,1,0,211,0,0,0,249,168,1,0,212,0,0,0,255,168,1,0,210,0,0,0,6,169,1,0,169,3,0,0,12,169,1,0,159,3,0,0,20,169,1,0,216,0,0,0,27,169,1,0,213,0,0,0,34,169,1,0,214,0,0,0,39,169,1,0,166,3,0,0,43,169,1,0,160,3,0,0,46,169,1,0,51,32,0,0,52,169,1,0,168,3,0,0,56,169,1,0,161,3,0,0,60,169,1,0,96,1,0,0,67,169,1,0,163,3,0,0,73,169,1,0,222,0,0,0,79,169,1,0,164,3,0,0,83,169,1,0,152,3,0,0,89,169,1,0,218,0,0,0,96,169,1,0,219,0,0,0,102,169,1,0,217,0,0,0,109,169,1,0,165,3,0,0,117,169,1,0,220,0,0,0,122,169,1,0,158,3,0,0,125,169,1,0,221,0,0,0,132,169,1,0,120,1,0,0,137,169,1,0,150,3,0,0,142,169,1,0,225,0,0,0,149,169,1,0,226,0,0,0,155,169,1,0,180,0,0,0,161,169,1,0,230,0,0,0,167,169,1,0,224,0,0,0,174,169,1,0,53,33,0,0,182,169,1,0,177,3,0,0,188,169,1,0,38,0,0,0,192,169,1,0,39,34,0,0,196,169,1,0,32,34,0,0,200,169,1,0,229,0,0,0,206,169,1,0,72,34,0,0,212,169,1,0,227,0,0,0,219,169,1,0,228,0,0,0,224,169,1,0,30,32,0,0,230,169,1,0,178,3,0,0,235,169,1,0,166,0,0,0,242,169,1,0,34,32,0,0,247,169,1,0,41,34,0,0,251,169,1,0,231,0,0,0,2,170,1,0,184,0,0,0,8,170,1,0,162,0,0,0,13,170,1,0,199,3,0,0,17,170,1,0,198,2,0,0,22,170,1,0,99,38,0,0,28,170,1,0,69,34,0,0,33,170,1,0,169,0,0,0,38,170,1,0,181,33,0,0,44,170,1,0,42,34,0,0,48,170,1,0,164,0,0,0,55,170,1,0,211,33,0,0,60,170,1,0,32,32,0,0,67,170,1,0,147,33,0,0,72,170,1,0,176,0,0,0,76,170,1,0,180,3,0,0,82,170,1,0,102,38,0,0,88,170,1,0,247,0,0,0,95,170,1,0,233,0,0,0,102,170,1,0,234,0,0,0,108,170,1,0,232,0,0,0,115,170,1,0,5,34,0,0,121,170,1,0,3,32,0,0,126,170,1,0,2,32,0,0,131,170,1,0,181,3,0,0,139,170,1,0,97,34,0,0,145,170,1,0,183,3,0,0,149,170,1,0,240,0,0,0,153,170,1,0,235,0,0,0,158,170,1,0,172,32,0,0,163,170,1,0,3,34,0,0,169,170,1,0,146,1,0,0,174,170,1,0,0,34,0,0,181,170,1,0,189,0,0,0,188,170,1,0,188,0,0,0,195,170,1,0,190,0,0,0,202,170,1,0,68,32,0,0,208,170,1,0,179,3,0,0,214,170,1,0,101,34,0,0,217,170,1,0,62,0,0,0,220,170,1,0,212,33,0,0,225,170,1,0,148,33,0,0,230,170,1,0,101,38,0,0,237,170,1,0,38,32,0,0,244,170,1,0,237,0,0,0,251,170,1,0,238,0,0,0,1,171,1,0,161,0,0,0,7,171,1,0,236,0,0,0,14,171,1,0,17,33,0,0,20,171,1,0,30,34,0,0,26,171,1,0,43,34,0,0,30,171,1,0,185,3,0,0,35,171,1,0,191,0,0,0,42,171,1,0,8,34,0,0,47,171,1,0,239,0,0,0,52,171,1,0,186,3,0,0,58,171,1,0,208,33,0,0,63,171,1,0,187,3,0,0,70,171,1,0,41,35,0,0,75,171,1,0,171,0,0,0,81,171,1,0,144,33,0,0,86,171,1,0,8,35,0,0,92,171,1,0,28,32,0,0,98,171,1,0,100,34,0,0,101,171,1,0,10,35,0,0,108,171,1,0,23,34,0,0,115,171,1,0,202,37,0,0,119,171,1,0,14,32,0,0,123,171,1,0,57,32,0,0,130,171,1,0,24,32,0,0,136,171,1,0,60,0,0,0,139,171,1,0,175,0,0,0,144,171,1,0,20,32,0,0,150,171,1,0,181,0,0,0,156,171,1,0,183,0,0,0,115,180,1,0,18,34,0,0,163,171,1,0,188,3,0,0,166,171,1,0,7,34,0,0,172,171,1,0,160,0,0,0,177,171,1,0,19,32,0,0,183,171,1,0,96,34,0,0,186,171,1,0,11,34,0,0,189,171,1,0,172,0,0,0,193,171,1,0,9,34,0,0,199,171,1,0,132,34,0,0,204,171,1,0,241,0,0,0,211,171,1,0,189,3,0,0,214,171,1,0,243,0,0,0,221,171,1,0,244,0,0,0,227,171,1,0,83,1,0,0,233,171,1,0,242,0,0,0,240,171,1,0,62,32,0,0,246,171,1,0,201,3,0,0,252,171,1,0,191,3,0,0,4,172,1,0,149,34,0,0,10,172,1,0,40,34,0,0,13,172,1,0,170,0,0,0,18,172,1,0,186,0,0,0,23,172,1,0,248,0,0,0,30,172,1,0,245,0,0,0,37,172,1,0,151,34,0,0,44,172,1,0,246,0,0,0,49,172,1,0,182,0,0,0,54,172,1,0,2,34,0,0,59,172,1,0,48,32,0,0,66,172,1,0,165,34,0,0,71,172,1,0,198,3,0,0,75,172,1,0,192,3,0,0,78,172,1,0,214,3,0,0,82,172,1,0,177,0,0,0,89,172,1,0,163,0,0,0,95,172,1,0,50,32,0,0,101,172,1,0,15,34,0,0,106,172,1,0,29,34,0,0,111,172,1,0,200,3,0,0,115,172,1,0,34,0,0,0,120,172,1,0,210,33,0,0,125,172,1,0,26,34,0,0,131,172,1,0,42,35,0,0,136,172,1,0,187,0,0,0,142,172,1,0,146,33,0,0,147,172,1,0,9,35,0,0,153,172,1,0,29,32,0,0,159,172,1,0,28,33,0,0,164,172,1,0,174,0,0,0,168,172,1,0,11,35,0,0,175,172,1,0,193,3,0,0,179,172,1,0,15,32,0,0,183,172,1,0,58,32,0,0,190,172,1,0,25,32,0,0,196,172,1,0,26,32,0,0,202,172,1,0,97,1,0,0,209,172,1,0,197,34,0,0,214,172,1,0,167,0,0,0,219,172,1,0,173,0,0,0,223,172,1,0,195,3,0,0,229,172,1,0,194,3,0,0,236,172,1,0,60,34,0,0,240,172,1,0,96,38,0,0,247,172,1,0,130,34,0,0,251,172,1,0,134,34,0,0,0,173,1,0,17,34,0,0,4,173,1,0,131,34,0,0,8,173,1,0,185,0,0,0,13,173,1,0,178,0,0,0,18,173,1,0,179,0,0,0,23,173,1,0,135,34,0,0,28,173,1,0,223,0,0,0,34,173,1,0,196,3,0,0,38,173,1,0,52,34,0,0,45,173,1,0,184,3,0,0,51,173,1,0,209,3,0,0,60,173,1,0,9,32,0,0,67,173,1,0,254,0,0,0,73,173,1,0,220,2,0,0,79,173,1,0,215,0,0,0,85,173,1,0,34,33,0,0,91,173,1,0,209,33,0,0,96,173,1,0,250,0,0,0,103,173,1,0,145,33,0,0,108,173,1,0,251,0,0,0,114,173,1,0,249,0,0,0,121,173,1,0,168,0,0,0,125,173,1,0,210,3,0,0,131,173,1,0,197,3,0,0,139,173,1,0,252,0,0,0,144,173,1,0,24,33,0,0,151,173,1,0,190,3,0,0,154,173,1,0,253,0,0,0,161,173,1,0,165,0,0,0,165,173,1,0,255,0,0,0,170,173,1,0,182,3,0,0,175,173,1,0,13,32,0,0,179,173,1,0,12,32,0,0,7,0,0,0,8,0,0,0,1,1,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,47,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,180,1,0,9,0,0,0,53,180,1,0,10,0,0,0,58,180,1,0,10,0,0,0,66,180,1,0,11,0,0,0,72,180,1,0,11,0,0,0,81,180,1,0,12,0,0,0,84,180,1,0,12,0,0,0,90,180,1,0,13,0,0,0,95,180,1,0,13,0,0,0,103,180,1,0,14,0,0,0,108,180,1,0,14,0,0,0,115,180,1,0,15,0,0,0,121,180,1,0,15,0,0,0,133,180,1,0,16,0,0,0,14,0,0,0,98,0,0,0,49,0,0,0,50,0,0,0,20,0,0,0,51,0,0,0,99,0,0,0,52,0,0,0,21,0,0,0,53,0,0,0,8,0,0,0,4,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,181,1,0,85,93,201,127,201,127,255,0,219,181,1,0,187,45,212,190,174,212,255,0,230,181,1,0,20,119,253,253,192,134,255,0,241,181,1,0,85,93,201,127,201,127,255,0,252,181,1,0,187,45,212,190,174,212,255,0,7,182,1,0,20,119,253,253,192,134,255,0,18,182,1,0,42,102,255,255,255,153,255,0,29,182,1,0,85,93,201,127,201,127,255,0,40,182,1,0,187,45,212,190,174,212,255,0,51,182,1,0,20,119,253,253,192,134,255,0,62,182,1,0,42,102,255,255,255,153,255,0,73,182,1,0,151,173,176,56,108,176,255,0,84,182,1,0,85,93,201,127,201,127,255,0,95,182,1,0,187,45,212,190,174,212,255,0,106,182,1,0,20,119,253,253,192,134,255,0,117,182,1,0,42,102,255,255,255,153,255,0,128,182,1,0,151,173,176,56,108,176,255,0,139,182,1,0,232,252,240,240,2,127,255,0,150,182,1,0,85,93,201,127,201,127,255,0,161,182,1,0,187,45,212,190,174,212,255,0,172,182,1,0,20,119,253,253,192,134,255,0,183,182,1,0,42,102,255,255,255,153,255,0,194,182,1,0,151,173,176,56,108,176,255,0,205,182,1,0,232,252,240,240,2,127,255,0,216,182,1,0,17,224,191,191,91,23,255,0,227,182,1,0,85,93,201,127,201,127,255,0,238,182,1,0,187,45,212,190,174,212,255,0,249,182,1,0,20,119,253,253,192,134,255,0,4,183,1,0,42,102,255,255,255,153,255,0,15,183,1,0,151,173,176,56,108,176,255,0,26,183,1,0,232,252,240,240,2,127,255,0,37,183,1,0,17,224,191,191,91,23,255,0,48,183,1,0,0,0,102,102,102,102,255,0,59,183,1,0,147,25,247,222,235,247,255,0,69,183,1,0,142,75,225,158,202,225,255,0,79,183,1,0,145,188,189,49,130,189,255,0,89,183,1,0,159,16,255,239,243,255,255,0,99,183,1,0,143,46,231,189,215,231,255,0,109,183,1,0,143,127,214,107,174,214,255,0,119,183,1,0,147,208,181,33,113,181,255,0,129,183,1,0,159,16,255,239,243,255,255,0,139,183,1,0,143,46,231,189,215,231,255,0,149,183,1,0,143,127,214,107,174,214,255,0,159,183,1,0,145,188,189,49,130,189,255,0,169,183,1,0,149,241,156,8,81,156,255,0,179,183,1,0,159,16,255,239,243,255,255,0,189,183,1,0,148,43,239,198,219,239,255,0,199,183,1,0,142,75,225,158,202,225,255,0,209,183,1,0,143,127,214,107,174,214,255,0,219,183,1,0,145,188,189,49,130,189,255,0,229,183,1,0,149,241,156,8,81,156,255,0,239,183,1,0,159,16,255,239,243,255,255,0,249,183,1,0,148,43,239,198,219,239,255,0,3,184,1,0,142,75,225,158,202,225,255,0,13,184,1,0,143,127,214,107,174,214,255,0,23,184,1,0,144,169,198,66,146,198,255,0,33,184,1,0,147,208,181,33,113,181,255,0,43,184,1,0,151,241,148,8,69,148,255,0,53,184,1,0,148,8,255,247,251,255,255,0,63,184,1,0,147,25,247,222,235,247,255,0,73,184,1,0,148,43,239,198,219,239,255,0,83,184,1,0,142,75,225,158,202,225,255,0,93,184,1,0,143,127,214,107,174,214,255,0,103,184,1,0,144,169,198,66,146,198,255,0,113,184,1,0,147,208,181,33,113,181,255,0,123,184,1,0,151,241,148,8,69,148,255,0,133,184,1,0,148,8,255,247,251,255,255,0,143,184,1,0,147,25,247,222,235,247,255,0,153,184,1,0,148,43,239,198,219,239,255,0,163,184,1,0,142,75,225,158,202,225,255,0,173,184,1,0,143,127,214,107,174,214,255,0,183,184,1,0,144,169,198,66,146,198,255,0,193,184,1,0,147,208,181,33,113,181,255,0,203,184,1,0,149,241,156,8,81,156,255,0,213,184,1,0,152,235,107,8,48,107,255,0,223,184,1,0,23,239,84,84,48,5,255,0,233,184,1,0,119,255,60,0,60,48,255,0,244,184,1,0,23,236,140,140,81,10,255,0,254,184,1,0,24,194,191,191,129,45,255,0,8,185,1,0,29,112,223,223,194,125,255,0,18,185,1,0,30,52,246,246,232,195,255,0,28,185,1,0,121,38,234,199,234,229,255,0,38,185,1,0,120,95,205,128,205,193,255,0,48,185,1,0,124,165,151,53,151,143,255,0,58,185,1,0,124,252,102,1,102,94,255,0,68,185,1,0,23,239,84,84,48,5,255,0,78,185,1,0,124,252,102,1,102,94,255,0,89,185,1,0,119,255,60,0,60,48,255,0,100,185,1,0,23,236,140,140,81,10,255,0,110,185,1,0,24,194,191,191,129,45,255,0,120,185,1,0,29,112,223,223,194,125,255,0,130,185,1,0,30,52,246,246,232,195,255,0,140,185,1,0,0,0,245,245,245,245,255,0,150,185,1,0,121,38,234,199,234,229,255,0,160,185,1,0,120,95,205,128,205,193,255,0,170,185,1,0,124,165,151,53,151,143,255,0,180,185,1,0,28,135,216,216,179,101,255,0,189,185,1,0,0,0,245,245,245,245,255,0,198,185,1,0,123,127,180,90,180,172,255,0,207,185,1,0,21,215,166,166,97,26,255,0,216,185,1,0,29,112,223,223,194,125,255,0,225,185,1,0,120,95,205,128,205,193,255,0,234,185,1,0,121,253,133,1,133,113,255,0,243,185,1,0,21,215,166,166,97,26,255,0,252,185,1,0,29,112,223,223,194,125,255,0,5,186,1,0,0,0,245,245,245,245,255,0,14,186,1,0,120,95,205,128,205,193,255,0,23,186,1,0,121,253,133,1,133,113,255,0,32,186,1,0,23,236,140,140,81,10,255,0,41,186,1,0,28,135,216,216,179,101,255,0,50,186,1,0,30,52,246,246,232,195,255,0,59,186,1,0,121,38,234,199,234,229,255,0,68,186,1,0,123,127,180,90,180,172,255,0,77,186,1,0,124,252,102,1,102,94,255,0,86,186,1,0,23,236,140,140,81,10,255,0,95,186,1,0,28,135,216,216,179,101,255,0,104,186,1,0,30,52,246,246,232,195,255,0,113,186,1,0,0,0,245,245,245,245,255,0,122,186,1,0,121,38,234,199,234,229,255,0,131,186,1,0,123,127,180,90,180,172,255,0,140,186,1,0,124,252,102,1,102,94,255,0,149,186,1,0,23,236,140,140,81,10,255,0,158,186,1,0,24,194,191,191,129,45,255,0,167,186,1,0,29,112,223,223,194,125,255,0,176,186,1,0,30,52,246,246,232,195,255,0,185,186,1,0,121,38,234,199,234,229,255,0,194,186,1,0,120,95,205,128,205,193,255,0,203,186,1,0,124,165,151,53,151,143,255,0,212,186,1,0,124,252,102,1,102,94,255,0,221,186,1,0,23,236,140,140,81,10,255,0,230,186,1,0,24,194,191,191,129,45,255,0,239,186,1,0,29,112,223,223,194,125,255,0,248,186,1,0,30,52,246,246,232,195,255,0,1,187,1,0,0,0,245,245,245,245,255,0,10,187,1,0,121,38,234,199,234,229,255,0,19,187,1,0,120,95,205,128,205,193,255,0,28,187,1,0,124,165,151,53,151,143,255,0,37,187,1,0,124,252,102,1,102,94,255,0,46,187,1,0,135,20,249,229,245,249,255,0,55,187,1,0,117,74,216,153,216,201,255,0,64,187,1,0,103,185,162,44,162,95,255,0,73,187,1,0,136,14,251,237,248,251,255,0,82,187,1,0,127,54,226,178,226,226,255,0,91,187,1,0,113,120,194,102,194,164,255,0,100,187,1,0,98,190,139,35,139,69,255,0,109,187,1,0,136,14,251,237,248,251,255,0,118,187,1,0,127,54,226,178,226,226,255,0,127,187,1,0,113,120,194,102,194,164,255,0,136,187,1,0,103,185,162,44,162,95,255,0,145,187,1,0,102,255,109,0,109,44,255,0,154,187,1,0,136,14,251,237,248,251,255,0,163,187,1,0,119,34,236,204,236,230,255,0,172,187,1,0,117,74,216,153,216,201,255,0,181,187,1,0,113,120,194,102,194,164,255,0,190,187,1,0,103,185,162,44,162,95,255,0,199,187,1,0,102,255,109,0,109,44,255,0,208,187,1,0,136,14,251,237,248,251,255,0,217,187,1,0,119,34,236,204,236,230,255,0,226,187,1,0,117,74,216,153,216,201,255,0,235,187,1,0,113,120,194,102,194,164,255,0,244,187,1,0,105,159,174,65,174,118,255,0,253,187,1,0,98,190,139,35,139,69,255,0,6,188,1,0,102,255,88,0,88,36,255,0,15,188,1,0,134,6,253,247,252,253,255,0,24,188,1,0,135,20,249,229,245,249,255,0,33,188,1,0,119,34,236,204,236,230,255,0,42,188,1,0,117,74,216,153,216,201,255,0,51,188,1,0,113,120,194,102,194,164,255,0,60,188,1,0,105,159,174,65,174,118,255,0,69,188,1,0,98,190,139,35,139,69,255,0,78,188,1,0,102,255,88,0,88,36,255,0,87,188,1,0,134,6,253,247,252,253,255,0,96,188,1,0,135,20,249,229,245,249,255,0,105,188,1,0,119,34,236,204,236,230,255,0,114,188,1,0,117,74,216,153,216,201,255,0,123,188,1,0,113,120,194,102,194,164,255,0,132,188,1,0,105,159,174,65,174,118,255,0,141,188,1,0,98,190,139,35,139,69,255,0,150,188,1,0,102,255,109,0,109,44,255,0,159,188,1,0,101,255,68,0,68,27,255,0,168,188,1,0,144,20,244,224,236,244,255,0,177,188,1,0,148,70,218,158,188,218,255,0,186,188,1,0,196,123,167,136,86,167,255,0,195,188,1,0,136,14,251,237,248,251,255,0,204,188,1,0,146,53,227,179,205,227,255,0,213,188,1,0,162,74,198,140,150,198,255,0,222,188,1,0,202,149,157,136,65,157,255,0,231,188,1,0,136,14,251,237,248,251,255,0,240,188,1,0,146,53,227,179,205,227,255,0,249,188,1,0,162,74,198,140,150,198,255,0,2,189,1,0,196,123,167,136,86,167,255,0,11,189,1,0,214,225,129,129,15,124,255,0,20,189,1,0,136,14,251,237,248,251,255,0,29,189,1,0,148,43,230,191,211,230,255,0,38,189,1,0,148,70,218,158,188,218,255,0,47,189,1,0,162,74,198,140,150,198,255,0,56,189,1,0,196,123,167,136,86,167,255,0,65,189,1,0,214,225,129,129,15,124,255,0,74,189,1,0,136,14,251,237,248,251,255,0,83,189,1,0,148,43,230,191,211,230,255,0,92,189,1,0,148,70,218,158,188,218,255,0,101,189,1,0,162,74,198,140,150,198,255,0,110,189,1,0,190,100,177,140,107,177,255,0,119,189,1,0,202,149,157,136,65,157,255,0,128,189,1,0,213,252,110,110,1,107,255,0,137,189,1,0,134,6,253,247,252,253,255,0,146,189,1,0,144,20,244,224,236,244,255,0,155,189,1,0,148,43,230,191,211,230,255,0,164,189,1,0,148,70,218,158,188,218,255,0,173,189,1,0,162,74,198,140,150,198,255,0,182,189,1,0,190,100,177,140,107,177,255,0,191,189,1,0,202,149,157,136,65,157,255,0,200,189,1,0,213,252,110,110,1,107,255,0,209,189,1,0,134,6,253,247,252,253,255,0,218,189,1,0,144,20,244,224,236,244,255,0,227,189,1,0,148,43,230,191,211,230,255,0,236,189,1,0,148,70,218,158,188,218,255,0,245,189,1,0,162,74,198,140,150,198,255,0,254,189,1,0,190,100,177,140,107,177,255,0,7,190,1,0,202,149,157,136,65,157,255,0,16,190,1,0,214,225,129,129,15,124,255,0,25,190,1,0,213,255,77,77,0,75,255,0,34,190,1,0,114,211,158,27,158,119,255,0,44,190,1,0,18,252,217,217,95,2,255,0,54,190,1,0,173,95,179,117,112,179,255,0,64,190,1,0,114,211,158,27,158,119,255,0,74,190,1,0,18,252,217,217,95,2,255,0,84,190,1,0,173,95,179,117,112,179,255,0,94,190,1,0,233,209,231,231,41,138,255,0,104,190,1,0,114,211,158,27,158,119,255,0,114,190,1,0,18,252,217,217,95,2,255,0,124,190,1,0,173,95,179,117,112,179,255,0,134,190,1,0,233,209,231,231,41,138,255,0,144,190,1,0,62,208,166,102,166,30,255,0,154,190,1,0,114,211,158,27,158,119,255,0,164,190,1,0,18,252,217,217,95,2,255,0,174,190,1,0,173,95,179,117,112,179,255,0,184,190,1,0,233,209,231,231,41,138,255,0,194,190,1,0,62,208,166,102,166,30,255,0,204,190,1,0,31,252,230,230,171,2,255,0,214,190,1,0,114,211,158,27,158,119,255,0,224,190,1,0,18,252,217,217,95,2,255,0,234,190,1,0,173,95,179,117,112,179,255,0,244,190,1,0,233,209,231,231,41,138,255,0,254,190,1,0,62,208,166,102,166,30,255,0,8,191,1,0,31,252,230,230,171,2,255,0,18,191,1,0,27,210,166,166,118,29,255,0,28,191,1,0,114,211,158,27,158,119,255,0,38,191,1,0,18,252,217,217,95,2,255,0,48,191,1,0,173,95,179,117,112,179,255,0,58,191,1,0,233,209,231,231,41,138,255,0,68,191,1,0,62,208,166,102,166,30,255,0,78,191,1,0,31,252,230,230,171,2,255,0,88,191,1,0,27,210,166,166,118,29,255,0,98,191,1,0,0,0,102,102,102,102,255,0,108,191,1,0,76,25,243,224,243,219,255,0,117,191,1,0,95,61,221,168,221,181,255,0,126,191,1,0,140,170,202,67,162,202,255,0,135,191,1,0,65,17,249,240,249,232,255,0,144,191,1,0,87,46,228,186,228,188,255,0,153,191,1,0,123,101,204,123,204,196,255,0,162,191,1,0,141,197,190,43,140,190,255,0,171,191,1,0,65,17,249,240,249,232,255,0,180,191,1,0,87,46,228,186,228,188,255,0,189,191,1,0,123,101,204,123,204,196,255,0,198,191,1,0,140,170,202,67,162,202,255,0,207,191,1,0,145,243,172,8,104,172,255,0,216,191,1,0,65,17,249,240,249,232,255,0,225,191,1,0,77,41,235,204,235,197,255,0,234,191,1,0,95,61,221,168,221,181,255,0,243,191,1,0,123,101,204,123,204,196,255,0,252,191,1,0,140,170,202,67,162,202,255,0,5,192,1,0,145,243,172,8,104,172,255,0,14,192,1,0,65,17,249,240,249,232,255,0,23,192,1,0,77,41,235,204,235,197,255,0,32,192,1,0,95,61,221,168,221,181,255,0,41,192,1,0,123,101,204,123,204,196,255,0,50,192,1,0,137,160,211,78,179,211,255,0,59,192,1,0,141,197,190,43,140,190,255,0,68,192,1,0,147,242,158,8,88,158,255,0,77,192,1,0,60,12,252,247,252,240,255,0,86,192,1,0,76,25,243,224,243,219,255,0,95,192,1,0,77,41,235,204,235,197,255,0,104,192,1,0,95,61,221,168,221,181,255,0,113,192,1,0,123,101,204,123,204,196,255,0,122,192,1,0,137,160,211,78,179,211,255,0,131,192,1,0,141,197,190,43,140,190,255,0,140,192,1,0,147,242,158,8,88,158,255,0,149,192,1,0,60,12,252,247,252,240,255,0,158,192,1,0,76,25,243,224,243,219,255,0,167,192,1,0,77,41,235,204,235,197,255,0,176,192,1,0,95,61,221,168,221,181,255,0,185,192,1,0,123,101,204,123,204,196,255,0,194,192,1,0,137,160,211,78,179,211,255,0,203,192,1,0,141,197,190,43,140,190,255,0,212,192,1,0,145,243,172,8,104,172,255,0,221,192,1,0,150,239,129,8,64,129,255,0,230,192,1,0,74,21,245,229,245,224,255,0,241,192,1,0,80,72,217,161,217,155,255,0,252,192,1,0,98,178,163,49,163,84,255,0,7,193,1,0,73,15,248,237,248,233,255,0,18,193,1,0,78,54,228,186,228,179,255,0,29,193,1,0,86,104,196,116,196,118,255,0,40,193,1,0,98,190,139,35,139,69,255,0,51,193,1,0,73,15,248,237,248,233,255,0,62,193,1,0,78,54,228,186,228,179,255,0,73,193,1,0,86,104,196,116,196,118,255,0,84,193,1,0,98,178,163,49,163,84,255,0,95,193,1,0,102,255,109,0,109,44,255,0,106,193,1,0,73,15,248,237,248,233,255,0,117,193,1,0,77,44,233,199,233,192,255,0,128,193,1,0,80,72,217,161,217,155,255,0,139,193,1,0,86,104,196,116,196,118,255,0,150,193,1,0,98,178,163,49,163,84,255,0,161,193,1,0,102,255,109,0,109,44,255,0,172,193,1,0,73,15,248,237,248,233,255,0,183,193,1,0,77,44,233,199,233,192,255,0,194,193,1,0,80,72,217,161,217,155,255,0,205,193,1,0,86,104,196,116,196,118,255,0,216,193,1,0,96,158,171,65,171,93,255,0,227,193,1,0,98,190,139,35,139,69,255,0,238,193,1,0,108,255,90,0,90,50,255,0,249,193,1,0,72,7,252,247,252,245,255,0,4,194,1,0,74,21,245,229,245,224,255,0,15,194,1,0,77,44,233,199,233,192,255,0,26,194,1,0,80,72,217,161,217,155,255,0,37,194,1,0,86,104,196,116,196,118,255,0,48,194,1,0,96,158,171,65,171,93,255,0,59,194,1,0,98,190,139,35,139,69,255,0,70,194,1,0,108,255,90,0,90,50,255,0,81,194,1,0,72,7,252,247,252,245,255,0,92,194,1,0,74,21,245,229,245,224,255,0,103,194,1,0,77,44,233,199,233,192,255,0,114,194,1,0,80,72,217,161,217,155,255,0,125,194,1,0,86,104,196,116,196,118,255,0,136,194,1,0,96,158,171,65,171,93,255,0,147,194,1,0,98,190,139,35,139,69,255,0,158,194,1,0,102,255,109,0,109,44,255,0,169,194,1,0,101,255,68,0,68,27,255,0,180,194,1,0,0,0,240,240,240,240,255,0,190,194,1,0,0,0,189,189,189,189,255,0,200,194,1,0,0,0,99,99,99,99,255,0,210,194,1,0,0,0,247,247,247,247,255,0,220,194,1,0,0,0,204,204,204,204,255,0,230,194,1,0,0,0,150,150,150,150,255,0,240,194,1,0,0,0,82,82,82,82,255,0,250,194,1,0,0,0,247,247,247,247,255,0,4,195,1,0,0,0,204,204,204,204,255,0,14,195,1,0,0,0,150,150,150,150,255,0,24,195,1,0,0,0,99,99,99,99,255,0,34,195,1,0,0,0,37,37,37,37,255,0,44,195,1,0,0,0,247,247,247,247,255,0,54,195,1,0,0,0,217,217,217,217,255,0,64,195,1,0,0,0,189,189,189,189,255,0,74,195,1,0,0,0,150,150,150,150,255,0,84,195,1,0,0,0,99,99,99,99,255,0,94,195,1,0,0,0,37,37,37,37,255,0,104,195,1,0,0,0,247,247,247,247,255,0,114,195,1,0,0,0,217,217,217,217,255,0,124,195,1,0,0,0,189,189,189,189,255,0,134,195,1,0,0,0,150,150,150,150,255,0,144,195,1,0,0,0,115,115,115,115,255,0,154,195,1,0,0,0,82,82,82,82,255,0,164,195,1,0,0,0,37,37,37,37,255,0,174,195,1,0,0,0,255,255,255,255,255,0,184,195,1,0,0,0,240,240,240,240,255,0,194,195,1,0,0,0,217,217,217,217,255,0,204,195,1,0,0,0,189,189,189,189,255,0,214,195,1,0,0,0,150,150,150,150,255,0,224,195,1,0,0,0,115,115,115,115,255,0,234,195,1,0,0,0,82,82,82,82,255,0,244,195,1,0,0,0,37,37,37,37,255,0,254,195,1,0,0,0,255,255,255,255,255,0,8,196,1,0,0,0,240,240,240,240,255,0,18,196,1,0,0,0,217,217,217,217,255,0,28,196,1,0,0,0,189,189,189,189,255,0,38,196,1,0,0,0,150,150,150,150,255,0,48,196,1,0,0,0,115,115,115,115,255,0,58,196,1,0,0,0,82,82,82,82,255,0,68,196,1,0,0,0,37,37,37,37,255,0,78,196,1,0,0,0,0,0,0,0,255,0,88,196,1,0,21,48,254,254,230,206,255,0,100,196,1,0,19,147,253,253,174,107,255,0,112,196,1,0,14,240,230,230,85,13,255,0,124,196,1,0,19,32,254,254,237,222,255,0,136,196,1,0,20,120,253,253,190,133,255,0,148,196,1,0,17,194,253,253,141,60,255,0,160,196,1,0,13,253,217,217,71,1,255,0,172,196,1,0,19,32,254,254,237,222,255,0,184,196,1,0,20,120,253,253,190,133,255,0,196,196,1,0,17,194,253,253,141,60,255,0,208,196,1,0,14,240,230,230,85,13,255,0,220,196,1,0,13,250,166,166,54,3,255,0,232,196,1,0,19,32,254,254,237,222,255,0,244,196,1],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+20484);allocate([21,91,253,253,208,162,255,0,0,197,1,0,19,147,253,253,174,107,255,0,12,197,1,0,17,194,253,253,141,60,255,0,24,197,1,0,14,240,230,230,85,13,255,0,36,197,1,0,13,250,166,166,54,3,255,0,48,197,1,0,19,32,254,254,237,222,255,0,60,197,1,0,21,91,253,253,208,162,255,0,72,197,1,0,19,147,253,253,174,107,255,0,84,197,1,0,17,194,253,253,141,60,255,0,96,197,1,0,16,234,241,241,105,19,255,0,108,197,1,0,13,253,217,217,72,1,255,0,120,197,1,0,12,247,140,140,45,4,255,0,132,197,1,0,21,20,255,255,245,235,255,0,144,197,1,0,21,48,254,254,230,206,255,0,156,197,1,0,21,91,253,253,208,162,255,0,168,197,1,0,19,147,253,253,174,107,255,0,180,197,1,0,17,194,253,253,141,60,255,0,192,197,1,0,16,234,241,241,105,19,255,0,204,197,1,0,13,253,217,217,72,1,255,0,216,197,1,0,12,247,140,140,45,4,255,0,228,197,1,0,21,20,255,255,245,235,255,0,240,197,1,0,21,48,254,254,230,206,255,0,252,197,1,0,21,91,253,253,208,162,255,0,8,198,1,0,19,147,253,253,174,107,255,0,20,198,1,0,17,194,253,253,141,60,255,0,32,198,1,0,16,234,241,241,105,19,255,0,44,198,1,0,13,253,217,217,72,1,255,0,56,198,1,0,13,250,166,166,54,3,255,0,68,198,1,0,12,246,127,127,39,4,255,0,80,198,1,0,25,54,254,254,232,200,255,0,89,198,1,0,19,121,253,253,187,132,255,0,98,198,1,0,5,197,227,227,74,51,255,0,107,198,1,0,26,37,254,254,240,217,255,0,116,198,1,0,24,115,253,253,204,138,255,0,125,198,1,0,13,164,252,252,141,89,255,0,134,198,1,0,3,218,215,215,48,31,255,0,143,198,1,0,26,37,254,254,240,217,255,0,152,198,1,0,24,115,253,253,204,138,255,0,161,198,1,0,13,164,252,252,141,89,255,0,170,198,1,0,5,197,227,227,74,51,255,0,179,198,1,0,0,255,179,179,0,0,255,0,188,198,1,0,26,37,254,254,240,217,255,0,197,198,1,0,24,95,253,253,212,158,255,0,206,198,1,0,19,121,253,253,187,132,255,0,215,198,1,0,13,164,252,252,141,89,255,0,224,198,1,0,5,197,227,227,74,51,255,0,233,198,1,0,0,255,179,179,0,0,255,0,242,198,1,0,26,37,254,254,240,217,255,0,251,198,1,0,24,95,253,253,212,158,255,0,4,199,1,0,19,121,253,253,187,132,255,0,13,199,1,0,13,164,252,252,141,89,255,0,22,199,1,0,7,178,239,239,101,72,255,0,31,199,1,0,3,218,215,215,48,31,255,0,40,199,1,0,0,255,153,153,0,0,255,0,49,199,1,0,24,18,255,255,247,236,255,0,58,199,1,0,25,54,254,254,232,200,255,0,67,199,1,0,24,95,253,253,212,158,255,0,76,199,1,0,19,121,253,253,187,132,255,0,85,199,1,0,13,164,252,252,141,89,255,0,94,199,1,0,7,178,239,239,101,72,255,0,103,199,1,0,3,218,215,215,48,31,255,0,112,199,1,0,0,255,153,153,0,0,255,0,121,199,1,0,24,18,255,255,247,236,255,0,130,199,1,0,25,54,254,254,232,200,255,0,139,199,1,0,24,95,253,253,212,158,255,0,148,199,1,0,19,121,253,253,187,132,255,0,157,199,1,0,13,164,252,252,141,89,255,0,166,199,1,0,7,178,239,239,101,72,255,0,175,199,1,0,3,218,215,215,48,31,255,0,184,199,1,0,0,255,179,179,0,0,255,0,193,199,1,0,0,255,127,127,0,0,255,0,202,199,1,0,142,68,227,166,206,227,255,0,214,199,1,0,190,153,154,106,61,154,255,0,227,199,1,0,144,211,180,31,120,180,255,0,239,199,1,0,65,97,223,178,223,138,255,0,251,199,1,0,82,184,160,51,160,44,255,0,7,200,1,0,0,99,251,251,154,153,255,0,19,200,1,0,254,225,227,227,26,28,255,0,31,200,1,0,23,143,253,253,191,111,255,0,43,200,1,0,21,255,255,255,127,0,255,0,55,200,1,0,198,42,214,202,178,214,255,0,67,200,1,0,142,68,227,166,206,227,255,0,79,200,1,0,190,153,154,106,61,154,255,0,92,200,1,0,42,102,255,255,255,153,255,0,105,200,1,0,144,211,180,31,120,180,255,0,117,200,1,0,65,97,223,178,223,138,255,0,129,200,1,0,82,184,160,51,160,44,255,0,141,200,1,0,0,99,251,251,154,153,255,0,153,200,1,0,254,225,227,227,26,28,255,0,165,200,1,0,23,143,253,253,191,111,255,0,177,200,1,0,21,255,255,255,127,0,255,0,189,200,1,0,198,42,214,202,178,214,255,0,201,200,1,0,142,68,227,166,206,227,255,0,213,200,1,0,190,153,154,106,61,154,255,0,226,200,1,0,42,102,255,255,255,153,255,0,239,200,1,0,15,197,177,177,89,40,255,0,252,200,1,0,144,211,180,31,120,180,255,0,8,201,1,0,65,97,223,178,223,138,255,0,20,201,1,0,82,184,160,51,160,44,255,0,32,201,1,0,0,99,251,251,154,153,255,0,44,201,1,0,254,225,227,227,26,28,255,0,56,201,1,0,23,143,253,253,191,111,255,0,68,201,1,0,21,255,255,255,127,0,255,0,80,201,1,0,198,42,214,202,178,214,255,0,92,201,1,0,142,68,227,166,206,227,255,0,103,201,1,0,144,211,180,31,120,180,255,0,114,201,1,0,65,97,223,178,223,138,255,0,125,201,1,0,142,68,227,166,206,227,255,0,136,201,1,0,144,211,180,31,120,180,255,0,147,201,1,0,65,97,223,178,223,138,255,0,158,201,1,0,82,184,160,51,160,44,255,0,169,201,1,0,142,68,227,166,206,227,255,0,180,201,1,0,144,211,180,31,120,180,255,0,191,201,1,0,65,97,223,178,223,138,255,0,202,201,1,0,82,184,160,51,160,44,255,0,213,201,1,0,0,99,251,251,154,153,255,0,224,201,1,0,142,68,227,166,206,227,255,0,235,201,1,0,144,211,180,31,120,180,255,0,246,201,1,0,65,97,223,178,223,138,255,0,1,202,1,0,82,184,160,51,160,44,255,0,12,202,1,0,0,99,251,251,154,153,255,0,23,202,1,0,254,225,227,227,26,28,255,0,34,202,1,0,142,68,227,166,206,227,255,0,45,202,1,0,144,211,180,31,120,180,255,0,56,202,1,0,65,97,223,178,223,138,255,0,67,202,1,0,82,184,160,51,160,44,255,0,78,202,1,0,0,99,251,251,154,153,255,0,89,202,1,0,254,225,227,227,26,28,255,0,100,202,1,0,23,143,253,253,191,111,255,0,111,202,1,0,142,68,227,166,206,227,255,0,122,202,1,0,144,211,180,31,120,180,255,0,133,202,1,0,65,97,223,178,223,138,255,0,144,202,1,0,82,184,160,51,160,44,255,0,155,202,1,0,0,99,251,251,154,153,255,0,166,202,1,0,254,225,227,227,26,28,255,0,177,202,1,0,23,143,253,253,191,111,255,0,188,202,1,0,21,255,255,255,127,0,255,0,199,202,1,0,142,68,227,166,206,227,255,0,210,202,1,0,144,211,180,31,120,180,255,0,221,202,1,0,65,97,223,178,223,138,255,0,232,202,1,0,82,184,160,51,160,44,255,0,243,202,1,0,0,99,251,251,154,153,255,0,254,202,1,0,254,225,227,227,26,28,255,0,9,203,1,0,23,143,253,253,191,111,255,0,20,203,1,0,21,255,255,255,127,0,255,0,31,203,1,0,198,42,214,202,178,214,255,0,42,203,1,0,3,78,251,251,180,174,255,0,54,203,1,0,146,53,227,179,205,227,255,0,66,203,1,0,77,41,235,204,235,197,255,0,78,203,1,0,3,78,251,251,180,174,255,0,90,203,1,0,146,53,227,179,205,227,255,0,102,203,1,0,77,41,235,204,235,197,255,0,114,203,1,0,202,27,228,222,203,228,255,0,126,203,1,0,3,78,251,251,180,174,255,0,138,203,1,0,146,53,227,179,205,227,255,0,150,203,1,0,77,41,235,204,235,197,255,0,162,203,1,0,202,27,228,222,203,228,255,0,174,203,1,0,24,88,254,254,217,166,255,0,186,203,1,0,3,78,251,251,180,174,255,0,198,203,1,0,146,53,227,179,205,227,255,0,210,203,1,0,77,41,235,204,235,197,255,0,222,203,1,0,202,27,228,222,203,228,255,0,234,203,1,0,24,88,254,254,217,166,255,0,246,203,1,0,42,50,255,255,255,204,255,0,2,204,1,0,3,78,251,251,180,174,255,0,14,204,1,0,146,53,227,179,205,227,255,0,26,204,1,0,77,41,235,204,235,197,255,0,38,204,1,0,202,27,228,222,203,228,255,0,50,204,1,0,24,88,254,254,217,166,255,0,62,204,1,0,42,50,255,255,255,204,255,0,74,204,1,0,28,44,229,229,216,189,255,0,86,204,1,0,3,78,251,251,180,174,255,0,98,204,1,0,146,53,227,179,205,227,255,0,110,204,1,0,77,41,235,204,235,197,255,0,122,204,1,0,202,27,228,222,203,228,255,0,134,204,1,0,24,88,254,254,217,166,255,0,146,204,1,0,42,50,255,255,255,204,255,0,158,204,1,0,28,44,229,229,216,189,255,0,170,204,1,0,233,35,253,253,218,236,255,0,182,204,1,0,3,78,251,251,180,174,255,0,194,204,1,0,146,53,227,179,205,227,255,0,206,204,1,0,77,41,235,204,235,197,255,0,218,204,1,0,202,27,228,222,203,228,255,0,230,204,1,0,24,88,254,254,217,166,255,0,242,204,1,0,42,50,255,255,255,204,255,0,254,204,1,0,28,44,229,229,216,189,255,0,10,205,1,0,233,35,253,253,218,236,255,0,22,205,1,0,0,0,242,242,242,242,255,0,34,205,1,0,108,53,226,179,226,205,255,0,46,205,1,0,17,81,253,253,205,172,255,0,58,205,1,0,155,31,232,203,213,232,255,0,70,205,1,0,108,53,226,179,226,205,255,0,82,205,1,0,17,81,253,253,205,172,255,0,94,205,1,0,155,31,232,203,213,232,255,0,106,205,1,0,228,43,244,244,202,228,255,0,118,205,1,0,108,53,226,179,226,205,255,0,130,205,1,0,17,81,253,253,205,172,255,0,142,205,1,0,155,31,232,203,213,232,255,0,154,205,1,0,228,43,244,244,202,228,255,0,166,205,1,0,56,45,245,230,245,201,255,0,178,205,1,0,108,53,226,179,226,205,255,0,190,205,1,0,17,81,253,253,205,172,255,0,202,205,1,0,155,31,232,203,213,232,255,0,214,205,1,0,228,43,244,244,202,228,255,0,226,205,1,0,56,45,245,230,245,201,255,0,238,205,1,0,35,81,255,255,242,174,255,0,250,205,1,0,108,53,226,179,226,205,255,0,6,206,1,0,17,81,253,253,205,172,255,0,18,206,1,0,155,31,232,203,213,232,255,0,30,206,1,0,228,43,244,244,202,228,255,0,42,206,1,0,56,45,245,230,245,201,255,0,54,206,1,0,35,81,255,255,242,174,255,0,66,206,1,0,25,39,241,241,226,204,255,0,78,206,1,0,108,53,226,179,226,205,255,0,90,206,1,0,17,81,253,253,205,172,255,0,102,206,1,0,155,31,232,203,213,232,255,0,114,206,1,0,228,43,244,244,202,228,255,0,126,206,1,0,56,45,245,230,245,201,255,0,138,206,1,0,35,81,255,255,242,174,255,0,150,206,1,0,25,39,241,241,226,204,255,0,162,206,1,0,0,0,204,204,204,204,255,0,174,206,1,0,230,253,142,142,1,82,255,0,184,206,1,0,77,191,100,39,100,25,255,0,195,206,1,0,230,220,197,197,27,125,255,0,205,206,1,0,232,118,222,222,119,174,255,0,215,206,1,0,229,62,241,241,182,218,255,0,225,206,1,0,233,29,253,253,224,239,255,0,235,206,1,0,59,38,245,230,245,208,255,0,245,206,1,0,61,103,225,184,225,134,255,0,255,206,1,0,63,166,188,127,188,65,255,0,9,207,1,0,68,197,146,77,146,33,255,0,19,207,1,0,230,253,142,142,1,82,255,0,29,207,1,0,68,197,146,77,146,33,255,0,40,207,1,0,77,191,100,39,100,25,255,0,51,207,1,0,230,220,197,197,27,125,255,0,61,207,1,0,232,118,222,222,119,174,255,0,71,207,1,0,229,62,241,241,182,218,255,0,81,207,1,0,233,29,253,253,224,239,255,0,91,207,1,0,0,0,247,247,247,247,255,0,101,207,1,0,59,38,245,230,245,208,255,0,111,207,1,0,61,103,225,184,225,134,255,0,121,207,1,0,63,166,188,127,188,65,255,0,131,207,1,0,231,76,233,233,163,201,255,0,140,207,1,0,0,0,247,247,247,247,255,0,149,207,1,0,63,129,215,161,215,106,255,0,158,207,1,0,228,220,208,208,28,139,255,0,167,207,1,0,229,62,241,241,182,218,255,0,176,207,1,0,61,103,225,184,225,134,255,0,185,207,1,0,72,198,172,77,172,38,255,0,194,207,1,0,228,220,208,208,28,139,255,0,203,207,1,0,229,62,241,241,182,218,255,0,212,207,1,0,0,0,247,247,247,247,255,0,221,207,1,0,61,103,225,184,225,134,255,0,230,207,1,0,72,198,172,77,172,38,255,0,239,207,1,0,230,220,197,197,27,125,255,0,248,207,1,0,231,76,233,233,163,201,255,0,1,208,1,0,233,29,253,253,224,239,255,0,10,208,1,0,59,38,245,230,245,208,255,0,19,208,1,0,63,129,215,161,215,106,255,0,28,208,1,0,68,197,146,77,146,33,255,0,37,208,1,0,230,220,197,197,27,125,255,0,46,208,1,0,231,76,233,233,163,201,255,0,55,208,1,0,233,29,253,253,224,239,255,0,64,208,1,0,0,0,247,247,247,247,255,0,73,208,1,0,59,38,245,230,245,208,255,0,82,208,1,0,63,129,215,161,215,106,255,0,91,208,1,0,68,197,146,77,146,33,255,0,100,208,1,0,230,220,197,197,27,125,255,0,109,208,1,0,232,118,222,222,119,174,255,0,118,208,1,0,229,62,241,241,182,218,255,0,127,208,1,0,233,29,253,253,224,239,255,0,136,208,1,0,59,38,245,230,245,208,255,0,145,208,1,0,61,103,225,184,225,134,255,0,154,208,1,0,63,166,188,127,188,65,255,0,163,208,1,0,68,197,146,77,146,33,255,0,172,208,1,0,230,220,197,197,27,125,255,0,181,208,1,0,232,118,222,222,119,174,255,0,190,208,1,0,229,62,241,241,182,218,255,0,199,208,1,0,233,29,253,253,224,239,255,0,208,208,1,0,0,0,247,247,247,247,255,0,217,208,1,0,59,38,245,230,245,208,255,0,226,208,1,0,61,103,225,184,225,134,255,0,235,208,1,0,63,166,188,127,188,65,255,0,244,208,1,0,68,197,146,77,146,33,255,0,253,208,1,0,206,255,75,64,0,75,255,0,7,209,1,0,101,255,68,0,68,27,255,0,18,209,1,0,206,173,131,118,42,131,255,0,28,209,1,0,199,87,171,153,112,171,255,0,38,209,1,0,199,51,207,194,165,207,255,0,48,209,1,0,210,21,232,231,212,232,255,0,58,209,1,0,76,30,240,217,240,211,255,0,68,209,1,0,80,68,219,166,219,160,255,0,78,209,1,0,88,123,174,90,174,97,255,0,88,209,1,0,97,197,120,27,120,55,255,0,98,209,1,0,206,255,75,64,0,75,255,0,108,209,1,0,97,197,120,27,120,55,255,0,119,209,1,0,101,255,68,0,68,27,255,0,130,209,1,0,206,173,131,118,42,131,255,0,140,209,1,0,199,87,171,153,112,171,255,0,150,209,1,0,199,51,207,194,165,207,255,0,160,209,1,0,210,21,232,231,212,232,255,0,170,209,1,0,0,0,247,247,247,247,255,0,180,209,1,0,76,30,240,217,240,211,255,0,190,209,1,0,80,68,219,166,219,160,255,0,200,209,1,0,88,123,174,90,174,97,255,0,210,209,1,0,196,70,195,175,141,195,255,0,219,209,1,0,0,0,247,247,247,247,255,0,228,209,1,0,82,90,191,127,191,123,255,0,237,209,1,0,201,168,148,123,50,148,255,0,246,209,1,0,199,51,207,194,165,207,255,0,255,209,1,0,80,68,219,166,219,160,255,0,8,210,1,0,102,255,136,0,136,55,255,0,17,210,1,0,201,168,148,123,50,148,255,0,26,210,1,0,199,51,207,194,165,207,255,0,35,210,1,0,0,0,247,247,247,247,255,0,44,210,1,0,80,68,219,166,219,160,255,0,53,210,1,0,102,255,136,0,136,55,255,0,62,210,1,0,206,173,131,118,42,131,255,0,71,210,1,0,196,70,195,175,141,195,255,0,80,210,1,0,210,21,232,231,212,232,255,0,89,210,1,0,76,30,240,217,240,211,255,0,98,210,1,0,82,90,191,127,191,123,255,0,107,210,1,0,97,197,120,27,120,55,255,0,116,210,1,0,206,173,131,118,42,131,255,0,125,210,1,0,196,70,195,175,141,195,255,0,134,210,1,0,210,21,232,231,212,232,255,0,143,210,1,0,0,0,247,247,247,247,255,0,152,210,1,0,76,30,240,217,240,211,255,0,161,210,1,0,82,90,191,127,191,123,255,0,170,210,1,0,97,197,120,27,120,55,255,0,179,210,1,0,206,173,131,118,42,131,255,0,188,210,1,0,199,87,171,153,112,171,255,0,197,210,1,0,199,51,207,194,165,207,255,0,206,210,1,0,210,21,232,231,212,232,255,0,215,210,1,0,76,30,240,217,240,211,255,0,224,210,1,0,80,68,219,166,219,160,255,0,233,210,1,0,88,123,174,90,174,97,255,0,242,210,1,0,97,197,120,27,120,55,255,0,251,210,1,0,206,173,131,118,42,131,255,0,4,211,1,0,199,87,171,153,112,171,255,0,13,211,1,0,199,51,207,194,165,207,255,0,22,211,1,0,210,21,232,231,212,232,255,0,31,211,1,0,0,0,247,247,247,247,255,0,40,211,1,0,76,30,240,217,240,211,255,0,49,211,1,0,80,68,219,166,219,160,255,0,58,211,1,0,88,123,174,90,174,97,255,0,67,211,1,0,97,197,120,27,120,55,255,0,76,211,1,0,189,11,242,236,231,242,255,0,85,211,1,0,151,61,219,166,189,219,255,0,94,211,1,0,141,197,190,43,140,190,255,0,103,211,1,0,185,8,246,241,238,246,255,0,112,211,1,0,155,40,225,189,201,225,255,0,121,211,1,0,145,112,207,116,169,207,255,0,130,211,1,0,143,247,176,5,112,176,255,0,139,211,1,0,185,8,246,241,238,246,255,0,148,211,1,0,155,40,225,189,201,225,255,0,157,211,1,0,145,112,207,116,169,207,255,0,166,211,1,0,141,197,190,43,140,190,255,0,175,211,1,0,143,247,141,4,90,141,255,0,184,211,1,0,185,8,246,241,238,246,255,0,193,211,1,0,168,24,230,208,209,230,255,0,202,211,1,0,151,61,219,166,189,219,255,0,211,211,1,0,145,112,207,116,169,207,255,0,220,211,1,0,141,197,190,43,140,190,255,0,229,211,1,0,143,247,141,4,90,141,255,0,238,211,1,0,185,8,246,241,238,246,255,0,247,211,1,0,168,24,230,208,209,230,255,0,0,212,1,0,151,61,219,166,189,219,255,0,9,212,1,0,145,112,207,116,169,207,255,0,18,212,1,0,142,183,192,54,144,192,255,0,27,212,1,0,143,247,176,5,112,176,255,0,36,212,1,0,143,248,123,3,78,123,255,0,45,212,1,0,233,8,255,255,247,251,255,0,54,212,1,0,189,11,242,236,231,242,255,0,63,212,1,0,168,24,230,208,209,230,255,0,72,212,1,0,151,61,219,166,189,219,255,0,81,212,1,0,145,112,207,116,169,207,255,0,90,212,1,0,142,183,192,54,144,192,255,0,99,212,1,0,143,247,176,5,112,176,255,0,108,212,1,0,143,248,123,3,78,123,255,0,117,212,1,0,233,8,255,255,247,251,255,0,126,212,1,0,189,11,242,236,231,242,255,0,135,212,1,0,168,24,230,208,209,230,255,0,144,212,1,0,151,61,219,166,189,219,255,0,153,212,1,0,145,112,207,116,169,207,255,0,162,212,1,0,142,183,192,54,144,192,255,0,171,212,1,0,143,247,176,5,112,176,255,0,180,212,1,0,143,247,141,4,90,141,255,0,189,212,1,0,143,249,88,2,56,88,255,0,198,212,1,0,200,14,240,236,226,240,255,0,209,212,1,0,151,61,219,166,189,219,255,0,220,212,1,0,130,208,153,28,144,153,255,0,231,212,1,0,207,8,247,246,239,247,255,0,242,212,1,0,155,40,225,189,201,225,255,0,253,212,1,0,143,128,207,103,169,207,255,0,8,213,1,0,130,251,138,2,129,138,255,0,19,213,1,0,207,8,247,246,239,247,255,0,30,213,1,0,155,40,225,189,201,225,255,0,41,213,1,0,143,128,207,103,169,207,255,0,52,213,1,0,130,208,153,28,144,153,255,0,63,213,1,0,119,252,108,1,108,89,255,0,74,213,1,0,207,8,247,246,239,247,255,0,85,213,1,0,168,24,230,208,209,230,255,0,96,213,1,0,151,61,219,166,189,219,255,0,107,213,1,0,143,128,207,103,169,207,255,0,118,213,1,0,130,208,153,28,144,153,255,0,129,213,1,0,119,252,108,1,108,89,255,0,140,213,1,0,207,8,247,246,239,247,255,0,151,213,1,0,168,24,230,208,209,230,255,0,162,213,1,0,151,61,219,166,189,219,255,0,173,213,1,0,143,128,207,103,169,207,255,0,184,213,1,0,142,183,192,54,144,192,255,0,195,213,1,0,130,251,138,2,129,138,255,0,206,213,1,0,118,252,100,1,100,80,255,0,217,213,1,0,233,8,255,255,247,251,255,0,228,213,1,0,200,14,240,236,226,240,255,0,239,213,1,0,168,24,230,208,209,230,255,0,250,213,1,0,151,61,219,166,189,219,255,0,5,214,1,0,143,128,207,103,169,207,255,0,16,214,1,0,142,183,192,54,144,192,255,0,27,214,1,0,130,251,138,2,129,138,255,0,38,214,1,0,118,252,100,1,100,80,255,0,49,214,1,0,233,8,255,255,247,251,255,0,60,214,1,0,200,14,240,236,226,240,255,0,71,214,1,0,168,24,230,208,209,230,255,0,82,214,1,0,151,61,219,166,189,219,255,0,93,214,1,0,143,128,207,103,169,207,255,0,104,214,1,0,142,183,192,54,144,192,255,0,115,214,1,0,130,251,138,2,129,138,255,0,126,214,1,0,119,252,108,1,108,89,255,0,137,214,1,0,117,251,70,1,70,54,255,0,148,214,1,0,18,238,127,127,59,8,255,0,158,214,1,0,195,255,75,45,0,75,255,0,169,214,1,0,20,246,179,179,88,6,255,0,179,214,1,0,22,232,224,224,130,20,255,0,189,214,1,0,23,155,253,253,184,99,255,0,199,214,1,0,24,72,254,254,224,182,255,0,209,214,1,0,165,20,235,216,218,235,255,0,219,214,1,0,177,47,210,178,171,210,255,0,229,214,1,0,179,84,172,128,115,172,255,0,239,214,1,0,189,181,136,84,39,136,255,0,249,214,1,0,18,238,127,127,59,8,255,0,3,215,1,0,189,181,136,84,39,136,255,0,14,215,1,0,195,255,75,45,0,75,255,0,25,215,1,0,20,246,179,179,88,6,255,0,35,215,1,0,22,232,224,224,130,20,255,0,45,215,1,0,23,155,253,253,184,99,255,0,55,215,1,0,24,72,254,254,224,182,255,0,65,215,1,0,0,0,247,247,247,247,255,0,75,215,1,0,165,20,235,216,218,235,255,0,85,215,1,0,177,47,210,178,171,210,255,0,95,215,1,0,179,84,172,128,115,172,255,0,105,215,1,0,23,187,241,241,163,64,255,0,114,215,1,0,0,0,247,247,247,247,255,0,123,215,1,0,178,69,195,153,142,195,255,0,132,215,1,0,17,253,230,230,97,1,255,0,141,215,1,0,23,155,253,253,184,99,255,0,150,215,1,0,177,47,210,178,171,210,255,0,159,215,1,0,185,155,153,94,60,153,255,0,168,215,1,0,17,253,230,230,97,1,255,0,177,215,1,0,23,155,253,253,184,99,255,0,186,215,1,0,0,0,247,247,247,247,255,0,195,215,1,0,177,47,210,178,171,210,255,0,204,215,1,0,185,155,153,94,60,153,255,0,213,215,1,0,20,246,179,179,88,6,255,0,222,215,1,0,23,187,241,241,163,64,255,0,231,215,1,0,24,72,254,254,224,182,255,0,240,215,1,0,165,20,235,216,218,235,255,0,249,215,1,0,178,69,195,153,142,195,255,0,2,216,1,0,189,181,136,84,39,136,255,0,11,216,1,0,20,246,179,179,88,6,255,0,20,216,1,0,23,187,241,241,163,64,255,0,29,216,1,0,24,72,254,254,224,182,255,0,38,216,1,0,0,0,247,247,247,247,255,0,47,216,1,0,165,20,235,216,218,235,255,0,56,216,1,0,178,69,195,153,142,195,255,0,65,216,1,0,189,181,136,84,39,136,255,0,74,216,1,0,20,246,179,179,88,6,255,0,83,216,1,0,22,232,224,224,130,20,255,0,92,216,1,0,23,155,253,253,184,99,255,0,101,216,1,0,24,72,254,254,224,182,255,0,110,216,1,0,165,20,235,216,218,235,255,0,119,216,1,0,177,47,210,178,171,210,255,0,128,216,1,0,179,84,172,128,115,172,255,0,137,216,1,0,189,181,136,84,39,136,255,0,146,216,1,0,20,246,179,179,88,6,255,0,155,216,1,0,22,232,224,224,130,20,255,0,164,216,1,0,23,155,253,253,184,99,255,0,173,216,1,0,24,72,254,254,224,182,255,0,182,216,1,0,0,0,247,247,247,247,255,0,191,216,1,0,165,20,235,216,218,235,255,0,200,216,1,0,177,47,210,178,171,210,255,0,209,216,1,0,179,84,172,128,115,172,255,0,218,216,1,0,189,181,136,84,39,136,255,0,227,216,1,0,188,14,239,231,225,239,255,0,236,216,1,0,214,67,201,201,148,199,255,0,245,216,1,0,234,222,221,221,28,119,255,0,254,216,1,0,185,8,246,241,238,246,255,0,7,217,1,0,211,41,216,215,181,216,255,0,16,217,1,0,228,139,223,223,101,176,255,0,25,217,1,0,239,232,206,206,18,86,255,0,34,217,1,0,185,8,246,241,238,246,255,0,43,217,1,0,211,41,216,215,181,216,255,0,52,217,1,0,228,139,223,223,101,176,255,0,61,217,1,0,234,222,221,221,28,119,255,0,70,217,1,0,236,255,152,152,0,67,255,0,79,217,1,0,185,8,246,241,238,246,255,0,88,217,1,0,204,38,218,212,185,218,255,0,97,217,1,0,214,67,201,201,148,199,255,0,106,217,1,0,228,139,223,223,101,176,255,0,115,217,1,0,234,222,221,221,28,119,255,0,124,217,1,0,236,255,152,152,0,67,255,0,133,217,1,0,185,8,246,241,238,246,255,0,142,217,1,0,204,38,218,212,185,218,255,0,151,217,1,0,214,67,201,201,148,199,255,0,160,217,1,0,228,139,223,223,101,176,255,0,169,217,1,0,233,209,231,231,41,138,255,0,178,217,1,0,239,232,206,206,18,86,255,0,187,217,1,0,236,255,145,145,0,63,255,0,196,217,1,0,195,5,249,247,244,249,255,0,205,217,1,0,188,14,239,231,225,239,255,0,214,217,1,0,204,38,218,212,185,218,255,0,223,217,1,0,214,67,201,201,148,199,255,0,232,217,1,0,228,139,223,223,101,176,255,0,241,217,1,0,233,209,231,231,41,138,255,0,250,217,1,0,239,232,206,206,18,86,255,0,3,218,1,0,236,255,145,145,0,63,255,0,12,218,1,0,195,5,249,247,244,249,255,0,21,218,1,0,188,14,239,231,225,239,255,0,30,218,1,0,204,38,218,212,185,218,255,0,39,218,1,0,214,67,201,201,148,199,255,0,48,218,1,0,228,139,223,223,101,176,255,0,57,218,1,0,233,209,231,231,41,138,255,0,66,218,1,0,239,232,206,206,18,86,255,0,75,218,1,0,236,255,152,152,0,67,255,0,84,218,1,0,242,255,103,103,0,31,255,0,93,218,1,0,180,8,245,239,237,245,255,0,105,218,1,0,168,37,220,188,189,220,255,0,117,218,1,0,176,100,177,117,107,177,255,0,129,218,1,0,182,7,247,242,240,247,255,0,141,218,1,0,173,28,226,203,201,226,255,0,153,218,1,0,173,58,200,158,154,200,255,0,165,218,1,0,182,128,163,106,81,163,255,0,177,218,1,0,182,7,247,242,240,247,255,0,189,218,1,0,173,28,226,203,201,226,255,0,201,218,1,0,173,58,200,158,154,200,255,0,213,218,1,0,176,100,177,117,107,177,255,0,225,218,1,0,188,185,143,84,39,143,255,0,237,218,1,0,182,7,247,242,240,247,255,0,249,218,1,0,170,18,235,218,218,235,255,0,5,219,1,0,168,37,220,188,189,220,255,0,17,219,1,0,173,58,200,158,154,200,255,0,29,219,1,0,176,100,177,117,107,177,255,0,41,219,1,0,188,185,143,84,39,143,255,0,53,219,1,0,182,7,247,242,240,247,255,0,65,219,1,0,170,18,235,218,218,235,255,0,77,219,1,0,168,37,220,188,189,220,255,0,89,219,1,0,173,58,200,158,154,200,255,0,101,219,1,0,172,83,186,128,125,186,255,0,113,219,1,0,182,128,163,106,81,163,255,0,125,219,1,0,190,216,134,74,20,134,255,0,137,219,1,0,191,2,253,252,251,253,255,0,149,219,1,0,180,8,245,239,237,245,255,0,161,219,1,0,170,18,235,218,218,235,255,0,173,219,1,0,168,37,220,188,189,220,255,0,185,219,1,0,173,58,200,158,154,200,255,0,197,219,1,0,172,83,186,128,125,186,255,0,209,219,1,0,182,128,163,106,81,163,255,0,221,219,1,0,190,216,134,74,20,134,255,0,233,219,1,0,191,2,253,252,251,253,255,0,245,219,1,0,180,8,245,239,237,245,255,0,1,220,1,0,170,18,235,218,218,235,255,0,13,220,1,0,168,37,220,188,189,220,255,0,25,220,1,0,173,58,200,158,154,200,255,0,37,220,1,0,172,83,186,128,125,186,255,0,49,220,1,0,182,128,163,106,81,163,255,0,61,220,1,0,188,185,143,84,39,143,255,0,73,220,1,0,191,255,125,63,0,125,255,0,85,220,1,0,242,255,103,103,0,31,255,0,95,220,1,0,150,241,97,5,48,97,255,0,106,220,1,0,249,220,178,178,24,43,255,0,116,220,1,0,5,163,214,214,96,77,255,0,126,220,1,0,13,119,244,244,165,130,255,0,136,220,1,0,15,54,253,253,219,199,255,0,146,220,1,0,142,32,240,209,229,240,255,0,156,220,1,0,141,87,222,146,197,222,255,0,166,220,1,0,143,167,195,67,147,195,255,0,176,220,1,0,148,206,172,33,102,172,255,0,186,220,1,0,242,255,103,103,0,31,255,0,196,220,1,0,148,206,172,33,102,172,255,0,207,220,1,0,150,241,97,5,48,97,255,0,218,220,1,0,249,220,178,178,24,43,255,0,228,220,1,0,5,163,214,214,96,77,255,0,238,220,1,0,13,119,244,244,165,130,255,0,248,220,1,0,15,54,253,253,219,199,255,0,2,221,1,0,0,0,247,247,247,247,255,0,12,221,1,0,142,32,240,209,229,240,255,0,22,221,1,0,141,87,222,146,197,222,255,0,32,221,1,0,143,167,195,67,147,195,255,0,42,221,1,0,12,150,239,239,138,98,255,0,51,221,1,0,0,0,247,247,247,247,255,0,60,221,1,0,143,128,207,103,169,207,255,0,69,221,1,0,248,255,202,202,0,32,255,0,78,221,1,0,13,119,244,244,165,130,255,0,87,221,1,0,141,87,222,146,197,222,255,0,96,221,1,0,143,247,176,5,113,176,255,0,105,221,1,0,248,255,202,202,0,32,255,0,114,221,1,0,13,119,244,244,165,130,255,0,123,221,1,0,0,0,247,247,247,247,255,0,132,221,1,0,141,87,222,146,197,222,255,0,141,221,1,0,143,247,176,5,113,176,255,0,150,221,1,0,249,220,178,178,24,43,255,0,159,221,1,0,12,150,239,239,138,98,255,0,168,221,1,0,15,54,253,253,219,199,255,0,177,221,1,0,142,32,240,209,229,240,255,0,186,221,1,0,143,128,207,103,169,207,255,0,195,221,1,0,148,206,172,33,102,172,255,0,204,221,1,0,249,220,178,178,24,43,255,0,213,221,1,0,12,150,239,239,138,98,255,0,222,221,1,0,15,54,253,253,219,199,255,0,231,221,1,0,0,0,247,247,247,247,255,0,240,221,1,0,142,32,240,209,229,240,255,0,249,221,1,0,143,128,207,103,169,207,255,0,2,222,1,0,148,206,172,33,102,172,255,0,11,222,1,0,249,220,178,178,24,43,255,0,20,222,1,0,5,163,214,214,96,77,255,0,29,222,1,0,13,119,244,244,165,130,255,0,38,222,1,0,15,54,253,253,219,199,255,0,47,222,1,0,142,32,240,209,229,240,255,0,56,222,1,0,141,87,222,146,197,222,255,0,65,222,1,0,143,167,195,67,147,195,255,0,74,222,1,0,148,206,172,33,102,172,255,0,83,222,1,0,249,220,178,178,24,43,255,0,92,222,1,0,5,163,214,214,96,77,255,0,101,222,1,0,13,119,244,244,165,130,255,0,110,222,1,0,15,54,253,253,219,199,255,0,119,222,1,0,0,0,247,247,247,247,255,0,128,222,1,0,142,32,240,209,229,240,255,0,137,222,1,0,141,87,222,146,197,222,255,0,146,222,1,0,143,167,195,67,147,195,255,0,155,222,1,0,148,206,172,33,102,172,255,0,164,222,1,0,242,255,103,103,0,31,255,0,174,222,1,0,0,0,26,26,26,26,255,0,185,222,1,0,249,220,178,178,24,43,255,0,195,222,1,0,5,163,214,214,96,77,255,0,205,222,1,0,13,119,244,244,165,130,255,0,215,222,1,0,15,54,253,253,219,199,255,0,225,222,1,0,0,0,224,224,224,224,255,0,235,222,1,0,0,0,186,186,186,186,255,0,245,222,1,0,0,0,135,135,135,135,255,0,255,222,1,0,0,0,77,77,77,77,255,0,9,223,1,0,242,255,103,103,0,31,255,0,19,223,1,0,0,0,77,77,77,77,255,0,30,223,1,0,0,0,26,26,26,26,255,0,41,223,1,0,249,220,178,178,24,43,255,0,51,223,1,0,5,163,214,214,96,77,255,0,61,223,1,0,13,119,244,244,165,130,255,0,71,223,1,0,15,54,253,253,219,199,255,0,81,223,1,0,0,0,255,255,255,255,255,0,91,223,1,0,0,0,224,224,224,224,255,0,101,223,1,0,0,0,186,186,186,186,255,0,111,223,1,0,0,0,135,135,135,135,255,0,121,223,1,0,12,150,239,239,138,98,255,0,130,223,1,0,0,0,255,255,255,255,255,0,139,223,1,0,0,0,153,153,153,153,255,0,148,223,1,0,248,255,202,202,0,32,255,0,157,223,1,0,13,119,244,244,165,130,255,0,166,223,1,0,0,0,186,186,186,186,255,0,175,223,1,0,0,0,64,64,64,64,255,0,184,223,1,0,248,255,202,202,0,32,255,0,193,223,1,0,13,119,244,244,165,130,255,0,202,223,1,0,0,0,255,255,255,255,255,0,211,223,1,0,0,0,186,186,186,186,255,0,220,223,1,0,0,0,64,64,64,64,255,0,229,223,1,0,249,220,178,178,24,43,255,0,238,223,1,0,12,150,239,239,138,98,255,0,247,223,1,0,15,54,253,253,219,199,255,0,0,224,1,0,0,0,224,224,224,224,255,0,9,224,1,0,0,0,153,153,153,153,255,0,18,224,1,0,0,0,77,77,77,77,255,0,27,224,1,0,249,220,178,178,24,43,255,0,36,224,1,0,12,150,239,239,138,98,255,0,45,224,1,0,15,54,253,253,219,199,255,0,54,224,1,0,0,0,255,255,255,255,255,0,63,224,1,0,0,0,224,224,224,224,255,0,72,224,1,0,0,0,153,153,153,153,255,0,81,224,1,0,0,0,77,77,77,77,255,0,90,224,1,0,249,220,178,178,24,43,255,0,99,224,1,0,5,163,214,214,96,77,255,0,108,224,1,0,13,119,244,244,165,130,255,0,117,224,1,0,15,54,253,253,219,199,255,0,126,224,1,0,0,0,224,224,224,224,255,0,135,224,1,0,0,0,186,186,186,186,255,0,144,224,1,0,0,0,135,135,135,135,255,0,153,224,1,0,0,0,77,77,77,77,255,0,162,224,1,0,249,220,178,178,24,43,255,0,171,224,1,0,5,163,214,214,96,77,255,0,180,224,1,0,13,119,244,244,165,130,255,0,189,224,1,0,15,54,253,253,219,199,255,0,198,224,1,0,0,0,255,255,255,255,255,0,207,224,1,0,0,0,224,224,224,224,255,0,216,224,1,0,0,0,186,186,186,186,255,0,225,224,1,0,0,0,135,135,135,135,255,0,234,224,1,0,0,0,77,77,77,77,255,0,243,224,1,0,3,32,253,253,224,221,255,0,252,224,1,0,244,92,250,250,159,181,255,0,5,225,1,0,227,220,197,197,27,138,255,0,14,225,1,0,13,28,254,254,235,226,255,0,23,225,1,0,252,72,251,251,180,185,255,0,32,225,1,0,238,147,247,247,104,161,255,0,41,225,1,0,224,253,174,174,1,126,255,0,50,225,1,0,13,28,254,254,235,226,255,0,59,225,1,0,252,72,251,251,180,185,255,0,68,225,1,0,238,147,247,247,104,161,255,0,77,225,1,0,227,220,197,197,27,138,255,0,86,225,1,0,213,252,122,122,1,119,255,0,95,225,1,0,13,28,254,254,235,226,255,0,104,225,1,0,3,60,252,252,197,192,255,0,113,225,1,0,244,92,250,250,159,181,255,0,122,225,1,0,238,147,247,247,104,161,255,0,131,225,1,0,227,220,197,197,27,138,255,0,140,225,1,0,213,252,122,122,1,119,255,0,149,225,1,0,13,28,254,254,235,226,255,0,158,225,1,0,3,60,252,252,197,192,255,0,167,225,1,0,244,92,250,250,159,181,255,0,176,225,1,0,238,147,247,247,104,161,255,0,185,225,1,0,230,195,221,221,52,151,255,0,194,225,1,0,224,253,174,174,1,126,255,0,203,225,1,0,213,252,122,122,1,119,255,0,212,225,1,0,14,12,255,255,247,243,255,0,221,225,1,0,3,32,253,253,224,221,255,0,230,225,1,0,3,60,252,252,197,192,255,0,239,225,1,0,244,92,250,250,159,181,255,0,248,225,1,0,238,147,247,247,104,161,255,0,1,226,1,0,230,195,221,221,52,151,255,0,10,226,1,0,224,253,174,174,1,126,255,0,19,226,1,0,213,252,122,122,1,119,255,0,28,226,1,0,14,12,255,255,247,243,255,0,37,226,1,0,3,32,253,253,224,221,255,0,46,226,1,0,3,60,252,252,197,192,255,0,55,226,1,0,244,92,250,250,159,181,255,0,64,226,1,0,238,147,247,247,104,161,255,0,73,226,1,0,230,195,221,221,52,151,255,0,82,226,1,0,224,253,174,174,1,126,255,0,91,226,1,0,213,252,122,122,1,119,255,0,100,226,1,0,199,255,106,73,0,106,255,0,109,226,1,0,245,255,165,165,0,38,255,0,121,226,1,0,167,171,149,49,54,149,255,0,134,226,1,0,2,208,215,215,48,39,255,0,146,226,1,0,10,184,244,244,109,67,255,0,158,226,1,0,20,157,253,253,174,97,255,0,170,226,1,0,30,110,254,254,224,144,255,0,182,226,1,0,136,24,248,224,243,248,255,0,194,226,1,0,138,67,233,171,217,233,255,0,206,226,1,0,143,113,209,116,173,209,255,0,218,226,1,0,151,157,180,69,117,180,255,0,230,226,1,0,245,255,165,165,0,38,255,0,242,226,1,0,151,157,180,69,117,180,255,0,255,226,1,0,167,171,149,49,54,149,255,0,12,227,1,0,2,208,215,215,48,39,255,0,24,227,1,0,10,184,244,244,109,67,255,0,36,227,1,0,20,157,253,253,174,97,255,0,48,227,1,0,30,110,254,254,224,144,255,0,60,227,1,0,42,64,255,255,255,191,255,0,72,227,1,0,136,24,248,224,243,248,255,0,84,227,1,0,138,67,233,171,217,233,255,0,96,227,1,0,143,113,209,116,173,209,255,0,108,227,1,0,13,164,252,252,141,89,255,0,119,227,1,0,42,64,255,255,255,191,255,0,130,227,1,0,143,86,219,145,191,219,255,0,141,227,1,0,254,225,215,215,25,28,255,0,152,227,1,0,20,157,253,253,174,97,255,0,163,227,1,0,138,67,233,171,217,233,255,0,174,227,1,0,145,193,182,44,123,182,255,0,185,227,1,0,254,225,215,215,25,28,255,0,196,227,1,0,20,157,253,253,174,97,255,0,207,227,1,0,42,64,255,255,255,191,255,0,218,227,1,0,138,67,233,171,217,233,255,0,229,227,1,0,145,193,182,44,123,182,255,0,240,227,1,0,2,208,215,215,48,39,255,0,251,227,1,0,13,164,252,252,141,89,255,0,6,228,1,0,30,110,254,254,224,144,255,0,17,228,1,0,136,24,248,224,243,248,255,0,28,228,1,0,143,86,219,145,191,219,255,0,39,228,1,0,151,157,180,69,117,180,255,0,50,228,1,0,2,208,215,215,48,39,255,0,61,228,1,0,13,164,252,252,141,89,255,0,72,228,1,0,30,110,254,254,224,144,255,0,83,228,1,0,42,64,255,255,255,191,255,0,94,228,1,0,136,24,248,224,243,248,255,0,105,228,1,0,143,86,219,145,191,219,255,0,116,228,1,0,151,157,180,69,117,180,255,0,127,228,1,0,2,208,215,215,48,39,255,0,138,228,1,0,10,184,244,244,109,67,255,0,149,228,1,0,20,157,253,253,174,97,255,0,160,228,1,0,30,110,254,254,224,144,255,0,171,228,1,0,136,24,248,224,243,248,255,0,182,228,1,0,138,67,233,171,217,233,255,0,193,228,1,0,143,113,209,116,173,209,255,0,204,228,1,0,151,157,180,69,117,180,255,0,215,228,1,0,2,208,215,215,48,39,255,0,226,228,1,0,10,184,244,244,109,67,255,0,237,228,1,0,20,157,253,253,174,97,255,0,248,228,1,0,30,110,254,254,224,144,255,0,3,229,1,0,42,64,255,255,255,191,255,0,14,229,1,0,136,24,248,224,243,248,255,0,25,229,1,0,138,67,233,171,217,233,255,0,36,229,1,0,143,113,209,116,173,209,255,0,47,229,1,0,151,157,180,69,117,180,255,0,58,229,1,0,245,255,165,165,0,38,255,0,70,229,1,0,107,255,104,0,104,55,255,0,83,229,1,0,2,208,215,215,48,39,255,0,95,229,1,0,10,184,244,244,109,67,255,0,107,229,1,0,20,157,253,253,174,97,255,0,119,229,1,0,31,115,254,254,224,139,255,0,131,229,1,0,51,106,239,217,239,139,255,0,143,229,1,0,62,130,217,166,217,106,255,0,155,229,1,0,83,121,189,102,189,99,255,0,167,229,1,0,103,211,152,26,152,80,255,0,179,229,1,0,245,255,165,165,0,38,255,0,191,229,1,0,103,211,152,26,152,80,255,0,204,229,1,0,107,255,104,0,104,55,255,0,217,229,1,0,2,208,215,215,48,39,255,0,229,229,1,0,10,184,244,244,109,67,255,0,241,229,1,0,20,157,253,253,174,97,255,0,253,229,1,0,31,115,254,254,224,139,255,0,9,230,1,0,42,64,255,255,255,191,255,0,21,230,1,0,51,106,239,217,239,139,255,0,33,230,1,0,62,130,217,166,217,106,255,0,45,230,1,0,83,121,189,102,189,99,255,0,57,230,1,0,13,164,252,252,141,89,255,0,68,230,1,0,42,64,255,255,255,191,255,0,79,230,1,0,66,136,207,145,207,96,255,0,90,230,1,0,254,225,215,215,25,28,255,0,101,230,1,0,20,157,253,253,174,97,255,0,112,230,1,0,62,130,217,166,217,106,255,0,123,230,1,0,98,210,150,26,150,65,255,0,134,230,1,0,254,225,215,215,25,28,255,0,145,230,1,0,20,157,253,253,174,97,255,0,156,230,1,0,42,64,255,255,255,191,255,0,167,230,1,0,62,130,217,166,217,106,255,0,178,230,1,0,98,210,150,26,150,65,255,0,189,230,1,0,2,208,215,215,48,39,255,0,200,230,1,0,13,164,252,252,141,89,255,0,211,230,1,0,31,115,254,254,224,139,255,0,222,230,1,0,51,106,239,217,239,139,255,0,233,230,1,0,66,136,207,145,207,96,255,0,244,230,1,0,103,211,152,26,152,80,255,0,255,230,1,0,2,208,215,215,48,39,255,0,10,231,1,0,13,164,252,252,141,89,255,0,21,231,1,0,31,115,254,254,224,139,255,0,32,231,1,0,42,64,255,255,255,191,255,0,43,231,1,0,51,106,239,217,239,139,255,0,54,231,1,0,66,136,207,145],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+30724);allocate([207,96,255,0,65,231,1,0,103,211,152,26,152,80,255,0,76,231,1,0,2,208,215,215,48,39,255,0,87,231,1,0,10,184,244,244,109,67,255,0,98,231,1,0,20,157,253,253,174,97,255,0,109,231,1,0,31,115,254,254,224,139,255,0,120,231,1,0,51,106,239,217,239,139,255,0,131,231,1,0,62,130,217,166,217,106,255,0,142,231,1,0,83,121,189,102,189,99,255,0,153,231,1,0,103,211,152,26,152,80,255,0,164,231,1,0,2,208,215,215,48,39,255,0,175,231,1,0,10,184,244,244,109,67,255,0,186,231,1,0,20,157,253,253,174,97,255,0,197,231,1,0,31,115,254,254,224,139,255,0,208,231,1,0,42,64,255,255,255,191,255,0,219,231,1,0,51,106,239,217,239,139,255,0,230,231,1,0,62,130,217,166,217,106,255,0,241,231,1,0,83,121,189,102,189,99,255,0,252,231,1,0,103,211,152,26,152,80,255,0,7,232,1,0,13,44,254,254,224,210,255,0,16,232,1,0,9,139,252,252,146,114,255,0,25,232,1,0,1,211,222,222,45,38,255,0,34,232,1,0,13,37,254,254,229,217,255,0,43,232,1,0,11,108,252,252,174,145,255,0,52,232,1,0,7,179,251,251,106,74,255,0,61,232,1,0,253,224,203,203,24,29,255,0,70,232,1,0,13,37,254,254,229,217,255,0,79,232,1,0,11,108,252,252,174,145,255,0,88,232,1,0,7,179,251,251,106,74,255,0,97,232,1,0,1,211,222,222,45,38,255,0,106,232,1,0,253,231,165,165,15,21,255,0,115,232,1,0,13,37,254,254,229,217,255,0,124,232,1,0,12,92,252,252,187,161,255,0,133,232,1,0,9,139,252,252,146,114,255,0,142,232,1,0,7,179,251,251,106,74,255,0,151,232,1,0,1,211,222,222,45,38,255,0,160,232,1,0,253,231,165,165,15,21,255,0,169,232,1,0,13,37,254,254,229,217,255,0,178,232,1,0,12,92,252,252,187,161,255,0,187,232,1,0,9,139,252,252,146,114,255,0,196,232,1,0,7,179,251,251,106,74,255,0,205,232,1,0,3,208,239,239,59,44,255,0,214,232,1,0,253,224,203,203,24,29,255,0,223,232,1,0,251,255,153,153,0,13,255,0,232,232,1,0,14,15,255,255,245,240,255,0,241,232,1,0,13,44,254,254,224,210,255,0,250,232,1,0,12,92,252,252,187,161,255,0,3,233,1,0,9,139,252,252,146,114,255,0,12,233,1,0,7,179,251,251,106,74,255,0,21,233,1,0,3,208,239,239,59,44,255,0,30,233,1,0,253,224,203,203,24,29,255,0,39,233,1,0,251,255,153,153,0,13,255,0,48,233,1,0,14,15,255,255,245,240,255,0,57,233,1,0,13,44,254,254,224,210,255,0,66,233,1,0,12,92,252,252,187,161,255,0,75,233,1,0,9,139,252,252,146,114,255,0,84,233,1,0,7,179,251,251,106,74,255,0,93,233,1,0,3,208,239,239,59,44,255,0,102,233,1,0,253,224,203,203,24,29,255,0,111,233,1,0,253,231,165,165,15,21,255,0,120,233,1,0,249,255,103,103,0,13,255,0,129,233,1,0,254,225,228,228,26,28,255,0,138,233,1,0,146,178,184,55,126,184,255,0,147,233,1,0,83,147,175,77,175,74,255,0,156,233,1,0,254,225,228,228,26,28,255,0,165,233,1,0,146,178,184,55,126,184,255,0,174,233,1,0,83,147,175,77,175,74,255,0,183,233,1,0,207,132,163,152,78,163,255,0,192,233,1,0,254,225,228,228,26,28,255,0,201,233,1,0,146,178,184,55,126,184,255,0,210,233,1,0,83,147,175,77,175,74,255,0,219,233,1,0,207,132,163,152,78,163,255,0,228,233,1,0,21,255,255,255,127,0,255,0,237,233,1,0,254,225,228,228,26,28,255,0,246,233,1,0,146,178,184,55,126,184,255,0,255,233,1,0,83,147,175,77,175,74,255,0,8,234,1,0,207,132,163,152,78,163,255,0,17,234,1,0,21,255,255,255,127,0,255,0,26,234,1,0,42,204,255,255,255,51,255,0,35,234,1,0,254,225,228,228,26,28,255,0,44,234,1,0,146,178,184,55,126,184,255,0,53,234,1,0,83,147,175,77,175,74,255,0,62,234,1,0,207,132,163,152,78,163,255,0,71,234,1,0,21,255,255,255,127,0,255,0,80,234,1,0,42,204,255,255,255,51,255,0,89,234,1,0,15,193,166,166,86,40,255,0,98,234,1,0,254,225,228,228,26,28,255,0,107,234,1,0,146,178,184,55,126,184,255,0,116,234,1,0,83,147,175,77,175,74,255,0,125,234,1,0,207,132,163,152,78,163,255,0,134,234,1,0,21,255,255,255,127,0,255,0,143,234,1,0,42,204,255,255,255,51,255,0,152,234,1,0,15,193,166,166,86,40,255,0,161,234,1,0,232,121,247,247,129,191,255,0,170,234,1,0,254,225,228,228,26,28,255,0,179,234,1,0,146,178,184,55,126,184,255,0,188,234,1,0,83,147,175,77,175,74,255,0,197,234,1,0,207,132,163,152,78,163,255,0,206,234,1,0,21,255,255,255,127,0,255,0,215,234,1,0,42,204,255,255,255,51,255,0,224,234,1,0,15,193,166,166,86,40,255,0,233,234,1,0,232,121,247,247,129,191,255,0,242,234,1,0,0,0,153,153,153,153,255,0,251,234,1,0,114,120,194,102,194,165,255,0,4,235,1,0,11,155,252,252,141,98,255,0,13,235,1,0,156,77,203,141,160,203,255,0,22,235,1,0,114,120,194,102,194,165,255,0,31,235,1,0,11,155,252,252,141,98,255,0,40,235,1,0,156,77,203,141,160,203,255,0,49,235,1,0,228,102,231,231,138,195,255,0,58,235,1,0,114,120,194,102,194,165,255,0,67,235,1,0,11,155,252,252,141,98,255,0,76,235,1,0,156,77,203,141,160,203,255,0,85,235,1,0,228,102,231,231,138,195,255,0,94,235,1,0,58,155,216,166,216,84,255,0,103,235,1,0,114,120,194,102,194,165,255,0,112,235,1,0,11,155,252,252,141,98,255,0,121,235,1,0,156,77,203,141,160,203,255,0,130,235,1,0,228,102,231,231,138,195,255,0,139,235,1,0,58,155,216,166,216,84,255,0,148,235,1,0,34,208,255,255,217,47,255,0,157,235,1,0,114,120,194,102,194,165,255,0,166,235,1,0,11,155,252,252,141,98,255,0,175,235,1,0,156,77,203,141,160,203,255,0,184,235,1,0,228,102,231,231,138,195,255,0,193,235,1,0,58,155,216,166,216,84,255,0,202,235,1,0,34,208,255,255,217,47,255,0,211,235,1,0,25,90,229,229,196,148,255,0,220,235,1,0,114,120,194,102,194,165,255,0,229,235,1,0,11,155,252,252,141,98,255,0,238,235,1,0,156,77,203,141,160,203,255,0,247,235,1,0,228,102,231,231,138,195,255,0,0,236,1,0,58,155,216,166,216,84,255,0,9,236,1,0,34,208,255,255,217,47,255,0,18,236,1,0,25,90,229,229,196,148,255,0,27,236,1,0,0,0,179,179,179,179,255,0,36,236,1,0,120,84,211,141,211,199,255,0,46,236,1,0,211,82,189,188,128,189,255,0,57,236,1,0,42,76,255,255,255,179,255,0,67,236,1,0,175,37,218,190,186,218,255,0,77,236,1,0,4,139,251,251,128,114,255,0,87,236,1,0,144,100,211,128,177,211,255,0,97,236,1,0,22,156,253,253,180,98,255,0,107,236,1,0,58,134,222,179,222,105,255,0,117,236,1,0,233,47,252,252,205,229,255,0,127,236,1,0,0,0,217,217,217,217,255,0,137,236,1,0,120,84,211,141,211,199,255,0,147,236,1,0,211,82,189,188,128,189,255,0,158,236,1,0,77,41,235,204,235,197,255,0,169,236,1,0,42,76,255,255,255,179,255,0,179,236,1,0,175,37,218,190,186,218,255,0,189,236,1,0,4,139,251,251,128,114,255,0,199,236,1,0,144,100,211,128,177,211,255,0,209,236,1,0,22,156,253,253,180,98,255,0,219,236,1,0,58,134,222,179,222,105,255,0,229,236,1,0,233,47,252,252,205,229,255,0,239,236,1,0,0,0,217,217,217,217,255,0,249,236,1,0,120,84,211,141,211,199,255,0,3,237,1,0,211,82,189,188,128,189,255,0,14,237,1,0,77,41,235,204,235,197,255,0,25,237,1,0,37,144,255,255,237,111,255,0,36,237,1,0,42,76,255,255,255,179,255,0,46,237,1,0,175,37,218,190,186,218,255,0,56,237,1,0,4,139,251,251,128,114,255,0,66,237,1,0,144,100,211,128,177,211,255,0,76,237,1,0,22,156,253,253,180,98,255,0,86,237,1,0,58,134,222,179,222,105,255,0,96,237,1,0,233,47,252,252,205,229,255,0,106,237,1,0,0,0,217,217,217,217,255,0,116,237,1,0,120,84,211,141,211,199,255,0,125,237,1,0,42,76,255,255,255,179,255,0,134,237,1,0,175,37,218,190,186,218,255,0,143,237,1,0,120,84,211,141,211,199,255,0,152,237,1,0,42,76,255,255,255,179,255,0,161,237,1,0,175,37,218,190,186,218,255,0,170,237,1,0,4,139,251,251,128,114,255,0,179,237,1,0,120,84,211,141,211,199,255,0,188,237,1,0,42,76,255,255,255,179,255,0,197,237,1,0,175,37,218,190,186,218,255,0,206,237,1,0,4,139,251,251,128,114,255,0,215,237,1,0,144,100,211,128,177,211,255,0,224,237,1,0,120,84,211,141,211,199,255,0,233,237,1,0,42,76,255,255,255,179,255,0,242,237,1,0,175,37,218,190,186,218,255,0,251,237,1,0,4,139,251,251,128,114,255,0,4,238,1,0,144,100,211,128,177,211,255,0,13,238,1,0,22,156,253,253,180,98,255,0,22,238,1,0,120,84,211,141,211,199,255,0,31,238,1,0,42,76,255,255,255,179,255,0,40,238,1,0,175,37,218,190,186,218,255,0,49,238,1,0,4,139,251,251,128,114,255,0,58,238,1,0,144,100,211,128,177,211,255,0,67,238,1,0,22,156,253,253,180,98,255,0,76,238,1,0,58,134,222,179,222,105,255,0,85,238,1,0,120,84,211,141,211,199,255,0,94,238,1,0,42,76,255,255,255,179,255,0,103,238,1,0,175,37,218,190,186,218,255,0,112,238,1,0,4,139,251,251,128,114,255,0,121,238,1,0,144,100,211,128,177,211,255,0,130,238,1,0,22,156,253,253,180,98,255,0,139,238,1,0,58,134,222,179,222,105,255,0,148,238,1,0,233,47,252,252,205,229,255,0,157,238,1,0,120,84,211,141,211,199,255,0,166,238,1,0,42,76,255,255,255,179,255,0,175,238,1,0,175,37,218,190,186,218,255,0,184,238,1,0,4,139,251,251,128,114,255,0,193,238,1,0,144,100,211,128,177,211,255,0,202,238,1,0,22,156,253,253,180,98,255,0,211,238,1,0,58,134,222,179,222,105,255,0,220,238,1,0,233,47,252,252,205,229,255,0,229,238,1,0,0,0,217,217,217,217,255,0,238,238,1,0,237,253,158,158,1,66,255,0,252,238,1,0,177,130,162,94,79,162,255,0,11,239,1,0,250,180,213,213,62,79,255,0,25,239,1,0,10,184,244,244,109,67,255,0,39,239,1,0,20,157,253,253,174,97,255,0,53,239,1,0,31,115,254,254,224,139,255,0,67,239,1,0,49,96,245,230,245,152,255,0,81,239,1,0,79,65,221,171,221,164,255,0,95,239,1,0,114,120,194,102,194,165,255,0,109,239,1,0,143,187,189,50,136,189,255,0,123,239,1,0,237,253,158,158,1,66,255,0,137,239,1,0,143,187,189,50,136,189,255,0,152,239,1,0,177,130,162,94,79,162,255,0,167,239,1,0,250,180,213,213,62,79,255,0,181,239,1,0,10,184,244,244,109,67,255,0,195,239,1,0,20,157,253,253,174,97,255,0,209,239,1,0,31,115,254,254,224,139,255,0,223,239,1,0,42,64,255,255,255,191,255,0,237,239,1,0,49,96,245,230,245,152,255,0,251,239,1,0,79,65,221,171,221,164,255,0,9,240,1,0,114,120,194,102,194,165,255,0,23,240,1,0,13,164,252,252,141,89,255,0,36,240,1,0,42,64,255,255,255,191,255,0,49,240,1,0,81,77,213,153,213,148,255,0,62,240,1,0,254,225,215,215,25,28,255,0,75,240,1,0,20,157,253,253,174,97,255,0,88,240,1,0,79,65,221,171,221,164,255,0,101,240,1,0,143,196,186,43,131,186,255,0,114,240,1,0,254,225,215,215,25,28,255,0,127,240,1,0,20,157,253,253,174,97,255,0,140,240,1,0,42,64,255,255,255,191,255,0,153,240,1,0,79,65,221,171,221,164,255,0,166,240,1,0,143,196,186,43,131,186,255,0,179,240,1,0,250,180,213,213,62,79,255,0,192,240,1,0,13,164,252,252,141,89,255,0,205,240,1,0,31,115,254,254,224,139,255,0,218,240,1,0,49,96,245,230,245,152,255,0,231,240,1,0,81,77,213,153,213,148,255,0,244,240,1,0,143,187,189,50,136,189,255,0,1,241,1,0,250,180,213,213,62,79,255,0,14,241,1,0,13,164,252,252,141,89,255,0,27,241,1,0,31,115,254,254,224,139,255,0,40,241,1,0,42,64,255,255,255,191,255,0,53,241,1,0,49,96,245,230,245,152,255,0,66,241,1,0,81,77,213,153,213,148,255,0,79,241,1,0,143,187,189,50,136,189,255,0,92,241,1,0,250,180,213,213,62,79,255,0,105,241,1,0,10,184,244,244,109,67,255,0,118,241,1,0,20,157,253,253,174,97,255,0,131,241,1,0,31,115,254,254,224,139,255,0,144,241,1,0,49,96,245,230,245,152,255,0,157,241,1,0,79,65,221,171,221,164,255,0,170,241,1,0,114,120,194,102,194,165,255,0,183,241,1,0,143,187,189,50,136,189,255,0,196,241,1,0,250,180,213,213,62,79,255,0,209,241,1,0,10,184,244,244,109,67,255,0,222,241,1,0,20,157,253,253,174,97,255,0,235,241,1,0,31,115,254,254,224,139,255,0,248,241,1,0,42,64,255,255,255,191,255,0,5,242,1,0,49,96,245,230,245,152,255,0,18,242,1,0,79,65,221,171,221,164,255,0,31,242,1,0,114,120,194,102,194,165,255,0,44,242,1,0,143,187,189,50,136,189,255,0,57,242,1,0,147,15,255,240,248,255,255,0,72,242,1,0,24,35,250,250,235,215,255,0,90,242,1,0,127,255,255,0,255,255,255,0,100,242,1,0,113,128,255,127,255,212,255,0,116,242,1,0,127,15,255,240,255,255,255,0,127,242,1,0,42,26,245,245,245,220,255,0,138,242,1,0,23,58,255,255,228,196,255,0,150,242,1,0,0,0,0,0,0,0,255,0,161,242,1,0,25,49,255,255,235,205,255,0,181,242,1,0,170,255,255,0,0,255,255,0,191,242,1,0,192,206,226,138,43,226,255,0,207,242,1,0,0,190,165,165,42,42,255,0,218,242,1,0,23,99,222,222,184,135,255,0,233,242,1,0,128,103,160,95,158,160,255,0,248,242,1,0,63,255,255,127,255,0,255,0,8,243,1,0,17,218,210,210,105,30,255,0,23,243,1,0,11,175,255,255,127,80,255,0,34,243,1,0,154,147,237,100,149,237,255,0,54,243,1,0,33,34,255,255,248,220,255,0,68,243,1,0,246,231,220,220,20,60,255,0,81,243,1,0,127,255,255,0,255,255,255,0,91,243,1,0,170,255,139,0,0,139,255,0,105,243,1,0,127,255,139,0,139,139,255,0,119,243,1,0,30,239,184,184,134,11,255,0,138,243,1,0,0,0,169,169,169,169,255,0,152,243,1,0,85,255,100,0,100,0,255,0,167,243,1,0,0,0,169,169,169,169,255,0,181,243,1,0,39,110,189,189,183,107,255,0,196,243,1,0,212,255,139,139,0,139,255,0,213,243,1,0,58,142,107,85,107,47,255,0,233,243,1,0,23,255,255,255,140,0,255,0,249,243,1,0,198,192,204,153,50,204,255,0,9,244,1,0,0,255,139,139,0,0,255,0,22,244,1,0,10,121,233,233,150,122,255,0,38,244,1,0,85,61,188,143,188,143,255,0,56,244,1,0,175,143,139,72,61,139,255,0,75,244,1,0,127,103,79,47,79,79,255,0,94,244,1,0,127,103,79,47,79,79,255,0,113,244,1,0,128,255,209,0,206,209,255,0,132,244,1,0,199,255,211,148,0,211,255,0,148,244,1,0,232,235,255,255,20,147,255,0,162,244,1,0,138,255,255,0,191,255,255,0,179,244,1,0,0,0,105,105,105,105,255,0,192,244,1,0,0,0,105,105,105,105,255,0,205,244,1,0,148,225,255,30,144,255,255,0,221,244,1,0,0,206,178,178,34,34,255,0,236,244,1,0,28,15,255,255,250,240,255,0,253,244,1,0,85,192,139,34,139,34,255,0,14,245,1,0,212,255,255,255,0,255,255,0,27,245,1,0,0,0,220,220,220,220,255,0,42,245,1,0,170,7,255,248,248,255,255,0,58,245,1,0,35,255,255,255,215,0,255,0,68,245,1,0,30,217,218,218,165,32,255,0,83,245,1,0,0,0,128,128,128,128,255,0,93,245,1,0,85,255,128,0,128,0,255,0,104,245,1,0,59,208,255,173,255,47,255,0,121,245,1,0,0,0,128,128,128,128,255,0,131,245,1,0,85,15,255,240,255,240,255,0,145,245,1,0,233,150,255,255,105,180,255,0,158,245,1,0,0,140,205,205,92,92,255,0,173,245,1,0,194,255,130,75,0,130,255,0,185,245,1,0,42,15,255,255,255,240,255,0,196,245,1,0,38,106,240,240,230,140,255,0,207,245,1,0,170,20,250,230,230,250,255,0,221,245,1,0,240,15,255,255,240,245,255,0,240,245,1,0,64,255,252,124,252,0,255,0,255,245,1,0,38,49,255,255,250,205,255,0,17,246,1,0,137,63,230,173,216,230,255,0,32,246,1,0,0,119,240,240,128,128,255,0,48,246,1,0,127,31,255,224,255,255,255,0,63,246,1,0,42,40,250,250,250,210,255,0,89,246,1,0,0,0,211,211,211,211,255,0,104,246,1,0,85,100,238,144,238,144,255,0,120,246,1,0,0,0,211,211,211,211,255,0,135,246,1,0,248,73,255,255,182,193,255,0,150,246,1,0,12,132,255,255,160,122,255,0,167,246,1,0,125,209,178,32,178,170,255,0,186,246,1,0,143,117,250,135,206,250,255,0,204,246,1,0,148,56,153,119,136,153,255,0,224,246,1,0,148,56,153,119,136,153,255,0,244,246,1,0,151,52,222,176,196,222,255,0,8,247,1,0,42,31,255,255,255,224,255,0,25,247,1,0,85,255,255,0,255,0,255,0,35,247,1,0,85,192,205,50,205,50,255,0,50,247,1,0,21,20,250,250,240,230,255,0,61,247,1,0,212,255,255,255,0,255,255,0,74,247,1,0,0,255,128,128,0,0,255,0,86,247,1,0,113,128,205,102,205,170,255,0,108,247,1,0,170,255,205,0,0,205,255,0,124,247,1,0,204,152,211,186,85,211,255,0,142,247,1,0,183,124,219,147,112,219,255,0,160,247,1,0,103,169,179,60,179,113,255,0,180,247,1,0,176,143,238,123,104,238,255,0,201,247,1,0,111,255,250,0,250,154,255,0,224,247,1,0,125,167,209,72,209,204,255,0,245,247,1,0,228,228,199,199,21,133,255,0,10,248,1,0,170,198,112,25,25,112,255,0,28,248,1,0,106,9,255,245,255,250,255,0,43,248,1,0,4,30,255,255,228,225,255,0,58,248,1,0,26,73,255,255,228,181,255,0,72,248,1,0,25,81,255,255,222,173,255,0,89,248,1,0,170,255,128,0,0,128,255,0,99,248,1,0,27,23,253,253,245,230,255,0,112,248,1,0,42,255,128,128,128,0,255,0,123,248,1,0,56,192,142,107,142,35,255,0,138,248,1,0,27,255,255,255,165,0,255,0,150,248,1,0,11,255,255,255,69,0,255,0,165,248,1,0,214,123,218,218,112,214,255,0,177,248,1,0,38,72,238,238,232,170,255,0,196,248,1,0,85,100,251,152,251,152,255,0,211,248,1,0,127,67,238,175,238,238,255,0,230,248,1,0,241,124,219,219,112,147,255,0,249,248,1,0,26,41,255,255,239,213,255,0,9,249,1,0,20,70,255,255,218,185,255,0,24,249,1,0,20,176,205,205,133,63,255,0,34,249,1,0,247,63,255,255,192,203,255,0,44,249,1,0,212,70,221,221,160,221,255,0,54,249,1,0,132,59,230,176,224,230,255,0,70,249,1,0,212,255,128,128,0,128,255,0,82,249,1,0,0,255,255,255,0,0,255,0,91,249,1,0,0,61,188,188,143,143,255,0,106,249,1,0,159,181,225,65,105,225,255,0,121,249,1,0,17,220,139,139,69,19,255,0,138,249,1,0,4,138,250,250,128,114,255,0,150,249,1,0,19,154,244,244,164,96,255,0,166,249,1,0,103,170,139,46,139,87,255,0,180,249,1,0,17,16,255,255,245,238,255,0,194,249,1,0,13,183,160,160,82,45,255,0,206,249,1,0,0,0,192,192,192,192,255,0,218,249,1,0,139,108,235,135,206,235,255,0,231,249,1,0,175,143,205,106,90,205,255,0,246,249,1,0,148,56,144,112,128,144,255,0,5,250,1,0,148,56,144,112,128,144,255,0,20,250,1,0,0,5,255,255,250,250,255,0,30,250,1,0,106,255,255,0,255,127,255,0,47,250,1,0,146,155,180,70,130,180,255,0,62,250,1,0,24,84,210,210,180,140,255,0,71,250,1,0,127,255,128,0,128,128,255,0,81,250,1,0,212,29,216,216,191,216,255,0,94,250,1,0,6,184,255,255,99,71,255,0,106,250,1,0,123,182,224,64,224,208,255,0,121,250,1,0,212,115,238,238,130,238,255,0,133,250,1,0,27,68,245,245,222,179,255,0,144,250,1,0,0,0,255,255,255,255,255,0,155,250,1,0,0,0,245,245,245,245,255,0,171,250,1,0,42,255,255,255,255,0,255,0,183,250,1,0,56,192,205,154,205,50,255,0,200,250,1,0,45,67,252,247,252,185,255,0,209,250,1,0,68,91,221,173,221,142,255,0,218,250,1,0,98,178,163,49,163,84,255,0,227,250,1,0,42,50,255,255,255,204,255,0,236,250,1,0,62,85,230,194,230,153,255,0,245,250,1,0,85,100,198,120,198,121,255,0,254,250,1,0,99,187,132,35,132,67,255,0,7,251,1,0,42,50,255,255,255,204,255,0,16,251,1,0,62,85,230,194,230,153,255,0,25,251,1,0,85,100,198,120,198,121,255,0,34,251,1,0,98,178,163,49,163,84,255,0,43,251,1,0,107,255,104,0,104,55,255,0,52,251,1,0,42,50,255,255,255,204,255,0,61,251,1,0,55,81,240,217,240,163,255,0,70,251,1,0,68,91,221,173,221,142,255,0,79,251,1,0,85,100,198,120,198,121,255,0,88,251,1,0,98,178,163,49,163,84,255,0,97,251,1,0,107,255,104,0,104,55,255,0,106,251,1,0,42,50,255,255,255,204,255,0,115,251,1,0,55,81,240,217,240,163,255,0,124,251,1,0,68,91,221,173,221,142,255,0,133,251,1,0,85,100,198,120,198,121,255,0,142,251,1,0,96,158,171,65,171,93,255,0,151,251,1,0,99,187,132,35,132,67,255,0,160,251,1,0,108,255,90,0,90,50,255,0,169,251,1,0,42,25,255,255,255,229,255,0,178,251,1,0,45,67,252,247,252,185,255,0,187,251,1,0,55,81,240,217,240,163,255,0,196,251,1,0,68,91,221,173,221,142,255,0,205,251,1,0,85,100,198,120,198,121,255,0,214,251,1,0,96,158,171,65,171,93,255,0,223,251,1,0,99,187,132,35,132,67,255,0,232,251,1,0,108,255,90,0,90,50,255,0,241,251,1,0,42,25,255,255,255,229,255,0,250,251,1,0,45,67,252,247,252,185,255,0,3,252,1,0,55,81,240,217,240,163,255,0,12,252,1,0,68,91,221,173,221,142,255,0,21,252,1,0,85,100,198,120,198,121,255,0,30,252,1,0,96,158,171,65,171,93,255,0,39,252,1,0,99,187,132,35,132,67,255,0,48,252,1,0,107,255,104,0,104,55,255,0,57,252,1,0,110,255,69,0,69,41,255,0,66,252,1,0,49,73,248,237,248,177,255,0,77,252,1,0,117,97,205,127,205,187,255,0,88,252,1,0,144,194,184,44,127,184,255,0,99,252,1,0,42,50,255,255,255,204,255,0,110,252,1,0,99,66,218,161,218,180,255,0,121,252,1,0,132,170,196,65,182,196,255,0,132,252,1,0,150,203,168,34,94,168,255,0,143,252,1,0,42,50,255,255,255,204,255,0,154,252,1,0,99,66,218,161,218,180,255,0,165,252,1,0,132,170,196,65,182,196,255,0,176,252,1,0,144,194,184,44,127,184,255,0,187,252,1,0,164,191,148,37,52,148,255,0,198,252,1,0,42,50,255,255,255,204,255,0,209,252,1,0,69,58,233,199,233,180,255,0,220,252,1,0,117,97,205,127,205,187,255,0,231,252,1,0,132,170,196,65,182,196,255,0,242,252,1,0,144,194,184,44,127,184,255,0,253,252,1,0,164,191,148,37,52,148,255,0,8,253,1,0,42,50,255,255,255,204,255,0,19,253,1,0,69,58,233,199,233,180,255,0,30,253,1,0,117,97,205,127,205,187,255,0,41,253,1,0,132,170,196,65,182,196,255,0,52,253,1,0,139,216,192,29,145,192,255,0,63,253,1,0,150,203,168,34,94,168,255,0,74,253,1,0,158,231,132,12,44,132,255,0,85,253,1,0,42,38,255,255,255,217,255,0,96,253,1,0,49,73,248,237,248,177,255,0,107,253,1,0,69,58,233,199,233,180,255,0,118,253,1,0,117,97,205,127,205,187,255,0,129,253,1,0,132,170,196,65,182,196,255,0,140,253,1,0,139,216,192,29,145,192,255,0,151,253,1,0,150,203,168,34,94,168,255,0,162,253,1,0,158,231,132,12,44,132,255,0,173,253,1,0,42,38,255,255,255,217,255,0,184,253,1,0,49,73,248,237,248,177,255,0,195,253,1,0,69,58,233,199,233,180,255,0,206,253,1,0,117,97,205,127,205,187,255,0,217,253,1,0,132,170,196,65,182,196,255,0,228,253,1,0,139,216,192,29,145,192,255,0,239,253,1,0,150,203,168,34,94,168,255,0,250,253,1,0,164,191,148,37,52,148,255,0,5,254,1,0,158,231,88,8,29,88,255,0,16,254,1,0,37,66,255,255,247,188,255,0,27,254,1,0,28,175,254,254,196,79,255,0,38,254,1,0,16,238,217,217,95,14,255,0,49,254,1,0,42,42,255,255,255,212,255,0,60,254,1,0,28,112,254,254,217,142,255,0,71,254,1,0,22,213,254,254,153,41,255,0,82,254,1,0,15,252,204,204,76,2,255,0,93,254,1,0,42,42,255,255,255,212,255,0,104,254,1,0,28,112,254,254,217,142,255,0,115,254,1,0,22,213,254,254,153,41,255,0,126,254,1,0,16,238,217,217,95,14,255,0,137,254,1,0,13,248,153,153,52,4,255,0,148,254,1,0,42,42,255,255,255,212,255,0,159,254,1,0,31,109,254,254,227,145,255,0,170,254,1,0,28,175,254,254,196,79,255,0,181,254,1,0,22,213,254,254,153,41,255,0,192,254,1,0,16,238,217,217,95,14,255,0,203,254,1,0,13,248,153,153,52,4,255,0,214,254,1,0,42,42,255,255,255,212,255,0,225,254,1,0,31,109,254,254,227,145,255,0,236,254,1,0,28,175,254,254,196,79,255,0,247,254,1,0,22,213,254,254,153,41,255,0,2,255,1,0,18,233,236,236,112,20,255,0,13,255,1,0,15,252,204,204,76,2,255,0,24,255,1,0,12,247,140,140,45,4,255,0,35,255,1,0,42,25,255,255,255,229,255,0,46,255,1,0,37,66,255,255,247,188,255,0,57,255,1,0,31,109,254,254,227,145,255,0,68,255,1,0,28,175,254,254,196,79,255,0,79,255,1,0,22,213,254,254,153,41,255,0,90,255,1,0,18,233,236,236,112,20,255,0,101,255,1,0,15,252,204,204,76,2,255,0,112,255,1,0,12,247,140,140,45,4,255,0,123,255,1,0,42,25,255,255,255,229,255,0,134,255,1,0,37,66,255,255,247,188,255,0,145,255,1,0,31,109,254,254,227,145,255,0,156,255,1,0,28,175,254,254,196,79,255,0,167,255,1,0,22,213,254,254,153,41,255,0,178,255,1,0,18,233,236,236,112,20,255,0,189,255,1,0,15,252,204,204,76,2,255,0,200,255,1,0,13,248,153,153,52,4,255,0,211,255,1,0,13,240,102,102,37,6,255,0,222,255,1,0,34,95,255,255,237,160,255,0,233,255,1,0,24,178,254,254,178,76,255,0,244,255,1,0,5,221,240,240,59,32,255,0,255,255,1,0,42,77,255,255,255,178,255,0,10,0,2,0,29,162,254,254,204,92,255,0,21,0,2,0,17,194,253,253,141,60,255,0,32,0,2,0,254,225,227,227,26,28,255,0,43,0,2,0,42,77,255,255,255,178,255,0,54,0,2,0,29,162,254,254,204,92,255,0,65,0,2,0,17,194,253,253,141,60,255,0,76,0,2,0,5,221,240,240,59,32,255,0,87,0,2,0,246,255,189,189,0,38,255,0,98,0,2,0,42,77,255,255,255,178,255,0,109,0,2,0,30,136,254,254,217,118,255,0,120,0,2,0,24,178,254,254,178,76,255,0,131,0,2,0,17,194,253,253,141,60,255,0,142,0,2,0,5,221,240,240,59,32,255,0,153,0,2,0,246,255,189,189,0,38,255,0,164,0,2,0,42,77,255,255,255,178,255,0,175,0,2,0,30,136,254,254,217,118,255,0,186,0,2,0,24,178,254,254,178,76,255,0,197,0,2,0,17,194,253,253,141,60,255,0,208,0,2,0,7,212,252,252,78,42,255,0,219,0,2,0,254,225,227,227,26,28,255,0,230,0,2,0,245,255,177,177,0,38,255,0,241,0,2,0,42,50,255,255,255,204,255,0,252,0,2,0,34,95,255,255,237,160,255,0,7,1,2,0,30,136,254,254,217,118,255,0,18,1,2,0,24,178,254,254,178,76,255,0,29,1,2,0,17,194,253,253,141,60,255,0,40,1,2,0,7,212,252,252,78,42,255,0,51,1,2,0,254,225,227,227,26,28,255,0,62,1,2,0,245,255,177,177,0,38,255,0,73,1,2,0,42,50,255,255,255,204,255,0,84,1,2,0,34,95,255,255,237,160,255,0,95,1,2,0,30,136,254,254,217,118,255,0,106,1,2,0,24,178,254,254,178,76,255,0,117,1,2,0,17,194,253,253,141,60,255,0,128,1,2,0,7,212,252,252,78,42,255,0,139,1,2,0,254,225,227,227,26,28,255,0,150,1,2,0,246,255,189,189,0,38,255,0,161,1,2,0,242,255,128,128,0,38,255,0,172,1,2,0,147,15,255,240,248,255,255,0,182,1,2,0,24,35,250,250,235,215,255,0,195,1,2,0,23,36,255,255,239,219,255,0,209,1,2,0,23,36,238,238,223,204,255,0,223,1,2,0,23,36,205,205,192,176,255,0,237,1,2,0,24,34,139,139,131,120,255,0,251,1,2,0,113,128,255,127,255,212,255,0,6,2,2,0,113,128,255,127,255,212,255,0,18,2,2,0,113,128,238,118,238,198,255,0,30,2,2,0,113,128,205,102,205,170,255,0,42,2,2,0,113,128,139,69,139,116,255,0,54,2,2,0,127,15,255,240,255,255,255,0,60,2,2,0,127,15,255,240,255,255,255,0,67,2,2,0,127,15,238,224,238,238,255,0,74,2,2,0,127,14,205,193,205,205,255,0,81,2,2,0,127,14,139,131,139,139,255,0,88,2,2,0,42,26,245,245,245,220,255,0,94,2,2,0,23,58,255,255,228,196,255,0,101,2,2,0,23,58,255,255,228,196,255,0,109,2,2,0,23,58,238,238,213,183,255,0,117,2,2,0,22,58,205,205,183,158,255,0,125,2,2,0,23,58,139,139,125,107,255,0,143,25,2,0,0,0,0,0,0,0,255,0,133,2,2,0,25,49,255,255,235,205,255,0,148,2,2,0,170,255,255,0,0,255,255,0,153,2,2,0,170,255,255,0,0,255,255,0,159,2,2,0,170,255,238,0,0,238,255,0,165,2,2,0,170,255,205,0,0,205,255,0,171,2,2,0,170,255,139,0,0,139,255,0,177,2,2,0,192,206,226,138,43,226,255,0,188,2,2,0,0,190,165,165,42,42,255,0,194,2,2,0,0,191,255,255,64,64,255,0,201,2,2,0,0,191,238,238,59,59,255,0,208,2,2,0,0,191,205,205,51,51,255,0,215,2,2,0,0,190,139,139,35,35,255,0,222,2,2,0,23,99,222,222,184,135,255,0,232,2,2,0,23,100,255,255,211,155,255,0,243,2,2,0,23,99,238,238,197,145,255,0,254,2,2,0,23,99,205,205,170,125,255,0,9,3,2,0,23,99,139,139,115,85,255,0,20,3,2,0,128,103,160,95,158,160,255,0,30,3,2,0,131,103,255,152,245,255,255,0,41,3,2,0,131,102,238,142,229,238,255,0,52,3,2,0,131,103,205,122,197,205,255,0,63,3,2,0,131,102,139,83,134,139,255,0,74,3,2,0,63,255,255,127,255,0,255,0,85,3,2,0,63,255,255,127,255,0,255,0,97,3,2,0,63,255,238,118,238,0,255,0,109,3,2,0,63,255,205,102,205,0,255,0,121,3,2,0,63,255,139,69,139,0,255,0,133,3,2,0,17,218,210,210,105,30,255,0,143,3,2,0,17,219,255,255,127,36,255,0,154,3,2,0,17,219,238,238,118,33,255,0,165,3,2,0,17,218,205,205,102,29,255,0,176,3,2,0,17,220,139,139,69,19,255,0,187,3,2,0,11,175,255,255,127,80,255,0,193,3,2,0,7,169,255,255,114,86,255,0,200,3,2,0,6,169,238,238,106,80,255,0,207,3,2,0,6,169,205,205,91,69,255,0,214,3,2,0,6,168,139,139,62,47,255,0,221,3,2,0,154,147,237,100,149,237,255,0,236,3,2,0,33,34,255,255,248,220,255,0,245,3,2,0,33,34,255,255,248,220,255,0,255,3,2,0,34,35,238,238,232,205,255,0,9,4,2,0,34,34,205,205,200,177,255,0,19,4,2,0,35,34,139,139,136,120,255,0,29,4,2,0,246,231,220,220,20,60,255,0,37,4,2,0,127,255,255,0,255,255,255,0,42,4,2,0,127,255,255,0,255,255,255,0,48,4,2,0,127,255,238,0,238,238,255,0,54,4,2,0,127,255,205,0,205,205,255,0,60,4,2,0,127,255,139,0,139,139,255,0,66,4,2,0,30,239,184,184,134,11,255,0,80,4,2,0,30,240,255,255,185,15,255,0,95,4,2,0,30,240,238,238,173,14,255,0,110,4,2,0,30,240,205,205,149,12,255,0,125,4,2,0,30,240,139,139,101,8,255,0,140,4,2,0,85,255,100,0,100,0,255,0,150,4,2,0,39,110,189,189,183,107,255,0,160,4,2,0,58,142,107,85,107,47,255,0,175,4,2,0,58,143,255,202,255,112,255,0,191,4,2,0,58,143,238,188,238,104,255,0,207,4,2,0,58,143,205,162,205,90,255,0,223,4,2,0,58,143,139,110,139,61,255,0,239,4,2,0,23,255,255,255,140,0,255,0,250,4,2,0,21,255,255,255,127,0,255,0,6,5,2,0,21,255,238,238,118,0,255,0,18,5,2,0,21,255,205,205,102,0,255,0,30,5,2,0,21,255,139,139,69,0,255,0,42,5,2,0,198,192,204,153,50,204,255,0,53,5,2,0,198,193,255,191,62,255,255,0,65,5,2,0,198,192,238,178,58,238,255,0,77,5,2,0,198,192,205,154,50,205,255,0,89,5,2,0,198,192,139,104,34,139,255,0,101,5,2,0,10,121,233,233,150,122,255,0,112,5,2,0,85,61,188,143,188,143,255,0,125,5,2,0,85,62,255,193,255,193,255,0,139,5,2,0,85,62,238,180,238,180,255,0,153,5,2,0,85,62,205,155,205,155,255,0,167,5,2,0,85,62,139,105,139,105,255,0,181,5,2,0,175,143,139,72,61,139,255,0,195,5,2,0,127,103,79,47,79,79,255,0,209,5,2,0,127,104,255,151,255,255,255,0,224,5,2,0,127,103,238,141,238,238,255,0,239,5,2,0,127,104,205,121,205,205,255,0,254,5,2,0,127,104,139,82,139,139,255,0,13,6,2,0,127,103,79,47,79,79,255,0,27,6,2,0,128,255,209,0,206,209,255,0,41,6,2,0,199,255,211,148,0,211,255,0,52,6,2,0,232,235,255,255,20,147,255,0,61,6,2,0,232,235,255,255,20,147,255,0,71,6,2,0,232,235,238,238,18,137,255,0,81,6,2,0,232,235,205,205,16,118,255,0,91,6,2,0,231,236,139,139,10,80,255,0,101,6,2,0,138,255,255,0,191,255,255,0,113,6,2,0,138,255,255,0,191,255,255,0,126,6,2,0,138,255,238,0,178,238,255,0,139,6,2,0,138,255,205,0,154,205,255,0,152,6,2,0,138,255,139,0,104,139,255,0,165,6,2,0,0,0,105,105,105,105,255,0,173,6,2,0,0,0,105,105,105,105,255,0,181,6,2,0,148,225,255,30,144,255,255,0,192,6,2,0,148,225,255,30,144,255,255,0,204,6,2,0,148,225,238,28,134,238,255,0,216,6,2,0,148,225,205,24,116,205,255,0,228,6,2,0,148,225,139,16,78,139,255,0,240,6,2,0,0,206,178,178,34,34,255,0,250,6,2,0,0,207,255,255,48,48,255,0,5,7,2,0,0,207,238,238,44,44,255,0,16,7,2,0,0,207,205,205,38,38,255,0,27,7,2,0,0,207,139,139,26,26,255,0,38,7,2,0,28,15,255,255,250,240,255,0,50,7,2,0,85,192,139,34,139,34,255,0,62,7,2,0,0,0,220,220,220,220,255,0,72,7,2,0,170,7,255,248,248,255,255,0,83,7,2,0,35,255,255,255,215,0,255,0,88,7,2,0,35,255,255,255,215,0,255,0,94,7,2,0,35,255,238,238,201,0,255,0,100,7,2,0,35,255,205,205,173,0,255,0,106,7,2,0,35,255,139,139,117,0,255,0,112,7,2,0,30,217,218,218,165,32,255,0,122,7,2,0,30,218,255,255,193,37,255,0,133,7,2,0,30,218,238,238,180,34,255,0,144,7,2,0,30,218,205,205,155,29,255,0,155,7,2,0,30,218,139,139,105,20,255,0,166,7,2,0,0,0,192,192,192,192,255,0,171,7,2,0,0,0,0,0,0,0,255,0,177,7,2,0,0,0,3,3,3,3,255,0,183,7,2,0,0,0,26,26,26,26,255,0,190,7,2,0,0,0,255,255,255,255,255,0,198,7,2,0,0,0,28,28,28,28,255,0,205,7,2,0,0,0,31,31,31,31,255,0,212,7,2,0,0,0,33,33,33,33,255,0,219,7,2,0,0,0,36,36,36,36,255,0,226,7,2,0,0,0,38,38,38,38,255,0,233,7,2,0,0,0,41,41,41,41,255,0,240,7,2,0,0,0,43,43,43,43,255,0,247,7,2,0,0,0,46,46,46,46,255,0,254,7,2,0,0,0,48,48,48,48,255,0,5,8,2,0,0,0,5,5,5,5,255,0,11,8,2,0,0,0,51,51,51,51,255,0,18,8,2,0,0,0,54,54,54,54,255,0,25,8,2,0,0,0,56,56,56,56,255,0,32,8,2,0,0,0,59,59,59,59,255,0,39,8,2,0,0,0,61,61,61,61,255,0,46,8,2,0,0,0,64,64,64,64,255,0,53,8,2,0,0,0,66,66,66,66,255,0,60,8,2,0,0,0,69,69,69,69,255,0,67,8,2,0,0,0,71,71,71,71,255,0,74,8,2,0,0,0,74,74,74,74,255,0,81,8,2,0,0,0,8,8,8,8,255,0,87,8,2,0,0,0,77,77,77,77,255,0,94,8,2,0,0,0,79,79,79,79,255,0,101,8,2,0,0,0,82,82,82,82,255,0,108,8,2,0,0,0,84,84,84,84,255,0,115,8,2,0,0,0,87,87,87,87,255,0,122,8,2,0,0,0,89,89,89,89,255,0,129,8,2,0,0,0,92,92,92,92,255,0,136,8,2,0,0,0,94,94,94,94,255,0,143,8,2,0,0,0,97,97,97,97,255,0,150,8,2,0,0,0,99,99,99,99,255,0,157,8,2,0,0,0,10,10,10,10,255,0,163,8,2,0,0,0,102,102,102,102,255,0,170,8,2,0,0,0,105,105,105,105,255,0,177,8,2,0,0,0,107,107,107,107,255,0,184,8,2,0,0,0,110,110,110,110,255,0,191,8,2,0,0,0,112,112,112,112,255,0,198,8,2,0,0,0,115,115,115,115,255,0,205,8,2,0,0,0,117,117,117,117,255,0,212,8,2,0,0,0,120,120,120,120,255,0,219,8,2,0,0,0,122,122,122,122,255,0,226,8,2,0,0,0,125,125,125,125,255,0,233,8,2,0,0,0,13,13,13,13,255,0,239,8,2,0,0,0,127,127,127,127,255,0,246,8,2,0,0,0,130,130,130,130,255,0,253,8,2,0,0,0,133,133,133,133,255,0,4,9,2,0,0,0,135,135,135,135,255,0,11,9,2,0,0,0,138,138,138,138,255,0,18,9,2,0,0,0,140,140,140,140,255,0,25,9,2,0,0,0,143,143,143,143,255,0,32,9,2,0,0,0,145,145,145,145,255,0,39,9,2,0,0,0,148,148,148,148,255,0,46,9,2,0,0,0,150,150,150,150,255,0,53,9,2,0,0,0,15,15,15,15,255,0,59,9,2,0,0,0,153,153,153,153,255,0,66,9,2,0,0,0,156,156,156,156,255,0,73,9,2,0,0,0,158,158,158,158,255,0,80,9,2,0,0,0,161,161,161,161,255,0,87,9,2,0,0,0,163,163,163,163,255,0,94,9,2,0,0,0,166,166,166,166,255,0,101,9,2,0,0,0,168,168,168,168,255,0,108,9,2,0,0,0,171,171,171,171,255,0,115,9,2,0,0,0,173,173,173,173,255,0,122,9,2,0,0,0,176,176,176,176,255,0,129,9,2,0,0,0,18,18,18,18,255,0,135,9,2,0,0,0,179,179,179,179,255,0,142,9,2,0,0,0,181,181,181,181,255,0,149,9,2,0,0,0,184,184,184,184,255,0,156,9,2,0,0,0,186,186,186,186,255,0,163,9,2,0,0,0,189,189,189,189,255,0,170,9,2,0,0,0,191,191,191,191,255,0,177,9,2,0,0,0,194,194,194,194,255,0,184,9,2,0,0,0,196,196,196,196,255,0,191,9,2,0,0,0,199,199,199,199,255,0,198,9,2,0,0,0,201,201,201,201,255,0,205,9,2,0,0,0,20,20,20,20,255,0,211,9,2,0,0,0,204,204,204,204,255,0,218,9,2,0,0,0,207,207,207,207,255,0,225,9,2,0,0,0,209,209,209,209,255,0,232,9,2,0,0,0,212,212,212,212,255,0,239,9,2,0,0,0,214,214,214,214,255,0,246,9,2,0,0,0,217,217,217,217,255,0,253,9,2,0,0,0,219,219,219,219,255,0,4,10,2,0,0,0,222,222,222,222,255,0,11,10,2,0,0,0,224,224,224,224,255,0,18,10,2,0,0,0,227,227,227,227,255,0,25,10,2,0,0,0,23,23,23,23,255,0,31,10,2,0,0,0,229,229,229,229,255,0,38,10,2,0,0,0,232,232,232,232,255,0,45,10,2,0,0,0,235,235,235,235,255,0,52,10,2,0,0,0,237,237,237,237,255,0,59,10,2,0,0,0,240,240,240,240,255,0,66,10,2,0,0,0,242,242,242,242,255,0,73,10,2,0,0,0,245,245,245,245,255,0,80,10,2,0,0,0,247,247,247,247,255,0,87,10,2,0,0,0,250,250,250,250,255,0,94,10,2,0,0,0,252,252,252,252,255,0,101,10,2,0,85,255,255,0,255,0,255,0,107,10,2,0,85,255,255,0,255,0,255,0,114,10,2,0,85,255,238,0,238,0,255,0,121,10,2,0,85,255,205,0,205,0,255,0,128,10,2,0,85,255,139,0,139,0,255,0,135,10,2,0,59,208,255,173,255,47,255,0,147,10,2,0,0,0,192,192,192,192,255,0,152,10,2,0,0,0,0,0,0,0,255,0,158,10,2,0,0,0,3,3,3,3,255,0,164,10,2,0,0,0,26,26,26,26,255,0,171,10,2,0,0,0,255,255,255,255,255,0,179,10,2,0,0,0,28,28,28,28,255,0,186,10,2,0,0,0,31,31,31,31,255,0,193,10,2,0,0,0,33,33,33,33,255,0,200,10,2,0,0,0,36,36,36,36,255,0,207,10,2,0,0,0,38,38,38,38,255,0,214,10,2,0,0,0,41,41,41,41,255,0,221,10,2,0,0,0,43,43,43,43,255],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+40964);allocate([228,10,2,0,0,0,46,46,46,46,255,0,235,10,2,0,0,0,48,48,48,48,255,0,242,10,2,0,0,0,5,5,5,5,255,0,248,10,2,0,0,0,51,51,51,51,255,0,255,10,2,0,0,0,54,54,54,54,255,0,6,11,2,0,0,0,56,56,56,56,255,0,13,11,2,0,0,0,59,59,59,59,255,0,20,11,2,0,0,0,61,61,61,61,255,0,27,11,2,0,0,0,64,64,64,64,255,0,34,11,2,0,0,0,66,66,66,66,255,0,41,11,2,0,0,0,69,69,69,69,255,0,48,11,2,0,0,0,71,71,71,71,255,0,55,11,2,0,0,0,74,74,74,74,255,0,62,11,2,0,0,0,8,8,8,8,255,0,68,11,2,0,0,0,77,77,77,77,255,0,75,11,2,0,0,0,79,79,79,79,255,0,82,11,2,0,0,0,82,82,82,82,255,0,89,11,2,0,0,0,84,84,84,84,255,0,96,11,2,0,0,0,87,87,87,87,255,0,103,11,2,0,0,0,89,89,89,89,255,0,110,11,2,0,0,0,92,92,92,92,255,0,117,11,2,0,0,0,94,94,94,94,255,0,124,11,2,0,0,0,97,97,97,97,255,0,131,11,2,0,0,0,99,99,99,99,255,0,138,11,2,0,0,0,10,10,10,10,255,0,144,11,2,0,0,0,102,102,102,102,255,0,151,11,2,0,0,0,105,105,105,105,255,0,158,11,2,0,0,0,107,107,107,107,255,0,165,11,2,0,0,0,110,110,110,110,255,0,172,11,2,0,0,0,112,112,112,112,255,0,179,11,2,0,0,0,115,115,115,115,255,0,186,11,2,0,0,0,117,117,117,117,255,0,193,11,2,0,0,0,120,120,120,120,255,0,200,11,2,0,0,0,122,122,122,122,255,0,207,11,2,0,0,0,125,125,125,125,255,0,214,11,2,0,0,0,13,13,13,13,255,0,220,11,2,0,0,0,127,127,127,127,255,0,227,11,2,0,0,0,130,130,130,130,255,0,234,11,2,0,0,0,133,133,133,133,255,0,241,11,2,0,0,0,135,135,135,135,255,0,248,11,2,0,0,0,138,138,138,138,255,0,255,11,2,0,0,0,140,140,140,140,255,0,6,12,2,0,0,0,143,143,143,143,255,0,13,12,2,0,0,0,145,145,145,145,255,0,20,12,2,0,0,0,148,148,148,148,255,0,27,12,2,0,0,0,150,150,150,150,255,0,34,12,2,0,0,0,15,15,15,15,255,0,40,12,2,0,0,0,153,153,153,153,255,0,47,12,2,0,0,0,156,156,156,156,255,0,54,12,2,0,0,0,158,158,158,158,255,0,61,12,2,0,0,0,161,161,161,161,255,0,68,12,2,0,0,0,163,163,163,163,255,0,75,12,2,0,0,0,166,166,166,166,255,0,82,12,2,0,0,0,168,168,168,168,255,0,89,12,2,0,0,0,171,171,171,171,255,0,96,12,2,0,0,0,173,173,173,173,255,0,103,12,2,0,0,0,176,176,176,176,255,0,110,12,2,0,0,0,18,18,18,18,255,0,116,12,2,0,0,0,179,179,179,179,255,0,123,12,2,0,0,0,181,181,181,181,255,0,130,12,2,0,0,0,184,184,184,184,255,0,137,12,2,0,0,0,186,186,186,186,255,0,144,12,2,0,0,0,189,189,189,189,255,0,151,12,2,0,0,0,191,191,191,191,255,0,158,12,2,0,0,0,194,194,194,194,255,0,165,12,2,0,0,0,196,196,196,196,255,0,172,12,2,0,0,0,199,199,199,199,255,0,179,12,2,0,0,0,201,201,201,201,255,0,186,12,2,0,0,0,20,20,20,20,255,0,192,12,2,0,0,0,204,204,204,204,255,0,199,12,2,0,0,0,207,207,207,207,255,0,206,12,2,0,0,0,209,209,209,209,255,0,213,12,2,0,0,0,212,212,212,212,255,0,220,12,2,0,0,0,214,214,214,214,255,0,227,12,2,0,0,0,217,217,217,217,255,0,234,12,2,0,0,0,219,219,219,219,255,0,241,12,2,0,0,0,222,222,222,222,255,0,248,12,2,0,0,0,224,224,224,224,255,0,255,12,2,0,0,0,227,227,227,227,255,0,6,13,2,0,0,0,23,23,23,23,255,0,12,13,2,0,0,0,229,229,229,229,255,0,19,13,2,0,0,0,232,232,232,232,255,0,26,13,2,0,0,0,235,235,235,235,255,0,33,13,2,0,0,0,237,237,237,237,255,0,40,13,2,0,0,0,240,240,240,240,255,0,47,13,2,0,0,0,242,242,242,242,255,0,54,13,2,0,0,0,245,245,245,245,255,0,61,13,2,0,0,0,247,247,247,247,255,0,68,13,2,0,0,0,250,250,250,250,255,0,75,13,2,0,0,0,252,252,252,252,255,0,82,13,2,0,85,15,255,240,255,240,255,0,91,13,2,0,85,15,255,240,255,240,255,0,101,13,2,0,85,15,238,224,238,224,255,0,111,13,2,0,85,14,205,193,205,193,255,0,121,13,2,0,85,14,139,131,139,131,255,0,131,13,2,0,233,150,255,255,105,180,255,0,139,13,2,0,234,145,255,255,110,180,255,0,148,13,2,0,235,141,238,238,106,167,255,0,157,13,2,0,236,135,205,205,96,144,255,0,166,13,2,0,234,148,139,139,58,98,255,0,175,13,2,0,0,140,205,205,92,92,255,0,185,13,2,0,0,148,255,255,106,106,255,0,196,13,2,0,0,148,238,238,99,99,255,0,207,13,2,0,0,149,205,205,85,85,255,0,218,13,2,0,0,148,139,139,58,58,255,0,229,13,2,0,194,255,130,75,0,130,255,0,236,13,2,0,42,0,255,255,255,254,0,0,242,13,2,0,42,15,255,255,255,240,255,0,248,13,2,0,42,15,255,255,255,240,255,0,255,13,2,0,42,15,238,238,238,224,255,0,6,14,2,0,42,14,205,205,205,193,255,0,13,14,2,0,42,14,139,139,139,131,255,0,20,14,2,0,38,106,240,240,230,140,255,0,26,14,2,0,39,112,255,255,246,143,255,0,33,14,2,0,39,112,238,238,230,133,255,0,40,14,2,0,39,111,205,205,198,115,255,0,47,14,2,0,39,111,139,139,134,78,255,0,54,14,2,0,170,20,250,230,230,250,255,0,63,14,2,0,240,15,255,255,240,245,255,0,77,14,2,0,240,15,255,255,240,245,255,0,92,14,2,0,239,15,238,238,224,229,255,0,107,14,2,0,240,14,205,205,193,197,255,0,122,14,2,0,239,14,139,139,131,134,255,0,137,14,2,0,64,255,252,124,252,0,255,0,147,14,2,0,38,49,255,255,250,205,255,0,160,14,2,0,38,49,255,255,250,205,255,0,174,14,2,0,37,50,238,238,233,191,255,0,188,14,2,0,38,49,205,205,201,165,255,0,202,14,2,0,39,49,139,139,137,112,255,0,216,14,2,0,137,63,230,173,216,230,255,0,226,14,2,0,138,64,255,191,239,255,255,0,237,14,2,0,138,64,238,178,223,238,255,0,248,14,2,0,138,63,205,154,192,205,255,0,3,15,2,0,137,64,139,104,131,139,255,0,14,15,2,0,0,119,240,240,128,128,255,0,25,15,2,0,127,31,255,224,255,255,255,0,35,15,2,0,127,31,255,224,255,255,255,0,46,15,2,0,127,31,238,209,238,238,255,0,57,15,2,0,127,31,205,180,205,205,255,0,68,15,2,0,127,31,139,122,139,139,255,0,79,15,2,0,35,115,238,238,221,130,255,0,94,15,2,0,35,116,255,255,236,139,255,0,110,15,2,0,35,115,238,238,220,130,255,0,126,15,2,0,35,115,205,205,190,112,255,0,142,15,2,0,35,115,139,139,129,76,255,0,158,15,2,0,42,40,250,250,250,210,255,0,179,15,2,0,0,0,211,211,211,211,255,0,189,15,2,0,0,0,211,211,211,211,255,0,199,15,2,0,248,73,255,255,182,193,255,0,209,15,2,0,249,81,255,255,174,185,255,0,220,15,2,0,248,81,238,238,162,173,255,0,231,15,2,0,249,80,205,205,140,149,255,0,242,15,2,0,249,80,139,139,95,101,255,0,253,15,2,0,12,132,255,255,160,122,255,0,9,16,2,0,12,132,255,255,160,122,255,0,22,16,2,0,11,132,238,238,149,114,255,0,35,16,2,0,12,133,205,205,129,98,255,0,48,16,2,0,12,133,139,139,87,66,255,0,61,16,2,0,125,209,178,32,178,170,255,0,75,16,2,0,143,117,250,135,206,250,255,0,88,16,2,0,143,79,255,176,226,255,255,0,102,16,2,0,143,79,238,164,211,238,255,0,116,16,2,0,142,79,205,141,182,205,255,0,130,16,2,0,143,78,139,96,123,139,255,0,144,16,2,0,175,143,255,132,112,255,255,0,159,16,2,0,148,56,153,119,136,153,255,0,174,16,2,0,148,56,153,119,136,153,255,0,189,16,2,0,151,52,222,176,196,222,255,0,204,16,2,0,151,53,255,202,225,255,255,0,220,16,2,0,151,53,238,188,210,238,255,0,236,16,2,0,151,53,205,162,181,205,255,0,252,16,2,0,150,53,139,110,123,139,255,0,12,17,2,0,42,31,255,255,255,224,255,0,24,17,2,0,42,31,255,255,255,224,255,0,37,17,2,0,42,31,238,238,238,209,255,0,50,17,2,0,42,31,205,205,205,180,255,0,63,17,2,0,42,31,139,139,139,122,255,0,76,17,2,0,85,192,205,50,205,50,255,0,86,17,2,0,21,20,250,250,240,230,255,0,92,17,2,0,212,255,255,255,0,255,255,0,100,17,2,0,212,255,255,255,0,255,255,0,109,17,2,0,212,255,238,238,0,238,255,0,118,17,2,0,212,255,205,205,0,205,255,0,127,17,2,0,212,255,139,139,0,139,255,0,136,17,2,0,239,185,176,176,48,96,255,0,143,17,2,0,228,203,255,255,52,179,255,0,151,17,2,0,228,203,238,238,48,167,255,0,159,17,2,0,228,204,205,205,41,144,255,0,167,17,2,0,228,203,139,139,28,98,255,0,175,17,2,0,113,128,205,102,205,170,255,0,192,17,2,0,170,255,205,0,0,205,255,0,203,17,2,0,204,152,211,186,85,211,255,0,216,17,2,0,203,153,255,224,102,255,255,0,230,17,2,0,203,153,238,209,95,238,255,0,244,17,2,0,203,153,205,180,82,205,255,0,2,18,2,0,203,154,139,122,55,139,255,0,16,18,2,0,183,124,219,147,112,219,255,0,29,18,2,0,183,125,255,171,130,255,255,0,43,18,2,0,183,125,238,159,121,238,255,0,57,18,2,0,183,125,205,137,104,205,255,0,71,18,2,0,183,124,139,93,71,139,255,0,85,18,2,0,103,169,179,60,179,113,255,0,100,18,2,0,176,143,238,123,104,238,255,0,116,18,2,0,111,255,250,0,250,154,255,0,134,18,2,0,125,167,209,72,209,204,255,0,150,18,2,0,228,228,199,199,21,133,255,0,166,18,2,0,170,198,112,25,25,112,255,0,179,18,2,0,106,9,255,245,255,250,255,0,189,18,2,0,4,30,255,255,228,225,255,0,199,18,2,0,4,30,255,255,228,225,255,0,210,18,2,0,4,30,238,238,213,210,255,0,221,18,2,0,3,29,205,205,183,181,255,0,232,18,2,0,5,29,139,139,125,123,255,0,243,18,2,0,26,73,255,255,228,181,255,0,252,18,2,0,25,81,255,255,222,173,255,0,8,19,2,0,25,81,255,255,222,173,255,0,21,19,2,0,25,82,238,238,207,161,255,0,34,19,2,0,25,82,205,205,179,139,255,0,47,19,2,0,25,82,139,139,121,94,255,0,60,19,2,0,170,255,128,0,0,128,255,0,65,19,2,0,170,255,128,0,0,128,255,0,74,19,2,0,42,0,255,255,255,254,0,0,79,19,2,0,27,23,253,253,245,230,255,0,87,19,2,0,56,192,142,107,142,35,255,0,97,19,2,0,56,193,255,192,255,62,255,0,108,19,2,0,56,192,238,179,238,58,255,0,119,19,2,0,56,192,205,154,205,50,255,0,130,19,2,0,56,192,139,105,139,34,255,0,141,19,2,0,27,255,255,255,165,0,255,0,148,19,2,0,27,255,255,255,165,0,255,0,156,19,2,0,27,255,238,238,154,0,255,0,164,19,2,0,27,255,205,205,133,0,255,0,172,19,2,0,27,255,139,139,90,0,255,0,180,19,2,0,11,255,255,255,69,0,255,0,190,19,2,0,11,255,255,255,69,0,255,0,201,19,2,0,11,255,238,238,64,0,255,0,212,19,2,0,11,255,205,205,55,0,255,0,223,19,2,0,11,255,139,139,37,0,255,0,234,19,2,0,214,123,218,218,112,214,255,0,241,19,2,0,214,124,255,255,131,250,255,0,249,19,2,0,214,124,238,238,122,233,255,0,1,20,2,0,214,124,205,205,105,201,255,0,9,20,2,0,213,124,139,139,71,137,255,0,17,20,2,0,38,72,238,238,232,170,255,0,31,20,2,0,85,100,251,152,251,152,255,0,41,20,2,0,85,101,255,154,255,154,255,0,52,20,2,0,85,100,238,144,238,144,255,0,63,20,2,0,85,100,205,124,205,124,255,0,74,20,2,0,85,100,139,84,139,84,255,0,85,20,2,0,127,67,238,175,238,238,255,0,99,20,2,0,127,68,255,187,255,255,255,0,114,20,2,0,127,68,238,174,238,238,255,0,129,20,2,0,127,68,205,150,205,205,255,0,144,20,2,0,127,67,139,102,139,139,255,0,159,20,2,0,241,124,219,219,112,147,255,0,173,20,2,0,241,125,255,255,130,171,255,0,188,20,2,0,241,125,238,238,121,159,255,0,203,20,2,0,241,125,205,205,104,137,255,0,218,20,2,0,241,124,139,139,71,93,255,0,233,20,2,0,26,41,255,255,239,213,255,0,244,20,2,0,20,70,255,255,218,185,255,0,254,20,2,0,20,70,255,255,218,185,255,0,9,21,2,0,19,69,238,238,203,173,255,0,20,21,2,0,19,69,205,205,175,149,255,0,31,21,2,0,20,69,139,139,119,101,255,0,42,21,2,0,20,176,205,205,133,63,255,0,47,21,2,0,247,63,255,255,192,203,255,0,52,21,2,0,245,73,255,255,181,197,255,0,58,21,2,0,245,73,238,238,169,184,255,0,64,21,2,0,245,74,205,205,145,158,255,0,70,21,2,0,245,73,139,139,99,108,255,0,76,21,2,0,212,70,221,221,160,221,255,0,81,21,2,0,212,68,255,255,187,255,255,0,87,21,2,0,212,68,238,238,174,238,255,0,93,21,2,0,212,68,205,205,150,205,255,0,99,21,2,0,212,67,139,139,102,139,255,0,105,21,2,0,132,59,230,176,224,230,255,0,116,21,2,0,196,221,240,160,32,240,255,0,123,21,2,0,191,207,255,155,48,255,255,0,131,21,2,0,192,207,238,145,44,238,255,0,139,21,2,0,192,207,205,125,38,205,255,0,147,21,2,0,192,207,139,85,26,139,255,0,155,21,2,0,0,255,255,255,0,0,255,0,159,21,2,0,0,255,255,255,0,0,255,0,164,21,2,0,0,255,238,238,0,0,255,0,169,21,2,0,0,255,205,205,0,0,255,0,174,21,2,0,0,255,139,139,0,0,255,0,179,21,2,0,0,61,188,188,143,143,255,0,189,21,2,0,0,62,255,255,193,193,255,0,200,21,2,0,0,62,238,238,180,180,255,0,211,21,2,0,0,62,205,205,155,155,255,0,222,21,2,0,0,62,139,139,105,105,255,0,233,21,2,0,159,181,225,65,105,225,255,0,243,21,2,0,159,183,255,72,118,255,255,0,254,21,2,0,159,183,238,67,110,238,255,0,9,22,2,0,159,182,205,58,95,205,255,0,20,22,2,0,159,183,139,39,64,139,255,0,31,22,2,0,17,220,139,139,69,19,255,0,43,22,2,0,4,138,250,250,128,114,255,0,50,22,2,0,9,150,255,255,140,105,255,0,58,22,2,0,9,150,238,238,130,98,255,0,66,22,2,0,9,150,205,205,112,84,255,0,74,22,2,0,9,150,139,139,76,57,255,0,82,22,2,0,19,154,244,244,164,96,255,0,93,22,2,0,103,170,139,46,139,87,255,0,102,22,2,0,103,171,255,84,255,159,255,0,112,22,2,0,103,171,238,78,238,148,255,0,122,22,2,0,103,171,205,67,205,128,255,0,132,22,2,0,103,170,139,46,139,87,255,0,142,22,2,0,17,16,255,255,245,238,255,0,151,22,2,0,17,16,255,255,245,238,255,0,161,22,2,0,18,17,238,238,229,222,255,0,171,22,2,0,18,17,205,205,197,191,255,0,181,22,2,0,18,16,139,139,134,130,255,0,191,22,2,0,13,183,160,160,82,45,255,0,198,22,2,0,13,184,255,255,130,71,255,0,206,22,2,0,13,184,238,238,121,66,255,0,214,22,2,0,13,184,205,205,104,57,255,0,222,22,2,0,13,185,139,139,71,38,255,0,230,22,2,0,139,108,235,135,206,235,255,0,238,22,2,0,144,120,255,135,206,255,255,0,247,22,2,0,144,120,238,126,192,238,255,0,0,23,2,0,144,120,205,108,166,205,255,0,9,23,2,0,145,119,139,74,112,139,255,0,18,23,2,0,175,143,205,106,90,205,255,0,28,23,2,0,175,144,255,131,111,255,255,0,39,23,2,0,175,144,238,122,103,238,255,0,50,23,2,0,175,144,205,105,89,205,255,0,61,23,2,0,175,144,139,71,60,139,255,0,72,23,2,0,148,56,144,112,128,144,255,0,82,23,2,0,149,56,255,198,226,255,255,0,93,23,2,0,149,56,238,185,211,238,255,0,104,23,2,0,148,57,205,159,182,205,255,0,115,23,2,0,149,56,139,108,123,139,255,0,126,23,2,0,148,56,144,112,128,144,255,0,136,23,2,0,0,5,255,255,250,250,255,0,141,23,2,0,0,5,255,255,250,250,255,0,147,23,2,0,0,5,238,238,233,233,255,0,153,23,2,0,0,4,205,205,201,201,255,0,159,23,2,0,0,3,139,139,137,137,255,0,165,23,2,0,106,255,255,0,255,127,255,0,177,23,2,0,106,255,255,0,255,127,255,0,190,23,2,0,106,255,238,0,238,118,255,0,203,23,2,0,106,255,205,0,205,102,255,0,216,23,2,0,106,255,139,0,139,69,255,0,229,23,2,0,146,155,180,70,130,180,255,0,239,23,2,0,146,156,255,99,184,255,255,0,250,23,2,0,146,156,238,92,172,238,255,0,5,24,2,0,146,156,205,79,148,205,255,0,16,24,2,0,147,155,139,54,100,139,255,0,27,24,2,0,24,84,210,210,180,140,255,0,31,24,2,0,20,176,255,255,165,79,255,0,36,24,2,0,20,176,238,238,154,73,255,0,41,24,2,0,20,176,205,205,133,63,255,0,46,24,2,0,20,176,139,139,90,43,255,0,51,24,2,0,212,29,216,216,191,216,255,0,59,24,2,0,212,30,255,255,225,255,255,0,68,24,2,0,212,30,238,238,210,238,255,0,77,24,2,0,212,29,205,205,181,205,255,0,86,24,2,0,212,29,139,139,123,139,255,0,95,24,2,0,6,184,255,255,99,71,255,0,102,24,2,0,6,184,255,255,99,71,255,0,110,24,2,0,6,184,238,238,92,66,255,0,118,24,2,0,6,184,205,205,79,57,255,0,126,24,2,0,6,185,139,139,54,38,255,0,208,25,2,0,42,0,255,255,255,254,0,0,134,24,2,0,123,182,224,64,224,208,255,0,144,24,2,0,129,255,255,0,245,255,255,0,155,24,2,0,129,255,238,0,229,238,255,0,166,24,2,0,129,255,205,0,197,205,255,0,177,24,2,0,129,255,139,0,134,139,255,0,188,24,2,0,212,115,238,238,130,238,255,0,195,24,2,0,227,215,208,208,32,144,255,0,205,24,2,0,235,193,255,255,62,150,255,0,216,24,2,0,235,192,238,238,58,140,255,0,227,24,2,0,235,192,205,205,50,120,255,0,238,24,2,0,235,192,139,139,34,82,255,0,249,24,2,0,27,68,245,245,222,179,255,0,255,24,2,0,27,69,255,255,231,186,255,0,6,25,2,0,27,68,238,238,216,174,255,0,13,25,2,0,27,68,205,205,186,150,255,0,20,25,2,0,27,67,139,139,126,102,255,0,27,25,2,0,0,0,255,255,255,255,255,0,33,25,2,0,0,0,245,245,245,245,255,0,44,25,2,0,42,255,255,255,255,0,255,0,51,25,2,0,42,255,255,255,255,0,255,0,59,25,2,0,42,255,238,238,238,0,255,0,67,25,2,0,42,255,205,205,205,0,255,0,75,25,2,0,42,255,139,139,139,0,255,0,83,25,2,0,56,192,205,154,205,50,255,0,201,29,2,0,227,25,2,0,229,25,2,0,231,25,2,0,233,25,2,0,235,25,2,0,237,25,2,0,239,25,2,0,241,25,2,0,243,25,2,0,245,25,2,0,248,25,2,0,251,25,2,0,254,25,2,0,1,26,2,0,4,26,2,0,7,26,2,0,10,26,2,0,13,26,2,0,16,26,2,0,19,26,2,0,0,0,0,0,4,0,0,0,4,0,0,0,11,0,0,0,54,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,27,2,0,149,28,2,0,8,0,0,0,16,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,16,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,245,38,2,0,9,0,0,0,251,38,2,0,10,0,0,0,4,39,2,0,11,0,0,0,70,39,2,0,12,0,0,0,76,39,2,0,13,0,0,0,81,39,2,0,14,0,0,0,4,39,2,0,15,0,0,0,217,39,2,0,16,0,0,0,224,39,2,0,17,0,0,0,232,39,2,0,18,0,0,0,239,39,2,0,19,0,0,0,251,39,2,0,20,0,0,0,70,39,2,0,21,0,0,0,7,40,2,0,22,0,0,0,15,40,2,0,23,0,0,0,25,40,2,0,24,0,0,0,39,40,2,0,25,0,0,0,46,40,2,0,26,0,0,0,51,40,2,0,27,0,0,0,54,40,2,0,28,0,0,0,59,40,2,0,29,0,0,0,67,40,2,0,30,0,0,0,73,40,2,0,31,0,0,0,79,40,2,0,32,0,0,0,86,40,2,0,33,0,0,0,92,40,2,0,33,0,0,0,100,40,2,0,34,0,0,0,107,40,2,0,35,0,0,0,4,39,2,0,36,0,0,0,224,39,2,0,17,0,0,0,232,39,2,0,18,0,0,0,98,42,2,0,37,0,0,0,239,39,2,0,19,0,0,0,251,39,2,0,20,0,0,0,70,39,2,0,21,0,0,0,109,42,2,0,38,0,0,0,15,40,2,0,23,0,0,0,25,40,2,0,24,0,0,0,39,40,2,0,25,0,0,0,46,40,2,0,26,0,0,0,51,40,2,0,27,0,0,0,54,40,2,0,28,0,0,0,117,42,2,0,39,0,0,0,67,40,2,0,30,0,0,0,73,40,2,0,31,0,0,0,79,40,2,0,32,0,0,0,86,40,2,0,33,0,0,0,92,40,2,0,33,0,0,0,100,40,2,0,34,0,0,0,107,40,2,0,35,0,0,0,0,0,0,0,76,45,2,0,90,45,2,0,103,45,2,0,120,45,2,0,152,45,2,0,167,45,2,0,185,45,2,0,200,45,2,0,220,45,2,0,248,45,2,0,27,46,2,0,44,46,2,0,71,46,2,0,91,46,2,0,129,46,2,0,156,46,2,0,198,46,2,0,245,46,2,0,6,47,2,0,57,47,2,0,80,47,2,0,126,47,2,0,153,47,2,0,204,47,2,0,240,47,2,0,36,48,2,0,81,48,2,0,96,48,2,0,122,48,2,0,160,48,2,0,192,48,2,0,225,48,2,0,3,49,2,0,20,49,2,0,41,49,2,0,57,49,2,0,74,49,2,0,118,49,2,0,198,49,2,0,1,50,2,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,6,0,0,0,7,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,4,254,255,255,135,254,255,255,7,0,0,0,0,0,0,0,0,255,255,127,255,255,255,127,255,255,255,255,255,255,255,243,127,254,253,255,255,255,255,255,127,255,255,255,255,255,255,255,255,15,224,255,255,255,255,49,252,255,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,1,0,248,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,215,255,255,251,255,255,255,255,127,127,84,253,255,15,0,254,223,255,255,255,255,255,255,255,255,254,223,255,255,255,255,3,0,255,255,255,255,255,255,159,25,255,255,255,207,63,3,0,0,0,0,0,0,254,255,255,255,127,2,254,255,255,255,127,0,0,0,0,0,0,0,0,0,255,255,255,7,7,0,0,0,0,0,254,255,255,7,254,7,0,0,0,0,254,255,255,255,255,255,255,255,255,124,255,127,47,0,96,0,0,0,224,255,255,255,255,255,255,35,0,0,0,255,3,0,0,0,224,159,249,255,255,253,197,3,0,0,0,176,3,0,3,0,224,135,249,255,255,253,109,3,0,0,0,94,0,0,28,0,224,175,251,255,255,253,237,35,0,0,0,0,1,0,0,0,224,159,249,255,255,253,205,35,0,0,0,176,3,0,0,0,224,199,61,214,24,199,191,3,0,0,0,0,0,0,0,0,224,223,253,255,255,253,239,3,0,0,0,0,3,0,0,0,224,223,253,255,255,253,239,3,0,0,0,64,3,0,0,0,224,223,253,255,255,253,255,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,127,13,0,63,0,0,0,0,0,0,0,150,37,240,254,174,108,13,32,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,254,255,255,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,63,0,255,255,255,255,127,0,237,218,7,0,0,0,0,80,1,80,49,130,171,98,44,0,0,0,0,64,0,201,128,245,7,0,0,0,0,8,1,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,3,255,255,63,63,255,255,255,255,63,63,255,170,255,255,255,63,255,255,255,255,255,255,223,95,220,31,207,15,255,31,220,31,0,0,0,0,64,76,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,254,3,0,0,254,255,255,255,255,255,255,255,255,255,31,0,254,255,255,255,255,255,255,255,255,255,255,7,224,255,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,255,7,254,255,255,135,254,255,255,7,0,0,0,0,0,0,128,0,255,255,127,255,255,255,127,255,255,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,1,0,248,3,0,3,0,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,3,0,0,0,192,215,255,255,251,255,255,255,255,127,127,84,253,255,15,0,254,223,255,255,255,255,255,255,255,255,254,223,255,255,255,255,123,0,255,255,255,255,255,255,159,25,255,255,255,207,63,3,0,0,0,0,0,0,254,255,255,255,127,2,254,255,255,255,127,0,254,255,251,255,255,187,22,0,255,255,255,7,7,0,0,0,0,0,254,255,255,7,255,255,7,0,255,3,255,255,255,255,255,255,255,255,255,124,255,127,239,255,255,61,255,3,238,255,255,255,255,255,255,243,255,63,30,255,207,255,0,0,238,159,249,255,255,253,197,211,159,57,128,176,207,255,3,0,228,135,249,255,255,253,109,211,135,57,0,94,192,255,31,0,238,175,251,255,255,253,237,243,191,59,0,0,193,255,0,0,238,159,249,255,255,253,205,243,143,57,192,176,195,255,0,0,236,199,61,214,24,199,191,195,199,61,128,0,128,255,0,0,238,223,253,255,255,253,239,195,223,61,96,0,195,255,0,0,236,223,253,255,255,253,239,195,223,61,96,64,195,255,0,0,236,223,253,255,255,253,255,195,207,61,128,0,195,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,127,255,7,255,127,255,3,0,0,0,0,150,37,240,254,174,108,255,59,95,63,255,3,0,0,0,0,0,0,0,3,255,3,160,194,255,254,255,255,255,3,254,255,223,15,191,254,255,63,254,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,31,2,0,0,0,160,0,0,0,254,255,62,0,254,255,255,255,255,255,255,255,255,255,31,102,254,255,255,255,255,255,255,255,255,255,255,119,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,0,0,0,0,0,0,0,0,0,1,1,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,45,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,0,0,0,0,0,0,0,0,0,1,1,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,45,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,224,221,0,0,76,231,0,0,192,229,0,0,188,232,0,0,188,232,0,0,44,234,0,0,192,229,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,10,0,0,0,7,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,39,0,0,0,14,0,0,0,40,0,0,0,51,0,0,0,52,0,0,0,41,0,0,0,53,0,0,0,15,0,0,0,26,0,0,0,42,0,0,0,11,0,0,0,12,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,16,0,0,0,49,0,0,0,54,0,0,0,55,0,0,0,50,0,0,0,56,0,0,0,17,0,0,0,27,0,0,0,51,0,0,0,13,0,0,0,14,0,0,0,2,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,142,1,0,71,52,2,0,128,143,1,0,80,52,2,0,87,52,2,0,96,52,2,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,23,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,0,0,0,0,0,0,0,0,0,1,1,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,45,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,64,237,0,0,176,238,0,0,32,240,0,0,144,241,0,0,144,241,0,0,0,243,0,0,32,240,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,6,0,0,0,7,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,23,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,10,0,0,0,7,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,23,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+51204);allocate([25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,23,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,0,0,0,0,0,0,0,0,0,1,1,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,45,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,39,0,0,0,14,0,0,0,40,0,0,0,51,0,0,0,52,0,0,0,41,0,0,0,53,0,0,0,15,0,0,0,26,0,0,0,42,0,0,0,11,0,0,0,12,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,23,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,16,0,0,0,49,0,0,0,54,0,0,0,55,0,0,0,50,0,0,0,56,0,0,0,17,0,0,0,27,0,0,0,51,0,0,0,13,0,0,0,14,0,0,0,2,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,23,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,242,52,2,0,248,52,2,0,251,52,2,0,1,53,2,0,155,52,2,0,8,53,2,0,17,53,2,0,25,53,2,0,172,244,0,0,20,0,0,0,67,46,85,84,70,45,56,0,0,0,0,0,0,0,0,0,0,0,0,0,222,18,4,149,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,2,0,0,192,3,0,0,192,4,0,0,192,5,0,0,192,6,0,0,192,7,0,0,192,8,0,0,192,9,0,0,192,10,0,0,192,11,0,0,192,12,0,0,192,13,0,0,192,14,0,0,192,15,0,0,192,16,0,0,192,17,0,0,192,18,0,0,192,19,0,0,192,20,0,0,192,21,0,0,192,22,0,0,192,23,0,0,192,24,0,0,192,25,0,0,192,26,0,0,192,27,0,0,192,28,0,0,192,29,0,0,192,30,0,0,192,31,0,0,192,0,0,0,179,1,0,0,195,2,0,0,195,3,0,0,195,4,0,0,195,5,0,0,195,6,0,0,195,7,0,0,195,8,0,0,195,9,0,0,195,10,0,0,195,11,0,0,195,12,0,0,195,13,0,0,211,14,0,0,195,15,0,0,195,0,0,12,187,1,0,12,195,2,0,12,195,3,0,12,195,4,0,12,211,144,245,0,0,5,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,19,0,0,0,22,251,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,231,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,247,0,0,9,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,19,0,0,0,30,251,2,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,247,0,0,5,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,19,0,0,0,38,255,2,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,9,0,0,0,10,0,0,0,13,0,0,0,11,0,0,0,12,0,0,0,133,0,0,0,0,32,0,0,1,32,0,0,2,32,0,0,3,32,0,0,4,32,0,0,5,32,0,0,6,32,0,0,8,32,0,0,9,32,0,0,10,32,0,0,40,32,0,0,41,32,0,0,95,32,0,0,0,48,0,0,0,0,0,0,10,0,0,0,100,0,0,0,232,3,0,0,16,39,0,0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5,95,112,137,0,255,9,47,15,3,0,0,0,4,0,0,0,4,0,0,0,6,0,0,0,131,249,162,0,68,78,110,0,252,41,21,0,209,87,39,0,221,52,245,0,98,219,192,0,60,153,149,0,65,144,67,0,99,81,254,0,187,222,171,0,183,97,197,0,58,110,36,0,210,77,66,0,73,6,224,0,9,234,46,0,28,146,209,0,235,29,254,0,41,177,28,0,232,62,167,0,245,53,130,0,68,187,46,0,156,233,132,0,180,38,112,0,65,126,95,0,214,145,57,0,83,131,57,0,156,244,57,0,139,95,132,0,40,249,189,0,248,31,59,0,222,255,151,0,15,152,5,0,17,47,239,0,10,90,139,0,109,31,109,0,207,126,54,0,9,203,39,0,70,79,183,0,158,102,63,0,45,234,95,0,186,39,117,0,229,235,199,0,61,123,241,0,247,57,7,0,146,82,138,0,251,107,234,0,31,177,95,0,8,93,141,0,48,3,86,0,123,252,70,0,240,171,107,0,32,188,207,0,54,244,154,0,227,169,29,0,94,97,145,0,8,27,230,0,133,153,101,0,160,20,95,0,141,64,104,0,128,216,255,0,39,115,77,0,6,6,49,0,202,86,21,0,201,168,115,0,123,226,96,0,107,140,192,0,116,0,0,0,146,88,2,0,110,0,0,0,148,88,2,0,114,0,0,0,150,88,2,0,102,0,0,0,152,88,2,0,97,0,0,0,154,88,2,0,101,0,0,0,156,88,2,0,119,0,0,0,158,88,2,0,87,0,0,0,171,88,2,0,115,0,0,0,185,88,2,0,83,0,0,0,197,88,2,0,100,0,0,0,210,88,2,0,68,0,0,0,222,88,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,27,0,27,0,32,0,32,0,35,0,33,0,10,0,2,0,22,0,9,0,33,0,33,0,33,0,21,0,28,0,1,0,20,0,20,0,20,0,20,0,20,0,20,0,20,0,8,0,4,0,5,0,27,0,2,0,23,0,27,0,32,0,31,0,30,0,29,0,9,0,19,0,0,0,21,0,18,0,21,0,3,0,7,0,21,0,21,0,20,0,20,0,20,0,20,0,20,0,20,0,20,0,20,0,8,0,4,0,5,0,5,0,6,0,27,0,26,0,24,0,25,0,32,0,7,0,21,0,20,0,20,0,20,0,20,0,20,0,20,0,11,0,20,0,13,0,20,0,12,0,20,0,20,0,20,0,14,0,20,0,20,0,20,0,16,0,20,0,15,0,20,0,17,0,0,0,0,0,0,0,174,0,46,0,47,0,51,0,53,0,48,0,55,0,170,0,219,0,219,0,219,0,219,0,0,0,61,0,135,0,55,0,55,0,219,0,219,0,0,0,40,0,53,0,46,0,50,0,47,0,98,0,0,0,0,0,71,0,0,0,0,0,219,0,81,0,0,0,219,0,219,0,219,0,0,0,219,0,132,0,85,0,219,0,130,0,219,0,0,0,129,0,219,0,0,0,62,0,66,0,65,0,72,0,68,0,82,0,91,0,0,0,0,0,94,0,95,0,219,0,0,0,219,0,219,0,219,0,0,0,0,0,123,0,73,0,87,0,82,0,90,0,90,0,93,0,0,0,95,0,0,0,95,0,0,0,101,0,93,0,95,0,0,0,93,0,110,0,106,0,0,0,105,0,0,0,110,0,0,0,219,0,147,0,154,0,161,0,168,0,171,0,112,0,177,0,184,0,191,0,198,0,205,0,211,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,4,0,7,0,3,0,4,0,5,0,5,0,6,0,6,0,8,0,7,0,7,0,17,0,22,0,18,0,17,0,18,0,8,0,8,0,15,0,15,0,23,0,15,0,24,0,15,0,25,0,26,0,26,0,30,0,22,0,52,0,30,0,5,0,50,0,6,0,34,0,34,0,51,0,23,0,24,0,53,0,25,0,26,0,26,0,42,0,54,0,42,0,52,0,55,0,50,0,69,0,59,0,60,0,51,0,59,0,60,0,70,0,53,0,71,0,72,0,76,0,54,0,34,0,73,0,74,0,55,0,69,0,78,0,80,0,98,0,81,0,82,0,84,0,70,0,71,0,85,0,72,0,76,0,86,0,73,0,74,0,88,0,90,0,78,0,68,0,80,0,81,0,82,0,84,0,56,0,47,0,44,0,85,0,41,0,86,0,27,0,16,0,88,0,90,0,93,0,93,0,93,0,93,0,93,0,93,0,93,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,95,0,95,0,95,0,95,0,95,0,95,0,95,0,96,0,9,0,96,0,96,0,96,0,96,0,96,0,97,0,97,0,99,0,2,0,99,0,99,0,99,0,99,0,99,0,100,0,0,0,100,0,0,0,100,0,100,0,100,0,101,0,0,0,101,0,101,0,101,0,101,0,101,0,102,0,102,0,0,0,102,0,102,0,102,0,102,0,103,0,0,0,103,0,103,0,103,0,103,0,104,0,0,0,104,0,104,0,104,0,104,0,104,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,0,0,92,0,1,0,93,0,93,0,94,0,94,0,95,0,95,0,92,0,92,0,92,0,92,0,92,0,96,0,92,0,92,0,92,0,97,0,92,0,92,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,99,0,100,0,101,0,102,0,102,0,92,0,92,0,103,0,92,0,92,0,92,0,96,0,92,0,92,0,97,0,92,0,97,0,92,0,104,0,97,0,92,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,99,0,100,0,101,0,101,0,92,0,102,0,92,0,92,0,92,0,103,0,104,0,97,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,0,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,0,0,10,0,11,0,12,0,13,0,14,0,10,0,15,0,16,0,17,0,18,0,19,0,10,0,20,0,21,0,21,0,21,0,22,0,23,0,21,0,24,0,21,0,21,0,25,0,21,0,21,0,21,0,26,0,21,0,21,0,10,0,21,0,21,0,21,0,22,0,23,0,24,0,21,0,21,0,25,0,21,0,21,0,21,0,26,0,21,0,21,0,21,0,21,0,27,0,12,0,12,0,36,0,30,0,30,0,32,0,33,0,32,0,33,0,36,0,37,0,38,0,45,0,50,0,47,0,46,0,42,0,37,0,38,0,40,0,41,0,51,0,42,0,52,0,43,0,53,0,54,0,55,0,60,0,50,0,71,0,61,0,34,0,69,0,34,0,63,0,64,0,70,0,51,0,52,0,72,0,53,0,54,0,55,0,47,0,73,0,42,0,71,0,74,0,69,0,76,0,92,0,60,0,70,0,92,0,61,0,77,0,72,0,78,0,79,0,82,0,73,0,65,0,80,0,81,0,74,0,76,0,83,0,84,0,49,0,85,0,86,0,87,0,77,0,78,0,88,0,79,0,82,0,89,0,80,0,81,0,90,0,91,0,83,0,68,0,84,0,85,0,86,0,87,0,75,0,68,0,44,0,88,0,44,0,89,0,56,0,44,0,90,0,91,0,29,0,29,0,29,0,29,0,29,0,29,0,29,0,31,0,31,0,31,0,31,0,31,0,31,0,31,0,35,0,35,0,35,0,35,0,35,0,35,0,35,0,39,0,92,0,39,0,39,0,39,0,39,0,39,0,48,0,48,0,57,0,28,0,57,0,57,0,57,0,57,0,57,0,58,0,92,0,58,0,92,0,58,0,58,0,58,0,59,0,92,0,59,0,59,0,59,0,59,0,59,0,62,0,62,0,92,0,62,0,62,0,62,0,62,0,66,0,92,0,66,0,66,0,66,0,66,0,67,0,92,0,67,0,67,0,67,0,67,0,67,0,9,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,8,0,174,255,209,0,10,0,174,255,174,255,11,0,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,5,0,209,0,174,255,209,0,209,0,209,0,209,0,209,0,209,0,209,0,209,0,174,255,251,255,174,255,14,0,236,255,174,255,174,255,174,255,174,255,209,0,209,0,209,0,209,0,209,0,13,0,37,0,12,0,66,0,16,0,80,0,19,0,109,0,123,0,20,0,152,0,15,0,166,0,195,0,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,23,0,174,255,119,0,174,255,7,0,46,0,174,255,38,0,174,255,23,0,17,0,35,0,174,255,13,0,174,255,174,255,174,255,174,255,58,0,174,255,174,255,53,0,174,255,174,255,174,255,40,0,174,255,7,0,174,255,59,0,69,0,174,255,72,0,174,255,174,255,174,255,174,255,174,255,174,255,174,255,252,255,232,0,246,255,255,255,26,0,0,0,39,0,1,0,50,0,174,255,174,255,2,0,36,0,3,0,47,0,174,255,174,255,174,255,174,255,174,255,254,255,148,0,174,255,9,0,27,0,174,255,188,255,174,255,174,255,175,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,0,0,0,0,0,0,109,230,236,222,5,0,11,0,73,0,49,1,83,0,127,1,48,1,105,0,120,1,255,0,129,1,83,2,130,1,131,1,132,1,133,1,134,1,84,2,135,1,136,1,137,1,86,2,138,1,87,2,139,1,140,1,142,1,221,1,143,1,89,2,144,1,91,2,145,1,146,1,147,1,96,2,148,1,99,2,150,1,105,2,151,1,104,2,152,1,153,1,156,1,111,2,157,1,114,2,159,1,117,2,166,1,128,2,167,1,168,1,169,1,131,2,172,1,173,1,174,1,136,2,175,1,176,1,177,1,138,2,178,1,139,2,183,1,146,2,184,1,185,1,188,1,189,1,196,1,198,1,196,1,197,1,197,1,198,1,199,1,201,1,199,1,200,1,200,1,201,1,202,1,204,1,202,1,203,1,203,1,204,1,241,1,243,1,241,1,242,1,242,1,243,1,244,1,245,1,246,1,149,1,247,1,191,1,32,2,158,1,134,3,172,3,136,3,173,3,137,3,174,3,138,3,175,3,140,3,204,3,142,3,205,3,143,3,206,3,153,3,69,3,153,3,190,31,163,3,194,3,247,3,248,3,250,3,251,3,96,30,155,30,158,30,223,0,89,31,81,31,91,31,83,31,93,31,85,31,95,31,87,31,188,31,179,31,204,31,195,31,236,31,229,31,252,31,243,31,58,2,101,44,59,2,60,2,61,2,154,1,62,2,102,44,65,2,66,2,67,2,128,1,68,2,137,2,69,2,140,2,244,3,184,3,249,3,242,3,253,3,123,3,254,3,124,3,255,3,125,3,192,4,207,4,38,33,201,3,42,33,107,0,43,33,229,0,50,33,78,33,131,33,132,33,96,44,97,44,98,44,107,2,99,44,125,29,100,44,125,2,109,44,81,2,110,44,113,2,111,44,80,2,112,44,82,2,114,44,115,44,117,44,118,44,126,44,63,2,127,44,64,2,242,44,243,44,125,167,121,29,139,167,140,167,141,167,101,2,170,167,102,2,199,16,39,45,205,16,45,45,118,3,119,3,156,3,181,0,146,3,208,3,152,3,209,3,166,3,213,3,160,3,214,3,154,3,240,3,161,3,241,3,149,3,245,3,207,3,215,3,0,0,0,0,65,0,32,26,192,0,32,31,0,1,1,47,50,1,1,5,57,1,1,15,74,1,1,45,121,1,1,5,112,3,1,3,145,3,32,17,163,3,32,9,0,4,80,16,16,4,32,32,96,4,1,33,138,4,1,53,193,4,1,13,208,4,1,63,20,5,1,19,49,5,48,38,160,1,1,5,179,1,1,3,205,1,1,15,222,1,1,17,248,1,1,39,34,2,1,17,216,3,1,23,0,30,1,149,160,30,1,95,8,31,248,8,24,31,248,6,40,31,248,8,56,31,248,8,72,31,248,6,104,31,248,8,136,31,248,8,152,31,248,8,168,31,248,8,184,31,248,2,186,31,182,2,200,31,170,4,216,31,248,2,218,31,156,2,232,31,248,2,234,31,144,2,248,31,128,2,250,31,130,2,70,2,1,9,16,5,1,3,96,33,16,16,0,44,48,47,103,44,1,5,128,44,1,99,235,44,1,3,64,166,1,45,128,166,1,23,34,167,1,13,50,167,1,61,121,167,1,3,126,167,1,9,144,167,1,3,160,167,1,9,33,255,32,26,0,0,0,0,123,32,118,97,114,32,112,97,116,104,32,61,32,80,111,105,110,116,101,114,95,115,116,114,105,110,103,105,102,121,40,36,48,41,59,32,118,97,114,32,100,97,116,97,32,61,32,80,111,105,110,116,101,114,95,115,116,114,105,110,103,105,102,121,40,36,49,41,59,32,70,83,46,99,114,101,97,116,101,80,97,116,104,40,34,47,34,44,32,80,65,84,72,46,100,105,114,110,97,109,101,40,112,97,116,104,41,41,59,32,70,83,46,119,114,105,116,101,70,105,108,101,40,80,65,84,72,46,106,111,105,110,40,34,47,34,44,32,112,97,116,104,41,44,32,100,97,116,97,41,59,32,125,0,99,111,114,101,0,120,100,111,116,118,101,114,115,105,111,110,0,49,46,55,0,49,46,52,0,49,46,50,0,95,108,100,114,97,119,95,0,95,104,100,114,97,119,95,0,95,116,100,114,97,119,95,0,95,104,108,100,114,97,119,95,0,95,116,108,100,114,97,119,95,0,120,100,111,116,32,118,101,114,115,105,111,110,32,34,37,115,34,32,116,111,111,32,108,111,110,103,0,32,37,100,32,0,37,46,48,50,102,0,37,115,37,100,32,45,0,35,37,48,50,120,37,48,50,120,37,48,50,120,37,48,50,120,0,115,101,116,108,105,110,101,119,105,100,116,104,40,0,37,46,51,102,0,83,32,0,67,32,0,50,32,0,69,32,0,101,32,0,70,32,0,116,32,37,117,32,0,84,32,0,100,111,116,58,100,111,116,0,103,118,58,100,111,116,0,99,97,110,111,110,58,100,111,116,0,112,108,97,105,110,58,100,111,116,0,112,108,97,105,110,45,101,120,116,58,100,111,116,0,120,100,111,116,58,120,100,111,116,0,120,100,111,116,49,46,50,58,120,100,111,116,0,120,100,111,116,49,46,52,58,120,100,111,116,0,73,32,0,34,95,115,117,98,103,114,97,112,104,95,99,110,116,34,58,32,37,100,0,34,95,103,118,105,100,34,58,32,37,100,0,34,101,100,103,101,115,34,58,32,91,10,0,34,95,103,118,105,100,34,58,32,37,100,44,10,0,34,116,97,105,108,34,58,32,37,100,44,10,0,34,104,101,97,100,34,58,32,37,100,0,34,111,98,106,101,99,116,115,34,58,32,91,10,0,34,110,111,100,101,115,34,58,32,91,10,0,34,110,97,109,101,34,58,32,34,37,115,34,0,92,34,0,92,47,0,92,98,0,92,102,0,92,110,0,92,114,0,92,116,0,34,115,117,98,103,114,97,112,104,115,34,58,32,91,10,0,34,37,115,34,58,32,0,34,37,115,34,0,67,111,117,108,100,32,110,111,116,32,112,97,114,115,101,32,120,100,111,116,32,34,37,115,34,10,0,91,10,0,34,111,112,34,58,32,34,37,99,34,44,10,0,34,114,101,99,116,34,58,32,91,37,46,48,51,102,44,37,46,48,51,102,44,37,46,48,51,102,44,37,46,48,51,102,93,10,0,34,111,112,34,58,32,34,76,34,44,10,0,34,111,112,34,58,32,34,84,34,44,10,0,34,112,116,34,58,32,91,37,46,48,51,102,44,37,46,48,51,102,93,44,10,0,34,97,108,105,103,110,34,58,32,34,37,99,34,44,10,0,34,119,105,100,116,104,34,58,32,37,46,48,51,102,44,10,0,34,116,101,120,116,34,58,32,34,37,115,34,10,0,34,103,114,97,100,34,58,32,34,110,111,110,101,34,44,10,0,34,99,111,108,111,114,34,58,32,34,37,115,34,10,0,34,103,114,97,100,34,58,32,34,108,105,110,101,97,114,34,44,10,0,34,103,114,97,100,34,58,32,34,114,97,100,105,97,108,34,44,10,0,34,111,112,34,58,32,34,70,34,44,10,0,34,115,105,122,101,34,58,32,37,46,48,51,102,44,10,0,34,102,97,99,101,34,58,32,34,37,115,34,10,0,34,111,112,34,58,32,34,83,34,44,10,0,34,115,116,121,108,101,34,58,32,34,37,115,34,10,0,34,111,112,34,58,32,34,116,34,44,10,0,34,102,111,110,116,99,104,97,114,34,58,32,37,100,10,0,34,112,48,34,58,32,91,37,46,48,51,102,44,37,46,48,51,102,44,37,46,48,51,102,93,44,10,0,34,112,49,34,58,32,91,37,46,48,51,102,44,37,46,48,51,102,44,37,46,48,51,102,93,44,10,0,34,115,116,111,112,115,34,58,32,91,0,123,34,102,114,97,99,34,58,32,37,46,48,51,102,44,32,34,99,111,108,111,114,34,58,32,34,37,115,34,125,0,93,10,0,34,112,48,34,58,32,91,37,46,48,51,102,44,37,46,48,51,102,93,44,10,0,34,112,49,34,58,32,91,37,46,48,51,102,44,37,46,48,51,102,93,44,10,0,34,112,111,105,110,116,115,34,58,32,91,0,91,37,46,48,51,102,44,37,46,48,51,102,93,0,100,114,97,119,95,0,108,100,114,97,119,95,0,104,100,114,97,119,95,0,116,100,114,97,119,95,0,104,108,100,114,97,119,95,0,116,108,100,114,97,119,95,0,34,100,105,114,101,99,116,101,100,34,58,32,37,115,44,10,0,34,115,116,114,105,99,116,34,58,32,37,115,0,68,117,112,108,105,99,97,116,101,32,99,108,117,115,116,101,114,32,110,97,109,101,32,34,37,115,34,10,0,120,100,111,116,0,106,115,111,110,0,106,115,111,110,48,0,100,111,116,95,106,115,111,110,0,120,100,111,116,95,106,115,111,110,0,106,115,111,110,58,106,115,111,110,0,106,115,111,110,48,58,106,115,111,110,0,100,111,116,95,106,115,111,110,58,106,115,111,110,0,120,100,111,116,95,106,115,111,110,58,106,115,111,110,0,110,32,62,61,32,52,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,102,105,103,46,99,0,102,105,103,95,98,101,122,105,101,114,0,102,105,103,95,114,101,115,111,108,118,101,95,99,111,108,111,114,0,102,105,103,0,102,105,103,58,102,105,103,0,109,97,112,0,114,101,99,116,32,37,115,32,37,100,44,37,100,32,37,100,44,37,100,10,0,99,105,114,99,108,101,32,37,115,32,37,100,44,37,100,44,37,100,10,0,112,111,108,121,32,37,115,0,32,37,100,44,37,100,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,109,97,112,46,99,0,109,97,112,95,111,117,116,112,117,116,95,115,104,97,112,101,0,114,101,99,116,97,110,103,108,101,32,40,37,100,44,37,100,41,32,40,37,100,44,37,100,41,32,37,115,32,37,115,10,0,60,97,114,101,97,32,115,104,97,112,101,61,34,99,105,114,99,108,101,34,0,60,97,114,101,97,32,115,104,97,112,101,61,34,114,101,99,116,34,0,60,97,114,101,97,32,115,104,97,112,101,61,34,112,111,108,121,34,0,32,104,114,101,102,61,34,0,32,116,105,116,108,101,61,34,0,32,97,108,116,61,34,34,0,32,99,111,111,114,100,115,61,34,0,37,100,44,37,100,44,37,100,0,37,100,44,37,100,44,37,100,44,37,100,0,37,100,44,37,100,0,44,37,100,44,37,100,0,34,62,10,0,60,47,109,97,112,62,10,0,98,97,115,101,32,114,101,102,101,114,101,114,10,0,100,101,102,97,117,108,116,32,0,60,109,97,112,32,105,100,61,34,0,34,32,110,97,109,101,61,34,0,105,115,109,97,112,58,109,97,112,0,99,109,97,112,58,109,97,112,0,105,109,97,112,58,109,97,112,0,99,109,97,112,120,58,109,97,112,0,105,109,97,112,95,110,112,58,109,97,112,0,99,109,97,112,120,95,110,112,58,109,97,112,0,35,32,37,115,10,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,100,32,37,100,32,37,100,32,37,100,10,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,51,102,32,37,100,32,37,46,52,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,37,100,32,37,100,32,35,37,48,50,120,37,48,50,120,37,48,50,120,10,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,109,112,46,99,0,109,112,95,114,101,115,111,108,118,101,95,99,111,108,111,114,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,46,52,102,32,37,100,32,37,46,49,102,32,37,46,49,102,32,37,100,32,37,100,32,37,115,92,48,48,49,10,0,35,32,101,110,100,32,111,102,32,70,73,71,32,102,105,108,101,10,0,35,70,73,71,32,51,46,50,10,0,35,32,71,101,110,101,114,97,116,101,100,32,98,121,32,37,115,32,118,101,114,115,105,111,110,32,37,115,32,40,37,115,41,10,0,35,32,84,105,116,108,101,58,32,37,115,10,0,35,32,80,97,103,101,115,58,32,37,100,10,0,80,111,114,116,114,97,105,116,10,0,67,101,110,116,101,114,10,0,73,110,99,104,101,115,10,0,76,101,116,116,101,114,10,0,49,48,48,46,48,48,10,0,83,105,110,103,108,101,10,0,45,50,10,0,49,50,48,48,0,32,50,10,0,109,112,0,109,112,58,109,112,0,32,93,32,32,37,100,32,116,114,117,101,32,37,115,10,0,32,93,32,32,37,100,32,102,97,108,115,101,32,37,115,10,0,32,115,101,116,108,105,110,101,119,105,100,116,104,10,0,37,115,32,0,115,101,116,104,115,98,0,37,46,53,103,32,37,46,53,103,32,37,46,53,103,32,37,115,99,111,108,111,114,10,0,37,32,0,110,101,119,112,97,116,104,32,0,32,109,111,118,101,116,111,10,0,32,108,105,110,101,116,111,10,0,115,116,114,111,107,101,10,0,32,99,117,114,118,101,116,111,10,0,99,108,111,115,101,112,97,116,104,32,102,105,108,108,10,0,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,0,32,101,108,108,105,112,115,101,95,112,97,116,104,32,102,105,108,108,10,0,32,101,108,108,105,112,115,101,95,112,97,116,104,32,115,116,114,111,107,101,10,0,32,47,37,115,32,115,101,116,95,102,111,110,116,10,0,32,109,111,118,101,116,111,32,0,32,37,115,32,97,108,105,103,110,101,100,116,101,120,116,10,0,91,32,47,82,101,99,116,32,91,32,0,32,93,10,0,32,32,47,66,111,114,100,101,114,32,91,32,48,32,48,32,48,32,93,10,32,32,47,65,99,116,105,111,110,32,60,60,32,47,83,117,98,116,121,112,101,32,47,85,82,73,32,47,85,82,73,32,37,115,32,62,62,10,32,32,47,83,117,98,116,121,112,101,32,47,76,105,110,107,10,47,65,78,78,32,112,100,102,109,97,114,107,10,0,103,115,97,118,101,10,0,37,37,32,37,115,10,0,48,32,48,32,48,32,101,100,103,101,99,111,108,111,114,10,0,101,110,100,112,97,103,101,10,115,104,111,119,112,97,103,101,10,103,114,101,115,116,111,114,101,10,0,37,37,80,97,103,101,84,114,97,105,108,101,114,10,0,37,37,37,37,69,110,100,80,97,103,101,58,32,37,100,10,0,37,37,37,37,80,97,103,101,58,32,37,100,32,37,100,10,0,37,37,37,37,80,97,103,101,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,76,97,110,100,115,99,97,112,101,0,80,111,114,116,114,97,105,116,0,37,37,37,37,80,97,103,101,79,114,105,101,110,116,97,116,105,111,110,58,32,37,115,10,0,60,60,32,47,80,97,103,101,83,105,122,101,32,91,37,100,32,37,100,93,32,62,62,32,115,101,116,112,97,103,101,100,101,118,105,99,101,10,0,37,100,32,37,100,32,37,100,32,98,101,103,105,110,112,97,103,101,10,0,103,115,97,118,101,10,37,100,32,37,100,32,37,100,32,37,100,32,98,111,120,112,114,105,109,32,99,108,105,112,32,110,101,119,112,97,116,104,10,0,37,103,32,37,103,32,115,101,116,95,115,99,97,108,101,32,37,100,32,114,111,116,97,116,101,32,37,103,32,37,103,32,116,114,97,110,115,108,97,116,101,10,0,99,97,110,118,97,115,32,115,105,122,101,32,40,37,100,44,37,100,41,32,101,120,99,101,101,100,115,32,80,68,70,32,108,105,109,105,116,32,40,37,100,41,10,9,40,115,117,103,103,101,115,116,32,115,101,116,116,105,110,103,32,97,32,98,111,117,110,100,105,110,103,32,98,111,120,32,115,105,122,101,44,32,115,101,101,32,100,111,116,40,49,41,41,10,0,91,32,47,67,114,111,112,66,111,120,32,91,37,100,32,37,100,32,37,100,32,37,100,93,32,47,80,65,71,69,83,32,112,100,102,109,97,114,107,10,0,37,100,32,37,100,32,115,101,116,108,97,121,101,114,10,0,37,37,37,37,84,105,116,108,101,58,32,37,115,10,0,37,37,80,97,103,101,115,58,32,40,97,116,101,110,100,41,10,0,37,37,80,97,103,101,115,58,32,49,10,0,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,40,97,116,101,110,100,41,10,0,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,37,37,69,110,100,67,111,109,109,101,110,116,115,10,115,97,118,101,10,0,115,101,116,117,112,76,97,116,105,110,49,10,0,91,32,123,67,97,116,97,108,111,103,125,32,60,60,32,47,85,82,73,32,60,60,32,47,66,97,115,101,32,37,115,32,62,62,32,62,62,10,47,80,85,84,32,112,100,102,109,97,114,107,10,0,37,37,66,101,103,105,110,80,114,111,108,111,103,0,47,68,111,116,68,105,99,116,32,50,48,48,32,100,105,99,116,32,100,101,102,0,68,111,116,68,105,99,116,32,98,101,103,105,110,0,47,115,101,116,117,112,76,97,116,105,110,49,32,123,0,109,97,114,107,0,47,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,50,53,54,32,97,114,114,97,121,32,100,101,102,0,32,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,48,0,73,83,79,76,97,116,105,110,49,69,110,99,111,100,105,110,103,32,48,32,50,53,53,32,103,101,116,105,110,116,101,114,118,97,108,32,112,117,116,105,110,116,101,114,118,97,108,0,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,52,53,32,47,104,121,112,104,101,110,32,112,117,116,0,37,32,83,101,116,32,117,112,32,73,83,79,32,76,97,116,105,110,32,49,32,99,104,97,114,97,99,116,101,114,32,101,110,99,111,100,105,110,103,0,47,115,116,97,114,110,101,116,73,83,79,32,123,0,32,32,32,32,32,32,32,32,100,117,112,32,100,117,112,32,102,105,110,100,102,111,110,116,32,100,117,112,32,108,101,110,103,116,104,32,100,105,99,116,32,98,101,103,105,110,0,32,32,32,32,32,32,32,32,123,32,49,32,105,110,100,101,120,32,47,70,73,68,32,110,101,32,123,32,100,101,102,32,125,123,32,112,111,112,32,112,111,112,32,125,32,105,102,101,108,115,101,0,32,32,32,32,32,32,32,32,125,32,102,111,114,97,108,108,0,32,32,32,32,32,32,32,32,47,69,110,99,111,100,105,110,103,32,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,100,101,102,0,32,32,32,32,32,32,32,32,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,32,100,101,102,105,110,101,102,111,110,116,0,125,32,100,101,102,0,47,84,105,109,101,115,45,82,111,109,97,110,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,84,105,109,101,115,45,73,116,97,108,105,99,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,84,105,109,101,115,45,66,111,108,100,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,84,105,109,101,115,45,66,111,108,100,73,116,97,108,105,99,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,72,101,108,118,101,116,105,99,97,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,72,101,108,118,101,116,105,99,97,45,79,98,108,105,113,117,101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,72,101,108,118,101,116,105,99,97,45,66,111,108,100,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,72,101,108,118,101,116,105,99,97,45,66,111,108,100,79,98,108,105,113,117,101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,67,111,117,114,105,101,114,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,67,111,117,114,105,101,114,45,79,98,108,105,113,117,101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,67,111,117,114,105,101,114,45,66,111,108,100,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,67,111,117,114,105,101,114,45,66,111,108,100,79,98,108,105,113,117,101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,99,108,101,97,114,116,111,109,97,114,107,0,125,32,98,105,110,100,32,100,101,102,0,37,37,66,101,103,105,110,82,101,115,111,117,114,99,101,58,32,112,114,111,99,115,101,116,32,103,114,97,112,104,118,105,122,32,48,32,48,0,47,99,111,111,114,100,45,102,111,110,116,45,102,97,109,105,108,121,32,47,84,105,109,101,115,45,82,111,109,97,110,32,100,101,102,0,47,100,101,102,97,117,108,116,45,102,111,110,116,45,102,97,109,105,108,121,32,47,84,105,109,101,115,45,82,111,109,97,110,32,100,101,102,0,47,99,111,111,114,100,102,111,110,116,32,99,111,111,114,100,45,102,111,110,116,45,102,97,109,105,108,121,32,102,105,110,100,102,111,110,116,32,56,32,115,99,97,108,101,102,111,110,116,32,100,101,102,0,47,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,49,46,48,32,100,101,102,0,47,115,101,116,95,115,99,97,108,101,32,123,0,32,32,32,32,32,32,32,100,117,112,32,49,32,101,120,99,104,32,100,105,118,32,47,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,101,120,99,104,32,100,101,102,0,32,32,32,32,32,32,32,115,99,97,108,101,0,37,32,115,116,121,108,101,115,0,47,115,111,108,105,100,32,123,32,91,93,32,48,32,115,101,116,100,97,115,104,32,125,32,98,105,110,100,32,100,101,102,0,47,100,97,115,104,101,100,32,123,32,91,57,32,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,109,117,108,32,100,117,112,32,93,32,48,32,115,101,116,100,97,115,104,32,125,32,98,105,110,100,32,100,101,102,0,47,100,111,116,116,101,100,32,123,32,91,49,32,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,109,117,108,32,54,32,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,109,117,108,93,32,48,32,115,101,116,100,97,115,104,32,125,32,98,105,110,100,32,100,101,102,0,47,105,110,118,105,115,32,123,47,102,105,108,108,32,123,110,101,119,112,97,116,104,125,32,100,101,102,32,47,115,116,114,111,107,101,32,123,110,101,119,112,97,116,104,125,32,100,101,102,32,47,115,104,111,119,32,123,112,111,112,32,110,101,119,112,97,116,104,125,32,100,101,102,125,32,98,105,110,100,32,100,101,102,0,47,98,111,108,100,32,123,32,50,32,115,101,116,108,105,110,101,119,105,100,116,104,32,125,32,98,105,110,100,32,100,101,102,0,47,102,105,108,108,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,47,117,110,102,105,108,108,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,47,114,111,117,110,100,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,47,100,105,97,103,111,110,97,108,115,32,123,32,125,32,98,105,110,100,32,100,101,102,0,47,116,97,112,101,114,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,37,32,104,111,111,107,115,32,102,111,114,32,115,101,116,116,105,110,103,32,99,111,108,111,114,32,0,47,110,111,100,101,99,111,108,111,114,32,123,32,115,101,116,104,115,98,99,111,108,111,114,32,125,32,98,105,110,100,32,100,101,102,0,47,101,100,103,101,99,111,108,111,114,32,123,32,115,101,116,104,115,98,99,111,108,111,114,32,125,32,98,105,110,100,32,100,101,102,0,47,103,114,97,112,104,99,111,108,111,114,32,123,32,115,101,116,104,115,98,99,111,108,111,114,32,125,32,98,105,110,100,32,100,101,102,0,47,110,111,112,99,111,108,111,114,32,123,112,111,112,32,112,111,112,32,112],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+61464);allocate([111,112,125,32,98,105,110,100,32,100,101,102,0,47,98,101,103,105,110,112,97,103,101,32,123,9,37,32,105,32,106,32,110,112,97,103,101,115,0,9,47,110,112,97,103,101,115,32,101,120,99,104,32,100,101,102,0,9,47,106,32,101,120,99,104,32,100,101,102,0,9,47,105,32,101,120,99,104,32,100,101,102,0,9,47,115,116,114,32,49,48,32,115,116,114,105,110,103,32,100,101,102,0,9,110,112,97,103,101,115,32,49,32,103,116,32,123,0,9,9,103,115,97,118,101,0,9,9,9,99,111,111,114,100,102,111,110,116,32,115,101,116,102,111,110,116,0,9,9,9,48,32,48,32,109,111,118,101,116,111,0,9,9,9,40,92,40,41,32,115,104,111,119,32,105,32,115,116,114,32,99,118,115,32,115,104,111,119,32,40,44,41,32,115,104,111,119,32,106,32,115,116,114,32,99,118,115,32,115,104,111,119,32,40,92,41,41,32,115,104,111,119,0,9,9,103,114,101,115,116,111,114,101,0,9,125,32,105,102,0,47,115,101,116,95,102,111,110,116,32,123,0,9,102,105,110,100,102,111,110,116,32,101,120,99,104,0,9,115,99,97,108,101,102,111,110,116,32,115,101,116,102,111,110,116,0,37,32,100,114,97,119,32,116,101,120,116,32,102,105,116,116,101,100,32,116,111,32,105,116,115,32,101,120,112,101,99,116,101,100,32,119,105,100,116,104,0,47,97,108,105,103,110,101,100,116,101,120,116,32,123,9,9,9,37,32,119,105,100,116,104,32,116,101,120,116,0,9,47,116,101,120,116,32,101,120,99,104,32,100,101,102,0,9,47,119,105,100,116,104,32,101,120,99,104,32,100,101,102,0,9,103,115,97,118,101,0,9,9,119,105,100,116,104,32,48,32,103,116,32,123,0,9,9,9,91,93,32,48,32,115,101,116,100,97,115,104,0,9,9,9,116,101,120,116,32,115,116,114,105,110,103,119,105,100,116,104,32,112,111,112,32,119,105,100,116,104,32,101,120,99,104,32,115,117,98,32,116,101,120,116,32,108,101,110,103,116,104,32,100,105,118,32,48,32,116,101,120,116,32,97,115,104,111,119,0,9,9,125,32,105,102,0,9,103,114,101,115,116,111,114,101,0,47,98,111,120,112,114,105,109,32,123,9,9,9,9,37,32,120,99,111,114,110,101,114,32,121,99,111,114,110,101,114,32,120,115,105,122,101,32,121,115,105,122,101,0,9,9,52,32,50,32,114,111,108,108,0,9,9,109,111,118,101,116,111,0,9,9,50,32,99,111,112,121,0,9,9,101,120,99,104,32,48,32,114,108,105,110,101,116,111,0,9,9,48,32,101,120,99,104,32,114,108,105,110,101,116,111,0,9,9,112,111,112,32,110,101,103,32,48,32,114,108,105,110,101,116,111,0,9,9,99,108,111,115,101,112,97,116,104,0,47,101,108,108,105,112,115,101,95,112,97,116,104,32,123,0,9,47,114,121,32,101,120,99,104,32,100,101,102,0,9,47,114,120,32,101,120,99,104,32,100,101,102,0,9,47,121,32,101,120,99,104,32,100,101,102,0,9,47,120,32,101,120,99,104,32,100,101,102,0,9,109,97,116,114,105,120,32,99,117,114,114,101,110,116,109,97,116,114,105,120,0,9,110,101,119,112,97,116,104,0,9,120,32,121,32,116,114,97,110,115,108,97,116,101,0,9,114,120,32,114,121,32,115,99,97,108,101,0,9,48,32,48,32,49,32,48,32,51,54,48,32,97,114,99,0,9,115,101,116,109,97,116,114,105,120,0,47,101,110,100,112,97,103,101,32,123,32,115,104,111,119,112,97,103,101,32,125,32,98,105,110,100,32,100,101,102,0,47,115,104,111,119,112,97,103,101,32,123,32,125,32,100,101,102,0,47,108,97,121,101,114,99,111,108,111,114,115,101,113,0,9,91,9,37,32,108,97,121,101,114,32,99,111,108,111,114,32,115,101,113,117,101,110,99,101,32,45,32,100,97,114,107,101,115,116,32,116,111,32,108,105,103,104,116,101,115,116,0,9,9,91,48,32,48,32,48,93,0,9,9,91,46,50,32,46,56,32,46,56,93,0,9,9,91,46,52,32,46,56,32,46,56,93,0,9,9,91,46,54,32,46,56,32,46,56,93,0,9,9,91,46,56,32,46,56,32,46,56,93,0,9,93,0,100,101,102,0,47,108,97,121,101,114,108,101,110,32,108,97,121,101,114,99,111,108,111,114,115,101,113,32,108,101,110,103,116,104,32,100,101,102,0,47,115,101,116,108,97,121,101,114,32,123,47,109,97,120,108,97,121,101,114,32,101,120,99,104,32,100,101,102,32,47,99,117,114,108,97,121,101,114,32,101,120,99,104,32,100,101,102,0,9,108,97,121,101,114,99,111,108,111,114,115,101,113,32,99,117,114,108,97,121,101,114,32,49,32,115,117,98,32,108,97,121,101,114,108,101,110,32,109,111,100,32,103,101,116,0,9,97,108,111,97,100,32,112,111,112,32,115,101,116,104,115,98,99,111,108,111,114,0,9,47,110,111,100,101,99,111,108,111,114,32,123,110,111,112,99,111,108,111,114,125,32,100,101,102,0,9,47,101,100,103,101,99,111,108,111,114,32,123,110,111,112,99,111,108,111,114,125,32,100,101,102,0,9,47,103,114,97,112,104,99,111,108,111,114,32,123,110,111,112,99,111,108,111,114,125,32,100,101,102,0,47,111,110,108,97,121,101,114,32,123,32,99,117,114,108,97,121,101,114,32,110,101,32,123,105,110,118,105,115,125,32,105,102,32,125,32,100,101,102,0,47,111,110,108,97,121,101,114,115,32,123,0,9,47,109,121,117,112,112,101,114,32,101,120,99,104,32,100,101,102,0,9,47,109,121,108,111,119,101,114,32,101,120,99,104,32,100,101,102,0,9,99,117,114,108,97,121,101,114,32,109,121,108,111,119,101,114,32,108,116,0,9,99,117,114,108,97,121,101,114,32,109,121,117,112,112,101,114,32,103,116,0,9,111,114,0,9,123,105,110,118,105,115,125,32,105,102,0,47,99,117,114,108,97,121,101,114,32,48,32,100,101,102,0,37,37,69,110,100,82,101,115,111,117,114,99,101,0,37,37,69,110,100,80,114,111,108,111,103,0,37,37,66,101,103,105,110,83,101,116,117,112,0,49,52,32,100,101,102,97,117,108,116,45,102,111,110,116,45,102,97,109,105,108,121,32,115,101,116,95,102,111,110,116,0,37,32,47,97,114,114,111,119,108,101,110,103,116,104,32,49,48,32,100,101,102,0,37,32,47,97,114,114,111,119,119,105,100,116,104,32,53,32,100,101,102,0,37,32,109,97,107,101,32,115,117,114,101,32,112,100,102,109,97,114,107,32,105,115,32,104,97,114,109,108,101,115,115,32,102,111,114,32,80,83,45,105,110,116,101,114,112,114,101,116,101,114,115,32,111,116,104,101,114,32,116,104,97,110,32,68,105,115,116,105,108,108,101,114,0,47,112,100,102,109,97,114,107,32,119,104,101,114,101,32,123,112,111,112,125,32,123,117,115,101,114,100,105,99,116,32,47,112,100,102,109,97,114,107,32,47,99,108,101,97,114,116,111,109,97,114,107,32,108,111,97,100,32,112,117,116,125,32,105,102,101,108,115,101,0,37,32,109,97,107,101,32,39,60,60,39,32,97,110,100,32,39,62,62,39,32,115,97,102,101,32,111,110,32,80,83,32,76,101,118,101,108,32,49,32,100,101,118,105,99,101,115,0,47,108,97,110,103,117,97,103,101,108,101,118,101,108,32,119,104,101,114,101,32,123,112,111,112,32,108,97,110,103,117,97,103,101,108,101,118,101,108,125,123,49,125,32,105,102,101,108,115,101,0,50,32,108,116,32,123,0,32,32,32,32,117,115,101,114,100,105,99,116,32,40,60,60,41,32,99,118,110,32,40,91,41,32,99,118,110,32,108,111,97,100,32,112,117,116,0,32,32,32,32,117,115,101,114,100,105,99,116,32,40,62,62,41,32,99,118,110,32,40,91,41,32,99,118,110,32,108,111,97,100,32,112,117,116,0,125,32,105,102,0,37,37,69,110,100,83,101,116,117,112,0,37,37,84,114,97,105,108,101,114,10,0,37,37,37,37,80,97,103,101,115,58,32,37,100,10,0,101,110,100,10,114,101,115,116,111,114,101,10,0,37,37,69,79,70,10,0,37,33,80,83,45,65,100,111,98,101,45,51,46,48,0,32,69,80,83,70,45,51,46,48,10,0,37,37,37,37,67,114,101,97,116,111,114,58,32,37,115,32,118,101,114,115,105,111,110,32,37,115,32,40,37,115,41,10,0,112,115,50,58,112,115,0,60,33,45,45,32,0,60,112,111,108,121,108,105,110,101,0,32,112,111,105,110,116,115,61,34,0,34,47,62,10,0,32,102,105,108,108,61,34,0,117,114,108,40,35,108,95,37,100,41,0,117,114,108,40,35,114,95,37,100,41,0,34,32,102,105,108,108,45,111,112,97,99,105,116,121,61,34,37,102,0,34,32,115,116,114,111,107,101,61,34,0,34,32,115,116,114,111,107,101,45,119,105,100,116,104,61,34,0,34,32,115,116,114,111,107,101,45,100,97,115,104,97,114,114,97,121,61,34,37,115,0,53,44,50,0,49,44,53,0,34,32,115,116,114,111,107,101,45,111,112,97,99,105,116,121,61,34,37,102,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,115,118,103,46,99,0,115,118,103,95,112,114,105,110,116,95,99,111,108,111,114,0,60,112,97,116,104,0,32,105,100,61,34,0,95,112,34,32,0,32,100,61,34,0,37,99,0,60,100,101,102,115,62,10,60,114,97,100,105,97,108,71,114,97,100,105,101,110,116,32,105,100,61,34,114,95,37,100,34,32,99,120,61,34,53,48,37,37,34,32,99,121,61,34,53,48,37,37,34,32,114,61,34,55,53,37,37,34,32,102,120,61,34,37,100,37,37,34,32,102,121,61,34,37,100,37,37,34,62,10,0,60,115,116,111,112,32,111,102,102,115,101,116,61,34,48,34,32,115,116,121,108,101,61,34,115,116,111,112,45,99,111,108,111,114,58,0,59,115,116,111,112,45,111,112,97,99,105,116,121,58,0,49,46,0,59,34,47,62,10,0,60,115,116,111,112,32,111,102,102,115,101,116,61,34,49,34,32,115,116,121,108,101,61,34,115,116,111,112,45,99,111,108,111,114,58,0,59,34,47,62,10,60,47,114,97,100,105,97,108,71,114,97,100,105,101,110,116,62,10,60,47,100,101,102,115,62,10,0,60,100,101,102,115,62,10,60,108,105,110,101,97,114,71,114,97,100,105,101,110,116,32,105,100,61,34,108,95,37,100,34,32,103,114,97,100,105,101,110,116,85,110,105,116,115,61,34,117,115,101,114,83,112,97,99,101,79,110,85,115,101,34,32,0,120,49,61,34,0,34,32,121,49,61,34,0,34,32,120,50,61,34,0,34,32,121,50,61,34,0,34,32,62,10,0,60,115,116,111,112,32,111,102,102,115,101,116,61,34,37,46,48,51,102,34,32,115,116,121,108,101,61,34,115,116,111,112,45,99,111,108,111,114,58,0,59,34,47,62,10,60,47,108,105,110,101,97,114,71,114,97,100,105,101,110,116,62,10,60,47,100,101,102,115,62,10,0,60,112,111,108,121,103,111,110,0,60,101,108,108,105,112,115,101,0,32,99,120,61,34,0,34,32,99,121,61,34,0,34,32,114,120,61,34,0,34,32,114,121,61,34,0,60,116,101,120,116,0,32,116,101,120,116,45,97,110,99,104,111,114,61,34,115,116,97,114,116,34,0,32,116,101,120,116,45,97,110,99,104,111,114,61,34,101,110,100,34,0,32,116,101,120,116,45,97,110,99,104,111,114,61,34,109,105,100,100,108,101,34,0,32,120,61,34,0,34,32,121,61,34,0,32,102,111,110,116,45,102,97,109,105,108,121,61,34,37,115,0,44,37,115,0,32,102,111,110,116,45,119,101,105,103,104,116,61,34,37,115,34,0,32,102,111,110,116,45,115,116,114,101,116,99,104,61,34,37,115,34,0,32,102,111,110,116,45,115,116,121,108,101,61,34,37,115,34,0,32,102,111,110,116,45,102,97,109,105,108,121,61,34,37,115,34,0,32,102,111,110,116,45,119,101,105,103,104,116,61,34,98,111,108,100,34,0,32,102,111,110,116,45,115,116,121,108,101,61,34,105,116,97,108,105,99,34,0,32,116,101,120,116,45,100,101,99,111,114,97,116,105,111,110,61,34,0,37,115,111,118,101,114,108,105,110,101,0,37,115,108,105,110,101,45,116,104,114,111,117,103,104,0,32,98,97,115,101,108,105,110,101,45,115,104,105,102,116,61,34,115,117,112,101,114,34,0,32,98,97,115,101,108,105,110,101,45,115,104,105,102,116,61,34,115,117,98,34,0,32,102,111,110,116,45,115,105,122,101,61,34,37,46,50,102,34,0,32,102,105,108,108,61,34,37,115,34,0,32,102,105,108,108,61,34,35,37,48,50,120,37,48,50,120,37,48,50,120,34,0,115,118,103,95,116,101,120,116,115,112,97,110,0,62,0,60,116,101,120,116,80,97,116,104,32,120,108,105,110,107,58,104,114,101,102,61,34,35,37,115,95,112,34,32,115,116,97,114,116,79,102,102,115,101,116,61,34,53,48,37,37,34,62,0,60,116,115,112,97,110,32,120,61,34,48,34,32,100,121,61,34,0,34,62,0,60,47,116,115,112,97,110,62,60,47,116,101,120,116,80,97,116,104,62,0,60,47,116,101,120,116,62,10,0,60,47,103,62,10,0,60,103,0,32,105,100,61,34,97,95,0,32,120,108,105,110,107,58,104,114,101,102,61,34,0,32,120,108,105,110,107,58,116,105,116,108,101,61,34,0,32,116,97,114,103,101,116,61,34,0,60,116,105,116,108,101,62,0,60,47,116,105,116,108,101,62,10,0,60,103,32,105,100,61,34,0,95,37,115,0,34,32,99,108,97,115,115,61,34,37,115,0,99,108,97,115,115,0,32,116,114,97,110,115,102,111,114,109,61,34,115,99,97,108,101,40,0,41,32,114,111,116,97,116,101,40,37,100,41,32,116,114,97,110,115,108,97,116,101,40,0,41,34,62,10,0,60,47,115,118,103,62,10,0,60,33,45,45,0,32,80,97,103,101,115,58,32,37,100,32,45,45,62,10,0,60,115,118,103,32,119,105,100,116,104,61,34,37,100,112,116,34,32,104,101,105,103,104,116,61,34,37,100,112,116,34,10,0,32,118,105,101,119,66,111,120,61,34,37,46,50,102,32,37,46,50,102,32,37,46,50,102,32,37,46,50,102,34,0,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,50,48,48,48,47,115,118,103,34,0,32,120,109,108,110,115,58,120,108,105,110,107,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,49,57,57,57,47,120,108,105,110,107,34,0,60,63,120,109,108,32,118,101,114,115,105,111,110,61,34,49,46,48,34,32,101,110,99,111,100,105,110,103,61,34,85,84,70,45,56,34,32,115,116,97,110,100,97,108,111,110,101,61,34,110,111,34,63,62,10,0,115,116,121,108,101,115,104,101,101,116,0,60,63,120,109,108,45,115,116,121,108,101,115,104,101,101,116,32,104,114,101,102,61,34,0,34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,63,62,10,0,60,33,68,79,67,84,89,80,69,32,115,118,103,32,80,85,66,76,73,67,32,34,45,47,47,87,51,67,47,47,68,84,68,32,83,86,71,32,49,46,49,47,47,69,78,34,10,0,32,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,71,114,97,112,104,105,99,115,47,83,86,71,47,49,46,49,47,68,84,68,47,115,118,103,49,49,46,100,116,100,34,62,10,0,60,33,45,45,32,71,101,110,101,114,97,116,101,100,32,98,121,32,0,100,97,114,107,98,108,117,101,0,100,97,114,107,99,121,97,110,0,100,97,114,107,103,114,97,121,0,100,97,114,107,103,114,101,121,0,100,97,114,107,109,97,103,101,110,116,97,0,100,97,114,107,114,101,100,0,108,105,103,104,116,103,114,101,101,110,0,35,32,0,32,99,114,101,97,116,101,32,108,105,110,101,32,0,32,45,102,105,108,108,32,0,32,45,100,97,115,104,32,53,0,32,45,100,97,115,104,32,50,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,116,107,46,99,0,116,107,103,101,110,95,112,114,105,110,116,95,116,97,103,115,0,103,114,97,112,104,32,108,97,98,101,108,0,32,45,116,97,103,115,32,123,37,100,37,115,37,112,125,0,116,107,103,101,110,95,112,114,105,110,116,95,99,111,108,111,114,0,36,99,0,32,45,119,105,100,116,104,32,0,32,45,115,109,111,111,116,104,32,98,101,122,105,101,114,32,0,32,99,114,101,97,116,101,32,112,111,108,121,103,111,110,32,0,32,45,111,117,116,108,105,110,101,32,0,32,99,114,101,97,116,101,32,111,118,97,108,32,0,32,99,114,101,97,116,101,32,116,101,120,116,32,0,32,45,116,101,120,116,32,123,0,125,0,32,45,102,111,110,116,32,123,0,32,37,100,125,0,32,45,97,110,99,104,111,114,32,119,0,32,45,97,110,99,104,111,114,32,101,0,35,0,32,84,105,116,108,101,58,32,0,32,80,97,103,101,115,58,32,37,100,10,0,35,32,71,101,110,101,114,97,116,101,100,32,98,121,32,0,41,10,0,116,107,0,116,107,58,116,107,0,32,32,32,32,32,32,60,33,45,45,32,0,32,45,45,62,10,0,69,114,114,111,114,32,100,117,114,105,110,103,32,99,111,110,118,101,114,115,105,111,110,32,116,111,32,34,85,84,70,45,56,34,46,32,32,81,117,105,116,105,110,103,46,10,0,32,60,118,58,115,104,97,112,101,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,0,32,119,105,100,116,104,58,32,37,100,59,32,104,101,105,103,104,116,58,32,37,100,34,32,102,105,108,108,101,100,61,34,102,97,108,115,101,34,62,0,60,118,58,112,97,116,104,32,118,61,34,0,32,109,32,0,37,46,48,102,44,37,46,48,102,32,0,32,108,32,0,32,101,32,0,34,47,62,0,60,47,118,58,115,104,97,112,101,62,10,0,60,118,58,115,116,114,111,107,101,32,99,111,108,111,114,61,34,0,34,32,119,101,105,103,104,116,61,34,37,46,48,102,112,116,0,34,32,100,97,115,104,115,116,121,108,101,61,34,100,97,115,104,0,34,32,100,97,115,104,115,116,121,108,101,61,34,100,111,116,0,34,32,47,62,0,35,37,48,50,120,37,48,50,120,37,48,50,120,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,118,109,108,46,99,0,118,109,108,95,112,114,105,110,116,95,99,111,108,111,114,0,32,119,105,100,116,104,58,32,37,100,59,32,104,101,105,103,104,116,58,32,37,100,34,0,32,62,0,60,118,58,112,97,116,104,32,32,118,61,34,0,47,62,60,47,118,58,115,104,97,112,101,62,10,0,109,32,0,37,115,37,46,48,102,44,37,46,48,102,32,0,99,32,0,32,102,105,108,108,101,100,61,34,116,114,117,101,34,32,102,105,108,108,99,111,108,111,114,61,34,0,34,32,0,32,102,105,108,108,101,100,61,34,102,97,108,115,101,34,32,0,37,46,48,102,32,37,46,48,102,32,0,108,32,0,120,32,101,32,34,47,62,0,32,32,60,118,58,111,118,97,108,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,0,32,108,101,102,116,58,32,37,46,50,102,59,32,116,111,112,58,32,37,46,50,102,59,0,32,119,105,100,116,104,58,32,37,46,50,102,59,32,104,101,105,103,104,116,58,32,37,46,50,102,34,0,60,47,118,58,111,118,97,108,62,10,0,60,118,58,114,101,99,116,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,0,32,115,116,114,111,107,101,100,61,34,102,97,108,115,101,34,32,102,105,108,108,101,100,61,34,102,97,108,115,101,34,62,10,0,60,118,58,116,101,120,116,98,111,120,32,105,110,115,101,116,61,34,48,44,48,44,48,44,48,34,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,118,45,116,101,120,116,45,119,114,97,112,112,105,110,103,58,39,102,97,108,115,101,39,59,112,97,100,100,105,110,103,58,39,48,39,59,0,102,111,110,116,45,102,97,109,105,108,121,58,32,39,37,115,39,59,0,102,111,110,116,45,119,101,105,103,104,116,58,32,37,115,59,0,102,111,110,116,45,115,116,114,101,116,99,104,58,32,37,115,59,0,102,111,110,116,45,115,116,121,108,101,58,32,37,115,59,0,32,102,111,110,116,45,115,105,122,101,58,32,37,46,50,102,112,116,59,0,99,111,108,111,114,58,37,115,59,0,99,111,108,111,114,58,35,37,48,50,120,37,48,50,120,37,48,50,120,59,0,118,109,108,95,116,101,120,116,115,112,97,110,0,34,62,60,99,101,110,116,101,114,62,0,60,47,99,101,110,116,101,114,62,60,47,118,58,116,101,120,116,98,111,120,62,10,0,60,47,118,58,114,101,99,116,62,10,0,60,47,97,62,10,0,60,97,0,32,104,114,101,102,61,34,37,115,34,0,32,116,105,116,108,101,61,34,37,115,34,0,32,116,97,114,103,101,116,61,34,37,115,34,0,62,10,0,60,47,118,58,103,114,111,117,112,62,10,0,60,47,68,73,86,62,10,0,60,68,73,86,32,105,100,61,39,95,86,77,76,50,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,118,105,115,105,98,105,108,105,116,121,58,104,105,100,100,101,110,34,62,10,0,60,33,45,45,32,105,110,115,101,114,116,32,97,110,121,32,111,116,104,101,114,32,104,116,109,108,32,99,111,110,116,101,110,116,32,104,101,114,101,32,45,45,62,10,0,60,68,73,86,32,105,100,61,39,95,110,111,116,86,77,76,49,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,34,62,10,0,60,33,45,45,32,116,104,105,115,32,115,104,111,117,108,100,32,111,110,108,121,32,100,105,115,112,108,97,121,32,111,110,32,78,79,78,45,73,69,32,98,114,111,119,115,101,114,115,32,45,45,62,10,0,60,72,50,62,83,111,114,114,121,44,32,116,104,105,115,32,100,105,97,103,114,97,109,32,119,105,108,108,32,111,110,108,121,32,100,105,115,112,108,97,121,32,99,111,114,114,101,99,116,108,121,32,111,110,32,73,110,116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,32,53,32,40,97,110,100,32,117,112,41,32,98,114,111,119,115,101,114,115,46,60,47,72,50,62,10,0,60,68,73,86,32,105,100,61,39,95,110,111,116,86,77,76,50,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,34,62,10,0,60,33,45,45,32,105,110,115,101,114,116,32,97,110,121,32,111,116,104,101,114,32,78,79,78,45,73,69,32,104,116,109,108,32,99,111,110,116,101,110,116,32,104,101,114,101,32,45,45,62,10,0,60,47,66,79,68,89,62,10,60,47,72,84,77,76,62,10,0,60,72,69,65,68,62,0,60,77,69,84,65,32,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101,110,116,45,84,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,104,116,109,108,59,32,99,104,97,114,115,101,116,61,85,84,70,45,56,34,62,10,0,60,84,73,84,76,69,62,0,60,47,84,73,84,76,69,62,0,60,33,45,45,32,80,97,103,101,115,58,32,37,100,32,45,45,62,10,0,32,32,32,60,83,67,82,73,80,84,32,76,65,78,71,85,65,71,69,61,39,74,97,118,97,115,99,114,105,112,116,39,62,10,0,32,32,32,102,117,110,99,116,105,111,110,32,98,114,111,119,115,101,114,99,104,101,99,107,40,41,10,0,32,32,32,123,10,0,32,32,32,32,32,32,118,97,114,32,117,97,32,61,32,119,105,110,100,111,119,46,110,97,118,105,103,97,116,111,114,46,117,115,101,114,65,103,101,110,116,10,0,32,32,32,32,32,32,118,97,114,32,109,115,105,101,32,61,32,117,97,46,105,110,100,101,120,79,102,32,40,32,39,77,83,73,69,32,39,32,41,10,0,32,32,32,32,32,32,118,97,114,32,105,101,118,101,114,115,59,10,0,32,32,32,32,32,32,118,97,114,32,105,116,101,109,59,10,0,32,32,32,32,32,32,118,97,114,32,86,77,76,121,101,115,61,110,101,119,32,65,114,114,97,121,40,39,95,86,77,76,49,95,39,44,39,95,86,77,76,50,95,39,41,59,10,0,32,32,32,32,32,32,118,97,114,32,86,77,76,110,111,61,110,101,119,32,65,114,114,97,121,40,39,95,110,111,116,86,77,76,49,95,39,44,39,95,110,111,116,86,77,76,50,95,39,41,59,10,0,32,32,32,32,32,32,105,102,32,40,32,109,115,105,101,32,62,32,48,32,41,123,32,32,32,32,32,32,47,47,32,73,102,32,73,110,116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,44,32,114,101,116,117,114,110,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,10,0,32,32,32,32,32,32,32,32,32,105,101,118,101,114,115,61,32,112,97,114,115,101,73,110,116,32,40,117,97,46,115,117,98,115,116,114,105,110,103,32,40,109,115,105,101,43,53,44,32,117,97,46,105,110,100,101,120,79,102,32,40,39,46,39,44,32,109,115,105,101,32,41,41,41,10,0,32,32,32,32,32,32,125,10,0,32,32,32,32,32,32,105,102,32,40,105,101,118,101,114,115,62,61,53,41,123,10,0,32,32,32,32,32,32,32,102,111,114,32,40,120,32,105,110,32,86,77,76,121,101,115,41,123,10,0,32,32,32,32,32,32,32,32,32,105,116,101,109,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,86,77,76,121,101,115,91,120,93,41,59,10,0,32,32,32,32,32,32,32,32,32,105,102,32,40,105,116,101,109,41,32,123,10,0,32,32,32,32,32,32,32,32,32,32,32,105,116,101,109,46,115,116,121,108,101,46,118,105,115,105,98,105,108,105,116,121,61,39,118,105,115,105,98,108,101,39,59,10,0,32,32,32,32,32,32,32,32,32,125,10,0,32,32,32,32,32,32,32,125,10,0,32,32,32,32,32,32,32,102,111,114,32,40,120,32,105,110,32,86,77,76,110,111,41,123,10,0,32,32,32,32,32,32,32,32,32,105,116,101,109,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,86,77,76,110,111,91,120,93,41,59,10,0,32,32,32,32,32,32,32,32,32,32,32,105,116,101,109,46,115,116,121,108,101,46,118,105,115,105,98,105,108,105,116,121,61,39,104,105,100,100,101,110,39,59,10,0,32,32,32,32,32,125,101,108,115,101,123,10,0,32,32,32,32,32,125,10,0,32,32,32,125,10,0,32,32,32,60,47,83,67,82,73,80,84,62,10,0,60,47,72,69,65,68,62,0,60,66,79,68,89,32,111,110,108,111,97,100,61,39,98,114,111,119,115,101,114,99,104,101,99,107,40,41,59,39,62,10,0,60,68,73,86,32,105,100,61,39,95,86,77,76,49,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,32,100,105,115,112,108,97,121,58,105,110,108,105,110,101,59,32,118,105,115,105,98,105,108,105,116,121,58,104,105,100,100,101,110,0,32,119,105,100,116,104,58,32,37,100,112,116,59,32,104,101,105,103,104,116,58,32,37,100,112,116,34,62,10,0,60,83,84,89,76,69,62,10,0,118,92,58,42,32,123,32,98,101,104,97,118,105,111,114,58,32,117,114,108,40,35,100,101,102,97,117,108,116,35,86,77,76,41,59,100,105,115,112,108,97,121,58,105,110,108,105,110,101,45,98,108,111,99,107,125,10,0,60,47,83,84,89,76,69,62,10,0,60,120,109,108,58,110,97,109,101,115,112,97,99,101,32,110,115,61,34,117,114,110,58,115,99,104,101,109,97,115,45,109,105,99,114,111,115,111,102,116,45,99,111,109,58,118,109,108,34,32,112,114,101,102,105,120,61,34,118,34,32,47,62,10,0,32,60,118,58,103,114,111,117,112,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,32,0,32,119,105,100,116,104,58,32,37,100,112,116,59,32,104,101,105,103,104,116,58,32,37,100,112,116,34,0,32,99,111,111,114,100,111,114,105,103,105,110,61,34,48,44,48,34,32,99,111,111,114,100,115,105,122,101,61,34,37,100,44,37,100,34,32,62,0,60,72,84,77,76,62,10,0,10,60,33,45,45,32,71,101,110,101,114,97,116,101,100,32,98,121,32,0,32,118,101,114,115,105,111,110,32,0,32,40,0,41,10,45,45,62,10,0,97,113,117,97,0,102,117,99,104,115,105,97,0,108,105,109,101,0,111,108,105,118,101,0,116,101,97,108,0,118,109,108,0,118,109,108,58,118,109,108,0,47,47,42,42,42,32,99,111,109,109,101,110,116,58,32,37,115,10,0,47,47,42,42,42,32,112,111,108,121,108,105,110,101,10,0,115,99,97,108,101,32,32,32,32,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,10,0,114,111,116,97,116,101,32,32,32,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,10,0,116,114,97,110,115,108,97,116,101,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,10,0,115,112,104,101,114,101,95,115,119,101,101,112,32,123,10,32,32,32,32,37,115,10,32,32,32,32,37,100,44,10,0,108,105,110,101,97,114,95,115,112,108,105,110,101,0,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,44,32,37,46,51,102,10,0,37,115,32,32,32,32,37,115,0,32,32,32,32,116,111,108,101,114,97,110,99,101,32,48,46,48,49,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,37,115,37,115,0,37,115,32,116,114,97,110,115,109,105,116,32,37,46,51,102,0,82,101,100,0,71,114,101,101,110,0,66,108,117,101,0,114,103,98,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,32,116,114,97,110,115,109,105,116,32,37,46,51,102,0,111,111,112,115,44,32,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,117,110,104,97,110,100,108,101,100,32,99,111,108,111,114,32,116,121,112,101,61,37,100,32,37,115,10,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,112,111,118,46,99,0,112,111,118,95,99,111,108,111,114,95,97,115,95,115,116,114,0,112,105,103,109,101,110,116,32,123,32,99,111,108,111,114,32,37,115,32,125,10,0,112,111,118,32,114,101,110,100,101,114,101,114,58,101,108,32,45,32,37,115,10,0,47,47,42,42,42,32,98,101,122,105,101,114,10,0,98,95,115,112,108,105,110,101,0,32,32,32,32,32,32,32,32,116,111,108,101,114,97,110,99,101,32,48,46,48,49,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,47,47,42,42,42,32,112,111,108,121,103,111,110,10,0,32,32,32,32,116,111,108,101,114,97,110,99,101,32,48,46,49,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,112,111,108,121,103,111,110,32,123,32,37,100,44,10,0,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,0,37,115,10,32,32,32,32,37,115,0,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,47,47,42,42,42,32,101,108,108,105,112,115,101,10,0,116,111,114,117,115,32,123,32,37,46,51,102,44,32,37,46,51,102,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,115,112,104,101,114,101,32,123,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,44,32,49,46,48,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,47,47,42,42,42,32,116,101,120,116,115,112,97,110,58,32,37,115,44,32,102,111,110,116,115,105,122,101,32,61,32,37,46,51,102,44,32,102,111,110,116,110,97,109,101,32,61,32,37,115,10,0,115,99,97,108,101,32,37,46,51,102,10,0,116,101,120,116,32,123,10,32,32,32,32,116,116,102,32,34,37,115,34,44,10,32,32,32,32,34,37,115,34,44,32,37,46,51,102,44,32,37,46,51,102,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,32,32,32,32,110,111,95,115,104,97,100,111,119,10,0,47,47,42,42,42,32,101,110,100,95,101,100,103,101,10,0,47,47,42,42,42,32,98,101,103,105,110,95,101,100,103,101,10,0,47,47,42,42,42,32,101,110,100,95,110,111,100,101,10,0,47,47,42,42,42,32,98,101,103,105,110,95,110,111,100,101,58,32,37,115,10,0,47,47,42,42,42,32,101,110,100,95,99,108,117,115,116,101,114,10,0,47,47,42,42,42,32,98,101,103,105,110,95,99,108,117,115,116,101,114,10,0,47,47,42,42,42,32,101,110,100,95,112,97,103,101,10,0,47,47,42,42,42,32,98,101,103,105,110,95,112,97,103,101,10,0,47,47,42,42,42,32,101,110,100,95,108,97,121,101,114,10,0,47,47,42,42,42,32,98,101,103,105,110,95,108,97,121,101,114,58,32,37,115,44,32,37,100,47,37,100,10,0,47,47,42,42,42,32,101,110,100,95,103,114,97,112,104,10,0,47,47,42,42,42,32,98,101,103,105,110,95,103,114,97,112,104,32,37,115,10,0,99,97,109,101,114,97,32,123,32,108,111,99,97,116,105,111,110,32,60,37,46,51,102,32,44,32,37,46,51,102,32,44,32,37,46,51,102,62,10,32,32,32,32,32,32,32,32,32,108,111,111,107,95,97,116,32,32,60,37,46,51,102,32,44,32,37,46,51,102,32,44,32,37,46,51,102,62,10,32,32,32,32,32,32,32,32,32,114,105,103,104,116,32,120,32,42,32,105,109,97,103,101,95,119,105,100,116,104,32,47,32,105,109,97,103,101,95,104,101,105,103,104,116,10,32,32,32,32,32,32,32,32,32,97,110,103,108,101,32,37,46,51,102,10,125,10,0,47,47,115,107,121,10,112,108,97,110,101,32,123,32,60,48,44,32,49,44,32,48,62,44,32,49,32,104,111,108,108,111,119,10,32,32,32,32,116,101,120,116,117,114,101,32,123,10,32,32,32,32,32,32,32,32,112,105,103,109,101,110,116,32,123,32,98,111,122,111,32,116,117,114,98,117,108,101,110,99,101,32,48,46,57,53,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,108,111,114,95,109,97,112,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,48,46,48,48,32,114,103,98,32,60,48,46,48,53,44,32,48,46,50,48,44,32,48,46,53,48,62,93,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,48,46,53,48,32,114,103,98,32,60,48,46,48,53,44,32,48,46,50,48,44,32,48,46,53,48,62,93,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,48,46,55,53,32,114,103,98,32,60,49,46,48,48,44,32,49,46,48,48,44,32,49,46,48,48,62,93,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,48,46,55,53,32,114,103,98,32,60,48,46,50,53,44,32,48,46,50,53,44,32,48,46,50,53,62,93,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,49,46,48,48,32,114,103,98,32,60,48,46,53,48,44,32,48,46,53,48,44,32,48,46,53,48,62,93,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,115,99,97,108,101,32,60,49,46,48,48,44,32,49,46,48,48,44,32,49,46,53,48,62,32,42,32,50,46,53,48,10,32,32,32,32,32,32,32,32,32,32,32,32,116,114,97,110,115,108,97,116,101,32,60,48,46,48,48,44,32,48,46,48,48,44,32,48,46,48,48,62,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,102,105,110,105,115,104,32,123,32,97,109,98,105,101,110,116,32,49,32,100,105,102,102,117,115,101,32,48,32,125,10,32,32,32,32,125,10,32,32,32,32,115,99,97,108,101,32,49,48,48,48,48,10,125,10,47,47,109,105,115,116,10,102,111,103,32,123,32,102,111,103,95,116,121,112,101,32,50,10,32,32,32,32,100,105,115,116,97,110,99,101,32,53,48,10,32,32,32,32,99,111,108,111,114,32,114,103,98,32,60,49,46,48,48,44,32,49,46,48,48,44,32,49,46,48,48,62,32,42,32,48,46,55,53,10,32,32,32,32,102,111,103,95,111,102,102,115,101,116,32,48,46,49,48,10,32,32,32,32,102,111,103,95,97,108,116,32,49,46,53,48,10,32,32,32,32,116,117,114,98,117,108,101,110,99,101,32,49,46,55,53,10,125,10,47,47,103,110,100,10,112,108,97,110,101,32,123,32,60,48,46,48,48,44,32,49,46,48,48,44,32,48,46,48,48,62,44,32,48,10,32,32,32,32,116,101,120,116,117,114,101,32,123,10,32,32,32,32,32,32,32,32,112,105,103,109,101,110,116,123,32,99,111,108,111,114,32,114,103,98,32,60,48,46,50,53,44,32,48,46,52,53,44,32,48,46,48,48,62,32,125,10,32,32,32,32,32,32,32,32,110,111,114,109,97,108,32,123,32,98,117,109,112,115,32,48,46,55,53,32,115,99,97,108,101,32,48,46,48,49,32,125,10,32,32,32,32,32,32,32,32,102,105,110,105,115,104,32,123,32,112,104,111,110,103,32,48,46,49,48,32,125,10,32,32,32,32,125,10,125,10,0,108,105,103,104,116,95,115,111,117,114,99,101,32,123,32,60,49,53,48,48,44,51,48,48,48,44,45,50,53,48,48,62,32,99,111,108,111,114,32,87,104,105,116,101,32,125,10,0,35,118,101,114,115,105,111,110,32,51,46,54,59,10,0,103,108,111,98,97,108,95,115,101,116,116,105,110,103,115,32,123,32,97,115,115,117,109,101,100,95,103,97,109,109,97,32,49,46,48,32,125,10,0,35,100,101,102,97,117,108,116,32,123,32,102,105,110,105,115,104,32,123,32,97,109,98,105,101,110,116,32,48,46,49,32,100,105,102,102,117,115,101,32,48,46,57,32,125,32,125,10,0,35,105,110,99,108,117,100,101,32,34,99,111,108,111,114,115,46,105,110,99,34,10,35,105,110,99,108,117,100,101,32,34,116,101,120,116,117,114,101,115,46,105,110,99,34,10,35,105,110,99,108,117,100,101,32,34,115,104,97,112,101,115,46,105,110,99,34,10,0,35,100,101,99,108,97,114,101,32,37,115,32,61,32,37,115,59,10,0,66,108,97,99,107,0,87,104,105,116,101,0,98,97,107,101,114,115,99,104,111,99,0,98,114,97,115,115,0,98,114,105,103,104,116,103,111,108,100,0,98,114,111,110,122,101,0,98,114,111,110,122,101,50,0,99,108,101,97,114,0,99,111,111,108,99,111,112,112,101,114,0,99,111,112,112,101,114,0,100,97,114,107,98,114,111,119,110,0,100,97,114,107,112,117,114,112,108,101,0,100,97,114,107,116,97,110,0,100,97,114,107,119,111,111,100,0,100,107,103,114,101,101,110,99,111,112,112,101,114,0,100,117,115,116,121,114,111,115,101,0,102,101,108,100,115,112,97,114,0,102,108,101,115,104,0,103,114,97,121,48,53,0,103,114,101,101,110,99,111,112,112,101,114,0,104,117,110,116,101,114,115,103,114,101,101,110,0,108,105,103,104,116,95,112,117,114,112,108,101,0,108,105,103,104,116,119,111,111,100,0,109,97,110,100,97,114,105,110,111,114,97,110,103,101,0,109,101,100,105,117,109,102,111,114,101,115,116,103,114,101,101,110,0,109,101,100,105,117,109,103,111,108,100,101,110,114,111,100,0,109,101,100,105,117,109,119,111,111,100,0,109,101,100,95,112,117,114,112,108,101,0,109,105,99,97,0,110,101,111,110,98,108,117,101,0,110,101,111,110,112,105,110,107,0,110,101,119,109,105,100,110,105,103,104,116,98,108,117,101,0,110,101,119,116,97,110,0,111,108,100,103,111,108,100,0,113,117,97,114,116,122,0,114,105,99,104,98,108,117,101,0,115,99,97,114,108,101,116,0,115,101,109,105,83,119,101,101,116,67,104,111,99,0,115,105,108,118,101,114,0,115,112,105,99,121,112,105,110,107,0,115,117,109,109,101,114,115,107,121,0,118,101,114,121,100,97,114,107,98,114,111,119,110,0,118,101,114,121,95,108,105,103,104,116,95,112,117,114,112,108,101,0,112,111,118,0,112,111,118,58,112,111,118,0,37,115,32,37,115,10,0,46,92,34,32,0,32,37,100,32,37,100,0,32,37,115,10,0,32,37,100,0,102,105,108,108,32,0,101,108,108,105,112,115,101,32,97,116,116,114,115,37,100,32,37,115,119,105,100,32,37,46,53,102,32,104,116,32,37,46,53,102,32,97,116,32,40,37,46,53,102,44,37,46,53,102,41,59,10,0,46,102,116,32,37,115,10,0,46,112,115,32,37,100,42,92,110,40,83,70,117,47,37,46,48,102,117,10,0,34,37,115,34,32,97,116,32,40,37,46,53,102,44,37,46,53,102,41,59,10,0,37,48,51,111,0,37,115,37,115,32,105,115,32,110,111,116,32,97,32,116,114,111,102,102,32,102,111,110,116,10,0,100,111,116,32,112,105,99,32,112,108,117,103,105,110,58,32,0,82,0,93,10,46,80,69,10,0,46,80,83,32,37,46,53,102,32,37,46,53,102,10,0,37,115,32,116,111,32,99,104,97,110,103,101,32,100,114,97,119,105,110,103,32,115,105,122,101,44,32,109,117,108,116,105,112,108,121,32,116,104,101,32,119,105,100,116,104,32,97,110,100,32,104,101,105,103,104,116,32,111,110,32,116,104,101,32,46,80,83,32,108,105,110,101,32,97,98,111,118,101,32,97,110,100,32,116,104,101,32,110,117,109,98,101,114,32,111,110,32,116,104,101,32,116,119,111,32,108,105,110,101,115,32,98,101,108,111,119,32,40,114,111,117,110,100,101,100,32,116,111,32,116,104,101,32,110,101,97,114,101,115,116,32,105,110,116,101,103,101,114,41,32,98,121,32,97,32,115,99,97,108,101,32,102,97,99,116,111,114,10,0,46,110,114,32,83,70,32,37,46,48,102,10,115,99,97,108,101,116,104,105,99,107,110,101,115,115,32,61,32,37,46,48,102,10,0,37,115,32,100,111,110,39,116,32,99,104,97,110,103,101,32,97,110,121,116,104,105,110,103,32,98,101,108,111,119,32,116,104,105,115,32,108,105,110,101,32,105,110,32,116,104,105,115,32,100,114,97,119,105,110,103,10,0,37,115,32,110,111,110,45,102,97,116,97,108,32,114,117,110,45,116,105,109,101,32,112,105,99,32,118,101,114,115,105,111,110,32,100,101,116,101,114,109,105,110,97,116,105,111,110,44,32,118,101,114,115,105,111,110,32,50,10,0,98,111,120,114,97,100,61,50,46,48,32,37,115,32,119,105,108,108,32,98,101,32,114,101,115,101,116,32,116,111,32,48,46,48,32,98,121,32,103,112,105,99,32,111,110,108,121,10,0,115,99,97,108,101,61,49,46,48,32,37,115,32],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+71704);allocate([114,101,113,117,105,114,101,100,32,102,111,114,32,99,111,109,112,97,114,105,115,111,110,115,10,0,37,115,32,98,111,120,114,97,100,32,105,115,32,110,111,119,32,48,46,48,32,105,110,32,103,112,105,99,44,32,101,108,115,101,32,105,116,32,114,101,109,97,105,110,115,32,50,46,48,10,0,37,115,32,100,97,115,104,119,105,100,32,105,115,32,48,46,49,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,44,32,48,46,48,53,32,105,110,32,68,87,66,32,50,32,97,110,100,32,105,110,32,103,112,105,99,10,0,37,115,32,102,105,108,108,118,97,108,32,105,115,32,48,46,51,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,32,40,102,105,108,108,32,48,32,109,101,97,110,115,32,98,108,97,99,107,41,44,32,48,46,53,32,105,110,32,103,112,105,99,32,40,102,105,108,108,32,48,32,109,101,97,110,115,32,119,104,105,116,101,41,44,32,117,110,100,101,102,105,110,101,100,32,105,110,32,68,87,66,32,50,10,0,37,115,32,102,105,108,108,32,104,97,115,32,110,111,32,109,101,97,110,105,110,103,32,105,110,32,68,87,66,32,50,44,32,103,112,105,99,32,99,97,110,32,117,115,101,32,102,105,108,108,32,111,114,32,102,105,108,108,101,100,44,32,49,48,116,104,32,69,100,105,116,105,111,110,32,117,115,101,115,32,102,105,108,108,32,111,110,108,121,10,0,37,115,32,68,87,66,32,50,32,100,111,101,115,110,39,116,32,117,115,101,32,102,105,108,108,32,97,110,100,32,100,111,101,115,110,39,116,32,100,101,102,105,110,101,32,102,105,108,108,118,97,108,10,0,37,115,32,114,101,115,101,116,32,119,111,114,107,115,32,105,110,32,103,112,105,99,32,97,110,100,32,49,48,116,104,32,101,100,105,116,105,111,110,44,32,98,117,116,32,105,115,110,39,116,32,100,101,102,105,110,101,100,32,105,110,32,68,87,66,32,50,10,0,37,115,32,68,87,66,32,50,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,100,101,102,105,110,105,116,105,111,110,115,10,0,105,102,32,98,111,120,114,97,100,32,62,32,49,46,48,32,38,38,32,100,97,115,104,119,105,100,32,60,32,48,46,48,55,53,32,116,104,101,110,32,88,10,9,102,105,108,108,118,97,108,32,61,32,49,59,10,9,100,101,102,105,110,101,32,102,105,108,108,32,89,32,89,59,10,9,100,101,102,105,110,101,32,115,111,108,105,100,32,89,32,89,59,10,9,100,101,102,105,110,101,32,114,101,115,101,116,32,89,32,115,99,97,108,101,61,49,46,48,32,89,59,10,88,10,0,114,101,115,101,116,32,37,115,32,115,101,116,32,116,111,32,107,110,111,119,110,32,115,116,97,116,101,10,0,37,115,32,71,78,85,32,112,105,99,32,118,115,46,32,49,48,116,104,32,69,100,105,116,105,111,110,32,100,92,40,101,39,116,101,110,116,101,10,0,105,102,32,102,105,108,108,118,97,108,32,62,32,48,46,52,32,116,104,101,110,32,88,10,9,100,101,102,105,110,101,32,115,101,116,102,105,108,108,118,97,108,32,89,32,102,105,108,108,118,97,108,32,61,32,49,32,45,32,89,59,10,9,100,101,102,105,110,101,32,98,111,108,100,32,89,32,116,104,105,99,107,110,101,115,115,32,50,32,89,59,10,0,9,37,115,32,105,102,32,121,111,117,32,117,115,101,32,103,112,105,99,32,97,110,100,32,105,116,32,98,97,114,102,115,32,111,110,32,101,110,99,111,117,110,116,101,114,105,110,103,32,34,115,111,108,105,100,34,44,10,0,9,37,115,9,105,110,115,116,97,108,108,32,97,32,109,111,114,101,32,114,101,99,101,110,116,32,118,101,114,115,105,111,110,32,111,102,32,103,112,105,99,32,111,114,32,115,119,105,116,99,104,32,116,111,32,68,87,66,32,111,114,32,49,48,116,104,32,69,100,105,116,105,111,110,32,112,105,99,59,10,0,9,37,115,9,115,111,114,114,121,44,32,116,104,101,32,103,114,111,102,102,32,102,111,108,107,115,32,99,104,97,110,103,101,100,32,103,112,105,99,59,32,115,101,110,100,32,97,110,121,32,99,111,109,112,108,97,105,110,116,32,116,111,32,116,104,101,109,59,10,0,88,32,101,108,115,101,32,90,10,9,100,101,102,105,110,101,32,115,101,116,102,105,108,108,118,97,108,32,89,32,102,105,108,108,118,97,108,32,61,32,89,59,10,9,100,101,102,105,110,101,32,98,111,108,100,32,89,32,89,59,10,9,100,101,102,105,110,101,32,102,105,108,108,101,100,32,89,32,102,105,108,108,32,89,59,10,90,10,0,37,115,32,97,114,114,111,119,104,101,97,100,32,104,97,115,32,110,111,32,109,101,97,110,105,110,103,32,105,110,32,68,87,66,32,50,44,32,97,114,114,111,119,104,101,97,100,32,61,32,55,32,109,97,107,101,115,32,102,105,108,108,101,100,32,97,114,114,111,119,104,101,97,100,115,32,105,110,32,103,112,105,99,32,97,110,100,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,10,0,37,115,32,97,114,114,111,119,104,101,97,100,32,105,115,32,117,110,100,101,102,105,110,101,100,32,105,110,32,68,87,66,32,50,44,32,105,110,105,116,105,97,108,108,121,32,49,32,105,110,32,103,112,105,99,44,32,50,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,10,0,97,114,114,111,119,104,101,97,100,32,61,32,55,32,37,115,32,110,111,116,32,117,115,101,100,32,98,121,32,103,114,97,112,104,118,105,122,10,0,37,115,32,71,78,85,32,112,105,99,32,115,117,112,112,111,114,116,115,32,97,32,98,111,120,114,97,100,32,118,97,114,105,97,98,108,101,32,116,111,32,100,114,97,119,32,98,111,120,101,115,32,119,105,116,104,32,114,111,117,110,100,101,100,32,99,111,114,110,101,114,115,59,32,68,87,66,32,97,110,100,32,49,48,116,104,32,69,100,46,32,100,111,32,110,111,116,10,0,98,111,120,114,97,100,32,61,32,48,32,37,115,32,110,111,32,114,111,117,110,100,101,100,32,99,111,114,110,101,114,115,32,105,110,32,103,114,97,112,104,118,105,122,10,0,37,115,32,71,78,85,32,112,105,99,32,115,117,112,112,111,114,116,115,32,97,32,108,105,110,101,116,104,105,99,107,32,118,97,114,105,97,98,108,101,32,116,111,32,115,101,116,32,108,105,110,101,32,116,104,105,99,107,110,101,115,115,59,32,68,87,66,32,97,110,100,32,49,48,116,104,32,69,100,46,32,100,111,32,110,111,116,10,0,108,105,110,101,116,104,105,99,107,32,61,32,48,59,32,111,108,100,108,105,110,101,116,104,105,99,107,32,61,32,108,105,110,101,116,104,105,99,107,10,0,37,115,32,46,80,83,32,119,47,111,32,97,114,103,115,32,99,97,117,115,101,115,32,71,78,85,32,112,105,99,32,116,111,32,115,99,97,108,101,32,100,114,97,119,105,110,103,32,116,111,32,102,105,116,32,56,46,53,120,49,49,32,112,97,112,101,114,59,32,68,87,66,32,100,111,101,115,32,110,111,116,10,0,37,115,32,109,97,120,112,115,104,116,32,97,110,100,32,109,97,120,112,115,119,105,100,32,104,97,118,101,32,110,111,32,109,101,97,110,105,110,103,32,105,110,32,68,87,66,32,50,46,48,44,32,115,101,116,32,112,97,103,101,32,98,111,117,110,100,97,114,105,101,115,32,105,110,32,103,112,105,99,32,97,110,100,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,10,0,37,115,32,109,97,120,112,115,104,116,32,97,110,100,32,109,97,120,112,115,119,105,100,32,97,114,101,32,112,114,101,100,101,102,105,110,101,100,32,116,111,32,49,49,46,48,32,97,110,100,32,56,46,53,32,105,110,32,103,112,105,99,10,0,109,97,120,112,115,104,116,32,61,32,37,102,10,109,97,120,112,115,119,105,100,32,61,32,37,102,10,0,68,111,116,58,32,91,10,0,100,101,102,105,110,101,32,97,116,116,114,115,48,32,37,37,32,37,37,59,32,100,101,102,105,110,101,32,117,110,102,105,108,108,101,100,32,37,37,32,37,37,59,32,100,101,102,105,110,101,32,114,111,117,110,100,101,100,32,37,37,32,37,37,59,32,100,101,102,105,110,101,32,100,105,97,103,111,110,97,108,115,32,37,37,32,37,37,10,0,37,115,37,115,32,117,110,115,117,112,112,111,114,116,101,100,10,0,37,115,32,114,101,115,116,111,114,101,32,112,111,105,110,116,32,115,105,122,101,32,97,110,100,32,102,111,110,116,10,46,112,115,32,92,110,40,46,83,10,46,102,116,32,92,110,40,68,70,10,0,37,115,32,67,114,101,97,116,111,114,58,32,37,115,32,118,101,114,115,105,111,110,32,37,115,32,40,37,115,41,10,0,37,115,32,84,105,116,108,101,58,32,37,115,10,0,37,115,32,115,97,118,101,32,112,111,105,110,116,32,115,105,122,101,32,97,110,100,32,102,111,110,116,10,46,110,114,32,46,83,32,92,110,40,46,115,10,46,110,114,32,68,70,32,92,110,40,46,102,10,0,112,105,99,0,112,105,99,58,112,105,99,0,112,110,103,58,115,118,103,0,103,105,102,58,115,118,103,0,106,112,101,103,58,115,118,103,0,106,112,101,58,115,118,103,0,106,112,103,58,115,118,103,0,112,110,103,58,102,105,103,0,103,105,102,58,102,105,103,0,106,112,101,103,58,102,105,103,0,106,112,101,58,102,105,103,0,106,112,103,58,102,105,103,0,112,110,103,58,118,114,109,108,0,103,105,102,58,118,114,109,108,0,106,112,101,103,58,118,114,109,108,0,106,112,101,58,118,114,109,108,0,106,112,103,58,118,114,109,108,0,101,112,115,58,112,115,0,112,115,58,112,115,0,40,108,105,98,41,58,112,115,0,112,110,103,58,109,97,112,0,103,105,102,58,109,97,112,0,106,112,101,103,58,109,97,112,0,106,112,101,58,109,97,112,0,106,112,103,58,109,97,112,0,112,115,58,109,97,112,0,101,112,115,58,109,97,112,0,115,118,103,58,109,97,112,0,112,110,103,58,100,111,116,0,103,105,102,58,100,111,116,0,106,112,101,103,58,100,111,116,0,106,112,101,58,100,111,116,0,106,112,103,58,100,111,116,0,112,115,58,100,111,116,0,101,112,115,58,100,111,116,0,115,118,103,58,100,111,116,0,112,110,103,58,120,100,111,116,0,103,105,102,58,120,100,111,116,0,106,112,101,103,58,120,100,111,116,0,106,112,101,58,120,100,111,116,0,106,112,103,58,120,100,111,116,0,112,115,58,120,100,111,116,0,101,112,115,58,120,100,111,116,0,115,118,103,58,120,100,111,116,0,115,118,103,58,115,118,103,0,112,110,103,58,118,109,108,0,103,105,102,58,118,109,108,0,106,112,101,103,58,118,109,108,0,106,112,101,58,118,109,108,0,106,112,103,58,118,109,108,0,103,105,102,58,116,107,0,105,109,97,103,101,32,99,114,101,97,116,101,32,112,104,111,116,111,32,34,112,104,111,116,111,95,37,115,34,32,45,102,105,108,101,32,34,37,115,34,10,0,36,99,32,99,114,101,97,116,101,32,105,109,97,103,101,32,37,46,50,102,32,37,46,50,102,32,45,105,109,97,103,101,32,34,112,104,111,116,111,95,37,115,34,10,0,60,118,58,105,109,97,103,101,32,115,114,99,61,34,37,115,34,32,115,116,121,108,101,61,34,32,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,119,105,100,116,104,58,37,46,50,102,59,32,104,101,105,103,104,116,58,37,46,50,102,59,32,108,101,102,116,58,37,46,50,102,32,59,32,116,111,112,58,37,46,50,102,34,0,32,47,62,10,0,103,118,108,111,97,100,105,109,97,103,101,95,99,111,114,101,46,99,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,112,115,108,105,98,0,91,32,0,37,103,32,37,103,32,0,93,32,32,37,100,32,116,114,117,101,32,37,115,10,0,93,32,32,37,100,32,102,97,108,115,101,32,37,115,10,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,112,115,0,103,115,97,118,101,32,37,103,32,37,103,32,116,114,97,110,115,108,97,116,101,32,110,101,119,112,97,116,104,10,0,117,115,101,114,95,115,104,97,112,101,95,37,100,10,0,103,114,101,115,116,111,114,101,10,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,118,114,109,108,0,83,104,97,112,101,32,123,10,0,32,32,97,112,112,101,97,114,97,110,99,101,32,65,112,112,101,97,114,97,110,99,101,32,123,10,0,32,32,32,32,109,97,116,101,114,105,97,108,32,77,97,116,101,114,105,97,108,32,123,10,0,32,32,32,32,32,32,97,109,98,105,101,110,116,73,110,116,101,110,115,105,116,121,32,48,46,51,51,10,0,32,32,32,32,32,32,32,32,100,105,102,102,117,115,101,67,111,108,111,114,32,49,32,49,32,49,10,0,32,32,32,32,125,10,0,32,32,32,32,116,101,120,116,117,114,101,32,73,109,97,103,101,84,101,120,116,117,114,101,32,123,32,117,114,108,32,34,37,115,34,32,125,10,0,32,32,125,10,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,102,105,103,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,32,37,100,32,37,115,10,0,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,115,118,103,0,60,105,109,97,103,101,32,120,108,105,110,107,58,104,114,101,102,61,34,0,34,32,119,105,100,116,104,61,34,37,103,112,120,34,32,104,101,105,103,104,116,61,34,37,103,112,120,34,32,112,114,101,115,101,114,118,101,65,115,112,101,99,116,82,97,116,105,111,61,34,120,77,105,100,89,77,105,100,32,109,101,101,116,34,32,120,61,34,37,103,34,32,121,61,34,37,103,34,0,32,116,114,97,110,115,102,111,114,109,61,34,114,111,116,97,116,101,40,37,100,32,37,103,32,37,103,41,34,0,34,32,119,105,100,116,104,61,34,37,103,112,120,34,32,104,101,105,103,104,116,61,34,37,103,112,120,34,32,112,114,101,115,101,114,118,101,65,115,112,101,99,116,82,97,116,105,111,61,34,120,77,105,110,89,77,105,110,32,109,101,101,116,34,32,120,61,34,37,103,34,32,121,61,34,37,103,34,0,47,62,10,0,100,111,116,95,108,97,121,111,117,116,0,112,104,97,115,101,0,100,111,116,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,32,97,115,112,101,99,116,32,97,116,116,114,105,98,117,116,101,32,102,111,114,32,100,105,115,99,111,110,110,101,99,116,101,100,32,103,114,97,112,104,115,32,111,114,32,103,114,97,112,104,115,32,119,105,116,104,32,99,108,117,115,116,101,114,115,10,0,99,111,109,112,111,117,110,100,0,118,32,61,61,32,110,0,100,111,116,105,110,105,116,46,99,0,114,101,109,111,118,101,95,102,114,111,109,95,114,97,110,107,0,111,114,100,101,114,0,101,100,103,101,32,108,97,98,101,108,115,32,119,105,116,104,32,115,112,108,105,110,101,115,61,99,117,114,118,101,100,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,100,111,116,32,45,32,117,115,101,32,120,108,97,98,101,108,115,10,0,69,68,95,108,97,98,101,108,40,102,101,41,0,100,111,116,115,112,108,105,110,101,115,46,99,0,95,100,111,116,95,115,112,108,105,110,101,115,0,102,108,97,116,32,101,100,103,101,32,98,101,116,119,101,101,110,32,97,100,106,97,99,101,110,116,32,110,111,100,101,115,32,111,110,101,32,111,102,32,119,104,105,99,104,32,104,97,115,32,97,32,114,101,99,111,114,100,32,115,104,97,112,101,32,45,32,114,101,112,108,97,99,101,32,114,101,99,111,114,100,115,32,119,105,116,104,32,72,84,77,76,45,108,105,107,101,32,108,97,98,101,108,115,10,0,32,32,69,100,103,101,32,37,115,32,37,115,32,37,115,10,0,120,120,120,0,49,48,48,48,48,0,123,37,115,125,0,97,117,120,103,0,108,97,98,101,108,95,102,108,111,97,116,0,102,105,120,101,100,0,40,108,32,61,32,69,68,95,108,97,98,101,108,40,102,101,41,41,0,115,101,116,69,100,103,101,76,97,98,101,108,80,111,115,0,101,32,33,61,32,78,85,76,76,0,102,97,115,116,103,114,46,99,0,100,101,108,101,116,101,95,102,97,115,116,95,101,100,103,101,0,110,32,33,61,32,78,68,95,110,101,120,116,40,110,41,0,102,97,115,116,95,110,111,100,101,0,117,32,33,61,32,118,0,102,97,115,116,95,110,111,100,101,97,112,112,0,78,68,95,110,101,120,116,40,118,41,32,61,61,32,78,85,76,76,0,102,105,110,100,95,102,97,115,116,95,110,111,100,101,40,103,44,32,110,41,0,100,101,108,101,116,101,95,102,97,115,116,95,110,111,100,101,0,100,101,108,101,116,101,95,102,108,97,116,95,101,100,103,101,0,109,101,114,103,101,95,111,110,101,119,97,121,32,103,108,105,116,99,104,10,0,109,101,114,103,101,95,111,110,101,119,97,121,0,115,97,102,101,95,100,101,108,101,116,101,95,102,97,115,116,95,101,100,103,101,0,108,103,0,99,111,109,112,0,99,110,116,32,61,61,32,115,122,0,109,105,110,99,114,111,115,115,46,99,0,102,105,120,76,97,98,101,108,79,114,100,101,114,0,114,101,109,105,110,99,114,111,115,115,0,109,105,110,99,114,111,115,115,32,37,115,58,32,37,100,32,99,114,111,115,115,105,110,103,115,44,32,37,46,50,102,32,115,101,99,115,46,10,0,118,0,110,101,105,103,104,98,111,114,0,40,114,118,32,61,61,32,48,41,32,124,124,32,40,78,68,95,111,114,100,101,114,40,114,118,41,45,78,68,95,111,114,100,101,114,40,118,41,41,42,100,105,114,32,62,32,48,0,99,111,110,115,116,114,97,105,110,105,110,103,95,102,108,97,116,95,101,100,103,101,40,103,44,118,44,101,41,32,61,61,32,70,65,76,83,69,0,102,108,97,116,95,114,101,111,114,100,101,114,0,78,68,95,114,97,110,107,40,118,41,32,61,61,32,114,0,112,111,115,116,111,114,100,101,114,0,102,108,97,116,105,110,100,101,120,40,97,103,104,101,97,100,40,101,41,41,32,60,32,77,45,62,110,114,111,119,115,0,102,108,97,116,95,115,101,97,114,99,104,0,102,108,97,116,105,110,100,101,120,40,97,103,116,97,105,108,40,101,41,41,32,60,32,77,45,62,110,99,111,108,115,0,111,117,116,0,111,114,100,101,114,105,110,103,32,39,37,115,39,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,46,10,0,111,114,100,101,114,105,110,103,32,39,37,115,39,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,32,102,111,114,32,110,111,100,101,32,39,37,115,39,46,10,0,109,101,114,103,101,50,58,32,103,114,97,112,104,32,37,115,44,32,114,97,110,107,32,37,100,32,104,97,115,32,111,110,108,121,32,37,100,32,60,32,37,100,32,110,111,100,101,115,10,0,109,105,110,99,114,111,115,115,58,32,112,97,115,115,32,37,100,32,105,116,101,114,32,37,100,32,116,114,121,105,110,103,32,37,100,32,99,117,114,95,99,114,111,115,115,32,37,100,32,98,101,115,116,95,99,114,111,115,115,32,37,100,10,0,78,68,95,111,114,100,101,114,40,118,41,32,60,32,78,68,95,111,114,100,101,114,40,119,41,0,98,97,108,97,110,99,101,0,116,114,97,110,115,112,111,115,101,95,115,116,101,112,0,115,117,114,112,114,105,115,101,10,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,37,100,58,32,37,115,32,37,115,32,114,97,110,107,32,37,100,32,105,32,61,32,37,100,32,97,110,32,61,32,48,10,0,71,68,95,114,97,110,107,40,103,41,91,114,93,46,110,32,60,61,32,71,68,95,114,97,110,107,40,103,41,91,114,93,46,97,110,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,37,100,58,32,78,68,95,111,114,100,101,114,40,37,115,41,32,91,37,100,93,32,62,32,71,68,95,114,97,110,107,40,82,111,111,116,41,91,37,100,93,46,97,110,32,91,37,100,93,10,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,37,100,58,32,114,97,110,107,32,37,100,32,110,111,116,32,105,110,32,114,97,110,107,32,114,97,110,103,101,32,91,37,100,44,37,100,93,10,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,37,100,58,32,71,68,95,114,97,110,107,40,103,41,91,37,100,93,46,118,32,43,32,78,68,95,111,114,100,101,114,40,37,115,41,32,91,37,100,93,32,62,32,71,68,95,114,97,110,107,40,103,41,91,37,100,93,46,97,118,32,43,32,71,68,95,114,97,110,107,40,82,111,111,116,41,91,37,100,93,46,97,110,32,91,37,100,93,10,0,95,110,101,119,95,114,97,110,107,0,109,99,108,105,109,105,116,0,114,97,110,107,40,103,44,32,50,44,32,110,115,105,116,101,114,50,40,103,41,41,32,61,61,32,48,0,112,111,115,105,116,105,111,110,46,99,0,100,111,116,95,112,111,115,105,116,105,111,110,0,65,82,61,37,48,46,52,108,102,9,32,65,114,101,97,61,32,37,48,46,52,108,102,9,0,68,117,109,109,121,61,37,100,10,0,71,111,105,110,103,32,116,111,32,97,112,112,108,121,32,97,110,111,116,104,101,114,32,101,120,112,97,110,115,105,111,110,46,10,0,110,101,120,116,35,105,116,101,114,61,37,100,10,0,104,112,0,99,111,110,110,101,99,116,71,114,97,112,104,0,69,100,103,101,32,108,101,110,103,116,104,32,37,102,32,108,97,114,103,101,114,32,116,104,97,110,32,109,97,120,105,109,117,109,32,37,117,32,97,108,108,111,119,101,100,46,10,67,104,101,99,107,32,102,111,114,32,111,118,101,114,119,105,100,101,32,110,111,100,101,40,115,41,46,10,0,110,115,108,105,109,105,116,0,99,111,110,116,97,105,110,95,110,111,100,101,115,32,99,108,117,115,116,32,37,115,32,114,97,110,107,32,37,100,32,109,105,115,115,105,110,103,32,110,111,100,101,10,0,110,115,108,105,109,105,116,49,0,110,101,119,114,97,110,107,0,77,97,120,114,97,110,107,32,61,32,37,100,44,32,109,105,110,114,97,110,107,32,61,32,37,100,10,0,108,101,97,100,101,114,32,33,61,32,78,85,76,76,0,114,97,110,107,46,99,0,99,108,117,115,116,101,114,95,108,101,97,100,101,114,0,40,78,68,95,85,70,95,115,105,122,101,40,110,41,32,60,61,32,49,41,32,124,124,32,40,110,32,61,61,32,108,101,97,100,101,114,41,0,97,103,104,101,97,100,40,101,41,32,61,61,32,85,70,95,102,105,110,100,40,97,103,104,101,97,100,40,101,41,41,0,109,105,110,109,97,120,95,101,100,103,101,115,0,97,103,116,97,105,108,40,101,41,32,61,61,32,85,70,95,102,105,110,100,40,97,103,116,97,105,108,40,101,41,41,0,114,97,110,107,0,115,97,109,101,0,109,105,110,0,115,111,117,114,99,101,0,109,97,120,0,115,105,110,107,0,108,101,118,101,108,32,97,115,115,105,103,110,109,101,110,116,32,99,111,110,115,116,114,97,105,110,116,115,0,108,101,118,101,108,32,103,114,97,112,104,32,114,101,99,0,127,114,111,111,116,0,127,116,111,112,0,127,98,111,116,0,99,111,109,112,97,99,116,0,95,119,101,97,107,95,37,100,0,114,97,110,107,105,110,103,58,32,102,97,105,108,117,114,101,32,116,111,32,99,114,101,97,116,101,32,115,116,114,111,110,103,32,99,111,110,115,116,114,97,105,110,116,32,101,100,103,101,32,98,101,116,119,101,101,110,32,110,111,100,101,115,32,37,115,32,97,110,100,32,37,115,10,0,37,115,32,104,97,115,32,117,110,114,101,99,111,103,110,105,122,101,100,32,114,97,110,107,61,37,115,0,108,101,118,101,108,32,101,100,103,101,32,114,101,99,0,108,101,118,101,108,32,110,111,100,101,32,114,101,99,0,115,97,109,101,104,101,97,100,0,115,97,109,101,116,97,105,108,0,116,111,111,32,109,97,110,121,32,40,62,32,37,100,41,32,115,97,109,101,123,104,101,97,100,44,116,97,105,108,125,32,103,114,111,117,112,115,32,102,111,114,32,110,111,100,101,32,37,115,10,0,99,111,109,98,105,65,82,32,61,32,37,108,102,10,0,37,108,102,44,37,100,0,116,104,101,32,97,115,112,101,99,116,32,97,116,116,114,105,98,117,116,101,32,104,97,115,32,98,101,101,110,32,100,105,115,97,98,108,101,100,32,100,117,101,32,116,111,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,102,108,97,119,115,32,45,32,97,116,116,114,105,98,117,116,101,32,105,103,110,111,114,101,100,46,10,0,69,68,95,116,111,95,118,105,114,116,40,101,41,32,61,61,32,78,85,76,76,0,99,108,97,115,115,50,46,99,0,109,101,114,103,101,95,99,104,97,105,110,0,69,68,95,116,111,95,118,105,114,116,40,111,114,105,103,41,32,61,61,32,78,85,76,76,0,109,97,107,101,95,99,104,97,105,110,0,69,68,95,116,111,95,118,105,114,116,40,111,114,105,103,41,32,33,61,32,78,85,76,76,0,78,68,95,114,97,110,107,40,102,114,111,109,41,32,60,32,78,68,95,114,97,110,107,40,116,111,41,0,99,108,117,115,116,101,114,46,99,0,109,97,112,95,112,97,116,104,0,37,115,32,119,97,115,32,97,108,114,101,97,100,121,32,105,110,32,97,32,114,97,110,107,115,101,116,44,32,100,101,108,101,116,101,100,32,102,114,111,109,32,99,108,117,115,116,101,114,32,37,115,10,0,108,104,101,97,100,0,108,116,97,105,108,0,37,115,32,45,62,32,37,115,58,32,115,112,108,105,110,101,32,115,105,122,101,32,62,32,49,32,110,111,116,32,115,117,112,112,111,114,116,101,100,10,0,37,115,32,45,62,32,37,115,58,32,104,101,97,100,32,110,111,116,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,37,115,32,45,62,32,37,115,58,32,116,97,105,108,32,105,115,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,98,101,122,45,62,115,102,108,97,103,0,99,111,109,112,111,117,110,100,46,99,0,109,97,107,101,67,111,109,112,111,117,110,100,69,100,103,101,0,98,101,122,45,62,101,102,108,97,103,0,37,115,32,45,62,32,37,115,58,32,116,97,105,108,32,110,111,116,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,37,115,32,45,62,32,37,115,58,32,104,101,97,100,32,105,115,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,115,101,103,109,101,110,116,32,91,37,115,44,37,115,93,32,100,111,101,115,32,110,111,116,32,105,110,116,101,114,115,101,99,116,32,98,111,120,32,108,108,61,37,115,44,117,114,61,37,115,10,0,98,111,120,73,110,116,101,114,115,101,99,116,102,0,40,37,46,53,103,44,37,46,53,103,41,0,99,108,117,115,116,101,114,32,110,97,109,101,100,32,37,115,32,110,111,116,32,102,111,117,110,100,10,0,99,111,110,99,101,110,116,114,97,116,101,61,116,114,117,101,32,109,97,121,32,110,111,116,32,119,111,114,107,32,99,111,114,114,101,99,116,108,121,46,10,0,114,101,98,117,105,108,116,100,95,118,108,105,115,116,115,58,32,114,97,110,107,32,108,101,97,100,32,37,115,32,110,111,116,32,105,110,32,111,114,100,101,114,32,37,100,32,111,102,32,114,97,110,107,32,37,100,10,0,100,101,103,101,110,101,114,97,116,101,32,99,111,110,99,101,110,116,114,97,116,101,100,32,114,97,110,107,32,37,115,44,37,100,10,0,78,68,95,105,110,40,114,105,103,104,116,41,46,115,105,122,101,32,43,32,78,68,95,111,117,116,40,114,105,103,104,116,41,46,115,105,122,101,32,61,61,32,48,0,99,111,110,99,46,99,0,109,101,114,103,101,118,105,114,116,117,97,108,0,100,111,116,58,32,79,117,116,32,111,102,32,109,101,109,111,114,121,10,0,78,68,95,111,117,116,40,118,41,46,115,105,122,101,32,61,61,32,50,0,102,108,97,116,46,99,0,115,101,116,98,111,117,110,100,115,0,71,68,95,109,105,110,114,97,110,107,40,103,41,32,61,61,32,48,0,97,98,111,109,105,110,97,116,105,111,110,0,110,101,97,116,111,95,108,97,121,111,117,116,0,110,101,97,116,111,0,102,100,112,0,115,102,100,112,0,116,119,111,112,105,0,99,105,114,99,111,0,112,97,116,99,104,119,111,114,107,0,111,115,97,103,101,0,110,111,112,0,110,111,112,49,0,110,111,112,50,0,37,108,102,44,37,108,102,44,37,108,102,37,99,0,110,111,100,101,32,37,115,44,32,112,111,115,105,116,105,111,110,32,37,115,44,32,101,120,112,101,99,116,101,100,32,116,119,111,32,100,111,117,98,108,101,115,10,0,110,111,116,114,97,110,115,108,97,116,101,0,110,111,100,101,32,37,115,32,105,110,32,103,114,97,112,104,32,37,115,32,104,97,115,32,110,111,32,112,111,115,105,116,105,111,110,10,0,115,44,37,108,102,44,37,108,102,37,110,0,32,101,44,37,108,102,44,37,108,102,37,110,0,112,111,115,32,97,116,116,114,105,98,117,116,101,32,102,111,114,32,101,100,103,101,32,40,37,115,44,37,115,41,32,100,111,101,115,110,39,116,32,104,97,118,101,32,51,110,43,49,32,112,111,105,110,116,115,10,0,37,108,102,44,37,108,102,37,110,0,115,121,110,116,97,120,32,101,114,114,111,114,32,105,110,32,112,111,115,32,97,116,116,114,105,98,117,116,101,32,102,111,114,32,101,100,103,101,32,40,37,115,44,37,115,41,10,0,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,0,115,116,97,114,116,0,115,101,108,102,0,114,97,110,100,111,109,0,110,111,100,101,32,112,111,115,105,116,105,111,110,115,32,97,114,101,32,105,103,110,111,114,101,100,32,117,110,108,101,115,115,32,115,116,97,114,116,61,114,97,110,100,111,109,10,0,97,115,32,114,101,113,117,105,114,101,100,32,98,121,32,116,104,101,32,45,110,32,102,108,97,103,10,0,95,110,101,97,116,111,95,99,99,0,103,114,97,112,104,32,37,115,32,105,115,32,100,105,115,99,111,110,110,101,99,116,101,100,46,32,72,101,110,99,101,44,32,116,104,101,32,99,105,114,99,117,105,116,32,109,111,100,101,108,10,0,65,108,116,101,114,110,97,116,105,118,101,108,121,44,32,99,111,110,115,105,100,101,114,32,114,117,110,110,105,110,103,32,110,101,97,116,111,32,117,115,105,110,103,32,45,71,112,97,99,107,61,116,114,117,101,32,111,114,32,100,101,99,111,109,112,111,115,105,110,103,10,0,116,104,101,32,103,114,97,112,104,32,105,110,116,111,32,99,111,110,110,101,99,116,101,100,32,99,111,109,112,111,110,101,110,116,115,46,10,0,83,111,108,118,105,110,103,32,109,111,100,101,108,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,37,100,32,116,111,108,32,37,102,10,0,78,68,95,105,100,40,110,112,41,32,61,61,32,105,0,110,101,97,116,111,105,110,105,116,46,99,0,109,97,107,101,71,114,97,112,104,68,97,116,97,0,102,32,60,32,103,114,97,112,104,91,106,93,46,110,101,100,103,101,115,0,100,102,115,67,121,99,108,101,0,109,111,100,101,108,32,37,100,32,115,109,97,114,116,95,105,110,105,116,32,37,100,32,115,116,114,101,115,115,119,116,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,37,100,32,116,111,108,32,37,102,10,0,99,111,110,118,101,114,116,32,103,114,97,112,104,58,32,0,109,97,106,111,114,105,122,97,116,105,111,110,10,0,37,100,32,110,111,100,101,115,32,37,46,50,102,32,115,101,99,10,0,108,101,118,101,108,115,103,97,112,0,108,97,121,111,117,116,32,97,98,111,114,116,101,100,10,0,115,116,114,101,115,115,119,116,0,37,115,32,97,116,116,114,105,98,117,116,101,32,118,97,108,117,101,32,109,117,115,116,32,98,101,32,49,32,111,114,32,50,32,45,32,105,103,110,111,114,105,110,103,10,0,109,111,100,101,108,0,99,105,114,99,117,105,116,0,115,117,98,115,101,116,0,115,104,111,114,116,112,97,116,104,0,109,100,115,0,101,100,103,101,115,32,105,110,32,103,114,97,112,104,32,37,115,32,104,97,118,101,32,110,111,32,108,101,110,32,97,116,116,114,105,98,117,116,101,46,32,72,101,110,99,101,44,32,116,104,101,32,109,100,115,32,109,111,100,101,108,10,0,105,115,32,105,110,97,112,112,114,111,112,114,105,97,116,101,46,32,82,101,118,101,114,116,105,110,103,32,116,111,32,116,104,101,32,115,104,111,114,116,101,115,116,32,112,97,116,104,32,109,111,100,101,108,46,10,0,85,110,107,110,111,119,110,32,118,97,108,117,101,32,37,115,32,102,111,114,32,97,116,116,114,105,98,117,116,101,32,34,109,111,100,101,108,34,32,105,110,32,103,114,97,112,104,32,37,115,32,45,32,105,103,110,111,114,101,100,10,0,109,111,100,101,0,75,75,0,109,97,106,111,114,0,104,105,101,114,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,97,116,116,114,105,98,117,116,101,32,34,109,111,100,101,34,32,105,110,32,103,114,97,112,104,32,37,115,32,45,32,105,103,110,111,114,101,100,10,0,109,97,107,101,83,112,108,105,110,101,58,32,102,97,105,108,101,100,32,116,111,32,109,97,107,101,32,115,112,108,105,110,101,32,101,100,103,101,32,40,37,115,44,37,115,41,10,0,115,112,108,105,110,101,32,37,115,32,37,115,10,0,98,32,61,61,32,110,0,110,101,97,116,111,115,112,108,105,110,101,115,46,99,0,109,97,107,101,95,98,97,114,114,105,101,114,115,0,116,104,101,32,98,111,117,110,100,105,110,103,32,98,111,120,101,115,32,111,102,32,115,111,109,101,32,110,111,100,101,115,32,116,111,117,99,104,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,0,115,111,109,101,32,110,111,100,101,115,32,119,105,116,104,32,109,97,114,103,105,110,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,116,111,117,99,104,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,0,111,114,116,104,111,103,111,110,97,108,32,108,105,110,101,115,0,108,105,110,101,32,115,101,103,109,101,110,116,115,0,112,111,108,121,108,105,110,101,115,0,67,114,101,97,116,105,110,103,32,101,100,103,101,115,32,117,115,105,110,103,32,37,115,10,0,112,111,108,121,108,105,110,101,32,37,115,32,37,115,10,0,109,100,115,77,111,100,101,108,58,32,100,101,108,116,97,32,61,32,37,102,10,0,83,101,116,116,105,110,103,32,117,112,32,115,116,114,101,115,115,32,102,117,110,99,116,105,111,110,0,83,111,108,118,105,110,103,32,109,111,100,101,108,58,32,0,10,102,105,110,97,108,32,101,32,61,32,37,102,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,37,46,50,102,32,115,101,99,10,0,83,99,97,110,110,105,110,103,32,103,114,97,112,104,32,37,115,44,32,37,100,32,110,111,100,101,115,10,0,68,97,109,112,105,110,103,0,100,101,102,97,117,108,116,100,105,115,116,0,32,105,110,32,37,115,32,45,32,115,101,116,116,105,110,103,32,116,111,32,37,46,48,50,102,10,0,98,97,100,32,101,100,103,101,32,108,101,110,32,34,37,115,34,0,83,101,116,116,105,110,103,32,105,110,105,116,105,97,108,32,112,111,115,105,116,105,111,110,115,10,0,115,116,97,114,116,61,37,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,119,105,116,104,32,109,111,100,101,61,115,101,108,102,32,45,32,105,103,110,111,114,101,100,10,0,83,101,116,116,105,110,103,32,117,112,32,115,112,114,105,110,103,32,109,111,100,101,108,58,32,0,37,46,50,102,32,115,101,99,10,0,10,102,105,110,97,108,32,101,32,61,32,37,102,0,33,0,32,37,100,37,115,32,105,116,101,114,97,116,105,111,110,115,32,37,46,50,102,32,115,101,99,10,0,77,97,120,46,32,105,116,101,114,97,116,105,111,110,115,32,40,37,100,41,32,114,101,97,99,104,101,100,32,111,110,32,103,114,97,112,104,32,37,115,10,0,37,115,32,37,46,51,102,10,0,37,46,51,102,32,0,78,68,95,104,101,97,112,105,110,100,101,120,40,118,41,32,60,32,48,0,115,116,117,102,102,46,99,0,110,101,97,116,111,95,101,110,113,117,101,117,101,0,67,97,108,99,117,108,97,116,105,110,103,32,115,104,111,114,116,101,115,116,32,112,97,116,104,115,58,32,0,115,112,101,99,105,102,105,101,100,32,114,111,111,116,32,110,111,100,101,32,34,37,115,34,32,119,97,115,32,110,111,116,32,102,111,117,110,100,46,0,85,115,105,110,103,32,100,101,102,97,117,108,116,32,99,97,108,99,117,108,97,116,105,111,110,32,102,111,114,32,114,111,111,116,32,110,111,100,101,10,0,114,101,112,111,115,105,116,105,111,110,32,37,115,10,0,37,115,32,58,32,37,102,32,37,102,10,0,37,115,32,58,32,37,102,32,37,102,32,37,102,32,37,102,10,0,32,32,0,71,114,97,112,104,32,37,115,32,104,97,115,32,97,114,114,97,121,32,112,97,99,107,105,110,103,32,119,105,116,104,32,117,115,101,114,32,118,97,108,117,101,115,32,98,117,116,32,110,111,32,34,115,111,114,116,118,34,32,97,116,116,114,105,98,117,116,101,115,32,97,114,101,32,100,101,102,105,110,101,100,46,0,112,105,110,0,87,97,114,110,105,110,103,58,32,110,111,100,101,32,37,115,44,32,112,111,115,105,116,105,111,110,32,37,115,44,32,101,120,112,101,99,116,101,100,32,116,119,111,32,102,108,111,97,116,115,10,0,99,111,111,114,100,115,0,108,97,121,111,117,116,32,37,115,10,0,101,110,100,32,37,115,10,0,105,100,120,32,61,61,32,115,122,0,108,97,121,111,117,116,46,99,0,101,120,112,97,110,100,67,108,117,115,116,101,114,0,105,32,61,61,32,100,101,103,0,103,101,116,69,100,103,101,76,105,115,116,0,95,100,103,95,37,100,0,100,101,114,105,118,101,32,103,114,97,112,104,32,37,115,32,111,102,32,37,115,10,0,110,111,100,101,32,34,37,115,34,32,105,115,32,99,111,110,116,97,105,110,101,100,32,105,110,32,116,119,111,32,110,111,110,45,99,111,109,112,97,114,97,98,108,101,32,99,108,117,115,116,101,114,115,32,34,37,115,34,32,97,110,100,32,34,37,115,34,10,0,95,112,111,114,116,95,37,115,95,37,115,95,37,115,95,37,108,100,0,95,112,111,114,116,95,37,115,95,40,37,100,41,95,40,37,100,41,95,37,108,100,0,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,37,99,0,103,114,97,112,104,32,37,115,44,32,99,111,111,114,100,32,37,115,44,32,101,120,112,101,99,116,101,100,32,102,111,117,114,32,100,111,117,98,108,101,115,10,0,115,112,108,105,110,101,115,32,97,110,100,32,99,108,117,115,116,101,114,32,101,100,103,101,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,45,32,117,115,105,110,103,32,108,105,110,101,32,115,101,103,109,101,110,116,115,10,0,109,97,120,105,116,101,114,0,84,48,0,102,100,112,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,116,97,114,116,61,115,101,108,102,32,45,32,105,103,110,111,114,105,110,103,10,0,120,76,97,121,111,117,116,32,0,57,58,112,114,105,115,109,0,116,114,105,101,115,32,61,32,37,100,44,32,109,111,100,101,32,61,32,37,115,10,0,100,101,114,105,118,101,100,0,105,110,102,111,0,115,102,100,112,32,111,110,108,121,32,115,117,112,112,111,114,116,115,32,115,116,97,114,116,61,114,97,110,100,111,109,10,0,75,0,114,101,112,117,108,115,105,118,101,102,111,114,99,101,0,108,101,118,101,108,115,0,115,109,111,111,116,104,105,110,103,0,113,117,97,100,116,114,101,101,0,98,101,97,117,116,105,102,121,0,111,118,101,114,108,97,112,95,115,104,114,105,110,107,0,114,111,116,97,116,105,111,110,0,108,97,98,101,108,95,115,99,104,101,109,101,0,108,97,98,101,108,95,115,99,104,101,109,101,32,61,32,37,100,32,62,32,52,32,58,32,105,103,110,111,114,105,110,103,10,0,102,97,115,116,0,97,118,103,95,100,105,115,116,0,103,114,97,112,104,95,100,105,115,116,0,112,111,119,101,114,95,100,105,115,116,0,115,112,114,105,110,103,0,100,105,109,101,110,0,100,105,109,0,115,112,114,105,110,103,95,101,108,101,99,116,114,105,99,97,108,95,99,111,110,116,114,111,108,58,10,0,32,32,114,101,112,117,108,115,105,118,101,32,97,110,100,32,97,116,116,114,97,99,116,105,118,101,32,101,120,112,111,110,101,110,116,115,58,32,37,46,48,51,102,32,37,46,48,51,102,10,0,32,32,114,97,110,100,111,109,32,115,116,97,114,116,32,37,100,32,115,101,101,100,32,37,100,10,0,32,32,75,32,58,32,37,46,48,51,102,32,67,32,58,32,37,46,48,51,102,10,0,32,32,109,97,120,32,108,101,118,101,108,115,32,37,100,32,99,111,97,114,115,101,110,95,115,99,104,101,109,101,32,37,100,32,99,111,97,114,115,101,110,95,110,111,100,101,32,37,100,10,0,32,32,113,117,97,100,116,114,101,101,32,115,105,122,101,32,37,100,32,109,97,120,95,108,101,118,101,108,32,37,100,10,0,32,32,66,97,114,110,101,115,45,72,117,116,116,32,99,111,110,115,116,97,110,116,32,37,46,48,51,102,32,116,111,108,101,114,97,110,99,101,32,32,37,46,48,51,102,32,109,97,120,105,116,101,114,32,37,100,10,0,32,32,99,111,111,108,105,110,103,32,37,46,48,51,102,32,115,116,101,112,32,115,105,122,101,32,32,37,46,48,51,102,32,97,100,97,112,116,105,118,101,32,37,100,10,0,32,32,98,101,97,117,116,105,102,121,95,108,101,97,118,101,115,32,37,100,32,110,111,100,101,32,119,101,105,103,104,116,115,32,37,100,32,114,111,116,97,116,105,111,110,32,37,46,48,51,102,10,0,32,32,115,109,111,111,116,104,105,110,103,32,37,115,32,111,118,101,114,108,97,112,32,37,100,32,105,110,105,116,105,97,108,95,115,99,97,108,105,110,103,32,37,46,48,51,102,32,100,111,95,115,104,114,105,110,107,105,110,103,32,37,100,10,0,32,32,111,99,116,114,101,101,32,115,99,104,101,109,101,32,37,115,32,109,101,116,104,111,100,32,37,115,10,0,32,32,101,100,103,101,95,108,97,98,101,108,105,110,103,95,115,99,104,101,109,101,32,37,100,10,0,83,80,82,73,78,71,95,69,76,69,67,84,82,73,67,65,76,0,83,80,82],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+81944);allocate([73,78,71,95,77,65,88,69,78,84,0,83,84,82,69,83,83,95,77,65,88,69,78,84,0,83,84,82,69,83,83,95,65,80,80,82,79,88,0,83,84,82,69,83,83,0,85,78,73,70,79,82,77,95,83,84,82,69,83,83,0,70,85,76,76,95,83,84,82,69,83,83,0,78,79,78,69,0,78,79,82,77,65,76,0,70,65,83,84,0,72,89,66,82,73,68,0,83,84,82,69,83,83,95,77,65,74,79,82,73,90,65,84,73,79,78,95,71,82,65,80,72,95,68,73,83,84,0,83,84,82,69,83,83,95,77,65,74,79,82,73,90,65,84,73,79,78,95,65,86,71,95,68,73,83,84,0,83,84,82,69,83,83,95,77,65,74,79,82,73,90,65,84,73,79,78,95,80,79,87,69,82,95,68,73,83,84,0,83,80,82,73,78,71,0,84,82,73,65,78,71,76,69,0,82,78,71,0,13,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,116,101,114,32,61,32,37,100,44,32,115,116,101,112,32,61,32,37,102,32,70,110,111,114,109,32,61,32,37,102,32,110,122,32,61,32,37,100,32,32,75,32,61,32,37,102,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,115,112,114,105,110,103,95,101,108,101,99,116,114,105,99,97,108,95,101,109,98,101,100,100,105,110,103,95,115,108,111,119,0,100,109,101,97,110,32,61,32,37,102,44,32,114,104,111,32,61,32,37,102,10,0,115,101,110,100,32,114,97,110,100,111,109,32,99,111,111,114,100,105,110,97,116,101,115,10,0,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,61,32,37,102,10,0,81,85,65,68,95,84,82,69,69,95,72,89,66,82,73,68,44,32,115,105,122,101,32,108,97,114,103,101,114,32,116,104,97,110,32,37,100,44,32,115,119,105,116,99,104,32,116,111,32,102,97,115,116,32,113,117,97,100,116,114,101,101,0,99,116,114,108,45,62,111,118,101,114,108,97,112,61,37,100,10,0,37,100,32,37,100,10,0,117,110,105,102,111,114,109,95,115,116,114,101,115,115,46,99,0,85,110,105,102,111,114,109,83,116,114,101,115,115,83,109,111,111,116,104,101,114,95,110,101,119,0,83,112,97,114,115,101,77,97,116,114,105,120,95,105,115,95,115,121,109,109,101,116,114,105,99,40,66,44,32,70,65,76,83,69,41,0,117,110,105,102,111,114,109,95,115,116,114,101,115,115,0,124,101,100,103,101,108,97,98,101,108,124,0,108,101,110,0,110,111,114,109,97,108,105,122,101,0,111,118,101,114,108,97,112,0,79,118,101,114,108,97,112,32,118,97,108,117,101,32,34,37,115,34,32,117,110,115,117,112,112,111,114,116,101,100,32,45,32,105,103,110,111,114,101,100,10,0,85,110,114,101,99,111,103,110,105,122,101,100,32,111,118,101,114,108,97,112,32,118,97,108,117,101,32,34,37,115,34,32,45,32,117,115,105,110,103,32,102,97,108,115,101,10,0,86,111,114,111,110,111,105,0,111,118,101,114,108,97,112,58,32,37,115,32,118,97,108,117,101,32,37,100,32,115,99,97,108,105,110,103,32,37,46,48,52,102,10,0,111,118,101,114,108,97,112,95,115,99,97,108,105,110,103,0,118,111,114,111,110,111,105,0,115,99,97,108,105,110,103,0,118,112,115,99,0,105,112,115,101,112,0,111,115,99,97,108,101,0,111,108,100,32,115,99,97,108,105,110,103,0,115,99,97,108,101,120,121,0,120,32,97,110,100,32,121,32,115,99,97,108,105,110,103,0,111,114,116,104,111,0,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,111,114,116,104,111,95,121,120,0,111,114,116,104,111,120,121,0,120,121,32,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,111,114,116,104,111,121,120,0,121,120,32,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,112,111,114,116,104,111,0,112,115,101,117,100,111,45,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,112,111,114,116,104,111,95,121,120,0,112,111,114,116,104,111,120,121,0,120,121,32,112,115,101,117,100,111,45,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,112,111,114,116,104,111,121,120,0,121,120,32,112,115,101,117,100,111,45,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,112,114,105,115,109,0,65,100,106,117,115,116,105,110,103,32,37,115,32,117,115,105,110,103,32,37,115,10,0,85,110,104,97,110,100,108,101,100,32,97,100,106,117,115,116,32,111,112,116,105,111,110,32,37,115,10,0,78,117,109,98,101,114,32,111,102,32,105,116,101,114,97,116,105,111,110,115,32,61,32,37,100,10,0,78,117,109,98,101,114,32,111,102,32,105,110,99,114,101,97,115,101,115,32,61,32,37,100,10,0,111,118,101,114,108,97,112,32,91,37,100,93,32,58,32,37,100,10,0,118,111,114,111,95,109,97,114,103,105,110,0,115,101,112,0,101,115,101,112,0,78,111,100,101,32,115,101,112,97,114,97,116,105,111,110,58,32,97,100,100,61,37,100,32,40,37,102,44,37,102,41,10,0,37,102,44,37,102,0,115,99,97,108,101,32,61,32,40,37,46,48,51,102,44,37,46,48,51,102,41,10,0,69,100,103,101,32,115,101,112,97,114,97,116,105,111,110,58,32,97,100,100,61,37,100,32,40,37,102,44,37,102,41,10,0,67,97,108,99,117,108,97,116,105,110,103,32,99,105,114,99,117,105,116,32,109,111,100,101,108,0,99,111,110,106,117,103,97,116,101,95,103,114,97,100,105,101,110,116,58,32,117,110,101,120,112,101,99,116,101,100,32,108,101,110,103,116,104,32,48,32,118,101,99,116,111,114,10,0,67,97,108,99,117,108,97,116,105,110,103,32,115,117,98,115,101,116,32,109,111,100,101,108,0,103,114,97,112,104,32,105,115,32,100,105,115,99,111,110,110,101,99,116,101,100,46,32,72,101,110,99,101,44,32,116,104,101,32,99,105,114,99,117,105,116,32,109,111,100,101,108,10,0,105,115,32,117,110,100,101,102,105,110,101,100,46,32,82,101,118,101,114,116,105,110,103,32,116,111,32,116,104,101,32,115,104,111,114,116,101,115,116,32,112,97,116,104,32,109,111,100,101,108,46,10,0,67,97,108,99,117,108,97,116,105,110,103,32,77,68,83,32,109,111,100,101,108,0,67,97,108,99,117,108,97,116,105,110,103,32,115,104,111,114,116,101,115,116,32,112,97,116,104,115,0,58,32,37,46,50,102,32,115,101,99,10,0,83,101,116,116,105,110,103,32,105,110,105,116,105,97,108,32,112,111,115,105,116,105,111,110,115,0,58,32,37,46,50,102,32,115,101,99,0,99,103,0,100,101,108,116,97,32,60,61,32,48,120,70,70,70,70,0,99,111,110,115,116,114,97,105,110,116,46,99,0,109,107,78,67,111,110,115,116,114,97,105,110,116,71,0,118,103,0,99,111,109,112,114,101,115,115,32,37,103,32,10,0,115,99,97,108,101,32,98,121,32,37,103,44,37,103,32,10,0,98,101,115,116,99,111,115,116,32,60,32,72,85,71,69,95,86,65,76,0,99,111,109,112,117,116,101,83,99,97,108,101,88,89,0,71,114,97,112,104,118,105,122,32,98,117,105,108,116,32,119,105,116,104,111,117,116,32,97,110,121,32,116,114,105,97,110,103,117,108,97,116,105,111,110,32,108,105,98,114,97,114,121,10,0,100,101,108,97,117,110,97,121,95,116,114,105,97,110,103,117,108,97,116,105,111,110,58,32,37,115,10,0,100,101,108,97,117,110,97,121,95,116,114,105,58,32,37,115,10,0,116,114,121,105,110,103,32,116,111,32,100,101,108,101,116,101,32,97,32,110,111,110,45,108,105,110,101,10,0,10,105,110,116,101,114,115,101,99,116,105,111,110,32,97,116,32,37,46,51,102,32,37,46,51,102,10,0,115,101,103,35,37,100,32,58,32,40,37,46,51,102,44,32,37,46,51,102,41,32,40,37,46,51,102,44,32,37,46,51,102,41,10,0,114,101,109,111,118,101,95,111,118,101,114,108,97,112,58,32,71,114,97,112,104,118,105,122,32,110,111,116,32,98,117,105,108,116,32,119,105,116,104,32,116,114,105,97,110,103,117,108,97,116,105,111,110,32,108,105,98,114,97,114,121,10,0,109,97,107,101,65,100,100,80,111,108,121,58,32,117,110,107,110,111,119,110,32,115,104,97,112,101,32,116,121,112,101,32,37,115,10,0,109,97,107,101,80,111,108,121,58,32,117,110,107,110,111,119,110,32,115,104,97,112,101,32,116,121,112,101,32,37,115,10,0,120,33,61,78,85,76,76,0,115,109,97,114,116,95,105,110,105,95,120,46,99,0,73,77,68,83,95,103,105,118,101,110,95,100,105,109,0,105,108,108,45,99,111,110,100,105,116,105,111,110,101,100,0,114,111,111,116,32,61,32,37,115,32,109,97,120,32,115,116,101,112,115,32,116,111,32,114,111,111,116,32,61,32,37,100,10,0,116,119,111,112,105,58,32,117,115,101,32,111,102,32,119,101,105,103,104,116,61,48,32,99,114,101,97,116,101,115,32,100,105,115,99,111,110,110,101,99,116,101,100,32,99,111,109,112,111,110,101,110,116,46,10,0,82,97,110,107,32,115,101,112,97,114,97,116,105,111,110,32,61,32,0,37,46,48,51,108,102,32,0,97,114,101,97,0,105,110,115,101,116,0,37,115,32,99,111,111,114,100,32,37,46,53,103,32,37,46,53,103,32,104,116,32,37,102,32,119,105,100,116,104,32,37,102,10,0,37,46,48,51,102,0,114,101,99,32,37,102,32,37,102,32,37,102,32,37,102,10,0,37,102,32,45,32,37,102,32,37,102,32,37,102,32,37,102,32,61,32,37,102,32,40,37,102,32,37,102,32,37,102,32,37,102,41,10,0,116,114,121,105,110,103,32,116,111,32,97,100,100,32,116,111,32,114,101,99,116,32,123,37,102,32,43,47,45,32,37,102,44,32,37,102,32,43,47,45,32,37,102,125,10,0,116,111,116,97,108,32,97,100,100,101,100,32,115,111,32,102,97,114,32,61,32,37,100,10,0,97,100,100,105,110,103,32,37,100,32,105,116,101,109,115,44,32,116,111,116,97,108,32,97,114,101,97,32,61,32,37,102,44,32,119,32,61,32,37,102,44,32,97,114,101,97,47,119,61,37,102,10,0,99,111,109,112,111,117,110,100,69,100,103,101,115,58,32,99,111,117,108,100,32,110,111,116,32,99,111,110,115,116,114,117,99,116,32,111,98,115,116,97,99,108,101,115,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,0,99,111,109,112,111,117,110,100,69,100,103,101,115,58,32,110,111,100,101,115,32,116,111,117,99,104,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,0,112,97,99,107,32,118,97,108,117,101,32,37,100,32,105,115,32,115,109,97,108,108,101,114,32,116,104,97,110,32,101,115,101,112,32,40,37,46,48,51,102,44,37,46,48,51,102,41,10,0,115,101,112,32,118,97,108,117,101,32,40,37,46,48,51,102,44,37,46,48,51,102,41,32,105,115,32,115,109,97,108,108,101,114,32,116,104,97,110,32,101,115,101,112,32,40,37,46,48,51,102,44,37,46,48,51,102,41,10,0,99,99,37,115,95,37,100,0,99,99,37,115,43,37,100,0,99,95,99,110,116,32,61,61,32,48,0,99,111,109,112,46,99,0,102,105,110,100,67,67,111,109,112,0,103,114,105,100,40,37,100,44,37,100,41,58,32,37,115,10,0,119,103,116,32,62,32,48,0,81,117,97,100,84,114,101,101,46,99,0,81,117,97,100,84,114,101,101,95,114,101,112,117,108,115,105,118,101,95,102,111,114,99,101,95,97,99,99,117,109,117,108,97,116,101,0,113,116,50,45,62,110,32,62,32,48,0,113,116,49,45,62,110,32,62,32,48,32,38,38,32,113,116,50,45,62,110,32,62,32,48,0,81,117,97,100,84,114,101,101,95,114,101,112,117,108,115,105,118,101,95,102,111,114,99,101,95,105,110,116,101,114,97,99,116,0,100,105,115,116,32,62,32,48,0,33,40,113,45,62,108,41,0,81,117,97,100,84,114,101,101,95,97,100,100,95,105,110,116,101,114,110,97,108,0,105,105,32,60,32,49,60,60,100,105,109,32,38,38,32,105,105,32,62,61,32,48,0,113,45,62,113,116,115,91,105,105,93,0,113,45,62,110,32,61,61,32,49,0,33,40,113,45,62,113,116,115,41,0,113,45,62,108,0,119,105,100,116,104,32,62,32,48,0,81,117,97,100,84,114,101,101,95,110,101,119,0,65,45,62,102,111,114,109,97,116,32,61,61,32,70,79,82,77,65,84,95,67,83,82,0,83,112,97,114,115,101,77,97,116,114,105,120,46,99,0,83,112,97,114,115,101,77,97,116,114,105,120,95,116,114,97,110,115,112,111,115,101,0,65,32,38,38,32,66,0,83,112,97,114,115,101,77,97,116,114,105,120,95,97,100,100,0,65,45,62,102,111,114,109,97,116,32,61,61,32,66,45,62,102,111,114,109,97,116,32,38,38,32,65,45,62,102,111,114,109,97,116,32,61,61,32,70,79,82,77,65,84,95,67,83,82,0,65,45,62,116,121,112,101,32,61,61,32,66,45,62,116,121,112,101,0,83,112,97,114,115,101,77,97,116,114,105,120,95,105,115,95,115,121,109,109,101,116,114,105,99,0,65,45,62,102,111,114,109,97,116,32,61,61,32,70,79,82,77,65,84,95,67,79,79,82,68,0,83,112,97,114,115,101,77,97,116,114,105,120,95,102,114,111,109,95,99,111,111,114,100,105,110,97,116,101,95,102,111,114,109,97,116,0,109,32,62,32,48,32,38,38,32,110,32,62,32,48,32,38,38,32,110,122,32,62,61,32,48,0,83,112,97,114,115,101,77,97,116,114,105,120,95,102,114,111,109,95,99,111,111,114,100,105,110,97,116,101,95,97,114,114,97,121,115,95,105,110,116,101,114,110,97,108,0,65,0,106,97,91,109,97,115,107,91,106,97,91,106,93,93,93,32,61,61,32,106,97,91,106,93,0,83,112,97,114,115,101,77,97,116,114,105,120,95,115,117,109,95,114,101,112,101,97,116,95,101,110,116,114,105,101,115,0,105,100,32,60,32,110,42,40,121,109,97,120,45,121,109,105,110,43,49,41,0,106,97,91,109,97,115,107,91,105,100,93,93,32,61,61,32,106,97,91,106,93,0,83,112,97,114,115,101,77,97,116,114,105,120,95,109,117,108,116,105,112,108,121,95,100,101,110,115,101,50,0,65,45,62,116,121,112,101,32,61,61,32,77,65,84,82,73,88,95,84,89,80,69,95,82,69,65,76,0,83,112,97,114,115,101,77,97,116,114,105,120,95,109,117,108,116,105,112,108,121,95,118,101,99,116,111,114,0,65,45,62,116,121,112,101,32,61,61,32,77,65,84,82,73,88,95,84,89,80,69,95,82,69,65,76,32,124,124,32,65,45,62,116,121,112,101,32,61,61,32,77,65,84,82,73,88,95,84,89,80,69,95,73,78,84,69,71,69,82,0,83,112,97,114,115,101,77,97,116,114,105,120,95,109,117,108,116,105,112,108,121,95,100,101,110,115,101,49,0,83,112,97,114,115,101,77,97,116,114,105,120,95,109,117,108,116,105,112,108,121,0,106,99,91,109,97,115,107,91,106,98,91,107,93,93,93,32,61,61,32,106,98,91,107,93,0,83,112,97,114,115,101,77,97,116,114,105,120,95,109,117,108,116,105,112,108,121,51,0,106,100,91,109,97,115,107,91,106,99,91,107,93,93,93,32,61,61,32,106,99,91,107,93,0,83,112,97,114,115,101,77,97,116,114,105,120,95,99,111,111,114,100,105,110,97,116,101,95,102,111,114,109,95,97,100,100,95,101,110,116,114,105,101,115,0,83,112,97,114,115,101,77,97,116,114,105,120,95,100,105,118,105,100,101,95,114,111,119,95,98,121,95,100,101,103,114,101,101,0,110,32,62,32,49,0,103,101,110,101,114,97,108,46,99,0,105,114,97,110,100,0,111,110,101,98,108,111,99,107,0,109,105,110,100,105,115,116,0,97,114,116,105,99,117,108,97,116,105,111,110,95,112,111,115,0,114,111,111,116,0,80,114,105,111,114,105,116,121,81,117,101,117,101,46,99,0,80,114,105,111,114,105,116,121,81,117,101,117,101,95,112,117,115,104,0,103,97,105,110,32,60,61,32,113,45,62,110,103,97,105,110,0,83,112,97,114,115,101,77,97,116,114,105,120,95,105,115,95,115,121,109,109,101,116,114,105,99,40,65,44,32,70,65,76,83,69,41,0,112,111,115,116,95,112,114,111,99,101,115,115,46,99,0,105,100,101,97,108,95,100,105,115,116,97,110,99,101,95,109,97,116,114,105,120,0,108,101,110,32,62,32,48,0,83,116,114,101,115,115,77,97,106,111,114,105,122,97,116,105,111,110,83,109,111,111,116,104,101,114,50,95,110,101,119,0,110,122,32,62,32,48,0,105,100,101,97,108,95,100,105,115,116,95,115,99,104,101,109,101,32,118,97,108,117,101,32,119,114,111,110,103,0,83,112,97,114,115,101,77,97,116,114,105,120,95,105,115,95,115,121,109,109,101,116,114,105,99,40,65,44,32,70,65,76,83,69,41,32,38,38,32,65,45,62,116,121,112,101,32,61,61,32,77,65,84,82,73,88,95,84,89,80,69,95,82,69,65,76,0,83,112,97,114,115,101,83,116,114,101,115,115,77,97,106,111,114,105,122,97,116,105,111,110,83,109,111,111,116,104,101,114,95,110,101,119,0,105,100,105,97,103,32,62,61,32,48,0,83,116,114,101,115,115,77,97,106,111,114,105,122,97,116,105,111,110,83,109,111,111,116,104,101,114,95,115,109,111,111,116,104,0,40,33,106,99,110,41,32,38,38,32,40,33,118,97,108,41,0,103,101,116,95,101,100,103,101,95,108,97,98,101,108,95,109,97,116,114,105,120,0,84,114,105,97,110,103,108,101,83,109,111,111,116,104,101,114,95,110,101,119,0,106,100,105,97,103,32,62,61,32,48,0,83,112,114,105,110,103,83,109,111,111,116,104,101,114,95,110,101,119,0,33,102,108,97,103,0,83,112,114,105,110,103,83,109,111,111,116,104,101,114,95,115,109,111,111,116,104,0,110,101,105,103,104,98,61,37,100,10,0,114,111,111,116,32,61,32,37,115,10,0,95,98,108,111,99,107,95,37,100,0,115,45,62,115,122,32,62,32,48,0,98,108,111,99,107,116,114,101,101,46,99,0,112,111,112,0,97,99,116,117,97,108,0,110,111,100,101,108,105,115,116,46,99,0,105,110,115,101,114,116,78,111,100,101,108,105,115,116,0,95,115,112,97,110,95,37,100,0,95,99,108,111,110,101,95,37,100,0,105,112,0,100,101,103,108,105,115,116,46,99,0,114,101,109,111,118,101,68,101,103,108,105,115,116,0,69,114,114,111,114,0,87,97,114,110,105,110,103,0,37,115,58,32,0,117,115,101,114,111,117,116,58,32,99,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,10,0,95,65,71,95,115,116,114,100,97,116,97,0,95,65,71,95,100,97,116,97,100,105,99,116,0,97,103,100,105,99,116,111,102,58,32,117,110,107,110,111,119,110,32,107,105,110,100,32,37,100,10,0,37,99,37,108,100,0,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,102,97,105,108,117,114,101,0,97,103,100,101,108,101,116,101,32,111,110,32,119,114,111,110,103,32,103,114,97,112,104,0,95,65,71,95,112,101,110,100,105,110,103,0,97,103,114,101,99,111,114,100,95,99,97,108,108,98,97,99,107,32,111,102,32,97,32,98,97,100,32,111,98,106,101,99,116,0,112,101,110,100,32,100,105,99,116,111,102,32,97,32,98,97,100,32,111,98,106,101,99,116,0,109,111,118,101,32,116,111,32,102,114,111,110,116,32,108,111,99,107,32,105,110,99,111,110,115,105,115,116,101,110,99,121,0,92,92,0,102,97,116,97,108,32,102,108,101,120,32,115,99,97,110,110,101,114,32,105,110,116,101,114,110,97,108,32,101,114,114,111,114,45,45,110,111,32,97,99,116,105,111,110,32,102,111,117,110,100,0,37,115,10,0,102,97,116,97,108,32,102,108,101,120,32,115,99,97,110,110,101,114,32,105,110,116,101,114,110,97,108,32,101,114,114,111,114,45,45,101,110,100,32,111,102,32,98,117,102,102,101,114,32,109,105,115,115,101,100,0,102,97,116,97,108,32,101,114,114,111,114,32,45,32,115,99,97,110,110,101,114,32,105,110,112,117,116,32,98,117,102,102,101,114,32,111,118,101,114,102,108,111,119,0,111,117,116,32,111,102,32,100,121,110,97,109,105,99,32,109,101,109,111,114,121,32,105,110,32,97,97,103,95,103,101,116,95,110,101,120,116,95,98,117,102,102,101,114,40,41,0,105,110,112,117,116,0,115,121,110,116,97,120,32,97,109,98,105,103,117,105,116,121,32,45,32,98,97,100,108,121,32,100,101,108,105,109,105,116,101,100,32,110,117,109,98,101,114,32,39,0,39,32,105,110,32,108,105,110,101,32,37,100,32,111,102,32,0,32,115,112,108,105,116,115,32,105,110,116,111,32,116,119,111,32,116,111,107,101,110,115,10,0,37,115,0,108,105,110,101,0,37,100,32,37,49,91,34,93,37,110,0,111,117,116,32,111,102,32,100,121,110,97,109,105,99,32,109,101,109,111,114,121,32,105,110,32,97,97,103,95,99,114,101,97,116,101,95,98,117,102,102,101,114,40,41,0,111,117,116,32,111,102,32,100,121,110,97,109,105,99,32,109,101,109,111,114,121,32,105,110,32,97,97,103,101,110,115,117,114,101,95,98,117,102,102,101,114,95,115,116,97,99,107,40,41,0,58,32,0,32,105,110,32,108,105,110,101,32,37,100,0,32,110,101,97,114,32,39,0,32,115,99,97,110,110,105,110,103,32,97,32,113,117,111,116,101,100,32,115,116,114,105,110,103,32,40,109,105,115,115,105,110,103,32,101,110,100,113,117,111,116,101,63,32,108,111,110,103,101,114,32,116,104,97,110,32,37,100,63,41,0,10,83,116,114,105,110,103,32,115,116,97,114,116,105,110,103,58,34,0,32,115,99,97,110,110,105,110,103,32,97,32,72,84,77,76,32,115,116,114,105,110,103,32,40,109,105,115,115,105,110,103,32,39,62,39,63,32,98,97,100,32,110,101,115,116,105,110,103,63,32,108,111,110,103,101,114,32,116,104,97,110,32,37,100,63,41,0,10,83,116,114,105,110,103,32,115,116,97,114,116,105,110,103,58,60,0,32,115,99,97,110,110,105,110,103,32,97,32,47,42,46,46,46,42,47,32,99,111,109,109,101,110,116,32,40,109,105,115,115,105,110,103,32,39,42,47,63,32,108,111,110,103,101,114,32,116,104,97,110,32,37,100,63,41,0,102,108,101,120,32,115,99,97,110,110,101,114,32,112,117,115,104,45,98,97,99,107,32,111,118,101,114,102,108,111,119,0,34,34,0,115,116,114,105,99,116,0,108,105,110,101,108,101,110,103,116,104,0,59,10,0,32,91,107,101,121,61,0,93,0,32,91,0,44,10,0,61,0,95,37,108,100,95,83,85,83,80,69,67,84,0,100,105,0,115,116,114,105,99,116,32,0,123,10,0,93,59,10,0,18,238,238,20,9,3,238,254,238,238,238,1,238,238,238,1,238,238,10,254,238,19,25,21,238,19,1,238,238,238,238,11,17,238,238,238,238,238,238,238,238,238,1,238,238,22,9,1,1,29,15,23,238,238,26,23,27,238,238,28,238,238,238,238,1,25,251,238,238,238,1,238,16,238,238,30,238,238,238,238,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,23,17,2,2,2,2,2,2,2,2,2,2,2,2,2,18,16,2,19,2,2,22,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,20,2,21,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,2,15,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,3,4,5,6,7,8,9,10,11,12,13,11,3,4,5,15,7,3,12,13,6,12,13,14,12,13,26,21,22,0,1,0,3,7,14,6,15,8,12,13,18,19,42,16,17,9,16,47,48,17,50,23,19,13,20,18,46,18,20,65,19,50,19,44,64,42,66,25,44,66,70,34,12,13,14,35,15,9,16,17,10,16,17,201,16,17,45,69,70,252,1,6,246,15,7,246,36,2,16,17,47,48,54,77,78,40,38,59,60,42,54,49,57,61,63,47,58,64,216,68,48,62,37,55,67,53,75,43,56,73,76,0,3,9,0,0,0,1,14,2,11,12,8,35,36,37,54,59,61,0,13,16,18,27,22,28,18,39,50,34,23,51,30,60,6,7,53,5,15,17,20,24,41,0,19,41,0,0,0,0,0,55,21,40,29,30,0,33,38,52,31,48,62,25,44,0,27,0,32,26,42,0,43,58,46,47,0,49,56,57,45,0,2,2,1,0,3,3,1,0,1,0,1,1,1,0,2,1,1,0,2,2,3,1,1,0,0,5,0,1,3,1,3,5,3,1,1,1,1,2,0,1,0,4,2,0,2,1,1,3,2,1,0,3,2,1,0,1,1,0,1,1,1,3,0,24,25,25,25,26,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,36,36,38,39,37,37,40,40,41,41,41,42,42,43,43,43,44,44,45,45,46,47,47,48,49,49,50,51,52,54,53,55,55,55,56,56,56,57,57,58,58,238,238,255,238,238,238,238,238,238,31,32,238,0,239,238,238,238,12,238,238,238,8,13,238,238,238,248,238,238,238,238,238,238,245,238,255,3,8,4,33,5,11,18,19,39,20,21,22,41,50,65,23,24,25,26,44,51,52,66,71,72,27,74,28,29,46,30,79,31,32,107,101,121,0,97,116,116,114,105,98,117,116,101,32,109,97,99,114,111,115,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,37,115,58,37,115,0,67,111,117,108,100,32,110,111,116,32,111,112,101,110,32,34,37,115,34,32,102,111,114,32,119,114,105,116,105,110,103,32,58,32,37,115,10,0,78,111,32,108,105,98,122,32,115,117,112,112,111,114,116,46,10,0,46,37,100,0,110,111,110,97,109,101,46,103,118,0,103,118,119,114,105,116,101,95,110,111,95,122,32,112,114,111,98,108,101,109,32,37,100,10,0,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,102,97,105,108,117,114,101,10,0,78,111,32,108,105,98,122,32,115,117,112,112,111,114,116,10,0,103,118,112,114,105,110,116,102,58,32,37,115,10,0,45,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,46,57,57,0,103,114,97,112,104,118,105,122,0,50,46,52,48,46,49,0,50,48,49,54,49,50,50,53,46,48,51,48,52,0,114,101,110,100,101,114,0,100,101,118,105,99,101,0,108,111,97,100,105,109,97,103,101,0,100,121,110,97,109,105,99,32,108,111,97,100,105,110,103,32,110,111,116,32,97,118,97,105,108,97,98,108,101,10,0,85,115,105,110,103,32,37,115,58,32,37,115,58,37,115,10,0,103,118,117,115,101,114,115,104,97,112,101,46,99,0,103,118,117,115,101,114,115,104,97,112,101,95,102,105,110,100,0,103,118,117,115,101,114,115,104,97,112,101,95,102,105,108,101,95,97,99,99,101,115,115,0,70,105,108,101,110,97,109,101,32,34,37,115,34,32,105,115,32,117,110,115,97,102,101,10,0,37,115,32,119,104,105,108,101,32,111,112,101,110,105,110,103,32,37,115,10,0,117,115,45,62,102,0,103,118,117,115,101,114,115,104,97,112,101,95,111,112,101,110,0,34,37,115,34,32,119,97,115,32,110,111,116,32,102,111,117,110,100,32,97,115,32,97,32,102,105,108,101,32,111,114,32,97,115,32,97,32,115,104,97,112,101,32,108,105,98,114,97,114,121,32,109,101,109,98,101,114,10,0,47,77,101,100,105,97,66,111,120,0,40,91,97,45,122,93,91,97,45,122,65,45,90,93,42,41,61,34,40,91,94,34,93,42,41,34,0,99,97,110,110,111,116,32,99,111,109,112,105,108,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,37,115,0,37,108,102,37,50,115,0,112,116,0,118,105,101,119,66,111,120,0,37,108,102,32,37,108,102,32,37,108,102,32,37,108,102,0,105,110,0,112,120,0,112,99,0,34,0,99,109,0,109,109,0,37,37,66,111,117,110,100,105,110,103,66,111,120,58,0,1,208,209,210,211,212,213,214,215,216,217,0,60,115,118,103,0,87,69,66,80,0,119,101,98,112,0,40,108,105,98,41,0,137,80,78,71,13,10,26,10,0,112,110,103,0,37,33,80,83,45,65,100,111,98,101,45,0,66,77,0,98,109,112,0,71,73,70,56,0,103,105,102,0,255,216,255,224,0,106,112,101,103,0,37,80,68,70,45,0,112,100,102,0,197,208,211,198,0,101,112,115,0,60,63,120,109,108,0,120,109,108,0,82,73,70,70,0,114,105,102,102,0,0,0,1,0,0,105,99,111,0,37,100,32,37,100,32,37,100,32,37,100,0,76,97,121,111,117,116,32,119,97,115,32,110,111,116,32,100,111,110,101,10,0,102,97,105,108,117,114,101,32,109,97,108,108,111,99,39,105,110,103,32,102,111,114,32,114,101,115,117,108,116,32,115,116,114,105,110,103,0,103,99,58,32,79,117,116,32,111,102,32,109,101,109,111,114,121,10,0,95,99,99,95,0,111,114,105,103,0,111,112,0,99,99,111,109,112,115,46,99,0,109,97,112,67,108,117,115,116,0,99,99,103,114,97,112,104,105,110,102,111,0,99,99,103,110,111,100,101,105,110,102,111,0,40,37,52,108,100,41,32,37,55,108,100,32,110,111,100,101,115,32,37,55,108,100,32,101,100,103,101,115,10,0,32,32,32,32,32,32,32,37,55,100,32,110,111,100,101,115,32,37,55,100,32,101,100,103,101,115,32,37,55,108,100,32,99,111,109,112,111,110,101,110,116,115,32,37,115,10,0,100,103,0,69,114,114,111,114,58,32,110,111,100,101,32,34,37,115,34,32,98,101,108,111,110,103,115,32,116,111,32,116,119,111,32,110,111,110,45,110,101,115,116,101,100,32,99,108,117,115,116,101,114,115,32,34,37,115,34,32,97,110,100,32,34,37,115,34,10,0,115,111,114,116,118,0,114,111,119,32,109,97,106,111,114,0,99,111,108,117,109,110,32,109,97,106,111,114,0,97,114,114,97,121,32,112,97,99,107,105,110,103,58,32,37,115,32,37,100,32,114,111,119,115,32,37,100,32,99,111,108,117,109,110,115,10,0,98,98,91,37,115,93,32,37,46,53,103,32,37,46,53,103,32,37,46,53,103,32,37,46,53,103,10,0,115,116,101,112,32,115,105,122,101,32,61,32,37,100,10,0,112,111,115,91,37,100,93,32,37,100,32,37,100,10,0,99,99,32,40,37,100,32,99,101,108,108,115,41,32,97,116,32,40,37,100,44,37,100,41,32,40,37,100,44,37,100,41,10,0,99,99,32,40,37,100,32,99,101,108,108,115,41,32,97,116,32,40,37,100,44,37,100,41,10,0,37,115,32,110,111,46,32,99,101,108,108,115,32,37,100,32,87,32,37,100,32,72,32,37,100,10,0,32,32,37,100,32,37,100,32,99,101,108,108,10,0,108,105,98,112,97,99,107,58,32,100,105,115,99,32,61,32,37,102,32,40,32,60,32,48,41,10,0,80,97,99,107,105,110,103,58,32,99,111,109,112,117,116,101,32,103,114,105,100,32,115,105,122,101,10,0,97,32,37,102,32,98,32,37,102,32,99,32,37,102,32,100,32,37,102,32,114,32,37,102,10,0,114,111,111,116,32,37,100,32,40,37,102,41,32,37,100,32,40,37,102,41,10,0,32,114,49,32,37,102,32,114,50,32,37,102,10,0,112,105,110,102,111,0,112,97,99,107,46,99,0,103,101,116,80,97,99,107,73,110,102,111,0,32,32,109,97,114,103,105,110,32,37,100,10,0,112,97,99,107,109,111,100,101,0,112,97,114,115,101,80,97,99,107,77,111,100,101,73,110,102,111,0,97,114,114,97,121,0,97,115,112,101,99,116,0,37,102,0,112,97,99,107,32,105,110,102,111,58,10,0,32,32,109,111,100,101,32,32,32,37,115,10,0,32,32,97,115,112,101,99,116,32,37,102,10,0,32,32,115,105,122,101,32,32,32,37,100,10,0,32,32,102,108,97,103,115,32,32,37,100,10,0,117,110,100,101,102,105,110,101,100,0,112,97,99,107,0,65,114,114,111,119,32,116,121,112,101,32,34,37,115,34,32,117,110,107,110,111,119,110,32,45,32,105,103,110,111,114,105,110,103,10,0,110,111,114,109,97,108,0,99,114,111,119,0,116,101,101,0,100,111,116,0,105,110,118,0,118,101,101,0,112,101,110,0,109,112,116,121,0,99,117,114,118,101,0,105,99,117,114,118,101,0,108,0,104,97,108,102,0,105,110,118,101,109,112,116,121,0,95,98,97,99,107,103,114,111,117,110,100,0,95,100,114,97,119,95,0,67,111,117,108,100,32,110,111,116,32,112,97,114,115,101,32,34,95,98,97,99,107,103,114,111,117,110,100,34,32,97,116,116,114,105,98,117,116,101,32,105,110,32,103,114,97,112,104,32,37,115,10,0,32,32,34,37,115,34,10,0,110,111,32,109,101,109,111,114,121,32,102,114,111,109,32,122,109,97,108,108,111,99,40,41,10,0,111,98,106,0,101,109,105,116,46,99,0,112,111,112,95,111,98,106,95,115,116,97,116,101,0,99,108,117,115,116,0,37,108,100,0,112,97,103,101,37,100,44,37,100,95,0,84,111,116,97,108,32,115,105,122,101,32,62,32,49,32,105,110,32,34,37,115,34,32,99,111,108,111,114,32,115,112,101,99,32,0,73,108,108,101,103,97,108,32,108,101,110,103,116,104,32,118,97,108,117,101,32,105,110,32,34,37,115,34,32,99,111,108,111,114,32,97,116,116,114,105,98,117,116,101,32,0,108,110,114,99,111,108,111,114,115,99,104,101,109,101,0,101,109,105,116,95,101,100,103,101,95,108,97,98,101,108,0,37,115,45,37,115,0,102,111,114,119,97,114,100,0,98,97,99,107,0,32,45,62,32,0,32,45,45,32,0,105,110,32,101,100,103,101,32,37,115,37,115,37,115,10,0,108,97,98,101,108,97,108,105,103,110,101,100,0,101,100,103,101,104,114,101,102,0,101,100,103,101,85,82,76,0,108,97,98,101,108,104,114,101,102,0,108,97,98,101,108,85,82,76,0,116,97,105,108,104,114,101,102,0,116,97,105,108,85,82,76,0,104,101,97,100,104,114,101,102,0,104,101,97,100,85,82,76,0,101,100,103,101,116,97,114,103,101,116,0,108,97,98,101,108,116,97,114,103,101,116,0,116,97,105,108,116,97,114,103,101,116,0,104,101,97,100,116,97,114,103,101,116,0,101,100,103,101,116,111,111,108,116,105,112,0,108,97,98,101,108,116,111,111,108,116,105,112,0,116,97,105,108,116,111,111,108,116,105,112,0,104,101,97,100,116,111,111,108,116,105,112,0,1,110,101,115,116,105,110,103,32,110,111,116,32,97,108,108,111,119,101,100,32,105,110,32,115,116,121,108,101,58,32,37,115,10,0,117,110,109,97,116,99,104,101,100,32,39,41,39,32,105,110,32,115,116,121,108,101,58,32,37,115,10,0,116,114,117,110,99,97,116,105,110,103,32,115,116,121,108,101,32,39,37,115,39,10,0,117,110,109,97,116,99,104,101,100,32,39,40,39,32,105,110,32,115,116,121,108,101,58,32,37,115,10,0,97,108,108,0,105,110,32,99,108,117,115,116,101,114,32,37,115,10,0,77,111,114,101,32,116,104,97,110,32,50,32,99,111,108,111,114,115,32,115,112,101,99,105,102,105,101,100,32,102,111,114,32,97,32,103,114,97,100,105,101,110,116,32,45,32,105,103,110,111,114,105,110,103,32,114,101,109,97,105,110,105,110,103,10,0,103,114,97,100,105,101,110,116,32,112,101,110,32,99,111,108,111,114,115,32,110,111,116,32,121,101,116,32,115,117,112,112,111,114,116,101,100,46,10,0,73,109,97,103,101,115,32,117,110,115,117,112,112,111,114,116,101,100,32,105,110,32,34,98,97,99,107,103,114,111,117,110,100,34,32,97,116,116,114,105,98,117,116,101,10,0,108,97,121,101,114,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,37,115,32,111,117,116,112,117,116,10,0,76,97,121,111,117,116,32,119,97,115,32,110,111,116,32,100,111,110,101,46,32,32,77,105,115,115,105,110,103,32,108,97,121,111,117,116,32,112,108,117,103,105,110,115,63,32,10,0,103,118,82,101,110,100,101,114,74,111,98,115,32,37,115,58,32,37,46,50,102,32,115,101,99,115,46,10,0,108,97,121,111,117,116,32,119,97,115,32,110,111,116,32,100,111,110,101,10,0,114,101,110,100,101,114,101,114,32,102,111,114,32,37,115,32,105,115,32,117,110,97,118,97,105,108,97,98,108,101,10,0,112,97,103,101,100,105,114,61,37,115,32,105,103,110,111,114,101,100,10,0,118,105,101,119,112,111,114,116,0,37,108,102,44,37,108,102,44,37,108,102,44,39,37,91,94,39,93,39,0,37,108,102,44,37,108,102,44,37,108,102,44,37,91,94,44,93,37,115,0,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,0,111,117,116,112,117,116,111,114,100,101,114,0,111,100,101,115,102,105,114,115,116,0,100,103,101,115,102,105,114,115,116,0,108,97,121,101,114,115,0,108,97,121,101,114,115,101,108,101,99,116,0,84,104,101,32,108,97,121,101,114,115,101,108,101,99,116,32,97,116,116,114,105,98,117,116,101,32,34,37,115,34,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,97,110,121,32,108,97,121,101,114,32,115,112,101,99,105,102,101,100,32,98,121,32,116,104,101,32,108,97,121,101,114,115,32,97,116,116,114,105,98,117,116,101,32,45,32,105,103,110,111,114,101,100,46,10,0,108,97,121,101,114,115,101,112,0,58,9,32,0,108,97,121,101,114,108,105,115,116,115,101,112,0,44,0,84,104,101,32,99,104,97,114,97,99,116,101,114,32,39,37,99,39,32,97,112,112,101,97,114,115,32,105,110,32,98,111,116,104,32,116,104,101,32,108,97,121,101,114,115,101,112,32,97,110,100,32,108,97,121,101,114,108,105,115,116,115,101,112,32,97,116,116,114,105,98,117,116,101,115,32,45,32,108,97,121,101,114,108,105,115,116,115,101,112,32,105,103,110,111,114,101,100,46,10,0,112,97,100,0,66,76,0,112,97,103,101,100,105,114,0,115,111,108,105,100,0,0,115,101,116,108,105,110,101,119,105,100,116,104,0,49,0,0,115,112,108,45,62,115,105,122,101,32,62,32,48,0,105,110,105,116,95,115,112,108,105,110,101,115,95,98,98,0,98,122,46,115,105,122,101,32,62,32,48,0,98,101,122,105,101,114,95,98,98,0,98,122,46,115,105,122,101,32,37,32,51,32,61,61,32,49,0,37,108,102,0,102,111,110,116,112,97,116,104,0,68,79,84,70,79,78,84,80,65,84,72,0,71,68,70,79,78,84,80,65,84,72,0,105,109,97,103,101,112,97,116,104,0,113,117,97,110,116,117,109,0,114,97,110,107,100,105,114,0,76,82,0,66,84,0,82,76,0,110,111,100,101,115,101,112,0,114,97,110,107,115,101,112,0,101,113,117,97,108,108,121,0,115,104,111,119,98,111,120,101,115,0,102,111,110,116,110,97,109,101,115,0,115,105,122,101,0,112,97,103,101,0,99,101,110,116,101,114,0,114,111,116,97,116,101,0,111,114,105,101,110,116,97,116,105,111,110,0,108,97,110,100,115,99,97,112,101,0,99,108,117,115,116,101,114,114,97,110,107,0,99,111,110,99,101,110,116,114,97,116,101,0,100,112,105,0,114,101,115,111,108,117,116,105,111,110,0,111,114,100,101,114,105,110,103,0,102,105,108,108,99,111,108,111,114,0,102,111,110,116,115,105,122,101,0,102,111,110,116,110,97,109,101,0,102,111,110,116,99,111,108,111,114,0,120,108,97,98,101,108,0,112,101,110,119,105,100,116,104,0,112,101,114,105,112,104,101,114,105,101,115,0,115,107,101,119,0,100,105,115,116,111,114,116,105,111,110,0,110,111,106,117,115,116,105,102,121,0,108,97,121,101,114,0,103,114,111,117,112,0,99,111,109,109,101,110,116,0,118,101,114,116,105,99,101,115,0,122,0,119,101,105,103,104,116,0,108,97,98,101,108,102,108,111,97,116,0,100,105,114,0,97,114,114,111,119,104,101,97,100,0,97,114,114,111,119,116,97,105,108,0,104,101,97,100,108,97,98,101,108,0,116,97,105,108,108,97,98,101,108,0,108,97,98,101,108,102,111,110,116,115,105,122,101,0,108,97,98,101,108,102,111,110,116,110,97,109,101,0,108,97,98,101,108,102,111,110,116,99,111,108,111,114,0,108,97,98,101,108,100,105,115,116,97,110,99,101,0,108,97,98,101,108,97,110,103,108,101,0,109,105,110,108,101,110,0,100,101,99,111,114,97,116,101,0,97,114,114,111,119,115,105,122,101,0,99,111,110,115,116,114,97,105,110,116,0,116,97,105,108,99,108,105,112,0,104,101,97,100,99,108,105,112,0,108,97,98,101,108,106,117,115,116,0,108,111,99,97,108,0,103,108,111,98,97,108,0,37,108,102,44,37,108,102,37,99,0,37,108,102,37,99,0,114,97,116,105,111,0,97,117,116,111,0,99,111,109,112,114,101,115,115,0,101,120,112,97,110,100,0,102,105,108,108,0,103,100,0,112,115,0,115,118,103,0,99,104,97,114,115,101,116,0,117,116,102,45,56,0,108,97,116,105,110,45,49,0,108,97,116,105,110,49,0,108,49,0,73,83,79,45,56,56,53,57,45,49,0,73,83,79,95,56,56,53,57,45,49,0,73,83,79,56,56,53,57,45,49,0,73,83,79,45,73,82,45,49,48,48,0,98,105,103,45,53,0,98,105,103,53,0,117,116,102,56,0,85,110,115,117,112,112,111,114,116,101,100,32,99,104,97,114,115,101,116,32,34,37,115,34,32,45,32,97,115,115,117,109,105,110,103,32,117,116,102,45,56,10,0,85,110,115,117,112,112,111,114,116,101,100,32,99,104,97,114,115,101,116,32,118,97,108,117,101,32,37,100,10,0,85,84,70,45,56,0,66,73,71,45,53,0,105,110,32,108,97,98,101,108,32,111,102,32,103,114,97,112,104,32,37,115,10,0,105,110,32,108,97,98,101,108,32,111,102,32,110,111,100,101,32,37,115,10,0,105,110,32,108,97,98,101,108,32,111,102,32,101,100,103,101,32,37,115,32,37,115,32,37,115,10,0,107,105,110,100,32,61,61,32,76,84,95,78,79,78,69,0,108,97,98,101,108,115,46,99,0,109,97,107,101,95,108,97,98,101,108,0,92,76,0,92,71,0,92,69,0,92,72,0,92,84,0,38,35,49,51,59,0,38,113,117,111,116,59,0,38,35,49,48,59,0,38,35,49,54,48,59,0,38],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+92184);allocate([97,109,112,59,0,38,103,116,59,0,38,35,51,57,59,0,38,35,52,53,59,0,38,108,116,59,0,37,115,32,37,100,32,110,111,100,101,115,32,37,100,32,101,100,103,101,115,32,109,97,120,105,116,101,114,61,37,100,32,98,97,108,97,110,99,101,61,37,100,10,0,110,101,116,119,111,114,107,32,115,105,109,112,108,101,120,58,32,0,37,100,32,0,37,115,37,100,32,110,111,100,101,115,32,37,100,32,101,100,103,101,115,32,37,100,32,105,116,101,114,32,37,46,50,102,32,115,101,99,10,0,117,112,100,97,116,101,58,32,109,105,115,109,97,116,99,104,101,100,32,108,99,97,32,105,110,32,116,114,101,101,117,112,100,97,116,101,115,10,0,84,114,101,101,95,101,100,103,101,46,115,105,122,101,32,61,61,32,78,95,110,111,100,101,115,32,45,32,49,0,110,115,46,99,0,102,101,97,115,105,98,108,101,95,116,114,101,101,0,33,84,82,69,69,95,69,68,71,69,40,101,41,0,109,101,114,103,101,95,116,114,101,101,115,0,40,114,48,45,62,104,101,97,112,95,105,110,100,101,120,32,62,32,45,49,41,32,124,124,32,40,114,49,45,62,104,101,97,112,95,105,110,100,101,120,32,62,32,45,49,41,0,83,84,115,101,116,85,110,105,111,110,0,114,45,62,104,101,97,112,95,105,110,100,101,120,32,62,61,32,48,0,97,100,100,95,116,114,101,101,95,101,100,103,101,58,32,109,105,115,115,105,110,103,32,116,114,101,101,32,101,100,103,101,10,0,97,100,100,95,116,114,101,101,95,101,100,103,101,58,32,101,109,112,116,121,32,111,117,116,101,100,103,101,32,108,105,115,116,10,0,97,100,100,95,116,114,101,101,95,101,100,103,101,58,32,101,109,112,116,121,32,105,110,101,100,103,101,32,108,105,115,116,10,0,116,114,111,117,98,108,101,32,105,110,32,105,110,105,116,95,114,97,110,107,10,0,9,37,115,32,37,100,10,0,115,101,97,114,99,104,115,105,122,101,0,103,114,97,112,104,32,0,32,0,110,111,100,101,32,0,115,116,111,112,10,0,37,46,53,103,0,112,111,115,0,114,101,99,116,115,0,120,108,112,0,108,112,0,104,101,97,100,95,108,112,0,116,97,105,108,95,108,112,0,108,119,105,100,116,104,0,108,104,101,105,103,104,116,0,98,98,0,37,46,53,103,44,37,46,53,103,44,37,46,53,103,0,44,37,46,53,103,0,37,46,53,103,44,37,46,53,103,0,115,97,109,112,108,101,112,111,105,110,116,115,0,37,46,53,103,32,37,46,53,103,0,115,44,37,46,53,103,44,37,46,53,103,32,0,101,44,37,46,53,103,44,37,46,53,103,32,0,37,46,53,103,44,37,46,53,103,44,37,46,53,103,44,37,46,53,103,0,37,46,50,102,0,37,46,53,103,44,37,46,53,103,44,37,46,53,103,44,37,46,53,103,32,0,47,112,97,116,104,98,111,120,32,123,10,32,32,32,32,47,88,32,101,120,99,104,32,110,101,103,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,89,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,120,32,101,120,99,104,32,110,101,103,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,121,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,110,101,119,112,97,116,104,32,120,32,121,32,109,111,118,101,116,111,10,32,32,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,32,32,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,125,32,100,101,102,10,0,47,112,97,116,104,98,111,120,32,123,10,32,32,32,32,47,89,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,88,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,121,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,120,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,110,101,119,112,97,116,104,32,120,32,121,32,109,111,118,101,116,111,10,32,32,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,32,32,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,32,125,32,100,101,102,10,47,100,98,103,115,116,97,114,116,32,123,32,103,115,97,118,101,32,37,46,53,103,32,37,46,53,103,32,116,114,97,110,115,108,97,116,101,32,125,32,100,101,102,10,47,97,114,114,111,119,108,101,110,103,116,104,32,49,48,32,100,101,102,10,47,97,114,114,111,119,119,105,100,116,104,32,97,114,114,111,119,108,101,110,103,116,104,32,50,32,100,105,118,32,100,101,102,10,47,97,114,114,111,119,104,101,97,100,32,123,10,32,32,32,32,103,115,97,118,101,10,32,32,32,32,114,111,116,97,116,101,10,32,32,32,32,99,117,114,114,101,110,116,112,111,105,110,116,10,32,32,32,32,110,101,119,112,97,116,104,10,32,32,32,32,109,111,118,101,116,111,10,32,32,32,32,97,114,114,111,119,108,101,110,103,116,104,32,97,114,114,111,119,119,105,100,116,104,32,50,32,100,105,118,32,114,108,105,110,101,116,111,10,32,32,32,32,48,32,97,114,114,111,119,119,105,100,116,104,32,110,101,103,32,114,108,105,110,101,116,111,10,32,32,32,32,99,108,111,115,101,112,97,116,104,32,102,105,108,108,10,32,32,32,32,103,114,101,115,116,111,114,101,10,125,32,98,105,110,100,32,100,101,102,10,47,109,97,107,101,97,114,114,111,119,32,123,10,32,32,32,32,99,117,114,114,101,110,116,112,111,105,110,116,32,101,120,99,104,32,112,111,112,32,115,117,98,32,101,120,99,104,32,99,117,114,114,101,110,116,112,111,105,110,116,32,112,111,112,32,115,117,98,32,97,116,97,110,10,32,32,32,32,97,114,114,111,119,104,101,97,100,10,125,32,98,105,110,100,32,100,101,102,10,47,112,111,105,110,116,32,123,32,32,32,32,110,101,119,112,97,116,104,32,32,32,32,50,32,48,32,51,54,48,32,97,114,99,32,102,105,108,108,125,32,100,101,102,47,109,97,107,101,118,101,99,32,123,10,32,32,32,32,47,89,32,101,120,99,104,32,100,101,102,10,32,32,32,32,47,88,32,101,120,99,104,32,100,101,102,10,32,32,32,32,47,121,32,101,120,99,104,32,100,101,102,10,32,32,32,32,47,120,32,101,120,99,104,32,100,101,102,10,32,32,32,32,110,101,119,112,97,116,104,32,120,32,121,32,109,111,118,101,116,111,10,32,32,32,32,88,32,89,32,108,105,110,101,116,111,32,115,116,114,111,107,101,10,32,32,32,32,88,32,89,32,109,111,118,101,116,111,10,32,32,32,32,120,32,121,32,109,97,107,101,97,114,114,111,119,10,125,32,100,101,102,10,0,108,111,115,116,32,37,115,32,37,115,32,101,100,103,101,10,0,110,111,32,112,111,115,105,116,105,111,110,32,102,111,114,32,101,100,103,101,32,119,105,116,104,32,108,97,98,101,108,32,37,115,0,110,111,32,112,111,115,105,116,105,111,110,32,102,111,114,32,101,100,103,101,32,119,105,116,104,32,116,97,105,108,32,108,97,98,101,108,32,37,115,0,110,111,32,112,111,115,105,116,105,111,110,32,102,111,114,32,101,100,103,101,32,119,105,116,104,32,104,101,97,100,32,108,97,98,101,108,32,37,115,0,110,111,32,112,111,115,105,116,105,111,110,32,102,111,114,32,101,100,103,101,32,119,105,116,104,32,120,108,97,98,101,108,32,37,115,0,102,111,114,99,101,108,97,98,101,108,115,0,37,100,32,111,117,116,32,111,102,32,37,100,32,108,97,98,101,108,115,32,112,111,115,105,116,105,111,110,101,100,46,10,0,37,100,32,111,117,116,32,111,102,32,37,100,32,101,120,116,101,114,105,111,114,32,108,97,98,101,108,115,32,112,111,115,105,116,105,111,110,101,100,46,10,0,37,100,32,111,98,106,115,32,37,100,32,120,108,97,98,101,108,115,32,102,111,114,99,101,61,37,100,32,98,98,61,40,37,46,48,50,102,44,37,46,48,50,102,41,32,40,37,46,48,50,102,44,37,46,48,50,102,41,10,0,111,98,106,101,99,116,115,10,0,32,91,37,100,93,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,37,112,32,34,37,115,34,10,0,120,108,97,98,101,108,115,10,0,32,91,37,100,93,32,37,112,32,115,101,116,32,37,100,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,37,115,10,0,115,104,97,112,101,102,105,108,101,32,110,111,116,32,115,101,116,32,111,114,32,110,111,116,32,102,111,117,110,100,32,102,111,114,32,101,112,115,102,32,110,111,100,101,32,37,115,10,0,99,111,117,108,100,110,39,116,32,111,112,101,110,32,101,112,115,102,32,102,105,108,101,32,37,115,10,0,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,0,114,101,97,100,0,66,111,117,110,100,105,110,103,66,111,120,32,110,111,116,32,102,111,117,110,100,32,105,110,32,101,112,115,102,32,102,105,108,101,32,37,115,10,0,99,97,110,39,116,32,102,105,110,100,32,108,105,98,114,97,114,121,32,102,105,108,101,32,37,115,10,0,99,97,110,39,116,32,111,112,101,110,32,108,105,98,114,97,114,121,32,102,105,108,101,32,37,115,10,0,69,79,70,0,66,69,71,73,78,0,69,78,68,0,84,82,65,73,76,69,82,0,47,117,115,101,114,95,115,104,97,112,101,95,37,100,32,123,10,0,37,37,66,101,103,105,110,68,111,99,117,109,101,110,116,58,10,0,37,37,69,110,100,68,111,99,117,109,101,110,116,10,0,125,32,98,105,110,100,32,100,101,102,10,0,85,84,70,45,56,32,105,110,112,117,116,32,117,115,101,115,32,110,111,110,45,76,97,116,105,110,49,32,99,104,97,114,97,99,116,101,114,115,32,119,104,105,99,104,32,99,97,110,110,111,116,32,98,101,32,104,97,110,100,108,101,100,32,98,121,32,116,104,105,115,32,80,111,115,116,83,99,114,105,112,116,32,100,114,105,118,101,114,10,0,99,97,110,110,111,116,32,114,101,45,97,108,108,111,99,97,116,101,32,112,115,10,0,114,111,117,116,101,115,112,108,105,110,101,115,105,110,105,116,58,32,99,97,110,110,111,116,32,97,108,108,111,99,97,116,101,32,112,115,10,0,114,111,117,116,101,115,112,108,105,110,101,115,58,32,37,100,32,101,100,103,101,115,44,32,37,100,32,98,111,120,101,115,32,37,46,50,102,32,115,101,99,10,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,99,97,110,110,111,116,32,102,105,110,100,32,78,79,82,77,65,76,32,101,100,103,101,10,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,105,108,108,101,103,97,108,32,118,97,108,117,101,115,32,111,102,32,112,114,101,118,32,37,100,32,97,110,100,32,110,101,120,116,32,37,100,44,32,108,105,110,101,32,37,100,10,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,101,100,103,101,32,105,115,32,97,32,108,111,111,112,32,97,116,32,37,115,10,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,80,115,104,111,114,116,101,115,116,112,97,116,104,32,102,97,105,108,101,100,10,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,80,114,111,117,116,101,115,112,108,105,110,101,32,102,97,105,108,101,100,10,0,85,110,97,98,108,101,32,116,111,32,114,101,99,108,97,105,109,32,98,111,120,32,115,112,97,99,101,32,105,110,32,115,112,108,105,110,101,32,114,111,117,116,105,110,103,32,102,111,114,32,101,100,103,101,32,34,37,115,34,32,45,62,32,34,37,115,34,46,32,83,111,109,101,116,104,105,110,103,32,105,115,32,112,114,111,98,97,98,108,121,32,115,101,114,105,111,117,115,108,121,32,119,114,111,110,103,46,10,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,98,111,120,32,48,32,104,97,115,32,76,76,32,99,111,111,114,100,32,62,32,85,82,32,99,111,111,114,100,10,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,98,111,120,32,37,100,32,104,97,115,32,76,76,32,99,111,111,114,100,32,62,32,85,82,32,99,111,111,114,100,10,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,98,111,120,101,115,32,37,100,32,97,110,100,32,37,100,32,100,111,110,39,116,32,116,111,117,99,104,10,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,115,116,97,114,116,32,112,111,114,116,32,110,111,116,32,105,110,32,102,105,114,115,116,32,98,111,120,10,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,101,110,100,32,112,111,114,116,32,110,111,116,32,105,110,32,108,97,115,116,32,98,111,120,10,0,37,100,32,98,111,120,101,115,58,10,0,37,100,32,40,37,46,53,103,44,32,37,46,53,103,41,44,32,40,37,46,53,103,44,32,37,46,53,103,41,10,0,99,111,110,115,116,114,97,105,110,101,100,0,110,111,116,32,99,111,110,115,116,114,97,105,110,101,100,0,115,116,97,114,116,32,112,111,114,116,58,32,40,37,46,53,103,44,32,37,46,53,103,41,44,32,116,97,110,103,101,110,116,32,97,110,103,108,101,58,32,37,46,53,103,44,32,37,115,10,0,101,110,100,32,112,111,114,116,58,32,40,37,46,53,103,44,32,37,46,53,103,41,44,32,116,97,110,103,101,110,116,32,97,110,103,108,101,58,32,37,46,53,103,44,32,37,115,10,0,115,105,100,101,115,32,61,61,32,52,0,115,104,97,112,101,115,46,99,0,114,111,117,110,100,95,99,111,114,110,101,114,115,0,98,97,100,32,108,97,98,101,108,32,102,111,114,109,97,116,32,37,115,10,0,92,78,0,109,97,114,103,105,110,0,37,108,102,44,37,108,102,0,114,101,103,117,108,97,114,0,99,117,115,116,111,109,0,115,104,97,112,101,102,105,108,101,0,60,110,105,108,62,0,78,111,32,111,114,32,105,109,112,114,111,112,101,114,32,115,104,97,112,101,102,105,108,101,61,34,37,115,34,32,102,111,114,32,110,111,100,101,32,34,37,115,34,10,0,78,111,32,111,114,32,105,109,112,114,111,112,101,114,32,105,109,97,103,101,61,34,37,115,34,32,102,111,114,32,110,111,100,101,32,34,37,115,34,10,0,108,97,98,101,108,108,111,99,0,110,111,100,101,32,39,37,115,39,44,32,103,114,97,112,104,32,39,37,115,39,32,115,105,122,101,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,108,97,98,101,108,10,0,101,112,115,102,0,117,115,105,110,103,32,37,115,32,102,111,114,32,117,110,107,110,111,119,110,32,115,104,97,112,101,32,37,115,10,0,112,111,108,121,103,111,110,0,111,118,97,108,0,99,105,114,99,108,101,0,112,111,105,110,116,0,101,103,103,0,116,114,105,97,110,103,108,101,0,112,108,97,105,110,116,101,120,116,0,112,108,97,105,110,0,100,105,97,109,111,110,100,0,116,114,97,112,101,122,105,117,109,0,112,97,114,97,108,108,101,108,111,103,114,97,109,0,104,111,117,115,101,0,112,101,110,116,97,103,111,110,0,104,101,120,97,103,111,110,0,115,101,112,116,97,103,111,110,0,111,99,116,97,103,111,110,0,110,111,116,101,0,116,97,98,0,102,111,108,100,101,114,0,98,111,120,51,100,0,99,111,109,112,111,110,101,110,116,0,99,121,108,105,110,100,101,114,0,114,101,99,116,0,114,101,99,116,97,110,103,108,101,0,115,113,117,97,114,101,0,100,111,117,98,108,101,99,105,114,99,108,101,0,100,111,117,98,108,101,111,99,116,97,103,111,110,0,116,114,105,112,108,101,111,99,116,97,103,111,110,0,105,110,118,116,114,105,97,110,103,108,101,0,105,110,118,116,114,97,112,101,122,105,117,109,0,105,110,118,104,111,117,115,101,0,117,110,100,101,114,108,105,110,101,0,77,100,105,97,109,111,110,100,0,77,115,113,117,97,114,101,0,77,99,105,114,99,108,101,0,112,114,111,109,111,116,101,114,0,99,100,115,0,116,101,114,109,105,110,97,116,111,114,0,117,116,114,0,105,110,115,117,108,97,116,111,114,0,114,105,98,111,115,105,116,101,0,114,110,97,115,116,97,98,0,112,114,111,116,101,97,115,101,115,105,116,101,0,112,114,111,116,101,105,110,115,116,97,98,0,112,114,105,109,101,114,115,105,116,101,0,114,101,115,116,114,105,99,116,105,111,110,115,105,116,101,0,102,105,118,101,112,111,118,101,114,104,97,110,103,0,116,104,114,101,101,112,111,118,101,114,104,97,110,103,0,110,111,118,101,114,104,97,110,103,0,97,115,115,101,109,98,108,121,0,115,105,103,110,97,116,117,114,101,0,114,112,114,111,109,111,116,101,114,0,108,97,114,114,111,119,0,114,97,114,114,111,119,0,108,112,114,111,109,111,116,101,114,0,114,101,99,111,114,100,0,77,114,101,99,111,114,100,0,115,116,97,114,0,35,56,48,56,48,56,48,0,35,102,99,102,99,102,99,0,35,51,48,51,48,51,48,0,35,101,56,101,56,101,56,0,35,101,48,101,48,101,48,0,35,102,48,102,48,102,48,0,35,49,48,49,48,49,48,0,35,102,56,102,56,102,56,0,105,110,32,110,111,100,101,32,37,115,10,0,114,111,117,110,100,101,100,0,100,105,97,103,111,110,97,108,115,0,114,97,100,105,97,108,0,115,116,114,105,112,101,100,0,119,101,100,103,101,100,0,95,0,110,111,100,101,32,37,115,44,32,112,111,114,116,32,37,115,44,32,117,110,114,101,99,111,103,110,105,122,101,100,32,99,111,109,112,97,115,115,32,112,111,105,110,116,32,39,37,115,39,32,45,32,105,103,110,111,114,101,100,10,0,110,111,100,101,32,37,115,44,32,112,111,114,116,32,37,115,32,117,110,114,101,99,111,103,110,105,122,101,100,10,0,37,46,53,103,32,37,46,53,103,32,116,114,97,110,115,108,97,116,101,32,110,101,119,112,97,116,104,32,117,115,101,114,95,115,104,97,112,101,95,37,100,10,0,105,110,118,105,115,0,0,102,105,108,108,101,100,0,0,115,0,101,0,119,0,115,112,108,105,110,101,115,46,99,0,98,101,103,105,110,112,97,116,104,0,80,45,62,101,110,100,46,116,104,101,116,97,32,60,32,50,32,42,32,77,95,80,73,0,101,110,100,112,97,116,104,0,109,97,107,101,83,101,108,102,69,100,103,101,0,103,101,116,115,112,108,105,110,101,112,111,105,110,116,115,58,32,110,111,32,115,112,108,105,110,101,32,112,111,105,110,116,115,32,97,118,97,105,108,97,98,108,101,32,102,111,114,32,101,100,103,101,32,40,37,115,44,37,115,41,10,0,112,111,108,121,108,105,110,101,77,105,100,112,111,105,110,116,0,115,112,97,110,45,62,102,111,110,116,0,116,101,120,116,115,112,97,110,46,99,0,116,101,120,116,115,112,97,110,95,115,105,122,101,0,102,111,110,116,45,62,110,97,109,101,0,102,111,110,116,110,97,109,101,58,32,34,37,115,34,32,114,101,115,111,108,118,101,100,32,116,111,58,32,37,115,10,0,102,111,110,116,110,97,109,101,58,32,117,110,97,98,108,101,32,116,111,32,114,101,115,111,108,118,101,32,34,37,115,34,10,0,99,111,117,114,0,97,114,105,97,108,0,104,101,108,118,101,116,105,99,97,0,91,105,110,116,101,114,110,97,108,32,116,105,109,101,115,93,0,91,105,110,116,101,114,110,97,108,32,99,111,117,114,105,101,114,93,0,91,105,110,116,101,114,110,97,108,32,97,114,105,97,108,93,0,65,118,97,110,116,71,97,114,100,101,45,66,111,111,107,0,85,82,87,32,71,111,116,104,105,99,32,76,0,98,111,111,107,0,115,97,110,115,45,83,101,114,105,102,0,65,118,97,110,116,71,97,114,100,101,45,66,111,111,107,79,98,108,105,113,117,101,0,111,98,108,105,113,117,101,0,105,116,97,108,105,99,0,65,118,97,110,116,71,97,114,100,101,45,68,101,109,105,0,100,101,109,105,0,65,118,97,110,116,71,97,114,100,101,45,68,101,109,105,79,98,108,105,113,117,101,0,66,111,111,107,109,97,110,45,68,101,109,105,0,85,82,87,32,66,111,111,107,109,97,110,32,76,0,115,101,114,105,102,0,66,111,111,107,109,97,110,45,68,101,109,105,73,116,97,108,105,99,0,66,111,111,107,109,97,110,45,76,105,103,104,116,0,108,105,103,104,116,0,66,111,111,107,109,97,110,45,76,105,103,104,116,73,116,97,108,105,99,0,67,111,117,114,105,101,114,0,109,111,110,111,115,112,97,99,101,0,67,111,117,114,105,101,114,45,66,111,108,100,0,67,111,117,114,105,101,114,45,66,111,108,100,79,98,108,105,113,117,101,0,67,111,117,114,105,101,114,45,79,98,108,105,113,117,101,0,72,101,108,118,101,116,105,99,97,0,72,101,108,118,101,116,105,99,97,45,66,111,108,100,0,72,101,108,118,101,116,105,99,97,45,66,111,108,100,79,98,108,105,113,117,101,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,0,99,111,110,100,101,110,115,101,100,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,66,111,108,100,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,66,111,108,100,79,98,108,105,113,117,101,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,79,98,108,105,113,117,101,0,72,101,108,118,101,116,105,99,97,45,79,98,108,105,113,117,101,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,66,111,108,100,0,67,101,110,116,117,114,121,32,83,99,104,111,111,108,98,111,111,107,32,76,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,66,111,108,100,73,116,97,108,105,99,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,73,116,97,108,105,99,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,82,111,109,97,110,0,114,111,109,97,110,0,80,97,108,97,116,105,110,111,45,66,111,108,100,0,80,97,108,97,116,105,110,111,32,76,105,110,111,116,121,112,101,0,80,97,108,97,116,105,110,111,45,66,111,108,100,73,116,97,108,105,99,0,80,97,108,97,116,105,110,111,45,73,116,97,108,105,99,0,80,97,108,97,116,105,110,111,45,82,111,109,97,110,0,83,121,109,98,111,108,0,102,97,110,116,97,115,121,0,84,105,109,101,115,45,66,111,108,100,0,84,105,109,101,115,0,84,105,109,101,115,45,66,111,108,100,73,116,97,108,105,99,0,84,105,109,101,115,45,73,116,97,108,105,99,0,90,97,112,102,67,104,97,110,99,101,114,121,45,77,101,100,105,117,109,73,116,97,108,105,99,0,85,82,87,32,67,104,97,110,99,101,114,121,32,76,0,109,101,100,105,117,109,0,90,97,112,102,68,105,110,103,98,97,116,115,0,68,105,110,103,98,97,116,115,0,105,110,112,117,116,115,99,97,108,101,0,110,111,0,116,114,117,101,0,121,101,115,0,117,116,105,108,115,46,99,0,117,32,61,61,32,85,70,95,102,105,110,100,40,117,41,0,85,70,95,115,101,116,110,97,109,101,0,1,102,105,108,101,32,108,111,97,100,105,110,103,32,105,115,32,100,105,115,97,98,108,101,100,32,98,101,99,97,117,115,101,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,99,111,110,116,97,105,110,115,32,83,69,82,86,69,82,95,78,65,77,69,61,34,37,115,34,10,97,110,100,32,116,104,101,32,71,86,95,70,73,76,69,95,80,65,84,72,32,118,97,114,105,97,98,108,101,32,105,115,32,117,110,115,101,116,32,111,114,32,101,109,112,116,121,46,10,0,80,97,116,104,32,112,114,111,118,105,100,101,100,32,116,111,32,102,105,108,101,58,32,34,37,115,34,32,104,97,115,32,98,101,101,110,32,105,103,110,111,114,101,100,32,98,101,99,97,117,115,101,32,102,105,108,101,115,32,97,114,101,32,111,110,108,121,32,112,101,114,109,105,116,116,101,100,32,116,111,32,98,101,32,108,111,97,100,101,100,32,102,114,111,109,32,116,104,101,32,100,105,114,101,99,116,111,114,105,101,115,32,105,110,32,34,37,115,34,32,119,104,101,110,32,114,117,110,110,105,110,103,32,105,110,32,97,110,32,104,116,116,112,32,115,101,114,118,101,114,46,10,0,37,115,37,115,37,115,0,47,0,58,0,101,108,108,105,112,115,101,0,84,105,109,101,115,45,82,111,109,97,110,0,99,108,117,115,116,101,114,0,95,95,99,108,117,115,116,101,114,110,111,100,101,115,0,99,108,117,115,116,101,114,32,99,121,99,108,101,32,37,115,32,45,45,32,37,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,10,0,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,116,97,105,108,32,110,111,100,101,32,37,115,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,104,101,97,100,32,110,111,100,101,32,37,115,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,95,95,0,108,97,98,101,108,0,115,104,97,112,101,0,98,111,120,0,84,119,111,32,99,108,117,115,116,101,114,115,32,110,97,109,101,100,32,37,115,32,45,32,116,104,101,32,115,101,99,111,110,100,32,119,105,108,108,32,98,101,32,105,103,110,111,114,101,100,10,0,109,97,112,78,0,65,69,108,105,103,0,65,97,99,117,116,101,0,65,99,105,114,99,0,65,103,114,97,118,101,0,65,108,112,104,97,0,65,114,105,110,103,0,65,116,105,108,100,101,0,65,117,109,108,0,66,101,116,97,0,67,99,101,100,105,108,0,67,104,105,0,68,97,103,103,101,114,0,68,101,108,116,97,0,69,84,72,0,69,97,99,117,116,101,0,69,99,105,114,99,0,69,103,114,97,118,101,0,69,112,115,105,108,111,110,0,69,116,97,0,69,117,109,108,0,71,97,109,109,97,0,73,97,99,117,116,101,0,73,99,105,114,99,0,73,103,114,97,118,101,0,73,111,116,97,0,73,117,109,108,0,75,97,112,112,97,0,76,97,109,98,100,97,0,77,117,0,78,116,105,108,100,101,0,78,117,0,79,69,108,105,103,0,79,97,99,117,116,101,0,79,99,105,114,99,0,79,103,114,97,118,101,0,79,109,101,103,97,0,79,109,105,99,114,111,110,0,79,115,108,97,115,104,0,79,116,105,108,100,101,0,79,117,109,108,0,80,104,105,0,80,105,0,80,114,105,109,101,0,80,115,105,0,82,104,111,0,83,99,97,114,111,110,0,83,105,103,109,97,0,84,72,79,82,78,0,84,97,117,0,84,104,101,116,97,0,85,97,99,117,116,101,0,85,99,105,114,99,0,85,103,114,97,118,101,0,85,112,115,105,108,111,110,0,85,117,109,108,0,88,105,0,89,97,99,117,116,101,0,89,117,109,108,0,90,101,116,97,0,97,97,99,117,116,101,0,97,99,105,114,99,0,97,99,117,116,101,0,97,101,108,105,103,0,97,103,114,97,118,101,0,97,108,101,102,115,121,109,0,97,108,112,104,97,0,97,109,112,0,97,110,100,0,97,110,103,0,97,114,105,110,103,0,97,115,121,109,112,0,97,116,105,108,100,101,0,97,117,109,108,0,98,100,113,117,111,0,98,101,116,97,0,98,114,118,98,97,114,0,98,117,108,108,0,99,97,112,0,99,99,101,100,105,108,0,99,101,100,105,108,0,99,101,110,116,0,99,104,105,0,99,105,114,99,0,99,108,117,98,115,0,99,111,110,103,0,99,111,112,121,0,99,114,97,114,114,0,99,117,112,0,99,117,114,114,101,110,0,100,65,114,114,0,100,97,103,103,101,114,0,100,97,114,114,0,100,101,103,0,100,101,108,116,97,0,100,105,97,109,115,0,100,105,118,105,100,101,0,101,97,99,117,116,101,0,101,99,105,114,99,0,101,103,114,97,118,101,0,101,109,112,116,121,0,101,109,115,112,0,101,110,115,112,0,101,112,115,105,108,111,110,0,101,113,117,105,118,0,101,116,97,0,101,116,104,0,101,117,109,108,0,101,117,114,111,0,101,120,105,115,116,0,102,110,111,102,0,102,111,114,97,108,108,0,102,114,97,99,49,50,0,102,114,97,99,49,52,0,102,114,97,99,51,52,0,102,114,97,115,108,0,103,97,109,109,97,0,103,101,0,103,116,0,104,65,114,114,0,104,97,114,114,0,104,101,97,114,116,115,0,104,101,108,108,105,112,0,105,97,99,117,116,101,0,105,99,105,114,99,0,105,101,120,99,108,0,105,103,114,97,118,101,0,105,109,97,103,101,0,105,110,102,105,110,0,105,110,116,0,105,111,116,97,0,105,113,117,101,115,116,0,105,115,105,110,0,105,117,109,108,0,107,97,112,112,97,0,108,65,114,114,0,108,97,109,98,100,97,0,108,97,110,103,0,108,97,113,117,111,0,108,97,114,114,0,108,99,101,105,108,0,108,100,113,117,111,0,108,101,0,108,102,108,111,111,114,0,108,111,119,97,115,116,0,108,111,122,0,108,114,109,0,108,115,97,113,117,111,0,108,115,113,117,111,0,108,116,0,109,97,99,114,0,109,100,97,115,104,0,109,105,99,114,111,0,109,105,100,100,111,116,0,109,117,0,110,97,98,108,97,0,110,98,115,112,0,110,100,97,115,104,0,110,101,0,110,105,0,110,111,116,0,110,111,116,105,110,0,110,115,117,98,0,110,116,105,108,100,101,0,110,117,0,111,97,99,117,116,101,0,111,99,105,114,99,0,111,101,108,105,103,0,111,103,114,97,118,101,0,111,108,105,110,101,0,111,109,101,103,97,0,111,109,105,99,114,111,110,0,111,112,108,117,115,0,111,114,0,111,114,100,102,0,111,114,100,109,0,111,115,108,97,115,104,0,111,116,105,108,100,101,0,111,116,105,109,101,115,0,111,117,109,108,0,112,97,114,97,0,112,97,114,116,0,112,101,114,109,105,108,0,112,101,114,112,0,112,104,105,0,112,105,0,112,105,118,0,112,108,117,115,109,110,0,112,111,117,110,100,0,112,114,105,109,101,0,112,114,111,100,0,112,114,111,112,0,112,115,105,0,113,117,111,116,0,114,65,114,114,0,114,97,100,105,99,0,114,97,110,103,0,114,97,113,117,111,0,114,97,114,114,0,114,99,101,105,108,0,114,100,113,117,111,0,114,101,97,108,0,114,101,103,0,114,102,108,111,111,114,0,114,104,111,0,114,108,109,0,114,115,97,113,117,111,0,114,115,113,117,111,0,115,98,113,117,111,0,115,99,97,114,111,110,0,115,100,111,116,0,115,101,99,116,0,115,104,121,0,115,105,103,109,97,0,115,105,103,109,97,102,0,115,105,109,0,115,112,97,100,101,115,0,115,117,98,0,115,117,98,101,0,115,117,109,0,115,117,112,0,115,117,112,49,0,115,117,112,50,0,115,117,112,51,0,115,117,112,101,0,115,122,108,105,103,0,116,97,117,0,116,104,101,114,101,52,0,116,104,101,116,97,0,116,104,101,116,97,115,121,109,0,116,104,105,110,115,112,0,116,104,111,114,110,0,116,105,108,100,101,0,116,105,109,101,115,0,116,114,97,100,101,0,117,65,114,114,0,117,97,99,117,116,101,0,117,97,114,114,0,117,99,105,114,99,0,117,103,114,97,118,101,0,117,109,108,0,117,112,115,105,104,0,117,112,115,105,108,111,110,0,117,117,109,108,0,119,101,105,101,114,112,0,120,105,0,121,97,99,117,116,101,0,121,101,110,0,121,117,109,108,0,122,101,116,97,0,122,119,106,0,122,119,110,106,0,85,84,70,56,32,99,111,100,101,115,32,62,32,52,32,98,121,116,101,115,32,97,114,101,32,110,111,116,32,99,117,114,114,101,110,116,108,121,32,115,117,112,112,111,114,116,101,100,32,40,103,114,97,112,104,32,37,115,41,32,45,32,116,114,101,97,116,101,100,32,97,115,32,76,97,116,105,110,45,49,46,32,80,101,114,104,97,112,115,32,34,45,71,99,104,97,114,115,101,116,61,108,97,116,105,110,49,34,32,105,115,32,110,101,101,100,101,100,63,10,0,73,110,118,97,108,105,100,32,37,100,45,98,121,116,101,32,85,84,70,56,32,102,111,117,110,100,32,105,110,32,105,110,112,117,116,32,111,102,32,103,114,97,112,104,32,37,115,32,45,32,116,114,101,97,116,101,100,32,97,115,32,76,97,116,105,110,45,49,46,32,80,101,114,104,97,112,115,32,34,45,71,99,104,97,114,115,101,116,61,108,97,116,105,110,49,34,32,105,115,32,110,101,101,100,101,100,63,10,0,98,122,46,115,105,122,101,0,111,118,101,114,108,97,112,95,98,101,122,105,101,114,0,117,114,118,101,100,0,111,109,112,111,117,110,100,0,97,108,115,101,0,105,110,101,0,111,110,101,0,111,0,114,116,104,111,0,111,108,121,108,105,110,101,0,112,108,105,110,101,0,114,117,101,0,101,115,0,85,110,107,110,111,119,110,32,34,115,112,108,105,110,101,115,34,32,118,97,108,117,101,58,32,34,37,115,34,32,45,32,105,103,110,111,114,101,100,10,0,115,112,108,105,110,101,115,0,111,100,98,0,79,114,116,104,111,103,111,110,97,108,32,101,100,103,101,115,32,100,111,32,110,111,116,32,99,117,114,114,101,110,116,108,121,32,104,97,110,100,108,101,32,101,100,103,101,32,108,97,98,101,108,115,46,32,84,114,121,32,117,115,105,110,103,32,120,108,97,98,101,108,115,46,10,0,111,114,116,104,111,32,37,115,32,37,115,10,0,99,104,97,110,105,0,111,114,116,104,111,46,99,0,99,104,97,110,83,101,97,114,99,104,0,99,112,0,37,37,33,80,83,45,65,100,111,98,101,45,50,46,48,10,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,40,97,116,101,110,100,41,10,47,112,111,105,110,116,32,123,10,32,32,47,89,32,101,120,99,104,32,100,101,102,10,32,32,47,88,32,101,120,99,104,32,100,101,102,10,32,32,110,101,119,112,97,116,104,10,32,32,88,32,89,32,51,32,48,32,51,54,48,32,97,114,99,32,102,105,108,108,10,125,32,100,101,102,10,47,99,101,108,108,32,123,10,32,32,47,89,32,101,120,99,104,32,100,101,102,10,32,32,47,88,32,101,120,99,104,32,100,101,102,10,32,32,47,121,32,101,120,99,104,32,100,101,102,10,32,32,47,120,32,101,120,99,104,32,100,101,102,10,32,32,110,101,119,112,97,116,104,10,32,32,120,32,121,32,109,111,118,101,116,111,10,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,125,32,100,101,102,10,47,110,111,100,101,32,123,10,32,47,117,32,101,120,99,104,32,100,101,102,10,32,47,114,32,101,120,99,104,32,100,101,102,10,32,47,100,32,101,120,99,104,32,100,101,102,10,32,47,108,32,101,120,99,104,32,100,101,102,10,32,110,101,119,112,97,116,104,32,108,32,100,32,109,111,118,101,116,111,10,32,114,32,100,32,108,105,110,101,116,111,32,114,32,117,32,108,105,110,101,116,111,32,108,32,117,32,108,105,110,101,116,111,10,32,99,108,111,115,101,112,97,116,104,32,102,105,108,108,10,125,32,100,101,102,10,10,0,37,100,32,37,100,32,116,114,97,110,115,108,97,116,101,10,0,48,46,56,32,48,46,56,32,48,46,56,32,115,101,116,114,103,98,99,111,108,111,114,10,0,115,104,111,119,112,97,103,101,10,37,37,37,37,84,114,97,105,108,101,114,10,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,110,101,119,112,97,116,104,32,37,100,32,37,100,32,109,111,118,101,116,111,10,0,37,100,32,37,100,32,108,105,110,101,116,111,10,0,37,100,32,37,100,32,108,105,110,101,116,111,32,115,116,114,111,107,101,10,0,99,104,97,110,110,101,108,32,37,100,32,40,37,102,44,37,102,41,10,0,32,45,62,10,0,32,32,32,32,32,0,40,40,37,102,44,37,102,41,44,40,37,102,44,37,102,41,41,32,37,115,32,37,115,0,66,95,82,73,71,72,84,0,66,95,68,79,87,78,0,66,95,76,69,70,84,0,66,95,85,80,0,66,95,78,79,68,69,0,115,101,103,0,110,101,120,116,95,115,101,103,0,100,101,99,105,100,101,95,112,111,105,110,116,0,105,110,99,111,109,112,97,114,97,98,108,101,32,115,101,103,109,101,110,116,115,32,33,33,32,45,45,32,65,98,111,114,116,105,110,103,10,0,115,49,45,62,99,111,109,109,95,99,111,111,114,100,61,61,115,50,45,62,99,111,109,109,95,99,111,111,114,100,0,105,115,95,112,97,114,97,108,108,101,108,0,103,114,97,112,104,32,71,32,123,10,0,32,110,111,100,101,91,115,104,97,112,101,61,112,111,105,110,116,93,10,0,32,32,37,100,32,91,112,111,115,61,34,37,100,44,37,100,34,93,10,0,32,32,37,100,32,45,45,32,37,100,91,108,101,110,61,34,37,102,34,93,10,0,125,10,0,99,111,108,111,114,32,37,115,0,37,115,32,105,115,32,110,111,116,32,97,32,107,110,111,119,110,32,99,111,108,111,114,46,10,0,101,114,114,111,114,32,105,110,32,99,111,108,120,108,97,116,101,40,41,10,0,115,111,108,105,100,0,105,110,118,105,115,105,98,108,101,0,98,111,108,100,0,115,101,116,108,105,110,101,119,105,100,116,104,0,102,105,108,108,101,100,0,117,110,102,105,108,108,101,100,0,116,97,112,101,114,101,100,0,103,118,114,101,110,100,101,114,95,115,101,116,95,115,116,121,108,101,58,32,117,110,115,117,112,112,111,114,116,101,100,32,115,116,121,108,101,32,37,115,32,45,32,105,103,110,111,114,105,110,103,10,0,103,118,114,101,110,100,101,114,46,99,0,103,118,114,101,110,100,101,114,95,117,115,101,114,115,104,97,112,101,0,110,97,109,101,0,110,97,109,101,91,48,93,0,98,111,116,104,0,108,97,121,111,117,116,0,76,97,121,111,117,116,32,116,121,112,101,58,32,34,37,115,34,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,46,32,85,115,101,32,111,110,101,32,111,102,58,37,115,10,0,106,111,98,0,103,118,108,111,97,100,105,109,97,103,101,46,99,0,103,118,108,111,97,100,105,109,97,103,101,0,117,115,0,117,115,45,62,110,97,109,101,0,117,115,45,62,110,97,109,101,91,48,93,0,78,111,32,108,111,97,100,105,109,97,103,101,32,112,108,117,103,105,110,32,102,111,114,32,34,37,115,34,10,0,81,0,76,101,102,116,0,75,80,95,76,101,102,116,0,82,105,103,104,116,0,75,80,95,82,105,103,104,116,0,85,112,0,75,80,95,85,112,0,68,111,119,110,0,75,80,95,68,111,119,110,0,112,108,117,115,0,75,80,95,65,100,100,0,109,105,110,117,115,0,75,80,95,83,117,98,116,114,97,99,116,0,70,0,101,100,103,101,0,116,97,105,108,112,111,114,116,0,104,101,97,100,112,111,114,116,0,107,101,121,0,85,82,76,0,110,111,100,101,0,100,105,103,114,97,112,104,0,103,114,97,112,104,0,115,117,98,103,114,97,112,104,0,95,76,84,88,95,108,105,98,114,97,114,121,0,116,101,120,116,108,97,121,111,117,116,0,111,98,106,112,45,62,108,98,108,0,120,108,97,98,101,108,115,46,99,0,120,108,97,100,106,117,115,116,0,120,108,105,110,116,101,114,115,101,99,116,105,111,110,115,0,108,112,32,33,61,32,99,108,112,0,103,101,116,105,110,116,114,115,120,105,0,111,98,106,112,49,45,62,115,122,46,120,32,61,61,32,48,32,38,38,32,111,98,106,112,49,45,62,115,122,46,121,32,61,61,32,48,0,108,98,108,101,110,99,108,111,115,105,110,103,0,118,112,0,120,108,104,100,120,117,110,108,111,97,100,0,115,105,122,101,61,61,102,114,101,101,100,0,114,101,99,116,46,98,111,117,110,100,97,114,121,91,50,93,32,60,32,73,78,84,95,77,65,88,0,111,98,106,112,108,112,109,107,115,0,114,101,99,116,46,98,111,117,110,100,97,114,121,91,51,93,32,60,32,73,78,84,95,77,65,88,0,111,117,116,32,111,102,32,109,101,109,111,114,121,10,0,35,37,50,120,37,50,120,37,50,120,37,50,120,0,37,108,102,37,108,102,37,108,102,0,47,97,99,99,101,110,116,51,47,49,0,47,97,99,99,101,110,116,51,47,50,0,47,97,99,99,101,110,116,51,47,51,0,47,97,99,99,101,110,116,52,47,49,0,47,97,99,99,101,110,116,52,47,50,0,47,97,99,99,101,110,116,52,47,51,0,47,97,99,99,101,110,116,52,47,52,0,47,97,99,99,101,110,116,53,47,49,0,47,97,99,99,101,110,116,53,47,50,0,47,97,99,99,101,110,116,53,47,51,0,47,97,99,99,101,110,116,53,47,52,0,47,97,99,99,101,110,116,53,47,53,0,47,97,99,99,101,110,116,54,47,49,0,47,97,99,99,101,110,116,54,47,50,0,47,97,99,99,101,110,116,54,47,51,0,47,97,99,99,101,110,116,54,47,52,0,47,97,99,99,101,110,116,54,47,53,0,47,97,99,99,101,110,116,54,47,54,0,47,97,99,99,101,110,116,55,47,49,0,47,97,99,99,101,110,116,55,47,50,0,47,97,99,99,101,110,116,55,47,51,0,47,97,99,99,101,110,116,55,47,52,0,47,97,99,99,101,110,116,55,47,53,0,47,97,99,99,101,110,116,55,47,54,0,47,97,99,99,101,110,116,55,47,55,0,47,97,99,99,101,110,116,56,47,49,0,47,97,99,99,101,110,116,56,47,50,0,47,97,99,99,101,110,116,56,47,51,0,47,97,99,99,101,110,116,56,47,52,0,47,97,99,99,101,110,116,56,47,53,0,47,97,99,99,101,110,116,56,47,54,0,47,97,99,99,101,110,116,56,47,55,0,47,97,99,99,101,110,116,56,47,56,0,47,98,108,117,101,115,51,47,49,0,47,98,108,117,101,115,51,47,50,0,47,98,108,117,101,115,51,47,51,0,47,98,108,117,101,115,52,47,49,0,47,98,108,117,101,115,52,47,50,0,47,98,108,117,101,115,52,47,51,0,47,98,108,117,101,115,52,47,52,0,47,98,108,117,101,115,53,47,49,0,47,98,108,117,101,115,53,47,50,0,47,98,108,117,101,115,53,47,51,0,47,98,108,117,101,115,53,47,52,0,47,98,108,117,101,115,53,47,53,0,47,98,108,117,101,115,54,47,49,0,47,98,108,117,101,115,54,47,50,0,47,98,108,117,101,115,54,47,51,0,47,98,108,117,101,115,54,47,52,0,47,98,108,117,101,115,54,47,53,0,47,98,108,117,101,115,54,47,54,0,47,98,108,117,101,115,55,47,49,0,47,98,108,117,101,115,55,47,50,0,47,98,108,117,101,115,55,47,51,0,47,98,108,117,101,115,55,47,52,0,47,98,108,117,101,115,55,47,53],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+102424);allocate([0,47,98,108,117,101,115,55,47,54,0,47,98,108,117,101,115,55,47,55,0,47,98,108,117,101,115,56,47,49,0,47,98,108,117,101,115,56,47,50,0,47,98,108,117,101,115,56,47,51,0,47,98,108,117,101,115,56,47,52,0,47,98,108,117,101,115,56,47,53,0,47,98,108,117,101,115,56,47,54,0,47,98,108,117,101,115,56,47,55,0,47,98,108,117,101,115,56,47,56,0,47,98,108,117,101,115,57,47,49,0,47,98,108,117,101,115,57,47,50,0,47,98,108,117,101,115,57,47,51,0,47,98,108,117,101,115,57,47,52,0,47,98,108,117,101,115,57,47,53,0,47,98,108,117,101,115,57,47,54,0,47,98,108,117,101,115,57,47,55,0,47,98,108,117,101,115,57,47,56,0,47,98,108,117,101,115,57,47,57,0,47,98,114,98,103,49,48,47,49,0,47,98,114,98,103,49,48,47,49,48,0,47,98,114,98,103,49,48,47,50,0,47,98,114,98,103,49,48,47,51,0,47,98,114,98,103,49,48,47,52,0,47,98,114,98,103,49,48,47,53,0,47,98,114,98,103,49,48,47,54,0,47,98,114,98,103,49,48,47,55,0,47,98,114,98,103,49,48,47,56,0,47,98,114,98,103,49,48,47,57,0,47,98,114,98,103,49,49,47,49,0,47,98,114,98,103,49,49,47,49,48,0,47,98,114,98,103,49,49,47,49,49,0,47,98,114,98,103,49,49,47,50,0,47,98,114,98,103,49,49,47,51,0,47,98,114,98,103,49,49,47,52,0,47,98,114,98,103,49,49,47,53,0,47,98,114,98,103,49,49,47,54,0,47,98,114,98,103,49,49,47,55,0,47,98,114,98,103,49,49,47,56,0,47,98,114,98,103,49,49,47,57,0,47,98,114,98,103,51,47,49,0,47,98,114,98,103,51,47,50,0,47,98,114,98,103,51,47,51,0,47,98,114,98,103,52,47,49,0,47,98,114,98,103,52,47,50,0,47,98,114,98,103,52,47,51,0,47,98,114,98,103,52,47,52,0,47,98,114,98,103,53,47,49,0,47,98,114,98,103,53,47,50,0,47,98,114,98,103,53,47,51,0,47,98,114,98,103,53,47,52,0,47,98,114,98,103,53,47,53,0,47,98,114,98,103,54,47,49,0,47,98,114,98,103,54,47,50,0,47,98,114,98,103,54,47,51,0,47,98,114,98,103,54,47,52,0,47,98,114,98,103,54,47,53,0,47,98,114,98,103,54,47,54,0,47,98,114,98,103,55,47,49,0,47,98,114,98,103,55,47,50,0,47,98,114,98,103,55,47,51,0,47,98,114,98,103,55,47,52,0,47,98,114,98,103,55,47,53,0,47,98,114,98,103,55,47,54,0,47,98,114,98,103,55,47,55,0,47,98,114,98,103,56,47,49,0,47,98,114,98,103,56,47,50,0,47,98,114,98,103,56,47,51,0,47,98,114,98,103,56,47,52,0,47,98,114,98,103,56,47,53,0,47,98,114,98,103,56,47,54,0,47,98,114,98,103,56,47,55,0,47,98,114,98,103,56,47,56,0,47,98,114,98,103,57,47,49,0,47,98,114,98,103,57,47,50,0,47,98,114,98,103,57,47,51,0,47,98,114,98,103,57,47,52,0,47,98,114,98,103,57,47,53,0,47,98,114,98,103,57,47,54,0,47,98,114,98,103,57,47,55,0,47,98,114,98,103,57,47,56,0,47,98,114,98,103,57,47,57,0,47,98,117,103,110,51,47,49,0,47,98,117,103,110,51,47,50,0,47,98,117,103,110,51,47,51,0,47,98,117,103,110,52,47,49,0,47,98,117,103,110,52,47,50,0,47,98,117,103,110,52,47,51,0,47,98,117,103,110,52,47,52,0,47,98,117,103,110,53,47,49,0,47,98,117,103,110,53,47,50,0,47,98,117,103,110,53,47,51,0,47,98,117,103,110,53,47,52,0,47,98,117,103,110,53,47,53,0,47,98,117,103,110,54,47,49,0,47,98,117,103,110,54,47,50,0,47,98,117,103,110,54,47,51,0,47,98,117,103,110,54,47,52,0,47,98,117,103,110,54,47,53,0,47,98,117,103,110,54,47,54,0,47,98,117,103,110,55,47,49,0,47,98,117,103,110,55,47,50,0,47,98,117,103,110,55,47,51,0,47,98,117,103,110,55,47,52,0,47,98,117,103,110,55,47,53,0,47,98,117,103,110,55,47,54,0,47,98,117,103,110,55,47,55,0,47,98,117,103,110,56,47,49,0,47,98,117,103,110,56,47,50,0,47,98,117,103,110,56,47,51,0,47,98,117,103,110,56,47,52,0,47,98,117,103,110,56,47,53,0,47,98,117,103,110,56,47,54,0,47,98,117,103,110,56,47,55,0,47,98,117,103,110,56,47,56,0,47,98,117,103,110,57,47,49,0,47,98,117,103,110,57,47,50,0,47,98,117,103,110,57,47,51,0,47,98,117,103,110,57,47,52,0,47,98,117,103,110,57,47,53,0,47,98,117,103,110,57,47,54,0,47,98,117,103,110,57,47,55,0,47,98,117,103,110,57,47,56,0,47,98,117,103,110,57,47,57,0,47,98,117,112,117,51,47,49,0,47,98,117,112,117,51,47,50,0,47,98,117,112,117,51,47,51,0,47,98,117,112,117,52,47,49,0,47,98,117,112,117,52,47,50,0,47,98,117,112,117,52,47,51,0,47,98,117,112,117,52,47,52,0,47,98,117,112,117,53,47,49,0,47,98,117,112,117,53,47,50,0,47,98,117,112,117,53,47,51,0,47,98,117,112,117,53,47,52,0,47,98,117,112,117,53,47,53,0,47,98,117,112,117,54,47,49,0,47,98,117,112,117,54,47,50,0,47,98,117,112,117,54,47,51,0,47,98,117,112,117,54,47,52,0,47,98,117,112,117,54,47,53,0,47,98,117,112,117,54,47,54,0,47,98,117,112,117,55,47,49,0,47,98,117,112,117,55,47,50,0,47,98,117,112,117,55,47,51,0,47,98,117,112,117,55,47,52,0,47,98,117,112,117,55,47,53,0,47,98,117,112,117,55,47,54,0,47,98,117,112,117,55,47,55,0,47,98,117,112,117,56,47,49,0,47,98,117,112,117,56,47,50,0,47,98,117,112,117,56,47,51,0,47,98,117,112,117,56,47,52,0,47,98,117,112,117,56,47,53,0,47,98,117,112,117,56,47,54,0,47,98,117,112,117,56,47,55,0,47,98,117,112,117,56,47,56,0,47,98,117,112,117,57,47,49,0,47,98,117,112,117,57,47,50,0,47,98,117,112,117,57,47,51,0,47,98,117,112,117,57,47,52,0,47,98,117,112,117,57,47,53,0,47,98,117,112,117,57,47,54,0,47,98,117,112,117,57,47,55,0,47,98,117,112,117,57,47,56,0,47,98,117,112,117,57,47,57,0,47,100,97,114,107,50,51,47,49,0,47,100,97,114,107,50,51,47,50,0,47,100,97,114,107,50,51,47,51,0,47,100,97,114,107,50,52,47,49,0,47,100,97,114,107,50,52,47,50,0,47,100,97,114,107,50,52,47,51,0,47,100,97,114,107,50,52,47,52,0,47,100,97,114,107,50,53,47,49,0,47,100,97,114,107,50,53,47,50,0,47,100,97,114,107,50,53,47,51,0,47,100,97,114,107,50,53,47,52,0,47,100,97,114,107,50,53,47,53,0,47,100,97,114,107,50,54,47,49,0,47,100,97,114,107,50,54,47,50,0,47,100,97,114,107,50,54,47,51,0,47,100,97,114,107,50,54,47,52,0,47,100,97,114,107,50,54,47,53,0,47,100,97,114,107,50,54,47,54,0,47,100,97,114,107,50,55,47,49,0,47,100,97,114,107,50,55,47,50,0,47,100,97,114,107,50,55,47,51,0,47,100,97,114,107,50,55,47,52,0,47,100,97,114,107,50,55,47,53,0,47,100,97,114,107,50,55,47,54,0,47,100,97,114,107,50,55,47,55,0,47,100,97,114,107,50,56,47,49,0,47,100,97,114,107,50,56,47,50,0,47,100,97,114,107,50,56,47,51,0,47,100,97,114,107,50,56,47,52,0,47,100,97,114,107,50,56,47,53,0,47,100,97,114,107,50,56,47,54,0,47,100,97,114,107,50,56,47,55,0,47,100,97,114,107,50,56,47,56,0,47,103,110,98,117,51,47,49,0,47,103,110,98,117,51,47,50,0,47,103,110,98,117,51,47,51,0,47,103,110,98,117,52,47,49,0,47,103,110,98,117,52,47,50,0,47,103,110,98,117,52,47,51,0,47,103,110,98,117,52,47,52,0,47,103,110,98,117,53,47,49,0,47,103,110,98,117,53,47,50,0,47,103,110,98,117,53,47,51,0,47,103,110,98,117,53,47,52,0,47,103,110,98,117,53,47,53,0,47,103,110,98,117,54,47,49,0,47,103,110,98,117,54,47,50,0,47,103,110,98,117,54,47,51,0,47,103,110,98,117,54,47,52,0,47,103,110,98,117,54,47,53,0,47,103,110,98,117,54,47,54,0,47,103,110,98,117,55,47,49,0,47,103,110,98,117,55,47,50,0,47,103,110,98,117,55,47,51,0,47,103,110,98,117,55,47,52,0,47,103,110,98,117,55,47,53,0,47,103,110,98,117,55,47,54,0,47,103,110,98,117,55,47,55,0,47,103,110,98,117,56,47,49,0,47,103,110,98,117,56,47,50,0,47,103,110,98,117,56,47,51,0,47,103,110,98,117,56,47,52,0,47,103,110,98,117,56,47,53,0,47,103,110,98,117,56,47,54,0,47,103,110,98,117,56,47,55,0,47,103,110,98,117,56,47,56,0,47,103,110,98,117,57,47,49,0,47,103,110,98,117,57,47,50,0,47,103,110,98,117,57,47,51,0,47,103,110,98,117,57,47,52,0,47,103,110,98,117,57,47,53,0,47,103,110,98,117,57,47,54,0,47,103,110,98,117,57,47,55,0,47,103,110,98,117,57,47,56,0,47,103,110,98,117,57,47,57,0,47,103,114,101,101,110,115,51,47,49,0,47,103,114,101,101,110,115,51,47,50,0,47,103,114,101,101,110,115,51,47,51,0,47,103,114,101,101,110,115,52,47,49,0,47,103,114,101,101,110,115,52,47,50,0,47,103,114,101,101,110,115,52,47,51,0,47,103,114,101,101,110,115,52,47,52,0,47,103,114,101,101,110,115,53,47,49,0,47,103,114,101,101,110,115,53,47,50,0,47,103,114,101,101,110,115,53,47,51,0,47,103,114,101,101,110,115,53,47,52,0,47,103,114,101,101,110,115,53,47,53,0,47,103,114,101,101,110,115,54,47,49,0,47,103,114,101,101,110,115,54,47,50,0,47,103,114,101,101,110,115,54,47,51,0,47,103,114,101,101,110,115,54,47,52,0,47,103,114,101,101,110,115,54,47,53,0,47,103,114,101,101,110,115,54,47,54,0,47,103,114,101,101,110,115,55,47,49,0,47,103,114,101,101,110,115,55,47,50,0,47,103,114,101,101,110,115,55,47,51,0,47,103,114,101,101,110,115,55,47,52,0,47,103,114,101,101,110,115,55,47,53,0,47,103,114,101,101,110,115,55,47,54,0,47,103,114,101,101,110,115,55,47,55,0,47,103,114,101,101,110,115,56,47,49,0,47,103,114,101,101,110,115,56,47,50,0,47,103,114,101,101,110,115,56,47,51,0,47,103,114,101,101,110,115,56,47,52,0,47,103,114,101,101,110,115,56,47,53,0,47,103,114,101,101,110,115,56,47,54,0,47,103,114,101,101,110,115,56,47,55,0,47,103,114,101,101,110,115,56,47,56,0,47,103,114,101,101,110,115,57,47,49,0,47,103,114,101,101,110,115,57,47,50,0,47,103,114,101,101,110,115,57,47,51,0,47,103,114,101,101,110,115,57,47,52,0,47,103,114,101,101,110,115,57,47,53,0,47,103,114,101,101,110,115,57,47,54,0,47,103,114,101,101,110,115,57,47,55,0,47,103,114,101,101,110,115,57,47,56,0,47,103,114,101,101,110,115,57,47,57,0,47,103,114,101,121,115,51,47,49,0,47,103,114,101,121,115,51,47,50,0,47,103,114,101,121,115,51,47,51,0,47,103,114,101,121,115,52,47,49,0,47,103,114,101,121,115,52,47,50,0,47,103,114,101,121,115,52,47,51,0,47,103,114,101,121,115,52,47,52,0,47,103,114,101,121,115,53,47,49,0,47,103,114,101,121,115,53,47,50,0,47,103,114,101,121,115,53,47,51,0,47,103,114,101,121,115,53,47,52,0,47,103,114,101,121,115,53,47,53,0,47,103,114,101,121,115,54,47,49,0,47,103,114,101,121,115,54,47,50,0,47,103,114,101,121,115,54,47,51,0,47,103,114,101,121,115,54,47,52,0,47,103,114,101,121,115,54,47,53,0,47,103,114,101,121,115,54,47,54,0,47,103,114,101,121,115,55,47,49,0,47,103,114,101,121,115,55,47,50,0,47,103,114,101,121,115,55,47,51,0,47,103,114,101,121,115,55,47,52,0,47,103,114,101,121,115,55,47,53,0,47,103,114,101,121,115,55,47,54,0,47,103,114,101,121,115,55,47,55,0,47,103,114,101,121,115,56,47,49,0,47,103,114,101,121,115,56,47,50,0,47,103,114,101,121,115,56,47,51,0,47,103,114,101,121,115,56,47,52,0,47,103,114,101,121,115,56,47,53,0,47,103,114,101,121,115,56,47,54,0,47,103,114,101,121,115,56,47,55,0,47,103,114,101,121,115,56,47,56,0,47,103,114,101,121,115,57,47,49,0,47,103,114,101,121,115,57,47,50,0,47,103,114,101,121,115,57,47,51,0,47,103,114,101,121,115,57,47,52,0,47,103,114,101,121,115,57,47,53,0,47,103,114,101,121,115,57,47,54,0,47,103,114,101,121,115,57,47,55,0,47,103,114,101,121,115,57,47,56,0,47,103,114,101,121,115,57,47,57,0,47,111,114,97,110,103,101,115,51,47,49,0,47,111,114,97,110,103,101,115,51,47,50,0,47,111,114,97,110,103,101,115,51,47,51,0,47,111,114,97,110,103,101,115,52,47,49,0,47,111,114,97,110,103,101,115,52,47,50,0,47,111,114,97,110,103,101,115,52,47,51,0,47,111,114,97,110,103,101,115,52,47,52,0,47,111,114,97,110,103,101,115,53,47,49,0,47,111,114,97,110,103,101,115,53,47,50,0,47,111,114,97,110,103,101,115,53,47,51,0,47,111,114,97,110,103,101,115,53,47,52,0,47,111,114,97,110,103,101,115,53,47,53,0,47,111,114,97,110,103,101,115,54,47,49,0,47,111,114,97,110,103,101,115,54,47,50,0,47,111,114,97,110,103,101,115,54,47,51,0,47,111,114,97,110,103,101,115,54,47,52,0,47,111,114,97,110,103,101,115,54,47,53,0,47,111,114,97,110,103,101,115,54,47,54,0,47,111,114,97,110,103,101,115,55,47,49,0,47,111,114,97,110,103,101,115,55,47,50,0,47,111,114,97,110,103,101,115,55,47,51,0,47,111,114,97,110,103,101,115,55,47,52,0,47,111,114,97,110,103,101,115,55,47,53,0,47,111,114,97,110,103,101,115,55,47,54,0,47,111,114,97,110,103,101,115,55,47,55,0,47,111,114,97,110,103,101,115,56,47,49,0,47,111,114,97,110,103,101,115,56,47,50,0,47,111,114,97,110,103,101,115,56,47,51,0,47,111,114,97,110,103,101,115,56,47,52,0,47,111,114,97,110,103,101,115,56,47,53,0,47,111,114,97,110,103,101,115,56,47,54,0,47,111,114,97,110,103,101,115,56,47,55,0,47,111,114,97,110,103,101,115,56,47,56,0,47,111,114,97,110,103,101,115,57,47,49,0,47,111,114,97,110,103,101,115,57,47,50,0,47,111,114,97,110,103,101,115,57,47,51,0,47,111,114,97,110,103,101,115,57,47,52,0,47,111,114,97,110,103,101,115,57,47,53,0,47,111,114,97,110,103,101,115,57,47,54,0,47,111,114,97,110,103,101,115,57,47,55,0,47,111,114,97,110,103,101,115,57,47,56,0,47,111,114,97,110,103,101,115,57,47,57,0,47,111,114,114,100,51,47,49,0,47,111,114,114,100,51,47,50,0,47,111,114,114,100,51,47,51,0,47,111,114,114,100,52,47,49,0,47,111,114,114,100,52,47,50,0,47,111,114,114,100,52,47,51,0,47,111,114,114,100,52,47,52,0,47,111,114,114,100,53,47,49,0,47,111,114,114,100,53,47,50,0,47,111,114,114,100,53,47,51,0,47,111,114,114,100,53,47,52,0,47,111,114,114,100,53,47,53,0,47,111,114,114,100,54,47,49,0,47,111,114,114,100,54,47,50,0,47,111,114,114,100,54,47,51,0,47,111,114,114,100,54,47,52,0,47,111,114,114,100,54,47,53,0,47,111,114,114,100,54,47,54,0,47,111,114,114,100,55,47,49,0,47,111,114,114,100,55,47,50,0,47,111,114,114,100,55,47,51,0,47,111,114,114,100,55,47,52,0,47,111,114,114,100,55,47,53,0,47,111,114,114,100,55,47,54,0,47,111,114,114,100,55,47,55,0,47,111,114,114,100,56,47,49,0,47,111,114,114,100,56,47,50,0,47,111,114,114,100,56,47,51,0,47,111,114,114,100,56,47,52,0,47,111,114,114,100,56,47,53,0,47,111,114,114,100,56,47,54,0,47,111,114,114,100,56,47,55,0,47,111,114,114,100,56,47,56,0,47,111,114,114,100,57,47,49,0,47,111,114,114,100,57,47,50,0,47,111,114,114,100,57,47,51,0,47,111,114,114,100,57,47,52,0,47,111,114,114,100,57,47,53,0,47,111,114,114,100,57,47,54,0,47,111,114,114,100,57,47,55,0,47,111,114,114,100,57,47,56,0,47,111,114,114,100,57,47,57,0,47,112,97,105,114,101,100,49,48,47,49,0,47,112,97,105,114,101,100,49,48,47,49,48,0,47,112,97,105,114,101,100,49,48,47,50,0,47,112,97,105,114,101,100,49,48,47,51,0,47,112,97,105,114,101,100,49,48,47,52,0,47,112,97,105,114,101,100,49,48,47,53,0,47,112,97,105,114,101,100,49,48,47,54,0,47,112,97,105,114,101,100,49,48,47,55,0,47,112,97,105,114,101,100,49,48,47,56,0,47,112,97,105,114,101,100,49,48,47,57,0,47,112,97,105,114,101,100,49,49,47,49,0,47,112,97,105,114,101,100,49,49,47,49,48,0,47,112,97,105,114,101,100,49,49,47,49,49,0,47,112,97,105,114,101,100,49,49,47,50,0,47,112,97,105,114,101,100,49,49,47,51,0,47,112,97,105,114,101,100,49,49,47,52,0,47,112,97,105,114,101,100,49,49,47,53,0,47,112,97,105,114,101,100,49,49,47,54,0,47,112,97,105,114,101,100,49,49,47,55,0,47,112,97,105,114,101,100,49,49,47,56,0,47,112,97,105,114,101,100,49,49,47,57,0,47,112,97,105,114,101,100,49,50,47,49,0,47,112,97,105,114,101,100,49,50,47,49,48,0,47,112,97,105,114,101,100,49,50,47,49,49,0,47,112,97,105,114,101,100,49,50,47,49,50,0,47,112,97,105,114,101,100,49,50,47,50,0,47,112,97,105,114,101,100,49,50,47,51,0,47,112,97,105,114,101,100,49,50,47,52,0,47,112,97,105,114,101,100,49,50,47,53,0,47,112,97,105,114,101,100,49,50,47,54,0,47,112,97,105,114,101,100,49,50,47,55,0,47,112,97,105,114,101,100,49,50,47,56,0,47,112,97,105,114,101,100,49,50,47,57,0,47,112,97,105,114,101,100,51,47,49,0,47,112,97,105,114,101,100,51,47,50,0,47,112,97,105,114,101,100,51,47,51,0,47,112,97,105,114,101,100,52,47,49,0,47,112,97,105,114,101,100,52,47,50,0,47,112,97,105,114,101,100,52,47,51,0,47,112,97,105,114,101,100,52,47,52,0,47,112,97,105,114,101,100,53,47,49,0,47,112,97,105,114,101,100,53,47,50,0,47,112,97,105,114,101,100,53,47,51,0,47,112,97,105,114,101,100,53,47,52,0,47,112,97,105,114,101,100,53,47,53,0,47,112,97,105,114,101,100,54,47,49,0,47,112,97,105,114,101,100,54,47,50,0,47,112,97,105,114,101,100,54,47,51,0,47,112,97,105,114,101,100,54,47,52,0,47,112,97,105,114,101,100,54,47,53,0,47,112,97,105,114,101,100,54,47,54,0,47,112,97,105,114,101,100,55,47,49,0,47,112,97,105,114,101,100,55,47,50,0,47,112,97,105,114,101,100,55,47,51,0,47,112,97,105,114,101,100,55,47,52,0,47,112,97,105,114,101,100,55,47,53,0,47,112,97,105,114,101,100,55,47,54,0,47,112,97,105,114,101,100,55,47,55,0,47,112,97,105,114,101,100,56,47,49,0,47,112,97,105,114,101,100,56,47,50,0,47,112,97,105,114,101,100,56,47,51,0,47,112,97,105,114,101,100,56,47,52,0,47,112,97,105,114,101,100,56,47,53,0,47,112,97,105,114,101,100,56,47,54,0,47,112,97,105,114,101,100,56,47,55,0,47,112,97,105,114,101,100,56,47,56,0,47,112,97,105,114,101,100,57,47,49,0,47,112,97,105,114,101,100,57,47,50,0,47,112,97,105,114,101,100,57,47,51,0,47,112,97,105,114,101,100,57,47,52,0,47,112,97,105,114,101,100,57,47,53,0,47,112,97,105,114,101,100,57,47,54,0,47,112,97,105,114,101,100,57,47,55,0,47,112,97,105,114,101,100,57,47,56,0,47,112,97,105,114,101,100,57,47,57,0,47,112,97,115,116,101,108,49,51,47,49,0,47,112,97,115,116,101,108,49,51,47,50,0,47,112,97,115,116,101,108,49,51,47,51,0,47,112,97,115,116,101,108,49,52,47,49,0,47,112,97,115,116,101,108,49,52,47,50,0,47,112,97,115,116,101,108,49,52,47,51,0,47,112,97,115,116,101,108,49,52,47,52,0,47,112,97,115,116,101,108,49,53,47,49,0,47,112,97,115,116,101,108,49,53,47,50,0,47,112,97,115,116,101,108,49,53,47,51,0,47,112,97,115,116,101,108,49,53,47,52,0,47,112,97,115,116,101,108,49,53,47,53,0,47,112,97,115,116,101,108,49,54,47,49,0,47,112,97,115,116,101,108,49,54,47,50,0,47,112,97,115,116,101,108,49,54,47,51,0,47,112,97,115,116,101,108,49,54,47,52,0,47,112,97,115,116,101,108,49,54,47,53,0,47,112,97,115,116,101,108,49,54,47,54,0,47,112,97,115,116,101,108,49,55,47,49,0,47,112,97,115,116,101,108,49,55,47,50,0,47,112,97,115,116,101,108,49,55,47,51,0,47,112,97,115,116,101,108,49,55,47,52,0,47,112,97,115,116,101,108,49,55,47,53,0,47,112,97,115,116,101,108,49,55,47,54,0,47,112,97,115,116,101,108,49,55,47,55,0,47,112,97,115,116,101,108,49,56,47,49,0,47,112,97,115,116,101,108,49,56,47,50,0,47,112,97,115,116,101,108,49,56,47,51,0,47,112,97,115,116,101,108,49,56,47,52,0,47,112,97,115,116,101,108,49,56,47,53,0,47,112,97,115,116,101,108,49,56,47,54,0,47,112,97,115,116,101,108,49,56,47,55,0,47,112,97,115,116,101,108,49,56,47,56,0,47,112,97,115,116,101,108,49,57,47,49,0,47,112,97,115,116,101,108,49,57,47,50,0,47,112,97,115,116,101,108,49,57,47,51,0,47,112,97,115,116,101,108,49,57,47,52,0,47,112,97,115,116,101,108,49,57,47,53,0,47,112,97,115,116,101,108,49,57,47,54,0,47,112,97,115,116,101,108,49,57,47,55,0,47,112,97,115,116,101,108,49,57,47,56,0,47,112,97,115,116,101,108,49,57,47,57,0,47,112,97,115,116,101,108,50,51,47,49,0,47,112,97,115,116,101,108,50,51,47,50,0,47,112,97,115,116,101,108,50,51,47,51,0,47,112,97,115,116,101,108,50,52,47,49,0,47,112,97,115,116,101,108,50,52,47,50,0,47,112,97,115,116,101,108,50,52,47,51,0,47,112,97,115,116,101,108,50,52,47,52,0,47,112,97,115,116,101,108,50,53,47,49,0,47,112,97,115,116,101,108,50,53,47,50,0,47,112,97,115,116,101,108,50,53,47,51,0,47,112,97,115,116,101,108,50,53,47,52,0,47,112,97,115,116,101,108,50,53,47,53,0,47,112,97,115,116,101,108,50,54,47,49,0,47,112,97,115,116,101,108,50,54,47,50,0,47,112,97,115,116,101,108,50,54,47,51,0,47,112,97,115,116,101,108,50,54,47,52,0,47,112,97,115,116,101,108,50,54,47,53,0,47,112,97,115,116,101,108,50,54,47,54,0,47,112,97,115,116,101,108,50,55,47,49,0,47,112,97,115,116,101,108,50,55,47,50,0,47,112,97,115,116,101,108,50,55,47,51,0,47,112,97,115,116,101,108,50,55,47,52,0,47,112,97,115,116,101,108,50,55,47,53,0,47,112,97,115,116,101,108,50,55,47,54,0,47,112,97,115,116,101,108,50,55,47,55,0,47,112,97,115,116,101,108,50,56,47,49,0,47,112,97,115,116,101,108,50,56,47,50,0,47,112,97,115,116,101,108,50,56,47,51,0,47,112,97,115,116,101,108,50,56,47,52,0,47,112,97,115,116,101,108,50,56,47,53,0,47,112,97,115,116,101,108,50,56,47,54,0,47,112,97,115,116,101,108,50,56,47,55,0,47,112,97,115,116,101,108,50,56,47,56,0,47,112,105,121,103,49,48,47,49,0,47,112,105,121,103,49,48,47,49,48,0,47,112,105,121,103,49,48,47,50,0,47,112,105,121,103,49,48,47,51,0,47,112,105,121,103,49,48,47,52,0,47,112,105,121,103,49,48,47,53,0,47,112,105,121,103,49,48,47,54,0,47,112,105,121,103,49,48,47,55,0,47,112,105,121,103,49,48,47,56,0,47,112,105,121,103,49,48,47,57,0,47,112,105,121,103,49,49,47,49,0,47,112,105,121,103,49,49,47,49,48,0,47,112,105,121,103,49,49,47,49,49,0,47,112,105,121,103,49,49,47,50,0,47,112,105,121,103,49,49,47,51,0,47,112,105,121,103,49,49,47,52,0,47,112,105,121,103,49,49,47,53,0,47,112,105,121,103,49,49,47,54,0,47,112,105,121,103,49,49,47,55,0,47,112,105,121,103,49,49,47,56,0,47,112,105,121,103,49,49,47,57,0,47,112,105,121,103,51,47,49,0,47,112,105,121,103,51,47,50,0,47,112,105,121,103,51,47,51,0,47,112,105,121,103,52,47,49,0,47,112,105,121,103,52,47,50,0,47,112,105,121,103,52,47,51,0,47,112,105,121,103,52,47,52,0,47,112,105,121,103,53,47,49,0,47,112,105,121,103,53,47,50,0,47,112,105,121,103,53,47,51,0,47,112,105,121,103,53,47,52,0,47,112,105,121,103,53,47,53,0,47,112,105,121,103,54,47,49,0,47,112,105,121,103,54,47,50,0,47,112,105,121,103,54,47,51,0,47,112,105,121,103,54,47,52,0,47,112,105,121,103,54,47,53,0,47,112,105,121,103,54,47,54,0,47,112,105,121,103,55,47,49,0,47,112,105,121,103,55,47,50,0,47,112,105,121,103,55,47,51,0,47,112,105,121,103,55,47,52,0,47,112,105,121,103,55,47,53,0,47,112,105,121,103,55,47,54,0,47,112,105,121,103,55,47,55,0,47,112,105,121,103,56,47,49,0,47,112,105,121,103,56,47,50,0,47,112,105,121,103,56,47,51,0,47,112,105,121,103,56,47,52,0,47,112,105,121,103,56,47,53,0,47,112,105,121,103,56,47,54,0,47,112,105,121,103,56,47,55,0,47,112,105,121,103,56,47,56,0,47,112,105,121,103,57,47,49,0,47,112,105,121,103,57,47,50,0,47,112,105,121,103,57,47,51,0,47,112,105,121,103,57,47,52,0,47,112,105,121,103,57,47,53,0,47,112,105,121,103,57,47,54,0,47,112,105,121,103,57,47,55,0,47,112,105,121,103,57,47,56,0,47,112,105,121,103,57,47,57,0,47,112,114,103,110,49,48,47,49,0,47,112,114,103,110,49,48,47,49,48,0,47,112,114,103,110,49,48,47,50,0,47,112,114,103,110,49,48,47,51,0,47,112,114,103,110,49,48,47,52,0,47,112,114,103,110,49,48,47,53,0,47,112,114,103,110,49,48,47,54,0,47,112,114,103,110,49,48,47,55,0,47,112,114,103,110,49,48,47,56,0,47,112,114,103,110,49,48,47,57,0,47,112,114,103,110,49,49,47,49,0,47,112,114,103,110,49,49,47,49,48,0,47,112,114,103,110,49,49,47,49,49,0,47,112,114,103,110,49,49,47,50,0,47,112,114,103,110,49,49,47,51,0,47,112,114,103,110,49,49,47,52,0,47,112,114,103,110,49,49,47,53,0,47,112,114,103,110,49,49,47,54,0,47,112,114,103,110,49,49,47,55,0,47,112,114,103,110,49,49,47,56,0,47,112,114,103,110,49,49,47,57,0,47,112,114,103,110,51,47,49,0,47,112,114,103,110,51,47,50,0,47,112,114,103,110,51,47,51,0,47,112,114,103,110,52,47,49,0,47,112,114,103,110,52,47,50,0,47,112,114,103,110,52,47,51,0,47,112,114,103,110,52,47,52,0,47,112,114,103,110,53,47,49,0,47,112,114,103,110,53,47,50,0,47,112,114,103,110,53,47,51,0,47,112,114,103,110,53,47,52,0,47,112,114,103,110,53,47,53,0,47,112,114,103,110,54,47,49,0,47,112,114,103,110,54,47,50,0,47,112,114,103,110,54,47,51,0,47,112,114,103,110,54,47,52,0,47,112,114,103,110,54,47,53,0,47,112,114,103,110,54,47,54,0,47,112,114,103,110,55,47,49,0,47,112,114,103,110,55,47,50,0,47,112,114,103,110,55,47,51,0,47,112,114,103,110,55,47,52,0,47,112,114,103,110,55,47,53,0,47,112,114,103,110,55,47,54,0,47,112,114,103,110,55,47,55,0,47,112,114,103,110,56,47,49,0,47,112,114,103,110,56,47,50,0,47,112,114,103,110,56,47,51,0,47,112,114,103,110,56,47,52,0,47,112,114,103,110,56,47,53,0,47,112,114,103,110,56,47,54,0,47,112,114,103,110,56,47,55,0,47,112,114,103,110,56,47,56,0,47,112,114,103,110,57,47,49,0,47,112,114,103,110,57,47,50,0,47,112,114,103,110,57,47,51,0,47,112,114,103,110,57,47,52,0,47,112,114,103,110,57,47,53,0,47,112,114,103,110,57,47,54,0,47,112,114,103,110,57,47,55,0,47,112,114,103,110,57,47,56,0,47,112,114,103,110,57,47,57,0,47,112,117,98,117,51,47,49,0,47,112,117,98,117,51,47,50,0,47,112,117,98,117,51,47,51,0,47,112,117,98,117,52,47,49,0,47,112,117,98,117,52,47,50,0,47,112,117,98,117,52,47,51,0,47,112,117,98,117,52,47,52,0,47,112,117,98,117,53,47,49,0,47,112,117,98,117,53,47,50,0,47,112,117,98,117,53,47,51,0,47,112,117,98,117,53,47,52,0,47,112,117,98,117,53,47,53,0,47,112,117,98,117,54,47,49,0,47,112,117,98,117,54,47,50,0,47,112,117,98,117,54,47,51,0,47,112,117,98,117,54,47,52,0,47,112,117,98,117,54,47,53,0,47,112,117,98,117,54,47,54,0,47,112,117,98,117,55,47,49,0,47,112,117,98,117,55,47,50,0,47,112,117,98,117,55,47,51,0,47,112,117,98,117,55,47,52,0,47,112,117,98,117,55,47,53,0,47,112,117,98,117,55,47,54,0,47,112,117,98,117,55,47,55,0,47,112,117,98,117,56,47,49,0,47,112,117,98,117,56,47,50,0,47,112,117,98,117,56,47,51,0,47,112,117,98,117,56,47,52,0,47,112,117,98,117,56,47,53,0,47,112,117,98,117,56,47,54,0,47,112,117,98,117,56,47,55,0,47,112,117,98,117,56,47,56,0,47,112,117,98,117,57,47,49,0,47,112,117,98,117,57,47,50,0,47,112,117,98,117,57,47,51,0,47,112,117,98,117,57,47,52,0,47,112,117,98,117,57,47,53,0,47,112,117,98,117,57,47,54,0,47,112,117,98,117,57,47,55,0,47,112,117,98,117,57,47,56,0,47,112,117,98,117,57,47,57,0,47,112,117,98,117,103,110,51,47,49,0,47,112,117,98,117,103,110,51,47,50,0,47,112,117,98,117,103,110,51,47,51,0,47,112,117,98,117,103,110,52,47,49,0,47,112,117,98,117,103,110,52,47,50,0,47,112,117,98,117,103,110,52,47,51,0,47,112,117,98,117,103,110,52,47,52,0,47,112,117,98,117,103,110,53,47,49,0,47,112,117,98,117,103,110,53,47,50,0,47,112,117,98,117,103,110,53,47,51,0,47,112,117,98,117,103,110,53,47,52,0,47,112,117,98,117,103,110,53,47,53,0,47,112,117,98,117,103,110,54,47,49,0,47,112,117,98,117,103,110,54,47,50,0,47,112,117,98,117,103,110,54,47,51,0,47,112,117,98,117,103,110,54,47,52,0,47,112,117,98,117,103,110,54,47,53,0,47,112,117,98,117,103,110,54,47,54,0,47,112,117,98,117,103,110,55,47,49,0,47,112,117,98,117,103,110,55,47,50,0,47,112,117,98,117,103,110,55,47,51,0,47,112,117,98,117,103,110,55,47,52,0,47,112,117,98,117,103,110,55,47,53,0,47,112,117,98,117,103,110,55,47,54,0,47,112,117,98,117,103,110,55,47,55,0,47,112,117,98,117,103,110,56,47,49,0,47,112,117,98,117,103,110,56,47,50,0,47,112,117,98,117,103,110,56,47,51,0,47,112,117,98,117,103,110,56,47,52,0,47,112,117,98,117,103,110,56,47,53,0,47,112,117,98,117,103,110,56,47,54,0,47,112,117,98,117,103,110,56,47,55,0,47,112,117,98,117,103,110,56,47,56,0,47,112,117,98,117,103,110,57,47,49,0,47,112,117,98,117,103,110,57,47,50,0,47,112,117,98,117,103,110,57,47,51,0,47,112,117,98,117,103,110,57,47,52,0,47,112,117,98,117,103,110,57,47,53,0,47,112,117,98,117,103,110,57,47,54,0,47,112,117,98,117,103,110,57,47,55,0,47,112,117,98,117,103,110,57,47,56,0,47,112,117,98,117,103,110,57,47,57,0,47,112,117,111,114,49,48,47,49,0,47,112,117,111,114,49,48,47,49,48,0,47,112,117,111,114,49,48,47,50,0,47,112,117,111,114,49,48,47,51,0,47,112,117,111,114,49,48,47,52,0,47,112,117,111,114,49,48,47,53,0,47,112,117,111,114,49,48,47,54,0,47,112,117,111,114,49,48,47,55,0,47,112,117,111,114,49,48,47,56,0,47,112,117,111,114,49,48,47,57,0,47,112,117,111,114,49,49,47,49,0,47,112,117,111,114,49,49,47,49,48,0,47,112,117,111,114,49,49,47,49,49,0,47,112,117,111,114,49,49,47,50,0,47,112,117,111,114,49,49,47,51,0,47,112,117,111,114,49,49,47,52,0,47,112,117,111,114,49,49,47,53,0,47,112,117,111,114,49,49,47,54,0,47,112,117,111,114,49,49,47,55,0,47,112,117,111,114,49,49,47,56,0,47,112,117,111,114,49,49,47,57,0,47,112,117,111,114,51,47,49,0,47,112,117,111,114,51,47,50,0,47,112,117,111,114,51,47,51,0,47,112,117,111,114,52,47,49,0,47,112,117,111,114,52,47,50,0,47,112,117,111,114,52,47,51,0,47,112,117,111,114,52,47,52,0,47,112,117,111,114,53,47,49,0,47,112,117,111,114,53,47,50,0,47,112,117,111,114,53,47,51,0,47,112,117,111,114,53,47,52,0,47,112,117,111,114,53,47,53,0,47,112,117,111,114,54,47,49,0,47,112,117,111,114,54,47,50,0,47,112,117,111,114,54,47,51,0,47,112,117,111,114,54,47,52,0,47,112,117,111,114,54,47,53,0,47,112,117,111,114,54,47,54,0,47,112,117,111,114,55,47,49,0,47,112,117,111,114,55,47,50,0,47,112,117,111,114,55,47,51,0,47,112,117,111,114,55,47,52,0,47,112,117,111,114,55,47,53,0,47,112,117,111,114,55,47,54,0,47,112,117,111,114,55,47,55,0,47,112,117,111,114,56,47,49,0,47,112,117,111,114,56,47,50,0,47,112,117,111,114,56,47,51,0,47,112,117,111,114,56,47,52,0,47,112,117,111,114,56,47,53,0,47,112,117,111,114,56,47,54,0,47,112,117,111,114,56,47,55,0,47,112,117,111,114,56,47,56,0,47,112,117,111,114,57,47,49,0,47,112,117,111,114,57,47,50,0,47,112,117,111,114,57,47,51,0,47,112,117,111,114,57,47,52,0,47,112,117,111,114,57,47,53,0,47,112,117,111,114,57,47,54,0,47,112,117,111,114,57,47,55,0,47,112,117,111,114,57,47,56,0,47,112,117,111,114,57,47,57,0,47,112,117,114,100,51,47,49,0,47,112,117,114,100,51,47,50,0,47,112,117,114,100,51,47,51,0,47,112,117,114,100,52,47,49,0,47,112,117,114,100,52,47,50,0,47,112,117,114,100,52,47,51,0,47,112,117,114,100,52,47,52,0,47,112,117,114,100,53,47,49,0,47,112,117,114,100,53,47,50,0,47,112,117,114,100,53,47,51,0,47,112,117,114,100,53,47,52,0,47,112,117,114,100,53,47,53,0,47,112,117,114,100,54,47,49,0,47,112,117,114,100,54,47,50,0,47,112,117,114,100,54,47,51,0,47,112,117,114,100,54,47,52,0,47,112,117,114,100,54,47,53,0,47,112,117,114,100,54,47,54,0,47,112,117,114,100,55,47,49,0,47,112,117,114,100,55,47,50,0,47,112,117,114,100,55,47,51,0,47,112,117,114,100,55,47,52,0,47,112,117,114,100,55,47,53,0,47,112,117,114,100,55,47,54,0,47,112,117,114,100,55,47,55,0,47,112,117,114,100,56,47,49,0,47,112,117,114,100,56,47,50,0,47,112,117,114,100,56,47,51,0,47,112,117,114,100,56,47,52,0,47,112,117,114,100,56,47,53,0,47,112,117,114,100,56,47,54,0,47,112,117,114,100,56,47,55,0,47,112,117,114,100,56,47,56,0,47,112,117,114,100,57,47,49,0,47,112,117,114,100,57,47,50,0,47,112,117,114,100,57,47,51,0,47,112,117,114,100,57,47,52,0,47,112,117,114,100,57,47,53,0,47,112,117,114,100,57,47,54,0,47,112,117,114,100,57,47,55,0,47,112,117,114,100,57,47,56,0,47,112,117,114,100,57,47,57,0,47,112,117,114,112,108,101,115,51,47,49,0,47,112,117,114,112,108,101,115,51,47,50,0,47,112,117,114,112,108,101,115,51,47,51,0,47,112,117,114,112,108,101,115,52,47,49,0,47,112,117,114,112,108,101,115,52,47,50,0,47,112,117,114,112,108,101,115,52,47,51,0,47,112,117,114,112,108,101,115,52,47,52,0,47,112,117,114,112,108,101,115,53,47,49,0,47,112,117,114,112,108,101,115,53,47,50,0,47,112,117,114,112,108,101,115,53,47,51,0,47,112,117,114,112,108,101,115,53,47,52,0,47,112,117,114,112,108,101,115,53,47,53,0,47,112,117,114,112,108,101,115,54,47,49,0,47,112,117,114,112,108,101,115,54,47,50,0,47,112,117,114,112,108,101,115,54,47,51,0,47,112,117,114,112,108,101,115,54,47,52,0,47,112,117,114,112,108,101,115,54,47,53,0,47,112,117,114,112,108,101,115,54,47,54,0,47,112,117,114,112,108,101,115,55,47,49,0,47,112,117,114,112,108,101,115,55,47,50,0,47,112,117,114,112,108,101,115,55,47,51,0,47,112,117,114,112,108,101,115,55,47,52,0,47,112,117,114,112,108,101,115,55,47,53,0,47,112,117,114,112,108,101,115,55,47,54,0,47,112,117,114,112,108,101,115,55,47,55,0,47,112,117,114,112,108,101,115,56,47,49,0,47,112,117,114,112,108,101,115,56,47,50,0,47,112,117,114,112,108,101,115,56,47,51,0,47,112,117,114,112,108,101,115,56,47,52,0,47,112,117,114,112,108,101,115,56,47,53,0,47,112,117,114,112,108,101,115,56,47,54,0,47,112,117,114,112,108,101,115,56,47,55,0,47,112,117,114,112,108,101,115,56,47,56,0,47,112,117,114,112,108,101,115,57,47,49,0,47,112,117,114,112,108,101,115,57,47,50,0,47,112,117,114,112,108,101,115,57,47,51,0,47,112,117,114,112,108,101,115,57,47,52,0,47,112,117,114,112,108,101,115,57,47,53,0,47,112,117,114,112,108,101,115,57,47,54,0,47,112,117,114,112,108,101,115,57,47,55,0,47,112,117,114,112,108,101,115,57,47,56,0,47,112,117,114,112,108,101,115,57,47,57,0,47,114,100,98,117,49,48,47,49,0,47,114,100,98,117,49,48,47,49,48,0,47,114,100,98,117,49,48,47,50,0,47,114,100,98,117,49,48,47,51,0,47,114,100,98,117,49,48,47,52,0,47,114,100,98,117,49,48,47,53,0,47,114,100,98,117,49,48,47,54,0,47,114,100,98,117,49,48,47,55,0,47,114,100,98,117,49,48,47,56,0,47,114,100,98,117,49,48,47,57,0,47,114,100,98,117,49,49,47,49,0,47,114,100,98,117,49,49,47,49,48,0,47,114,100,98,117,49,49,47,49,49,0,47,114,100,98,117,49,49,47,50,0,47,114,100,98,117,49,49,47,51,0,47,114,100,98,117,49,49,47,52,0,47,114,100,98,117,49,49,47,53,0,47,114,100,98,117,49,49,47,54,0,47,114,100,98,117,49,49,47,55,0,47,114,100,98,117,49,49,47,56,0,47,114,100,98,117,49,49,47,57,0,47,114,100,98,117,51,47,49,0,47,114,100,98,117,51,47,50,0,47,114,100,98,117,51,47,51,0,47,114,100,98,117,52,47,49,0,47,114,100,98,117,52,47,50,0,47,114,100,98,117,52,47,51,0,47,114,100,98,117,52,47,52,0,47,114,100,98,117,53,47,49,0,47,114,100,98,117,53,47,50,0,47,114,100,98,117,53,47,51,0,47,114,100,98,117,53,47,52,0,47,114,100,98,117,53,47,53,0,47,114,100,98,117,54,47,49,0,47,114,100,98,117,54,47,50,0,47,114,100,98,117,54,47,51,0,47,114,100,98,117,54,47,52,0,47,114,100,98,117,54,47,53,0,47,114,100,98,117,54,47,54,0,47,114,100,98,117,55,47,49,0,47,114,100,98,117,55,47,50,0,47,114,100,98,117,55,47,51,0,47,114,100,98,117,55,47,52,0,47,114,100,98,117,55,47,53,0,47,114,100,98,117,55,47,54,0,47,114,100,98,117,55,47,55,0,47,114,100,98,117,56,47,49,0,47,114,100,98,117,56,47,50,0,47,114,100,98,117,56,47,51,0,47,114,100,98,117,56,47,52,0,47,114,100,98,117,56,47,53,0,47,114,100,98,117,56,47,54,0,47,114,100,98,117,56,47,55,0,47,114,100,98,117,56,47,56,0,47,114,100,98,117,57,47,49,0,47,114,100,98,117,57,47,50,0,47,114,100,98,117,57,47,51,0,47,114,100,98,117,57,47,52,0,47,114,100,98,117,57,47,53,0,47,114,100,98,117,57,47,54,0,47,114,100,98,117,57,47,55,0,47,114,100,98,117,57,47,56,0,47,114,100,98,117,57,47,57,0,47,114,100,103,121,49,48,47,49,0,47,114,100,103,121,49,48,47,49,48,0,47,114,100,103,121,49,48,47,50,0,47,114,100,103,121,49,48,47,51,0,47,114,100,103,121,49,48,47,52,0,47,114,100,103,121,49,48,47,53,0,47,114,100,103,121,49,48,47,54,0,47,114,100,103,121,49,48,47,55,0,47,114,100,103,121,49,48,47,56,0,47,114,100,103,121,49,48,47,57,0,47,114,100,103,121,49,49,47,49,0,47,114,100,103,121,49,49,47,49,48,0,47,114,100,103,121,49,49,47,49,49,0,47,114,100,103,121,49,49,47,50,0,47,114,100,103,121,49,49,47,51,0,47,114,100,103,121,49,49,47,52,0,47,114,100,103,121,49,49,47,53,0,47,114,100,103,121,49,49,47,54,0,47,114,100,103,121,49,49,47,55,0,47,114,100,103,121,49,49,47,56,0,47,114,100,103,121,49,49,47,57,0,47,114,100,103,121,51,47,49,0,47,114,100,103,121,51,47,50,0,47,114,100,103,121,51,47,51,0,47,114,100,103,121,52,47,49,0,47,114,100,103,121,52,47,50,0,47,114,100,103,121,52,47,51,0,47,114,100,103,121,52,47,52,0,47,114,100,103,121,53,47,49,0,47,114,100,103,121,53,47,50,0,47,114,100,103,121,53,47,51,0,47,114,100,103,121,53,47,52,0,47,114,100,103,121,53,47,53,0,47,114,100,103,121,54,47,49,0,47,114,100,103,121,54,47,50,0,47,114,100,103,121,54,47,51,0,47,114,100,103,121,54,47,52,0,47,114,100,103,121,54,47,53,0,47,114,100,103,121,54,47,54,0,47,114,100,103,121],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+112664);allocate([55,47,49,0,47,114,100,103,121,55,47,50,0,47,114,100,103,121,55,47,51,0,47,114,100,103,121,55,47,52,0,47,114,100,103,121,55,47,53,0,47,114,100,103,121,55,47,54,0,47,114,100,103,121,55,47,55,0,47,114,100,103,121,56,47,49,0,47,114,100,103,121,56,47,50,0,47,114,100,103,121,56,47,51,0,47,114,100,103,121,56,47,52,0,47,114,100,103,121,56,47,53,0,47,114,100,103,121,56,47,54,0,47,114,100,103,121,56,47,55,0,47,114,100,103,121,56,47,56,0,47,114,100,103,121,57,47,49,0,47,114,100,103,121,57,47,50,0,47,114,100,103,121,57,47,51,0,47,114,100,103,121,57,47,52,0,47,114,100,103,121,57,47,53,0,47,114,100,103,121,57,47,54,0,47,114,100,103,121,57,47,55,0,47,114,100,103,121,57,47,56,0,47,114,100,103,121,57,47,57,0,47,114,100,112,117,51,47,49,0,47,114,100,112,117,51,47,50,0,47,114,100,112,117,51,47,51,0,47,114,100,112,117,52,47,49,0,47,114,100,112,117,52,47,50,0,47,114,100,112,117,52,47,51,0,47,114,100,112,117,52,47,52,0,47,114,100,112,117,53,47,49,0,47,114,100,112,117,53,47,50,0,47,114,100,112,117,53,47,51,0,47,114,100,112,117,53,47,52,0,47,114,100,112,117,53,47,53,0,47,114,100,112,117,54,47,49,0,47,114,100,112,117,54,47,50,0,47,114,100,112,117,54,47,51,0,47,114,100,112,117,54,47,52,0,47,114,100,112,117,54,47,53,0,47,114,100,112,117,54,47,54,0,47,114,100,112,117,55,47,49,0,47,114,100,112,117,55,47,50,0,47,114,100,112,117,55,47,51,0,47,114,100,112,117,55,47,52,0,47,114,100,112,117,55,47,53,0,47,114,100,112,117,55,47,54,0,47,114,100,112,117,55,47,55,0,47,114,100,112,117,56,47,49,0,47,114,100,112,117,56,47,50,0,47,114,100,112,117,56,47,51,0,47,114,100,112,117,56,47,52,0,47,114,100,112,117,56,47,53,0,47,114,100,112,117,56,47,54,0,47,114,100,112,117,56,47,55,0,47,114,100,112,117,56,47,56,0,47,114,100,112,117,57,47,49,0,47,114,100,112,117,57,47,50,0,47,114,100,112,117,57,47,51,0,47,114,100,112,117,57,47,52,0,47,114,100,112,117,57,47,53,0,47,114,100,112,117,57,47,54,0,47,114,100,112,117,57,47,55,0,47,114,100,112,117,57,47,56,0,47,114,100,112,117,57,47,57,0,47,114,100,121,108,98,117,49,48,47,49,0,47,114,100,121,108,98,117,49,48,47,49,48,0,47,114,100,121,108,98,117,49,48,47,50,0,47,114,100,121,108,98,117,49,48,47,51,0,47,114,100,121,108,98,117,49,48,47,52,0,47,114,100,121,108,98,117,49,48,47,53,0,47,114,100,121,108,98,117,49,48,47,54,0,47,114,100,121,108,98,117,49,48,47,55,0,47,114,100,121,108,98,117,49,48,47,56,0,47,114,100,121,108,98,117,49,48,47,57,0,47,114,100,121,108,98,117,49,49,47,49,0,47,114,100,121,108,98,117,49,49,47,49,48,0,47,114,100,121,108,98,117,49,49,47,49,49,0,47,114,100,121,108,98,117,49,49,47,50,0,47,114,100,121,108,98,117,49,49,47,51,0,47,114,100,121,108,98,117,49,49,47,52,0,47,114,100,121,108,98,117,49,49,47,53,0,47,114,100,121,108,98,117,49,49,47,54,0,47,114,100,121,108,98,117,49,49,47,55,0,47,114,100,121,108,98,117,49,49,47,56,0,47,114,100,121,108,98,117,49,49,47,57,0,47,114,100,121,108,98,117,51,47,49,0,47,114,100,121,108,98,117,51,47,50,0,47,114,100,121,108,98,117,51,47,51,0,47,114,100,121,108,98,117,52,47,49,0,47,114,100,121,108,98,117,52,47,50,0,47,114,100,121,108,98,117,52,47,51,0,47,114,100,121,108,98,117,52,47,52,0,47,114,100,121,108,98,117,53,47,49,0,47,114,100,121,108,98,117,53,47,50,0,47,114,100,121,108,98,117,53,47,51,0,47,114,100,121,108,98,117,53,47,52,0,47,114,100,121,108,98,117,53,47,53,0,47,114,100,121,108,98,117,54,47,49,0,47,114,100,121,108,98,117,54,47,50,0,47,114,100,121,108,98,117,54,47,51,0,47,114,100,121,108,98,117,54,47,52,0,47,114,100,121,108,98,117,54,47,53,0,47,114,100,121,108,98,117,54,47,54,0,47,114,100,121,108,98,117,55,47,49,0,47,114,100,121,108,98,117,55,47,50,0,47,114,100,121,108,98,117,55,47,51,0,47,114,100,121,108,98,117,55,47,52,0,47,114,100,121,108,98,117,55,47,53,0,47,114,100,121,108,98,117,55,47,54,0,47,114,100,121,108,98,117,55,47,55,0,47,114,100,121,108,98,117,56,47,49,0,47,114,100,121,108,98,117,56,47,50,0,47,114,100,121,108,98,117,56,47,51,0,47,114,100,121,108,98,117,56,47,52,0,47,114,100,121,108,98,117,56,47,53,0,47,114,100,121,108,98,117,56,47,54,0,47,114,100,121,108,98,117,56,47,55,0,47,114,100,121,108,98,117,56,47,56,0,47,114,100,121,108,98,117,57,47,49,0,47,114,100,121,108,98,117,57,47,50,0,47,114,100,121,108,98,117,57,47,51,0,47,114,100,121,108,98,117,57,47,52,0,47,114,100,121,108,98,117,57,47,53,0,47,114,100,121,108,98,117,57,47,54,0,47,114,100,121,108,98,117,57,47,55,0,47,114,100,121,108,98,117,57,47,56,0,47,114,100,121,108,98,117,57,47,57,0,47,114,100,121,108,103,110,49,48,47,49,0,47,114,100,121,108,103,110,49,48,47,49,48,0,47,114,100,121,108,103,110,49,48,47,50,0,47,114,100,121,108,103,110,49,48,47,51,0,47,114,100,121,108,103,110,49,48,47,52,0,47,114,100,121,108,103,110,49,48,47,53,0,47,114,100,121,108,103,110,49,48,47,54,0,47,114,100,121,108,103,110,49,48,47,55,0,47,114,100,121,108,103,110,49,48,47,56,0,47,114,100,121,108,103,110,49,48,47,57,0,47,114,100,121,108,103,110,49,49,47,49,0,47,114,100,121,108,103,110,49,49,47,49,48,0,47,114,100,121,108,103,110,49,49,47,49,49,0,47,114,100,121,108,103,110,49,49,47,50,0,47,114,100,121,108,103,110,49,49,47,51,0,47,114,100,121,108,103,110,49,49,47,52,0,47,114,100,121,108,103,110,49,49,47,53,0,47,114,100,121,108,103,110,49,49,47,54,0,47,114,100,121,108,103,110,49,49,47,55,0,47,114,100,121,108,103,110,49,49,47,56,0,47,114,100,121,108,103,110,49,49,47,57,0,47,114,100,121,108,103,110,51,47,49,0,47,114,100,121,108,103,110,51,47,50,0,47,114,100,121,108,103,110,51,47,51,0,47,114,100,121,108,103,110,52,47,49,0,47,114,100,121,108,103,110,52,47,50,0,47,114,100,121,108,103,110,52,47,51,0,47,114,100,121,108,103,110,52,47,52,0,47,114,100,121,108,103,110,53,47,49,0,47,114,100,121,108,103,110,53,47,50,0,47,114,100,121,108,103,110,53,47,51,0,47,114,100,121,108,103,110,53,47,52,0,47,114,100,121,108,103,110,53,47,53,0,47,114,100,121,108,103,110,54,47,49,0,47,114,100,121,108,103,110,54,47,50,0,47,114,100,121,108,103,110,54,47,51,0,47,114,100,121,108,103,110,54,47,52,0,47,114,100,121,108,103,110,54,47,53,0,47,114,100,121,108,103,110,54,47,54,0,47,114,100,121,108,103,110,55,47,49,0,47,114,100,121,108,103,110,55,47,50,0,47,114,100,121,108,103,110,55,47,51,0,47,114,100,121,108,103,110,55,47,52,0,47,114,100,121,108,103,110,55,47,53,0,47,114,100,121,108,103,110,55,47,54,0,47,114,100,121,108,103,110,55,47,55,0,47,114,100,121,108,103,110,56,47,49,0,47,114,100,121,108,103,110,56,47,50,0,47,114,100,121,108,103,110,56,47,51,0,47,114,100,121,108,103,110,56,47,52,0,47,114,100,121,108,103,110,56,47,53,0,47,114,100,121,108,103,110,56,47,54,0,47,114,100,121,108,103,110,56,47,55,0,47,114,100,121,108,103,110,56,47,56,0,47,114,100,121,108,103,110,57,47,49,0,47,114,100,121,108,103,110,57,47,50,0,47,114,100,121,108,103,110,57,47,51,0,47,114,100,121,108,103,110,57,47,52,0,47,114,100,121,108,103,110,57,47,53,0,47,114,100,121,108,103,110,57,47,54,0,47,114,100,121,108,103,110,57,47,55,0,47,114,100,121,108,103,110,57,47,56,0,47,114,100,121,108,103,110,57,47,57,0,47,114,101,100,115,51,47,49,0,47,114,101,100,115,51,47,50,0,47,114,101,100,115,51,47,51,0,47,114,101,100,115,52,47,49,0,47,114,101,100,115,52,47,50,0,47,114,101,100,115,52,47,51,0,47,114,101,100,115,52,47,52,0,47,114,101,100,115,53,47,49,0,47,114,101,100,115,53,47,50,0,47,114,101,100,115,53,47,51,0,47,114,101,100,115,53,47,52,0,47,114,101,100,115,53,47,53,0,47,114,101,100,115,54,47,49,0,47,114,101,100,115,54,47,50,0,47,114,101,100,115,54,47,51,0,47,114,101,100,115,54,47,52,0,47,114,101,100,115,54,47,53,0,47,114,101,100,115,54,47,54,0,47,114,101,100,115,55,47,49,0,47,114,101,100,115,55,47,50,0,47,114,101,100,115,55,47,51,0,47,114,101,100,115,55,47,52,0,47,114,101,100,115,55,47,53,0,47,114,101,100,115,55,47,54,0,47,114,101,100,115,55,47,55,0,47,114,101,100,115,56,47,49,0,47,114,101,100,115,56,47,50,0,47,114,101,100,115,56,47,51,0,47,114,101,100,115,56,47,52,0,47,114,101,100,115,56,47,53,0,47,114,101,100,115,56,47,54,0,47,114,101,100,115,56,47,55,0,47,114,101,100,115,56,47,56,0,47,114,101,100,115,57,47,49,0,47,114,101,100,115,57,47,50,0,47,114,101,100,115,57,47,51,0,47,114,101,100,115,57,47,52,0,47,114,101,100,115,57,47,53,0,47,114,101,100,115,57,47,54,0,47,114,101,100,115,57,47,55,0,47,114,101,100,115,57,47,56,0,47,114,101,100,115,57,47,57,0,47,115,101,116,49,51,47,49,0,47,115,101,116,49,51,47,50,0,47,115,101,116,49,51,47,51,0,47,115,101,116,49,52,47,49,0,47,115,101,116,49,52,47,50,0,47,115,101,116,49,52,47,51,0,47,115,101,116,49,52,47,52,0,47,115,101,116,49,53,47,49,0,47,115,101,116,49,53,47,50,0,47,115,101,116,49,53,47,51,0,47,115,101,116,49,53,47,52,0,47,115,101,116,49,53,47,53,0,47,115,101,116,49,54,47,49,0,47,115,101,116,49,54,47,50,0,47,115,101,116,49,54,47,51,0,47,115,101,116,49,54,47,52,0,47,115,101,116,49,54,47,53,0,47,115,101,116,49,54,47,54,0,47,115,101,116,49,55,47,49,0,47,115,101,116,49,55,47,50,0,47,115,101,116,49,55,47,51,0,47,115,101,116,49,55,47,52,0,47,115,101,116,49,55,47,53,0,47,115,101,116,49,55,47,54,0,47,115,101,116,49,55,47,55,0,47,115,101,116,49,56,47,49,0,47,115,101,116,49,56,47,50,0,47,115,101,116,49,56,47,51,0,47,115,101,116,49,56,47,52,0,47,115,101,116,49,56,47,53,0,47,115,101,116,49,56,47,54,0,47,115,101,116,49,56,47,55,0,47,115,101,116,49,56,47,56,0,47,115,101,116,49,57,47,49,0,47,115,101,116,49,57,47,50,0,47,115,101,116,49,57,47,51,0,47,115,101,116,49,57,47,52,0,47,115,101,116,49,57,47,53,0,47,115,101,116,49,57,47,54,0,47,115,101,116,49,57,47,55,0,47,115,101,116,49,57,47,56,0,47,115,101,116,49,57,47,57,0,47,115,101,116,50,51,47,49,0,47,115,101,116,50,51,47,50,0,47,115,101,116,50,51,47,51,0,47,115,101,116,50,52,47,49,0,47,115,101,116,50,52,47,50,0,47,115,101,116,50,52,47,51,0,47,115,101,116,50,52,47,52,0,47,115,101,116,50,53,47,49,0,47,115,101,116,50,53,47,50,0,47,115,101,116,50,53,47,51,0,47,115,101,116,50,53,47,52,0,47,115,101,116,50,53,47,53,0,47,115,101,116,50,54,47,49,0,47,115,101,116,50,54,47,50,0,47,115,101,116,50,54,47,51,0,47,115,101,116,50,54,47,52,0,47,115,101,116,50,54,47,53,0,47,115,101,116,50,54,47,54,0,47,115,101,116,50,55,47,49,0,47,115,101,116,50,55,47,50,0,47,115,101,116,50,55,47,51,0,47,115,101,116,50,55,47,52,0,47,115,101,116,50,55,47,53,0,47,115,101,116,50,55,47,54,0,47,115,101,116,50,55,47,55,0,47,115,101,116,50,56,47,49,0,47,115,101,116,50,56,47,50,0,47,115,101,116,50,56,47,51,0,47,115,101,116,50,56,47,52,0,47,115,101,116,50,56,47,53,0,47,115,101,116,50,56,47,54,0,47,115,101,116,50,56,47,55,0,47,115,101,116,50,56,47,56,0,47,115,101,116,51,49,48,47,49,0,47,115,101,116,51,49,48,47,49,48,0,47,115,101,116,51,49,48,47,50,0,47,115,101,116,51,49,48,47,51,0,47,115,101,116,51,49,48,47,52,0,47,115,101,116,51,49,48,47,53,0,47,115,101,116,51,49,48,47,54,0,47,115,101,116,51,49,48,47,55,0,47,115,101,116,51,49,48,47,56,0,47,115,101,116,51,49,48,47,57,0,47,115,101,116,51,49,49,47,49,0,47,115,101,116,51,49,49,47,49,48,0,47,115,101,116,51,49,49,47,49,49,0,47,115,101,116,51,49,49,47,50,0,47,115,101,116,51,49,49,47,51,0,47,115,101,116,51,49,49,47,52,0,47,115,101,116,51,49,49,47,53,0,47,115,101,116,51,49,49,47,54,0,47,115,101,116,51,49,49,47,55,0,47,115,101,116,51,49,49,47,56,0,47,115,101,116,51,49,49,47,57,0,47,115,101,116,51,49,50,47,49,0,47,115,101,116,51,49,50,47,49,48,0,47,115,101,116,51,49,50,47,49,49,0,47,115,101,116,51,49,50,47,49,50,0,47,115,101,116,51,49,50,47,50,0,47,115,101,116,51,49,50,47,51,0,47,115,101,116,51,49,50,47,52,0,47,115,101,116,51,49,50,47,53,0,47,115,101,116,51,49,50,47,54,0,47,115,101,116,51,49,50,47,55,0,47,115,101,116,51,49,50,47,56,0,47,115,101,116,51,49,50,47,57,0,47,115,101,116,51,51,47,49,0,47,115,101,116,51,51,47,50,0,47,115,101,116,51,51,47,51,0,47,115,101,116,51,52,47,49,0,47,115,101,116,51,52,47,50,0,47,115,101,116,51,52,47,51,0,47,115,101,116,51,52,47,52,0,47,115,101,116,51,53,47,49,0,47,115,101,116,51,53,47,50,0,47,115,101,116,51,53,47,51,0,47,115,101,116,51,53,47,52,0,47,115,101,116,51,53,47,53,0,47,115,101,116,51,54,47,49,0,47,115,101,116,51,54,47,50,0,47,115,101,116,51,54,47,51,0,47,115,101,116,51,54,47,52,0,47,115,101,116,51,54,47,53,0,47,115,101,116,51,54,47,54,0,47,115,101,116,51,55,47,49,0,47,115,101,116,51,55,47,50,0,47,115,101,116,51,55,47,51,0,47,115,101,116,51,55,47,52,0,47,115,101,116,51,55,47,53,0,47,115,101,116,51,55,47,54,0,47,115,101,116,51,55,47,55,0,47,115,101,116,51,56,47,49,0,47,115,101,116,51,56,47,50,0,47,115,101,116,51,56,47,51,0,47,115,101,116,51,56,47,52,0,47,115,101,116,51,56,47,53,0,47,115,101,116,51,56,47,54,0,47,115,101,116,51,56,47,55,0,47,115,101,116,51,56,47,56,0,47,115,101,116,51,57,47,49,0,47,115,101,116,51,57,47,50,0,47,115,101,116,51,57,47,51,0,47,115,101,116,51,57,47,52,0,47,115,101,116,51,57,47,53,0,47,115,101,116,51,57,47,54,0,47,115,101,116,51,57,47,55,0,47,115,101,116,51,57,47,56,0,47,115,101,116,51,57,47,57,0,47,115,112,101,99,116,114,97,108,49,48,47,49,0,47,115,112,101,99,116,114,97,108,49,48,47,49,48,0,47,115,112,101,99,116,114,97,108,49,48,47,50,0,47,115,112,101,99,116,114,97,108,49,48,47,51,0,47,115,112,101,99,116,114,97,108,49,48,47,52,0,47,115,112,101,99,116,114,97,108,49,48,47,53,0,47,115,112,101,99,116,114,97,108,49,48,47,54,0,47,115,112,101,99,116,114,97,108,49,48,47,55,0,47,115,112,101,99,116,114,97,108,49,48,47,56,0,47,115,112,101,99,116,114,97,108,49,48,47,57,0,47,115,112,101,99,116,114,97,108,49,49,47,49,0,47,115,112,101,99,116,114,97,108,49,49,47,49,48,0,47,115,112,101,99,116,114,97,108,49,49,47,49,49,0,47,115,112,101,99,116,114,97,108,49,49,47,50,0,47,115,112,101,99,116,114,97,108,49,49,47,51,0,47,115,112,101,99,116,114,97,108,49,49,47,52,0,47,115,112,101,99,116,114,97,108,49,49,47,53,0,47,115,112,101,99,116,114,97,108,49,49,47,54,0,47,115,112,101,99,116,114,97,108,49,49,47,55,0,47,115,112,101,99,116,114,97,108,49,49,47,56,0,47,115,112,101,99,116,114,97,108,49,49,47,57,0,47,115,112,101,99,116,114,97,108,51,47,49,0,47,115,112,101,99,116,114,97,108,51,47,50,0,47,115,112,101,99,116,114,97,108,51,47,51,0,47,115,112,101,99,116,114,97,108,52,47,49,0,47,115,112,101,99,116,114,97,108,52,47,50,0,47,115,112,101,99,116,114,97,108,52,47,51,0,47,115,112,101,99,116,114,97,108,52,47,52,0,47,115,112,101,99,116,114,97,108,53,47,49,0,47,115,112,101,99,116,114,97,108,53,47,50,0,47,115,112,101,99,116,114,97,108,53,47,51,0,47,115,112,101,99,116,114,97,108,53,47,52,0,47,115,112,101,99,116,114,97,108,53,47,53,0,47,115,112,101,99,116,114,97,108,54,47,49,0,47,115,112,101,99,116,114,97,108,54,47,50,0,47,115,112,101,99,116,114,97,108,54,47,51,0,47,115,112,101,99,116,114,97,108,54,47,52,0,47,115,112,101,99,116,114,97,108,54,47,53,0,47,115,112,101,99,116,114,97,108,54,47,54,0,47,115,112,101,99,116,114,97,108,55,47,49,0,47,115,112,101,99,116,114,97,108,55,47,50,0,47,115,112,101,99,116,114,97,108,55,47,51,0,47,115,112,101,99,116,114,97,108,55,47,52,0,47,115,112,101,99,116,114,97,108,55,47,53,0,47,115,112,101,99,116,114,97,108,55,47,54,0,47,115,112,101,99,116,114,97,108,55,47,55,0,47,115,112,101,99,116,114,97,108,56,47,49,0,47,115,112,101,99,116,114,97,108,56,47,50,0,47,115,112,101,99,116,114,97,108,56,47,51,0,47,115,112,101,99,116,114,97,108,56,47,52,0,47,115,112,101,99,116,114,97,108,56,47,53,0,47,115,112,101,99,116,114,97,108,56,47,54,0,47,115,112,101,99,116,114,97,108,56,47,55,0,47,115,112,101,99,116,114,97,108,56,47,56,0,47,115,112,101,99,116,114,97,108,57,47,49,0,47,115,112,101,99,116,114,97,108,57,47,50,0,47,115,112,101,99,116,114,97,108,57,47,51,0,47,115,112,101,99,116,114,97,108,57,47,52,0,47,115,112,101,99,116,114,97,108,57,47,53,0,47,115,112,101,99,116,114,97,108,57,47,54,0,47,115,112,101,99,116,114,97,108,57,47,55,0,47,115,112,101,99,116,114,97,108,57,47,56,0,47,115,112,101,99,116,114,97,108,57,47,57,0,47,115,118,103,47,97,108,105,99,101,98,108,117,101,0,47,115,118,103,47,97,110,116,105,113,117,101,119,104,105,116,101,0,47,115,118,103,47,97,113,117,97,0,47,115,118,103,47,97,113,117,97,109,97,114,105,110,101,0,47,115,118,103,47,97,122,117,114,101,0,47,115,118,103,47,98,101,105,103,101,0,47,115,118,103,47,98,105,115,113,117,101,0,47,115,118,103,47,98,108,97,99,107,0,47,115,118,103,47,98,108,97,110,99,104,101,100,97,108,109,111,110,100,0,47,115,118,103,47,98,108,117,101,0,47,115,118,103,47,98,108,117,101,118,105,111,108,101,116,0,47,115,118,103,47,98,114,111,119,110,0,47,115,118,103,47,98,117,114,108,121,119,111,111,100,0,47,115,118,103,47,99,97,100,101,116,98,108,117,101,0,47,115,118,103,47,99,104,97,114,116,114,101,117,115,101,0,47,115,118,103,47,99,104,111,99,111,108,97,116,101,0,47,115,118,103,47,99,111,114,97,108,0,47,115,118,103,47,99,111,114,110,102,108,111,119,101,114,98,108,117,101,0,47,115,118,103,47,99,111,114,110,115,105,108,107,0,47,115,118,103,47,99,114,105,109,115,111,110,0,47,115,118,103,47,99,121,97,110,0,47,115,118,103,47,100,97,114,107,98,108,117,101,0,47,115,118,103,47,100,97,114,107,99,121,97,110,0,47,115,118,103,47,100,97,114,107,103,111,108,100,101,110,114,111,100,0,47,115,118,103,47,100,97,114,107,103,114,97,121,0,47,115,118,103,47,100,97,114,107,103,114,101,101,110,0,47,115,118,103,47,100,97,114,107,103,114,101,121,0,47,115,118,103,47,100,97,114,107,107,104,97,107,105,0,47,115,118,103,47,100,97,114,107,109,97,103,101,110,116,97,0,47,115,118,103,47,100,97,114,107,111,108,105,118,101,103,114,101,101,110,0,47,115,118,103,47,100,97,114,107,111,114,97,110,103,101,0,47,115,118,103,47,100,97,114,107,111,114,99,104,105,100,0,47,115,118,103,47,100,97,114,107,114,101,100,0,47,115,118,103,47,100,97,114,107,115,97,108,109,111,110,0,47,115,118,103,47,100,97,114,107,115,101,97,103,114,101,101,110,0,47,115,118,103,47,100,97,114,107,115,108,97,116,101,98,108,117,101,0,47,115,118,103,47,100,97,114,107,115,108,97,116,101,103,114,97,121,0,47,115,118,103,47,100,97,114,107,115,108,97,116,101,103,114,101,121,0,47,115,118,103,47,100,97,114,107,116,117,114,113,117,111,105,115,101,0,47,115,118,103,47,100,97,114,107,118,105,111,108,101,116,0,47,115,118,103,47,100,101,101,112,112,105,110,107,0,47,115,118,103,47,100,101,101,112,115,107,121,98,108,117,101,0,47,115,118,103,47,100,105,109,103,114,97,121,0,47,115,118,103,47,100,105,109,103,114,101,121,0,47,115,118,103,47,100,111,100,103,101,114,98,108,117,101,0,47,115,118,103,47,102,105,114,101,98,114,105,99,107,0,47,115,118,103,47,102,108,111,114,97,108,119,104,105,116,101,0,47,115,118,103,47,102,111,114,101,115,116,103,114,101,101,110,0,47,115,118,103,47,102,117,99,104,115,105,97,0,47,115,118,103,47,103,97,105,110,115,98,111,114,111,0,47,115,118,103,47,103,104,111,115,116,119,104,105,116,101,0,47,115,118,103,47,103,111,108,100,0,47,115,118,103,47,103,111,108,100,101,110,114,111,100,0,47,115,118,103,47,103,114,97,121,0,47,115,118,103,47,103,114,101,101,110,0,47,115,118,103,47,103,114,101,101,110,121,101,108,108,111,119,0,47,115,118,103,47,103,114,101,121,0,47,115,118,103,47,104,111,110,101,121,100,101,119,0,47,115,118,103,47,104,111,116,112,105,110,107,0,47,115,118,103,47,105,110,100,105,97,110,114,101,100,0,47,115,118,103,47,105,110,100,105,103,111,0,47,115,118,103,47,105,118,111,114,121,0,47,115,118,103,47,107,104,97,107,105,0,47,115,118,103,47,108,97,118,101,110,100,101,114,0,47,115,118,103,47,108,97,118,101,110,100,101,114,98,108,117,115,104,0,47,115,118,103,47,108,97,119,110,103,114,101,101,110,0,47,115,118,103,47,108,101,109,111,110,99,104,105,102,102,111,110,0,47,115,118,103,47,108,105,103,104,116,98,108,117,101,0,47,115,118,103,47,108,105,103,104,116,99,111,114,97,108,0,47,115,118,103,47,108,105,103,104,116,99,121,97,110,0,47,115,118,103,47,108,105,103,104,116,103,111,108,100,101,110,114,111,100,121,101,108,108,111,119,0,47,115,118,103,47,108,105,103,104,116,103,114,97,121,0,47,115,118,103,47,108,105,103,104,116,103,114,101,101,110,0,47,115,118,103,47,108,105,103,104,116,103,114,101,121,0,47,115,118,103,47,108,105,103,104,116,112,105,110,107,0,47,115,118,103,47,108,105,103,104,116,115,97,108,109,111,110,0,47,115,118,103,47,108,105,103,104,116,115,101,97,103,114,101,101,110,0,47,115,118,103,47,108,105,103,104,116,115,107,121,98,108,117,101,0,47,115,118,103,47,108,105,103,104,116,115,108,97,116,101,103,114,97,121,0,47,115,118,103,47,108,105,103,104,116,115,108,97,116,101,103,114,101,121,0,47,115,118,103,47,108,105,103,104,116,115,116,101,101,108,98,108,117,101,0,47,115,118,103,47,108,105,103,104,116,121,101,108,108,111,119,0,47,115,118,103,47,108,105,109,101,0,47,115,118,103,47,108,105,109,101,103,114,101,101,110,0,47,115,118,103,47,108,105,110,101,110,0,47,115,118,103,47,109,97,103,101,110,116,97,0,47,115,118,103,47,109,97,114,111,111,110,0,47,115,118,103,47,109,101,100,105,117,109,97,113,117,97,109,97,114,105,110,101,0,47,115,118,103,47,109,101,100,105,117,109,98,108,117,101,0,47,115,118,103,47,109,101,100,105,117,109,111,114,99,104,105,100,0,47,115,118,103,47,109,101,100,105,117,109,112,117,114,112,108,101,0,47,115,118,103,47,109,101,100,105,117,109,115,101,97,103,114,101,101,110,0,47,115,118,103,47,109,101,100,105,117,109,115,108,97,116,101,98,108,117,101,0,47,115,118,103,47,109,101,100,105,117,109,115,112,114,105,110,103,103,114,101,101,110,0,47,115,118,103,47,109,101,100,105,117,109,116,117,114,113,117,111,105,115,101,0,47,115,118,103,47,109,101,100,105,117,109,118,105,111,108,101,116,114,101,100,0,47,115,118,103,47,109,105,100,110,105,103,104,116,98,108,117,101,0,47,115,118,103,47,109,105,110,116,99,114,101,97,109,0,47,115,118,103,47,109,105,115,116,121,114,111,115,101,0,47,115,118,103,47,109,111,99,99,97,115,105,110,0,47,115,118,103,47,110,97,118,97,106,111,119,104,105,116,101,0,47,115,118,103,47,110,97,118,121,0,47,115,118,103,47,111,108,100,108,97,99,101,0,47,115,118,103,47,111,108,105,118,101,0,47,115,118,103,47,111,108,105,118,101,100,114,97,98,0,47,115,118,103,47,111,114,97,110,103,101,0,47,115,118,103,47,111,114,97,110,103,101,114,101,100,0,47,115,118,103,47,111,114,99,104,105,100,0,47,115,118,103,47,112,97,108,101,103,111,108,100,101,110,114,111,100,0,47,115,118,103,47,112,97,108,101,103,114,101,101,110,0,47,115,118,103,47,112,97,108,101,116,117,114,113,117,111,105,115,101,0,47,115,118,103,47,112,97,108,101,118,105,111,108,101,116,114,101,100,0,47,115,118,103,47,112,97,112,97,121,97,119,104,105,112,0,47,115,118,103,47,112,101,97,99,104,112,117,102,102,0,47,115,118,103,47,112,101,114,117,0,47,115,118,103,47,112,105,110,107,0,47,115,118,103,47,112,108,117,109,0,47,115,118,103,47,112,111,119,100,101,114,98,108,117,101,0,47,115,118,103,47,112,117,114,112,108,101,0,47,115,118,103,47,114,101,100,0,47,115,118,103,47,114,111,115,121,98,114,111,119,110,0,47,115,118,103,47,114,111,121,97,108,98,108,117,101,0,47,115,118,103,47,115,97,100,100,108,101,98,114,111,119,110,0,47,115,118,103,47,115,97,108,109,111,110,0,47,115,118,103,47,115,97,110,100,121,98,114,111,119,110,0,47,115,118,103,47,115,101,97,103,114,101,101,110,0,47,115,118,103,47,115,101,97,115,104,101,108,108,0,47,115,118,103,47,115,105,101,110,110,97,0,47,115,118,103,47,115,105,108,118,101,114,0,47,115,118,103,47,115,107,121,98,108,117,101,0,47,115,118,103,47,115,108,97,116,101,98,108,117,101,0,47,115,118,103,47,115,108,97,116,101,103,114,97,121,0,47,115,118,103,47,115,108,97,116,101,103,114,101,121,0,47,115,118,103,47,115,110,111,119,0,47,115,118,103,47,115,112,114,105,110,103,103,114,101,101,110,0,47,115,118,103,47,115,116,101,101,108,98,108,117,101,0,47,115,118,103,47,116,97,110,0,47,115,118,103,47,116,101,97,108,0,47,115,118,103,47,116,104,105,115,116,108,101,0,47,115,118,103,47,116,111,109,97,116,111,0,47,115,118,103,47,116,117,114,113,117,111,105,115,101,0,47,115,118,103,47,118,105,111,108,101,116,0,47,115,118,103,47,119,104,101,97,116,0,47,115,118,103,47,119,104,105,116,101,0,47,115,118,103,47,119,104,105,116,101,115,109,111,107,101,0,47,115,118,103,47,121,101,108,108,111,119,0,47,115,118,103,47,121,101,108,108,111,119,103,114,101,101,110,0,47,121,108,103,110,51,47,49,0,47,121,108,103,110,51,47,50,0,47,121,108,103,110,51,47,51,0,47,121,108,103,110,52,47,49,0,47,121,108,103,110,52,47,50,0,47,121,108,103,110,52,47,51,0,47,121,108,103,110,52,47,52,0,47,121,108,103,110,53,47,49,0,47,121,108,103,110,53,47,50,0,47,121,108,103,110,53,47,51,0,47,121,108,103,110,53,47,52,0,47,121,108,103,110,53,47,53,0,47,121,108,103,110,54,47,49,0,47,121,108,103,110,54,47,50,0,47,121,108,103,110,54,47,51,0,47,121,108,103,110,54,47,52,0,47,121,108,103,110,54,47,53,0,47,121,108,103,110,54,47,54,0,47,121,108,103,110,55,47,49,0,47,121,108,103,110,55,47,50,0,47,121,108,103,110,55,47,51,0,47,121,108,103,110,55,47,52,0,47,121,108,103,110,55,47,53,0,47,121,108,103,110,55,47,54,0,47,121,108,103,110,55,47,55,0,47,121,108,103,110,56,47,49,0,47,121,108,103,110,56,47,50,0,47,121,108,103,110,56,47,51,0,47,121,108,103,110,56,47,52,0,47,121,108,103,110,56,47,53,0,47,121,108,103,110,56,47,54,0,47,121,108,103,110,56,47,55,0,47,121,108,103,110,56,47,56,0,47,121,108,103,110,57,47,49,0,47,121,108,103,110,57,47,50,0,47,121,108,103,110,57,47,51,0,47,121,108,103,110,57,47,52,0,47,121,108,103,110,57,47,53,0,47,121,108,103,110,57,47,54,0,47,121,108,103,110,57,47,55,0,47,121,108,103,110,57,47,56,0,47,121,108,103,110,57,47,57,0,47,121,108,103,110,98,117,51,47,49,0,47,121,108,103,110,98,117,51,47,50,0,47,121,108,103,110,98,117,51,47,51,0,47,121,108,103,110,98,117,52,47,49,0,47,121,108,103,110,98,117,52,47,50,0,47,121,108,103,110,98,117,52,47,51,0,47,121,108,103,110,98,117,52,47,52,0,47,121,108,103,110,98,117,53,47,49,0,47,121,108,103,110,98,117,53,47,50,0,47,121,108,103,110,98,117,53,47,51,0,47,121,108,103,110,98,117,53,47,52,0,47,121,108,103,110,98,117,53,47,53,0,47,121,108,103,110,98,117,54,47,49,0,47,121,108,103,110,98,117,54,47,50,0,47,121,108,103,110,98,117,54,47,51,0,47,121,108,103,110,98,117,54,47,52,0,47,121,108,103,110,98,117,54,47,53,0,47,121,108,103,110,98,117,54,47,54,0,47,121,108,103,110,98,117,55,47,49,0,47,121,108,103,110,98,117,55,47,50,0,47,121,108,103,110,98,117,55,47,51,0,47,121,108,103,110,98,117,55,47,52,0,47,121,108,103,110,98,117,55,47,53,0,47,121,108,103,110,98,117,55,47,54,0,47,121,108,103,110,98,117,55,47,55,0,47,121,108,103,110,98,117,56,47,49,0,47,121,108,103,110,98,117,56,47,50,0,47,121,108,103,110,98,117,56,47,51,0,47,121,108,103,110,98,117,56,47,52,0,47,121,108,103,110,98,117,56,47,53,0,47,121,108,103,110,98,117,56,47,54,0,47,121,108,103,110,98,117,56,47,55,0,47,121,108,103,110,98,117,56,47,56,0,47,121,108,103,110,98,117,57,47,49,0,47,121,108,103,110,98,117,57,47,50,0,47,121,108,103,110,98,117,57,47,51,0,47,121,108,103,110,98,117,57,47,52,0,47,121,108,103,110,98,117,57,47,53,0,47,121,108,103,110,98,117,57,47,54,0,47,121,108,103,110,98,117,57,47,55,0,47,121,108,103,110,98,117,57,47,56,0,47,121,108,103,110,98,117,57,47,57,0,47,121,108,111,114,98,114,51,47,49,0,47,121,108,111,114,98,114,51,47,50,0,47,121,108,111,114,98,114,51,47,51,0,47,121,108,111,114,98,114,52,47,49,0,47,121,108,111,114,98,114,52,47,50,0,47,121,108,111,114,98,114,52,47,51,0,47,121,108,111,114,98,114,52,47,52,0,47,121,108,111,114,98,114,53,47,49,0,47,121,108,111,114,98,114,53,47,50,0,47,121,108,111,114,98,114,53,47,51,0,47,121,108,111,114,98,114,53,47,52,0,47,121,108,111,114,98,114,53,47,53,0,47,121,108,111,114,98,114,54,47,49,0,47,121,108,111,114,98,114,54,47,50,0,47,121,108,111,114,98,114,54,47,51,0,47,121,108,111,114,98,114,54,47,52,0,47,121,108,111,114,98,114,54,47,53,0,47,121,108,111,114,98,114,54,47,54,0,47,121,108,111,114,98,114,55,47,49,0,47,121,108,111,114,98,114,55,47,50,0,47,121,108,111,114,98,114,55,47,51,0,47,121,108,111,114,98,114,55,47,52,0,47,121,108,111,114,98,114,55,47,53,0,47,121,108,111,114,98,114,55,47,54,0,47,121,108,111,114,98,114,55,47,55,0,47,121,108,111,114,98,114,56,47,49,0,47,121,108,111,114,98,114,56,47,50,0,47,121,108,111,114,98,114,56,47,51,0,47,121,108,111,114,98,114,56,47,52,0,47,121,108,111,114,98,114,56,47,53,0,47,121,108,111,114,98,114,56,47,54,0,47,121,108,111,114,98,114,56,47,55,0,47,121,108,111,114,98,114,56,47,56,0,47,121,108,111,114,98,114,57,47,49,0,47,121,108,111,114,98,114,57,47,50,0,47,121,108,111,114,98,114,57,47,51,0,47,121,108,111,114,98,114,57,47,52,0,47,121,108,111,114,98,114,57,47,53,0,47,121,108,111,114,98,114,57,47,54,0,47,121,108,111,114,98,114,57,47,55,0,47,121,108,111,114,98,114,57,47,56,0,47,121,108,111,114,98,114,57,47,57,0,47,121,108,111,114,114,100,51,47,49,0,47,121,108,111,114,114,100,51,47,50,0,47,121,108,111,114,114,100,51,47,51,0,47,121,108,111,114,114,100,52,47,49,0,47,121,108,111,114,114,100,52,47,50,0,47,121,108,111,114,114,100,52,47,51,0,47,121,108,111,114,114,100,52,47,52,0,47,121,108,111,114,114,100,53,47,49,0,47,121,108,111,114,114,100,53,47,50,0,47,121,108,111,114,114,100,53,47,51,0,47,121,108,111,114,114,100,53,47,52,0,47,121,108,111,114,114,100,53,47,53,0,47,121,108,111,114,114,100,54,47,49,0,47,121,108,111,114,114,100,54,47,50,0,47,121,108,111,114,114,100,54,47,51,0,47,121,108,111,114,114,100,54,47,52,0,47,121,108,111,114,114,100,54,47,53,0,47,121,108,111,114,114,100,54,47,54,0,47,121,108,111,114,114,100,55,47,49,0,47,121,108,111,114,114,100,55,47,50,0,47,121,108,111,114,114,100,55,47,51,0,47,121,108,111,114,114,100,55,47,52,0,47,121,108,111,114,114,100,55,47,53,0,47,121,108,111,114,114,100,55,47,54,0,47,121,108,111,114,114,100,55,47,55,0,47,121,108,111,114,114,100,56,47,49,0,47,121,108,111,114,114,100,56,47,50,0,47,121,108,111,114,114,100,56,47,51,0,47,121,108,111,114,114,100,56,47,52,0,47,121,108,111,114,114,100,56,47,53,0,47,121,108,111,114,114,100,56,47,54,0,47,121,108,111,114,114,100,56,47,55,0,47,121,108,111,114,114,100,56,47,56,0,47,121,108,111,114,114,100,57,47,49,0,47,121,108,111,114,114,100,57,47,50,0,47,121,108,111,114,114,100,57,47,51,0,47,121,108,111,114,114,100,57,47,52,0,47,121,108,111,114,114,100,57,47,53,0,47,121,108,111,114,114,100,57,47,54,0,47,121,108,111,114,114,100,57,47,55,0,47,121,108,111,114,114,100,57,47,56,0,47,121,108,111,114,114,100,57,47,57,0,97,108,105,99,101,98,108,117,101,0,97,110,116,105,113,117,101,119,104,105,116,101,0,97,110,116,105,113,117,101,119,104,105,116,101,49,0,97,110,116,105,113,117,101,119,104,105,116,101,50,0,97,110,116,105,113,117,101,119,104,105,116,101,51,0,97,110,116,105,113,117,101,119,104,105,116,101,52,0,97,113,117,97,109,97,114,105,110,101,0,97,113,117,97,109,97,114,105,110,101,49,0,97,113,117,97,109,97,114,105,110,101,50,0,97,113,117,97,109,97,114,105,110,101,51,0,97,113,117,97,109,97,114,105,110,101,52,0,97,122,117,114,101,0,97,122,117,114,101,49,0,97,122,117,114,101,50,0,97,122,117,114,101,51,0,97,122,117,114,101,52,0,98,101,105,103,101,0,98,105,115,113,117,101,0,98,105,115,113,117,101,49,0,98,105,115,113,117,101,50,0,98,105,115,113,117,101,51,0,98,105,115,113,117,101,52,0,98,108,97,110,99,104,101,100,97,108,109,111,110,100,0,98,108,117,101,0,98,108,117,101,49,0,98,108,117,101,50,0,98,108,117,101,51,0,98,108,117,101,52,0,98,108,117,101,118,105,111,108,101,116,0,98,114,111,119,110,0,98,114,111,119,110,49,0,98,114,111,119,110,50,0,98,114,111,119,110,51,0,98,114,111,119,110,52,0,98,117,114,108,121,119,111,111,100,0,98,117,114,108,121,119,111,111,100,49,0,98,117,114,108,121,119,111,111,100,50,0,98,117,114,108,121,119,111,111,100,51,0,98,117,114,108,121,119,111,111,100,52,0,99,97,100,101,116,98,108,117,101,0,99,97,100,101,116,98,108,117,101,49,0,99,97,100,101,116,98,108,117,101,50,0,99,97,100,101,116,98,108,117,101,51,0,99,97,100,101,116,98,108,117,101,52,0,99,104,97,114,116,114,101,117,115,101,0,99,104,97,114,116,114,101,117,115,101,49,0,99,104,97,114,116,114,101,117,115,101,50,0,99,104,97,114,116,114,101,117,115,101,51,0,99,104,97,114,116,114,101,117,115,101,52,0,99,104,111,99,111,108,97,116,101,0,99,104,111,99,111,108,97,116,101,49,0,99,104,111,99,111,108,97,116,101,50,0,99,104,111,99,111,108,97,116,101,51,0,99,104,111,99,111,108,97,116,101,52,0,99,111,114,97,108,0,99,111,114,97,108,49,0,99,111,114,97,108,50,0,99,111,114,97,108,51,0,99,111,114,97,108,52,0,99,111,114,110,102,108,111,119,101,114,98,108,117,101,0,99,111,114,110,115,105,108,107,0,99,111,114,110,115,105,108,107,49,0,99,111,114,110,115,105,108,107,50,0,99,111,114,110,115,105,108,107,51,0,99,111,114,110,115,105,108,107,52,0,99,114,105,109,115,111,110,0,99,121,97,110,0,99,121,97,110,49,0,99,121,97,110,50,0,99,121,97,110,51,0,99,121,97,110,52,0,100,97,114,107,103,111,108,100,101,110,114,111,100,0,100,97,114,107,103,111,108,100,101,110,114,111,100,49,0,100,97,114,107,103,111,108,100,101,110,114,111,100,50,0,100,97,114,107,103,111,108,100,101,110,114,111,100,51,0,100,97,114,107,103,111,108,100,101,110,114,111,100,52,0,100,97,114,107,103,114,101,101,110,0,100,97,114,107,107,104,97,107,105,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,49,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,50,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,51,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,52,0,100,97,114,107,111,114,97,110,103,101,0,100,97,114,107,111,114,97,110,103,101,49,0,100,97,114,107,111,114,97,110,103,101,50,0,100,97,114,107,111,114,97,110,103,101,51,0,100,97,114,107,111,114,97,110,103,101,52,0,100,97,114,107,111,114,99,104,105,100,0,100,97,114,107,111,114,99,104,105,100,49,0,100,97,114,107,111,114,99,104,105,100,50,0,100,97,114,107,111,114,99,104,105,100,51,0,100,97,114,107,111,114,99,104,105,100,52,0,100,97,114,107,115,97,108,109,111,110,0,100,97,114,107,115,101,97,103,114,101,101,110,0,100,97,114,107,115,101,97,103,114,101,101,110,49,0,100,97,114,107,115,101,97,103,114,101,101,110,50,0,100,97,114,107,115,101,97,103,114,101,101,110,51,0,100,97,114,107,115,101,97,103,114,101,101,110,52,0,100,97,114,107,115,108,97,116,101,98,108,117,101,0,100,97,114,107,115,108,97,116,101,103,114,97,121,0,100,97,114,107,115,108,97,116,101,103,114,97,121,49,0,100,97,114,107,115,108,97,116,101,103,114,97,121,50,0,100,97,114,107,115,108,97,116,101,103,114,97,121,51,0,100,97,114,107,115,108,97,116,101,103,114,97,121,52,0,100,97,114,107,115,108,97,116,101,103,114,101,121,0,100,97,114,107,116,117,114,113,117,111,105,115,101,0,100,97,114,107,118,105,111,108,101,116,0,100,101,101,112,112,105,110,107,0,100,101,101,112,112,105,110,107,49,0,100,101,101,112,112,105,110,107,50,0,100,101,101,112,112,105,110,107,51,0,100,101,101,112,112,105,110,107,52,0,100,101,101,112,115,107,121,98,108,117,101,0,100,101,101,112,115,107,121,98,108,117,101,49,0,100,101,101,112,115,107,121,98,108,117,101,50,0,100,101,101,112,115,107,121,98,108,117,101,51,0,100,101,101,112,115,107,121,98,108,117,101,52,0,100,105,109,103,114,97,121,0,100,105,109,103,114,101,121,0,100,111,100,103,101,114,98,108,117,101,0,100,111,100,103,101,114,98,108,117,101,49,0,100,111,100,103,101,114,98,108,117,101,50,0,100,111,100,103,101,114,98,108,117,101,51,0,100,111,100,103,101,114,98,108,117,101,52,0,102,105,114,101,98,114,105,99,107,0,102,105,114,101,98,114,105,99,107,49,0,102,105,114,101,98,114,105,99,107,50,0,102,105,114,101,98,114,105,99,107,51,0,102,105,114,101,98,114,105,99,107,52,0,102,108,111,114,97,108,119,104,105,116,101,0,102,111,114,101,115,116,103,114,101,101,110,0,103,97,105,110,115,98,111,114,111,0,103,104,111,115,116,119,104,105,116,101,0,103,111,108,100,0,103,111,108,100,49,0,103,111,108,100,50,0,103,111,108,100,51,0,103,111,108,100,52,0,103,111,108,100,101,110,114,111,100,0,103,111,108,100,101,110,114,111,100,49,0,103,111,108,100,101,110,114,111,100,50,0,103,111,108,100,101,110,114,111,100,51,0,103,111,108,100,101,110,114,111,100,52,0,103,114,97,121,0,103,114,97,121,48,0,103,114,97,121,49,0,103,114,97,121,49,48,0,103,114,97,121,49,48,48,0,103,114,97,121,49,49,0,103,114,97,121,49,50,0,103,114,97,121,49,51,0,103,114,97,121,49,52,0,103,114,97,121,49,53,0,103,114,97,121,49,54,0,103,114,97,121,49,55,0,103,114,97,121,49,56,0,103,114,97,121,49,57,0,103,114,97,121,50,0,103,114,97,121,50,48,0,103,114,97,121,50,49,0,103,114,97,121,50,50],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+122904);allocate([103,114,97,121,50,51,0,103,114,97,121,50,52,0,103,114,97,121,50,53,0,103,114,97,121,50,54,0,103,114,97,121,50,55,0,103,114,97,121,50,56,0,103,114,97,121,50,57,0,103,114,97,121,51,0,103,114,97,121,51,48,0,103,114,97,121,51,49,0,103,114,97,121,51,50,0,103,114,97,121,51,51,0,103,114,97,121,51,52,0,103,114,97,121,51,53,0,103,114,97,121,51,54,0,103,114,97,121,51,55,0,103,114,97,121,51,56,0,103,114,97,121,51,57,0,103,114,97,121,52,0,103,114,97,121,52,48,0,103,114,97,121,52,49,0,103,114,97,121,52,50,0,103,114,97,121,52,51,0,103,114,97,121,52,52,0,103,114,97,121,52,53,0,103,114,97,121,52,54,0,103,114,97,121,52,55,0,103,114,97,121,52,56,0,103,114,97,121,52,57,0,103,114,97,121,53,0,103,114,97,121,53,48,0,103,114,97,121,53,49,0,103,114,97,121,53,50,0,103,114,97,121,53,51,0,103,114,97,121,53,52,0,103,114,97,121,53,53,0,103,114,97,121,53,54,0,103,114,97,121,53,55,0,103,114,97,121,53,56,0,103,114,97,121,53,57,0,103,114,97,121,54,0,103,114,97,121,54,48,0,103,114,97,121,54,49,0,103,114,97,121,54,50,0,103,114,97,121,54,51,0,103,114,97,121,54,52,0,103,114,97,121,54,53,0,103,114,97,121,54,54,0,103,114,97,121,54,55,0,103,114,97,121,54,56,0,103,114,97,121,54,57,0,103,114,97,121,55,0,103,114,97,121,55,48,0,103,114,97,121,55,49,0,103,114,97,121,55,50,0,103,114,97,121,55,51,0,103,114,97,121,55,52,0,103,114,97,121,55,53,0,103,114,97,121,55,54,0,103,114,97,121,55,55,0,103,114,97,121,55,56,0,103,114,97,121,55,57,0,103,114,97,121,56,0,103,114,97,121,56,48,0,103,114,97,121,56,49,0,103,114,97,121,56,50,0,103,114,97,121,56,51,0,103,114,97,121,56,52,0,103,114,97,121,56,53,0,103,114,97,121,56,54,0,103,114,97,121,56,55,0,103,114,97,121,56,56,0,103,114,97,121,56,57,0,103,114,97,121,57,0,103,114,97,121,57,48,0,103,114,97,121,57,49,0,103,114,97,121,57,50,0,103,114,97,121,57,51,0,103,114,97,121,57,52,0,103,114,97,121,57,53,0,103,114,97,121,57,54,0,103,114,97,121,57,55,0,103,114,97,121,57,56,0,103,114,97,121,57,57,0,103,114,101,101,110,0,103,114,101,101,110,49,0,103,114,101,101,110,50,0,103,114,101,101,110,51,0,103,114,101,101,110,52,0,103,114,101,101,110,121,101,108,108,111,119,0,103,114,101,121,0,103,114,101,121,48,0,103,114,101,121,49,0,103,114,101,121,49,48,0,103,114,101,121,49,48,48,0,103,114,101,121,49,49,0,103,114,101,121,49,50,0,103,114,101,121,49,51,0,103,114,101,121,49,52,0,103,114,101,121,49,53,0,103,114,101,121,49,54,0,103,114,101,121,49,55,0,103,114,101,121,49,56,0,103,114,101,121,49,57,0,103,114,101,121,50,0,103,114,101,121,50,48,0,103,114,101,121,50,49,0,103,114,101,121,50,50,0,103,114,101,121,50,51,0,103,114,101,121,50,52,0,103,114,101,121,50,53,0,103,114,101,121,50,54,0,103,114,101,121,50,55,0,103,114,101,121,50,56,0,103,114,101,121,50,57,0,103,114,101,121,51,0,103,114,101,121,51,48,0,103,114,101,121,51,49,0,103,114,101,121,51,50,0,103,114,101,121,51,51,0,103,114,101,121,51,52,0,103,114,101,121,51,53,0,103,114,101,121,51,54,0,103,114,101,121,51,55,0,103,114,101,121,51,56,0,103,114,101,121,51,57,0,103,114,101,121,52,0,103,114,101,121,52,48,0,103,114,101,121,52,49,0,103,114,101,121,52,50,0,103,114,101,121,52,51,0,103,114,101,121,52,52,0,103,114,101,121,52,53,0,103,114,101,121,52,54,0,103,114,101,121,52,55,0,103,114,101,121,52,56,0,103,114,101,121,52,57,0,103,114,101,121,53,0,103,114,101,121,53,48,0,103,114,101,121,53,49,0,103,114,101,121,53,50,0,103,114,101,121,53,51,0,103,114,101,121,53,52,0,103,114,101,121,53,53,0,103,114,101,121,53,54,0,103,114,101,121,53,55,0,103,114,101,121,53,56,0,103,114,101,121,53,57,0,103,114,101,121,54,0,103,114,101,121,54,48,0,103,114,101,121,54,49,0,103,114,101,121,54,50,0,103,114,101,121,54,51,0,103,114,101,121,54,52,0,103,114,101,121,54,53,0,103,114,101,121,54,54,0,103,114,101,121,54,55,0,103,114,101,121,54,56,0,103,114,101,121,54,57,0,103,114,101,121,55,0,103,114,101,121,55,48,0,103,114,101,121,55,49,0,103,114,101,121,55,50,0,103,114,101,121,55,51,0,103,114,101,121,55,52,0,103,114,101,121,55,53,0,103,114,101,121,55,54,0,103,114,101,121,55,55,0,103,114,101,121,55,56,0,103,114,101,121,55,57,0,103,114,101,121,56,0,103,114,101,121,56,48,0,103,114,101,121,56,49,0,103,114,101,121,56,50,0,103,114,101,121,56,51,0,103,114,101,121,56,52,0,103,114,101,121,56,53,0,103,114,101,121,56,54,0,103,114,101,121,56,55,0,103,114,101,121,56,56,0,103,114,101,121,56,57,0,103,114,101,121,57,0,103,114,101,121,57,48,0,103,114,101,121,57,49,0,103,114,101,121,57,50,0,103,114,101,121,57,51,0,103,114,101,121,57,52,0,103,114,101,121,57,53,0,103,114,101,121,57,54,0,103,114,101,121,57,55,0,103,114,101,121,57,56,0,103,114,101,121,57,57,0,104,111,110,101,121,100,101,119,0,104,111,110,101,121,100,101,119,49,0,104,111,110,101,121,100,101,119,50,0,104,111,110,101,121,100,101,119,51,0,104,111,110,101,121,100,101,119,52,0,104,111,116,112,105,110,107,0,104,111,116,112,105,110,107,49,0,104,111,116,112,105,110,107,50,0,104,111,116,112,105,110,107,51,0,104,111,116,112,105,110,107,52,0,105,110,100,105,97,110,114,101,100,0,105,110,100,105,97,110,114,101,100,49,0,105,110,100,105,97,110,114,101,100,50,0,105,110,100,105,97,110,114,101,100,51,0,105,110,100,105,97,110,114,101,100,52,0,105,110,100,105,103,111,0,105,110,118,105,115,0,105,118,111,114,121,0,105,118,111,114,121,49,0,105,118,111,114,121,50,0,105,118,111,114,121,51,0,105,118,111,114,121,52,0,107,104,97,107,105,0,107,104,97,107,105,49,0,107,104,97,107,105,50,0,107,104,97,107,105,51,0,107,104,97,107,105,52,0,108,97,118,101,110,100,101,114,0,108,97,118,101,110,100,101,114,98,108,117,115,104,0,108,97,118,101,110,100,101,114,98,108,117,115,104,49,0,108,97,118,101,110,100,101,114,98,108,117,115,104,50,0,108,97,118,101,110,100,101,114,98,108,117,115,104,51,0,108,97,118,101,110,100,101,114,98,108,117,115,104,52,0,108,97,119,110,103,114,101,101,110,0,108,101,109,111,110,99,104,105,102,102,111,110,0,108,101,109,111,110,99,104,105,102,102,111,110,49,0,108,101,109,111,110,99,104,105,102,102,111,110,50,0,108,101,109,111,110,99,104,105,102,102,111,110,51,0,108,101,109,111,110,99,104,105,102,102,111,110,52,0,108,105,103,104,116,98,108,117,101,0,108,105,103,104,116,98,108,117,101,49,0,108,105,103,104,116,98,108,117,101,50,0,108,105,103,104,116,98,108,117,101,51,0,108,105,103,104,116,98,108,117,101,52,0,108,105,103,104,116,99,111,114,97,108,0,108,105,103,104,116,99,121,97,110,0,108,105,103,104,116,99,121,97,110,49,0,108,105,103,104,116,99,121,97,110,50,0,108,105,103,104,116,99,121,97,110,51,0,108,105,103,104,116,99,121,97,110,52,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,49,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,50,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,51,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,52,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,121,101,108,108,111,119,0,108,105,103,104,116,103,114,97,121,0,108,105,103,104,116,103,114,101,121,0,108,105,103,104,116,112,105,110,107,0,108,105,103,104,116,112,105,110,107,49,0,108,105,103,104,116,112,105,110,107,50,0,108,105,103,104,116,112,105,110,107,51,0,108,105,103,104,116,112,105,110,107,52,0,108,105,103,104,116,115,97,108,109,111,110,0,108,105,103,104,116,115,97,108,109,111,110,49,0,108,105,103,104,116,115,97,108,109,111,110,50,0,108,105,103,104,116,115,97,108,109,111,110,51,0,108,105,103,104,116,115,97,108,109,111,110,52,0,108,105,103,104,116,115,101,97,103,114,101,101,110,0,108,105,103,104,116,115,107,121,98,108,117,101,0,108,105,103,104,116,115,107,121,98,108,117,101,49,0,108,105,103,104,116,115,107,121,98,108,117,101,50,0,108,105,103,104,116,115,107,121,98,108,117,101,51,0,108,105,103,104,116,115,107,121,98,108,117,101,52,0,108,105,103,104,116,115,108,97,116,101,98,108,117,101,0,108,105,103,104,116,115,108,97,116,101,103,114,97,121,0,108,105,103,104,116,115,108,97,116,101,103,114,101,121,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,49,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,50,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,51,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,52,0,108,105,103,104,116,121,101,108,108,111,119,0,108,105,103,104,116,121,101,108,108,111,119,49,0,108,105,103,104,116,121,101,108,108,111,119,50,0,108,105,103,104,116,121,101,108,108,111,119,51,0,108,105,103,104,116,121,101,108,108,111,119,52,0,108,105,109,101,103,114,101,101,110,0,108,105,110,101,110,0,109,97,103,101,110,116,97,0,109,97,103,101,110,116,97,49,0,109,97,103,101,110,116,97,50,0,109,97,103,101,110,116,97,51,0,109,97,103,101,110,116,97,52,0,109,97,114,111,111,110,0,109,97,114,111,111,110,49,0,109,97,114,111,111,110,50,0,109,97,114,111,111,110,51,0,109,97,114,111,111,110,52,0,109,101,100,105,117,109,97,113,117,97,109,97,114,105,110,101,0,109,101,100,105,117,109,98,108,117,101,0,109,101,100,105,117,109,111,114,99,104,105,100,0,109,101,100,105,117,109,111,114,99,104,105,100,49,0,109,101,100,105,117,109,111,114,99,104,105,100,50,0,109,101,100,105,117,109,111,114,99,104,105,100,51,0,109,101,100,105,117,109,111,114,99,104,105,100,52,0,109,101,100,105,117,109,112,117,114,112,108,101,0,109,101,100,105,117,109,112,117,114,112,108,101,49,0,109,101,100,105,117,109,112,117,114,112,108,101,50,0,109,101,100,105,117,109,112,117,114,112,108,101,51,0,109,101,100,105,117,109,112,117,114,112,108,101,52,0,109,101,100,105,117,109,115,101,97,103,114,101,101,110,0,109,101,100,105,117,109,115,108,97,116,101,98,108,117,101,0,109,101,100,105,117,109,115,112,114,105,110,103,103,114,101,101,110,0,109,101,100,105,117,109,116,117,114,113,117,111,105,115,101,0,109,101,100,105,117,109,118,105,111,108,101,116,114,101,100,0,109,105,100,110,105,103,104,116,98,108,117,101,0,109,105,110,116,99,114,101,97,109,0,109,105,115,116,121,114,111,115,101,0,109,105,115,116,121,114,111,115,101,49,0,109,105,115,116,121,114,111,115,101,50,0,109,105,115,116,121,114,111,115,101,51,0,109,105,115,116,121,114,111,115,101,52,0,109,111,99,99,97,115,105,110,0,110,97,118,97,106,111,119,104,105,116,101,0,110,97,118,97,106,111,119,104,105,116,101,49,0,110,97,118,97,106,111,119,104,105,116,101,50,0,110,97,118,97,106,111,119,104,105,116,101,51,0,110,97,118,97,106,111,119,104,105,116,101,52,0,110,97,118,121,0,110,97,118,121,98,108,117,101,0,110,111,110,101,0,111,108,100,108,97,99,101,0,111,108,105,118,101,100,114,97,98,0,111,108,105,118,101,100,114,97,98,49,0,111,108,105,118,101,100,114,97,98,50,0,111,108,105,118,101,100,114,97,98,51,0,111,108,105,118,101,100,114,97,98,52,0,111,114,97,110,103,101,0,111,114,97,110,103,101,49,0,111,114,97,110,103,101,50,0,111,114,97,110,103,101,51,0,111,114,97,110,103,101,52,0,111,114,97,110,103,101,114,101,100,0,111,114,97,110,103,101,114,101,100,49,0,111,114,97,110,103,101,114,101,100,50,0,111,114,97,110,103,101,114,101,100,51,0,111,114,97,110,103,101,114,101,100,52,0,111,114,99,104,105,100,0,111,114,99,104,105,100,49,0,111,114,99,104,105,100,50,0,111,114,99,104,105,100,51,0,111,114,99,104,105,100,52,0,112,97,108,101,103,111,108,100,101,110,114,111,100,0,112,97,108,101,103,114,101,101,110,0,112,97,108,101,103,114,101,101,110,49,0,112,97,108,101,103,114,101,101,110,50,0,112,97,108,101,103,114,101,101,110,51,0,112,97,108,101,103,114,101,101,110,52,0,112,97,108,101,116,117,114,113,117,111,105,115,101,0,112,97,108,101,116,117,114,113,117,111,105,115,101,49,0,112,97,108,101,116,117,114,113,117,111,105,115,101,50,0,112,97,108,101,116,117,114,113,117,111,105,115,101,51,0,112,97,108,101,116,117,114,113,117,111,105,115,101,52,0,112,97,108,101,118,105,111,108,101,116,114,101,100,0,112,97,108,101,118,105,111,108,101,116,114,101,100,49,0,112,97,108,101,118,105,111,108,101,116,114,101,100,50,0,112,97,108,101,118,105,111,108,101,116,114,101,100,51,0,112,97,108,101,118,105,111,108,101,116,114,101,100,52,0,112,97,112,97,121,97,119,104,105,112,0,112,101,97,99,104,112,117,102,102,0,112,101,97,99,104,112,117,102,102,49,0,112,101,97,99,104,112,117,102,102,50,0,112,101,97,99,104,112,117,102,102,51,0,112,101,97,99,104,112,117,102,102,52,0,112,101,114,117,0,112,105,110,107,0,112,105,110,107,49,0,112,105,110,107,50,0,112,105,110,107,51,0,112,105,110,107,52,0,112,108,117,109,0,112,108,117,109,49,0,112,108,117,109,50,0,112,108,117,109,51,0,112,108,117,109,52,0,112,111,119,100,101,114,98,108,117,101,0,112,117,114,112,108,101,0,112,117,114,112,108,101,49,0,112,117,114,112,108,101,50,0,112,117,114,112,108,101,51,0,112,117,114,112,108,101,52,0,114,101,100,0,114,101,100,49,0,114,101,100,50,0,114,101,100,51,0,114,101,100,52,0,114,111,115,121,98,114,111,119,110,0,114,111,115,121,98,114,111,119,110,49,0,114,111,115,121,98,114,111,119,110,50,0,114,111,115,121,98,114,111,119,110,51,0,114,111,115,121,98,114,111,119,110,52,0,114,111,121,97,108,98,108,117,101,0,114,111,121,97,108,98,108,117,101,49,0,114,111,121,97,108,98,108,117,101,50,0,114,111,121,97,108,98,108,117,101,51,0,114,111,121,97,108,98,108,117,101,52,0,115,97,100,100,108,101,98,114,111,119,110,0,115,97,108,109,111,110,0,115,97,108,109,111,110,49,0,115,97,108,109,111,110,50,0,115,97,108,109,111,110,51,0,115,97,108,109,111,110,52,0,115,97,110,100,121,98,114,111,119,110,0,115,101,97,103,114,101,101,110,0,115,101,97,103,114,101,101,110,49,0,115,101,97,103,114,101,101,110,50,0,115,101,97,103,114,101,101,110,51,0,115,101,97,103,114,101,101,110,52,0,115,101,97,115,104,101,108,108,0,115,101,97,115,104,101,108,108,49,0,115,101,97,115,104,101,108,108,50,0,115,101,97,115,104,101,108,108,51,0,115,101,97,115,104,101,108,108,52,0,115,105,101,110,110,97,0,115,105,101,110,110,97,49,0,115,105,101,110,110,97,50,0,115,105,101,110,110,97,51,0,115,105,101,110,110,97,52,0,115,107,121,98,108,117,101,0,115,107,121,98,108,117,101,49,0,115,107,121,98,108,117,101,50,0,115,107,121,98,108,117,101,51,0,115,107,121,98,108,117,101,52,0,115,108,97,116,101,98,108,117,101,0,115,108,97,116,101,98,108,117,101,49,0,115,108,97,116,101,98,108,117,101,50,0,115,108,97,116,101,98,108,117,101,51,0,115,108,97,116,101,98,108,117,101,52,0,115,108,97,116,101,103,114,97,121,0,115,108,97,116,101,103,114,97,121,49,0,115,108,97,116,101,103,114,97,121,50,0,115,108,97,116,101,103,114,97,121,51,0,115,108,97,116,101,103,114,97,121,52,0,115,108,97,116,101,103,114,101,121,0,115,110,111,119,0,115,110,111,119,49,0,115,110,111,119,50,0,115,110,111,119,51,0,115,110,111,119,52,0,115,112,114,105,110,103,103,114,101,101,110,0,115,112,114,105,110,103,103,114,101,101,110,49,0,115,112,114,105,110,103,103,114,101,101,110,50,0,115,112,114,105,110,103,103,114,101,101,110,51,0,115,112,114,105,110,103,103,114,101,101,110,52,0,115,116,101,101,108,98,108,117,101,0,115,116,101,101,108,98,108,117,101,49,0,115,116,101,101,108,98,108,117,101,50,0,115,116,101,101,108,98,108,117,101,51,0,115,116,101,101,108,98,108,117,101,52,0,116,97,110,0,116,97,110,49,0,116,97,110,50,0,116,97,110,51,0,116,97,110,52,0,116,104,105,115,116,108,101,0,116,104,105,115,116,108,101,49,0,116,104,105,115,116,108,101,50,0,116,104,105,115,116,108,101,51,0,116,104,105,115,116,108,101,52,0,116,111,109,97,116,111,0,116,111,109,97,116,111,49,0,116,111,109,97,116,111,50,0,116,111,109,97,116,111,51,0,116,111,109,97,116,111,52,0,116,117,114,113,117,111,105,115,101,0,116,117,114,113,117,111,105,115,101,49,0,116,117,114,113,117,111,105,115,101,50,0,116,117,114,113,117,111,105,115,101,51,0,116,117,114,113,117,111,105,115,101,52,0,118,105,111,108,101,116,0,118,105,111,108,101,116,114,101,100,0,118,105,111,108,101,116,114,101,100,49,0,118,105,111,108,101,116,114,101,100,50,0,118,105,111,108,101,116,114,101,100,51,0,118,105,111,108,101,116,114,101,100,52,0,119,104,101,97,116,0,119,104,101,97,116,49,0,119,104,101,97,116,50,0,119,104,101,97,116,51,0,119,104,101,97,116,52,0,119,104,105,116,101,0,119,104,105,116,101,115,109,111,107,101,0,121,101,108,108,111,119,0,121,101,108,108,111,119,49,0,121,101,108,108,111,119,50,0,121,101,108,108,111,119,51,0,121,101,108,108,111,119,52,0,121,101,108,108,111,119,103,114,101,101,110,0,108,97,99,107,0,104,105,116,101,0,105,103,104,116,103,114,101,121,0,88,49,49,47,0,47,37,115,47,37,115,0,105,109,97,103,101,115,99,97,108,101,0,102,97,108,115,101,0,98,108,97,99,107,0,100,111,116,116,101,100,0,100,97,115,104,101,100,0,99,112,45,62,115,114,99,0,104,116,109,108,116,97,98,108,101,46,99,0,101,109,105,116,95,104,116,109,108,95,105,109,103,0,99,112,45,62,115,114,99,91,48,93,0,116,114,97,110,115,112,97,114,101,110,116,0,95,37,100,0,37,100,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,49,48,0,49,49,0,49,50,0,49,51,0,49,52,0,49,53,0,49,54,0,49,55,0,49,56,0,49,57,0,50,48,0,65,103,110,111,100,101,105,110,102,111,95,116,0,65,103,101,100,103,101,105,110,102,111,95,116,0,114,111,119,103,0,99,111,108,103,0,65,103,114,97,112,104,105,110,102,111,95,116,0,100,101,108,120,32,62,61,32,48,0,112,111,115,95,104,116,109,108,95,116,98,108,0,100,101,108,121,32,62,61,32,48,0,116,97,98,108,101,32,115,105,122,101,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,99,111,110,116,101,110,116,10,0,102,105,120,101,100,32,116,97,98,108,101,32,115,105,122,101,32,119,105,116,104,32,117,110,115,112,101,99,105,102,105,101,100,32,119,105,100,116,104,32,111,114,32,104,101,105,103,104,116,10,0,99,101,108,108,32,115,105,122,101,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,99,111,110,116,101,110,116,10,0,102,105,120,101,100,32,99,101,108,108,32,115,105,122,101,32,119,105,116,104,32,117,110,115,112,101,99,105,102,105,101,100,32,119,105,100,116,104,32,111,114,32,104,101,105,103,104,116,10,0,78,111,32,111,114,32,105,109,112,114,111,112,101,114,32,105,109,97,103,101,32,102,105,108,101,61,34,37,115,34,10,0,112,101,110,99,111,108,111,114,0,45,62,0,102,80,81,46,99,0,80,81,99,104,101,99,107,0,72,101,97,112,32,111,118,101,114,102,108,111,119,10,0,37,33,80,83,45,65,100,111,98,101,45,50,46,48,10,47,110,111,100,101,32,123,10,32,32,47,89,32,101,120,99,104,32,100,101,102,10,32,32,47,88,32,101,120,99,104,32,100,101,102,10,32,32,47,121,32,101,120,99,104,32,100,101,102,10,32,32,47,120,32,101,120,99,104,32,100,101,102,10,32,32,110,101,119,112,97,116,104,10,32,32,120,32,121,32,109,111,118,101,116,111,10,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,99,108,111,115,101,112,97,116,104,32,102,105,108,108,10,125,32,100,101,102,10,47,99,101,108,108,32,123,10,32,32,47,89,32,101,120,99,104,32,100,101,102,10,32,32,47,88,32,101,120,99,104,32,100,101,102,10,32,32,47,121,32,101,120,99,104,32,100,101,102,10,32,32,47,120,32,101,120,99,104,32,100,101,102,10,32,32,110,101,119,112,97,116,104,10,32,32,120,32,121,32,109,111,118,101,116,111,10,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,125,32,100,101,102,10,0,115,104,111,119,112,97,103,101,10,0,102,97,105,108,101,100,32,97,116,32,110,111,100,101,32,37,100,91,48,93,10,0,110,112,45,62,99,101,108,108,115,91,48,93,0,109,97,122,101,46,99,0,99,104,107,83,103,114,97,112,104,0,102,97,105,108,101,100,32,97,116,32,110,111,100,101,32,37,100,91,49,93,10,0,110,112,45,62,99,101,108,108,115,91,49,93,0,100,105,116,101,109,115,0,102,105,110,100,83,86,101,114,116,0,37,37,37,37,80,97,103,101,58,32,49,32,49,10,37,37,37,37,80,97,103,101,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,37,102,32,37,102,32,116,114,97,110,115,108,97,116,101,10,0,48,32,48,32,49,32,115,101,116,114,103,98,99,111,108,111,114,10,0,37,102,32,37,102,32,37,102,32,37,102,32,110,111,100,101,10,0,48,32,48,32,48,32,115,101,116,114,103,98,99,111,108,111,114,10,0,37,102,32,37,102,32,37,102,32,37,102,32,99,101,108,108,10,0,49,32,48,32,48,32,115,101,116,114,103,98,99,111,108,111,114,10,0,117,110,101,120,112,101,99,116,101,100,32,99,97,115,101,32,105,110,32,108,111,99,97,116,101,95,101,110,100,112,111,105,110,116,10,0,48,0,116,114,97,112,101,122,111,105,100,46,99,0,108,111,99,97,116,101,95,101,110,100,112,111,105,110,116,0,97,100,100,95,115,101,103,109,101,110,116,58,32,101,114,114,111,114,10,0,110,101,119,110,111,100,101,58,32,81,117,101,114,121,45,116,97,98,108,101,32,111,118,101,114,102,108,111,119,10,0,110,101,119,110,111,100,101,0,110,101,119,116,114,97,112,58,32,84,114,97,112,101,122,111,105,100,45,116,97,98,108,101,32,111,118,101,114,102,108,111,119,32,37,100,10,0,110,101,119,116,114,97,112,0,105,110,100,101,120,46,99,0,82,84,114,101,101,83,101,97,114,99,104,0,110,45,62,108,101,118,101,108,32,62,61,32,48,0,82,84,114,101,101,73,110,115,101,114,116,0,108,101,118,101,108,32,62,61,32,48,32,38,38,32,108,101,118,101,108,32,60,61,32,40,42,110,41,45,62,108,101,118,101,108,0,114,45,62,98,111,117,110,100,97,114,121,91,105,93,32,60,61,32,114,45,62,98,111,117,110,100,97,114,121,91,78,85,77,68,73,77,83,32,43,32,105,93,0,114,32,38,38,32,110,32,38,38,32,110,101,119,0,82,84,114,101,101,73,110,115,101,114,116,50,0,108,101,118,101,108,32,62,61,32,48,32,38,38,32,108,101,118,101,108,32,60,61,32,110,45,62,108,101,118,101,108,0,70,65,76,83,69,0,110,111,100,101,46,99,0,78,111,100,101,67,111,118,101,114,0,114,32,38,38,32,110,0,80,105,99,107,66,114,97,110,99,104,0,65,100,100,66,114,97,110,99,104,0,105,32,60,32,78,79,68,69,67,65,82,68,0,110,101,119,0,110,32,38,38,32,105,32,62,61,32,48,32,38,38,32,105,32,60,32,78,79,68,69,67,65,82,68,0,68,105,115,99,111,110,66,114,97,110,99,104,0,114,0,114,101,99,116,97,110,103,108,101,46,99,0,82,101,99,116,65,114,101,97,0,114,32,38,38,32,114,114,0,67,111,109,98,105,110,101,82,101,99,116,0,114,32,38,38,32,115,0,79,118,101,114,108,97,112,0,110,0,115,112,108,105,116,46,113,46,99,0,83,112,108,105,116,78,111,100,101,0,98,0,110,45,62,99,111,117,110,116,32,43,32,40,42,110,110,41,45,62,99,111,117,110,116,32,61,61,32,78,79,68,69,67,65,82,68,32,43,32,49,0,76,111,97,100,78,111,100,101,115,0,113,0,112,0,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,112,97,114,116,105,116,105,111,110,91,105,93,32,61,61,32,48,32,124,124,32,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,112,97,114,116,105,116,105,111,110,91,105,93,32,61,61,32,49,0,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,48,93,32,43,32,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,49,93,32,61,61,32,78,79,68,69,67,65,82,68,32,43,32,49,0,77,101,116,104,111,100,90,101,114,111,0,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,48,93,32,62,61,32,114,116,112,45,62,77,105,110,70,105,108,108,32,38,38,32,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,49,93,32,62,61,32,114,116,112,45,62,77,105,110,70,105,108,108,0,33,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,116,97,107,101,110,91,105,93,0,67,108,97,115,115,105,102,121,0,71,101,116,66,114,97,110,99,104,101,115,0,110,45,62,98,114,97,110,99,104,91,105,93,46,99,104,105,108,100,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,2,2,2,2,2,2,16,12,89,1,0,31,80,8,3,7,18,19,20,87,22,23,8,11,105,12,31,10,5,12,14,41,17,43,15,45,16,47,48,32,50,6,52,53,27,28,29,30,11,12,33,34,35,36,37,38,39,40,12,24,25,23,4,10,27,28,26,32,42,10,33,34,35,36,37,38,39,40,12,10,14,83,10,44,88,49,88,88,88,88,88,88,12,27,28,15,46,88,51,33,34,35,36,37,38,39,40,27,28,255,83,255,255,33,34,35,36,37,38,39,40,12,255,255,5,255,255,255,9,20,255,255,255,255,255,12,27,28,255,16,21,22,33,34,35,36,37,38,39,40,27,28,255,255,255,255,33,34,35,36,37,38,39,40,12,255,18,19,20,17,22,23,255,255,255,255,255,255,12,27,28,255,255,255,18,33,34,35,36,37,38,39,40,27,28,255,255,255,255,33,34,35,36,37,38,39,40,12,255,255,255,255,255,255,19,255,255,255,255,255,255,12,27,28,255,255,255,255,33,34,35,36,37,38,39,40,27,28,255,255,255,255,33,34,35,36,37,38,39,40,18,19,20,21,22,23,24,25,255,255,255,255,255,255,255,255,255,35,36,37,38,39,27,18,19,20,22,23,34,54,104,1,31,56,86,33,32,2,27,27,27,94,27,27,55,57,112,54,210,194,79,4,60,34,71,34,63,34,68,34,34,88,34,101,34,34,5,6,95,96,57,4,7,8,9,10,11,12,13,14,4,102,103,93,106,109,5,6,111,88,59,113,7,8,9,10,11,12,13,14,4,114,60,91,115,62,97,70,27,18,19,20,22,23,4,5,6,63,65,98,73,7,8,9,10,11,12,13,14,5,6,0,92,0,0,7,8,9,10,11,12,13,14,4,0,0,79,0,0,0,83,66,0,0,0,0,0,4,5,6,0,68,84,85,7,8,9,10,11,12,13,14,5,6,0,0,0,0,7,8,9,10,11,12,13,14,4,0,42,44,46,71,49,51,0,0,0,0,0,0,4,5,6,0,0,0,74,7,8,9,10,11,12,13,14,5,6,0,0,0,0,7,8,9,10,11,12,13,14,4,0,0,0,0,0,0,76,0,0,0,0,0,0,4,5,6,0,0,0,0,7,8,9,10,11,12,13,14,5,6,0,0,0,0,7,8,9,10,11,12,13,14,41,43,45,47,48,50,52,53,0,0,0,0,0,0,0,0,0,41,43,45,48,50,0,4,47,0,36,35,0,18,20,22,26,28,30,32,24,0,5,7,47,47,47,0,47,47,0,0,9,8,40,0,0,1,34,2,6,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,37,3,38,19,10,41,21,11,42,23,14,45,25,17,27,12,43,29,13,44,31,15,33,16,0,51,0,48,0,47,67,0,49,0,47,0,53,46,39,66,50,65,0,58,56,0,60,52,69,0,54,0,64,0,0,63,0,68,55,59,57,61,0,2,3,3,1,1,2,1,1,1,3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,0,6,1,3,3,3,3,3,1,0,1,2,3,0,4,1,2,3,0,4,0,4,0,4,0,3,2,1,2,1,2,1,83,121,110,116,97,120,32,101,114,114,111,114,58,32,110,111,110,45,115,112,97,99,101,32,115,116,114,105,110,103,32,117,115,101,100,32,98,101,102,111,114,101,32,60,84,65,66,76,69,62,0,83,121,110,116,97,120,32,101,114,114,111,114,58,32,110,111,110,45,115,112,97,99,101,32,115,116,114,105,110,103,32,117,115,101,100,32,97,102,116,101,114,32,60,47,84,65,66,76,69,62,0,0,41,42,42,42,43,44,44,45,45,45,45,45,45,45,45,45,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,62,63,63,65,64,66,66,66,66,66,66,67,67,68,68,68,70,69,71,71,71,73,72,74,72,75,72,76,72,77,77,78,78,79,79,255,3,15,16,17,35,58,36,61,37,64,21,67,38,69,39,72,24,75,25,77,26,40,28,78,29,30,80,81,82,89,90,108,107,110,99,100,87,105,109,101,109,111,114,121,32,101,120,104,97,117,115,116,101,100,0,37,115,32,105,110,32,108,105,110,101,32,37,100,32,10,0,46,46,46,32,37,115,32,46,46,46,10,0,84,65,66,76,69,0,84,82,0,84,72,0,84,68,0,72,84,77,76,0,70,79,78,84,0,66,0,85,0,79,0,73,0,83,85,80,0,83,85,66,0,83,0,66,82,0,72,82,0,86,82,0,73,77,71,0,85,110,107,110,111,119,110,32,72,84,77,76,32,101,108,101,109,101,110,116,32,60,37,115,62,32,111,110,32,108,105,110,101,32,37,100,32,10,0,60,73,77,71,62,0,73,108,108,101,103,97,108,32,97,116,116,114,105,98,117,116,101,32,37,115,32,105,110,32,37,115,32,45,32,105,103,110,111,114,101,100,10,0,115,99,97,108,101,0,115,114,99,0,60,66,82,62,0,97,108,105,103,110,0,73,71,72,84,0,69,70,84,0,69,78,84,69,82,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,65,76,73,71,78,32,45,32,105,103,110,111,114,101,100,10,0,60,70,79,78,84,62,0,99,111,108,111,114,0,102,97,99,101,0,112,111,105,110,116,45,115,105,122,101,0,80,79,73,78,84,45,83,73,90,69,0,73,109,112,114,111,112,101,114,32,37,115,32,118,97,108,117,101,32,37,115,32,45,32,105,103,110,111,114,101,100,0,37,115,32,118,97,108,117,101,32,37,115,32,62,32,37,100,32,45,32,116,111,111,32,108,97,114,103,101,32,45,32,105,103,110,111,114,101,100,0,37,115,32,118,97,108,117,101,32,37,115,32,60,32,37,100,32,45,32,116,111,111,32,115,109,97,108,108,32,45,32,105,103,110,111,114,101,100,0,60,84,68,62,0,98,97,108,105,103,110,0,98,103,99,111,108,111,114,0,98,111,114,100,101,114,0,99,101,108,108,112,97,100,100,105,110,103,0,99,101,108,108,115,112,97,99,105,110,103,0,99,111,108,115,112,97,110,0,102,105,120,101,100,115,105,122,101,0,103,114,97,100,105,101,110,116,97,110,103,108,101,0,104,101,105,103,104,116,0,104,114,101,102,0,105,100,0,112,111,114,116,0,114,111,119,115,112,97,110,0,115,105,100,101,115,0,115,116,121,108,101,0,116,97,114,103,101,116,0,116,105,116,108,101,0,116,111,111,108,116,105,112,0,118,97,108,105,103,110,0,119,105,100,116,104,0,87,73,68,84,72,0,79,84,84,79,77,0,79,80,0,73,68,68,76,69,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,86,65,76,73,71,78,32,45,32,105,103,110,111,114,101,100,10,0,32,44,0,79,85,78,68,69,68,0,65,68,73,65,76,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,83,84,89,76,69,32,45,32,105,103,110,111,114,101,100,10,0,83,79,76,73,68,0,73,78,86,73,83,73,66,76,69,0,73,78,86,73,83,0,68,79,84,84,69,68,0,68,65,83,72,69,68,0,85,110,114,101,99,111,103,110,105,122,101,100,32,99,104,97,114,97,99,116,101,114,32,39,37,99,39,32,40,37,100,41,32,105,110,32,115,105,100,101,115,32,97,116,116,114,105,98,117,116,101,10,0,82,79,87,83,80,65,78,0,82,79,87,83,80,65,78,32,118,97,108,117,101,32,99,97,110,110,111,116,32,98,101,32,48,32,45,32,105,103,110,111,114,101,100,10,0,72,69,73,71,72,84,0,71,82,65,68,73,69,78,84,65,78,71,76,69,0,82,85,69,0,65,76,83,69,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,70,73,88,69,68,83,73,90,69,32,45,32,105,103,110,111,114,101,100,10,0,67,79,76,83,80,65,78,0,67,79,76,83,80,65,78,32,118,97,108,117,101,32,99,97,110,110,111,116,32,98,101,32,48,32,45,32,105,103,110,111,114,101,100,10,0,67,69,76,76,83,80,65,67,73,78,71,0,67,69,76,76,80,65,68,68,73,78,71,0,66,79,82,68,69,82,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,66,65,76,73,71,78,32,105,110,32,84,68,32,45,32,105,103,110,111,114,101,100,10,0,69,88,84,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,65,76,73,71,78,32,105,110,32,84,68,32,45,32,105,103,110,111,114,101,100,10,0,60,84,65,66,76,69,62,0,99,101,108,108,98,111,114,100,101,114,0,99,111,108,117,109,110,115,0,114,111,119,115,0,85,110,107,110,111,119,110,32,118,97,108,117,101,32,37,115,32,102,111,114,32,82,79,87,83,32,45,32,105,103,110,111,114,101,100,10,0,85,110,107,110,111,119,110,32,118,97,108,117,101,32,37,115,32,102,111,114,32,67,79,76,85,77,78,83,32,45,32,105,103,110,111,114,101,100,10,0,67,69,76,76,83,66,79,82,68,69,82,0,60,72,84,77,76,62,0,60,47,72,84,77,76,62,0,45,45,0,76,97,98,101,108,32,99,108,111,115,101,100,32,98,101,102,111,114,101,32,101,110,100,32,111,102,32,72,84,77,76,32,101,108,101,109,101,110,116,10,0,85,110,99,108,111,115,101,100,32,99,111,109,109,101,110,116,10,0,106,32,61,61,32,48,0,99,118,116,46,99,0,80,111,98,115,112,97,116,104,0,114,111,117,116,101,46,99,0,108,105,98,112,97,116,104,47,37,115,58,37,100,58,32,37,115,10,0,115,104,111,114,116,101,115,116,46,99,0,115,111,117,114,99,101,32,112,111,105,110,116,32,110,111,116,32,105,110,32,97,110,121,32,116,114,105,97,110,103,108,101,0,100,101,115,116,105,110,97,116,105,111,110,32,112,111,105,110,116,32,110,111,116,32,105,110,32,97,110,121,32,116,114,105,97,110,103,108,101,0,99,97,110,110,111,116,32,102,105,110,100,32,116,114,105,97,110,103,108,101,32,112,97,116,104,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,111,112,115,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,111,112,115,0,116,114,105,97,110,103,117,108,97,116,105,111,110,32,102,97,105,108,101,100,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,116,114,105,115,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,116,114,105,115,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,100,113,46,112,110,108,115,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,100,113,46,112,110,108,115,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,112,110,108,115,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,112,110,108,112,115,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,112,110,108,115,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,112,110,108,112,115,0,67,68,65,84,65,0,73,68,0,73,68,82,69,70,0,73,68,82,69,70,83,0,69,78,84,73,84,89,0,69,78,84,73,84,73,69,83,0,78,77,84,79,75,69,78,0,78,77,84,79,75,69,78,83,0,78,79,84,65,84,73,79,78,40,0,40,0,124,0,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,88,77,76,47,49,57,57,56,47,110,97,109,101,115,112,97,99,101,0,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,50,48,48,48,47,120,109,108,110,115,47,0,120,109,108,61,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,88,77,76,47,49,57,57,56,47,110,97,109,101,115,112,97,99,101,0,111,117,116,32,111,102,32,109,101,109,111,114,121,0,115,121,110,116,97,120,32,101,114,114,111,114,0,110,111,32,101,108,101,109,101,110,116,32,102,111,117,110,100,0,110,111,116,32,119,101,108,108,45,102,111,114,109,101,100,32,40,105,110,118,97,108,105,100,32,116,111,107,101,110,41,0,117,110,99,108,111,115,101,100,32,116,111,107,101,110,0,112,97,114,116,105,97,108,32,99,104,97,114,97,99,116,101,114,0,109,105,115,109,97,116,99,104,101,100,32,116,97,103,0,100,117,112,108,105,99,97,116,101,32,97,116,116,114,105,98,117,116,101,0,106,117,110,107,32,97,102,116,101,114,32,100,111,99,117,109,101,110,116,32,101,108,101,109,101,110,116,0,105,108,108,101,103,97,108,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,32,114,101,102,101,114,101,110,99,101,0,117,110,100,101,102,105,110,101,100,32,101,110,116,105,116,121,0,114,101,99,117,114,115,105,118,101,32,101,110,116,105,116,121,32,114,101,102,101,114,101,110,99,101,0,97,115,121,110,99,104,114,111,110,111,117,115,32,101,110,116,105,116,121,0,114,101,102,101,114,101,110,99,101,32,116,111,32,105,110,118,97,108,105,100,32,99,104,97,114,97,99,116,101,114,32,110,117,109,98,101,114,0,114,101,102,101,114,101,110,99,101,32,116,111,32,98,105,110,97,114,121,32,101,110,116,105,116,121,0,114,101,102,101,114,101,110,99,101,32,116,111,32,101,120,116,101,114,110,97,108,32,101,110,116,105,116,121,32,105,110,32,97,116,116,114,105,98,117,116,101,0,88,77,76,32,111,114,32,116,101,120,116,32,100,101,99,108,97,114,97,116,105,111,110,32,110,111,116,32,97,116,32,115,116,97,114,116,32,111,102,32,101,110,116,105,116,121,0,117,110,107,110,111,119,110,32,101,110,99,111,100,105,110,103,0,101,110,99,111,100,105,110,103,32,115,112,101,99,105,102,105,101,100,32,105,110,32,88,77,76,32,100,101,99,108,97,114,97,116,105,111,110,32,105,115,32,105,110,99,111,114,114,101,99,116,0,117,110,99,108,111,115,101,100,32,67,68,65,84,65,32,115,101,99,116,105,111,110,0,101,114,114,111,114,32,105,110,32,112,114,111,99,101,115,115,105,110,103,32,101,120,116,101,114,110,97,108,32,101,110,116,105,116,121,32,114,101,102,101,114,101,110,99,101,0,100,111,99,117,109,101,110,116,32,105,115,32,110,111,116,32,115,116,97,110,100,97,108,111,110,101,0,117,110,101,120,112,101,99,116,101,100,32,112,97,114,115,101,114,32,115,116,97,116,101,32,45,32,112,108,101,97,115,101,32,115,101,110,100,32,97,32,98,117,103,32,114,101,112,111,114,116,0,101,110,116,105,116,121,32,100,101,99,108,97,114,101,100,32,105,110,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,0,114,101,113,117,101,115,116,101,100,32,102,101,97,116,117,114,101,32,114,101,113,117,105,114,101,115,32,88,77,76,95,68,84,68,32,115,117,112,112,111,114,116,32,105,110,32,69,120],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+133144);allocate([112,97,116,0,99,97,110,110,111,116,32,99,104,97,110,103,101,32,115,101,116,116,105,110,103,32,111,110,99,101,32,112,97,114,115,105,110,103,32,104,97,115,32,98,101,103,117,110,0,117,110,98,111,117,110,100,32,112,114,101,102,105,120,0,109,117,115,116,32,110,111,116,32,117,110,100,101,99,108,97,114,101,32,112,114,101,102,105,120,0,105,110,99,111,109,112,108,101,116,101,32,109,97,114,107,117,112,32,105,110,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,0,88,77,76,32,100,101,99,108,97,114,97,116,105,111,110,32,110,111,116,32,119,101,108,108,45,102,111,114,109,101,100,0,116,101,120,116,32,100,101,99,108,97,114,97,116,105,111,110,32,110,111,116,32,119,101,108,108,45,102,111,114,109,101,100,0,105,108,108,101,103,97,108,32,99,104,97,114,97,99,116,101,114,40,115,41,32,105,110,32,112,117,98,108,105,99,32,105,100,0,112,97,114,115,101,114,32,115,117,115,112,101,110,100,101,100,0,112,97,114,115,101,114,32,110,111,116,32,115,117,115,112,101,110,100,101,100,0,112,97,114,115,105,110,103,32,97,98,111,114,116,101,100,0,112,97,114,115,105,110,103,32,102,105,110,105,115,104,101,100,0,99,97,110,110,111,116,32,115,117,115,112,101,110,100,32,105,110,32,101,120,116,101,114,110,97,108,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,0,114,101,115,101,114,118,101,100,32,112,114,101,102,105,120,32,40,120,109,108,41,32,109,117,115,116,32,110,111,116,32,98,101,32,117,110,100,101,99,108,97,114,101,100,32,111,114,32,98,111,117,110,100,32,116,111,32,97,110,111,116,104,101,114,32,110,97,109,101,115,112,97,99,101,32,110,97,109,101,0,114,101,115,101,114,118,101,100,32,112,114,101,102,105,120,32,40,120,109,108,110,115,41,32,109,117,115,116,32,110,111,116,32,98,101,32,100,101,99,108,97,114,101,100,32,111,114,32,117,110,100,101,99,108,97,114,101,100,0,112,114,101,102,105,120,32,109,117,115,116,32,110,111,116,32,98,101,32,98,111,117,110,100,32,116,111,32,111,110,101,32,111,102,32,116,104,101,32,114,101,115,101,114,118,101,100,32,110,97,109,101,115,112,97,99,101,32,110,97,109,101,115,0,2,3,4,5,6,7,8,0,0,9,10,11,12,13,14,15,16,17,0,0,0,0,0,0,0,0,0,0,0,0,18,19,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,23,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,3,26,27,28,29,30,0,0,31,32,33,34,35,36,37,16,17,0,0,0,0,0,0,0,0,0,0,0,0,18,19,38,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,23,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,68,65,84,65,91,85,83,45,65,83,67,73,73,0,85,84,70,45,49,54,0,85,84,70,45,49,54,66,69,0,85,84,70,45,49,54,76,69,0,118,101,114,115,105,111,110,0,101,110,99,111,100,105,110,103,0,115,116,97,110,100,97,108,111,110,101,0,68,79,67,84,89,80,69,0,83,89,83,84,69,77,0,80,85,66,76,73,67,0,69,78,84,73,84,89,0,65,84,84,76,73,83,84,0,69,76,69,77,69,78,84,0,78,79,84,65,84,73,79,78,0,73,78,67,76,85,68,69,0,73,71,78,79,82,69,0,69,77,80,84,89,0,65,78,89,0,80,67,68,65,84,65,0,73,77,80,76,73,69,68,0,82,69,81,85,73,82,69,68,0,70,73,88,69,68,0,67,68,65,84,65,0,73,68,0,73,68,82,69,70,0,73,68,82,69,70,83,0,69,78,84,73,84,73,69,83,0,78,77,84,79,75,69,78,0,78,77,84,79,75,69,78,83,0,78,68,65,84,65,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,3,4,5,6,7,8,9,255,255,255,255,255,255,255,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,255,255,255,255,255,255,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,4,7,3,6,5,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0,18,17,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,17,34,35,36,17,37,38,39,40,41,42,43,44,17,45,46,47,16,16,48,16,16,16,16,16,16,16,49,50,51,16,52,53,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,54,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,55,17,17,17,17,56,17,57,58,59,60,61,62,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,63,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,64,65,17,66,67,68,69,70,71,72,73,16,16,16,74,75,76,77,78,16,16,16,79,80,16,16,16,16,81,16,16,16,16,16,16,16,16,16,17,17,17,82,83,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,84,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,85,16,16,16,16,86,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,87,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,88,89,90,91,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,92,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,254,255,255,7,254,255,255,7,0,0,0,0,0,4,32,4,255,255,127,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,195,255,3,0,31,80,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,223,60,64,215,255,255,251,255,255,255,255,255,255,255,255,255,191,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,3,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,254,255,255,255,127,2,254,255,255,255,255,0,0,0,0,0,255,191,182,0,255,255,255,7,7,0,0,0,255,7,255,255,255,255,255,255,255,254,255,195,255,255,255,255,255,255,255,255,255,255,255,255,239,31,254,225,255,159,0,0,255,255,255,255,255,255,0,224,255,255,255,255,255,255,255,255,255,255,255,255,3,0,255,255,255,255,255,7,48,4,255,255,255,252,255,31,0,0,255,255,255,1,0,0,0,0,0,0,0,0,253,31,0,0,0,0,0,0,240,3,255,127,255,255,255,255,255,255,255,239,255,223,225,255,207,255,254,254,238,159,249,255,255,253,197,227,159,89,128,176,207,255,3,0,238,135,249,255,255,253,109,195,135,25,2,94,192,255,63,0,238,191,251,255,255,253,237,227,191,27,1,0,207,255,0,0,238,159,249,255,255,253,237,227,159,25,192,176,207,255,2,0,236,199,61,214,24,199,255,195,199,29,129,0,192,255,0,0,238,223,253,255,255,253,239,227,223,29,96,3,207,255,0,0,236,223,253,255,255,253,239,227,223,29,96,64,207,255,6,0,236,223,253,255,255,255,255,231,223,93,128,0,207,255,0,252,236,255,127,252,255,255,251,47,127,128,95,255,0,0,12,0,254,255,255,255,255,127,255,7,63,32,255,3,0,0,0,0,150,37,240,254,174,236,255,59,95,32,255,243,0,0,0,0,1,0,0,0,255,3,0,0,255,254,255,255,255,31,254,255,3,255,255,254,255,255,255,31,0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,249,255,3,255,255,231,193,255,255,127,64,255,51,255,255,255,255,191,32,255,255,255,255,255,247,255,255,255,255,255,255,255,255,255,61,127,61,255,255,255,255,255,61,255,255,255,255,61,127,61,255,127,255,255,255,255,255,255,255,61,255,255,255,255,255,255,255,255,135,0,0,0,0,255,255,0,0,255,255,255,255,255,255,255,255,255,255,31,0,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,159,255,255,254,255,255,7,255,255,255,255,255,255,255,255,255,199,1,0,255,223,15,0,255,255,15,0,255,255,15,0,255,223,13,0,255,255,255,255,255,255,207,255,255,1,128,16,255,3,0,0,0,0,255,3,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,7,255,255,255,255,255,255,255,255,63,0,255,255,255,31,255,15,255,1,192,255,255,255,255,63,31,0,255,255,255,255,255,15,255,255,255,3,255,3,0,0,0,0,255,255,255,15,255,255,255,255,255,255,255,127,254,255,31,0,255,3,255,3,128,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,239,255,239,15,255,3,0,0,0,0,255,255,255,255,255,243,255,255,255,255,255,255,191,255,3,0,255,255,255,255,255,255,63,0,255,227,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,222,111,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,63,63,255,255,255,255,63,63,255,170,255,255,255,63,255,255,255,255,255,255,223,95,220,31,207,15,255,31,220,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,128,0,0,255,31,0,0,0,0,0,0,0,0,0,0,0,0,132,252,47,62,80,189,255,243,224,67,0,0,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,255,255,255,255,255,255,3,0,0,255,255,255,255,255,127,255,255,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,120,12,0,255,255,255,255,191,32,255,255,255,255,255,255,255,128,0,0,255,255,127,0,127,127,127,127,127,127,127,127,255,255,255,255,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,254,3,62,31,254,255,255,255,255,255,255,255,255,255,127,224,254,255,255,255,255,255,255,255,255,255,255,247,224,255,255,255,255,63,254,255,255,255,255,255,255,255,255,255,255,127,0,0,255,255,255,7,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,0,0,0,0,0,0,255,255,255,255,255,63,255,31,255,255,255,15,0,0,255,255,255,255,255,127,240,143,255,255,255,128,255,255,255,255,255,255,255,255,255,255,0,0,0,0,128,255,252,255,255,255,255,255,255,255,255,255,255,255,255,121,15,0,255,7,0,0,0,0,0,0,0,0,0,255,187,247,255,255,255,0,0,0,255,255,255,255,255,255,15,0,255,255,255,255,255,255,255,255,15,0,255,3,0,0,252,8,255,255,255,255,255,7,255,255,255,255,7,0,255,255,255,31,255,255,255,255,255,255,247,255,0,128,255,3,0,0,0,0,255,255,255,255,255,255,127,0,255,63,255,3,255,255,127,4,255,255,255,255,255,255,255,127,5,0,0,56,255,255,60,0,126,126,126,0,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,7,255,3,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,255,127,248,255,255,255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255,255,255,255,255,255,255,255,255,255,255,3,0,0,0,0,127,0,248,224,255,253,127,95,219,255,255,255,255,255,255,255,255,255,255,255,255,255,3,0,0,0,248,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,255,255,255,255,255,255,255,255,252,255,255,255,255,255,255,0,0,0,0,0,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,255,3,254,255,255,7,254,255,255,7,192,255,255,255,255,255,255,255,255,255,255,127,252,252,252,28,0,0,0,0,255,239,255,255,127,255,255,183,255,63,255,63,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,7,0,0,0,0,0,0,0,0,255,255,255,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,31,255,255,255,255,255,255,1,0,0,0,0,0,255,255,255,127,0,0,255,255,255,7,0,0,0,0,0,0,255,255,255,63,255,255,255,255,15,255,62,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,3,0,0,0,0,0,0,0,0,0,0,63,253,255,255,255,255,191,145,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,63,0,255,255,255,3,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,192,0,0,0,0,0,0,0,0,111,240,239,254,255,255,15,0,0,0,0,0,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,63,0,255,255,63,0,255,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,192,255,0,0,252,255,255,255,255,255,255,1,0,0,255,255,255,1,255,3,255,255,255,255,255,255,199,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,30,0,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,63,0,255,3,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,31,0,255,255,255,255,255,127,0,0,248,255,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,223,255,255,255,255,255,255,255,255,223,100,222,255,235,239,255,255,255,255,255,255,255,191,231,223,223,255,255,255,123,95,252,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255,253,255,255,247,255,255,255,247,255,255,223,255,255,255,223,255,255,127,255,255,255,127,255,255,255,253,255,255,255,253,255,255,247,207,255,255,255,255,255,255,239,255,255,255,150,254,247,10,132,234,150,170,150,247,247,94,255,251,255,15,238,251,255,15,0,0,0,0,0,0,0,0,18,16,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,16,16,34,35,16,36,37,38,39,40,41,42,43,16,44,45,46,17,47,48,17,17,49,17,17,17,50,51,52,53,54,55,56,57,17,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,58,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,59,16,60,61,62,63,64,65,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,66,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,67,16,16,68,16,69,70,71,16,72,16,73,16,16,16,16,74,75,76,77,16,16,78,16,79,80,16,16,16,16,81,16,16,16,16,16,16,16,16,16,16,16,16,16,82,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,83,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,84,85,86,87,16,16,88,89,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,90,16,91,92,93,94,95,96,97,98,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,254,255,0,252,1,0,0,248,1,0,0,120,0,0,0,0,255,251,223,251,0,0,128,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,0,252,255,224,175,255,255,255,255,255,255,255,255,255,255,223,255,255,255,255,255,32,64,176,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,134,254,255,255,255,0,64,73,0,0,0,0,0,24,0,223,255,0,200,0,0,0,0,0,0,0,1,0,60,0,0,0,0,0,0,0,0,0,0,0,0,16,224,1,30,0,96,255,191,0,0,0,0,0,0,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,207,3,0,0,0,3,0,32,255,127,0,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,0,0,0,16,0,32,30,0,48,0,1,0,0,0,0,0,0,0,0,16,0,32,0,0,0,0,252,15,0,0,0,0,0,0,0,16,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,32,0,0,0,0,3,0,0,0,0,0,0,0,0,16,0,32,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,255,7,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,255,0,0,0,0,0,0,0,16,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,63,2,0,0,0,0,0,0,0,0,0,4,0,0,0,0,16,0,0,0,0,0,0,128,0,128,192,223,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,254,255,255,255,0,252,255,255,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,192,255,223,255,7,0,0,0,0,0,0,0,0,0,0,128,6,0,252,0,0,24,62,0,0,128,191,0,204,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,96,255,255,255,31,0,0,255,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,1,0,0,24,0,0,0,0,0,0,0,0,0,56,0,0,0,0,16,0,0,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,254,127,47,0,0,255,3,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,255,255,255,255,0,0,0,192,0,0,0,0,0,0,0,0,1,0,224,159,0,0,0,0,127,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,0,252,255,255,255,31,0,0,0,0,0,12,0,0,0,0,0,0,64,0,12,240,0,0,0,0,0,0,192,248,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,255,0,255,255,255,33,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,127,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,3,224,0,224,0,224,0,96,128,248,255,255,255,252,255,255,255,255,255,127,31,252,241,127,255,127,0,0,255,255,255,3,0,0,255,255,255,255,1,0,123,3,208,193,175,66,0,12,31,188,255,255,0,0,0,0,0,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,255,255,255,127,0,0,0,255,7,0,0,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,252,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,135,3,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,127,255,15,0,0,0,0,0,0,0,0,255,255,255,251,255,255,255,255,255,255,255,255,255,255,15,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,255,15,30,255,255,255,1,252,193,224,0,0,0,0,0,0,0,0,0,0,0,30,1,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,255,255,255,255,15,0,0,0,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,0,0,0,0,0,0,192,0,224,0,0,0,0,0,0,0,0,0,0,0,128,15,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,127,0,3,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,8,0,0,0,15,255,3,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,16,192,0,0,255,255,3,7,0,0,0,0,0,248,0,0,0,0,8,128,0,0,0,0,0,0,0,0,0,0,8,0,255,63,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,128,11,0,0,0,0,0,0,0,128,2,0,0,192,0,0,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,255,255,255,3,127,0,255,255,255,255,247,255,127,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,254,255,0,252,1,0,0,248,1,0,0,248,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,0,48,135,255,255,255,255,255,143,255,0,0,0,0,0,0,224,255,255,7,255,15,0,0,0,0,0,0,255,255,255,255,255,63,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,143,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,255,0,255,1,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,63,252,255,63,0,0,0,3,0,0,0,0,0,0,254,3,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,225,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,7,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,255,255,255,255,127,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,127,0,255,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,8,0,0,0,8,0,0,32,0,0,0,32,0,0,128,0,0,0,128,0,0,0,2,0,0,0,2,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,255,255,255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,127,254,127,254,255,254,255,0,0,0,0,255,7,255,255,255,127,255,255,255,255,255,255,255,15,255,255,255,255,255,7,0,0,0,0,0,0,0,0,192,255,255,255,7,0,255,255,255,255,255,7,255,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,1,0,191,255,255,255,255,255,255,255,255,31,255,255,15,0,255,255,255,255,223,7,0,0,255,255,1,0,255,255,255,255,255,255,255,127,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,30,255,255,255,255,255,255,255,63,15,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,255,255,255,255,255,255,255,255,225,255,0,0,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,108,110,117,109,0,97,108,112,104,97,0,98,108,97,110,107,0,99,110,116,114,108,0,100,105,103,105,116,0,103,114,97,112,104,0,108,111,119,101,114,0,112,114,105,110,116,0,112,117,110,99,116,0,115,112,97,99,101,0,117,112,112,101,114,0,120,100,105,103,105,116,0,47,112,114,111,99,47,115,101,108,102,47,102,100,47,0,105,110,102,105,110,105,116,121,0,110,97,110,0,76,67,95,65,76,76,0,76,67,95,67,84,89,80,69],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+143384);allocate([76,67,95,78,85,77,69,82,73,67,0,0,76,67,95,84,73,77,69,0,0,0,0,0,76,67,95,67,79,76,76,65,84,69,0,0,76,67,95,77,79,78,69,84,65,82,89,0,76,67,95,77,69,83,83,65,71,69,83,0,76,65,78,71,0,67,46,85,84,70,45,56,0,80,79,83,73,88,0,77,85,83,76,95,76,79,67,80,65,84,72,0,67,46,85,84,70,45,56,0,0,0,0,0,0,0,0,0,67,0,114,119,97,0,9,0,10,0,13,0,12,0,7,0,27,0,91,91,58,97,108,110,117,109,58,93,95,93,0,91,94,91,58,97,108,110,117,109,58,93,95,93,0,91,91,58,115,112,97,99,101,58,93,93,0,91,94,91,58,115,112,97,99,101,58,93,93,0,91,91,58,100,105,103,105,116,58,93,93,0,91,94,91,58,100,105,103,105,116,58,93,93,0,47,116,109,112,47,116,109,112,102,105,108,101,95,88,88,88,88,88,88,0,119,43,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+153624);var tempDoublePtr=STATICTOP;STATICTOP+=16;Module["_i64Subtract"]=_i64Subtract;function ___assert_fail(condition,filename,line,func){ABORT=true;throw"Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"]+" at "+stackTrace()}var PROCINFO={ppid:1,pid:42,sid:42,pgid:42};var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}var PATH={splitPath:(function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;inode.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.lengthnewSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+lengthe2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:(function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;if(flags in NODEFS.flagsToPermissionStringMap){return NODEFS.flagsToPermissionStringMap[flags]}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;var nbuffer=new Buffer(length);var res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var i=0;i=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};STATICTOP+=16;STATICTOP+=16;STATICTOP+=16;var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--;return callback(err)}function done(err){if(err){if(!done.errored){done.errored=true;return doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdirTree:(function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;console.log("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})},chunkSize:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:(function(){return this.contents.length})}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall20(which,varargs){SYSCALLS.varargs=varargs;try{return PROCINFO.pid}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module["_memset"]=_memset;Module["_bitshift64Shl"]=_bitshift64Shl;function ___syscall192(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get(),prot=SYSCALLS.get(),flags=SYSCALLS.get(),fd=SYSCALLS.get(),off=SYSCALLS.get();off<<=12;var ptr;var allocated=false;if(fd===-1){ptr=_memalign(PAGE_SIZE,len);if(!ptr)return-ERRNO_CODES.ENOMEM;_memset(ptr,0,len);allocated=true}else{var info=FS.getStream(fd);if(!info)return-ERRNO_CODES.EBADF;var res=FS.mmap(info,HEAPU8,addr,len,off,prot,flags);ptr=res.ptr;allocated=res.allocated}SYSCALLS.mappings[ptr]={malloc:ptr,len:len,allocated:allocated,fd:fd,flags:flags};return ptr}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall195(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),buf=SYSCALLS.get();return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall197(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),buf=SYSCALLS.get();return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___lock(){}function ___unlock(){}Module["_i64Add"]=_i64Add;function _realloc(){throw"bad"}Module["_realloc"]=_realloc;Module["_saveSetjmp"]=_saveSetjmp;var _environ=STATICTOP;STATICTOP+=16;function ___buildEnvironment(env){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C";ENV["_"]=Module["thisProgram"];poolPtr=allocate(TOTAL_ENV_SIZE,"i8",ALLOC_STATIC);envPtr=allocate(MAX_ENV_VALUES*4,"i8*",ALLOC_STATIC);HEAP32[envPtr>>2]=poolPtr;HEAP32[_environ>>2]=envPtr}else{envPtr=HEAP32[_environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in env){if(typeof env[key]==="string"){var line=key+"="+env[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var ENV={};function _setenv(envname,envval,overwrite){if(envname===0){___setErrNo(ERRNO_CODES.EINVAL);return-1}var name=Pointer_stringify(envname);var val=Pointer_stringify(envval);if(name===""||name.indexOf("=")!==-1){___setErrNo(ERRNO_CODES.EINVAL);return-1}if(ENV.hasOwnProperty(name)&&!overwrite)return 0;ENV[name]=val;___buildEnvironment(ENV);return 0}function __exit(status){Module["exit"](status)}function _exit(status){__exit(status)}function ___syscall91(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get();var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);SYSCALLS.doMsync(addr,stream,len,info.flags);FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21506:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};case 21523:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module["_bitshift64Ashr"]=_bitshift64Ashr;Module["_bitshift64Lshr"]=_bitshift64Lshr;Module["_testSetjmp"]=_testSetjmp;function _longjmp(env,value){Module["setThrew"](env,value||1);throw"longjmp"}function _llvm_trap(){abort("trap!")}function ___syscall33(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),amode=SYSCALLS.get();return SYSCALLS.doAccess(path,amode)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function ___clock_gettime(){return _clock_gettime.apply(null,arguments)}function ___syscall10(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr();FS.unlink(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___map_file(pathname,size){___setErrNo(ERRNO_CODES.EPERM);return-1}function _getenv(name){if(name===0)return 0;name=Pointer_stringify(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocate(intArrayFromString(ENV[name]),"i8",ALLOC_NORMAL);return _getenv.ret}function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(),flags=SYSCALLS.get(),mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module["_memcpy"]=_memcpy;function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],"i8",ALLOC_STATIC);Module["_llvm_cttz_i32"]=_llvm_cttz_i32;Module["___udivmoddi4"]=___udivmoddi4;Module["___udivdi3"]=___udivdi3;Module["___muldsi3"]=___muldsi3;Module["___muldi3"]=___muldi3;var _llvm_pow_f64=Math_pow;Module["_sbrk"]=_sbrk;Module["_memmove"]=_memmove;Module["___uremdi3"]=___uremdi3;function _times(buffer){if(buffer!==0){_memset(buffer,0,16)}return 0}function _abort(){Module["abort"]()}Module["_llvm_bswap_i32"]=_llvm_bswap_i32;Module["_llvm_bswap_i16"]=_llvm_bswap_i16;function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),cmd=SYSCALLS.get();switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-ERRNO_CODES.EINVAL}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd};case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0};case 12:case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0};case 13:case 14:case 13:case 14:return 0;case 16:case 8:return-ERRNO_CODES.EINVAL;case 9:___setErrNo(ERRNO_CODES.EINVAL);return-1;default:{return-ERRNO_CODES.EINVAL}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}FS.staticInit();__ATINIT__.unshift((function(){if(!Module["noFSInit"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}___buildEnvironment(ENV);if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function _emscripten_get_now_actual(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else if(typeof self==="object"&&self["performance"]&&typeof self["performance"]["now"]==="function"){_emscripten_get_now=(function(){return self["performance"]["now"]()})}else if(typeof performance==="object"&&typeof performance["now"]==="function"){_emscripten_get_now=(function(){return performance["now"]()})}else{_emscripten_get_now=Date.now}DYNAMICTOP_PTR=allocate(1,"i32",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_vi(index,a1){try{Module["dynCall_vi"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_d(index){try{return Module["dynCall_d"](index)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_di(index,a1){try{return Module["dynCall_di"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_i(index){try{return Module["dynCall_i"](index)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){try{return Module["dynCall_iiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiidd(index,a1,a2,a3,a4){try{return Module["dynCall_iiidd"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vii(index,a1,a2){try{Module["dynCall_vii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){try{return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiddi(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_viiiddi"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){try{Module["dynCall_viiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_ii(index,a1){try{return Module["dynCall_ii"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_dddd(index,a1,a2,a3){try{return Module["dynCall_dddd"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_v(index){try{Module["dynCall_v"](index)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iii(index,a1,a2){try{return Module["dynCall_iii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity};Module.asmLibraryArg={"abort":abort,"assert":assert,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_vi":invoke_vi,"invoke_iiii":invoke_iiii,"invoke_viiiii":invoke_viiiii,"invoke_d":invoke_d,"invoke_di":invoke_di,"invoke_i":invoke_i,"invoke_iiiiiiiiiii":invoke_iiiiiiiiiii,"invoke_iiidd":invoke_iiidd,"invoke_vii":invoke_vii,"invoke_iiiiiii":invoke_iiiiiii,"invoke_viiiddi":invoke_viiiddi,"invoke_viiiiiiiii":invoke_viiiiiiiii,"invoke_ii":invoke_ii,"invoke_dddd":invoke_dddd,"invoke_viii":invoke_viii,"invoke_v":invoke_v,"invoke_iiiii":invoke_iiiii,"invoke_viiiiii":invoke_viiiiii,"invoke_iii":invoke_iii,"invoke_iiiiii":invoke_iiiiii,"invoke_viiii":invoke_viiii,"___syscall221":___syscall221,"_emscripten_get_now_is_monotonic":_emscripten_get_now_is_monotonic,"_llvm_pow_f64":_llvm_pow_f64,"___syscall6":___syscall6,"___syscall20":___syscall20,"_setenv":_setenv,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"_longjmp":_longjmp,"_clock_gettime":_clock_gettime,"_times":_times,"___setErrNo":___setErrNo,"___syscall192":___syscall192,"___syscall197":___syscall197,"_emscripten_get_now":_emscripten_get_now,"___syscall195":___syscall195,"__exit":__exit,"_emscripten_memcpy_big":_emscripten_memcpy_big,"___syscall91":___syscall91,"_getenv":_getenv,"___map_file":___map_file,"___syscall33":___syscall33,"___syscall54":___syscall54,"___unlock":___unlock,"_emscripten_asm_const_iii":_emscripten_asm_const_iii,"___syscall10":___syscall10,"___lock":___lock,"_abort":_abort,"___syscall5":___syscall5,"___clock_gettime":___clock_gettime,"_time":_time,"___syscall140":___syscall140,"_llvm_trap":_llvm_trap,"_exit":_exit,"___syscall145":___syscall145,"___syscall146":___syscall146,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX,"cttz_i8":cttz_i8};// EMSCRIPTEN_START_ASM -var asm=(function(global,env,buffer) { -"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=env.cttz_i8|0;var o=0;var p=0;var q=0;var r=0;var s=global.NaN,t=global.Infinity;var u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0.0;var D=0;var E=global.Math.floor;var F=global.Math.abs;var G=global.Math.sqrt;var H=global.Math.pow;var I=global.Math.cos;var J=global.Math.sin;var K=global.Math.tan;var L=global.Math.acos;var M=global.Math.asin;var N=global.Math.atan;var O=global.Math.atan2;var P=global.Math.exp;var Q=global.Math.log;var R=global.Math.ceil;var S=global.Math.imul;var T=global.Math.min;var U=global.Math.max;var V=global.Math.clz32;var W=env.abort;var X=env.assert;var Y=env.enlargeMemory;var Z=env.getTotalMemory;var _=env.abortOnCannotGrowMemory;var $=env.invoke_vi;var aa=env.invoke_iiii;var ba=env.invoke_viiiii;var ca=env.invoke_d;var da=env.invoke_di;var ea=env.invoke_i;var fa=env.invoke_iiiiiiiiiii;var ga=env.invoke_iiidd;var ha=env.invoke_vii;var ia=env.invoke_iiiiiii;var ja=env.invoke_viiiddi;var ka=env.invoke_viiiiiiiii;var la=env.invoke_ii;var ma=env.invoke_dddd;var na=env.invoke_viii;var oa=env.invoke_v;var pa=env.invoke_iiiii;var qa=env.invoke_viiiiii;var ra=env.invoke_iii;var sa=env.invoke_iiiiii;var ta=env.invoke_viiii;var ua=env.___syscall221;var va=env._emscripten_get_now_is_monotonic;var wa=env._llvm_pow_f64;var xa=env.___syscall6;var ya=env.___syscall20;var za=env._setenv;var Aa=env.___assert_fail;var Ba=env.___buildEnvironment;var Ca=env._longjmp;var Da=env._clock_gettime;var Ea=env._times;var Fa=env.___setErrNo;var Ga=env.___syscall192;var Ha=env.___syscall197;var Ia=env._emscripten_get_now;var Ja=env.___syscall195;var Ka=env.__exit;var La=env._emscripten_memcpy_big;var Ma=env.___syscall91;var Na=env._getenv;var Oa=env.___map_file;var Pa=env.___syscall33;var Qa=env.___syscall54;var Ra=env.___unlock;var Sa=env._emscripten_asm_const_iii;var Ta=env.___syscall10;var Ua=env.___lock;var Va=env._abort;var Wa=env.___syscall5;var Xa=env.___clock_gettime;var Ya=env._time;var Za=env.___syscall140;var _a=env._llvm_trap;var $a=env._exit;var ab=env.___syscall145;var bb=env.___syscall146;var cb=0.0; -// EMSCRIPTEN_START_FUNCS -function CV(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;$=l;l=l+96|0;X=$+32|0;f=$+16|0;Y=$;r=X;k=b+(a*56|0)|0;q=r+56|0;do{c[r>>2]=c[k>>2];r=r+4|0;k=k+4|0}while((r|0)<(q|0));Z=X+16|0;_=X+24|0;i=+h[_>>3];P=X+8|0;j=+h[P>>3];g=X+36|0;p=X+40|0;do if(!(i>j+1.0e-07)){if(!(i>3]>+h[X>>3]:0){O=4;break}O=(GV(a,b,1)|0)==0;f=c[g>>2]|0;if(O){n=0;O=7}else{f=EV(X,Z,f,b,e)|0;O=20}}else O=4;while(0);if((O|0)==4){c[f>>2]=c[X>>2];c[f+4>>2]=c[X+4>>2];c[f+8>>2]=c[X+8>>2];c[f+12>>2]=c[X+12>>2];c[X>>2]=c[Z>>2];c[X+4>>2]=c[Z+4>>2];c[X+8>>2]=c[Z+8>>2];c[X+12>>2]=c[Z+12>>2];c[Z>>2]=c[f>>2];c[Z+4>>2]=c[f+4>>2];c[Z+8>>2]=c[f+8>>2];c[Z+12>>2]=c[f+12>>2];O=c[g>>2]|0;f=c[p>>2]|0;c[g>>2]=f;c[p>>2]=O;if(!(GV(a,b,2)|0)){n=1;O=7}else{f=EV(X,Z,f,b,e)|0;O=19}}if((O|0)==7){m=EV(X,Z,f,b,e)|0;f=HV(d)|0;c[d+(f*72|0)+68>>2]=1;r=d+(f*72|0)|0;k=d+(m*72|0)|0;q=r+72|0;do{c[r>>2]=c[k>>2];r=r+4|0;k=k+4|0}while((r|0)<(q|0));t=+h[P>>3];h[d+(f*72|0)+16>>3]=t;h[d+(m*72|0)+32>>3]=t;t=+h[X>>3];h[d+(f*72|0)+8>>3]=t;h[d+(m*72|0)+24>>3]=t;c[d+(m*72|0)+48>>2]=f;c[d+(m*72|0)+52>>2]=0;c[d+(f*72|0)+40>>2]=m;c[d+(f*72|0)+44>>2]=0;g=c[d+(f*72|0)+48>>2]|0;if((g|0)>0){k=d+(g*72|0)+40|0;if((c[k>>2]|0)==(m|0))c[k>>2]=f;g=d+(g*72|0)+44|0;if((c[g>>2]|0)==(m|0))c[g>>2]=f}g=c[d+(f*72|0)+52>>2]|0;if((g|0)>0){k=d+(g*72|0)+40|0;if((c[k>>2]|0)==(m|0))c[k>>2]=f;g=d+(g*72|0)+44|0;if((c[g>>2]|0)==(m|0))c[g>>2]=f}M=IV()|0;O=IV()|0;N=d+(m*72|0)+56|0;L=c[N>>2]|0;c[e+(L*40|0)>>2]=2;K=e+(L*40|0)+8|0;c[K>>2]=c[X>>2];c[K+4>>2]=c[X+4>>2];c[K+8>>2]=c[X+8>>2];c[K+12>>2]=c[X+12>>2];c[e+(L*40|0)+4>>2]=a;c[e+(L*40|0)+32>>2]=O;c[e+(L*40|0)+36>>2]=M;c[e+(M*40|0)>>2]=3;c[e+(M*40|0)+24>>2]=m;c[e+(M*40|0)+28>>2]=L;c[e+(O*40|0)>>2]=3;c[e+(O*40|0)+24>>2]=f;c[e+(O*40|0)+28>>2]=L;c[N>>2]=M;c[d+(f*72|0)+56>>2]=O;if(n)O=19;else O=20}if((O|0)==19)if(!(GV(a,b,1)|0)){o=1;O=21}else{g=1;O=32}else if((O|0)==20)if(!(GV(a,b,2)|0)){o=0;O=21}else{g=0;O=32}if((O|0)==21){n=EV(Z,X,c[p>>2]|0,b,e)|0;m=HV(d)|0;c[d+(m*72|0)+68>>2]=1;r=d+(m*72|0)|0;k=d+(n*72|0)|0;q=r+72|0;do{c[r>>2]=c[k>>2];r=r+4|0;k=k+4|0}while((r|0)<(q|0));t=+h[_>>3];h[d+(m*72|0)+16>>3]=t;h[d+(n*72|0)+32>>3]=t;t=+h[Z>>3];h[d+(m*72|0)+8>>3]=t;h[d+(n*72|0)+24>>3]=t;c[d+(n*72|0)+48>>2]=m;c[d+(n*72|0)+52>>2]=0;c[d+(m*72|0)+40>>2]=n;c[d+(m*72|0)+44>>2]=0;g=c[d+(m*72|0)+48>>2]|0;if((g|0)>0){k=d+(g*72|0)+40|0;if((c[k>>2]|0)==(n|0))c[k>>2]=m;g=d+(g*72|0)+44|0;if((c[g>>2]|0)==(n|0))c[g>>2]=m}g=c[d+(m*72|0)+52>>2]|0;if((g|0)>0){k=d+(g*72|0)+40|0;if((c[k>>2]|0)==(n|0))c[k>>2]=m;g=d+(g*72|0)+44|0;if((c[g>>2]|0)==(n|0))c[g>>2]=m}M=IV()|0;N=IV()|0;g=d+(n*72|0)+56|0;L=c[g>>2]|0;c[e+(L*40|0)>>2]=2;K=e+(L*40|0)+8|0;c[K>>2]=c[Z>>2];c[K+4>>2]=c[Z+4>>2];c[K+8>>2]=c[Z+8>>2];c[K+12>>2]=c[Z+12>>2];c[e+(L*40|0)+4>>2]=a;c[e+(L*40|0)+32>>2]=N;c[e+(L*40|0)+36>>2]=M;c[e+(M*40|0)>>2]=3;c[e+(M*40|0)+24>>2]=n;c[e+(M*40|0)+28>>2]=L;c[e+(N*40|0)>>2]=3;c[e+(N*40|0)+24>>2]=m;c[e+(N*40|0)+28>>2]=L;c[g>>2]=M;c[d+(m*72|0)+56>>2]=N;N=f;f=0;g=o}else if((O|0)==32){N=f;n=EV(Z,X,c[p>>2]|0,b,e)|0;f=1}a:do if((N|0)>0){L=d+(n*72|0)+24|0;M=d+(n*72|0)+32|0;K=(f|0)!=0;G=g?b+(a*56|0)+48|0:b+(a*56|0)+44|0;I=Y+8|0;g=0;f=0;H=N;while(1){k=d+(H*72|0)|0;D=d+(H*72|0)+24|0;if(!(JV(D,L)|0))break a;m=d+(H*72|0)+56|0;C=c[m>>2]|0;o=IV()|0;p=IV()|0;c[e+(C*40|0)>>2]=1;c[e+(C*40|0)+4>>2]=a;c[e+(C*40|0)+32>>2]=o;c[e+(C*40|0)+36>>2]=p;c[e+(o*40|0)>>2]=3;c[e+(o*40|0)+24>>2]=H;c[e+(o*40|0)+28>>2]=C;c[e+(p*40|0)>>2]=3;E=HV(d)|0;c[e+(p*40|0)+24>>2]=E;J=d+(E*72|0)|0;c[d+(E*72|0)+68>>2]=1;c[e+(p*40|0)+28>>2]=C;g=(H|0)==(N|0)?E:g;C=d+(H*72|0)+32|0;if(+F(+(+h[C>>3]-+h[M>>3]))<=1.0e-07?+F(+(+h[D>>3]-+h[L>>3]))<=1.0e-07:0)f=E;r=J;q=r+72|0;do{c[r>>2]=c[k>>2];r=r+4|0;k=k+4|0}while((r|0)<(q|0));c[m>>2]=o;c[d+(E*72|0)+56>>2]=p;z=d+(H*72|0)+48|0;k=c[z>>2]|0;q=(k|0)<1;m=d+(H*72|0)+52|0;if(q?(c[m>>2]|0)<1:0)break;A=d+(E*72|0)+48|0;r=d+(H*72|0)+64|0;p=d+(E*72|0)+44|0;o=d+(E*72|0)+52|0;v=d+(H*72|0)+60|0;w=d+(E*72|0)+60|0;y=d+(E*72|0)+40|0;x=d+(H*72|0)+44|0;B=d+(H*72|0)+40|0;do if((k|0)>0?(c[m>>2]|0)<1:0){k=c[B>>2]|0;do if((k|0)>0?(Q=c[x>>2]|0,(Q|0)>0):0){k=c[v>>2]|0;if((k|0)<=0){c[y>>2]=Q;c[p>>2]=-1;c[x>>2]=-1;c[d+(Q*72|0)+48>>2]=E;break}if((c[r>>2]|0)==1){c[y>>2]=Q;c[x>>2]=-1;c[p>>2]=k;r=E;q=Q;k=c[B>>2]|0}else{c[p>>2]=-1;c[y>>2]=c[x>>2];q=c[B>>2]|0;c[x>>2]=q;c[B>>2]=k;r=H;p=y}c[d+(k*72|0)+48>>2]=H;c[d+(q*72|0)+48>>2]=r;c[d+((c[p>>2]|0)*72|0)+48>>2]=E;c[w>>2]=0;c[v>>2]=0}else O=52;while(0);do if((O|0)==52){O=0;q=d+(k*72|0)+48|0;r=c[q>>2]|0;k=d+(k*72|0)+52|0;if((r|0)>0?(c[k>>2]|0)>0:0){k=c[d+(r*72|0)+4>>2]|0;if((k|0)>0?(FV(k,b,Z)|0)==0:0){c[p>>2]=-1;c[x>>2]=-1;c[B>>2]=-1;c[d+((c[y>>2]|0)*72|0)+52>>2]=E;break}c[x>>2]=-1;c[p>>2]=-1;c[y>>2]=-1;c[d+((c[B>>2]|0)*72|0)+48>>2]=H;break}c[q>>2]=H;c[k>>2]=E}while(0);if(+F(+(+h[C>>3]-+h[M>>3]))<=1.0e-07?K&+F(+(+h[D>>3]-+h[L>>3]))<=1.0e-07:0){k=c[G>>2]|0;if((k|0)>0?(FV(k,b,X)|0)!=0:0){c[d+((c[z>>2]|0)*72|0)+40>>2]=H;m=o;k=E}else{c[d+((c[A>>2]|0)*72|0)+44>>2]=E;k=H}c[m>>2]=-1;c[d+(k*72|0)+48>>2]=-1;k=c[z>>2]|0;break}k=c[z>>2]|0;m=d+(k*72|0)+40|0;o=c[m>>2]|0;p=d+(k*72|0)+44|0;if((o|0)>0?(R=c[p>>2]|0,S=(o|0)==(H|0),(R|0)>0):0){c[d+(k*72|0)+60>>2]=S?R:o;c[d+(k*72|0)+64>>2]=S?1:2}c[m>>2]=H;c[p>>2]=E}else O=70;while(0);do if((O|0)==70){O=0;if(q?(c[m>>2]|0)>0:0){k=c[B>>2]|0;do if((k|0)>0?(T=c[x>>2]|0,(T|0)>0):0){k=c[v>>2]|0;if((k|0)<=0){c[y>>2]=T;c[p>>2]=-1;c[x>>2]=-1;c[d+(T*72|0)+48>>2]=E;break}if((c[r>>2]|0)==1){c[y>>2]=T;c[x>>2]=-1;c[p>>2]=k;r=E;q=T;k=c[B>>2]|0}else{c[p>>2]=-1;c[y>>2]=c[x>>2];q=c[B>>2]|0;c[x>>2]=q;c[B>>2]=k;r=H;p=y}c[d+(k*72|0)+48>>2]=H;c[d+(q*72|0)+48>>2]=r;c[d+((c[p>>2]|0)*72|0)+48>>2]=E;c[w>>2]=0;c[v>>2]=0}else O=80;while(0);do if((O|0)==80){O=0;q=d+(k*72|0)+48|0;r=c[q>>2]|0;k=d+(k*72|0)+52|0;if((r|0)>0?(c[k>>2]|0)>0:0){k=c[d+(r*72|0)+4>>2]|0;if((k|0)>0?(FV(k,b,Z)|0)==0:0){c[p>>2]=-1;c[x>>2]=-1;c[B>>2]=-1;c[d+((c[y>>2]|0)*72|0)+52>>2]=E;break}c[x>>2]=-1;c[p>>2]=-1;c[y>>2]=-1;c[d+((c[B>>2]|0)*72|0)+48>>2]=H;break}c[q>>2]=H;c[k>>2]=E}while(0);if(+F(+(+h[C>>3]-+h[M>>3]))<=1.0e-07?K&+F(+(+h[D>>3]-+h[L>>3]))<=1.0e-07:0){k=c[G>>2]|0;if((k|0)>0?(FV(k,b,X)|0)!=0:0){c[d+((c[m>>2]|0)*72|0)+40>>2]=H;k=E}else{c[d+((c[o>>2]|0)*72|0)+44>>2]=E;o=m;k=H}c[o>>2]=-1;c[d+(k*72|0)+48>>2]=-1;k=c[m>>2]|0;break}k=c[m>>2]|0;m=d+(k*72|0)+40|0;o=c[m>>2]|0;p=d+(k*72|0)+44|0;if((o|0)>0?(U=c[p>>2]|0,V=(o|0)==(H|0),(U|0)>0):0){c[d+(k*72|0)+60>>2]=V?U:o;c[d+(k*72|0)+64>>2]=V?1:2}c[m>>2]=H;c[p>>2]=E;break}i=+h[C>>3];j=+h[P>>3];s=i-j;u=!(+F(+s)<=1.0e-07);t=+h[X>>3];if(u){h[I>>3]=i;h[Y>>3]=t+s/(+h[_>>3]-j)*(+h[Z>>3]-t);u=(KV(Y,D)|0)!=0}else u=+h[D>>3]>t;k=c[B>>2]|0;do if((k|0)>0?(W=c[x>>2]|0,(W|0)>0):0){k=c[v>>2]|0;if((k|0)<=0){c[y>>2]=W;c[p>>2]=-1;c[x>>2]=-1;c[d+(W*72|0)+48>>2]=E;break}if((c[r>>2]|0)==1){c[y>>2]=W;c[x>>2]=-1;c[p>>2]=k;r=E;q=W;k=c[B>>2]|0}else{c[p>>2]=-1;c[y>>2]=c[x>>2];q=c[B>>2]|0;c[x>>2]=q;c[B>>2]=k;r=H;p=y}c[d+(k*72|0)+48>>2]=H;c[d+(q*72|0)+48>>2]=r;c[d+((c[p>>2]|0)*72|0)+48>>2]=E;c[w>>2]=0;c[v>>2]=0}else O=109;while(0);do if((O|0)==109){O=0;q=d+(k*72|0)+48|0;r=c[q>>2]|0;k=d+(k*72|0)+52|0;if((r|0)>0?(c[k>>2]|0)>0:0){k=c[d+(r*72|0)+4>>2]|0;if((k|0)>0?(FV(k,b,Z)|0)==0:0){c[p>>2]=-1;c[x>>2]=-1;c[B>>2]=-1;c[d+((c[y>>2]|0)*72|0)+52>>2]=E;break}c[x>>2]=-1;c[p>>2]=-1;c[y>>2]=-1;c[d+((c[B>>2]|0)*72|0)+48>>2]=H;break}c[q>>2]=H;c[k>>2]=E}while(0);if(+F(+(+h[C>>3]-+h[M>>3]))<=1.0e-07?K&+F(+(+h[D>>3]-+h[L>>3]))<=1.0e-07:0){k=c[z>>2]|0;c[d+(k*72|0)+40>>2]=H;c[d+(k*72|0)+44>>2]=-1;k=c[m>>2]|0;c[d+(k*72|0)+40>>2]=E;c[d+(k*72|0)+44>>2]=-1;c[A>>2]=k;c[o>>2]=-1;c[m>>2]=-1;k=-1}else O=119;do if((O|0)==119){O=0;k=c[z>>2]|0;c[d+(k*72|0)+40>>2]=H;p=d+(k*72|0)+44|0;if(u){c[p>>2]=E;D=c[m>>2]|0;c[d+(D*72|0)+40>>2]=E;c[d+(D*72|0)+44>>2]=-1;c[m>>2]=-1;break}else{c[p>>2]=-1;k=c[m>>2]|0;c[d+(k*72|0)+40>>2]=H;c[d+(k*72|0)+44>>2]=E;c[A>>2]=k;c[o>>2]=-1;k=c[m>>2]|0;break}}while(0)}while(0);c[J>>2]=a;c[d+(H*72|0)+4>>2]=a;if((k|0)>0)H=k;else break a}_3(138727,19,1,c[15715]|0)|0}else{g=0;f=0}while(0);LV(a,N,n,1,d,e);LV(a,g,f,2,d,e);c[b+(a*56|0)+32>>2]=1;l=$;return}function DV(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if(!(c[b+(a*56|0)+32>>2]|0)){f=b+(a*56|0)|0;g=b+(a*56|0)+16|0;h=b+(a*56|0)+36|0;c[h>>2]=c[d+((EV(f,g,c[h>>2]|0,b,e)|0)*72|0)+56>>2];a=b+(a*56|0)+40|0;c[a>>2]=c[d+((EV(g,f,c[a>>2]|0,b,e)|0)*72|0)+56>>2]}return}function EV(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0;p=b+8|0;r=a+8|0;i=d;a:while(1){m=f+(i*40|0)+36|0;d=f+(i*40|0)+32|0;b:do switch(c[f+(i*40|0)>>2]|0){case 3:{s=3;break a}case 2:{g=+h[r>>3];j=+h[f+(i*40|0)+16>>3];k=j+1.0e-07;if(!(g>k)){l=j+-1.0e-07;i=f+(i*40|0)+8|0;if(!(g>3]>+h[i>>3]:0){d=m;break b}if(+F(+(g-j))<=1.0e-07?(n=+h[i>>3],+F(+(+h[a>>3]-n))<=1.0e-07):0){g=+h[p>>3];if(g>k)d=m;else if(!(g>3]>n:0){d=m;break b}}}else d=m;break}case 1:{j=+h[r>>3];i=c[f+(i*40|0)+4>>2]|0;if(+F(+(j-+h[e+(i*56|0)+8>>3]))<=1.0e-07?(o=+h[a>>3],+F(+(o-+h[e+(i*56|0)>>3]))<=1.0e-07):0)g=o;else s=16;do if((s|0)==16){s=0;if(+F(+(j-+h[e+(i*56|0)+24>>3]))<=1.0e-07?(q=+h[a>>3],+F(+(q-+h[e+(i*56|0)+16>>3]))<=1.0e-07):0){g=q;break}i=(FV(i,e,a)|0)==0;d=i?m:d;break b}while(0);if(!(+F(+(j-+h[p>>3]))<=1.0e-07)){i=(FV(i,e,b)|0)==0;d=i?m:d;break b}if(!(+h[b>>3]>2]|0}if((s|0)==3)return c[f+(i*40|0)+24>>2]|0;else if((s|0)==23){_3(138661,35,1,c[15715]|0)|0;Aa(138697,138699,349,138711)}return 0}function FV(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0,i=0.0,j=0.0,k=0,l=0.0;i=+h[b+(a*56|0)+24>>3];j=+h[b+(a*56|0)+8>>3];k=b+(a*56|0)+16|0;b=b+(a*56|0)|0;a=c+8|0;do if(!(i>j+1.0e-07)){if(!(i>3]>+h[b>>3]:0){g=4;break}f=+h[a>>3];a=!(+F(+(i-f))<=1.0e-07);e=+h[c>>3];if(!a){d=e<+h[k>>3]?1.0:-1.0;break}c=!(+F(+(j-f))<=1.0e-07);d=+h[b>>3];if(c){l=+h[k>>3];d=(f-i)*(d-l)-(j-i)*(e-l);break}else{d=e>3];g=!(+F(+(i-f))<=1.0e-07);e=+h[c>>3];if(!g){d=e<+h[k>>3]?1.0:-1.0;break}g=!(+F(+(j-f))<=1.0e-07);d=+h[b>>3];if(g){d=(f-j)*(+h[k>>3]-d)-(i-j)*(e-d);break}else{d=e0.0|0}function GV(a,b,d){a=a|0;b=b|0;d=d|0;return c[b+((c[((d|0)==1?b+(a*56|0)+48|0:b+(a*56|0)+44|0)>>2]|0)*56|0)+32>>2]|0}function HV(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=e;b=c[47466]|0;if((b|0)<(c[47465]|0)){c[a+(b*72|0)>>2]=-1;c[a+(b*72|0)+4>>2]=-1;c[a+(b*72|0)+68>>2]=1;c[47466]=b+1;l=e;return b|0}else{e=c[15715]|0;c[d>>2]=b;z4(e,138786,d)|0;Aa(138697,138699,88,138824)}return 0}function IV(){var a=0;a=c[47467]|0;if((a|0)<(c[47464]|0)){c[47467]=a+1;return a|0}else{_3(138747,30,1,c[15715]|0)|0;Aa(138697,138699,72,138778)}return 0}function JV(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a+8>>3];d=+h[b+8>>3];if(!(c>d+1.0e-07))if(c>3]>=+h[b>>3]&1;else a=1;return a|0}function KV(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a+8>>3];d=+h[b+8>>3];if(!(cd+1.0e-07)a=0;else a=+h[a>>3]<+h[b>>3]&1;else a=1;return a|0}function LV(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=f+(d*72|0)+24|0;p=(e|0)==1;a:while(1){o=f+(b*72|0)+24|0;j=f+(b*72|0)+48|0;k=f+(b*72|0)+52|0;l=f+(b*72|0)|0;m=f+(b*72|0)+4|0;n=f+(b*72|0)+56|0;if((b|0)<=0)break;while(1){if(!(JV(o,q)|0))break a;d=c[j>>2]|0;e=(d|0)>0;do if(p){if(e?(c[f+(d*72|0)+4>>2]|0)==(a|0):0)break;d=c[k>>2]|0;if((d|0)<=0){b=d;continue a}e=d;d=f+(d*72|0)+4|0;r=13}else{if(e?(c[f+(d*72|0)>>2]|0)==(a|0):0)break;d=c[k>>2]|0;if((d|0)<=0){b=d;continue a}e=d;d=f+(d*72|0)|0;r=13}while(0);if((r|0)==13){r=0;if((c[d>>2]|0)==(a|0))d=e;else{b=e;continue a}}if((c[l>>2]|0)!=(c[f+(d*72|0)>>2]|0)){b=d;continue a}if((c[m>>2]|0)!=(c[f+(d*72|0)+4>>2]|0)){b=d;continue a}s=c[f+(d*72|0)+56>>2]|0;e=c[g+(s*40|0)+28>>2]|0;h=g+(e*40|0)+32|0;i=c[n>>2]|0;if((c[h>>2]|0)==(s|0))c[h>>2]=i;else c[g+(e*40|0)+36>>2]=i;e=c[f+(d*72|0)+48>>2]|0;c[j>>2]=e;do if((e|0)>0){h=f+(e*72|0)+40|0;if((c[h>>2]|0)==(d|0)){c[h>>2]=b;break}e=f+(e*72|0)+44|0;if((c[e>>2]|0)==(d|0))c[e>>2]=b}while(0);e=c[f+(d*72|0)+52>>2]|0;c[k>>2]=e;do if((e|0)>0){h=f+(e*72|0)+40|0;if((c[h>>2]|0)==(d|0)){c[h>>2]=b;break}e=f+(e*72|0)+44|0;if((c[e>>2]|0)==(d|0))c[e>>2]=b}while(0);s=f+(d*72|0)+24|0;c[o>>2]=c[s>>2];c[o+4>>2]=c[s+4>>2];c[o+8>>2]=c[s+8>>2];c[o+12>>2]=c[s+12>>2];c[f+(d*72|0)+68>>2]=2}}return}function MV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0;e=+h[b+8>>3];f=+h[d+8>>3];do if(!(e>f+1.0e-07)){if(!(+F(+(e-f))<=1.0e-07)){c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];break}if(+h[b>>3]>+h[d>>3]+1.0e-07){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];break}else{c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];break}}else{c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2]}while(0);return}function NV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0;e=+h[b+8>>3];f=+h[d+8>>3];do if(!(e>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];break}if(+h[b>>3]<+h[d>>3]){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];break}else{c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];break}}else{c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2]}while(0);return}function OV(a){a=a|0;var b=0;b=HK(8)|0;if(b|0){c[b+4>>2]=a;c[b>>2]=0}return b|0}function PV(a,b){a=a|0;b=b|0;if(b){b=OV(b)|0;c[b>>2]=a;a=b}return a|0}function QV(a){a=a|0;var b=0;do{b=a;a=c[a>>2]|0;l6(b)}while((a|0)!=0);return}function RV(){var a=0;a=HK(1992)|0;if(a|0)c[a>>2]=SV(a)|0;return a|0}function SV(a){a=a|0;var b=0;b=YV(a)|0;c[b+4>>2]=0;a=a+1972|0;c[a>>2]=(c[a>>2]|0)+1;return b|0}function TV(a){a=a|0;UV(a,c[a>>2]|0);l6(c[a>>2]|0);l6(a);return 0}function UV(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=a+1936|0;h=a+1980|0;i=a+1912|0;a:do if((c[b+4>>2]|0)>0){d=0;while(1){if((d|0)==64)break a;e=b+8+(d*20|0)+16|0;f=c[e>>2]|0;if(f|0?(UV(a,f),l6(c[e>>2]|0),cW(b,d),c[h>>2]=(c[h>>2]|0)+-1,c[i>>2]|0):0)c[g>>2]=(c[g>>2]|0)+1;d=d+1|0}}else{d=0;while(1){if((d|0)==64)break a;if(c[b+8+(d*20|0)+16>>2]|0?(cW(b,d),c[h>>2]=(c[h>>2]|0)+-1,c[i>>2]|0):0)c[g>>2]=(c[g>>2]|0)+1;d=d+1|0}}while(0);return}function VV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;if(!b)Aa(139182,138832,194,138840);e=c[b+4>>2]|0;if((e|0)<=-1)Aa(138852,138832,195,138840);if(!d)Aa(139124,138832,196,138840);i=a+1952|0;c[i>>2]=(c[i>>2]|0)+1;a:do if((e|0)>0){i=0;e=0;while(1){if((i|0)==64)break a;f=b+8+(i*20|0)+16|0;if((c[f>>2]|0)!=0?(hW(d,b+8+(i*20|0)|0)|0)!=0:0){g=VV(a,c[f>>2]|0,d)|0;if(!e)e=g;else{f=e;while(1){h=c[f>>2]|0;if(!h)break;else f=h}c[f>>2]=g}}i=i+1|0}}else{g=0;e=0;while(1){if((g|0)==64)break a;f=b+8+(g*20|0)|0;if((c[b+8+(g*20|0)+16>>2]|0)!=0?(hW(d,f)|0)!=0:0)e=PV(e,f)|0;g=g+1|0}}while(0);return e|0}function WV(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;o=l;l=l+64|0;j=o+52|0;k=o+32|0;m=o+16|0;n=o;c[j>>2]=0;if(!((b|0)!=0&(e|0)!=0))Aa(139038,138832,247,138866);if((f|0)>-1?(i=c[e>>2]|0,(c[i+4>>2]|0)>=(f|0)):0){g=0;while(1){if((g|0)>=2)break;if((c[b+(g<<2)>>2]|0)>(c[b+(g+2<<2)>>2]|0)){h=8;break}else g=g+1|0}if((h|0)==8)Aa(138913,138832,250,138866);g=a+1912|0;h=a+1908|0;if(c[g>>2]|0){p=c[h>>2]|0?a+1924|0:a+1916|0;c[p>>2]=(c[p>>2]|0)+1}if(!(c[h>>2]|0)){p=a+1964|0;c[p>>2]=(c[p>>2]|0)+1}if(!(XV(a,b,d,i,j,f)|0))g=0;else{if(c[g>>2]|0){p=c[h>>2]|0?a+1948|0:a+1944|0;c[p>>2]=(c[p>>2]|0)+1}g=YV(a)|0;p=a+1976|0;c[p>>2]=(c[p>>2]|0)+1;p=c[e>>2]|0;c[g+4>>2]=(c[p+4>>2]|0)+1;$V(m,p);c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];p=k+16|0;c[p>>2]=c[e>>2];bW(a,k,g,0)|0;$V(n,c[j>>2]|0);c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];c[p>>2]=c[j>>2];bW(a,k,g,0)|0;c[e>>2]=g;g=a+1980|0;c[g>>2]=(c[g>>2]|0)+2;g=1}l=o;return g|0}Aa(138878,138832,248,138866);return 0}function XV(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+80|0;m=q+52|0;n=q+48|0;o=q+32|0;p=q+16|0;k=q;c[n>>2]=0;if(!((b|0)!=0&(e|0)!=0&(f|0)!=0))Aa(138956,138832,311,138970);if((g|0)>-1?(i=e+4|0,h=c[i>>2]|0,(h|0)>=(g|0)):0){if(c[a+1912>>2]|0){h=c[a+1908>>2]|0?a+1948|0:a+1944|0;c[h>>2]=(c[h>>2]|0)+1;h=c[i>>2]|0}do if((h|0)>(g|0)){i=aW(b,e)|0;h=e+8+(i*20|0)+16|0;i=e+8+(i*20|0)|0;if(!(XV(a,b,d,c[h>>2]|0,n,g)|0)){gW(o,b,i);c[i>>2]=c[o>>2];c[i+4>>2]=c[o+4>>2];c[i+8>>2]=c[o+8>>2];c[i+12>>2]=c[o+12>>2];j=0;break}else{$V(p,c[h>>2]|0);c[i>>2]=c[p>>2];c[i+4>>2]=c[p+4>>2];c[i+8>>2]=c[p+8>>2];c[i+12>>2]=c[p+12>>2];j=c[n>>2]|0;c[m+16>>2]=j;$V(k,j);c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];j=a+1980|0;c[j>>2]=(c[j>>2]|0)+1;j=bW(a,m,e,f)|0;break}}else if((h|0)==(g|0)){c[m>>2]=c[b>>2];c[m+4>>2]=c[b+4>>2];c[m+8>>2]=c[b+8>>2];c[m+12>>2]=c[b+12>>2];c[m+16>>2]=d;j=a+1980|0;c[j>>2]=(c[j>>2]|0)+1;j=bW(a,m,e,f)|0;break}else Aa(139015,138832,341,138970);while(0);l=q;return j|0}Aa(138983,138832,312,138970);return 0}function YV(a){a=a|0;a=a+1968|0;c[a>>2]=(c[a>>2]|0)+1;a=k6(1288)|0;ZV(a);return a|0}function ZV(a){a=a|0;var b=0;c[a>>2]=0;c[a+4>>2]=-1;b=0;while(1){if((b|0)==64)break;_V(a+8+(b*20|0)|0);b=b+1|0}return}function _V(a){a=a|0;dW(a);c[a+16>>2]=0;return}function $V(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+32|0;g=i+16|0;h=i;if(!b)Aa(139182,139021,99,139028);dW(g);d=1;f=0;while(1){if((f|0)==64)break;do if(c[b+8+(f*20|0)+16>>2]|0){e=b+8+(f*20|0)|0;if(!d){gW(h,g,e);c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];d=0;break}else{c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];d=0;break}}while(0);f=f+1|0}c[a>>2]=c[g>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[a+12>>2]=c[g+12>>2];l=i;return}function aW(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;k=l;l=l+32|0;i=k+16|0;j=k;if(!((a|0)!=0&(b|0)!=0))Aa(139038,139021,125,139045);d=0;e=0;f=0;g=1;h=0;while(1){if((h|0)==64)break;if(c[b+8+(h*20|0)+16>>2]|0){n=b+8+(h*20|0)|0;p=fW(n)|0;gW(j,a,n);c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];n=(fW(i)|0)-p|0;m=(g|0)!=0|(n|0)<(f|0);o=m|(p|0)<(e|0)&(n|0)==(f|0);d=o?h:d;e=o?p:e;f=o?n:f;g=m?0:g}h=h+1|0}l=k;return d|0}function bW(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if(!b)Aa(139204,139021,167,139056);if(!d)Aa(139182,139021,168,139056);do if((c[d>>2]|0)<64){a=0;while(1){if((a|0)>=64){e=10;break}if(!(c[d+8+(a*20|0)+16>>2]|0)){e=8;break}a=a+1|0}if((e|0)==8){f=d+8+(a*20|0)|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[b+16>>2];f=0;g=d;break}else if((e|0)==10)Aa(139066,139021,178,139056)}else{if(c[a+1912>>2]|0){h=c[a+1908>>2]|0?a+1948|0:a+1944|0;c[h>>2]=(c[h>>2]|0)+1}if(!e)Aa(139079,139021,187,139056);else{iW(a,d,b,e);f=1;g=(c[d+4>>2]|0)==0?a+1972|0:a+1976|0;break}}while(0);c[g>>2]=(c[g>>2]|0)+1;return f|0}function cW(a,b){a=a|0;b=b|0;if(!((a|0)!=0&b>>>0<64))Aa(139083,139021,201,139111);if(!(c[a+8+(b*20|0)+16>>2]|0))Aa(139605,139021,202,139111);else{_V(a+8+(b*20|0)|0);c[a>>2]=(c[a>>2]|0)+-1;return}}function dW(a){a=a|0;var b=0;b=0;while(1){if((b|0)==4)break;c[a+(b<<2)>>2]=0;b=b+1|0}return}function eW(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=e;c[d>>2]=1;c[d+8>>2]=-1;b=1;while(1){if((b|0)==2)break;c[d+(b+2<<2)>>2]=0;c[d+(b<<2)>>2]=0;b=b+1|0}c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];l=e;return}function fW(a){a=a|0;var b=0,d=0,e=0;if(!a)Aa(139124,139126,128,139138);a:do if((c[a>>2]|0)>(c[a+8>>2]|0))b=0;else{b=1;d=0;while(1){if((d|0)==2)break a;e=S(c[a+(d+2<<2)>>2]|0,b)|0;b=e-(c[a+(d<<2)>>2]|0)|0;d=d+1|0}}while(0);return b|0}function gW(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=l;l=l+16|0;f=g;if(!((b|0)!=0&(d|0)!=0))Aa(139147,139126,195,139155);do if((c[b>>2]|0)>(c[b+8>>2]|0)){c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2]}else{if((c[d>>2]|0)>(c[d+8>>2]|0)){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];break}else e=0;while(1){if((e|0)==2)break;j=c[b+(e<<2)>>2]|0;h=c[d+(e<<2)>>2]|0;c[f+(e<<2)>>2]=(j|0)<(h|0)?j:h;h=e+2|0;j=c[b+(h<<2)>>2]|0;i=c[d+(h<<2)>>2]|0;c[f+(h<<2)>>2]=(j|0)>(i|0)?j:i;e=e+1|0}c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2]}while(0);l=g;return}function hW(a,b){a=a|0;b=b|0;var d=0,e=0;if((a|0)!=0&(b|0)!=0)d=0;else Aa(139167,139126,216,139174);while(1){if((d|0)>=2){d=1;break}e=d+2|0;if((c[a+(d<<2)>>2]|0)>(c[b+(e<<2)>>2]|0)){d=0;break}if((c[b+(d<<2)>>2]|0)>(c[a+(e<<2)>>2]|0)){d=0;break}else d=d+1|0}return d|0}function iW(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0;if(!b)Aa(139182,139184,40,139194);if(!d)Aa(139204,139184,41,139194);j=a+1912|0;k=a+1908|0;if(c[j>>2]|0){i=c[k>>2]|0?a+1932|0:a+1928|0;c[i>>2]=(c[i>>2]|0)+1}h=b+4|0;i=c[h>>2]|0;jW(a,b,d);d=a+1324|0;kW(a);f=fW(a+1852|0)|0;f=(fW(a+1868|0)|0)+f|0;if(c[j>>2]|0?(f|0)!=0&(c[k>>2]|0)==0:0){k=a+1960|0;g[k>>2]=+g[k>>2]+ +((c[a+1320>>2]|0)>>>0)/+(f|0)}k=YV(a)|0;c[e>>2]=k;c[h>>2]=i;c[k+4>>2]=i;lW(a,b,k,d);if(((c[c[e>>2]>>2]|0)+(c[b>>2]|0)|0)==65)return;else Aa(139206,139184,86,139194)}function jW(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;h=l;l=l+16|0;g=h;if(!b)Aa(139182,139184,106,139593);if(!d)Aa(139204,139184,107,139593);else e=0;while(1){if((e|0)>=64)break;if(!(c[b+8+(e*20|0)+16>>2]|0)){f=7;break}j=b+8+(e*20|0)|0;i=a+4+(e*20|0)|0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];c[i+16>>2]=c[j+16>>2];e=e+1|0}if((f|0)==7)Aa(139605,139184,111,139593);e=a+4|0;j=a+1284|0;c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];c[j+16>>2]=c[d+16>>2];d=a+1304|0;c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];e=1;while(1){if((e|0)==65)break;gW(g,d,a+4+(e*20|0)|0);c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];e=e+1|0}c[a+1320>>2]=fW(d)|0;ZV(b);l=h;return}function kW(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;u=l;l=l+48|0;i=u+32|0;k=u+16|0;m=u;mW(a);nW(a);s=a+1844|0;q=a+1848|0;t=a+1892|0;n=a+1852|0;o=a+1884|0;p=a+1868|0;j=a+1888|0;f=0;e=0;while(1){b=c[s>>2]|0;d=c[q>>2]|0;if((d+b|0)>=65)break;h=65-(c[t>>2]|0)|0;b=(b|0)<(h|0);if(b&(d|0)<(h|0)){g=-1;h=0}else{r=12;break}while(1){if((h|0)==65)break;if(!(c[a+1584+(h<<2)>>2]|0)){v=a+4+(h*20|0)|0;gW(k,v,n);c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];b=fW(i)|0;d=c[o>>2]|0;gW(m,v,p);c[i>>2]=c[m>>2];c[i+4>>2]=c[m+4>>2];c[i+8>>2]=c[m+8>>2];c[i+12>>2]=c[m+12>>2];v=fW(i)|0;b=v-(c[j>>2]|0)+(d-b)|0;d=(b|0)>-1;b=d?b:0-b|0;d=(d^1)&1;if((b|0)<=(g|0))if((b|0)==(g|0)){v=(c[a+1844+(d<<2)>>2]|0)<(c[a+1844+(f<<2)>>2]|0);b=g;d=v?d:f;e=v?h:e}else{b=g;d=f}else e=h}else{b=g;d=f}g=b;h=h+1|0;f=d}oW(a,e,f)}if((r|0)==12){b=(b^1)&1;d=0;while(1){if((d|0)==65)break;if(!(c[a+1584+(d<<2)>>2]|0))oW(a,d,b);d=d+1|0}d=c[q>>2]|0;b=c[s>>2]|0}if((d+b|0)!=65)Aa(139349,139184,210,139435);v=c[t>>2]|0;if((b|0)<(v|0)|(d|0)<(v|0))Aa(139446,139184,212,139435);else{l=u;return}}function lW(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;if(!b)Aa(139182,139184,297,139246);if(!d)Aa(139256,139184,298,139246);if(!e)Aa(139258,139184,299,139246);else g=0;while(1){if((g|0)>=65){e=14;break}f=c[a+1324+(g<<2)>>2]|0;if(f>>>0>=2){e=9;break}e=a+4+(g*20|0)|0;switch(f|0){case 0:{bW(a,e,b,0)|0;break}case 1:{bW(a,e,d,0)|0;break}default:{}}g=g+1|0}if((e|0)==9)Aa(139260,139184,303,139246);else if((e|0)==14)return}function mW(a){a=a|0;var b=0,d=0,e=0,f=0;d=l;l=l+16|0;e=d;c[a+1848>>2]=0;c[a+1844>>2]=0;b=a+1852|0;f=a+1868|0;eW(e);c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];c[a+1888>>2]=0;c[a+1884>>2]=0;b=0;while(1){if((b|0)==65)break;c[a+1584+(b<<2)>>2]=0;c[a+1324+(b<<2)>>2]=-1;b=b+1|0}l=d;return}function nW(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;o=l;l=l+304|0;k=o+32|0;m=o+16|0;n=o;b=0;while(1){if((b|0)==65)break;c[k+(b<<2)>>2]=fW(a+4+(b*20|0)|0)|0;b=b+1|0}b=0;d=0;e=0;g=0;a:while(1){if((g|0)==64)break;i=g+1|0;j=a+4+(g*20|0)|0;h=k+(g<<2)|0;f=i;while(1){if((f|0)==65){g=i;continue a}gW(n,j,a+4+(f*20|0)|0);c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];p=fW(m)|0;p=p-(c[h>>2]|0)-(c[k+(f<<2)>>2]|0)|0;q=p>>>0>e>>>0;r=q?f:b;f=f+1|0;b=r;d=q?g:d;e=q?p:e}}oW(a,d,0);oW(a,b,1);l=o;return}function oW(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;e=a+1584+(b<<2)|0;if(c[e>>2]|0)Aa(139549,139184,257,139584);c[a+1324+(b<<2)>>2]=d;c[e>>2]=1;g=a+1844+(d<<2)|0;f=a+1852+(d<<4)|0;e=a+4+(b*20|0)|0;if(!(c[g>>2]|0)){c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2]}else{gW(h,e,f);c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2]}c[a+1884+(d<<2)>>2]=fW(f)|0;c[g>>2]=(c[g>>2]|0)+1;l=i;return}function pW(){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+1200|0;t=v+800|0;h=v;c[47468]=0;c[47469]=-2;f=t;j=200;n=h;o=0;q=0;g=t;a:while(1){b[g>>1]=o;if((f+(j<<1)+-2|0)>>>0>g>>>0){r=j;s=f;p=h;i=n}else{m=(g-f>>1)+1|0;if(j>>>0>9999){u=96;break}j=j<<1;j=j>>>0<1e4?j:1e4;e=k6(j*6|3)|0;if(e){B6(e|0,f|0,m<<1|0)|0;i=e+(j>>>1<<2)|0;B6(i|0,n|0,m<<2|0)|0;if((f|0)==(t|0)){k=0;f=e}else{l6(f);k=0;f=e}}else{k=4;i=n}e=(k|0)==0;switch((e?((j|0)>(m|0)?0:9):k)&15){case 9:{e=1;u=97;break a}case 4:{u=96;break a}case 0:{r=j;s=f;p=e?i+(m<<2)+-4|0:h;g=e?f+(m<<1)+-2|0:g;break}default:{e=0;break a}}}if((o|0)==31){e=0;f=s;u=97;break}e=b[65806+(o<<1)>>1]|0;j=e<<16>>16;k=(q|0)!=0;do if(e<<16>>16!=-82){f=c[47469]|0;if((f|0)==-2){f=EX()|0;c[47469]=f}if((f|0)>=1)if(f>>>0<296)h=d[139624+f>>0]|0;else h=2;else{c[47469]=0;h=0}f=h+j|0;if(f>>>0<=271?(a[139920+f>>0]|0)==(h|0):0){o=a[140192+f>>0]|0;e=o<<24>>24;if(o<<24>>24<1){f=0-e|0;u=23;break}else{c[47469]=-2;h=p+4|0;c[h>>2]=c[47470];k=k?q+-1|0:0;break}}else u=22}else u=22;while(0);if((u|0)==22){u=0;o=a[140464+o>>0]|0;f=o&255;if(!(o<<24>>24)){do if(k)if((q|0)==3){f=c[47469]|0;if((f|0)<1)if(!f){e=1;f=s;u=97;break a}else{f=p;break}else{c[47469]=-2;f=p;break}}else f=p;else{c[47468]=(c[47468]|0)+1;KW(142682);f=p}while(0);while(1){if(e<<16>>16==8)break;if((g|0)==(s|0)){e=1;f=s;u=97;break a}e=g+-2|0;f=f+-4|0;g=e;e=b[65806+(b[e>>1]<<1)>>1]|0}h=f+4|0;c[h>>2]=c[47470];e=1;k=3}else u=23}do if((u|0)==23){u=0;m=d[140580+f>>0]|0;e=c[p+(1-m<<2)>>2]|0;h=p+-12|0;j=p+-4|0;k=p+-8|0;do switch(f|0){case 4:{u=26;break a}case 2:{c[47471]=qW(c[j>>2]|0,2)|0;break}case 3:{c[47471]=qW(c[j>>2]|0,1)|0;break}case 5:{e=sW()|0;break}case 8:{tW(c[47472]|0);break}case 9:{uW(c[p>>2]|0);break}case 18:{vW(c[p>>2]|0);break}case 19:{wW();break}case 20:{vW(c[p>>2]|0);break}case 21:{wW();break}case 22:{vW(c[p>>2]|0);break}case 23:{wW();break}case 24:{vW(c[p>>2]|0);break}case 25:{wW();break}case 26:{vW(c[p>>2]|0);break}case 27:{wW();break}case 28:{vW(c[p>>2]|0);break}case 29:{wW();break}case 30:{vW(c[p>>2]|0);break}case 31:{wW();break}case 32:{vW(c[p>>2]|0);break}case 33:{wW();break}case 34:{e=c[j>>2]|0;break}case 35:{e=c[p>>2]|0;break}case 38:{e=c[47472]|0;h=c[e+4>>2]|0;if(h>>>0>=(c[e+8>>2]|0)>>>0){iA(e,1)|0;h=c[47472]|0;e=h;h=c[h+4>>2]|0}a[h>>0]=0;o=c[e>>2]|0;c[e+4>>2]=o;if(xW(o)|0){u=51;break a}c[(c[p>>2]|0)+80>>2]=c[47473];e=Sz(56092,c[4590]|0)|0;c[(c[p>>2]|0)+84>>2]=e;c[47473]=c[p>>2];c[(c[p>>2]|0)+108>>2]=c[c[47474]>>2];e=c[p>>2]|0;break}case 39:{e=c[47472]|0;h=c[e+4>>2]|0;if(h>>>0>=(c[e+8>>2]|0)>>>0){iA(e,1)|0;h=c[47472]|0;e=h;h=c[h+4>>2]|0}a[h>>0]=0;o=c[e>>2]|0;c[e+4>>2]=o;if(xW(o)|0){u=56;break a}e=c[47473]|0;c[47473]=c[e+80>>2];break}case 40:{e=c[p>>2]|0;break}case 41:{e=c[j>>2]|0;break}case 42:{e=c[j>>2]|0;break}case 43:{e=c[j>>2]|0;break}case 44:{e=c[j>>2]|0;break}case 45:{e=c[j>>2]|0;break}case 48:{e=c[p>>2]|0;break}case 49:{e=c[p>>2]|0;break}case 50:{a[(c[k>>2]|0)+12>>0]=1;e=c[p>>2]|0;break}case 51:{yW();break}case 52:{e=zW()|0;break}case 53:{e=c[p>>2]|0;break}case 54:{e=c[p>>2]|0;break}case 55:{e=(c[k>>2]|0)+100|0;a[e>>0]=a[e>>0]|1;e=c[p>>2]|0;break}case 56:{AW(c[j>>2]|0,c[p>>2]|0,1);break}case 57:{e=c[h>>2]|0;break}case 58:{AW(c[j>>2]|0,c[p>>2]|0,2);break}case 59:{e=c[h>>2]|0;break}case 60:{AW(c[j>>2]|0,c[p>>2]|0,3);break}case 61:{e=c[h>>2]|0;break}case 62:{AW(c[p>>2]|0,sW()|0,2);break}case 63:{e=c[k>>2]|0;break}case 64:{e=c[j>>2]|0;break}case 65:{e=c[p>>2]|0;break}default:{}}while(0);h=0-m|0;p=p+(h<<2)|0;g=g+(h<<1)|0;h=p+4|0;c[p+4>>2]=e;e=(d[140752+f>>0]|0)+-41|0;p=b[g>>1]|0;f=p+(b[66038+(e<<1)>>1]|0)|0;if(f>>>0<272?(a[139920+f>>0]|0)==(p|0):0){e=a[140192+f>>0]|0;k=q;break}e=a[140822+e>>0]|0;k=q}while(0);f=s;j=r;n=i;o=e;q=k;g=g+2|0}if((u|0)==26){rW();e=1;f=s;u=97}else if((u|0)==51){KW(140650);rW();e=1;f=s;u=97}else if((u|0)==56){KW(140701);rW();e=1;f=s;u=97}else if((u|0)==96){KW(140861);e=2;u=97}if((u|0)==97)if((f|0)!=(t|0))l6(f);l=v;return e|0}function qW(b,d){b=b|0;d=d|0;var e=0;e=HK(8)|0;a[e+4>>0]=d;c[e>>2]=b;return e|0}function rW(){var a=0,b=0;a=c[47473]|0;b=c[47471]|0;if(b|0){kU(b,1);c[47471]=0}c[14036]=67;while(1){if(!a)break;b=c[a+80>>2]|0;EW(a);a=b}c[14036]=56;c[14045]=68;b=c[47476]|0;eb[c[b>>2]&63](b,0,64)|0;c[14045]=56;c[14054]=69;b=c[47477]|0;eb[c[b>>2]&63](b,0,64)|0;c[14054]=56;HW();return}function sW(){var a=0,d=0,e=0,f=0,g=0,h=0;e=c[47477]|0;f=HK(40)|0;if(Uz(c[47476]|0)|0)uW(0);a=Uz(e)|0;b[f+4>>1]=a;a:do if(!a)a=e;else{c[f>>2]=HK(a*24|0)|0;a=0;d=eb[c[e>>2]&63](e,0,128)|0;while(1){if(!d){a=e;break a}g=(c[f>>2]|0)+(a*24|0)|0;h=d+8|0;c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];c[g+16>>2]=c[h+16>>2];c[g+20>>2]=c[h+20>>2];a=a+1|0;d=eb[c[e>>2]&63](e,d,8)|0}}while(0);eb[c[a>>2]&63](e,0,64)|0;return f|0}function tW(b){b=b|0;var d=0,e=0,f=0;e=HK(64)|0;f=b+4|0;d=c[f>>2]|0;if(d>>>0>=(c[b+8>>2]|0)>>>0){iA(b,1)|0;d=c[f>>2]|0}a[d>>0]=0;b=c[b>>2]|0;c[f>>2]=b;c[e+8>>2]=Y3(b)|0;c[e+12>>2]=c[c[47474]>>2];f=c[47476]|0;eb[c[f>>2]&63](f,e,1)|0;return}function uW(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=HK(32)|0;j=c[47476]|0;e=Uz(j)|0;k=i+8|0;a[i+14>>0]=d;a:do if(!e){c[k>>2]=HK(56)|0;b[i+12>>1]=1;h=Y3(195341)|0;k=c[k>>2]|0;c[k>>2]=h;c[k+4>>2]=c[c[47474]>>2]}else{b[i+12>>1]=e;c[k>>2]=HK(e*56|0)|0;d=0;e=Qz(j)|0;while(1){if(!e)break a;f=(c[k>>2]|0)+(d*56|0)|0;g=e+8|0;h=f+56|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));d=d+1|0;e=c[e>>2]|0}}while(0);eb[c[j>>2]&63](j,0,64)|0;k=c[47477]|0;eb[c[k>>2]&63](k,i,1)|0;return}function vW(a){a=a|0;var b=0,d=0.0,e=0,f=0,g=0,i=0,j=0;j=l;l=l+32|0;g=j;i=HK(8)|0;f=c[c[47474]>>2]|0;c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[g+12>>2]=c[a+12>>2];c[g+16>>2]=c[a+16>>2];c[g+20>>2]=c[a+20>>2];c[g+24>>2]=c[a+24>>2];c[g+28>>2]=c[a+28>>2];if(f|0){a=g+4|0;if((c[a>>2]|0)==0?(b=c[f+4>>2]|0,b|0):0)c[a>>2]=b;a=g+16|0;if(+h[a>>3]<0.0?(d=+h[f+16>>3],d>=0.0):0)h[a>>3]=d;if((c[g>>2]|0)==0?(e=c[f>>2]|0,e|0):0)c[g>>2]=e;a=c[f+24>>2]&127;if(a|0){f=g+24|0;e=c[f>>2]|0;c[f>>2]=e&127|a|e&-128}}f=c[(c[47475]|0)+144>>2]|0;c[i>>2]=eb[c[f>>2]&63](f,g,1)|0;c[i+4>>2]=c[47474];c[47474]=i;l=j;return}function wW(){var a=0,b=0;b=c[47474]|0;a=c[b+4>>2]|0;l6(b);c[47474]=a;return}function xW(b){b=b|0;var c=0;while(1){c=a[b>>0]|0;if(!(c<<24>>24)){b=0;break}if(c<<24>>24==32)b=b+1|0;else{b=1;break}}return b|0}function yW(){var b=0,d=0,e=0;e=Sz(56128,c[4590]|0)|0;b=c[47473]|0;d=HK(16)|0;c[d+8>>2]=e;if(a[b+112>>0]&2)a[d+12>>0]=1;e=c[b+84>>2]|0;eb[c[e>>2]&63](e,d,1)|0;return}function zW(){var a=0;a=c[(c[47473]|0)+84>>2]|0;return eb[c[a>>2]&63](a,0,256)|0}function AW(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=HK(16)|0;f=c[47473]|0;h=c[f+84>>2]|0;h=c[(eb[c[h>>2]&63](h,0,256)|0)+8>>2]|0;c[g+8>>2]=b;eb[c[h>>2]&63](h,g,1)|0;a[b+92>>0]=e;if(a[f+112>>0]&1)a[b+100>>0]=1;c[b+88>>2]=d;return}function BW(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function CW(a,b,d){a=a|0;b=b|0;d=d|0;Oz(c[b+8>>2]|0)|0;l6(b);return}function DW(a,b,d){a=a|0;b=b|0;d=d|0;IW(c[b+8>>2]|0);l6(b);return}function EW(a){a=a|0;Oz(c[a+84>>2]|0)|0;hU(a);l6(a);return}function FW(a,b,d){a=a|0;b=b|0;d=d|0;l6(c[b+8>>2]|0);l6(b);return}function GW(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=d+12|0;a=b[g>>1]|0;if(a<<16>>16){h=d+8|0;e=0;f=c[h>>2]|0;while(1){if((e|0)>=(a<<16>>16|0))break;l6(c[f>>2]|0);e=e+1|0;f=f+56|0;a=b[g>>1]|0}l6(c[h>>2]|0)}l6(d);return}function HW(){var a=0,b=0;a=c[47474]|0;while(1){b=c[a+4>>2]|0;if(!b)break;l6(a);a=b}return}function IW(b){b=b|0;var d=0;d=b+88|0;switch(a[b+92>>0]|0){case 1:{EW(c[d>>2]|0);break}case 2:{iU(c[d>>2]|0);break}default:{}}hU(b);l6(b);return}function JW(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+160|0;e=f+8|0;g=f;c[g>>2]=0;c[g+4>>2]=0;c[47474]=g;c[47473]=0;c[47471]=0;c[47475]=c[(c[(c[d+52>>2]|0)+16>>2]|0)+144>>2];c[47476]=Sz(56164,c[4590]|0)|0;c[47477]=Sz(56200,c[4590]|0)|0;hA(e,128,f+24|0);c[47472]=e;if(!(NW(a,e,d)|0)){pW()|0;c[b>>2]=DX()|0;a=c[47471]|0}else{c[b>>2]=2;a=0}Oz(c[47476]|0)|0;Oz(c[47477]|0)|0;c[47476]=0;c[47477]=0;c[47474]=0;lA(e);l=f;return a|0}function KW(b){b=b|0;var d=0,e=0,f=0;e=l;l=l+16|0;d=e;if(!(a[189945]|0)){a[189945]=1;f=LW()|0;c[d>>2]=b;c[d+4>>2]=f;dA(1,140878,d)|0;MW()}l=e;return}function LW(){return f_(c[47478]|0)|0}function MW(){var b=0,d=0,e=0,f=0;f=l;l=l+16|0;e=f;b=c[47481]|0;c[b+4>>2]=c[b>>2];d=c[47490]|0;if((d|0)>0){jA(b,c[47488]|0,d)|0;b=c[47481]|0}jA(b,c[47487]|0,c[47489]|0)|0;d=c[47481]|0;b=c[d+4>>2]|0;if(b>>>0>=(c[d+8>>2]|0)>>>0){iA(d,1)|0;b=c[47481]|0;d=b;b=c[b+4>>2]|0}c[d+4>>2]=b+1;a[b>>0]=0;b=c[47481]|0;d=c[b>>2]|0;c[b+4>>2]=d;c[e>>2]=d;dA(3,140894,e)|0;l=f;return}function NW(b,e,f){b=b|0;e=e|0;f=f|0;c[47481]=e;hA(189928,128,0);c[47479]=b;a[189947]=0;a[189944]=0;a[189945]=0;c[47489]=0;c[47490]=0;a[189946]=1;f=f+52|0;e=SY(uK(d[(c[(c[f>>2]|0)+16>>2]|0)+115>>0]|0)|0)|0;c[47478]=e;XZ(e,c[(c[(c[f>>2]|0)+16>>2]|0)+144>>2]|0);YZ(c[47478]|0,70,27);ZZ(c[47478]|0,71);return 0}function OW(b,d,e){b=b|0;d=d|0;e=e|0;do if(!(C3(d,140906)|0)){c[47470]=SW(e)|0;a[189946]=0;c[47480]=286}else{if(C3(d,140912)|0?C3(d,140915)|0:0){if(!(C3(d,140918)|0)){a[189946]=1;c[47470]=TW(e)|0;c[47480]=287;break}if(!(C3(d,140926)|0)){c[47470]=UW(b,e,0)|0;c[47480]=288;break}if(!(C3(d,140931)|0)){c[47470]=UW(b,0,1)|0;c[47480]=290;break}if(!(C3(d,140947)|0)){c[47470]=UW(b,0,32)|0;c[47480]=295;break}if(!(C3(d,140933)|0)){c[47470]=UW(b,0,4)|0;c[47480]=291;break}if(!(C3(d,140935)|0)){c[47470]=UW(b,0,64)|0;c[47480]=292;break}if(!(C3(d,140937)|0)){c[47470]=UW(b,0,2)|0;c[47480]=289;break}if(!(C3(d,140939)|0)){c[47470]=UW(b,0,8)|0;c[47480]=293;break}if(!(C3(d,140943)|0)){c[47470]=UW(b,0,16)|0;c[47480]=294;break}if(!(C3(d,140949)|0)){VW(e);c[47480]=283;break}if(!(C3(d,140952)|0)){c[47480]=277;break}if(!(C3(d,140955)|0)){c[47480]=280;break}if(!(C3(d,140958)|0)){c[47470]=WW(e)|0;c[47480]=285;break}if(!(C3(d,140921)|0)){c[47480]=262;break}else{RW(d);break}}a[189946]=0;c[47480]=260}while(0);return}function PW(b,d){b=b|0;d=d|0;do if(!(C3(d,140906)|0)){c[47480]=264;a[189946]=1}else{if(C3(d,140912)|0?C3(d,140915)|0:0){if(!(C3(d,140918)|0)){c[47480]=265;a[189946]=0;break}if(!(C3(d,140921)|0)){c[47480]=263;break}if(!(C3(d,140926)|0)){c[47480]=266;break}if(!(C3(d,140931)|0)){c[47480]=270;break}if(!(C3(d,140933)|0)){c[47480]=271;break}if(!(C3(d,140935)|0)){c[47480]=272;break}if(!(C3(d,140937)|0)){c[47480]=269;break}if(!(C3(d,140939)|0)){c[47480]=273;break}if(!(C3(d,140943)|0)){c[47480]=274;break}if(!(C3(d,140947)|0)){c[47480]=275;break}if(!(C3(d,140949)|0)){c[47480]=(c[47480]|0)==283?282:258;break}if(!(C3(d,140952)|0)){c[47480]=(c[47480]|0)==277?276:278;break}if(!(C3(d,140955)|0)){c[47480]=(c[47480]|0)==280?279:281;break}if(!(C3(d,140958)|0)){c[47480]=(c[47480]|0)==285?284:259;break}else{RW(d);break}}c[47480]=261}while(0);return}function QW(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if(a[189946]|0){b=0;while(1){if(!e)break;h=d+1|0;g=a[d>>0]|0;if((g&255)>31){d=c[47481]|0;f=c[d+4>>2]|0;if(f>>>0>=(c[d+8>>2]|0)>>>0){iA(d,1)|0;f=c[47481]|0;d=f;f=c[f+4>>2]|0}c[d+4>>2]=f+1;a[f>>0]=g;b=b+1|0}d=h;e=e+-1|0}if(b|0)c[47480]=267}return}function RW(b){b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d;c[47480]=268;a[189945]=1;f=LW()|0;c[e>>2]=b;c[e+4>>2]=f;dA(1,140962,e)|0;l=d;return}function SW(b){b=b|0;var d=0;d=HK(120)|0;c[d+100>>2]=-1;a[d+88>>0]=-1;XW(d,56460,22,b,141914);return d|0}function TW(a){a=a|0;var c=0;c=HK(104)|0;b[c+80>>1]=1;b[c+82>>1]=1;XW(c,56284,22,a,141268);return c|0}function UW(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+32|0;e=f;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=0;c[e+28>>2]=0;h[e+16>>3]=-1.0;c[e+24>>2]=d&127;if(b|0)XW(e,56260,3,b,141119);d=c[a+144>>2]|0;e=eb[c[d>>2]&63](d,e,1)|0;l=f;return e|0}function VW(a){a=a|0;c[47470]=0;XW(189880,56252,1,a,141055);return}function WW(a){a=a|0;var b=0;b=HK(40)|0;XW(b,56236,2,a,141001);return b|0}function XW(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o;m=o+8|0;while(1){k=c[g>>2]|0;if(!k)break;i=c[g+4>>2]|0;c[m>>2]=k;j=e6(m,e,f,8,104)|0;if(!j){c[n>>2]=k;c[n+4>>2]=h;dA(0,141007,n)|0;i=1}else{i=vb[c[j+4>>2]&127](b,i)|0;i=(d[189944]|0|i)&255}a[189944]=i;g=g+8|0}l=o;return}function YW(a,b){a=a|0;b=b|0;return C3(c[a>>2]|0,c[b>>2]|0)|0}function ZW(a,b){a=a|0;b=b|0;c[a+36>>2]=Y3(b)|0;return 0}function _W(a,b){a=a|0;b=b|0;c[a+32>>2]=Y3(b)|0;return 0}function $W(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;e=(a2(a[d>>0]|0)|0)<<24>>24;f=d+1|0;switch(e|0){case 82:{if(!(C3(f,141066)|0)){c[b>>2]=114;b=0}else h=4;break}case 76:{h=5;break}default:h=4}do if((h|0)==4)if(!(C3(f,141071)|0))h=5;else{if((e|0)!=67?(C3(f,141075)|0)==0:0){c[g>>2]=d;dA(0,141081,g)|0;b=1;break}c[b>>2]=110;b=0}while(0);if((h|0)==5){c[b>>2]=108;b=0}l=i;return b|0}function aX(a,b){a=a|0;b=b|0;c[a+4>>2]=b;return 0}function bX(a,b){a=a|0;b=b|0;c[a>>2]=b;return 0}function cX(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+16|0;d=e;if(!(dX(b,141148,0,255,d)|0)){h[a+16>>3]=+(c[d>>2]|0);a=0}else a=1;l=e;return a|0}function dX(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+48|0;j=k+24|0;i=k+8|0;h=k;m=k+36|0;g=$1(a,m,10)|0;do if((c[m>>2]|0)!=(a|0)){if((g|0)>(e|0)){c[i>>2]=b;c[i+4>>2]=a;c[i+8>>2]=e;dA(0,141190,i)|0;a=1;break}if((g|0)<(d|0)){c[j>>2]=b;c[j+4>>2]=a;c[j+8>>2]=d;dA(0,141229,j)|0;a=1;break}else{c[f>>2]=g;a=0;break}}else{c[h>>2]=b;c[h+4>>2]=a;dA(0,141159,h)|0;a=1}while(0);l=k;return a|0}function eX(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=e+1|0;d=d+36|0;switch((a2(a[e>>0]|0)|0)<<24>>24|0){case 76:{if(!(C3(f,141071)|0)){b[d>>1]=b[d>>1]|4;d=0}else h=9;break}case 82:{if(!(C3(f,141066)|0)){b[d>>1]=b[d>>1]|2;d=0}else h=9;break}case 84:{if(!(C3(f,141866)|0)){b[d>>1]=b[d>>1]|6;d=0}else h=9;break}case 67:{if(!(C3(f,141075)|0))d=0;else h=9;break}default:h=9}if((h|0)==9){c[g>>2]=e;dA(0,141870,g)|0;d=1}l=i;return d|0}function fX(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=e+1|0;d=d+36|0;switch((a2(a[e>>0]|0)|0)<<24>>24|0){case 76:{if(!(C3(f,141071)|0)){b[d>>1]=b[d>>1]|512;d=0}else h=7;break}case 82:{if(!(C3(f,141066)|0)){b[d>>1]=b[d>>1]|256;d=0}else h=7;break}case 67:{if(!(C3(f,141075)|0))d=0;else h=7;break}default:h=7}if((h|0)==7){c[g>>2]=e;dA(0,141821,g)|0;d=1}l=i;return d|0}function gX(a,b){a=a|0;b=b|0;c[a+20>>2]=Y3(b)|0;return 0}function hX(d,e){d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if(!(dX(e,141814,0,255,f)|0)){a[d+33>>0]=c[f>>2];d=d+36|0;b[d>>1]=b[d>>1]|32;d=0}else d=1;l=g;return d|0}function iX(d,e){d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if(!(dX(e,141802,0,255,f)|0)){a[d+34>>0]=c[f>>2];d=d+36|0;b[d>>1]=b[d>>1]|64;d=0}else d=1;l=g;return d|0}function jX(d,e){d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if(!(dX(e,141790,-128,127,f)|0)){a[d+32>>0]=c[f>>2];d=d+36|0;b[d>>1]=b[d>>1]|128;d=0}else d=1;l=g;return d|0}function kX(a,b){a=a|0;b=b|0;c[a+24>>2]=Y3(b)|0;return 0}function lX(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;e=g+4|0;do if(!(dX(d,141745,0,65535,e)|0)){d=c[e>>2]|0;if(!d){dA(0,141753,f)|0;d=1;break}else{b[a+80>>1]=d;d=0;break}}else d=1;while(0);l=g;return d|0}function mX(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=e+1|0;switch((a2(d[e>>0]|0)|0)<<24>>24|0){case 84:{if(!(C3(f,141694)|0)){a=a+36|0;b[a>>1]=b[a>>1]|1;a=0}else h=5;break}case 70:{if(!(C3(f,141698)|0))a=0;else h=5;break}default:h=5}if((h|0)==5){c[g>>2]=e;dA(0,141703,g)|0;a=1}l=i;return a|0}function nX(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+16|0;d=e;if(!(dX(b,141680,0,360,d)|0)){c[a+28>>2]=c[d>>2]&65535;a=0}else a=1;l=e;return a|0}function oX(a,d){a=a|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if(!(dX(d,141673,0,65535,e)|0)){b[a+40>>1]=c[e>>2];a=0}else a=1;l=f;return a|0}function pX(a,b){a=a|0;b=b|0;c[a>>2]=Y3(b)|0;return 0}function qX(a,b){a=a|0;b=b|0;c[a+16>>2]=Y3(b)|0;return 0}function rX(a,b){a=a|0;b=b|0;c[a+4>>2]=Y3(b)|0;return 0}function sX(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;e=g+4|0;do if(!(dX(d,141628,0,65535,e)|0)){d=c[e>>2]|0;if(!d){dA(0,141636,f)|0;d=1;break}else{b[a+82>>1]=d;d=0;break}}else d=1;while(0);l=g;return d|0}function tX(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;i=k;h=0;a:while(1){b:while(1){g=e+1|0;e=a[e>>0]|0;if(!(e<<24>>24))break a;e=e<<24>>24;f=(R1(e)|0)+-98|0;switch(f>>>1|f<<31|0){case 5:{j=5;break b}case 9:{f=2048;break b}case 8:{j=6;break b}case 0:{j=7;break b}default:{}}c[i>>2]=e;c[i+4>>2]=e;dA(0,141575,i)|0;e=g}if((j|0)==5){j=0;f=1024}else if((j|0)==6){j=0;f=4096}else if((j|0)==7){j=0;f=8192}e=g;h=(h&65535|f)&65535}if(h<<16>>16!=15360){j=d+36|0;b[j>>1]=b[j>>1]|h}l=k;return 0}function uX(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;i=k;h=Y3(e)|0;g=d+42|0;f=0;e=h;while(1){d=i6(e,141485)|0;if(!d)break;if(((a2(a[d>>0]|0)|0)&255|0)==82){e=d+1|0;if(!(C3(e,141488)|0)){b[g>>1]=b[g>>1]|4;d=f;e=0;f=d;continue}if(!(C3(e,141495)|0)){b[g>>1]=b[g>>1]|2;d=f;e=0;f=d;continue}else{c[i>>2]=d;dA(0,141501,i)|0;f=1;e=0;continue}}if(!(C3(d,141539)|0)){b[g>>1]=b[g>>1]&-385;d=f;e=0;f=d;continue}if(C3(d,141545)|0?C3(d,141555)|0:0){if(!(C3(d,141561)|0)){b[g>>1]=b[g>>1]|128;d=f;e=0;f=d;continue}if(!(C3(d,141568)|0)){b[g>>1]=b[g>>1]|256;d=f;e=0;f=d;continue}else{c[j>>2]=d;dA(0,141501,j)|0;f=1;e=0;continue}}b[g>>1]=b[g>>1]|32;d=f;e=0;f=d}l6(h);l=k;return f|0}function vX(a,b){a=a|0;b=b|0;c[a+8>>2]=Y3(b)|0;return 0}function wX(a,b){a=a|0;b=b|0;c[a+12>>2]=Y3(b)|0;return 0}function xX(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=e+1|0;d=d+36|0;switch((a2(a[e>>0]|0)|0)<<24>>24|0){case 66:{if(!(C3(f,141431)|0)){b[d>>1]=b[d>>1]|16;d=0}else h=7;break}case 84:{if(!(C3(f,141437)|0)){b[d>>1]=b[d>>1]|8;d=0}else h=7;break}case 77:{if(!(C3(f,141440)|0))d=0;else h=7;break}default:h=7}if((h|0)==7){c[g>>2]=e;dA(0,141446,g)|0;d=1}l=i;return d|0}function yX(a,d){a=a|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if(!(dX(d,141425,0,65535,e)|0)){b[a+38>>1]=c[e>>2];a=0}else a=1;l=f;return a|0}function zX(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=e+1|0;d=d+36|0;switch((a2(a[e>>0]|0)|0)<<24>>24|0){case 76:{if(!(C3(f,141071)|0)){b[d>>1]=b[d>>1]|4;d=0}else h=7;break}case 82:{if(!(C3(f,141066)|0)){b[d>>1]=b[d>>1]|2;d=0}else h=7;break}case 67:{if(!(C3(f,141075)|0))d=0;else h=7;break}default:h=7}if((h|0)==7){c[g>>2]=e;dA(0,141081,g)|0;d=1}l=i;return d|0}function AX(b,d){b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if(!(dX(d,142023,0,127,e)|0)){a[b+88>>0]=c[e>>2];b=0}else b=1;l=f;return b|0}function BX(b,d){b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if((a[d>>0]|0)==42){b=b+112|0;a[b>>0]=a[b>>0]|1;b=0}else{c[e>>2]=d;dA(0,141983,e)|0;b=1}l=f;return b|0}function CX(b,d){b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if((a[d>>0]|0)==42){b=b+112|0;a[b>>0]=a[b>>0]|2;b=0}else{c[e>>2]=d;dA(0,141946,e)|0;b=1}l=f;return b|0}function DX(){var b=0;b=(a[189945]|a[189944])<<24>>24;YY(c[47478]|0);lA(189928);return b|0}function EX(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j;c[47480]=0;d=0;a:do{b:do switch(a[189947]|0){case 2:{b=-1;break a}case 0:{a[189947]=1;h=6;b=142035;d=0;break}default:{b=c[47479]|0;if(!(a[b>>0]|0)){a[189947]=2;h=7;b=142042;break b}else{d=FX(b)|0;h=d-b|0;break b}}}while(0);c[47488]=c[47487];c[47490]=c[47489];c[47487]=b;c[47489]=h;e=c[47483]|0;f=e-(c[47482]|0)|0;g=c[47478]|0;if(!f)b=_Z(g,b,h,(h|0)==0&1)|0;else{if(e>>>0<(c[47484]|0)>>>0)b=e;else{iA(189928,1)|0;b=c[47483]|0}a[b>>0]=0;b=c[47482]|0;c[47483]=b;b=_Z(g,b,f,0)|0}if(!((b|0)!=0|(a[189945]|0)!=0)){g=g_(e_(c[47478]|0)|0)|0;h=LW()|0;c[i>>2]=g;c[i+4>>2]=h;dA(1,140878,i)|0;MW();a[189945]=1;c[47480]=268}if(d|0)c[47479]=d;b=c[47480]|0}while((b|0)==0);l=j;return b|0}function FX(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;d=b+1|0;f=a[b>>0]|0;a:do if(f<<24>>24==60){e=a[d>>0]|0;if(e<<24>>24==33)if(!(h2(b+2|0,142050,2)|0)){e=GX(b+4|0)|0;d=e;e=a[e>>0]|0}else{e=33;h=5}else h=5;b:do if((h|0)==5)while(1){switch(e<<24>>24){case 62:case 0:break b;default:{}}e=d+1|0;d=e;e=a[e>>0]|0;h=5}while(0);if(e<<24>>24==62){d=d+1|0;break}else{dA(0,142053,g)|0;a[189944]=1;break}}else{d=b;while(1){switch(f<<24>>24){case 60:case 0:break a;default:{}}e=d+1|0;if(f<<24>>24==38?(a[e>>0]|0)!=35:0)e=ZP(e,189928)|0;else{d=c[47483]|0;if(d>>>0>=(c[47484]|0)>>>0){iA(189928,1)|0;d=c[47483]|0}c[47483]=d+1;a[d>>0]=f}d=e;f=a[e>>0]|0}}while(0);l=i;return d|0}function GX(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j;f=1;c=b;a:while(1){e=(f|0)==0;d=c;b:while(1){if(e)break a;g=d+1|0;switch(a[d>>0]|0){case 0:{c=g;break a}case 60:{h=5;break b}case 62:{c=-1;break b}default:d=g}}if((h|0)==5){h=0;c=1}f=f+c|0;c=g}d=c+-1|0;do if(a[d>>0]|0){c=c+-3|0;if(c>>>0>=b>>>0?(h2(c,142050,2)|0)==0:0)break;dA(0,142094,i)|0;a[189944]=1}while(0);l=j;return d|0}function HX(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=k6(28)|0;if(!d)d=0;else{e=0;f=0;while(1){if((e|0)>=(b|0))break;r=(c[(c[a+(e<<2)>>2]|0)+4>>2]|0)+f|0;e=e+1|0;f=r}o=d+8|0;c[o>>2]=IX(f<<4)|0;p=d+12|0;c[p>>2]=IX((b<<2)+4|0)|0;e=f<<2;q=d+16|0;c[q>>2]=IX(e)|0;e=IX(e)|0;r=d+20|0;c[r>>2]=e;c[d+4>>2]=f;c[d>>2]=b;f=0;h=0;while(1){c[(c[p>>2]|0)+(h<<2)>>2]=f;if((h|0)>=(b|0))break;j=a+(h<<2)|0;n=c[j>>2]|0;k=c[n+4>>2]|0;l=f+-1|0;g=0;i=f;m=k;while(1){if((g|0)>=(m|0))break;m=(c[o>>2]|0)+(i<<4)|0;e=(c[n>>2]|0)+(g<<4)|0;c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];m=i+1|0;c[(c[q>>2]|0)+(i<<2)>>2]=m;e=c[r>>2]|0;c[e+(i<<2)>>2]=i+-1;s=c[j>>2]|0;g=g+1|0;i=m;m=c[s+4>>2]|0;n=s}s=l+k|0;c[(c[q>>2]|0)+(s<<2)>>2]=f;c[e+(f<<2)>>2]=s;f=i;h=h+1|0}IY(d)}return d|0}function IX(a){a=a|0;if(!a)a=0;else a=k6(a)|0;return a|0}function JX(a){a=a|0;var b=0,d=0;l6(c[a+8>>2]|0);l6(c[a+12>>2]|0);l6(c[a+16>>2]|0);l6(c[a+20>>2]|0);d=a+24|0;b=c[d>>2]|0;if(b|0){l6(c[b>>2]|0);l6(c[d>>2]|0)}l6(a);return}function KX(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+32|0;m=p+16|0;j=p;c[m>>2]=c[b>>2];c[m+4>>2]=c[b+4>>2];c[m+8>>2]=c[b+8>>2];c[m+12>>2]=c[b+12>>2];n=PY(a,d,m)|0;c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];o=PY(a,f,m)|0;c[j>>2]=c[b>>2];c[j+4>>2]=c[b+4>>2];c[j+8>>2]=c[b+8>>2];c[j+12>>2]=c[b+12>>2];c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];m=yY(j,d,n,m,f,o,a)|0;d=c[a+4>>2]|0;j=d+1|0;f=1;h=d;while(1){h=c[m+(h<<2)>>2]|0;k=f+1|0;if((h|0)==(j|0))break;else f=k}i=k6(k<<4)|0;h=i+(f<<4)|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];a=a+8|0;while(1){d=c[m+(d<<2)>>2]|0;f=f+-1|0;h=i+(f<<4)|0;if((d|0)==(j|0))break;e=(c[a>>2]|0)+(d<<4)|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2]}c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];if(f|0)Aa(142112,142119,148,142125);if(n|0)l6(n);if(o|0)l6(o);c[g+4>>2]=k;c[g>>2]=i;l6(m);l=p;return 1}function LX(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;j=l;l=l+48|0;h=j+32|0;g=j+16|0;f=j;i=c[a>>2]|0;d=c[a+4>>2]|0;e=d+-1|0;a=0;while(1){if((a|0)>=(d|0)){a=1;break}m=i+(((e+a|0)%(d|0)|0)<<4)|0;k=i+(a<<4)|0;c[f>>2]=c[m>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2];c[f+12>>2]=c[m+12>>2];c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];if((EY(f,g,h)|0)==1){a=0;break}else a=a+1|0}l=j;return a|0}function MX(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+64|0;m=u+48|0;k=u+32|0;s=4;j=k6(40)|0;c[j>>2]=0;n=u+16|0;q=u;r=c[d>>2]|0;i=c[d+4>>2]|0;s=x6(189964,1,j|0,s|0)|0;j=D;o=0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,s|0,j|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1)d=D;else d=0;while(1){if(d|0){d=-1;break}o=0;c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];ha(28,n|0,m|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,s|0,j|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){d=D;continue};c[e>>2]=c[n>>2];c[e+4>>2]=c[n+4>>2];c[e+8>>2]=c[n+8>>2];c[e+12>>2]=c[n+12>>2];h=e+16|0;o=0;c[m>>2]=c[h>>2];c[m+4>>2]=c[h+4>>2];c[m+8>>2]=c[h+8>>2];c[m+12>>2]=c[h+12>>2];ha(28,q|0,m|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,s|0,j|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){d=D;continue};c[h>>2]=c[q>>2];c[h+4>>2]=c[q+4>>2];c[h+8>>2]=c[q+8>>2];c[h+12>>2]=c[q+12>>2];c[47530]=0;o=0;$(115,4);d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,s|0,j|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){d=D;continue}g=c[47531]|0;d=c[47530]|0;c[47530]=d+1;d=g+(d<<4)|0;c[d>>2]=c[r>>2];c[d+4>>2]=c[r+4>>2];c[d+8>>2]=c[r+8>>2];c[d+12>>2]=c[r+12>>2];o=0;c[k>>2]=c[e>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];c[m>>2]=c[h>>2];c[m+4>>2]=c[h+4>>2];c[m+8>>2]=c[h+8>>2];c[m+12>>2]=c[h+12>>2];d=ia(1,a|0,b|0,r|0,i|0,k|0,m|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,s|0,j|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1)d=D;else{t=8;break}}if((t|0)==8)if((d|0)==-1)d=-1;else{c[f+4>>2]=c[47530];c[f>>2]=c[47531];d=0}l6(s|0);l=u;return d|0}function NX(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,g=0.0;d=+h[b>>3];e=b+8|0;f=+h[e>>3];g=d*d+f*f;if(g>1.0e-06){g=+G(+g);h[b>>3]=d/g;h[e>>3]=f/g};c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function OX(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g;if((c[47534]|0)<(a|0)){b=c[47531]|0;d=a<<4;if(!b){f=k6(d)|0;c[47531]=f;if(!f){f=c[15715]|0;c[e>>2]=142134;c[e+4>>2]=531;c[e+8>>2]=142269;z4(f,142142,e)|0;Ca(189964,1)}}else{e=n6(b,d)|0;c[47531]=e;if(!e){e=c[15715]|0;c[f>>2]=142134;c[f+4>>2]=537;c[f+8>>2]=142287;z4(e,142142,f)|0;Ca(189964,1)}}c[47534]=a}l=g;return}function PX(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0.0,V=0.0,W=0.0;R=l;l=l+336|0;J=R+320|0;I=R+304|0;w=R+144|0;q=R+128|0;G=R+112|0;H=R+96|0;Q=R+80|0;A=R+64|0;C=R+48|0;K=R+32|0;L=R+16|0;M=R;x=R+288|0;y=R+272|0;z=R+256|0;B=R+240|0;D=R+224|0;E=R+208|0;N=R+192|0;O=R+176|0;P=R+160|0;i=c[47533]|0;do if((c[47532]|0)<(e|0)){k=e*40|0;if(!i){i=k6(k)|0;c[47533]=i;if(!i){i=-1;break}}else{i=n6(i,k)|0;c[47533]=i;if(!i){i=-1;break}}c[47532]=e;n=6}else n=6;while(0);if((n|0)==6){h[i>>3]=0.0;k=1;j=0.0;while(1){if((k|0)>=(e|0))break;n=d+(k<<4)|0;F=d+(k+-1<<4)|0;c[I>>2]=c[n>>2];c[I+4>>2]=c[n+4>>2];c[I+8>>2]=c[n+8>>2];c[I+12>>2]=c[n+12>>2];c[J>>2]=c[F>>2];c[J+4>>2]=c[F+4>>2];c[J+8>>2]=c[F+8>>2];c[J+12>>2]=c[F+12>>2];v=j+ +QX(I,J);h[i+(k*40|0)>>3]=v;k=k+1|0;j=v}F=e+-1|0;n=i+(F*40|0)|0;k=1;while(1){if((k|0)>=(e|0))break;S=i+(k*40|0)|0;h[S>>3]=+h[S>>3]/+h[n>>3];k=k+1|0}k=0;while(1){if((k|0)>=(e|0))break;S=i+(k*40|0)+8|0;n=i+(k*40|0)|0;v=+RX(+h[n>>3]);c[J>>2]=c[f>>2];c[J+4>>2]=c[f+4>>2];c[J+8>>2]=c[f+8>>2];c[J+12>>2]=c[f+12>>2];SX(x,J,v);c[S>>2]=c[x>>2];c[S+4>>2]=c[x+4>>2];c[S+8>>2]=c[x+8>>2];c[S+12>>2]=c[x+12>>2];S=i+(k*40|0)+24|0;v=+TX(+h[n>>3]);c[J>>2]=c[g>>2];c[J+4>>2]=c[g+4>>2];c[J+8>>2]=c[g+8>>2];c[J+12>>2]=c[g+12>>2];SX(y,J,v);c[S>>2]=c[y>>2];c[S+4>>2]=c[y+4>>2];c[S+8>>2]=c[y+8>>2];c[S+12>>2]=c[y+12>>2];k=k+1|0}c[I>>2]=c[f>>2];c[I+4>>2]=c[f+4>>2];c[I+8>>2]=c[f+8>>2];c[I+12>>2]=c[f+12>>2];c[J>>2]=c[g>>2];c[J+4>>2]=c[g+4>>2];c[J+8>>2]=c[g+8>>2];c[J+12>>2]=c[g+12>>2];UX(d,e,i,I,J,G,A,H,C);c[q>>2]=c[G>>2];c[q+4>>2]=c[G+4>>2];c[q+8>>2]=c[G+8>>2];c[q+12>>2]=c[G+12>>2];c[w>>2]=c[A>>2];c[w+4>>2]=c[A+4>>2];c[w+8>>2]=c[A+8>>2];c[w+12>>2]=c[A+12>>2];c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];c[J>>2]=c[C>>2];c[J+4>>2]=c[C+4>>2];c[J+8>>2]=c[C+8>>2];c[J+12>>2]=c[C+12>>2];if(!(VX(a,b,q,w,I,J,d,e)|0)){c[J>>2]=c[A>>2];c[J+4>>2]=c[A+4>>2];c[J+8>>2]=c[A+8>>2];c[J+12>>2]=c[A+12>>2];SX(z,J,.3333333333333333);c[I>>2]=c[G>>2];c[I+4>>2]=c[G+4>>2];c[I+8>>2]=c[G+8>>2];c[I+12>>2]=c[G+12>>2];c[J>>2]=c[z>>2];c[J+4>>2]=c[z+4>>2];c[J+8>>2]=c[z+8>>2];c[J+12>>2]=c[z+12>>2];WX(B,I,J);v=+h[B>>3];u=+h[B+8>>3];c[J>>2]=c[C>>2];c[J+4>>2]=c[C+4>>2];c[J+8>>2]=c[C+8>>2];c[J+12>>2]=c[C+12>>2];SX(D,J,.3333333333333333);c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];c[J>>2]=c[D>>2];c[J+4>>2]=c[D+4>>2];c[J+8>>2]=c[D+8>>2];c[J+12>>2]=c[D+12>>2];XX(E,I,J);t=+h[E>>3];p=+h[E+8>>3];q=c[47533]|0;r=+h[G>>3];s=+h[H>>3];o=+h[G+8>>3];m=+h[H+8>>3];n=Q+8|0;i=-1;j=-1.0;k=1;while(1){if((k|0)>=(F|0))break;W=+h[q+(k*40|0)>>3];T=+YX(W);U=+RX(W);V=+TX(W);W=+ZX(W);h[Q>>3]=T*r+v*U+t*V+W*s;h[n>>3]=W*m+(p*V+(u*U+T*o));S=d+(k<<4)|0;c[I>>2]=c[Q>>2];c[I+4>>2]=c[Q+4>>2];c[I+8>>2]=c[Q+8>>2];c[I+12>>2]=c[Q+12>>2];c[J>>2]=c[S>>2];c[J+4>>2]=c[S+4>>2];c[J+8>>2]=c[S+8>>2];c[J+12>>2]=c[S+12>>2];T=+QX(I,J);S=T>j;i=S?k:i;j=S?T:j;k=k+1|0}S=d+(i<<4)|0;Q=d+(i+-1<<4)|0;c[I>>2]=c[S>>2];c[I+4>>2]=c[S+4>>2];c[I+8>>2]=c[S+8>>2];c[I+12>>2]=c[S+12>>2];c[J>>2]=c[Q>>2];c[J+4>>2]=c[Q+4>>2];c[J+8>>2]=c[Q+8>>2];c[J+12>>2]=c[Q+12>>2];XX(N,I,J);c[J>>2]=c[N>>2];c[J+4>>2]=c[N+4>>2];c[J+8>>2]=c[N+8>>2];c[J+12>>2]=c[N+12>>2];NX(L,J);Q=i+1|0;N=d+(Q<<4)|0;c[I>>2]=c[N>>2];c[I+4>>2]=c[N+4>>2];c[I+8>>2]=c[N+8>>2];c[I+12>>2]=c[N+12>>2];c[J>>2]=c[S>>2];c[J+4>>2]=c[S+4>>2];c[J+8>>2]=c[S+8>>2];c[J+12>>2]=c[S+12>>2];XX(O,I,J);c[J>>2]=c[O>>2];c[J+4>>2]=c[O+4>>2];c[J+8>>2]=c[O+8>>2];c[J+12>>2]=c[O+12>>2];NX(M,J);c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[J>>2]=c[M>>2];c[J+4>>2]=c[M+4>>2];c[J+8>>2]=c[M+8>>2];c[J+12>>2]=c[M+12>>2];WX(P,I,J);c[J>>2]=c[P>>2];c[J+4>>2]=c[P+4>>2];c[J+8>>2]=c[P+8>>2];c[J+12>>2]=c[P+12>>2];NX(K,J);c[I>>2]=c[f>>2];c[I+4>>2]=c[f+4>>2];c[I+8>>2]=c[f+8>>2];c[I+12>>2]=c[f+12>>2];c[J>>2]=c[K>>2];c[J+4>>2]=c[K+4>>2];c[J+8>>2]=c[K+8>>2];c[J+12>>2]=c[K+12>>2];PX(a,b,d,Q,I,J)|0;c[I>>2]=c[K>>2];c[I+4>>2]=c[K+4>>2];c[I+8>>2]=c[K+8>>2];c[I+12>>2]=c[K+12>>2];c[J>>2]=c[g>>2];c[J+4>>2]=c[g+4>>2];c[J+8>>2]=c[g+8>>2];c[J+12>>2]=c[g+12>>2];PX(a,b,S,e-i|0,I,J)|0;i=0}else i=0}l=R;return i|0}function QX(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[b>>3]-+h[a>>3];c=+h[b+8>>3]-+h[a+8>>3];return +(+G(+(d*d+c*c)))}function RX(a){a=+a;var b=0.0;b=1.0-a;return +(b*(a*3.0*b))}function SX(a,b,d){a=a|0;b=b|0;d=+d;var e=0;h[b>>3]=+h[b>>3]*d;e=b+8|0;h[e>>3]=+h[e>>3]*d;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function TX(a){a=+a;return +((1.0-a)*(a*3.0*a))}function UX(a,b,d,e,f,g,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;var m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0,K=0,L=0,M=0;G=l;l=l+128|0;B=G+112|0;v=G+96|0;u=G;r=G+80|0;s=G+64|0;t=G+48|0;C=G+32|0;D=G+16|0;E=a+(b+-1<<4)|0;q=0;w=0.0;x=0.0;y=0.0;z=0.0;A=0.0;while(1){if((q|0)>=(b|0))break;K=d+(q*40|0)+8|0;c[v>>2]=c[K>>2];c[v+4>>2]=c[K+4>>2];c[v+8>>2]=c[K+8>>2];c[v+12>>2]=c[K+12>>2];c[B>>2]=c[K>>2];c[B+4>>2]=c[K+4>>2];c[B+8>>2]=c[K+8>>2];c[B+12>>2]=c[K+12>>2];H=x+ +dY(v,B);J=d+(q*40|0)+24|0;c[v>>2]=c[K>>2];c[v+4>>2]=c[K+4>>2];c[v+8>>2]=c[K+8>>2];c[v+12>>2]=c[K+12>>2];c[B>>2]=c[J>>2];c[B+4>>2]=c[J+4>>2];c[B+8>>2]=c[J+8>>2];c[B+12>>2]=c[J+12>>2];p=A+ +dY(v,B);c[v>>2]=c[J>>2];c[v+4>>2]=c[J+4>>2];c[v+8>>2]=c[J+8>>2];c[v+12>>2]=c[J+12>>2];c[B>>2]=c[J>>2];c[B+4>>2]=c[J+4>>2];c[B+8>>2]=c[J+8>>2];c[B+12>>2]=c[J+12>>2];o=y+ +dY(v,B);L=a+(q<<4)|0;M=d+(q*40|0)|0;I=+eY(+h[M>>3]);c[B>>2]=c[a>>2];c[B+4>>2]=c[a+4>>2];c[B+8>>2]=c[a+8>>2];c[B+12>>2]=c[a+12>>2];SX(s,B,I);I=+fY(+h[M>>3]);c[B>>2]=c[E>>2];c[B+4>>2]=c[E+4>>2];c[B+8>>2]=c[E+8>>2];c[B+12>>2]=c[E+12>>2];SX(t,B,I);c[v>>2]=c[s>>2];c[v+4>>2]=c[s+4>>2];c[v+8>>2]=c[s+8>>2];c[v+12>>2]=c[s+12>>2];c[B>>2]=c[t>>2];c[B+4>>2]=c[t+4>>2];c[B+8>>2]=c[t+8>>2];c[B+12>>2]=c[t+12>>2];WX(r,v,B);c[v>>2]=c[L>>2];c[v+4>>2]=c[L+4>>2];c[v+8>>2]=c[L+8>>2];c[v+12>>2]=c[L+12>>2];c[B>>2]=c[r>>2];c[B+4>>2]=c[r+4>>2];c[B+8>>2]=c[r+8>>2];c[B+12>>2]=c[r+12>>2];XX(u,v,B);c[v>>2]=c[K>>2];c[v+4>>2]=c[K+4>>2];c[v+8>>2]=c[K+8>>2];c[v+12>>2]=c[K+12>>2];c[B>>2]=c[u>>2];c[B+4>>2]=c[u+4>>2];c[B+8>>2]=c[u+8>>2];c[B+12>>2]=c[u+12>>2];I=w+ +dY(v,B);c[v>>2]=c[J>>2];c[v+4>>2]=c[J+4>>2];c[v+8>>2]=c[J+8>>2];c[v+12>>2]=c[J+12>>2];c[B>>2]=c[u>>2];c[B+4>>2]=c[u+4>>2];c[B+8>>2]=c[u+8>>2];c[B+12>>2]=c[u+12>>2];q=q+1|0;w=I;x=H;y=o;z=z+ +dY(v,B);A=p}o=x*y-A*A;p=o>=0.0?o:-o;if(!(p>=1.0e-06?(m=(w*y-z*A)/o,n=(z*x-w*A)/o,!(n<=0.0|(m<=0.0|p<1.0e-06))):0))F=6;if((F|0)==6){c[v>>2]=c[a>>2];c[v+4>>2]=c[a+4>>2];c[v+8>>2]=c[a+8>>2];c[v+12>>2]=c[a+12>>2];c[B>>2]=c[E>>2];c[B+4>>2]=c[E+4>>2];c[B+8>>2]=c[E+8>>2];c[B+12>>2]=c[E+12>>2];m=+QX(v,B)/3.0;n=m};c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[g+12>>2]=c[a+12>>2];c[B>>2]=c[e>>2];c[B+4>>2]=c[e+4>>2];c[B+8>>2]=c[e+8>>2];c[B+12>>2]=c[e+12>>2];SX(C,B,m);c[i>>2]=c[C>>2];c[i+4>>2]=c[C+4>>2];c[i+8>>2]=c[C+8>>2];c[i+12>>2]=c[C+12>>2];c[j>>2]=c[E>>2];c[j+4>>2]=c[E+4>>2];c[j+8>>2]=c[E+8>>2];c[j+12>>2]=c[E+12>>2];c[B>>2]=c[f>>2];c[B+4>>2]=c[f+4>>2];c[B+8>>2]=c[f+8>>2];c[B+12>>2]=c[f+12>>2];SX(D,B,n);c[k>>2]=c[D>>2];c[k+4>>2]=c[D+4>>2];c[k+8>>2]=c[D+8>>2];c[k+12>>2]=c[D+12>>2];l=G;return}function VX(a,b,d,e,f,g,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0.0,v=0,w=0.0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0.0,E=0;C=l;l=l+64|0;B=C;z=(j|0)==2;y=+h[d>>3];u=+h[d+8>>3];v=B+8|0;w=+h[e>>3];x=B+16|0;p=+h[e+8>>3];q=B+24|0;r=+h[f>>3];s=+h[g>>3];t=B+32|0;o=+h[f+8>>3];n=+h[g+8>>3];e=B+40|0;f=B+48|0;g=B+56|0;d=1;k=4.0;m=4.0;while(1){h[B>>3]=y;h[v>>3]=u;h[x>>3]=y+m*w/3.0;h[q>>3]=u+m*p/3.0;h[t>>3]=r-k*s/3.0;h[e>>3]=o-k*n/3.0;h[f>>3]=r;h[g>>3]=o;if(d?(D=+_X(B,4),D<+_X(i,j)+-.001):0){d=0;break}if($X(a,b,B)|0){A=5;break}if(m==0.0&k==0.0){A=9;break}E=m>.01;d=0;k=E?k*.5:0.0;m=E?m*.5:0.0}a:do if((A|0)==5){OX((c[47530]|0)+4|0);e=c[47531]|0;d=1;while(1){if((d|0)==4){d=1;break a}E=c[47530]|0;h[e+(E<<4)>>3]=+h[B+(d<<4)>>3];D=+h[B+(d<<4)+8>>3];c[47530]=E+1;h[e+(E<<4)+8>>3]=D;d=d+1|0}}else if((A|0)==9)if(z){OX((c[47530]|0)+4|0);e=c[47531]|0;d=1;while(1){if((d|0)==4){d=1;break a}E=c[47530]|0;h[e+(E<<4)>>3]=+h[B+(d<<4)>>3];D=+h[B+(d<<4)+8>>3];c[47530]=E+1;h[e+(E<<4)+8>>3]=D;d=d+1|0}}else d=0;while(0);l=C;return d|0}function WX(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;h[b>>3]=+h[d>>3]+ +h[b>>3];e=b+8|0;h[e>>3]=+h[d+8>>3]+ +h[e>>3];c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function XX(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;h[b>>3]=+h[b>>3]-+h[d>>3];e=b+8|0;h[e>>3]=+h[e>>3]-+h[d+8>>3];c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function YX(a){a=+a;a=1.0-a;return +(a*(a*a))}function ZX(a){a=+a;return +(a*a*a)}function _X(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0.0,f=0.0,g=0;c=0.0;d=1;while(1){if((d|0)>=(b|0))break;g=d+-1|0;f=+h[a+(d<<4)>>3]-+h[a+(g<<4)>>3];e=+h[a+(d<<4)+8>>3]-+h[a+(g<<4)+8>>3];c=c+ +G(+(f*f+e*e));d=d+1|0}return +c}function $X(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0.0,E=0.0;C=l;l=l+64|0;t=C+32|0;u=C;w=u+16|0;x=d+16|0;z=d+32|0;A=d+48|0;B=d+8|0;g=d+24|0;i=d+40|0;j=d+56|0;k=u+8|0;m=u+24|0;f=0;a:while(1){if((f|0)>=(b|0)){e=1;break}n=a+(f<<5)|0;c[u>>2]=c[n>>2];c[u+4>>2]=c[n+4>>2];c[u+8>>2]=c[n+8>>2];c[u+12>>2]=c[n+12>>2];n=a+(f<<5)+16|0;c[w>>2]=c[n>>2];c[w+4>>2]=c[n+4>>2];c[w+8>>2]=c[n+8>>2];c[w+12>>2]=c[n+12>>2];n=aY(d,u,t)|0;b:do if((n|0)!=4){o=+h[u>>3];p=+h[k>>3];q=+h[w>>3];r=+h[m>>3];e=0;while(1){if((e|0)>=(n|0))break b;s=+h[t+(e<<3)>>3];if((!(s<1.0e-06|s>.999999)?(y=s*(s*s),v=s*3.0,E=1.0-s,D=E*(s*v),s=E*(v*E),E=E*(E*E),v=E*+h[d>>3]+s*+h[x>>3]+D*+h[z>>3]+y*+h[A>>3],y=E*+h[B>>3]+s*+h[g>>3]+D*+h[i>>3]+y*+h[j>>3],D=v-o,s=y-p,!(D*D+s*s<.001)):0)?(D=v-q,E=y-r,!(D*D+E*E<.001)):0){e=0;break a}e=e+1|0}}while(0);f=f+1|0}l=C;return e|0}function aY(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0,o=0.0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=l;l=l+96|0;y=C+48|0;A=C+24|0;z=C;B=C+80|0;u=+h[b>>3];s=+h[b+16>>3]-u;t=+h[b+8>>3];o=+h[b+24>>3]-t;c[B>>2]=0;v=y+8|0;f=a+48|0;e=a+56|0;w=y+16|0;i=a+32|0;p=a+40|0;q=a+8|0;x=y+24|0;g=+h[a>>3];j=+h[f>>3];k=+h[i>>3];r=a+24|0;n=a+16|0;m=+h[n>>3];a:do if(!(s==0.0)){o=o/s;bY(+h[q>>3]-o*g,+h[r>>3]-o*m,+h[p>>3]-o*k,+h[e>>3]-o*j,y);h[y>>3]=u*o-t+ +h[y>>3];e=zY(y,A)|0;if((e|0)==4)b=4;else{b=0;while(1){if((b|0)>=(e|0))break;g=+h[A+(b<<3)>>3];if(g>=0.0&g<=1.0?(bY(+h[a>>3],+h[n>>3],+h[i>>3],+h[f>>3],y),t=(+h[y>>3]+g*(+h[v>>3]+g*(+h[w>>3]+g*+h[x>>3]))-u)/s,t>=0.0&t<=1.0):0)cY(g,d,B);b=b+1|0}b=c[B>>2]|0}}else{bY(g,m,k,j,y);h[y>>3]=+h[y>>3]-u;n=zY(y,A)|0;if(!(o==0.0)){if((n|0)==4){b=4;break}else b=0;while(1){if((b|0)>=(n|0))break;g=+h[A+(b<<3)>>3];if(g>=0.0&g<=1.0?(bY(+h[q>>3],+h[r>>3],+h[p>>3],+h[e>>3],y),u=(+h[y>>3]+g*(+h[v>>3]+g*(+h[w>>3]+g*+h[x>>3]))-t)/o,u>=0.0&u<=1.0):0)cY(g,d,B);b=b+1|0}b=c[B>>2]|0;break}bY(+h[q>>3],+h[r>>3],+h[p>>3],+h[e>>3],y);h[y>>3]=+h[y>>3]-t;i=zY(y,z)|0;b=(i|0)==4;b:do if((n|0)==4){if(b){b=4;break a}else b=0;while(1){if((b|0)>=(i|0))break b;cY(+h[z+(b<<3)>>3],d,B);b=b+1|0}}else{if(b){b=0;while(1){if((b|0)>=(n|0))break b;cY(+h[A+(b<<3)>>3],d,B);b=b+1|0}}else e=0;while(1){if((e|0)>=(n|0))break b;f=A+(e<<3)|0;b=0;while(1){if((b|0)>=(i|0))break;g=+h[f>>3];if(g==+h[z+(b<<3)>>3])cY(g,d,B);b=b+1|0}e=e+1|0}}while(0);b=c[B>>2]|0}while(0);l=C;return b|0}function bY(a,b,c,d,e){a=+a;b=+b;c=+c;d=+d;e=e|0;c=c*3.0;h[e+24>>3]=b*3.0+d-(c+a);h[e+16>>3]=a*3.0+c-b*6.0;h[e+8>>3]=(b-a)*3.0;h[e>>3]=a;return}function cY(a,b,d){a=+a;b=b|0;d=d|0;var e=0;if(a>=0.0&a<=1.0){e=c[d>>2]|0;h[b+(e<<3)>>3]=a;c[d>>2]=e+1}return}function dY(a,b){a=a|0;b=b|0;return +(+h[a>>3]*+h[b>>3]+ +h[a+8>>3]*+h[b+8>>3])}function eY(a){a=+a;var b=0.0;b=1.0-a;return +(b*b*(b+a*3.0))}function fY(a){a=+a;return +(a*a*((1.0-a)*3.0+a))}function gY(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0;J=l;l=l+112|0;G=J+80|0;F=J+64|0;E=J+48|0;I=4;H=k6(40)|0;c[H>>2]=0;x=J+32|0;y=J+16|0;z=J;A=J+96|0;I=x6(190140,1,H|0,I|0)|0;H=D;o=0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1)e=D;else e=0;a:while(1){if(e|0){e=-2;break}g=a+4|0;o=0;$(116,c[g>>2]|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}c[47574]=0;c[47575]=0;o=0;$(117,c[g>>2]<<1|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}n=(c[47577]|0)/2|0;c[47578]=n;c[47579]=n+-1;n=c[g>>2]|0;g=c[a>>2]|0;e=0;f=-1;i=t;while(1){if((e|0)>=(n|0))break;K=+h[g+(e<<4)>>3];w=i>K;v=w?e:f;e=e+1|0;f=v;i=w?K:i}m=g+(f<<4)|0;c[y>>2]=c[m>>2];c[y+4>>2]=c[m+4>>2];c[y+8>>2]=c[m+8>>2];c[y+12>>2]=c[m+12>>2];m=g+(((f|0)==0?n:f)+-1<<4)|0;c[x>>2]=c[m>>2];c[x+4>>2]=c[m+4>>2];c[x+8>>2]=c[m+8>>2];c[x+12>>2]=c[m+12>>2];m=n+-1|0;w=g+(((f|0)==(m|0)?0:f+1|0)<<4)|0;c[z>>2]=c[w>>2];c[z+4>>2]=c[w+4>>2];c[z+8>>2]=c[w+8>>2];c[z+12>>2]=c[w+12>>2];K=+h[y>>3];if((+h[x>>3]==K?K==+h[z>>3]:0)?+h[z+8>>3]>+h[y+8>>3]:0)w=15;else w=12;b:do if((w|0)==12){w=0;o=0;e=aa(39,x|0,y|0,z|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,I|0,H|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}if((e|0)==1){g=c[47581]|0;e=c[47582]|0;f=0;while(1){if((f|0)>=(n|0))break b;j=c[a>>2]|0;k=j+(f<<4)|0;if(!(((f|0)>0?(C=f+-1|0,+h[k>>3]==+h[j+(C<<4)>>3]):0)?+h[j+(f<<4)+8>>3]==+h[j+(C<<4)+8>>3]:0)){v=c[47574]|0;c[g+(v<<3)>>2]=k;c[g+(v<<3)+4>>2]=g+(((v|0)%(n|0)|0)<<3);c[e+(v<<2)>>2]=g+(v<<3);c[47574]=v+1}f=f+1|0}}else w=15}while(0);c:do if((w|0)==15){w=0;g=c[47581]|0;e=c[47582]|0;f=m;while(1){if((f|0)<=-1)break c;j=c[a>>2]|0;k=j+(f<<4)|0;if(!(((f|0)<(m|0)?(B=f+1|0,+h[k>>3]==+h[j+(B<<4)>>3]):0)?+h[j+(f<<4)+8>>3]==+h[j+(B<<4)+8>>3]:0)){v=c[47574]|0;c[g+(v<<3)>>2]=k;c[g+(v<<3)+4>>2]=g+(((v|0)%(n|0)|0)<<3);c[e+(v<<2)>>2]=g+(v<<3);c[47574]=v+1}f=f+-1|0}}while(0);o=0;ha(29,e|0,c[47574]|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}j=0;e=c[47575]|0;d:while(1){if((j|0)>=(e|0)){u=0;break}k=j+1|0;g=k;while(1){if((g|0)>=(e|0)){j=k;continue d}o=0;ha(30,j|0,g|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue a}g=g+1|0;e=c[47575]|0}}while(1){if((u|0)>=(e|0))break;o=0;f=ra(105,u|0,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){j=A6(c[g>>2]|0,I|0,H|0)|0;if(!j)Ca(g|0,p|0);D=p}else j=-1;if((j|0)==1){e=D;continue a}if(f|0)break;u=u+1|0}if((u|0)==(e|0)){e=c[15715]|0;o=0;c[E>>2]=142161;c[E+4>>2]=192;c[E+8>>2]=142172;aa(35,e|0,142142,E|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}else{w=42;break}}v=b+16|0;k=0;while(1){if((k|0)>=(e|0))break;o=0;f=ra(105,k|0,v|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){j=A6(c[g>>2]|0,I|0,H|0)|0;if(!j)Ca(g|0,p|0);D=p}else j=-1;if((j|0)==1){e=D;continue a}if(f|0)break;k=k+1|0}if((k|0)==(e|0)){e=c[15715]|0;o=0;c[F>>2]=142161;c[F+4>>2]=200;c[F+8>>2]=142205;aa(35,e|0,142142,F|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}else{w=49;break}}o=0;e=ra(106,u|0,k|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,I|0,H|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue}if(!e){e=c[15715]|0;o=0;c[G>>2]=142161;c[G+4>>2]=207;c[G+8>>2]=142243;aa(35,e|0,142142,G|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}o=0;$(118,2);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}else{w=54;break}}s=d+4|0;if((u|0)==(k|0)){o=0;$(118,2);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}else{w=57;break}}c[A>>2]=b;c[A+4>>2]=0;f=A+8|0;c[f>>2]=v;c[A+12>>2]=0;o=0;ha(31,1,A|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue}c[47580]=c[47578];q=u;e:while(1){if((q|0)==-1){g=f;e=0;break}r=c[47584]|0;c[r+(q*52|0)>>2]=2;g=0;while(1){j=g+1|0;if((g|0)>=3){w=65;break}e=c[r+(q*52|0)+4+(g<<4)+12>>2]|0;if(!e){g=j;continue}if((c[e>>2]|0)==1){w=68;break}else g=j}if((w|0)==65){w=0;if((g|0)==3){e=c[47576]|0;k=c[e+(c[47579]<<2)>>2]|0;o=0;e=aa(39,v|0,c[c[e+(c[47578]<<2)>>2]>>2]|0,c[k>>2]|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){j=A6(c[g>>2]|0,I|0,H|0)|0;if(!j)Ca(g|0,p|0);D=p}else j=-1;if((j|0)==1){e=D;continue a}j=(e|0)==1;n=j?f:k;j=j?k:f}else w=68}if((w|0)==68){w=0;m=c[r+(q*52|0)+4+(g<<4)>>2]|0;k=c[r+(q*52|0)+4+(g<<4)+4>>2]|0;o=0;e=aa(39,c[m>>2]|0,c[c[r+(q*52|0)+4+(((j|0)%3|0)<<4)+4>>2]>>2]|0,c[k>>2]|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){j=A6(c[g>>2]|0,I|0,H|0)|0;if(!j)Ca(g|0,p|0);D=p}else j=-1;if((j|0)==1){e=D;continue a}j=(e|0)==1;n=j?m:k;j=j?k:m}do if((q|0)==(u|0)){o=0;ha(31,2,j|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}o=0;ha(31,1,n|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}e=0}else{m=c[47576]|0;if((c[m+(c[47578]<<2)>>2]|0)!=(n|0)?(c[m+(c[47579]<<2)>>2]|0)!=(n|0):0){o=0;j=la(34,n|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}o=0;ha(32,2,j|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}o=0;ha(31,1,n|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}if((j|0)<=(c[47580]|0)){e=0;break}c[47580]=j;e=0;break}o=0;k=la(34,j|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}o=0;ha(32,1,k|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}o=0;ha(31,2,j|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}if((k|0)>=(c[47580]|0)){e=0;break}c[47580]=k;e=0}while(0);while(1){if((e|0)>=3){q=-1;continue e}g=c[r+(q*52|0)+4+(e<<4)+12>>2]|0;if(g|0?(c[g>>2]|0)==1:0)break;e=e+1|0}q=(g-(c[47584]|0)|0)/52|0}while(1){if(!g)break;g=c[g+4>>2]|0;e=e+1|0}o=0;$(118,e|0);g=o;o=0;if((g|0)!=0&(p|0)!=0){j=A6(c[g>>2]|0,I|0,H|0)|0;if(!j)Ca(g|0,p|0);D=p}else j=-1;if((j|0)==1)e=D;else{w=94;break}}if((w|0)==42)e=-1;else if((w|0)==49)e=-1;else if((w|0)==54){c[d+4>>2]=2;e=c[47583]|0;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];H=e+16|0;c[H>>2]=c[v>>2];c[H+4>>2]=c[v+4>>2];c[H+8>>2]=c[v+8>>2];c[H+12>>2]=c[v+12>>2];c[d>>2]=e;e=0}else if((w|0)==57){c[s>>2]=2;e=c[47583]|0;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];H=e+16|0;c[H>>2]=c[v>>2];c[H+4>>2]=c[v+4>>2];c[H+8>>2]=c[v+8>>2];c[H+12>>2]=c[v+12>>2];c[d>>2]=e;e=0}else if((w|0)==94){c[s>>2]=e;g=c[47583]|0;while(1){e=e+-1|0;if(!f)break;H=g+(e<<4)|0;G=c[f>>2]|0;c[H>>2]=c[G>>2];c[H+4>>2]=c[G+4>>2];c[H+8>>2]=c[G+8>>2];c[H+12>>2]=c[G+12>>2];f=c[f+4>>2]|0}c[d>>2]=g;e=0}l6(I|0);l=J;return e|0}function hY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+64|0;g=j+48|0;i=j+32|0;h=j+16|0;f=j;if((c[47587]|0)<(a|0)){b=c[47581]|0;d=a<<3;e=a<<2;if(!b){i=k6(d)|0;c[47581]=i;if(!i){i=c[15715]|0;c[f>>2]=142161;c[f+4>>2]=523;c[f+8>>2]=142411;z4(i,142142,f)|0;Ca(190140,1)}i=k6(e)|0;c[47582]=i;if(!i){i=c[15715]|0;c[h>>2]=142161;c[h+4>>2]=527;c[h+8>>2]=142430;z4(i,142142,h)|0;Ca(190140,1)}}else{h=n6(b,d)|0;c[47581]=h;if(!h){h=c[15715]|0;c[i>>2]=142161;c[i+4>>2]=533;c[i+8>>2]=142450;z4(h,142142,i)|0;Ca(190140,1)}i=n6(c[47582]|0,e)|0;c[47582]=i;if(!i){i=c[15715]|0;c[g>>2]=142161;c[g+4>>2]=539;c[g+8>>2]=142470;z4(i,142142,g)|0;Ca(190140,1)}}c[47587]=a}l=j;return}function iY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g;if((c[47577]|0)<(a|0)){b=c[47576]|0;d=a<<2;if(!b){f=k6(d)|0;c[47576]=f;if(!f){f=c[15715]|0;c[e>>2]=142161;c[e+4>>2]=573;c[e+8>>2]=142366;z4(f,142142,e)|0;Ca(190140,1)}}else{e=n6(b,d)|0;c[47576]=e;if(!e){e=c[15715]|0;c[f>>2]=142161;c[f+4>>2]=580;c[f+8>>2]=142388;z4(e,142142,f)|0;Ca(190140,1)}}c[47577]=a}l=g;return}function jY(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0;e=+h[b+8>>3];d=+h[b>>3];d=(+h[a+8>>3]-e)*(+h[c>>3]-d)-(+h[c+8>>3]-e)*(+h[a>>3]-d);return (d>0.0?1:d<0.0?2:3)|0}function kY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;a:while(1){if((b|0)>3)e=0;else{b=9;break}while(1){if((e|0)>=(b|0)){b=8;break a}f=e+1|0;d=(f|0)%(b|0)|0;g=(e+2|0)%(b|0)|0;if(!(sY(e,g,a,b)|0))e=f;else break}tY(c[a+(e<<2)>>2]|0,c[a+(d<<2)>>2]|0,c[a+(g<<2)>>2]|0);b=b+-1|0;while(1){if((d|0)>=(b|0))continue a;g=d+1|0;c[a+(d<<2)>>2]=c[a+(g<<2)>>2];d=g}}if((b|0)==8){a=c[15715]|0;c[h>>2]=142161;c[h+4>>2]=324;c[h+8>>2]=142306;z4(a,142142,h)|0}else if((b|0)==9)tY(c[a>>2]|0,c[a+4>>2]|0,c[a+8>>2]|0);l=i;return}function lY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;h=c[47584]|0;i=h+(a*52|0)|0;j=h+(b*52|0)|0;e=0;while(1){if((e|0)==3)break;k=h+(a*52|0)+4+(e<<4)|0;l=h+(a*52|0)+4+(e<<4)+4|0;m=h+(a*52|0)+4+(e<<4)+12|0;d=0;while(1){if((d|0)==3)break;n=c[c[k>>2]>>2]|0;f=c[c[h+(b*52|0)+4+(d<<4)>>2]>>2]|0;g=c[c[h+(b*52|0)+4+(d<<4)+4>>2]>>2]|0;if((n|0)==(f|0)?(c[c[l>>2]>>2]|0)==(g|0):0)o=9;else o=7;if(((o|0)==7?(o=0,(n|0)==(g|0)):0)?(c[c[l>>2]>>2]|0)==(f|0):0)o=9;if((o|0)==9){c[m>>2]=j;c[h+(b*52|0)+4+(d<<4)+12>>2]=i}d=d+1|0}e=e+1|0}return}function mY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=c[47584]|0;d=0;e=0;while(1){if((e|0)==3)break;d=((jY(c[c[f+(a*52|0)+4+(e<<4)>>2]>>2]|0,c[c[f+(a*52|0)+4+(e<<4)+4>>2]>>2]|0,b)|0)!=2&1)+d|0;e=e+1|0}return ((d|0)==3|(d|0)==0)&1|0}function nY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[47584]|0;e=d+(a*52|0)|0;a:do if(!(c[e>>2]|0)){c[e>>2]=1;if((a|0)==(b|0))d=1;else{f=0;while(1){if((f|0)>=3)break;e=c[d+(a*52|0)+4+(f<<4)+12>>2]|0;if(e){if(nY((e-d|0)/52|0,b)|0){d=1;break a}d=c[47584]|0}f=f+1|0}c[d+(a*52|0)>>2]=0;d=0}}else d=0;while(0);return d|0}function oY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g;if((c[47585]|0)<(a|0)){b=c[47583]|0;d=a<<4;if(!b){f=k6(d)|0;c[47583]=f;if(!f){f=c[15715]|0;c[e>>2]=142161;c[e+4>>2]=593;c[e+8>>2]=142269;z4(f,142142,e)|0;Ca(190140,1)}}else{e=n6(b,d)|0;c[47583]=e;if(!e){e=c[15715]|0;c[f>>2]=142161;c[f+4>>2]=599;c[f+8>>2]=142287;z4(e,142142,f)|0;Ca(190140,1)}}c[47585]=a}l=g;return}function pY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=c[47579]|0;e=c[47578]|0;f=(d|0)>=(e|0);g=b+4|0;if((a|0)==1){if(f)c[g>>2]=c[(c[47576]|0)+(e<<2)>>2];a=e+-1|0;d=190312}else{if(f)c[g>>2]=c[(c[47576]|0)+(d<<2)>>2];a=d+1|0;d=190316}c[d>>2]=a;c[(c[47576]|0)+(a<<2)>>2]=b;return}function qY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=c[47580]|0;g=c[47576]|0;b=c[47578]|0;while(1){if((b|0)>=(f|0)){e=4;break}d=b+1|0;if((jY(c[c[g+(d<<2)>>2]>>2]|0,c[c[g+(b<<2)>>2]>>2]|0,c[a>>2]|0)|0)==1)break;else b=d}a:do if((e|0)==4){b=c[47579]|0;while(1){if((b|0)<=(f|0)){b=f;break a}d=b+-1|0;if((jY(c[c[g+(d<<2)>>2]>>2]|0,c[c[g+(b<<2)>>2]>>2]|0,c[a>>2]|0)|0)==2)break;else b=d}}while(0);return b|0}function rY(a,b){a=a|0;b=b|0;c[((a|0)==1?190316:190312)>>2]=b;return}function sY(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=c[c[d+(((a+-1+e|0)%(e|0)|0)<<2)>>2]>>2]|0;i=c[c[d+(a<<2)>>2]>>2]|0;g=c[c[d+(((a+1|0)%(e|0)|0)<<2)>>2]>>2]|0;k=(jY(f,i,g)|0)==1;j=c[c[d+(b<<2)>>2]>>2]|0;if(k)if((jY(i,j,f)|0)==1){f=jY(j,i,g)|0;g=1;h=5}else f=0;else{f=jY(i,j,g)|0;g=2;h=5}a:do if((h|0)==5)if((f|0)==(g|0)){f=0;while(1){if((f|0)>=(e|0)){f=1;break a}g=f;f=f+1|0;h=(f|0)%(e|0)|0;if((h|0)==(b|0)|((g|0)==(b|0)|((g|0)==(a|0)|(h|0)==(a|0))))continue;if(vY(i,j,c[c[d+(g<<2)>>2]>>2]|0,c[c[d+(h<<2)>>2]>>2]|0)|0){f=0;break}}}else f=0;while(0);return f|0}function tY(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[47575]|0;f=c[47586]|0;if((e|0)<(f|0))h=e;else{uY(f+20|0);h=c[47575]|0}g=c[47584]|0;c[47575]=h+1;f=g+(h*52|0)|0;c[f>>2]=0;c[g+(h*52|0)+4>>2]=a;c[g+(h*52|0)+8>>2]=b;c[g+(h*52|0)+16>>2]=0;c[g+(h*52|0)+20>>2]=b;c[g+(h*52|0)+24>>2]=d;c[g+(h*52|0)+32>>2]=0;c[g+(h*52|0)+36>>2]=d;c[g+(h*52|0)+40>>2]=a;c[g+(h*52|0)+48>>2]=0;e=0;while(1){if((e|0)==3)break;c[g+(h*52|0)+4+(e<<4)+8>>2]=f;e=e+1|0}return}function uY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g;if((c[47586]|0)<(a|0)){b=c[47584]|0;d=a*52|0;if(!b){f=k6(d)|0;c[47584]=f;if(!f){f=c[15715]|0;c[e>>2]=142161;c[e+4>>2]=552;c[e+8>>2]=142327;z4(f,142142,e)|0;Ca(190140,1)}}else{e=n6(b,d)|0;c[47584]=e;if(!e){e=c[15715]|0;c[f>>2]=142161;c[f+4>>2]=558;c[f+8>>2]=142346;z4(e,142142,f)|0;Ca(190140,1)}}c[47586]=a}l=g;return}function vY(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;f=jY(a,b,c)|0;if((((f|0)!=3?(g=jY(a,b,d)|0,(g|0)!=3):0)?(h=jY(c,d,a)|0,(h|0)!=3):0)?(e=jY(c,d,b)|0,(e|0)!=3):0)a=((f|0)==1^(g|0)==1)&((h|0)==1^(e|0)==1)&1;else if(((wY(a,b,c)|0)==0?(wY(a,b,d)|0)==0:0)?(wY(c,d,a)|0)==0:0)return (wY(c,d,b)|0)!=0|0;else a=1;return a|0}function wY(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0;e=+h[a>>3];g=+h[b>>3]-e;f=+h[a+8>>3];d=+h[b+8>>3]-f;e=+h[c>>3]-e;f=+h[c+8>>3]-f;if((jY(a,b,c)|0)==3)a=(g*e+d*f>=0.0?e*e+f*f<=g*g+d*d:0)&1;else a=0;return a|0}function xY(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0;m=k6(d<<2)|0;n=k6((d<<3)+8|0)|0;o=n+8|0;f=0;while(1){if((f|0)>=(d|0))break;c[m+(f<<2)>>2]=-1;h[o+(f<<3)>>3]=-2147483647.0;f=f+1|0}h[n>>3]=-2147483648.0;a:while(1){if((a|0)==(b|0))break;l=o+(a<<3)|0;j=+h[l>>3];h[l>>3]=j==-2147483647.0?0.0:-j;k=0;f=-1;while(1){if((k|0)>=(d|0)){a=f;continue a}i=o+(k<<3)|0;g=+h[i>>3];if(g<0.0){q=(a|0)<(k|0);p=+h[(c[e+((q?k:a)<<2)>>2]|0)+((q?a:k)<<3)>>3];j=-(p+ +h[l>>3]);if(p!=0.0&g>3]=j;c[m+(k<<2)>>2]=a;g=j}f=g>+h[o+(f<<3)>>3]?k:f}k=k+1|0}}l6(n);return m|0}function yY(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0;j=l;l=l+32|0;k=j+16|0;m=j;i=c[h+4>>2]|0;c[m>>2]=c[a>>2];c[m+4>>2]=c[a+4>>2];c[m+8>>2]=c[a+8>>2];c[m+12>>2]=c[a+12>>2];c[k>>2]=c[e>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];a=i+2|0;if(!(RY(m,b,k,f,h)|0)){m=c[h+24>>2]|0;c[m+(i<<2)>>2]=g;k=i+1|0;c[m+(k<<2)>>2]=d;a=xY(k,i,a,m)|0}else{a=k6(a<<2)|0;m=i+1|0;c[a+(i<<2)>>2]=m;c[a+(m<<2)>>2]=-1}l=j;return a|0}function zY(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0;d=+h[a+24>>3];a:do if(d<1.0e-07&d>-1.0e-07)a=AY(a,b)|0;else{i=+h[a+16>>3]/(d*3.0);e=+h[a+8>>3]/d;g=i*i;d=+h[a>>3]/d+(i*2.0*g-e*i);g=e/3.0-g;e=d*d;g=e+g*(g*(g*4.0));a=b+16|0;f=-d;c=b+8|0;if(!(g<0.0)){d=(+G(+g)-d)*.5;e=+U3(d);d=e+ +U3(f-d);h[b>>3]=d;d=d*-.5;if(g>0.0)a=1;else{h[a>>3]=d;h[c>>3]=d;a=3}}else{f=+O(+(+G(+-g)),+f);g=+U3(+G(+(e-g))*.5)*2.0;h[b>>3]=g*+I(+(f/3.0));h[c>>3]=g*+I(+((f+3.141592653589793+3.141592653589793)/3.0));h[a>>3]=g*+I(+((f+-3.141592653589793+-3.141592653589793)/3.0));a=3}c=0;while(1){if((c|0)>=(a|0))break a;j=b+(c<<3)|0;h[j>>3]=+h[j>>3]-i;c=c+1|0}}while(0);return a|0}function AY(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a+16>>3];do if(!(c<1.0e-07&c>-1.0e-07)){d=+h[a+8>>3]/(c*2.0);c=d*d-+h[a>>3]/c;if(!(c<0.0))if(c==0.0){h[b>>3]=-d;a=1;break}else{c=+G(+c)-d;h[b>>3]=c;h[b+8>>3]=d*-2.0-c;a=2;break}else a=0}else a=BY(a,b)|0;while(0);return a|0}function BY(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a+8>>3];c=+h[a>>3];if(d<1.0e-07&d>-1.0e-07)a=c<1.0e-07&c>-1.0e-07?4:0;else{h[b>>3]=-c/d;a=1}return a|0}function CY(a){a=a|0;l6(c[a>>2]|0);l6(a);return}function DY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=c[a+4>>2]|0;l=(f*3|0)+-2|0;e=c[47589]|0;if((l|0)>(c[47588]|0)){d=l<<4;if(!e)d=k6(d)|0;else d=n6(e,d)|0;c[47589]=d;c[47588]=l;k=d;j=d}else{k=e;j=e}i=c[a>>2]|0;c[j>>2]=c[i>>2];c[j+4>>2]=c[i+4>>2];c[j+8>>2]=c[i+8>>2];c[j+12>>2]=c[i+12>>2];I6(k+16|0,i|0,16)|0;a=f+-1|0;d=1;e=2;while(1){f=k+(e<<4)|0;g=k+(e+1<<4)|0;h=i+(d<<4)|0;if((d|0)>=(a|0))break;m=k+(e+2<<4)|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];I6(g|0,h|0,16)|0;c[m>>2]=c[g>>2];c[m+4>>2]=c[g+4>>2];c[m+8>>2]=c[g+8>>2];c[m+12>>2]=c[g+12>>2];d=d+1|0;e=e+3|0}c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];I6(g|0,h|0,16)|0;c[b+4>>2]=l;c[b>>2]=j;return}function EY(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0;e=+h[b+8>>3];d=+h[b>>3];d=(+h[a+8>>3]-e)*(+h[c>>3]-d)-(+h[c+8>>3]-e)*(+h[a>>3]-d);return (d>.0001?1:(d<-.0001)<<31>>31)|0}function FY(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;e=+h[a>>3];f=+h[b>>3];if(e!=f){d=+h[c>>3];if(!(e>3];e=+h[c+8>>3];d=+h[b+8>>3];if(!(f>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[g+12>>2]=c[a+12>>2];c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];c[i>>2]=c[d>>2];c[i+4>>2]=c[d+4>>2];c[i+8>>2]=c[d+8>>2];c[i+12>>2]=c[d+12>>2];j=EY(g,h,i)|0;if((j|0)==0?(c[g>>2]=c[a>>2],c[g+4>>2]=c[a+4>>2],c[g+8>>2]=c[a+8>>2],c[g+12>>2]=c[a+12>>2],c[h>>2]=c[b>>2],c[h+4>>2]=c[b+4>>2],c[h+8>>2]=c[b+8>>2],c[h+12>>2]=c[b+12>>2],c[i>>2]=c[d>>2],c[i+4>>2]=c[d+4>>2],c[i+8>>2]=c[d+8>>2],c[i+12>>2]=c[d+12>>2],(FY(g,h,i)|0)!=0):0)f=1;else k=3;do if((k|0)==3){c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[g+12>>2]=c[a+12>>2];c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];c[i>>2]=c[e>>2];c[i+4>>2]=c[e+4>>2];c[i+8>>2]=c[e+8>>2];c[i+12>>2]=c[e+12>>2];f=EY(g,h,i)|0;if((f|0)==0?(c[g>>2]=c[a>>2],c[g+4>>2]=c[a+4>>2],c[g+8>>2]=c[a+8>>2],c[g+12>>2]=c[a+12>>2],c[h>>2]=c[b>>2],c[h+4>>2]=c[b+4>>2],c[h+8>>2]=c[b+8>>2],c[h+12>>2]=c[b+12>>2],c[i>>2]=c[e>>2],c[i+4>>2]=c[e+4>>2],c[i+8>>2]=c[e+8>>2],c[i+12>>2]=c[e+12>>2],FY(g,h,i)|0):0){f=1;break};c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];c[i+8>>2]=c[a+8>>2];c[i+12>>2]=c[a+12>>2];k=EY(g,h,i)|0;c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];f=((S(EY(g,h,i)|0,k)|0)&(S(f,j)|0))>>>31}while(0);l=m;return f|0}function HY(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a>>3]-+h[b>>3];c=+h[a+8>>3]-+h[b+8>>3];return +(d*d+c*c)}function IY(a){a=a|0;c[a+24>>2]=JY(c[a+4>>2]|0)|0;KY(a);return}function JY(a){a=a|0;var b=0,d=0,e=0,f=0;e=a+2|0;f=k6(e<<2)|0;b=m6(S(a,a)|0,8)|0;d=0;while(1){if((d|0)>=(a|0))break;c[f+(d<<2)>>2]=b;b=b+(a<<3)|0;d=d+1|0}while(1){if((a|0)>=(e|0))break;c[f+(a<<2)>>2]=0;a=a+1|0}return f|0}function KY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0;p=l;l=l+32|0;i=p+16|0;g=p;j=c[a+4>>2]|0;m=c[a+8>>2]|0;n=c[a+16>>2]|0;o=c[a+20>>2]|0;d=c[a+24>>2]|0;b=0;while(1){if((b|0)>=(j|0))break;q=c[o+(b<<2)>>2]|0;e=m+(b<<4)|0;f=m+(q<<4)|0;c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];c[i+8>>2]=c[f+8>>2];c[i+12>>2]=c[f+12>>2];r=+LY(g,i);f=c[d+(b<<2)>>2]|0;h[f+(q<<3)>>3]=r;h[(c[d+(q<<2)>>2]|0)+(b<<3)>>3]=r;a=b+-1|0;a=(q|0)==(a|0)?b+-2|0:a;while(1){if((a|0)<=-1)break;if((MY(b,a,m,n,o)|0?MY(a,b,m,n,o)|0:0)?(k=m+(a<<4)|0,c[g>>2]=c[e>>2],c[g+4>>2]=c[e+4>>2],c[g+8>>2]=c[e+8>>2],c[g+12>>2]=c[e+12>>2],c[i>>2]=c[k>>2],c[i+4>>2]=c[k+4>>2],c[i+8>>2]=c[k+8>>2],c[i+12>>2]=c[k+12>>2],NY(g,i,j,j,j,m,n)|0):0){c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];r=+LY(g,i);h[f+(a<<3)>>3]=r;h[(c[d+(a<<2)>>2]|0)+(b<<3)>>3]=r}a=a+-1|0}b=b+1|0}l=p;return}function LY(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0;e=l;l=l+32|0;f=e+16|0;g=e;c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[g+12>>2]=c[a+12>>2];c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];d=+G(+(+HY(g,f)));l=e;return +d}function MY(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;g=l;l=l+64|0;h=g+48|0;i=g+32|0;j=g+16|0;k=g;n=d+(c[f+(a<<2)>>2]<<4)|0;m=d+(a<<4)|0;e=d+(c[e+(a<<2)>>2]<<4)|0;f=d+(b<<4)|0;c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];c[j>>2]=c[m>>2];c[j+4>>2]=c[m+4>>2];c[j+8>>2]=c[m+8>>2];c[j+12>>2]=c[m+12>>2];c[i>>2]=c[e>>2];c[i+4>>2]=c[e+4>>2];c[i+8>>2]=c[e+8>>2];c[i+12>>2]=c[e+12>>2];c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];f=OY(k,j,i,h)|0;l=g;return f|0}function NY(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;p=l;l=l+64|0;n=p+48|0;m=p+32|0;k=p+16|0;j=p;i=0;while(1){if((i|0)>=(d|0)){o=4;break}r=g+(i<<4)|0;q=g+(c[h+(i<<2)>>2]<<4)|0;c[j>>2]=c[a>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];c[m>>2]=c[r>>2];c[m+4>>2]=c[r+4>>2];c[m+8>>2]=c[r+8>>2];c[m+12>>2]=c[r+12>>2];c[n>>2]=c[q>>2];c[n+4>>2]=c[q+4>>2];c[n+8>>2]=c[q+8>>2];c[n+12>>2]=c[q+12>>2];if(!(GY(j,k,m,n)|0))i=i+1|0;else{e=0;break}}a:do if((o|0)==4)while(1){if((e|0)>=(f|0)){e=1;break a}q=g+(e<<4)|0;r=g+(c[h+(e<<2)>>2]<<4)|0;c[j>>2]=c[a>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];c[m>>2]=c[q>>2];c[m+4>>2]=c[q+4>>2];c[m+8>>2]=c[q+8>>2];c[m+12>>2]=c[q+12>>2];c[n>>2]=c[r>>2];c[n+4>>2]=c[r+4>>2];c[n+8>>2]=c[r+8>>2];c[n+12>>2]=c[r+12>>2];if(!(GY(j,k,m,n)|0)){e=e+1|0;o=4}else{e=0;break}}while(0);l=p;return e|0}function OY(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;g=l;l=l+48|0;h=g+32|0;i=g+16|0;j=g;c[j>>2]=c[e>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];c[j+12>>2]=c[e+12>>2];c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];c[i+8>>2]=c[a+8>>2];c[i+12>>2]=c[a+12>>2];c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];f=EY(j,i,h)|0;c[j>>2]=c[e>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];c[j+12>>2]=c[e+12>>2];c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];e=EY(j,i,h)|0;c[j>>2]=c[a>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];d=(EY(j,i,h)|0)>0;l=g;return (d?e|f:e&f)>>>31^1|0}function PY(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=l;l=l+80|0;k=t+64|0;j=t+48|0;i=t+32|0;m=t+16|0;p=t;q=c[a+4>>2]|0;r=c[a+8>>2]|0;s=c[a+16>>2]|0;n=c[a+20>>2]|0;o=k6((q<<3)+16|0)|0;if((b|0)==-2222){c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];b=QY(a,k)|0}if((b|0)>-1){f=c[a+12>>2]|0;g=c[f+(b+1<<2)>>2]|0;f=c[f+(b<<2)>>2]|0}else{g=q;f=q}b=0;while(1){if((b|0)>=(f|0)){b=f;break}u=r+(b<<4)|0;c[p>>2]=c[u>>2];c[p+4>>2]=c[u+4>>2];c[p+8>>2]=c[u+8>>2];c[p+12>>2]=c[u+12>>2];u=r+(c[n+(b<<2)>>2]<<4)|0;a=r+(c[s+(b<<2)>>2]<<4)|0;c[m>>2]=c[u>>2];c[m+4>>2]=c[u+4>>2];c[m+8>>2]=c[u+8>>2];c[m+12>>2]=c[u+12>>2];c[i>>2]=c[p>>2];c[i+4>>2]=c[p+4>>2];c[i+8>>2]=c[p+8>>2];c[i+12>>2]=c[p+12>>2];c[j>>2]=c[a>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];a=o+(b<<3)|0;if((OY(m,i,j,k)|0)!=0?(c[j>>2]=c[d>>2],c[j+4>>2]=c[d+4>>2],c[j+8>>2]=c[d+8>>2],c[j+12>>2]=c[d+12>>2],c[k>>2]=c[p>>2],c[k+4>>2]=c[p+4>>2],c[k+8>>2]=c[p+8>>2],c[k+12>>2]=c[p+12>>2],(NY(j,k,f,g,q,r,s)|0)!=0):0){c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];c[k>>2]=c[p>>2];c[k+4>>2]=c[p+4>>2];c[k+8>>2]=c[p+8>>2];c[k+12>>2]=c[p+12>>2];e=+LY(j,k)}else e=0.0;h[a>>3]=e;b=b+1|0}while(1){if((b|0)>=(g|0)){b=g;break}h[o+(b<<3)>>3]=0.0;b=b+1|0}while(1){if((b|0)>=(q|0))break;u=r+(b<<4)|0;c[p>>2]=c[u>>2];c[p+4>>2]=c[u+4>>2];c[p+8>>2]=c[u+8>>2];c[p+12>>2]=c[u+12>>2];u=r+(c[n+(b<<2)>>2]<<4)|0;a=r+(c[s+(b<<2)>>2]<<4)|0;c[m>>2]=c[u>>2];c[m+4>>2]=c[u+4>>2];c[m+8>>2]=c[u+8>>2];c[m+12>>2]=c[u+12>>2];c[i>>2]=c[p>>2];c[i+4>>2]=c[p+4>>2];c[i+8>>2]=c[p+8>>2];c[i+12>>2]=c[p+12>>2];c[j>>2]=c[a>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];a=o+(b<<3)|0;if((OY(m,i,j,k)|0)!=0?(c[j>>2]=c[d>>2],c[j+4>>2]=c[d+4>>2],c[j+8>>2]=c[d+8>>2],c[j+12>>2]=c[d+12>>2],c[k>>2]=c[p>>2],c[k+4>>2]=c[p+4>>2],c[k+8>>2]=c[p+8>>2],c[k+12>>2]=c[p+12>>2],(NY(j,k,f,g,q,r,s)|0)!=0):0){c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];c[k>>2]=c[p>>2];c[k+4>>2]=c[p+4>>2];c[k+8>>2]=c[p+8>>2];c[k+12>>2]=c[p+12>>2];e=+LY(j,k)}else e=0.0;h[a>>3]=e;b=b+1|0}h[o+(q<<3)>>3]=0.0;h[o+(q+1<<3)>>3]=0.0;l=t;return o|0}function QY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;m=l;l=l+32|0;f=m;e=m+24|0;h=m+16|0;i=a+8|0;j=a+12|0;k=h+4|0;d=0;while(1){if((d|0)>=(c[a>>2]|0)){d=-1111;break}o=c[j>>2]|0;n=c[o+(d<<2)>>2]|0;c[h>>2]=(c[i>>2]|0)+(n<<4);g=d+1|0;c[k>>2]=(c[o+(g<<2)>>2]|0)-n;c[e>>2]=c[h>>2];c[e+4>>2]=c[h+4>>2];c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];if(!(LX(e,f)|0))d=g;else break}l=m;return d|0}function RY(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=l;l=l+64|0;m=t+48|0;k=t+32|0;o=t+16|0;n=t;q=c[f+4>>2]|0;r=c[f+8>>2]|0;p=c[f+16>>2]|0;h=e+1|0;f=f+12|0;g=(e|0)<0;if((b|0)<0)if(g){f=0;e=0;g=0;b=0}else{g=c[f>>2]|0;f=c[g+(h<<2)>>2]|0;e=c[g+(e<<2)>>2]|0;g=0;b=0}else{f=c[f>>2]|0;j=c[f+(b<<2)>>2]|0;i=c[f+(b+1<<2)>>2]|0;if(g){f=i;e=j;g=0;b=0}else{u=(b|0)>(e|0);b=c[f+(e<<2)>>2]|0;g=c[f+(h<<2)>>2]|0;f=u?i:g;e=u?j:b;g=u?g:i;b=u?b:j}}h=0;while(1){if((h|0)>=(b|0)){s=9;break}j=r+(h<<4)|0;u=r+(c[p+(h<<2)>>2]<<4)|0;c[n>>2]=c[a>>2];c[n+4>>2]=c[a+4>>2];c[n+8>>2]=c[a+8>>2];c[n+12>>2]=c[a+12>>2];c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];c[m>>2]=c[u>>2];c[m+4>>2]=c[u+4>>2];c[m+8>>2]=c[u+8>>2];c[m+12>>2]=c[u+12>>2];if(!(GY(n,o,k,m)|0))h=h+1|0;else{f=0;break}}a:do if((s|0)==9){while(1){if((g|0)>=(e|0))break;s=r+(g<<4)|0;u=r+(c[p+(g<<2)>>2]<<4)|0;c[n>>2]=c[a>>2];c[n+4>>2]=c[a+4>>2];c[n+8>>2]=c[a+8>>2];c[n+12>>2]=c[a+12>>2];c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];c[k>>2]=c[s>>2];c[k+4>>2]=c[s+4>>2];c[k+8>>2]=c[s+8>>2];c[k+12>>2]=c[s+12>>2];c[m>>2]=c[u>>2];c[m+4>>2]=c[u+4>>2];c[m+8>>2]=c[u+8>>2];c[m+12>>2]=c[u+12>>2];if(!(GY(n,o,k,m)|0)){g=g+1|0;s=9}else{f=0;break a}}while(1){if((f|0)>=(q|0)){f=1;break a}s=r+(f<<4)|0;u=r+(c[p+(f<<2)>>2]<<4)|0;c[n>>2]=c[a>>2];c[n+4>>2]=c[a+4>>2];c[n+8>>2]=c[a+8>>2];c[n+12>>2]=c[a+12>>2];c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];c[k>>2]=c[s>>2];c[k+4>>2]=c[s+4>>2];c[k+8>>2]=c[s+8>>2];c[k+12>>2]=c[s+12>>2];c[m>>2]=c[u>>2];c[m+4>>2]=c[u+4>>2];c[m+8>>2]=c[u+8>>2];c[m+12>>2]=c[u+12>>2];if(!(GY(n,o,k,m)|0))f=f+1|0;else{f=0;break}}}while(0);l=t;return f|0}function SY(a){a=a|0;return TY(a,0,0)|0}function TY(a,b,c){a=a|0;b=b|0;c=c|0;return UY(a,b,c,0)|0}function UY(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;if(!d){g=k6(500)|0;if(!g)g=0;else{c[g+12>>2]=35;c[g+16>>2]=107;c[g+20>>2]=105;d=35;h=6}}else{g=pb[c[d>>2]&63](500)|0;if(!g)g=0;else{h=c[d>>2]|0;c[g+12>>2]=h;c[g+16>>2]=c[d+4>>2];c[g+20>>2]=c[d+8>>2];d=h;h=6}}do if((h|0)==6){c[g+8>>2]=0;c[g+32>>2]=0;c[g+380>>2]=16;k=g+12|0;j=pb[d&63](256)|0;d=g+392|0;c[d>>2]=j;h=g+20|0;if(!j){db[c[h>>2]&127](g);g=0;break}i=pb[c[k>>2]&63](1024)|0;j=g+44|0;c[j>>2]=i;if(!i){db[c[h>>2]&127](c[d>>2]|0);db[c[h>>2]&127](g);g=0;break}c[g+48>>2]=i+1024;if(!f){f=VY(k)|0;c[g+356>>2]=f;if(!f){db[c[h>>2]&127](c[j>>2]|0);db[c[h>>2]&127](c[d>>2]|0);db[c[h>>2]&127](g);g=0;break}}else c[g+356>>2]=f;c[g+376>>2]=0;c[g+368>>2]=0;c[g+304>>2]=0;c[g+468>>2]=0;c[g+464>>2]=0;c[g+124>>2]=0;c[g+248>>2]=0;d=g+472|0;a[d>>0]=33;h=g+236|0;a[h>>0]=0;a[g+237>>0]=0;c[g+396>>2]=0;c[g+400>>2]=0;a[g+404>>0]=0;WY(g+416|0,k);WY(g+440|0,k);XY(g,b);if(b|0?(c[g+232>>2]|0)==0:0){YY(g);g=0;break}if(!e){c[g+228>>2]=V_()|0;break}else{a[h>>0]=1;c[g+228>>2]=B0()|0;a[d>>0]=a[e>>0]|0;break}}while(0);return g|0}function VY(b){b=b|0;var d=0;d=pb[c[b>>2]&63](188)|0;if(d|0){WY(d+80|0,b);WY(d+104|0,b);VZ(d,b);VZ(d+20|0,b);VZ(d+40|0,b);VZ(d+60|0,b);a[d+131>>0]=0;VZ(d+132|0,b);c[d+152>>2]=0;c[d+156>>2]=0;a[d+160>>0]=0;b=d+164|0;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[b+20>>2]=0;a[d+128>>0]=1;a[d+129>>0]=0;a[d+130>>0]=0}return d|0}function WY(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=b;return}function XY(d,e){d=d|0;e=e|0;var f=0,g=0,h=0;c[d+280>>2]=56;I0(d+256|0);if(!e)e=0;else e=eZ(d+416|0,e)|0;c[d+232>>2]=e;c[d+360>>2]=0;K$(d+148|0,d+144|0,0)|0;c[d>>2]=0;c[d+4>>2]=0;e=d+116|0;g=d+52|0;h=g+64|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));c[e>>2]=d;c[d+120>>2]=0;e=d+128|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;e=c[d+8>>2]|0;c[d+24>>2]=e;c[d+28>>2]=e;c[d+36>>2]=0;c[d+40>>2]=0;e=d+316|0;g=d+408|0;c[g>>2]=0;c[g+4>>2]=0;g=d+284|0;f=d+308|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;g=e;h=g+36|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));b[e+36>>1]=0;a[f>>0]=1;c[d+312>>2]=0;c[d+364>>2]=0;c[d+372>>2]=0;c[d+384>>2]=0;c[d+240>>2]=0;c[d+252>>2]=0;c[d+244>>2]=0;c[d+476>>2]=0;c[d+480>>2]=0;a[d+488>>0]=0;a[d+489>>0]=0;c[d+492>>2]=0;c[d+496>>2]=0;return}function YY(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;if(b|0){e=b+368|0;g=b+20|0;d=c[b+364>>2]|0;while(1){if(!d){d=c[e>>2]|0;if(!d)break;c[e>>2]=0}h=c[d>>2]|0;db[c[g>>2]&127](c[d+36>>2]|0);ZY(c[d+44>>2]|0,b);db[c[g>>2]&127](d);d=h}e=b+304|0;d=c[b+300>>2]|0;while(1){if(!d){d=c[e>>2]|0;if(!d)break;c[e>>2]=0}h=c[d+8>>2]|0;db[c[g>>2]&127](d);d=h}d=b+12|0;ZY(c[b+376>>2]|0,b);ZY(c[b+372>>2]|0,b);_Y(b+416|0);_Y(b+440|0);if((a[b+488>>0]|0)==0?(f=c[b+356>>2]|0,f|0):0)$Y(f,(c[b+476>>2]|0)==0&1,d);db[c[g>>2]&127](c[b+392>>2]|0);db[c[g>>2]&127](c[b+464>>2]|0);db[c[g>>2]&127](c[b+8>>2]|0);db[c[g>>2]&127](c[b+44>>2]|0);db[c[g>>2]&127](c[b+396>>2]|0);db[c[g>>2]&127](c[b+240>>2]|0);d=c[b+252>>2]|0;if(d|0)db[d&127](c[b+244>>2]|0);db[c[g>>2]&127](b)}return}function ZY(a,b){a=a|0;b=b|0;var d=0;b=b+20|0;while(1){if(!a)break;d=c[a+4>>2]|0;db[c[b>>2]&127](c[a+16>>2]|0);db[c[b>>2]&127](a);a=d}return}function _Y(a){a=a|0;var b=0,d=0,e=0;d=a+20|0;b=c[a>>2]|0;while(1){if(!b)break;e=c[b>>2]|0;db[c[(c[d>>2]|0)+8>>2]&127](b);b=e}b=c[a+4>>2]|0;while(1){if(!b)break;e=c[b>>2]|0;db[c[(c[d>>2]|0)+8>>2]&127](b);b=e}return}function $Y(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;g=a+20|0;aZ(f,g);d=d+8|0;while(1){e=bZ(f)|0;if(!e)break;if(!(c[e+16>>2]|0))continue;db[c[d>>2]&127](c[e+20>>2]|0)}cZ(a);cZ(a+132|0);cZ(g);cZ(a+40|0);cZ(a+60|0);_Y(a+80|0);_Y(a+104|0);if(b<<24>>24){db[c[d>>2]&127](c[a+184>>2]|0);db[c[d>>2]&127](c[a+164>>2]|0)}db[c[d>>2]&127](a);l=h;return}function aZ(a,b){a=a|0;b=b|0;var d=0;d=c[b>>2]|0;c[a>>2]=d;c[a+4>>2]=d+(c[b+8>>2]<<2);return}function bZ(a){a=a|0;var b=0,d=0,e=0;d=c[a+4>>2]|0;e=c[a>>2]|0;do{if((e|0)==(d|0)){b=0;break}b=e;e=e+4|0;c[a>>2]=e;b=c[b>>2]|0}while(!(b|0));return b|0}function cZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=a+8|0;e=a+16|0;b=0;while(1){f=c[(c[e>>2]|0)+8>>2]|0;g=c[a>>2]|0;if(b>>>0>=(c[d>>2]|0)>>>0)break;db[f&127](c[g+(b<<2)>>2]|0);b=b+1|0}db[f&127](g);return}function dZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=gZ(a)|0;if(!f){c[a+280>>2]=57;f=hZ(a,b,d,e)|0}return f|0}function eZ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=b+12|0;g=b+8|0;while(1){e=c[f>>2]|0;if((e|0)==(c[g>>2]|0)){if(!((fZ(b)|0)<<24>>24)){d=0;break}e=c[f>>2]|0}i=a[d>>0]|0;c[f>>2]=e+1;a[e>>0]=i;if(!(a[d>>0]|0)){h=6;break}else d=d+1|0}if((h|0)==6){i=b+16|0;d=c[i>>2]|0;c[i>>2]=c[f>>2]}return d|0}function fZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=a+4|0;f=c[b>>2]|0;i=a+16|0;j=a+12|0;k=a+8|0;do if(f){g=c[i>>2]|0;if(!g){c[a>>2]=f;c[b>>2]=c[f>>2];c[f>>2]=0;b=f+8|0;c[i>>2]=b;c[k>>2]=(c[f+4>>2]|0)+(f+8);c[j>>2]=b;b=1;break}d=c[k>>2]|0;e=d-g|0;if((e|0)<(c[f+4>>2]|0)){d=c[f>>2]|0;c[f>>2]=c[a>>2];c[a>>2]=f;c[b>>2]=d;B6(f+8|0,g|0,e|0)|0;b=c[a>>2]|0;c[j>>2]=(c[j>>2]|0)-(c[i>>2]|0)+(b+8);c[i>>2]=b+8;c[k>>2]=(c[b+4>>2]|0)+(b+8);b=1}else h=7}else{d=c[k>>2]|0;h=7}while(0);a:do if((h|0)==7){e=c[a>>2]|0;f=a+20|0;do if(!e){h=i;b=c[i>>2]|0}else{h=c[i>>2]|0;b=h;if((h|0)!=(e+8|0)){h=i;break}d=d-b<<1;b=vb[c[(c[f>>2]|0)+4>>2]&127](e,d+8|0)|0;if(!b){b=0;break a}c[a>>2]=b;c[b+4>>2]=d;c[j>>2]=(c[j>>2]|0)-(c[i>>2]|0)+(b+8);c[i>>2]=b+8;c[k>>2]=b+8+d;b=1;break a}while(0);g=d-b|0;g=(g|0)<1024?1024:g<<1;b=pb[c[c[f>>2]>>2]&63](g+8|0)|0;if(!b)b=0;else{c[b+4>>2]=g;c[b>>2]=c[a>>2];c[a>>2]=b;a=c[j>>2]|0;e=c[i>>2]|0;f=b+8|0;d=a;b=e;if((a|0)!=(e|0)){B6(f|0,e|0,d-b|0)|0;d=c[j>>2]|0;b=c[h>>2]|0}c[j>>2]=f+(d-b);c[i>>2]=f;c[k>>2]=f+g;b=1}}while(0);return b|0}function gZ(b){b=b|0;var d=0;d=b+232|0;if(!(eb[(a[b+236>>0]<<24>>24?40:41)&63](b+148|0,b+144|0,c[d>>2]|0)|0))b=UZ(b,c[d>>2]|0)|0;else b=0;return b|0}function hZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=l;l=l+16|0;h=g;c[h>>2]=d;j=b+144|0;i=c[j>>2]|0;i=tb[c[i>>2]&127](i,d,e,h)|0;f=iZ(b,c[j>>2]|0,d,e,i,c[h>>2]|0,f,(a[b+484>>0]|0)==0&1)|0;l=g;return f|0}function iZ(b,e,f,g,h,i,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0;Ha=l;l=l+16|0;wa=Ha;c[wa>>2]=i;s=c[b+356>>2]|0;t=b+144|0;u=b+300|0;if((c[t>>2]|0)==(e|0)){q=b+288|0;r=b+292|0}else{r=c[u>>2]|0;q=r;r=r+4|0}v=b+256|0;w=k<<24>>24!=0;x=b+328|0;y=b+344|0;z=b+136|0;A=b+353|0;xa=b+116|0;oa=b+489|0;ya=b+4|0;B=s+80|0;C=b+340|0;D=b+348|0;E=b+316|0;F=s+168|0;G=s+164|0;za=s+130|0;H=b+352|0;I=b+260|0;J=s+184|0;K=b+476|0;sa=b+492|0;L=s+96|0;M=b+332|0;N=s+160|0;O=b+324|0;P=b+128|0;Q=b+96|0;R=b+464|0;S=s+180|0;Aa=b+108|0;Ba=s+131|0;T=b+132|0;U=b+336|0;Ca=s+129|0;Da=b+360|0;V=b+416|0;W=b+80|0;ta=s+132|0;X=b+320|0;Ea=b+112|0;Y=s+128|0;Z=b+84|0;_=b+428|0;$=b+424|0;aa=s+92|0;ba=b+12|0;ca=b+432|0;da=b+480|0;ea=b+88|0;fa=s+120|0;ga=s+116|0;ha=b+92|0;ia=b+468|0;ja=b+16|0;ka=b+272|0;la=b+120|0;ma=s+176|0;p=e;o=f;e=h;a:while(1){c[q>>2]=o;f=c[wa>>2]|0;c[r>>2]=f;i=f;b:do if((e|0)<1){if(w&(e|0)!=0){n=7;break a}h=0-e|0;switch(e|0){case -1:{i=5;n=278;break a}case 0:{n=9;break a}case -2:{i=6;break a}case -4:{n=10;break a}case -15:{e=h;break b}default:{}}c[wa>>2]=g;e=h;i=g}while(0);m=wb[c[v>>2]&63](v,e,o,i,p)|0;i=p+56|0;f=p+68|0;c:do switch(m|0){case 2:{n=58;break a}case -1:{n=184;break a}case 1:{i=jZ(b,0,o,c[wa>>2]|0)|0;if(i|0){n=278;break a}i=c[t>>2]|0;break}case 4:{if(!(c[Z>>2]|0))i=1;else{n=kZ(V,p,o,c[wa>>2]|0)|0;c[X>>2]=n;if(!n){i=1;n=278;break a}c[ca>>2]=c[_>>2];c[x>>2]=0;i=0}c[O>>2]=0;n=272;break}case 7:{i=c[Z>>2]|0;if(!i)n=273;else{fb[i&31](c[ya>>2]|0,c[X>>2]|0,c[O>>2]|0,c[x>>2]|0,1);c[X>>2]=0;lZ(V);i=p}break}case 57:{i=jZ(b,1,o,c[wa>>2]|0)|0;if(i|0){n=278;break a}i=c[t>>2]|0;break}case 6:{a[oa>>0]=0;n=mZ(b,ta,75667,36)|0;c[E>>2]=n;if(!n){i=1;n=278;break a}a[Ca>>0]=1;if(!(c[Z>>2]|0))n=33;else{if(!(tb[c[i>>2]&127](p,o,c[wa>>2]|0,q)|0)){i=32;n=278;break a}i=c[f>>2]|0;i=kZ(V,p,o+i|0,(c[wa>>2]|0)+(0-i)|0)|0;if(!i){i=1;n=278;break a}nZ(i);c[ca>>2]=c[_>>2];c[x>>2]=i;i=0;n=34}break}case 14:{n=33;break}case 8:{i=c[X>>2]|0;if(!i)i=1;else{fb[c[Z>>2]&31](c[ya>>2]|0,i,c[O>>2]|0,c[x>>2]|0,0);lZ(V);i=0}if(!((c[O>>2]|0)==0?!(a[oa>>0]|0):0)){f=a[Ca>>0]|0;a[Ca>>0]=1;do if(c[sa>>2]|0?c[Ea>>2]|0:0){h=mZ(b,ta,75667,36)|0;if(!h){i=1;n=278;break a}e=h+20|0;if(!(a[oa>>0]|0))e=c[e>>2]|0;else{m=c[Da>>2]|0;c[e>>2]=m;e=m}a[Ba>>0]=0;if(!(wb[c[Ea>>2]&63](c[xa>>2]|0,0,e,c[h+16>>2]|0,c[h+24>>2]|0)|0)){i=21;n=278;break a}if(!(a[Ba>>0]|0)){if(c[O>>2]|0)break;a[Ca>>0]=f;break}if(((a[za>>0]|0)==0?(na=c[Aa>>2]|0,na|0):0)?(pb[na&63](c[ya>>2]|0)|0)==0:0){i=22;n=278;break a}}while(0);a[oa>>0]=0}e=c[ea>>2]|0;if(!e)n=272;else{db[e&127](c[ya>>2]|0);i=p}break}case 34:{n=pZ(b,p,o,c[wa>>2]|0)|0;c[y>>2]=n;if(!n){i=1;n=278;break a}else n=80;break}case 22:{n=qZ(b,p,o,c[wa>>2]|0)|0;c[D>>2]=n;if(!n){i=1;n=278;break a}a[H>>0]=0;c[M>>2]=0;a[A>>0]=0;n=80;break}case 23:{a[H>>0]=1;c[M>>2]=142491;n=80;break}case 24:{a[A>>0]=1;c[M>>2]=142497;n=80;break}case 25:{c[M>>2]=142500;n=80;break}case 26:{c[M>>2]=142506;n=80;break}case 27:{c[M>>2]=142513;n=80;break}case 28:{c[M>>2]=142520;n=80;break}case 29:{c[M>>2]=142529;n=80;break}case 30:{c[M>>2]=142537;n=80;break}case 32:case 31:{if((a[Y>>0]|0)!=0?(c[T>>2]|0)!=0:0){if(!(rZ(V,(c[M>>2]|0)==0?((m|0)==32?142546:142556):142558)|0)){i=1;n=278;break a}if(!(sZ(V,p,o,c[wa>>2]|0)|0)){i=1;n=278;break a}c[M>>2]=c[ca>>2];i=p}else n=273;break}case 36:case 35:{if(a[Y>>0]|0){if(!(tZ(c[y>>2]|0,c[D>>2]|0,a[H>>0]|0,a[A>>0]|0,0,b)|0)){i=1;n=278;break a}if((c[T>>2]|0)!=0?(pa=c[M>>2]|0,(pa|0)!=0):0){switch(a[pa>>0]|0){case 40:{n=93;break}case 78:{if((a[pa+1>>0]|0)==79)n=93;break}default:{}}if((n|0)==93){n=0;i=c[_>>2]|0;if((i|0)==(c[$>>2]|0)){if(!((fZ(V)|0)<<24>>24)){i=1;n=278;break a}i=c[_>>2]|0}c[_>>2]=i+1;a[i>>0]=41;i=c[_>>2]|0;if((i|0)==(c[$>>2]|0)){if(!((fZ(V)|0)<<24>>24)){i=1;n=278;break a}i=c[_>>2]|0}c[_>>2]=i+1;a[i>>0]=0;c[M>>2]=c[ca>>2];c[ca>>2]=c[_>>2]}c[r>>2]=o;ub[c[T>>2]&15](c[ya>>2]|0,c[c[y>>2]>>2]|0,c[c[D>>2]>>2]|0,c[M>>2]|0,0,(m|0)==36&1);lZ(V);i=p}else n=273}else n=273;break}case 38:case 37:{if(a[Y>>0]|0){i=c[f>>2]|0;i=uZ(b,p,a[H>>0]|0,o+i|0,(c[wa>>2]|0)+(0-i)|0,B)|0;if(i|0){n=278;break a}e=c[L>>2]|0;c[L>>2]=c[aa>>2];if(!(tZ(c[y>>2]|0,c[D>>2]|0,a[H>>0]|0,0,e,b)|0)){i=1;n=278;break a}if((c[T>>2]|0)!=0?(qa=c[M>>2]|0,(qa|0)!=0):0){switch(a[qa>>0]|0){case 40:{n=108;break}case 78:{if((a[qa+1>>0]|0)==79)n=108;break}default:{}}if((n|0)==108){n=0;i=c[_>>2]|0;if((i|0)==(c[$>>2]|0)){if(!((fZ(V)|0)<<24>>24)){i=1;n=278;break a}i=c[_>>2]|0}c[_>>2]=i+1;a[i>>0]=41;i=c[_>>2]|0;if((i|0)==(c[$>>2]|0)){if(!((fZ(V)|0)<<24>>24)){i=1;n=278;break a}i=c[_>>2]|0}c[_>>2]=i+1;a[i>>0]=0;c[M>>2]=c[ca>>2];c[ca>>2]=c[_>>2]}c[r>>2]=o;ub[c[T>>2]&15](c[ya>>2]|0,c[c[y>>2]>>2]|0,c[c[D>>2]>>2]|0,c[M>>2]|0,e,(m|0)==38&1);lZ(V);i=p}else n=273}else n=273;break}case 12:{if(a[Y>>0]|0){i=c[f>>2]|0;i=vZ(b,p,o+i|0,(c[wa>>2]|0)+(0-i)|0)|0;e=c[E>>2]|0;f=c[fa>>2]|0;if(e){c[e+4>>2]=f;n=c[ga>>2]|0;c[e+8>>2]=n-f;c[fa>>2]=n;if(!(c[z>>2]|0))e=1;else{c[r>>2]=o;e=c[E>>2]|0;ob[c[z>>2]&0](c[ya>>2]|0,c[e>>2]|0,d[e+33>>0]|0,c[e+4>>2]|0,c[e+8>>2]|0,c[Da>>2]|0,0,0,0);e=0}}else{c[ga>>2]=f;e=1}if(!i){i=e;n=272}else{n=278;break a}}else n=273;break}case 5:{a[oa>>0]=0;a[Ca>>0]=1;if(!(c[Z>>2]|0)){c[O>>2]=75667;i=1}else{n=c[f>>2]|0;n=kZ(V,p,o+n|0,(c[wa>>2]|0)+(0-n)|0)|0;c[O>>2]=n;if(!n){i=1;n=278;break a}c[ca>>2]=c[_>>2];i=0}if((((a[za>>0]|0)==0?(c[sa>>2]|0)==0:0)?(ra=c[Aa>>2]|0,ra|0):0)?(pb[ra&63](c[ya>>2]|0)|0)==0:0){i=22;n=278;break a}if(!(c[E>>2]|0)){e=mZ(b,ta,75667,36)|0;c[E>>2]=e;if(!e){i=1;n=278;break a}c[e+24>>2]=0;n=133}else n=133;break}case 13:{i=1;n=133;break}case 15:{if(((a[Y>>0]|0)!=0?(c[E>>2]|0)!=0:0)?(c[z>>2]|0)!=0:0){c[r>>2]=o;i=c[E>>2]|0;ob[c[z>>2]&0](c[ya>>2]|0,c[i>>2]|0,d[i+33>>0]|0,0,0,c[i+20>>2]|0,c[i+16>>2]|0,c[i+24>>2]|0,0);i=p}else n=273;break}case 16:{if((a[Y>>0]|0)!=0?(c[E>>2]|0)!=0:0){m=kZ(B,p,o,c[wa>>2]|0)|0;c[(c[E>>2]|0)+28>>2]=m;if(!m){i=1;n=278;break a}c[L>>2]=c[aa>>2];if(c[ha>>2]|0){c[r>>2]=o;i=c[E>>2]|0;ub[c[ha>>2]&15](c[ya>>2]|0,c[i>>2]|0,c[i+20>>2]|0,c[i+16>>2]|0,c[i+24>>2]|0,c[i+28>>2]|0);i=p;break c}if(c[z>>2]|0){c[r>>2]=o;i=c[E>>2]|0;ob[c[z>>2]&0](c[ya>>2]|0,c[i>>2]|0,0,0,0,c[i+20>>2]|0,c[i+16>>2]|0,c[i+24>>2]|0,c[i+28>>2]|0);i=p}else n=273}else n=273;break}case 9:{if(eb[c[p+48>>2]&63](p,o,c[wa>>2]|0)|0){c[E>>2]=0;n=273;break c}if(!(a[Y>>0]|0)){c[aa>>2]=c[L>>2];c[E>>2]=0;n=273;break c}i=kZ(B,p,o,c[wa>>2]|0)|0;if(!i){i=1;n=278;break a}e=mZ(b,s,i,36)|0;c[E>>2]=e;if(!e){i=1;n=278;break a}if((c[e>>2]|0)!=(i|0)){c[aa>>2]=c[L>>2];c[E>>2]=0;n=273;break c}c[L>>2]=c[aa>>2];c[e+24>>2]=0;a[e+33>>0]=0;if(!(c[K>>2]|0))i=(c[u>>2]|0)!=0;else i=1;a[e+34>>0]=(i^1)&1;if(!(c[z>>2]|0))n=273;else i=p;break}case 10:{if(!(a[Y>>0]|0)){c[aa>>2]=c[L>>2];c[E>>2]=0;n=273;break c}i=kZ(B,p,o,c[wa>>2]|0)|0;if(!i){i=1;n=278;break a}e=mZ(b,ta,i,36)|0;c[E>>2]=e;if(!e){i=1;n=278;break a}if((c[e>>2]|0)!=(i|0)){c[aa>>2]=c[L>>2];c[E>>2]=0;n=273;break c}c[L>>2]=c[aa>>2];c[e+24>>2]=0;a[e+33>>0]=1;if(!(c[K>>2]|0))i=(c[u>>2]|0)!=0;else i=1;a[e+34>>0]=(i^1)&1;if(!(c[z>>2]|0))n=273;else i=p;break}case 18:{c[C>>2]=0;c[U>>2]=0;if(!(c[Q>>2]|0))n=273;else{o=kZ(V,p,o,c[wa>>2]|0)|0;c[U>>2]=o;if(!o){i=1;n=278;break a}c[ca>>2]=c[_>>2];i=p}break}case 21:{if(!(tb[c[i>>2]&127](p,o,c[wa>>2]|0,q)|0)){i=32;n=278;break a}if(!(c[U>>2]|0))n=273;else{i=c[f>>2]|0;i=kZ(V,p,o+i|0,(c[wa>>2]|0)+(0-i)|0)|0;if(!i){i=1;n=278;break a}nZ(i);c[C>>2]=i;c[ca>>2]=c[_>>2];i=p}break}case 19:{if((c[U>>2]|0)!=0?(c[Q>>2]|0)!=0:0){i=c[f>>2]|0;i=kZ(V,p,o+i|0,(c[wa>>2]|0)+(0-i)|0)|0;if(!i){i=1;n=278;break a}c[r>>2]=o;fb[c[Q>>2]&31](c[ya>>2]|0,c[U>>2]|0,c[Da>>2]|0,i,c[C>>2]|0);i=0}else i=1;lZ(V);n=272;break}case 20:{if((c[C>>2]|0)!=0?(c[Q>>2]|0)!=0:0){c[r>>2]=o;fb[c[Q>>2]&31](c[ya>>2]|0,c[U>>2]|0,c[Da>>2]|0,0,c[C>>2]|0);i=0}else i=1;lZ(V);n=272;break}case 58:{if(c[W>>2]|0)wZ(b,p,o,c[wa>>2]|0);i=xZ(b,p,wa,g,j,k)|0;if(i|0){n=278;break a}if(!(c[wa>>2]|0)){n=189;break a}else i=p;break}case 44:{i=c[ia>>2]|0;do if((c[I>>2]|0)>>>0>=i>>>0){if(!i){m=c[ba>>2]|0;c[ia>>2]=32;m=pb[m&63](32)|0;c[R>>2]=m;if(!m){i=1;n=278;break a}else break}h=c[ja>>2]|0;m=c[R>>2]|0;i=i<<1;c[ia>>2]=i;i=vb[h&127](m,i)|0;if(!i){i=1;n=278;break a}c[R>>2]=i;i=c[J>>2]|0;if(i|0){i=vb[c[ja>>2]&127](i,c[ia>>2]<<2)|0;if(!i){i=1;n=278;break a}c[J>>2]=i}}while(0);a[(c[R>>2]|0)+(c[I>>2]|0)>>0]=0;if(a[N>>0]|0){i=zZ(b)|0;if((i|0)<0){i=1;n=278;break a}c[(c[J>>2]|0)+(c[S>>2]<<2)>>2]=i;c[S>>2]=(c[S>>2]|0)+1;c[(c[G>>2]|0)+(i*28|0)>>2]=6;if(c[P>>2]|0)i=p;else n=273}else n=273;break}case 50:{i=(c[R>>2]|0)+(c[I>>2]|0)|0;if((a[i>>0]|0)==124){i=2;n=278;break a}a[i>>0]=44;if((a[N>>0]|0)!=0?(c[P>>2]|0)!=0:0)i=p;else n=273;break}case 49:{e=(c[R>>2]|0)+(c[I>>2]|0)|0;i=a[e>>0]|0;if(i<<24>>24==44){i=2;n=278;break a}if(i<<24>>24==0&(a[N>>0]|0)!=0?(ua=(c[G>>2]|0)+((c[(c[J>>2]|0)+((c[S>>2]|0)+-1<<2)>>2]|0)*28|0)|0,(c[ua>>2]|0)!=3):0){c[ua>>2]=5;i=(c[P>>2]|0)==0&1}else i=1;a[e>>0]=124;n=272;break}case 59:case 60:{a[Ca>>0]=1;if(c[sa>>2]|0){e=c[f>>2]|0;e=kZ(B,p,o+e|0,(c[wa>>2]|0)+(0-e)|0)|0;if(!e){i=1;n=278;break a}h=mZ(b,ta,e,0)|0;c[aa>>2]=c[L>>2];i=(h|0)!=0;f=(m|0)==60;do if(c[ka>>2]|0){if(!(a[za>>0]|0)){if(a[Ca>>0]|0){n=217;break}}else if(c[u>>2]|0){n=217;break}if(!i){i=11;n=278;break a}if(!(a[h+34>>0]|0)){i=24;n=278;break a}}else n=217;while(0);if((n|0)==217?(n=0,!i):0){a[Y>>0]=a[za>>0]|0;if(!f){n=273;break c}i=c[la>>2]|0;if(!i){n=273;break c}rb[i&127](c[ya>>2]|0,e,1);i=p;break c}e=h+32|0;if(a[e>>0]|0){i=12;n=278;break a}if(c[h+4>>2]|0){i=AZ(b,h,f&1)|0;e=(i|0)==0;if(e){i=(e^1)&1;n=272;break c}else{n=278;break a}}i=c[Ea>>2]|0;if(!i){a[Y>>0]=a[za>>0]|0;n=273;break c}a[Ba>>0]=0;a[e>>0]=1;m=(wb[i&63](c[xa>>2]|0,0,c[h+20>>2]|0,c[h+16>>2]|0,c[h+24>>2]|0)|0)==0;a[e>>0]=0;if(m){i=21;n=278;break a}e=a[za>>0]|0;if(!(a[Ba>>0]|0)){a[Y>>0]=e;i=p;break c}else i=0}else{e=a[za>>0]|0;a[Y>>0]=e;i=1}if((e<<24>>24==0?(va=c[Aa>>2]|0,(va|0)!=0):0)?(pb[va&63](c[ya>>2]|0)|0)==0:0){i=22;n=278;break a}else n=272;break}case 40:{if(!(c[P>>2]|0))n=273;else{o=pZ(b,p,o,c[wa>>2]|0)|0;c[y>>2]=o;if(!o){i=1;n=278;break a}c[S>>2]=0;c[ma>>2]=0;a[N>>0]=1;i=p}break}case 42:case 41:{if(!(a[N>>0]|0))n=273;else{if(!(c[P>>2]|0))i=1;else{i=pb[c[ba>>2]&63](20)|0;if(!i){i=1;n=278;break a}n=i+4|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[i>>2]=(m|0)==41?2:1;c[r>>2]=o;rb[c[P>>2]&127](c[ya>>2]|0,c[c[y>>2]>>2]|0,i);i=0}a[N>>0]=0;n=272}break}case 43:{if((a[N>>0]|0)!=0?(c[(c[G>>2]|0)+((c[(c[J>>2]|0)+((c[S>>2]|0)+-1<<2)>>2]|0)*28|0)>>2]=3,(c[P>>2]|0)!=0):0)i=p;else n=273;break}case 51:{e=0;n=245;break}case 53:{e=1;n=245;break}case 52:{e=2;n=245;break}case 54:{e=3;n=245;break}case 45:{f=0;n=256;break}case 47:{f=1;n=256;break}case 46:{f=2;n=256;break}case 48:{f=3;n=256;break}case 55:{if(!(CZ(b,p,o,c[wa>>2]|0)|0)){i=1;n=278;break a}else i=p;break}case 56:{if(!(DZ(b,p,o,c[wa>>2]|0)|0)){i=1;n=278;break a}else i=p;break}case 0:{if((e|0)==14)i=p;else n=273;break}case 3:{if(!(c[Z>>2]|0))n=273;else i=p;break}case 11:{if((a[Y>>0]|0)!=0?(c[z>>2]|0)!=0:0)i=p;else n=273;break}case 17:{if(!(c[Q>>2]|0))n=273;else i=p;break}case 33:{if((a[Y>>0]|0)!=0?(c[T>>2]|0)!=0:0)i=p;else n=273;break}case 39:{if(!(c[P>>2]|0))n=273;else i=p;break}default:n=273}while(0);if((n|0)==33)if(!(tb[c[i>>2]&127](p,o,c[wa>>2]|0,q)|0)){i=32;n=278;break}else{i=1;n=34}else if((n|0)==80){n=0;if((a[Y>>0]|0)!=0?(c[T>>2]|0)!=0:0)i=p;else n=273}else if((n|0)==133){n=0;if((a[Y>>0]|0)!=0?(c[E>>2]|0)!=0:0){m=c[f>>2]|0;m=kZ(B,p,o+m|0,(c[wa>>2]|0)+(0-m)|0)|0;e=c[E>>2]|0;c[e+16>>2]=m;if(!m){i=1;n=278;break}c[e+20>>2]=c[Da>>2];c[L>>2]=c[aa>>2];if(c[z>>2]|0)i=p;else n=272}else n=272}else if((n|0)==245){n=0;if(a[N>>0]|0){i=c[wa>>2]|0;if(e)i=i+(0-(c[f>>2]|0))|0;f=zZ(b)|0;if((f|0)<0){i=1;n=278;break}m=c[G>>2]|0;c[m+(f*28|0)>>2]=4;c[m+(f*28|0)+4>>2]=e;i=pZ(b,p,o,i)|0;if(!i){i=1;n=278;break}e=c[i>>2]|0;c[(c[G>>2]|0)+(f*28|0)+8>>2]=e;i=0;do{m=i;i=i+1|0}while((a[e+m>>0]|0)!=0);c[F>>2]=(c[F>>2]|0)+i;if(c[P>>2]|0)i=p;else n=273}else n=273}else if((n|0)==256)if(a[N>>0]|0){e=(c[P>>2]|0)==0;i=e&1;n=(c[S>>2]|0)+-1|0;c[S>>2]=n;c[(c[G>>2]|0)+((c[(c[J>>2]|0)+(n<<2)>>2]|0)*28|0)+4>>2]=f;if(!n){if(!e){e=BZ(b)|0;if(!e){i=1;n=278;break}c[r>>2]=o;rb[c[P>>2]&127](c[ya>>2]|0,c[c[y>>2]>>2]|0,e)}a[N>>0]=0;c[F>>2]=0;n=272}else n=272}else n=273;if((n|0)==34){n=0;if((a[Y>>0]|0)!=0?(c[E>>2]|0)!=0:0){e=c[f>>2]|0;e=kZ(B,p,o+e|0,(c[wa>>2]|0)+(0-e)|0)|0;if(!e){i=1;n=278;break}nZ(e);c[(c[E>>2]|0)+24>>2]=e;c[L>>2]=c[aa>>2];if(c[z>>2]|0)i=p;else n=272}else n=272}if((n|0)==272){n=0;if(!(i<<24>>24))i=p;else n=273}if((n|0)==273){n=0;if(!(c[W>>2]|0))i=p;else{wZ(b,p,o,c[wa>>2]|0);i=p}}switch(c[da>>2]|0){case 3:{n=276;break a}case 2:{i=35;n=278;break a}default:{}}e=c[wa>>2]|0;p=i;o=e;e=tb[c[i>>2]&127](i,e,g,wa)|0}d:do if((n|0)==7){c[j>>2]=o;i=0}else if((n|0)==9){c[q>>2]=f;i=4}else if((n|0)==10){if((p|0)==(c[t>>2]|0)){if(!(a[b+488>>0]|0)){i=3;break}}else if(!(a[(c[u>>2]|0)+20>>0]|0)){c[j>>2]=o;i=0;break}if((wb[c[v>>2]&63](v,-4,g,g,p)|0)==-1)i=29;else{c[j>>2]=o;i=0}}else if((n|0)==58){e=b+280|0;do if((a[oa>>0]|0?(Fa=a[Ca>>0]|0,a[Ca>>0]=1,c[sa>>2]|0):0)?c[Ea>>2]|0:0){i=mZ(b,ta,75667,36)|0;if(!i){i=1;break d}Da=c[Da>>2]|0;c[i+20>>2]=Da;a[Ba>>0]=0;if(!(wb[c[Ea>>2]&63](c[xa>>2]|0,0,Da,c[i+16>>2]|0,c[i+24>>2]|0)|0)){i=21;break d}if(!(a[Ba>>0]|0)){a[Ca>>0]=Fa;break}if(((a[za>>0]|0)==0?(Ga=c[Aa>>2]|0,Ga|0):0)?(pb[Ga&63](c[ya>>2]|0)|0)==0:0){i=22;break d}}while(0);c[e>>2]=58;i=oZ(b,o,g,j)|0}else if((n|0)==184)i=(e|0)==28?10:(e|0)==12?17:2;else if((n|0)==189){c[b+280>>2]=59;i=0}else if((n|0)==276){c[j>>2]=c[wa>>2];i=0}while(0);l=Ha;return i|0}function jZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+32|0;q=r+16|0;m=r+12|0;i=r+8|0;j=r+4|0;k=r;c[q>>2]=0;c[m>>2]=0;c[i>>2]=0;c[k>>2]=-1;n=b+144|0;p=b+288|0;g=(d|0)!=0;a:do if(jb[(a[b+236>>0]<<24>>24?1:2)&3](d,c[n>>2]|0,e,f,p,i,j,q,m,k)|0){if((c[k>>2]|0)==1&(g^1)?(a[(c[b+356>>2]|0)+130>>0]=1,h=b+492|0,(c[h>>2]|0)==1):0)c[h>>2]=0;h=b+140|0;o=b+440|0;if(!(c[h>>2]|0))if(!(c[b+80>>2]|0)){e=0;d=0}else{wZ(b,c[n>>2]|0,e,f);e=0;d=0}else{d=c[q>>2]|0;if(!d)d=0;else{f=c[n>>2]|0;d=kZ(o,f,d,d+(vb[c[f+32>>2]&127](f,d)|0)|0)|0;if(!d){d=1;break}c[b+456>>2]=c[b+452>>2]}g=c[i>>2]|0;if(g){i=c[n>>2]|0;g=kZ(o,i,g,(c[j>>2]|0)+(0-(c[i+68>>2]|0))|0)|0;if(!g){d=1;break}}else g=0;xb[c[h>>2]&31](c[b+4>>2]|0,g,d,c[k>>2]|0);e=g}h=(d|0)!=0;do if(!(c[b+232>>2]|0)){g=c[m>>2]|0;if(g|0)if((c[g+68>>2]|0)==(c[(c[n>>2]|0)+68>>2]|0)){c[n>>2]=g;break}else{c[p>>2]=c[q>>2];d=19;break a}g=c[q>>2]|0;if(g|0){if(!h){d=c[n>>2]|0;d=kZ(o,d,g,g+(vb[c[d+32>>2]&127](d,g)|0)|0)|0;if(!d){d=1;break a}}d=UZ(b,d)|0;lZ(o);if((d|0)!=18)break a;c[p>>2]=c[q>>2];d=18;break a}}while(0);if(h|(e|0)!=0){lZ(o);d=0}else d=0}else d=g?31:30;while(0);l=r;return d|0}function kZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;do if(!(sZ(b,d,e,f)|0))d=0;else{e=b+12|0;d=c[e>>2]|0;if((d|0)==(c[b+8>>2]|0)){if(!((fZ(b)|0)<<24>>24)){d=0;break}d=c[e>>2]|0}c[e>>2]=d+1;a[d>>0]=0;d=c[b+16>>2]|0}while(0);return d|0}function lZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;e=a+4|0;b=c[e>>2]|0;d=c[a>>2]|0;a:do if(!b)c[e>>2]=d;else while(1){if(!d)break a;g=c[d>>2]|0;c[d>>2]=b;c[e>>2]=d;f=d;d=g;b=f}while(0);c[a>>2]=0;c[a+16>>2]=0;c[a+12>>2]=0;c[a+8>>2]=0;return}function mZ(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;x=e+8|0;n=c[x>>2]|0;z=e+12|0;v=e+4|0;o=(g|0)!=0;y=e+16|0;a:do if(!n)if(o){a[v>>0]=6;c[x>>2]=64;h=pb[c[c[y>>2]>>2]&63](256)|0;c[e>>2]=h;if(!h){c[x>>2]=0;h=0;break}else{u6(h|0,0,256)|0;i=SZ(b,f)|0;i=(c[x>>2]|0)+-1&i;p=26;break}}else h=0;else{w=SZ(b,f)|0;i=n+-1|0;k=c[e>>2]|0;l=w&0-n;m=i>>>2;j=0;i=w&i;while(1){h=c[k+(i<<2)>>2]|0;if(!h)break;if((TZ(f,c[h>>2]|0)|0)<<24>>24)break a;if(!(j<<24>>24))h=(l>>>((d[v>>0]|0)+-1|0)&m|1)&255;else h=j;u=h&255;j=h;i=i-u+(i>>>0>>0?n:0)|0}if(o){h=d[v>>0]|0;if((c[z>>2]|0)>>>(h+-1|0)){i=h+1|0;r=i&255;i=i&255;t=1<>2]>>2]&63](h)|0;if(!u)h=0;else{u6(u|0,0,h|0)|0;p=0-t|0;q=s>>>2;n=i+-1|0;m=c[x>>2]|0;l=0;while(1){if(l>>>0>=m>>>0)break;h=c[(c[e>>2]|0)+(l<<2)>>2]|0;o=h;if(h|0){h=SZ(b,c[h>>2]|0)|0;j=((h&p)>>>n&q|1)&255;h=h&s;i=0;while(1){k=u+(h<<2)|0;if(!(c[k>>2]|0))break;k=i<<24>>24==0?j:i;A=k&255;h=h+(h>>>0>>0?t:0)-A|0;i=k}c[k>>2]=o}l=l+1|0}db[c[(c[y>>2]|0)+8>>2]&127](c[e>>2]|0);c[e>>2]=u;a[v>>0]=r;c[x>>2]=t;j=((w&p)>>>n&q|1)&255;i=s&w;h=0;while(1){if(!(c[u+(i<<2)>>2]|0)){p=26;break a}A=h<<24>>24==0?j:h;x=A&255;i=i+(i>>>0>>0?t:0)-x|0;h=A}}}else p=26}else h=0}while(0);if((p|0)==26){h=pb[c[c[y>>2]>>2]&63](g)|0;c[(c[e>>2]|0)+(i<<2)>>2]=h;h=c[(c[e>>2]|0)+(i<<2)>>2]|0;if(!h)h=0;else{u6(h|0,0,g|0)|0;h=(c[e>>2]|0)+(i<<2)|0;c[c[h>>2]>>2]=f;c[z>>2]=(c[z>>2]|0)+1;h=c[h>>2]|0}}return h|0}function nZ(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;h=b;c=b;while(1){d=a[h>>0]|0;e=c+-1|0;f=(c|0)!=(b|0);if(!(d<<24>>24))break;g=c+1|0;switch(d<<24>>24|0){case 10:case 13:case 32:{if(f){if((a[e>>0]|0)!=32){a[c>>0]=32;c=g}}else c=b;break}default:{a[c>>0]=d;c=g}}h=h+1|0}if(f)b=(a[e>>0]|0)==32?e:c;a[b>>0]=0;return}function oZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;d=GZ(b,0,c[b+144>>2]|0,d,e,f,(a[b+484>>0]|0)==0&1)|0;if((d|0)==0?(OZ(b)|0)<<24>>24==0:0)d=1;return d|0}function pZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=c[a+356>>2]|0;e=kZ(g+80|0,b,d,e)|0;do if((e|0)!=0?(f=mZ(a,g+20|0,e,24)|0,(f|0)!=0):0){d=g+92|0;b=g+96|0;if((c[f>>2]|0)==(e|0)){c[b>>2]=c[d>>2];if(!(PZ(a,f)|0)){f=0;break}}else c[d>>2]=c[b>>2]}else f=0;while(0);return f|0}function qZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=c[b+356>>2]|0;m=j+80|0;o=j+92|0;h=c[o>>2]|0;n=j+88|0;if((h|0)==(c[n>>2]|0))if(!((fZ(m)|0)<<24>>24))g=0;else{h=c[o>>2]|0;i=4}else i=4;a:do if((i|0)==4){c[o>>2]=h+1;a[h>>0]=0;e=kZ(m,d,e,f)|0;if((e|0)!=0?(l=e+1|0,g=mZ(b,j+40|0,l,12)|0,(g|0)!=0):0){k=j+96|0;if((c[g>>2]|0)!=(l|0)){c[o>>2]=c[k>>2];break}h=c[o>>2]|0;c[k>>2]=h;if(a[b+236>>0]|0){d=a[l>>0]|0;i=j+60|0;b:do if(d<<24>>24==120)if((((a[e+2>>0]|0)==109?(a[e+3>>0]|0)==108:0)?(a[e+4>>0]|0)==110:0)?(a[e+5>>0]|0)==115:0){switch(a[e+6>>0]|0){case 0:{h=j+152|0;break}case 58:{h=mZ(b,i,e+7|0,8)|0;break}default:{f=0;d=120;break b}}c[g+4>>2]=h;a[g+9>>0]=1;break a}else{f=0;d=120}else f=0;while(0);c:while(1){switch(d<<24>>24){case 0:break a;case 58:{e=0;break c}default:{}}d=f+1|0;f=d;d=a[l+d>>0]|0}while(1){d=(h|0)==(c[n>>2]|0);if((e|0)>=(f|0))break;if(d){if(!((fZ(m)|0)<<24>>24)){g=0;break a}h=c[o>>2]|0}j=a[l+e>>0]|0;c[o>>2]=h+1;a[h>>0]=j;e=e+1|0;h=c[o>>2]|0}if(d){if(!((fZ(m)|0)<<24>>24)){g=0;break}h=c[o>>2]|0}c[o>>2]=h+1;a[h>>0]=0;b=mZ(b,i,c[k>>2]|0,8)|0;c[g+4>>2]=b;h=c[k>>2]|0;if((c[b>>2]|0)==(h|0)){c[k>>2]=c[o>>2];break}else{c[o>>2]=h;break}}}else g=0}while(0);return g|0}function rZ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=b+12|0;h=b+8|0;while(1){e=a[d>>0]|0;if(!(e<<24>>24)){i=7;break}f=c[g>>2]|0;if((f|0)==(c[h>>2]|0)){if(!((fZ(b)|0)<<24>>24)){d=0;break}f=c[g>>2]|0;e=a[d>>0]|0}c[g>>2]=f+1;a[f>>0]=e;d=d+1|0}if((i|0)==7)d=c[b+16>>2]|0;return d|0}function sZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;c[h>>2]=d;g=a+12|0;if((c[g>>2]|0)==0?(fZ(a)|0)<<24>>24==0:0)d=0;else f=3;a:do if((f|0)==3){d=b+60|0;f=a+8|0;while(1){fb[c[d>>2]&31](b,h,e,g,c[f>>2]|0);if((c[h>>2]|0)==(e|0))break;if(!((fZ(a)|0)<<24>>24)){d=0;break a}}d=c[a+16>>2]|0}while(0);l=i;return d|0}function tZ(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0;n=b+12|0;m=b+20|0;l=c[n>>2]|0;i=f<<24>>24!=0;a:do if(i|(g|0)!=0){f=0;while(1){if((f|0)>=(l|0))break;if((c[(c[m>>2]|0)+(f*12|0)>>2]|0)==(d|0)){f=1;break a}else f=f+1|0}if((i?(j=b+8|0,(c[j>>2]|0)==0):0)?(a[d+9>>0]|0)==0:0){c[j>>2]=d;k=8}else k=8}else k=8;while(0);b:do if((k|0)==8){i=b+16|0;do if((l|0)==(c[i>>2]|0)){if(!l){c[i>>2]=8;f=pb[c[h+12>>2]&63](96)|0;c[m>>2]=f;if(!f){f=0;break b}else break}f=vb[c[h+16>>2]&127](c[m>>2]|0,l*24|0)|0;if(!f){f=0;break b}c[i>>2]=l<<1;c[m>>2]=f}else f=c[m>>2]|0;while(0);i=c[n>>2]|0;c[f+(i*12|0)>>2]=d;c[f+(i*12|0)+8>>2]=g;a[f+(i*12|0)+4>>0]=e;if(!(e<<24>>24))a[d+8>>0]=1;c[n>>2]=i+1;f=1}while(0);return f|0}function uZ(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;b=RZ(b,d,e,f,g,h)|0;do if(!b){d=h+12|0;b=c[d>>2]|0;if((e<<24>>24==0?(b|0)!=(c[h+16>>2]|0):0)?(i=b+-1|0,(a[i>>0]|0)==32):0){c[d>>2]=i;b=i}if((b|0)==(c[h+8>>2]|0)){if(!((fZ(h)|0)<<24>>24)){b=1;break}b=c[d>>2]|0}c[d>>2]=b+1;a[b>>0]=0;b=0}while(0);return b|0}function vZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;H=l;l=l+16|0;B=H;C=H+4|0;g=c[b+356>>2]|0;D=g+104|0;F=b+276|0;E=c[F>>2]|0;c[F>>2]=1;if((c[D>>2]|0)==0?(fZ(D)|0)<<24>>24==0:0)g=1;else{n=d+20|0;o=b+144|0;p=g+116|0;q=g+112|0;r=d+68|0;s=b+488|0;t=b+416|0;u=g+132|0;v=b+432|0;w=b+428|0;x=g+130|0;y=g+128|0;z=b+228|0;A=b+112|0;j=g+131|0;k=b+116|0;m=d+44|0;a:while(1){b:do switch(tb[c[n>>2]&127](d,e,f,B)|0){case -4:{g=0;break a}case -1:{G=39;break a}case 0:{G=41;break a}case 28:{if((a[s>>0]|0)==0?(c[o>>2]|0)==(d|0):0){G=19;break a}g=c[r>>2]|0;g=kZ(t,d,e+g|0,(c[B>>2]|0)+(0-g)|0)|0;if(!g){g=1;break a}h=mZ(b,u,g,0)|0;c[w>>2]=c[v>>2];if(!h){G=9;break a}i=h+32|0;if(a[i>>0]|0){G=11;break a}g=c[h+16>>2]|0;if(!g){a[i>>0]=1;g=c[h+4>>2]|0;g=vZ(b,c[z>>2]|0,g,g+(c[h+8>>2]|0)|0)|0;a[i>>0]=0;if(!g)break b;else break a}e=c[A>>2]|0;if(e|0){a[j>>0]=0;a[i>>0]=1;h=(wb[e&63](c[k>>2]|0,0,c[h+20>>2]|0,g,c[h+24>>2]|0)|0)==0;a[i>>0]=0;if(h){g=21;break a}if(a[j>>0]|0)break b}a[y>>0]=a[x>>0]|0;break}case 6:case 9:{if(!(sZ(D,d,e,c[B>>2]|0)|0)){g=1;break a}break}case -3:{c[B>>2]=e+(c[r>>2]|0);G=22;break}case 7:{G=22;break}case 10:{g=vb[c[m>>2]&127](d,e)|0;if((g|0)<0){G=27;break a}h=h_(g,C)|0;if(!h){G=30;break a}else e=0;while(1){if((e|0)>=(h|0))break;g=c[p>>2]|0;if((c[q>>2]|0)==(g|0)){if(!((fZ(D)|0)<<24>>24)){g=1;G=37;break a}g=c[p>>2]|0}i=a[C+e>>0]|0;c[p>>2]=g+1;a[g>>0]=i;e=e+1|0}break}default:{G=43;break a}}while(0);if((G|0)==22){G=0;g=c[p>>2]|0;if((c[q>>2]|0)==(g|0)){if(!((fZ(D)|0)<<24>>24)){g=1;break}g=c[p>>2]|0}c[p>>2]=g+1;a[g>>0]=10}e=c[B>>2]|0}if((G|0)==9){a[y>>0]=a[x>>0]|0;g=0}else if((G|0)==11)if((c[o>>2]|0)==(d|0)){c[b+288>>2]=e;g=12}else g=12;else if((G|0)==19){c[b+288>>2]=e;g=10}else if((G|0)==27)if((c[o>>2]|0)==(d|0)){c[b+288>>2]=e;g=14;G=37}else{g=14;G=37}else if((G|0)==30)if((c[o>>2]|0)==(d|0)){c[b+288>>2]=e;g=14;G=37}else{g=14;G=37}else if((G|0)==39)if((c[o>>2]|0)==(d|0)){c[b+288>>2]=e;g=4}else g=4;else if((G|0)==41)if((c[o>>2]|0)==(d|0)){c[b+288>>2]=c[B>>2];g=4}else g=4;else if((G|0)==43)if((c[o>>2]|0)==(d|0)){c[b+288>>2]=e;g=23}else g=23;c[F>>2]=E}l=H;return g|0}function wZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;n=p;o=p+4|0;c[n>>2]=e;if(!(a[d+72>>0]|0)){if((c[b+144>>2]|0)==(d|0)){g=b+292|0;h=b+288|0}else{h=c[b+300>>2]|0;g=h+4|0}i=b+44|0;j=d+60|0;k=b+48|0;m=b+80|0;e=b+4|0;do{c[o>>2]=c[i>>2];fb[c[j>>2]&31](d,n,f,o,c[k>>2]|0);c[g>>2]=c[n>>2];b=c[i>>2]|0;rb[c[m>>2]&127](c[e>>2]|0,b,(c[o>>2]|0)-b|0);c[h>>2]=c[n>>2]}while((c[n>>2]|0)!=(f|0))}else rb[c[b+80>>2]&127](c[b+4>>2]|0,e,f-e|0);l=p;return}function xZ(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;j=m;k=c[d>>2]|0;if((c[a+144>>2]|0)==(b|0)){i=a+288|0;c[i>>2]=k;h=a+292|0}else{i=c[a+300>>2]|0;h=i+4|0}c[i>>2]=k;c[d>>2]=0;n=tb[c[b+12>>2]&127](b,k,e,j)|0;e=c[j>>2]|0;c[h>>2]=e;h=g<<24>>24!=0;switch(n|0){case 42:{if(c[a+80>>2]|0){wZ(a,b,k,e);e=c[j>>2]|0}c[d>>2]=e;c[f>>2]=e;e=(c[a+480>>2]|0)==2?35:0;break}case 0:{c[i>>2]=e;e=4;break}case -2:{if(h){c[f>>2]=k;e=0}else e=6;break}case -4:case -1:{if(h){c[f>>2]=k;e=0}else e=2;break}default:{c[i>>2]=e;e=23}}l=m;return e|0}function yZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;g=h;c[g>>2]=d;d=xZ(b,c[b+144>>2]|0,g,e,f,(a[b+484>>0]|0)==0&1)|0;if(!d){d=c[g>>2]|0;if(!d)d=0;else{c[b+280>>2]=57;d=hZ(b,d,e,f)|0}}l=h;return d|0}function zZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=c[a+356>>2]|0;k=j+184|0;f=a+12|0;if(!(c[k>>2]|0)){b=pb[c[f>>2]&63](c[a+468>>2]<<2)|0;c[k>>2]=b;if(!b)b=-1;else{c[b>>2]=0;d=4}}else d=4;do if((d|0)==4){i=j+176|0;b=c[i>>2]|0;g=j+172|0;d=c[g>>2]|0;h=j+164|0;e=c[h>>2]|0;if(b>>>0>>0)g=e;else{if(!e){b=pb[c[f>>2]&63](896)|0;if(!b){b=-1;break}else{d=b;b=32}}else{b=vb[c[a+16>>2]&127](e,d*56|0)|0;if(!b){b=-1;break}d=b;b=c[g>>2]<<1}c[g>>2]=b;c[h>>2]=d;b=c[i>>2]|0;g=d}c[i>>2]=b+1;d=c[j+180>>2]|0;if(d|0){a=c[(c[k>>2]|0)+(d+-1<<2)>>2]|0;f=g+(a*28|0)+16|0;d=c[f>>2]|0;if(d|0)c[g+(d*28|0)+24>>2]=b;d=g+(a*28|0)+20|0;e=c[d>>2]|0;if(!e)c[g+(a*28|0)+12>>2]=b;c[f>>2]=b;c[d>>2]=e+1}k=g+(b*28|0)+12|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0}while(0);return b|0}function AZ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+16|0;p=r;q=b+304|0;f=c[q>>2]|0;if(!f){f=pb[c[b+12>>2]&63](24)|0;if(!f)f=1;else{o=f;g=4}}else{c[q>>2]=c[f+8>>2];o=f;g=4}do if((g|0)==4){j=d+32|0;a[j>>0]=1;k=d+12|0;c[k>>2]=0;m=b+300|0;n=o+8|0;c[n>>2]=c[m>>2];c[m>>2]=o;c[o+12>>2]=d;h=c[b+312>>2]|0;c[o+16>>2]=h;a[o+20>>0]=e;c[o>>2]=0;c[o+4>>2]=0;e=c[d+4>>2]|0;i=e+(c[d+8>>2]|0)|0;f=b+228|0;g=c[f>>2]|0;if(!(a[d+33>>0]|0))f=GZ(b,h,g,e,i,p,0)|0;else{d=tb[c[g>>2]&127](g,e,i,p)|0;f=iZ(b,c[f>>2]|0,e,i,d,c[p>>2]|0,p,0)|0}if(!f){f=c[p>>2]|0;if((i|0)!=(f|0)?(c[b+480>>2]|0)==3:0){c[k>>2]=f-e;c[b+280>>2]=60;f=0;break}a[j>>0]=0;c[m>>2]=c[n>>2];c[n>>2]=c[q>>2];c[q>>2]=o;f=0}}while(0);l=r;return f|0}function BZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+16|0;d=g+4|0;e=g;b=c[a+356>>2]|0;f=b+176|0;b=pb[c[a+12>>2]&63](((c[f>>2]|0)*20|0)+(c[b+168>>2]|0)|0)|0;if(!b)b=0;else{c[e>>2]=b+((c[f>>2]|0)*20|0);c[d>>2]=b+20;FZ(a,0,b,d,e)}l=g;return b|0}function CZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=a+64|0;if(!(c[j>>2]|0))if(!(c[a+80>>2]|0))d=1;else{wZ(a,b,d,e);d=1}else{h=b+68|0;g=d+(c[h>>2]<<1)|0;d=g+(vb[c[b+32>>2]&127](b,g)|0)|0;f=a+416|0;g=kZ(f,b,g,d)|0;if((g|0)!=0?(c[a+432>>2]=c[a+428>>2],i=vb[c[b+36>>2]&127](b,d)|0,i=kZ(f,b,i,e+(0-(c[h>>2]<<1))|0)|0,(i|0)!=0):0){EZ(i);rb[c[j>>2]&127](c[a+4>>2]|0,g,i);lZ(f);d=1}else d=0}return d|0}function DZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=a+68|0;if(!(c[g>>2]|0))if(!(c[a+80>>2]|0))b=1;else{wZ(a,b,d,e);b=1}else{f=a+416|0;h=c[b+68>>2]|0;b=kZ(f,b,d+(h<<2)|0,e+(S(h,-3)|0)|0)|0;if(!b)b=0;else{EZ(b);lb[c[g>>2]&63](c[a+4>>2]|0,b);lZ(f);b=1}}return b|0}function EZ(b){b=b|0;var c=0,d=0,e=0,f=0;a:while(1){switch(a[b>>0]|0){case 0:break a;case 13:{f=b;e=13;c=4;break a}default:{}}b=b+1|0}if((c|0)==4){while(1){c=f;f=f+1|0;d=b+1|0;if(e<<24>>24==13){a[c>>0]=10;b=(a[d>>0]|0)==10?b+2|0:d}else{a[c>>0]=e;b=d}e=a[b>>0]|0;if(!(e<<24>>24))break;else c=4}a[f>>0]=0}return}function FZ(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;k=(c[b+356>>2]|0)+164|0;h=c[k>>2]|0;m=c[h+(d*28|0)>>2]|0;c[e>>2]=m;c[e+4>>2]=c[h+(d*28|0)+4>>2];l=e+12|0;i=e+8|0;j=e+16|0;if((m|0)==4){c[i>>2]=c[g>>2];e=c[h+(d*28|0)+8>>2]|0;while(1){k=a[e>>0]|0;m=c[g>>2]|0;c[g>>2]=m+1;a[m>>0]=k;if(!(a[e>>0]|0))break;else e=e+1|0}c[l>>2]=0;c[j>>2]=0}else{h=c[h+(d*28|0)+20>>2]|0;c[l>>2]=h;c[j>>2]=c[f>>2];c[f>>2]=(c[f>>2]|0)+(h*20|0);e=(c[k>>2]|0)+(d*28|0)+12|0;d=0;while(1){e=c[e>>2]|0;if(d>>>0>=h>>>0)break;FZ(b,e,(c[j>>2]|0)+(d*20|0)|0,f,g);e=(c[k>>2]|0)+(e*28|0)+24|0;d=d+1|0;h=c[l>>2]|0}c[i>>2]=0}return}function GZ(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0;ma=l;l=l+48|0;ja=ma+28|0;_=ma+32|0;ka=ma+24|0;Y=ma;c[ja>>2]=f;Z=c[b+356>>2]|0;if((c[b+144>>2]|0)==(e|0)){ea=b+288|0;$=b+292|0}else{$=c[b+300>>2]|0;ea=$;$=$+4|0}c[ea>>2]=f;t=e+4|0;aa=e+72|0;u=b+56|0;v=b+376|0;ba=b+48|0;ga=b+80|0;w=e+68|0;ca=b+44|0;ha=b+312|0;x=b+52|0;da=e+60|0;y=e+32|0;z=b+104|0;A=b+416|0;B=b+392|0;C=b+368|0;fa=b+60|0;ia=b+4|0;D=b+364|0;E=b+432|0;F=b+428|0;G=b+480|0;H=e+48|0;I=Z+80|0;J=Z+96|0;K=Z+92|0;L=Z+129|0;M=b+120|0;N=b+112|0;O=b+116|0;P=b+308|0;Q=Z+130|0;R=b+12|0;S=b+16|0;T=b+236|0;U=b+237|0;V=b+472|0;W=e+44|0;X=b+72|0;a:while(1){s=c[ja>>2]|0;c[_>>2]=s;s=tb[c[t>>2]&127](e,s,g,_)|0;f=c[_>>2]|0;c[$>>2]=f;k=f;b:do switch(s|0){case -3:{la=6;break a}case -4:{la=15;break a}case 0:{la=20;break a}case -1:{la=21;break a}case -2:{la=23;break a}case 12:{f=17;break a}case -5:{la=136;break a}case 9:{s=c[w>>2]|0;s=(eb[c[H>>2]&63](e,(c[ja>>2]|0)+s|0,k+(0-s)|0)|0)&255;a[ka>>0]=s;do if(s<<24>>24){f=c[fa>>2]|0;if(f|0){rb[f&127](c[ia>>2]|0,ka,1);break}if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,c[_>>2]|0)}else{j=c[w>>2]|0;j=kZ(I,e,(c[ja>>2]|0)+j|0,(c[_>>2]|0)+(0-j)|0)|0;if(!j){f=1;la=56;break a}k=mZ(b,Z,j,0)|0;c[K>>2]=c[J>>2];f=(k|0)!=0;if((a[L>>0]|0)!=0?(a[Q>>0]|0)==0:0){if(!f){f=c[M>>2]|0;if(f|0){rb[f&127](c[ia>>2]|0,j,0);break}if(!(c[ga>>2]|0))break;wZ(b,e,c[ja>>2]|0,c[_>>2]|0);break}}else{if(!f){f=11;la=56;break a}if(!(a[k+34>>0]|0)){f=24;la=56;break a}}f=k+32|0;if(a[f>>0]|0){f=12;la=56;break a}if(c[k+28>>2]|0){f=15;la=56;break a}if(!(c[k+4>>2]|0)){if(!(c[N>>2]|0)){if(!(c[ga>>2]|0))break;wZ(b,e,c[ja>>2]|0,c[_>>2]|0);break}a[f>>0]=1;j=IZ(b)|0;a[f>>0]=0;if(!j){f=1;la=56;break a}if(!(wb[c[N>>2]&63](c[O>>2]|0,j,c[k+20>>2]|0,c[k+16>>2]|0,c[k+24>>2]|0)|0)){f=21;la=56;break a}c[F>>2]=c[E>>2];break}if(a[P>>0]|0){f=AZ(b,k,0)|0;if(!f)break;else{la=58;break a}}f=c[M>>2]|0;if(!f){if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,c[_>>2]|0)}else rb[f&127](c[ia>>2]|0,c[k>>2]|0,0);break b}while(0);break}case 1:case 2:{f=c[C>>2]|0;if(!f){f=pb[c[R>>2]&63](48)|0;if(!f){f=1;la=75;break a}j=pb[c[R>>2]&63](32)|0;c[f+36>>2]=j;if(!j){la=63;break a}c[f+40>>2]=j+32}else c[C>>2]=c[f>>2];o=f+44|0;c[o>>2]=0;c[f>>2]=c[D>>2];c[D>>2]=f;s=f+12|0;c[f+16>>2]=0;c[f+20>>2]=0;p=(c[ja>>2]|0)+(c[w>>2]|0)|0;q=f+4|0;c[q>>2]=p;p=vb[c[y>>2]&127](e,p)|0;c[f+8>>2]=p;c[ha>>2]=(c[ha>>2]|0)+1;q=c[q>>2]|0;p=q+p|0;c[Y>>2]=q;q=f+36|0;c[ka>>2]=c[q>>2];r=f+40|0;j=c[r>>2]|0;while(1){fb[c[da>>2]&31](e,Y,p,ka,j+-1|0);j=c[ka>>2]|0;m=c[q>>2]|0;k=m;n=j-k|0;if((c[Y>>2]|0)==(p|0))break;k=(c[r>>2]|0)-k<<1;j=vb[c[S>>2]&127](m,k)|0;if(!j){la=69;break a}c[q>>2]=j;m=j+k|0;c[r>>2]=m;c[ka>>2]=j+n;j=m}c[f+24>>2]=n;c[s>>2]=k;a[j>>0]=0;f=JZ(b,e,c[ja>>2]|0,s,o)|0;if(f|0){la=75;break a}f=c[x>>2]|0;if(!f){if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,c[_>>2]|0)}else rb[f&127](c[ia>>2]|0,c[s>>2]|0,c[B>>2]|0);lZ(A);break}case 3:case 4:{s=(c[ja>>2]|0)+(c[w>>2]|0)|0;c[ka>>2]=0;s=kZ(A,e,s,s+(vb[c[y>>2]&127](e,s)|0)|0)|0;c[Y>>2]=s;if(!s){f=1;la=93;break a}c[E>>2]=c[F>>2];f=JZ(b,e,c[ja>>2]|0,Y,ka)|0;if(f|0){la=93;break a}c[E>>2]=c[F>>2];f=c[x>>2]|0;if(!f)j=1;else{rb[f&127](c[ia>>2]|0,c[Y>>2]|0,c[B>>2]|0);j=0}f=c[u>>2]|0;if(!f){if(j|0?c[ga>>2]|0:0)wZ(b,e,c[ja>>2]|0,c[_>>2]|0)}else{if(c[x>>2]|0){c[ea>>2]=c[$>>2];f=c[u>>2]|0}lb[f&63](c[ia>>2]|0,c[Y>>2]|0)}lZ(A);f=c[ka>>2]|0;while(1){if(!f)break;j=c[z>>2]|0;if(j|0)lb[j&63](c[ia>>2]|0,c[c[f>>2]>>2]|0);s=c[f+4>>2]|0;c[ka>>2]=s;c[f+4>>2]=c[v>>2];c[v>>2]=f;c[(c[f>>2]|0)+4>>2]=c[f+8>>2];f=s}if(!(c[ha>>2]|0)){la=95;break a}break}case 5:{if((c[ha>>2]|0)==(d|0)){f=13;break a}o=c[D>>2]|0;c[D>>2]=c[o>>2];c[o>>2]=c[C>>2];c[C>>2]=o;f=(c[ja>>2]|0)+(c[w>>2]<<1)|0;j=vb[c[y>>2]&127](e,f)|0;if((j|0)!=(c[o+8>>2]|0)){la=99;break a}if(g2(c[o+4>>2]|0,f,j)|0){la=99;break a}c[ha>>2]=(c[ha>>2]|0)+-1;f=c[u>>2]|0;if(!f){if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,c[_>>2]|0)}else{j=c[o+16>>2]|0;n=o+12|0;if((j|0)!=0&(a[T>>0]|0)!=0){f=(c[n>>2]|0)+(c[o+28>>2]|0)|0;while(1){k=a[j>>0]|0;m=f+1|0;if(!(k<<24>>24))break;a[f>>0]=k;f=m;j=j+1|0}j=c[o+20>>2]|0;c:do if((j|0)!=0&(a[U>>0]|0)!=0){a[f>>0]=a[V>>0]|0;f=m;while(1){k=a[j>>0]|0;if(!(k<<24>>24))break c;a[f>>0]=k;j=j+1|0;f=f+1|0}}while(0);a[f>>0]=0;f=c[u>>2]|0}lb[f&63](c[ia>>2]|0,c[n>>2]|0)}j=o+44|0;k=c[j>>2]|0;while(1){if(!k)break;f=c[z>>2]|0;if(!f)f=k;else{lb[f&63](c[ia>>2]|0,c[c[k>>2]>>2]|0);f=c[j>>2]|0}s=c[f+4>>2]|0;c[j>>2]=s;c[k+4>>2]=c[v>>2];c[v>>2]=k;c[(c[k>>2]|0)+4>>2]=c[k+8>>2];k=s}if(!(c[ha>>2]|0)){la=119;break a}break}case 10:{f=vb[c[W>>2]&127](e,c[ja>>2]|0)|0;if((f|0)<0){f=14;break a}j=c[fa>>2]|0;if(j|0){r=c[ia>>2]|0;s=h_(f,ka)|0;rb[j&127](r,ka,s);break b}if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,c[_>>2]|0);break}case 7:{f=c[fa>>2]|0;if(f|0){a[ka>>0]=10;rb[f&127](c[ia>>2]|0,ka,1);break b}if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,k);break}case 8:{f=c[X>>2]|0;if(!f){if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,k)}else db[f&127](c[ia>>2]|0);f=LZ(b,e,_,g,h,i)|0;if(f|0)break a;if(!(c[_>>2]|0)){la=135;break a}break}case 6:{j=c[fa>>2]|0;if(!j){if(!(c[ga>>2]|0))break b;wZ(b,e,c[ja>>2]|0,k);break b}if(!(a[aa>>0]|0))f=k;else{s=c[ja>>2]|0;rb[j&127](c[ia>>2]|0,s,f-s|0);break b}while(1){c[ka>>2]=c[ca>>2];fb[c[da>>2]&31](e,ja,f,ka,c[ba>>2]|0);c[$>>2]=c[ja>>2];f=c[ca>>2]|0;rb[j&127](c[ia>>2]|0,f,(c[ka>>2]|0)-f|0);f=c[ja>>2]|0;if((f|0)==(c[_>>2]|0))break;c[ea>>2]=f;f=c[_>>2]|0}break}case 11:{if(!(CZ(b,e,c[ja>>2]|0,k)|0)){f=1;break a}break}case 13:{if(!(DZ(b,e,c[ja>>2]|0,k)|0)){f=1;break a}break}default:if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,k)}while(0);s=c[_>>2]|0;c[ja>>2]=s;c[ea>>2]=s;switch(c[G>>2]|0){case 2:{f=35;break a}case 3:{la=162;break a}default:{}}}switch(la|0){case 6:{j=(d|0)==0;if(i<<24>>24){c[h>>2]=c[ja>>2];f=0;break}c[$>>2]=g;f=c[fa>>2]|0;if(!f){if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,g)}else{a[ka>>0]=10;rb[f&127](c[ia>>2]|0,ka,1)}if(!j)if((c[ha>>2]|0)==(d|0)){c[h>>2]=g;f=0}else f=13;else f=3;break}case 15:{if(i<<24>>24){c[h>>2]=c[ja>>2];f=0;break}if((d|0)>0)if((c[ha>>2]|0)==(d|0)){c[h>>2]=c[ja>>2];f=0}else f=13;else f=3;break}case 20:{c[ea>>2]=f;f=4;break}case 21:{if(!(i<<24>>24))f=5;else{c[h>>2]=c[ja>>2];f=0}break}case 23:{if(!(i<<24>>24))f=6;else{c[h>>2]=c[ja>>2];f=0}break}case 56:break;case 58:break;case 63:{db[c[b+20>>2]&127](f);f=1;la=75;break}case 69:{f=1;la=75;break}case 93:break;case 95:{f=KZ(b,c[_>>2]|0,g,h)|0;break}case 99:{c[ea>>2]=f;f=7;break}case 119:{f=KZ(b,c[_>>2]|0,g,h)|0;break}case 135:{c[b+280>>2]=61;f=0;break}case 136:{j=(d|0)==0;if(i<<24>>24){c[h>>2]=c[ja>>2];f=0;break}f=c[fa>>2]|0;do if(!f){if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,g)}else if(!(a[aa>>0]|0)){c[ka>>2]=c[ca>>2];fb[c[da>>2]&31](e,ja,g,ka,c[ba>>2]|0);ja=c[ca>>2]|0;rb[c[fa>>2]&127](c[ia>>2]|0,ja,(c[ka>>2]|0)-ja|0);break}else{ka=c[ja>>2]|0;rb[f&127](c[ia>>2]|0,ka,g-ka|0);break}while(0);if(j){c[ea>>2]=g;f=3;break}if((c[ha>>2]|0)==(d|0)){c[h>>2]=g;f=0;break}else{c[ea>>2]=g;f=13;break}}case 162:{c[h>>2]=c[_>>2];f=0;break}}l=ma;return f|0}function HZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+16|0;r=s;n=b+300|0;o=c[n>>2]|0;do if(o){p=c[o+12>>2]|0;j=p+4|0;m=c[j>>2]|0;k=p+12|0;g=m+(c[k>>2]|0)|0;m=m+(c[p+8>>2]|0)|0;q=p+33|0;h=b+228|0;i=c[h>>2]|0;if(!(a[q>>0]|0))g=GZ(b,c[o+16>>2]|0,i,g,m,r,0)|0;else{i=tb[c[i>>2]&127](i,g,m,r)|0;g=iZ(b,c[h>>2]|0,g,m,i,c[r>>2]|0,r,0)|0}if(!g){g=c[r>>2]|0;if((m|0)!=(g|0)?(c[b+480>>2]|0)==3:0){c[k>>2]=g-(c[j>>2]|0);g=0;break}a[p+32>>0]=0;h=o+8|0;c[n>>2]=c[h>>2];g=b+304|0;c[h>>2]=c[g>>2];c[g>>2]=o;g=b+280|0;h=b+144|0;i=c[h>>2]|0;if(!(a[q>>0]|0)){c[g>>2]=58;g=GZ(b,(c[b+476>>2]|0)!=0&1,i,d,e,f,(a[b+484>>0]|0)==0&1)|0;break}else{c[g>>2]=57;g=tb[c[i>>2]&127](i,d,e,r)|0;g=iZ(b,c[h>>2]|0,d,e,g,c[r>>2]|0,f,(a[b+484>>0]|0)==0&1)|0;break}}}else g=23;while(0);l=s;return g|0}function IZ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+16|0;k=p;i=c[b+356>>2]|0;g=i+156|0;j=b+472|0;n=b+416|0;o=b+428|0;m=b+424|0;a:do if(!(c[g>>2]|0)){d=0;h=11}else{d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break}d=c[o>>2]|0}c[o>>2]=d+1;a[d>>0]=61;e=(((a[j>>0]|0)!=0)<<31>>31)+(c[(c[g>>2]|0)+20>>2]|0)|0;f=0;while(1){if((f|0)>=(e|0)){d=1;h=11;break a}d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break a}d=c[o>>2]|0}q=a[(c[(c[g>>2]|0)+16>>2]|0)+f>>0]|0;c[o>>2]=d+1;a[d>>0]=q;f=f+1|0}}while(0);b:do if((h|0)==11){aZ(k,i+60|0);c:while(1){do{e=bZ(k)|0;if(!e)break c;h=e+4|0}while(!(c[h>>2]|0));if(d<<24>>24){d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break b}d=c[o>>2]|0}c[o>>2]=d+1;a[d>>0]=12}g=c[e>>2]|0;while(1){e=a[g>>0]|0;d=c[o>>2]|0;f=(d|0)==(c[m>>2]|0);if(!(e<<24>>24))break;if(f){if(!((fZ(n)|0)<<24>>24)){d=0;break b}d=c[o>>2]|0;e=a[g>>0]|0}c[o>>2]=d+1;a[d>>0]=e;g=g+1|0}if(f){if(!((fZ(n)|0)<<24>>24)){d=0;break b}d=c[o>>2]|0}c[o>>2]=d+1;a[d>>0]=61;f=(((a[j>>0]|0)!=0)<<31>>31)+(c[(c[h>>2]|0)+20>>2]|0)|0;e=0;while(1){if((e|0)>=(f|0)){d=1;continue c}d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break b}d=c[o>>2]|0}q=a[(c[(c[h>>2]|0)+16>>2]|0)+e>>0]|0;c[o>>2]=d+1;a[d>>0]=q;e=e+1|0}}aZ(k,i);d:while(1){do{e=bZ(k)|0;if(!e)break d}while(!(a[e+32>>0]|0));if(d<<24>>24){d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break b}d=c[o>>2]|0}c[o>>2]=d+1;a[d>>0]=12}f=c[e>>2]|0;while(1){e=a[f>>0]|0;if(!(e<<24>>24)){d=1;continue d}d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break b}d=c[o>>2]|0;e=a[f>>0]|0}c[o>>2]=d+1;a[d>>0]=e;f=f+1|0}}d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break}d=c[o>>2]|0}c[o>>2]=d+1;a[d>>0]=0;d=c[b+432>>2]|0}while(0);l=p;return d|0}function JZ(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;L=c[b+356>>2]|0;k=L+20|0;i=mZ(b,k,c[g>>2]|0,0)|0;K=b+236|0;if(!i){i=eZ(L+80|0,c[g>>2]|0)|0;if((i|0)!=0?(j=mZ(b,k,i,24)|0,(j|0)!=0):0)if((a[K>>0]|0)!=0?(PZ(b,j)|0)==0:0)i=1;else A=6;else i=1}else{j=i;A=6}a:do if((A|0)==6){w=c[j+12>>2]|0;l=e+40|0;i=b+380|0;s=b+392|0;t=tb[c[l>>2]&127](e,f,c[i>>2]|0,c[s>>2]|0)|0;k=t+w|0;m=c[i>>2]|0;z=b+16|0;if((k|0)>(m|0)){J=k+16|0;c[i>>2]=J;i=vb[c[z>>2]&127](c[s>>2]|0,J<<4)|0;if(!i){i=1;break}c[s>>2]=i;if((t|0)>(m|0))tb[c[l>>2]&127](e,f,t,i)|0}J=c[s>>2]|0;v=j+20|0;G=b+416|0;H=b+432|0;I=b+428|0;q=e+32|0;r=0;p=0;k=0;while(1){if((p|0)>=(t|0))break;o=c[(c[s>>2]|0)+(p<<4)>>2]|0;o=qZ(b,e,o,o+(vb[c[q>>2]&127](e,o)|0)|0)|0;if(!o){i=1;break a}i=(c[o>>2]|0)+-1|0;if(a[i>>0]|0){A=14;break}a[i>>0]=1;c[J+(r<<2)>>2]=c[o>>2];F=c[s>>2]|0;n=J+(r+1<<2)|0;m=F+(p<<4)+4|0;f=F+(p<<4)+8|0;if(a[F+(p<<4)+12>>0]|0){F=kZ(G,e,c[m>>2]|0,c[f>>2]|0)|0;c[n>>2]=F;if(!F){i=1;break a}}else{b:do if(!(a[o+8>>0]|0))i=1;else{i=0;while(1){if((i|0)>=(w|0)){i=1;break b}l=c[v>>2]|0;if((o|0)==(c[l+(i*12|0)>>2]|0))break;i=i+1|0}i=a[l+(i*12|0)+4>>0]|0}while(0);i=uZ(b,e,i,c[m>>2]|0,c[f>>2]|0,G)|0;if(i|0)break a;c[n>>2]=c[H>>2]}c[H>>2]=c[I>>2];l=c[o+4>>2]|0;i=r+2|0;do if(l)if(a[o+9>>0]|0){i=QZ(b,l,o,c[n>>2]|0,h)|0;if(!i){i=r;break}else break a}else{a[(c[o>>2]|0)+-1>>0]=2;k=k+1|0;break}while(0);r=i;p=p+1|0}if((A|0)==14){if((c[b+144>>2]|0)!=(e|0)){i=8;break}c[b+288>>2]=c[(c[s>>2]|0)+(p<<4)>>2];i=8;break}c[b+384>>2]=r;i=c[j+8>>2]|0;c:do if((i|0)!=0?(u=c[i>>2]|0,(a[u+-1>>0]|0)!=0):0){i=0;while(1){if((i|0)>=(r|0)){p=0;q=k;E=r;break c}if((c[J+(i<<2)>>2]|0)==(u|0)){A=35;break c}i=i+2|0}}else{i=-1;A=35}while(0);if((A|0)==35){c[b+388>>2]=i;p=0;q=k;E=r}while(1){n=J+(E<<2)|0;if((p|0)>=(w|0))break;i=c[v>>2]|0;o=i+(p*12|0)|0;l=c[o>>2]|0;m=(c[l>>2]|0)+-1|0;d:do if((a[m>>0]|0)==0?(x=i+(p*12|0)+8|0,y=c[x>>2]|0,(y|0)!=0):0){k=c[l+4>>2]|0;i=E+2|0;f=J+(E+1<<2)|0;do if(k)if(a[l+9>>0]|0){i=QZ(b,k,l,y,h)|0;if(!i){k=q;i=E;break d}else break a}else{a[m>>0]=2;k=q+1|0;break}else{a[m>>0]=1;k=q}while(0);c[n>>2]=c[c[o>>2]>>2];c[f>>2]=c[x>>2]}else{k=q;i=E}while(0);p=p+1|0;q=k;E=i}c[n>>2]=0;F=b+472|0;D=b+237|0;e:do if(!q)i=0;else{m=b+400|0;l=c[m>>2]|0;B=b+404|0;i=a[B>>0]|0;k=i&255;C=b+396|0;if(!(q<<1>>k)){i=1<>24}while((q>>(A&255)|0)!=0);k=(i&255)>3?i:3;a[B>>0]=k;k=k&255;i=vb[c[z>>2]&127](c[C>>2]|0,12<>2]=i;k=1<>2]|0)+(A*12|0)>>2]=-1;i=A}}while(0);A=i+-1|0;c[m>>2]=A;u=b+496|0;v=L+40|0;w=b+424|0;x=k+-1|0;y=0-k|0;z=x>>>2;i=0;e=q;do{while(1){if((i|0)>=(E|0))break e;t=J+(i<<2)|0;p=c[t>>2]|0;l=p+-1|0;if((a[l>>0]|0)==2)break;a[l>>0]=0;i=i+2|0}m=c[u>>2]|0;a[l>>0]=0;s=c[(c[(mZ(b,v,p,0)|0)+4>>2]|0)+4>>2]|0;if(!s){i=27;break a}n=s+20|0;o=s+16|0;q=m;m=0;while(1){if((m|0)>=(c[n>>2]|0)){l=p;break}f=a[(c[o>>2]|0)+m>>0]|0;l=c[I>>2]|0;if((l|0)==(c[w>>2]|0)){if(!((fZ(G)|0)<<24>>24)){i=1;break a}l=c[I>>2]|0}c[I>>2]=l+1;a[l>>0]=f;q=f&255^q*1000003;m=m+1|0}while(1){m=l+1|0;if((a[l>>0]|0)==58)break;else l=m}while(1){n=a[m>>0]|0;l=c[I>>2]|0;if((l|0)==(c[w>>2]|0)){if(!((fZ(G)|0)<<24>>24)){i=1;break a}l=c[I>>2]|0;f=a[m>>0]|0}else f=n;c[I>>2]=l+1;a[l>>0]=f;q=n&255^q*1000003;if(!(a[m>>0]|0))break;else m=m+1|0}o=c[C>>2]|0;p=q&y;l=0;r=q&x;while(1){if((c[o+(r*12|0)>>2]|0)!=(A|0))break;if((q|0)==(c[o+(r*12|0)+4>>2]|0)){m=c[o+(r*12|0)+8>>2]|0;f=c[H>>2]|0;while(1){M=a[f>>0]|0;n=M<<24>>24==0;if(n|M<<24>>24!=(a[m>>0]|0))break;m=m+1|0;f=f+1|0}if(n){i=8;break a}}if(!(l<<24>>24))l=(p>>>((d[B>>0]|0)+-1|0)&z|1)&255;M=l&255;r=r+((r|0)<(M|0)?k:0)-M|0}if(a[D>>0]|0){a[(c[I>>2]|0)+-1>>0]=a[F>>0]|0;m=c[c[s>>2]>>2]|0;while(1){l=c[I>>2]|0;if((l|0)==(c[w>>2]|0)){if(!((fZ(G)|0)<<24>>24)){i=1;break a}l=c[I>>2]|0}M=a[m>>0]|0;c[I>>2]=l+1;a[l>>0]=M;if(!(a[m>>0]|0))break;else m=m+1|0}}s=c[H>>2]|0;c[H>>2]=c[I>>2];c[t>>2]=s;M=c[C>>2]|0;c[M+(r*12|0)>>2]=A;c[M+(r*12|0)+4>>2]=q;c[M+(r*12|0)+8>>2]=s;e=e+-1|0;i=i+2|0}while((e|0)!=0)}while(0);while(1){if((i|0)>=(E|0)){i=h;break}a[(c[J+(i<<2)>>2]|0)+-1>>0]=0;i=i+2|0}while(1){i=c[i>>2]|0;if(!i)break;a[(c[c[i+12>>2]>>2]|0)+-1>>0]=0;i=i+4|0}if(!(a[K>>0]|0))i=0;else{i=c[j+4>>2]|0;if(!i){i=c[L+156>>2]|0;if(!i){i=0;break}k=c[g>>2]|0}else{i=c[i+4>>2]|0;if(!i){i=27;break}j=c[g>>2]|0;while(1){k=j+1|0;if((a[j>>0]|0)==58)break;else j=k}}m=c[c[i>>2]>>2]|0;if((a[D>>0]|0)==0|(m|0)==0)l=0;else{j=0;while(1){l=j+1|0;if(!(a[m+j>>0]|0))break;else j=l}}c[g+4>>2]=k;o=i+20|0;j=c[o>>2]|0;c[g+16>>2]=j;c[g+8>>2]=m;c[g+20>>2]=l;p=0;while(1){q=p+1|0;if(!(a[k+p>>0]|0))break;else p=q}m=j+l+q|0;f=i+24|0;r=i+16|0;if((m|0)>(c[f>>2]|0)){j=m+24|0;m=pb[c[b+12>>2]&63](j)|0;if(!m){i=1;break}c[f>>2]=j;B6(m|0,c[r>>2]|0,c[o>>2]|0)|0;n=c[r>>2]|0;j=b+364|0;while(1){j=c[j>>2]|0;if(!j)break;f=j+12|0;if((c[f>>2]|0)==(n|0))c[f>>2]=m}db[c[b+20>>2]&127](n);c[r>>2]=m;j=c[o>>2]|0}else m=c[r>>2]|0;j=m+j|0;B6(j|0,k|0,q|0)|0;if(l|0){M=j+p|0;a[M>>0]=a[F>>0]|0;B6(M+1|0,c[c[i>>2]>>2]|0,l|0)|0}c[g>>2]=c[r>>2];i=0}}while(0);return i|0}function KZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;q=l;l=l+16|0;j=q;c[b+280>>2]=62;k=b+288|0;c[k>>2]=d;m=b+144|0;n=b+292|0;o=b+80|0;i=b+480|0;g=d;a:while(1){c[j>>2]=0;r=c[m>>2]|0;r=tb[c[r>>2]&127](r,g,e,j)|0;d=c[j>>2]|0;c[n>>2]=d;h=d;switch(r|0){case -15:{p=3;break a}case -4:{p=7;break a}case 0:{p=12;break a}case -1:{p=13;break a}case -2:{p=15;break a}case 15:{if(c[o>>2]|0)wZ(b,c[m>>2]|0,g,h);break}case 11:{if(!(CZ(b,c[m>>2]|0,g,h)|0)){d=1;break a}break}case 13:{if(!(DZ(b,c[m>>2]|0,g,h)|0)){d=1;break a}break}default:{d=9;break a}}d=c[j>>2]|0;c[k>>2]=d;switch(c[i>>2]|0){case 2:{d=35;break a}case 3:{p=18;break a}default:{}}g=d}do if((p|0)==3){if(c[o>>2]|0){wZ(b,c[m>>2]|0,g,h);if((c[i>>2]|0)==2){d=35;break}d=c[j>>2]|0}c[f>>2]=d;d=0}else if((p|0)==7){c[f>>2]=g;d=0}else if((p|0)==12){c[k>>2]=d;d=4}else if((p|0)==13)if(!(a[b+484>>0]|0)){c[f>>2]=g;d=0}else d=5;else if((p|0)==15)if(!(a[b+484>>0]|0)){c[f>>2]=g;d=0}else d=6;else if((p|0)==18){c[f>>2]=d;d=0}while(0);l=q;return d|0}function LZ(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;B=l;l=l+16|0;y=B+8|0;z=B+4|0;x=B;i=c[e>>2]|0;c[y>>2]=i;if((c[b+144>>2]|0)==(d|0)){s=b+288|0;c[s>>2]=i;t=b+292|0}else{t=c[b+300>>2]|0;s=t;t=t+4|0}c[s>>2]=i;c[e>>2]=0;m=d+8|0;u=b+4|0;v=b+80|0;n=b+60|0;w=b+480|0;o=d+72|0;p=b+44|0;q=d+60|0;r=b+48|0;a:while(1){k=tb[c[m>>2]&127](d,c[y>>2]|0,f,z)|0;i=c[z>>2]|0;c[t>>2]=i;j=i;b:do switch(k|0){case 40:{A=6;break a}case 0:{A=23;break a}case -2:{A=24;break a}case -4:case -1:{A=26;break a}case 7:{i=c[n>>2]|0;if(i|0){a[x>>0]=10;rb[i&127](c[u>>2]|0,x,1);break b}if(c[v>>2]|0)wZ(b,d,c[y>>2]|0,j);break}case 6:{k=c[n>>2]|0;if(!k){if(!(c[v>>2]|0))break b;wZ(b,d,c[y>>2]|0,j);break b}if(!(a[o>>0]|0))i=j;else{j=c[y>>2]|0;rb[k&127](c[u>>2]|0,j,i-j|0);break b}while(1){c[x>>2]=c[p>>2];fb[c[q>>2]&31](d,y,i,x,c[r>>2]|0);c[t>>2]=c[z>>2];i=c[p>>2]|0;rb[k&127](c[u>>2]|0,i,(c[x>>2]|0)-i|0);i=c[y>>2]|0;if((i|0)==(c[z>>2]|0))break;c[s>>2]=i;i=c[z>>2]|0}break}default:{A=28;break a}}while(0);k=c[z>>2]|0;c[y>>2]=k;c[s>>2]=k;switch(c[w>>2]|0){case 3:{A=30;break a}case 2:{i=35;break a}default:{}}}if((A|0)==6){i=c[b+76>>2]|0;if(!i){if(c[v>>2]|0)wZ(b,d,c[y>>2]|0,j)}else db[i&127](c[u>>2]|0);i=c[z>>2]|0;c[e>>2]=i;c[g>>2]=i;i=(c[w>>2]|0)==2?35:0}else if((A|0)==23){c[s>>2]=i;i=4}else if((A|0)==24)if(!(h<<24>>24))i=6;else{c[g>>2]=c[y>>2];i=0}else if((A|0)==26)if(!(h<<24>>24))i=20;else{c[g>>2]=c[y>>2];i=0}else if((A|0)==28){c[s>>2]=i;i=23}else if((A|0)==30){c[g>>2]=c[z>>2];i=0}l=B;return i|0}function MZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;g=h;c[g>>2]=d;d=LZ(b,c[b+144>>2]|0,g,e,f,(a[b+484>>0]|0)==0&1)|0;do if(!d){d=c[g>>2]|0;if(d){g=b+280|0;if(!(c[b+476>>2]|0)){c[g>>2]=58;d=oZ(b,d,e,f)|0;break}else{c[g>>2]=63;d=NZ(b,d,e,f)|0;break}}else d=0}while(0);l=h;return d|0}function NZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;d=GZ(b,1,c[b+144>>2]|0,d,e,f,(a[b+484>>0]|0)==0&1)|0;if((d|0)==0?(OZ(b)|0)<<24>>24==0:0)d=1;return d|0}function OZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;m=a+16|0;a=a+364|0;while(1){a=c[a>>2]|0;if(!a){a=1;break}i=(c[a+24>>2]|0)+1|0;j=a+36|0;f=c[j>>2]|0;e=f+i|0;l=a+4|0;d=c[l>>2]|0;if((d|0)==(e|0)){a=1;break}k=a+8|0;b=c[k>>2]|0;g=b+i|0;h=a+40|0;if((g|0)>((c[h>>2]|0)-f|0)){e=vb[c[m>>2]&127](f,g)|0;if(!e){a=0;break}b=a+12|0;f=c[j>>2]|0;if((c[b>>2]|0)==(f|0))c[b>>2]=e;b=a+16|0;d=c[b>>2]|0;if(d|0)c[b>>2]=e+(d-f);c[j>>2]=e;c[h>>2]=e+g;e=e+i|0;d=c[l>>2]|0;b=c[k>>2]|0}B6(e|0,d|0,b|0)|0;c[l>>2]=e}return a|0}function PZ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;n=c[b+356>>2]|0;j=n+80|0;k=n+92|0;l=n+88|0;m=n+60|0;n=n+96|0;i=d+4|0;h=c[d>>2]|0;a:while(1){switch(a[h>>0]|0){case 0:{e=1;break a}case 58:{g=c[d>>2]|0;while(1){e=c[k>>2]|0;f=(e|0)==(c[l>>2]|0);if((g|0)==(h|0))break;if(f){if(!((fZ(j)|0)<<24>>24)){e=0;break a}e=c[k>>2]|0}f=a[g>>0]|0;c[k>>2]=e+1;a[e>>0]=f;g=g+1|0}if(f){if(!((fZ(j)|0)<<24>>24)){e=0;break a}e=c[k>>2]|0}c[k>>2]=e+1;a[e>>0]=0;e=mZ(b,m,c[n>>2]|0,8)|0;if(!e){e=0;break a}f=c[n>>2]|0;if((c[e>>2]|0)==(f|0))c[n>>2]=c[k>>2];else c[k>>2]=f;c[i>>2]=e;break}default:{}}h=h+1|0}return e|0}function QZ(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=c[d>>2]|0;i=(h|0)!=0;a:do if((a[f>>0]|0)!=0|i^1){b:do if(((i?(a[h>>0]|0)==120:0)?(a[h+1>>0]|0)==109:0)?(a[h+2>>0]|0)==108:0){switch(a[h+3>>0]|0){case 110:break;case 0:{m=1;break b}default:{m=0;break b}}if((a[h+4>>0]|0)==115?(a[h+5>>0]|0)==0:0){h=39;break a}else m=0}else m=0;while(0);n=m<<24>>24!=0;l=1;h=1;i=0;c:while(1){p=n|l^1;while(1){k=a[f+i>>0]|0;j=h<<24>>24!=0;o=i+1|0;if(!(k<<24>>24))break c;do if(j){if((i|0)<=36?k<<24>>24==(a[142560+i>>0]|0):0)break;h=0}else h=0;while(0);if(p){i=o;continue}if((i|0)>29){l=0;i=o;continue c}if(k<<24>>24==(a[142597+i>>0]|0))i=o;else{l=0;i=o;continue c}}}if((m&255|0)!=(j&(i|0)==36&1|0)){h=n?38:40;break}if(!(l&(i|0)==29)){p=b+472|0;n=(a[p>>0]|0)==0?i:o;h=b+376|0;j=c[h>>2]|0;m=n+24|0;do if(!j){h=b+12|0;i=pb[c[h>>2]&63](28)|0;if(!i){h=1;break a}o=pb[c[h>>2]&63](m)|0;c[i+16>>2]=o;if(!o){db[c[b+20>>2]&127](i);h=1;break a}else{c[i+24>>2]=m;j=i;break}}else{i=j+24|0;if((n|0)>(c[i>>2]|0)){k=j+16|0;l=vb[c[b+16>>2]&127](c[k>>2]|0,m)|0;if(!l){h=1;break a}c[k>>2]=l;c[i>>2]=m}c[h>>2]=c[j+4>>2]}while(0);c[j+20>>2]=n;i=j+16|0;B6(c[i>>2]|0,f|0,n|0)|0;h=a[p>>0]|0;if(h<<24>>24)a[(c[i>>2]|0)+(n+-1)>>0]=h;c[j>>2]=d;c[j+12>>2]=e;i=d+4|0;c[j+8>>2]=c[i>>2];if((a[f>>0]|0)==0?((c[b+356>>2]|0)+152|0)==(d|0):0)h=0;else h=j;c[i>>2]=h;c[j+4>>2]=c[g>>2];c[g>>2]=j;if((e|0)!=0?(q=c[b+100>>2]|0,(q|0)!=0):0){rb[q&127](c[b+4>>2]|0,c[d>>2]|0,c[i>>2]|0?f:0);h=0}else h=0}else h=40}else h=28;while(0);return h|0}function RZ(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;L=l;l=l+16|0;I=L;J=L+4|0;K=c[b+356>>2]|0;o=d+16|0;p=d+68|0;q=b+144|0;r=h+16|0;s=h+8|0;t=h+12|0;v=b+288|0;w=d+44|0;x=e<<24>>24==0;y=d+48|0;z=b+440|0;A=b+456|0;B=b+452|0;C=(K+80|0)==(h|0);D=K+130|0;E=K+129|0;F=b+272|0;G=b+300|0;H=b+228|0;i=0;a:while(1){b:while(1){switch(tb[c[o>>2]&127](d,f,g,I)|0){case -4:{i=0;n=63;break a}case 0:{n=4;break a}case -1:{n=6;break a}case 6:{n=23;break b}case -3:{n=24;break b}case 7:case 39:{n=25;break b}case 10:{j=vb[c[w>>2]&127](d,f)|0;c:do if((j|0)<0)if((c[q>>2]|0)==(d|0)){c[v>>2]=f;j=1;i=14}else{j=1;i=14}else{if(x&(j|0)==32){k=c[t>>2]|0;if((k|0)==(c[r>>2]|0)){j=4;break}if((a[k+-1>>0]|0)==32){j=4;break}}m=h_(j,J)|0;if(!m){if((c[q>>2]|0)!=(d|0)){j=1;i=14;break}c[v>>2]=f;j=1;i=14;break}else k=0;while(1){if((k|0)>=(m|0)){j=0;break c}j=c[t>>2]|0;if((j|0)==(c[s>>2]|0)){if(!((fZ(h)|0)<<24>>24)){j=1;i=1;break c}j=c[t>>2]|0}M=a[J+k>>0]|0;c[t>>2]=j+1;a[j>>0]=M;k=k+1|0}}while(0);switch(j&7){case 4:case 0:break b;default:{}}break}case 9:{j=c[p>>2]|0;j=(eb[c[y>>2]&63](d,f+j|0,(c[I>>2]|0)+(0-j)|0)|0)&255;if(j<<24>>24){n=33;break b}j=c[p>>2]|0;j=kZ(z,d,f+j|0,(c[I>>2]|0)+(0-j)|0)|0;if(!j){i=1;n=63;break a}m=mZ(b,K,j,0)|0;c[B>>2]=c[A>>2];do if(C){if(!(c[F>>2]|0))if(!m)break b;else break;if(!(a[D>>0]|0)){j=(m|0)!=0;if(!(a[E>>0]|0)){n=47;break}else{u=j;n=49;break}}else{j=(m|0)!=0;if(!(c[G>>2]|0)){n=47;break}else{u=j;n=49;break}}}else if(!(a[E>>0]|0))if(!m){i=11;n=63;break a}else{n=48;break}else{j=(m|0)!=0;if(!(a[D>>0]|0)){u=j;n=49;break}else{n=47;break}}while(0);if((n|0)==47)if(j)n=48;else{i=11;n=63;break a}else if((n|0)==49?(n=0,!u):0)break b;if((n|0)==48?(n=0,(a[m+34>>0]|0)==0):0){i=24;n=63;break a}k=m+32|0;if(a[k>>0]|0){n=51;break a}if(c[m+28>>2]|0){n=54;break a}j=c[m+4>>2]|0;if(!j){n=57;break a}m=j+(c[m+8>>2]|0)|0;a[k>>0]=1;m=RZ(b,c[H>>2]|0,e,j,m,h)|0;a[k>>0]=0;j=(m|0)==0;if(j)break b;else{j=(j^1)&1;i=m}break}default:{n=60;break a}}if(j)break a}if((n|0)==23){n=0;if(!(sZ(h,d,f,c[I>>2]|0)|0)){i=1;n=63;break}}else if((n|0)==24){c[I>>2]=f+(c[p>>2]|0);n=25}else if((n|0)==33){n=0;f=c[t>>2]|0;if((f|0)==(c[s>>2]|0)){if(!((fZ(h)|0)<<24>>24)){i=1;n=63;break}f=c[t>>2]|0}c[t>>2]=f+1;a[f>>0]=j}do if((n|0)==25){n=0;f=c[t>>2]|0;if(x){if((f|0)==(c[r>>2]|0))break;if((a[f+-1>>0]|0)==32)break}if((f|0)==(c[s>>2]|0)){if(!((fZ(h)|0)<<24>>24)){i=1;n=63;break a}f=c[t>>2]|0}c[t>>2]=f+1;a[f>>0]=32}while(0);f=c[I>>2]|0}if((n|0)==4)if((c[q>>2]|0)==(d|0)){c[v>>2]=c[I>>2];i=4;n=63}else{i=4;n=63}else if((n|0)==6)if((c[q>>2]|0)==(d|0)){c[v>>2]=f;i=4;n=63}else{i=4;n=63}else if((n|0)==51)if((c[q>>2]|0)==(d|0)){c[v>>2]=f;i=12;n=63}else{i=12;n=63}else if((n|0)==54)if((c[q>>2]|0)==(d|0)){c[v>>2]=f;i=15;n=63}else{i=15;n=63}else if((n|0)==57)if((c[q>>2]|0)==(d|0)){c[v>>2]=f;i=16;n=63}else{i=16;n=63}else if((n|0)==60)if((c[q>>2]|0)==(d|0)){c[v>>2]=f;i=23;n=63}else{i=23;n=63}l=L;return i|0}function SZ(b,d){b=b|0;d=d|0;var e=0;e=c[b+496>>2]|0;b=d;while(1){d=a[b>>0]|0;if(!(d<<24>>24))break;e=d&255^e*1000003;b=b+1|0}return e|0}function TZ(b,c){b=b|0;c=c|0;var d=0;while(1){d=a[b>>0]|0;if(d<<24>>24!=(a[c>>0]|0)){c=0;break}if(!(d<<24>>24)){c=1;break}c=c+1|0;b=b+1|0}return c|0}function UZ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+1040|0;i=k;f=c[b+124>>2]|0;a:do if(!f)e=18;else{e=0;while(1){if((e|0)==256)break;c[i+(e<<2)>>2]=-1;e=e+1|0}g=i+1028|0;c[g>>2]=0;j=i+1024|0;c[j>>2]=0;h=i+1032|0;c[h>>2]=0;do if(eb[f&63](c[b+248>>2]|0,d,i)|0){f=c[b+12>>2]|0;e=i_()|0;e=pb[f&63](e)|0;c[b+240>>2]=e;if(!e){e=c[h>>2]|0;if(!e)e=1;else{db[e&127](c[j>>2]|0);e=1}}else{e=tb[(a[b+236>>0]<<24>>24?64:65)&127](e,i,c[g>>2]|0,c[j>>2]|0)|0;if(!e)break;c[b+244>>2]=c[j>>2];c[b+252>>2]=c[h>>2];c[b+144>>2]=e;e=0}break a}while(0);e=c[h>>2]|0;if(e|0)db[e&127](c[j>>2]|0);e=18}while(0);l=k;return e|0}function VZ(b,d){b=b|0;d=d|0;a[b+4>>0]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b>>2]=0;c[b+16>>2]=d;return}function WZ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;l=c[b+356>>2]|0;m=b+416|0;n=b+428|0;o=b+424|0;p=b+432|0;q=l+152|0;r=b+372|0;j=l+60|0;k=l+80|0;a:while(1){g=d;b:while(1){if(!(a[d>>0]|0)){d=1;break a}e=a[g>>0]|0;h=g+1|0;switch(e<<24>>24){case 0:case 12:{s=5;break b}case 61:break b;default:{}}f=c[n>>2]|0;if((f|0)==(c[o>>2]|0)){if(!((fZ(m)|0)<<24>>24)){d=0;break a}f=c[n>>2]|0;e=a[g>>0]|0}c[n>>2]=f+1;a[f>>0]=e;g=h}if((s|0)==5){s=0;d=c[n>>2]|0;if((d|0)==(c[o>>2]|0)){if(!((fZ(m)|0)<<24>>24)){d=0;break}d=c[n>>2]|0}c[n>>2]=d+1;a[d>>0]=0;d=mZ(b,l,c[p>>2]|0,0)|0;if(d|0)a[d+32>>0]=1;d=(a[g>>0]|0)==0?g:h;c[n>>2]=c[p>>2];continue}d=c[n>>2]|0;if((d|0)==(c[p>>2]|0))f=q;else{if((d|0)==(c[o>>2]|0)){if(!((fZ(m)|0)<<24>>24)){d=0;break}d=c[n>>2]|0}c[n>>2]=d+1;a[d>>0]=0;f=mZ(b,j,c[p>>2]|0,8)|0;if(!f){d=0;break}e=c[f>>2]|0;i=c[p>>2]|0;d=i;if((e|0)==(i|0)){i=eZ(k,e)|0;c[f>>2]=i;if(!i){d=0;break}d=c[p>>2]|0}c[n>>2]=d}c:while(1){e=a[h>>0]|0;g=(d|0)==(c[o>>2]|0);i=h+1|0;switch(e<<24>>24){case 0:case 12:break c;default:{}}if(g){if(!((fZ(m)|0)<<24>>24)){d=0;break a}d=c[n>>2]|0;e=a[h>>0]|0}c[n>>2]=d+1;a[d>>0]=e;h=i;d=c[n>>2]|0}if(g){if(!((fZ(m)|0)<<24>>24)){d=0;break}d=c[n>>2]|0}c[n>>2]=d+1;a[d>>0]=0;if(QZ(b,f,0,c[p>>2]|0,r)|0){d=0;break}c[n>>2]=c[p>>2];d=(a[h>>0]|0)==0?h:i}return d|0}function XZ(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+4|0;e=(c[d>>2]|0)==(c[a>>2]|0);c[a>>2]=b;if(e)c[d>>2]=b;return}function YZ(a,b,d){a=a|0;b=b|0;d=d|0;c[a+52>>2]=b;c[a+56>>2]=d;return}function ZZ(a,b){a=a|0;b=b|0;c[a+60>>2]=b;return}function _Z(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=b+480|0;j=b+284|0;switch(c[i>>2]|0){case 3:{c[j>>2]=33;g=0;break}case 2:{c[j>>2]=36;g=0;break}case 0:{if((c[b+476>>2]|0)==0?($Z(b)|0)<<24>>24==0:0){c[j>>2]=1;g=0}else h=7;break}default:h=7}a:do if((h|0)==7){c[i>>2]=1;if(e|0){g=b_(b,e)|0;if(!g){g=0;break}B6(g|0,d|0,e|0)|0;g=c_(b,e,f)|0;break}a[b+484>>0]=f;if(!f)g=1;else{g=b+24|0;f=c[g>>2]|0;d=b+296|0;c[d>>2]=f;h=c[b+28>>2]|0;c[b+40>>2]=h;e=b+280|0;h=tb[c[e>>2]&127](b,f,h,g)|0;c[j>>2]=h;if(h|0){c[b+292>>2]=c[b+288>>2];c[e>>2]=66;g=0;break}switch(c[i>>2]|0){case 3:{j=c[b+144>>2]|0;xb[c[j+52>>2]&31](j,c[d>>2]|0,c[g>>2]|0,b+408|0);c[d>>2]=c[g>>2];g=2;break a}case 1:case 0:{c[i>>2]=2;g=1;break a}default:{g=1;break a}}}}while(0);return g|0}function $Z(b){b=b|0;var d=0;d=b+496|0;if(!(c[d>>2]|0))c[d>>2]=d_()|0;if(!(a[b+236>>0]|0))b=1;else b=WZ(b,142627)|0;return b|0}function a_(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return c[a+284>>2]|0}function b_(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;l=a+284|0;a:do switch(c[a+480>>2]|0){case 3:{c[l>>2]=33;d=0;break}case 2:{c[l>>2]=36;d=0;break}default:{m=a+32|0;k=c[m>>2]|0;p=a+28|0;e=c[p>>2]|0;d=e;if((k-e|0)<(b|0)){q=a+24|0;j=c[q>>2]|0;f=e-j|0;o=a+8|0;g=c[o>>2]|0;r=g;h=j-r|0;i=(h|0)>1024;e=i?1024:h;b=f+b+e|0;do if((b|0)>(k-r|0)){d=k-j|0;d=(d|0)==0?1024:d;do d=d<<1;while((d|0)<(b|0));e=pb[c[a+12>>2]&63](d)|0;if(!e){c[l>>2]=1;d=0;break a}c[m>>2]=e+d;d=c[q>>2]|0;b=d;f=(c[p>>2]|0)-b|0;if(!d){d=e+f|0;c[p>>2]=d;c[o>>2]=e;n=14;break}else{n=b-(c[o>>2]|0)|0;n=(n|0)<1024?n:1024;B6(e|0,d+(0-n)|0,n+f|0)|0;db[c[a+20>>2]&127](c[o>>2]|0);c[o>>2]=e;d=e+((c[p>>2]|0)-(c[q>>2]|0))+n|0;c[p>>2]=d;e=e+n|0;n=14;break}}else if(i){d=h-e|0;I6(g|0,g+d|0,e+f|0)|0;e=0-d|0;d=(c[p>>2]|0)+e|0;c[p>>2]=d;e=(c[q>>2]|0)+e|0;n=14}while(0);if((n|0)==14)c[q>>2]=e;c[a+292>>2]=0;c[a+288>>2]=0;c[a+296>>2]=0}}}while(0);return d|0}function c_(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=b+480|0;i=b+284|0;switch(c[h>>2]|0){case 3:{c[i>>2]=33;d=0;break}case 2:{c[i>>2]=36;d=0;break}case 0:{if((c[b+476>>2]|0)==0?($Z(b)|0)<<24>>24==0:0){c[i>>2]=1;d=0}else f=7;break}default:f=7}a:do if((f|0)==7){c[h>>2]=1;f=b+24|0;k=c[f>>2]|0;g=b+296|0;c[g>>2]=k;l=b+28|0;j=(c[l>>2]|0)+d|0;c[l>>2]=j;c[b+40>>2]=j;l=b+36|0;c[l>>2]=(c[l>>2]|0)+d;a[b+484>>0]=e;d=b+280|0;j=tb[c[d>>2]&127](b,k,j,f)|0;c[i>>2]=j;if(j|0){c[b+292>>2]=c[b+288>>2];c[d>>2]=66;d=0;break}switch(c[h>>2]|0){case 3:{d=2;break}case 1:case 0:{if(!e)d=1;else{c[h>>2]=2;d=1;break a}break}default:d=1}l=c[b+144>>2]|0;xb[c[l+52>>2]&31](l,c[g>>2]|0,c[f>>2]|0,b+408|0);c[g>>2]=c[f>>2]}while(0);return d|0}function d_(){var a=0;a=Ya(0)|0;T4(((a|0)==-1&1)+a|0);return U4()|0}function e_(a){a=a|0;return c[a+284>>2]|0}function f_(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+288|0;d=c[b>>2]|0;e=a+408|0;if(d|0?(f=a+296|0,g=c[f>>2]|0,d>>>0>=g>>>0):0){a=c[a+144>>2]|0;xb[c[a+52>>2]&31](a,g,d,e);c[f>>2]=c[b>>2]}return (c[e>>2]|0)+1|0}function g_(a){a=a|0;if((a+-1|0)>>>0<40)a=c[56636+(a<<2)>>2]|0;else a=0;return a|0}function h_(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;do if((b|0)>=0){if((b|0)<128){a[c>>0]=b;d=1;break}h=c+1|0;d=b>>>6;e=(b&63|128)&255;if((b|0)<2048){a[c>>0]=d|192;a[h>>0]=e;d=2;break}f=b>>>12;g=c+2|0;d=(d&63|128)&255;if((b|0)<65536){a[c>>0]=f|224;a[h>>0]=d;a[g>>0]=e;d=3;break}if((b|0)<1114112){a[c>>0]=b>>>18|240;a[h>>0]=f&63|128;a[g>>0]=d;a[c+3>>0]=e;d=4}else d=0}else d=0;while(0);return d|0}function i_(){return 1912}function j_(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;i=0;while(1){if((i|0)==368){i=0;break}a[e+i>>0]=a[56800+i>>0]|0;i=i+1|0}a:while(1){if((i|0)>=128){j=5;break}switch(a[56876+i>>0]|0){case 0:case 28:break;default:if((c[f+(i<<2)>>2]|0)!=(i|0)){e=0;break a}}i=i+1|0}b:do if((j|0)==5){t=e+376|0;m=e+888|0;n=e+76|0;l=0;while(1){if((l|0)>=256)break;o=c[f+(l<<2)>>2]|0;p=t+(l<<1)|0;q=m+(l<<2)|0;r=m+(l<<2)+1|0;s=n+l|0;do if((o|0)==-1){a[s>>0]=1;b[p>>1]=-1;a[q>>0]=1;a[r>>0]=0}else{if((o|0)<0){if((o|0)<-4){e=0;break b}a[s>>0]=3-o;a[q>>0]=0;b[p>>1]=0;break}if((o|0)<128){i=a[56876+o>>0]|0;switch(i<<24>>24){case 0:case 28:break;default:if((o|0)!=(l|0)){e=0;break b}}a[s>>0]=i;a[q>>0]=1;a[r>>0]=o;b[p>>1]=(o|0)==0?-1:o&65535;break}if((k_(o)|0)<0){a[s>>0]=0;b[p>>1]=-1;a[q>>0]=1;a[r>>0]=0;break}if((o|0)>65535){e=0;break b}i=o>>>8;j=o>>>5&7;k=1<<(o&31);if(!(c[57168+((d[143937+i>>0]<<3|j)<<2)>>2]&k))i=c[57168+((d[144193+i>>0]<<3|j)<<2)>>2]&k|0?26:28;else i=22;a[s>>0]=i;a[q>>0]=h_(o,r)|0;b[p>>1]=o}while(0);l=l+1|0}c[e+372>>2]=h;c[e+368>>2]=g;if(g|0){c[e+332>>2]=108;c[e+336>>2]=108;c[e+340>>2]=108;c[e+344>>2]=109;c[e+348>>2]=109;c[e+352>>2]=109;c[e+356>>2]=110;c[e+360>>2]=110;c[e+364>>2]=110}c[e+60>>2]=18;c[e+64>>2]=19}while(0);return e|0}function k_(b){b=b|0;var c=0;switch(b>>8|0){case 223:case 222:case 221:case 220:case 219:case 218:case 217:case 216:{b=-1;break}case 0:{if(!(a[56876+b>>0]|0))b=-1;else c=4;break}case 255:{if((b|1|0)==65535)b=-1;else c=4;break}default:c=4}return b|0}function l_(a,b){a=a|0;b=b|0;a=vb[c[a+368>>2]&127](c[a+372>>2]|0,b)|0;if(a>>>0>65535)a=0;else a=c[57168+(((d[144193+(a>>>8)>>0]|0)<<3|a>>>5&7)<<2)>>2]&1<<(a&31);return a|0}function m_(a,b){a=a|0;b=b|0;a=vb[c[a+368>>2]&127](c[a+372>>2]|0,b)|0;if(a>>>0>65535)a=0;else a=c[57168+(((d[143937+(a>>>8)>>0]|0)<<3|a>>>5&7)<<2)>>2]&1<<(a&31);return a|0}function n_(a,b){a=a|0;b=b|0;a=vb[c[a+368>>2]&127](c[a+372>>2]|0,b)|0;if(a>>>0>65535)a=1;else a=(k_(a)|0)<0;return a&1|0}function o_(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;q=l;l=l+16|0;m=q;n=b+368|0;o=b+888|0;p=b+372|0;k=b+76|0;a:while(1){j=c[e>>2]|0;if((j|0)==(f|0))break;r=d[j>>0]|0;i=o+(r<<2)+1|0;r=a[o+(r<<2)>>0]|0;b=r<<24>>24;if(!(r<<24>>24)){b=h_(vb[c[n>>2]&127](c[p>>2]|0,j)|0,m)|0;if((b|0)>(h-(c[g>>2]|0)|0))break;j=c[e>>2]|0;i=m;j=j+((d[k+(d[j>>0]|0)>>0]|0)+-3)|0}else{if((b|0)>(h-(c[g>>2]|0)|0))break;j=j+1|0}c[e>>2]=j;while(1){j=a[i>>0]|0;r=c[g>>2]|0;c[g>>2]=r+1;a[r>>0]=j;b=b+-1|0;if(!b)continue a;else i=i+1|0}}l=q;return}function p_(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0;l=a+376|0;m=a+368|0;n=a+372|0;k=a+76|0;while(1){i=c[e>>2]|0;if((i|0)==(f|0))break;if((c[g>>2]|0)==(h|0))break;a=b[l+((d[i>>0]|0)<<1)>>1]|0;if(!(a<<16>>16)){a=(vb[c[m>>2]&127](c[n>>2]|0,i)|0)&65535;i=c[e>>2]|0;j=(d[k+(d[i>>0]|0)>>0]|0)+-3|0}else j=1;c[e>>2]=i+j;j=c[g>>2]|0;c[g>>2]=j+2;b[j>>1]=a}return}function q_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;a:do if((e|0)==(f|0))h=-4;else{q=b+76|0;i=e+1|0;l=b+332|0;m=f;h=(i|0)==(f|0);n=b+340|0;o=b+336|0;k=e+2|0;j=m-e|0;do switch(a[q+(d[e>>0]|0)>>0]|0){case 12:{h=S_(12,b,i,f,g)|0;break a}case 13:{h=S_(13,b,i,f,g)|0;break a}case 2:{if(h){h=-1;break a}switch(a[q+(d[i>>0]|0)>>0]|0){case 16:{h=T_(b,k,f,g)|0;break a}case 15:{h=O_(b,k,f,g)|0;break a}case 7:case 6:case 5:case 29:case 24:case 22:{c[g>>2]=e;h=29;break a}default:{c[g>>2]=i;h=0;break a}}}case 9:{if(h){c[g>>2]=f;h=-15;break a}else p=13;break}case 10:case 21:{p=13;break}case 30:{h=I_(b,i,f,g)|0;break a}case 35:{c[g>>2]=i;h=38;break a}case 20:{c[g>>2]=i;h=25;break a}case 4:{if(h){h=-26;break a}if((a[i>>0]|0)==93){if((k|0)==(f|0)){h=-1;break a}if((a[k>>0]|0)==62){c[g>>2]=e+3;h=34;break a}}c[g>>2]=i;h=26;break a}case 31:{c[g>>2]=i;h=23;break a}case 32:{if(h){h=-24;break a}switch(a[q+(d[i>>0]|0)>>0]|0){case 33:{c[g>>2]=k;h=36;break a}case 15:{c[g>>2]=k;h=35;break a}case 34:{c[g>>2]=k;h=37;break a}case 32:case 36:case 35:case 11:case 21:case 10:case 9:{c[g>>2]=i;h=24;break a}default:{c[g>>2]=i;h=0;break a}}}case 36:{c[g>>2]=i;h=21;break a}case 11:{c[g>>2]=i;h=17;break a}case 19:{h=U_(b,i,f,g)|0;break a}case 5:{if((j|0)<2){h=-2;break a}if(!(vb[c[b+344>>2]&127](b,e)|0))if(!(vb[c[l>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else{h=19;i=k}else{h=18;i=k}break}case 6:{if((j|0)<3){h=-2;break a}i=e+3|0;if(!(vb[c[b+348>>2]&127](b,e)|0))if(!(vb[c[o>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=19;else h=18;break}case 7:{if((j|0)<4){h=-2;break a}i=e+4|0;if(!(vb[c[b+352>>2]&127](b,e)|0))if(!(vb[c[n>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=19;else h=18;break}case 24:case 22:{h=18;break}case 23:case 27:case 26:case 25:{h=19;break}default:{c[g>>2]=e;h=0;break a}}while(0);if((p|0)==13){b:while(1){h=e;e=e+1|0;if((e|0)==(f|0)){p=17;break}switch(a[q+(d[e>>0]|0)>>0]|0){case 10:case 21:{p=13;continue b}case 9:break;default:{p=16;break b}}if((h+2|0)==(f|0)){p=16;break}else p=13}if((p|0)==16){c[g>>2]=e;h=15;break}else if((p|0)==17){c[g>>2]=f;h=15;break}}c:while(1){if((i|0)==(f|0)){p=96;break}j=i+1|0;e=m-i|0;switch(a[q+(d[i>>0]|0)>>0]|0){case 27:case 26:case 25:case 24:case 22:{p=h;i=j;h=p;continue c}case 29:{p=54;break c}case 10:case 9:case 21:case 30:case 20:case 36:case 35:case 32:case 11:{p=67;break c}case 34:{p=86;break c}case 33:{p=89;break c}case 15:{p=92;break c}case 5:{if((e|0)<2){h=-2;break a}if(!(vb[c[l>>2]&127](b,i)|0)){p=57;break c}p=h;i=i+2|0;h=p;continue c}case 6:{if((e|0)<3){h=-2;break a}if(!(vb[c[o>>2]&127](b,i)|0)){p=61;break c}p=h;i=i+3|0;h=p;continue c}case 7:{if((e|0)<4){h=-2;break a}if(!(vb[c[n>>2]&127](b,i)|0)){p=65;break c}p=h;i=i+4|0;h=p;continue c}case 23:{switch(h&63){case 18:break;case 41:{h=19;i=j;continue c}default:{p=h;i=j;h=p;continue c}}if((j|0)==(f|0)){h=-1;break a}h=m-j|0;switch(a[q+(d[j>>0]|0)>>0]|0){case 29:{p=71;break c}case 27:case 26:case 25:case 24:case 22:{h=41;i=i+2|0;continue c}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[l>>2]&127](b,j)|0)){p=75;break c}h=41;i=i+3|0;continue c}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[o>>2]&127](b,j)|0)){p=79;break c}h=41;i=i+4|0;continue c}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[n>>2]&127](b,j)|0)){p=83;break c}h=41;i=i+5|0;continue c}default:{h=19;i=j;continue c}}}default:{p=95;break c}}}switch(p|0){case 54:{c[g>>2]=i;h=0;break a}case 57:{c[g>>2]=i;h=0;break a}case 61:{c[g>>2]=i;h=0;break a}case 65:{c[g>>2]=i;h=0;break a}case 67:{c[g>>2]=i;break a}case 71:{c[g>>2]=j;h=0;break a}case 75:{c[g>>2]=j;h=0;break a}case 79:{c[g>>2]=j;h=0;break a}case 83:{c[g>>2]=j;h=0;break a}case 86:if((h|0)==19){c[g>>2]=i;h=0;break a}else{c[g>>2]=j;h=32;break a}case 89:if((h|0)==19){c[g>>2]=i;h=0;break a}else{c[g>>2]=j;h=31;break a}case 92:if((h|0)==19){c[g>>2]=i;h=0;break a}else{c[g>>2]=j;h=30;break a}case 95:{c[g>>2]=i;h=0;break a}case 96:{h=0-h|0;break a}}}while(0);return h|0}function r_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:do if((e|0)!=(f|0)){p=b+76|0;l=b+356|0;m=f;n=b+360|0;i=e+1|0;o=b+364|0;h=m-e|0;j=e+2|0;k=(i|0)==(f|0);b:do switch(a[p+(d[e>>0]|0)>>0]|0){case 2:{e=L_(b,i,f,g)|0;break a}case 3:{e=H_(b,i,f,g)|0;break a}case 9:{if(k){e=-3;break a}c[g>>2]=(a[p+(d[i>>0]|0)>>0]|0)==10?j:i;e=7;break a}case 10:{c[g>>2]=i;e=7;break a}case 4:{if(k){e=-5;break a}if((a[i>>0]|0)==93){if((j|0)==(f|0)){e=-5;break a}if((a[j>>0]|0)==62){c[g>>2]=j;e=0;break a}}break}case 5:{if((h|0)<2){e=-2;break a}if(!(vb[c[l>>2]&127](b,e)|0))i=j;else{c[g>>2]=e;e=0;break a}break}case 6:{if((h|0)<3){e=-2;break a}if(!(vb[c[n>>2]&127](b,e)|0)){i=e+3|0;break b}else{c[g>>2]=e;e=0;break a}}case 7:{if((h|0)<4){e=-2;break a}if(!(vb[c[o>>2]&127](b,e)|0)){i=e+4|0;break b}else{c[g>>2]=e;e=0;break a}}case 8:case 1:case 0:{c[g>>2]=e;e=0;break a}default:{}}while(0);c:while(1){if((i|0)==(f|0)){h=44;break}j=i+2|0;e=i+1|0;h=m-i|0;switch(a[p+(d[i>>0]|0)>>0]|0){case 10:case 9:case 8:case 1:case 0:case 2:case 3:{h=43;break c}case 5:{if((h|0)<2){h=29;break c}if(!(vb[c[l>>2]&127](b,i)|0)){i=j;continue c}else{h=29;break c}}case 6:{if((h|0)<3){h=32;break c}if(vb[c[n>>2]&127](b,i)|0){h=32;break c}i=i+3|0;continue c}case 7:{if((h|0)<4){h=36;break c}if(vb[c[o>>2]&127](b,i)|0){h=36;break c}i=i+4|0;continue c}case 4:{if((e|0)==(f|0)){h=43;break c}if((a[e>>0]|0)!=93){i=e;continue c}if((j|0)==(f|0)){h=43;break c}if((a[j>>0]|0)==62){h=42;break c}else{i=e;continue c}}default:{i=e;continue c}}}if((h|0)==29){c[g>>2]=i;e=6;break}else if((h|0)==32){c[g>>2]=i;e=6;break}else if((h|0)==36){c[g>>2]=i;e=6;break}else if((h|0)==42){c[g>>2]=j;e=0;break}else if((h|0)==43){c[g>>2]=i;e=6;break}else if((h|0)==44){c[g>>2]=f;e=6;break}}else e=-4;while(0);return e|0} -function s_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:do if((e|0)!=(f|0)){p=b+76|0;l=b+356|0;m=f;n=b+360|0;i=e+1|0;o=b+364|0;h=m-e|0;j=(i|0)==(f|0);k=e+2|0;b:do switch(a[p+(d[e>>0]|0)>>0]|0){case 4:{if(j){e=-1;break a}if((a[i>>0]|0)==93){if((k|0)==(f|0)){e=-1;break a}if((a[k>>0]|0)==62){c[g>>2]=e+3;e=40;break a}}break}case 9:{if(j){e=-1;break a}c[g>>2]=(a[p+(d[i>>0]|0)>>0]|0)==10?k:i;e=7;break a}case 10:{c[g>>2]=i;e=7;break a}case 5:{if((h|0)<2){e=-2;break a}if(!(vb[c[l>>2]&127](b,e)|0))i=k;else{c[g>>2]=e;e=0;break a}break}case 6:{if((h|0)<3){e=-2;break a}if(!(vb[c[n>>2]&127](b,e)|0)){i=e+3|0;break b}else{c[g>>2]=e;e=0;break a}}case 7:{if((h|0)<4){e=-2;break a}if(!(vb[c[o>>2]&127](b,e)|0)){i=e+4|0;break b}else{c[g>>2]=e;e=0;break a}}case 8:case 1:case 0:{c[g>>2]=e;e=0;break a}default:{}}while(0);c:while(1){if((i|0)==(f|0)){h=36;break}e=m-i|0;switch(a[p+(d[i>>0]|0)>>0]|0){case 4:case 10:case 9:case 8:case 1:case 0:{h=34;break c}case 5:{if((e|0)<2){h=27;break c}if(!(vb[c[l>>2]&127](b,i)|0))e=2;else{h=27;break c}break}case 6:{if((e|0)<3){h=30;break c}if(!(vb[c[n>>2]&127](b,i)|0))e=3;else{h=30;break c}break}case 7:{if((e|0)<4){h=33;break c}if(!(vb[c[o>>2]&127](b,i)|0))e=4;else{h=33;break c}break}default:e=1}i=i+e|0}if((h|0)==27){c[g>>2]=i;e=6;break}else if((h|0)==30){c[g>>2]=i;e=6;break}else if((h|0)==33){c[g>>2]=i;e=6;break}else if((h|0)==34){c[g>>2]=i;e=6;break}else if((h|0)==36){c[g>>2]=f;e=6;break}}else e=-4;while(0);return e|0}function t_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;o=b+76|0;p=f;q=b+356|0;r=b+360|0;s=b+364|0;n=0;a:while(1){if((e|0)==(f|0)){e=-1;break}h=e+1|0;i=e+2|0;j=(i|0)==(f|0);k=e+3|0;l=p-e|0;m=(h|0)==(f|0);switch(a[o+(d[e>>0]|0)>>0]|0){case 8:case 1:case 0:{t=14;break a}case 5:{if((l|0)<2){e=-2;break a}if(!(vb[c[q>>2]&127](b,e)|0)){m=n;e=i;n=m;continue a}else{t=6;break a}}case 6:{if((l|0)<3){e=-2;break a}if(!(vb[c[r>>2]&127](b,e)|0)){m=n;e=k;n=m;continue a}else{t=9;break a}}case 7:{if((l|0)<4){e=-2;break a}if(vb[c[s>>2]&127](b,e)|0){t=12;break a}m=n;e=e+4|0;n=m;continue a}case 2:{if(m){e=-1;break a}if((a[h>>0]|0)!=33){m=n;e=h;n=m;continue a}if(j){e=-1;break a}e=(a[i>>0]|0)==91;n=(e&1)+n|0;e=e?k:i;continue a}case 4:{if(m){e=-1;break a}if((a[h>>0]|0)!=93){m=n;e=h;n=m;continue a}if(j){e=-1;break a}if((a[i>>0]|0)!=62){m=n;e=i;n=m;continue a}if(!n){t=24;break a}n=n+-1|0;e=k;continue a}default:{m=n;e=h;n=m;continue a}}}if((t|0)==6){c[g>>2]=e;e=0}else if((t|0)==9){c[g>>2]=e;e=0}else if((t|0)==12){c[g>>2]=e;e=0}else if((t|0)==14){c[g>>2]=e;e=0}else if((t|0)==24){c[g>>2]=k;e=42}return e|0}function u_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;do if((e|0)!=(f|0)){j=b+76|0;h=e;a:while(1){if((h|0)==(f|0)){k=22;break}i=h+1|0;switch(a[j+(d[h>>0]|0)>>0]|0){case 3:{k=8;break a}case 2:{k=11;break a}case 10:{k=12;break a}case 9:{k=15;break a}case 21:{k=19;break a}case 5:{h=h+2|0;continue a}case 6:{h=h+3|0;continue a}case 7:{h=h+4|0;continue a}default:{h=i;continue a}}}if((k|0)==8)if((h|0)==(e|0)){h=H_(b,i,f,g)|0;break}else{c[g>>2]=h;h=6;break}else if((k|0)==11){c[g>>2]=h;h=0;break}else if((k|0)==12)if((h|0)==(e|0)){c[g>>2]=i;h=7;break}else{c[g>>2]=h;h=6;break}else if((k|0)==15){if((h|0)!=(e|0)){c[g>>2]=h;h=6;break}if((i|0)==(f|0)){h=-3;break}c[g>>2]=(a[j+(d[i>>0]|0)>>0]|0)==10?e+2|0:i;h=7;break}else if((k|0)==19)if((h|0)==(e|0)){c[g>>2]=i;h=39;break}else{c[g>>2]=h;h=6;break}else if((k|0)==22){c[g>>2]=f;h=6;break}}else h=-4;while(0);return h|0}function v_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;do if((e|0)!=(f|0)){j=b+76|0;h=e;a:while(1){if((h|0)==(f|0)){k=21;break}i=h+1|0;switch(a[j+(d[h>>0]|0)>>0]|0){case 3:{k=8;break a}case 30:{k=11;break a}case 10:{k=14;break a}case 9:{k=17;break a}case 5:{h=h+2|0;continue a}case 6:{h=h+3|0;continue a}case 7:{h=h+4|0;continue a}default:{h=i;continue a}}}if((k|0)==8)if((h|0)==(e|0)){h=H_(b,i,f,g)|0;break}else{c[g>>2]=h;h=6;break}else if((k|0)==11)if((h|0)==(e|0)){h=I_(b,i,f,g)|0;h=(h|0)==22?0:h;break}else{c[g>>2]=h;h=6;break}else if((k|0)==14)if((h|0)==(e|0)){c[g>>2]=i;h=7;break}else{c[g>>2]=h;h=6;break}else if((k|0)==17){if((h|0)!=(e|0)){c[g>>2]=h;h=6;break}if((i|0)==(f|0)){h=-3;break}c[g>>2]=(a[j+(d[i>>0]|0)>>0]|0)==10?e+2|0:i;h=7;break}else if((k|0)==21){c[g>>2]=f;h=6;break}}else h=-4;while(0);return h|0}function w_(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;g=b+76|0;a:while(1){f=a[c>>0]|0;b=d+1|0;e=c+1|0;switch(a[g+(f&255)>>0]|0){case 7:{h=3;break}case 6:{b=f;h=5;break}case 5:{b=f;break}case 27:case 26:case 25:case 24:case 23:case 22:case 29:if((a[d>>0]|0)==f<<24>>24){d=b;c=e;continue a}else{b=0;break a}default:{h=10;break a}}if((h|0)==3){h=0;if(f<<24>>24!=(a[d>>0]|0)){b=0;break}d=b;c=e;b=a[e>>0]|0;h=5}if((h|0)==5){h=0;e=c+1|0;if(b<<24>>24!=(a[d>>0]|0)){b=0;break}d=d+1|0;c=e;b=a[e>>0]|0}if(b<<24>>24!=(a[d>>0]|0)){b=0;break}if((a[c+1>>0]|0)==(a[d+1>>0]|0)){d=d+2|0;c=c+2|0}else{b=0;break}}b:do if((h|0)==10){b=a[d>>0]|0;if(f<<24>>24==b<<24>>24)b=1;else{switch(a[g+(b&255)>>0]|0){case 27:case 26:case 25:case 24:case 23:case 22:case 29:case 7:case 6:case 5:{b=0;break b}default:{}}b=1}}while(0);return b|0}function x_(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;b=c;while(1){c=a[e>>0]|0;f=(b|0)==(d|0);if(!(c<<24>>24)){g=6;break}if(f){b=0;break}if((a[b>>0]|0)!=c<<24>>24){b=0;break}e=e+1|0;b=b+1|0}if((g|0)==6)b=f&1;return b|0}function y_(b,c){b=b|0;c=c|0;var e=0,f=0;f=b+76|0;b=c;a:while(1){switch(a[f+(d[b>>0]|0)>>0]|0){case 5:{e=2;break}case 6:{e=3;break}case 7:{e=4;break}case 27:case 26:case 25:case 24:case 23:case 22:case 29:{e=1;break}default:break a}b=b+e|0}return b-c|0}function z_(b,c){b=b|0;c=c|0;b=b+76|0;a:while(1){switch(a[b+(d[c>>0]|0)>>0]|0){case 21:case 9:case 10:break;default:break a}c=c+1|0}return c|0}function A_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;w=b+76|0;u=0;v=0;b=1;a:while(1){h=e+1|0;s=a[h>>0]|0;t=v+1|0;i=(b|0)!=2;j=(b|0)==2;k=e+2|0;l=(v|0)<(f|0);m=(b|0)==1;n=g+(v<<4)+12|0;o=g+(v<<4)+4|0;p=g+(v<<4)|0;q=(b|0)==0;r=g+(v<<4)+8|0;do switch(a[w+(s&255)>>0]|0){case 5:{if(!q){r=b;s=v;t=u;e=k;b=r;v=s;u=t;continue a}if(!l){s=v;t=u;b=1;e=k;v=s;u=t;continue a}c[p>>2]=h;a[n>>0]=1;s=v;t=u;b=1;e=k;v=s;u=t;continue a}case 6:{if(q&l){c[p>>2]=h;a[n>>0]=1;b=1}else b=q?1:b;s=v;t=u;e=e+3|0;v=s;u=t;continue a}case 7:{if(q&l){c[p>>2]=h;a[n>>0]=1;b=1}else b=q?1:b;s=v;t=u;e=e+4|0;v=s;u=t;continue a}case 24:case 22:case 29:{if(!q){r=b;s=v;t=u;e=h;b=r;v=s;u=t;continue a}if(!l){s=v;t=u;b=1;e=h;v=s;u=t;continue a}c[p>>2]=h;a[n>>0]=1;s=v;t=u;b=1;e=h;v=s;u=t;continue a}case 12:{if(i){if(!l){t=v;u=12;b=2;e=h;v=t;continue a}c[o>>2]=k;t=v;u=12;b=2;e=h;v=t;continue a}if((u|0)!=12){s=v;t=u;b=2;e=h;v=s;u=t;continue a}if(!l){u=12;v=t;b=0;e=h;continue a}c[r>>2]=h;u=12;v=t;b=0;e=h;continue a}case 13:{if(i){if(!l){t=v;u=13;b=2;e=h;v=t;continue a}c[o>>2]=k;t=v;u=13;b=2;e=h;v=t;continue a}if((u|0)!=13){s=v;t=u;b=2;e=h;v=s;u=t;continue a}if(!l){u=13;v=t;b=0;e=h;continue a}c[r>>2]=h;u=13;v=t;b=0;e=h;continue a}case 3:{if(!l){r=b;s=v;t=u;e=h;b=r;v=s;u=t;continue a}a[n>>0]=0;r=b;s=v;t=u;e=h;b=r;v=s;u=t;continue a}case 21:{if(m){s=v;t=u;b=0;e=h;v=s;u=t;continue a}if(!j){r=b;s=v;t=u;e=h;b=r;v=s;u=t;continue a}if(!l){s=v;t=u;b=2;e=h;v=s;u=t;continue a}if(!(a[n>>0]|0)){s=v;t=u;b=2;e=h;v=s;u=t;continue a}if(((s<<24>>24==32?(h|0)!=(c[o>>2]|0):0)?(x=a[k>>0]|0,x<<24>>24!=32):0)?(d[w+(x&255)>>0]|0)!=(u|0):0){s=v;t=u;b=2;e=h;v=s;u=t;continue a}a[n>>0]=0;s=v;t=u;b=2;e=h;v=s;u=t;continue a}case 10:case 9:{if(m){s=v;t=u;b=0;e=h;v=s;u=t;continue a}if(!j){r=b;s=v;t=u;e=h;b=r;v=s;u=t;continue a}if(!l){s=v;t=u;b=2;e=h;v=s;u=t;continue a}a[n>>0]=0;s=v;t=u;b=2;e=h;v=s;u=t;continue a}case 17:case 11:if(i)break a;else{s=v;t=u;b=2;e=h;v=s;u=t;continue a}default:{r=b;s=v;t=u;e=h;b=r;v=s;u=t;continue a}}while(0)}return v|0}function B_(b,c){b=b|0;c=c|0;var d=0,e=0;b=c+2|0;d=a[b>>0]|0;a:do if(d<<24>>24==120){d=c+3|0;b=0;while(1){b:while(1){e=a[d>>0]|0;c=e<<24>>24;if(e<<24>>24==59){e=14;break a}switch(c|0){case 57:case 56:case 55:case 54:case 53:case 52:case 51:case 50:case 49:case 48:{e=7;break b}case 70:case 69:case 68:case 67:case 66:case 65:{e=8;break b}case 102:case 101:case 100:case 99:case 98:case 97:{e=9;break b}default:{}}d=d+1|0}if((e|0)==7){e=0;b=c+-48|b<<4}else if((e|0)==8){e=0;b=(b<<4)+-55+c|0}else if((e|0)==9){e=0;b=(b<<4)+-87+c|0}if((b|0)<1114112)d=d+1|0;else{b=-1;break}}}else{c=b;b=0;while(1){if(d<<24>>24==59){e=14;break a}b=(b*10|0)+-48+(d<<24>>24)|0;d=c+1|0;if((b|0)>=1114112){b=-1;break a}c=d;d=a[d>>0]|0}}while(0);if((e|0)==14)b=k_(b)|0;return b|0}function C_(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=c+1|0;f=c+2|0;a:do switch(d-c|0){case 2:{if((a[e>>0]|0)==116){b=a[c>>0]|0;b=b<<24>>24==108?60:b<<24>>24==103?62:0}else g=14;break}case 3:{if(((a[c>>0]|0)==97?(a[e>>0]|0)==109:0)?(a[f>>0]|0)==112:0)b=38;else g=14;break}case 4:{b=c+3|0;switch(a[c>>0]|0){case 113:{if((a[e>>0]|0)!=117){g=14;break a}if((a[f>>0]|0)!=111){g=14;break a}if((a[b>>0]|0)==116){b=34;break a}else{g=14;break a}}case 97:{if((a[e>>0]|0)!=112){g=14;break a}if((a[f>>0]|0)!=111){g=14;break a}if((a[b>>0]|0)==115){b=39;break a}else{g=14;break a}}default:{g=14;break a}}}default:g=14}while(0);if((g|0)==14)b=0;return b|0}function D_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=b+76|0;i=g+4|0;b=e;while(1){if(b>>>0>=f>>>0)break;e=b+1|0;switch(a[h+(d[b>>0]|0)>>0]|0){case 5:{b=b+2|0;break}case 6:{b=b+3|0;break}case 7:{b=b+4|0;break}case 10:{c[i>>2]=-1;c[g>>2]=(c[g>>2]|0)+1;b=e;break}case 9:{c[g>>2]=(c[g>>2]|0)+1;if((e|0)==(f|0))b=f;else b=(a[h+(d[e>>0]|0)>>0]|0)==10?b+2|0:e;c[i>>2]=-1;break}default:b=e}c[i>>2]=(c[i>>2]|0)+1}return}function E_(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;h=e+-1|0;g=b+76|0;a:while(1){d=d+1|0;if((d|0)==(h|0)){d=1;break}b=a[d>>0]|0;e=b<<24>>24;switch(a[g+(b&255)>>0]|0){case 23:case 19:case 30:case 33:case 16:case 18:case 10:case 9:case 15:case 14:case 17:case 35:case 34:case 32:case 31:case 13:case 27:case 24:case 25:continue a;case 21:if(b<<24>>24==9){i=7;break a}else continue a;case 22:case 26:{if(b<<24>>24>=0)continue a;break}default:{}}switch(e|0){case 64:case 36:break;default:{i=7;break a}}}if((i|0)==7){c[f>>2]=d;d=0}return d|0}function F_(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0;i=h;while(1){j=c[e>>2]|0;if((j|0)==(f|0))break;k=d[j>>0]|0;b=c[g>>2]|0;if(!(k&128)){if((b|0)==(h|0))break;c[e>>2]=j+1;j=a[j>>0]|0;k=c[g>>2]|0;c[g>>2]=k+1;a[k>>0]=j;continue}else{if((i-b|0)<2)break;c[g>>2]=b+1;a[b>>0]=k>>>6|192;j=c[g>>2]|0;c[g>>2]=j+1;a[j>>0]=k&63|128;c[e>>2]=(c[e>>2]|0)+1;continue}}return}function G_(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;while(1){a=c[e>>2]|0;if((a|0)==(f|0))break;if((c[g>>2]|0)==(h|0))break;c[e>>2]=a+1;i=d[a>>0]|0;a=c[g>>2]|0;c[g>>2]=a+2;b[a>>1]=i}return}function H_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){n=b+76|0;m=f;h=m-e|0;i=e+1|0;b:do switch(a[n+(d[e>>0]|0)>>0]|0){case 29:{c[g>>2]=e;e=0;break a}case 24:case 22:break;case 5:{if((h|0)<2){e=-2;break a}if(!(vb[c[b+344>>2]&127](b,e)|0)){c[g>>2]=e;e=0;break a}else{i=e+2|0;break b}}case 6:{if((h|0)<3){e=-2;break a}if(!(vb[c[b+348>>2]&127](b,e)|0)){c[g>>2]=e;e=0;break a}else{i=e+3|0;break b}}case 7:{if((h|0)<4){e=-2;break a}if(!(vb[c[b+352>>2]&127](b,e)|0)){c[g>>2]=e;e=0;break a}else{i=e+4|0;break b}}case 19:{e=J_(b,i,f,g)|0;break a}default:{c[g>>2]=e;e=0;break a}}while(0);h=b+332|0;j=b+336|0;k=b+340|0;c:while(1){if((i|0)==(f|0)){e=-1;break a}l=i+1|0;e=m-i|0;switch(a[n+(d[i>>0]|0)>>0]|0){case 27:case 26:case 25:case 24:case 22:{i=l;continue c}case 29:{h=21;break c}case 18:{h=34;break c}case 5:{if((e|0)<2){e=-2;break a}if(!(vb[c[h>>2]&127](b,i)|0)){h=24;break c}i=i+2|0;continue c}case 6:{if((e|0)<3){e=-2;break a}if(!(vb[c[j>>2]&127](b,i)|0)){h=28;break c}i=i+3|0;continue c}case 7:{if((e|0)<4){e=-2;break a}if(!(vb[c[k>>2]&127](b,i)|0)){h=32;break c}i=i+4|0;continue c}default:{h=35;break c}}}if((h|0)==21){c[g>>2]=i;e=0;break}else if((h|0)==24){c[g>>2]=i;e=0;break}else if((h|0)==28){c[g>>2]=i;e=0;break}else if((h|0)==32){c[g>>2]=i;e=0;break}else if((h|0)==34){c[g>>2]=l;e=9;break}else if((h|0)==35){c[g>>2]=i;e=0;break}}else e=-1;while(0);return e|0}function I_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:do if((e|0)!=(f|0)){o=b+76|0;n=f;h=n-e|0;switch(a[o+(d[e>>0]|0)>>0]|0){case 29:{c[g>>2]=e;h=0;break a}case 24:case 22:{h=1;break}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[b+344>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=2;break}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[b+348>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=3;break}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[b+352>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=4;break}case 30:case 9:case 10:case 21:{c[g>>2]=e;h=22;break a}default:{c[g>>2]=e;h=0;break a}}k=b+332|0;l=b+336|0;m=b+340|0;i=e+h|0;b:while(1){if((i|0)==(f|0)){h=-1;break a}j=i+1|0;h=n-i|0;switch(a[o+(d[i>>0]|0)>>0]|0){case 27:case 26:case 25:case 24:case 22:{i=j;continue b}case 29:{e=18;break b}case 18:{e=31;break b}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[k>>2]&127](b,i)|0)){e=21;break b}i=i+2|0;continue b}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[l>>2]&127](b,i)|0)){e=25;break b}i=i+3|0;continue b}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[m>>2]&127](b,i)|0)){e=29;break b}i=i+4|0;continue b}default:{e=32;break b}}}if((e|0)==18){c[g>>2]=i;h=0;break}else if((e|0)==21){c[g>>2]=i;h=0;break}else if((e|0)==25){c[g>>2]=i;h=0;break}else if((e|0)==29){c[g>>2]=i;h=0;break}else if((e|0)==31){c[g>>2]=j;h=28;break}else if((e|0)==32){c[g>>2]=i;h=0;break}}else h=-1;while(0);return h|0}function J_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;a:do if((e|0)!=(f|0)){i=a[e>>0]|0;h=e+1|0;if(i<<24>>24==120){h=K_(b,h,f,g)|0;break}b=b+76|0;if((a[b+(i&255)>>0]|0)!=25){c[g>>2]=e;h=0;break}b:while(1){if((h|0)==(f|0)){h=-1;break a}e=h+1|0;switch(a[b+(d[h>>0]|0)>>0]|0){case 25:{h=e;break}case 18:{b=8;break b}default:{b=9;break b}}}if((b|0)==8){c[g>>2]=e;h=10;break}else if((b|0)==9){c[g>>2]=h;h=0;break}}else h=-1;while(0);return h|0}function K_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;a:do if((e|0)!=(f|0)){i=b+76|0;if((a[i+(d[e>>0]|0)>>0]&-2)<<24>>24!=24){c[g>>2]=e;b=0;break}b=e+1|0;b:while(1){if((b|0)==(f|0)){b=-1;break a}h=b+1|0;switch(a[i+(d[b>>0]|0)>>0]|0){case 24:case 25:{b=h;break}case 18:{e=7;break b}default:{e=8;break b}}}if((e|0)==7){c[g>>2]=h;b=10;break}else if((e|0)==8){c[g>>2]=b;b=0;break}}else b=-1;while(0);return b|0}function L_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;a:do if((e|0)!=(f|0)){r=b+76|0;n=b+344|0;o=f;h=e+1|0;p=b+352|0;q=b+348|0;i=o-e|0;b:do switch(a[r+(d[e>>0]|0)>>0]|0){case 29:{c[g>>2]=e;h=0;break a}case 24:case 22:break;case 5:{if((i|0)<2){h=-2;break a}if(!(vb[c[n>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else{h=e+2|0;break b}}case 6:{if((i|0)<3){h=-2;break a}if(!(vb[c[q>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else{h=e+3|0;break b}}case 7:{if((i|0)<4){h=-2;break a}if(!(vb[c[p>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else{h=e+4|0;break b}}case 16:{if((h|0)==(f|0)){h=-1;break a}e=e+2|0;switch(a[r+(d[h>>0]|0)>>0]|0){case 27:{h=M_(b,e,f,g)|0;break a}case 20:{h=N_(e,f,g)|0;break a}default:{c[g>>2]=h;h=0;break a}}}case 15:{h=O_(b,h,f,g)|0;break a}case 17:{h=P_(b,h,f,g)|0;break a}default:{c[g>>2]=e;h=0;break a}}while(0);k=b+332|0;l=b+336|0;m=b+340|0;i=0;c:while(1){if((h|0)==(f|0)){h=-1;break a}j=h+1|0;e=o-h|0;switch(a[r+(d[h>>0]|0)>>0]|0){case 27:case 26:case 25:case 24:case 22:{e=i;h=j;i=e;continue c}case 29:{s=27;break c}case 10:case 9:case 21:{h=j;s=59;break c}case 11:{s=76;break c}case 17:break c;case 5:{if((e|0)<2){h=-2;break a}if(!(vb[c[k>>2]&127](b,h)|0)){s=30;break c}j=i;h=h+2|0;i=j;continue c}case 6:{if((e|0)<3){h=-2;break a}if(!(vb[c[l>>2]&127](b,h)|0)){s=34;break c}j=i;h=h+3|0;i=j;continue c}case 7:{if((e|0)<4){h=-2;break a}if(!(vb[c[m>>2]&127](b,h)|0)){s=38;break c}j=i;h=h+4|0;i=j;continue c}case 23:{if(i|0){s=41;break c}if((j|0)==(f|0)){h=-1;break a}e=o-j|0;switch(a[r+(d[j>>0]|0)>>0]|0){case 29:{s=44;break c}case 24:case 22:{i=1;h=h+2|0;continue c}case 5:{if((e|0)<2){h=-2;break a}if(!(vb[c[n>>2]&127](b,j)|0)){s=48;break c}i=1;h=h+3|0;continue c}case 6:{if((e|0)<3){h=-2;break a}if(!(vb[c[q>>2]&127](b,j)|0)){s=52;break c}i=1;h=h+4|0;continue c}case 7:{if((e|0)<4){h=-2;break a}if(!(vb[c[p>>2]&127](b,j)|0)){s=56;break c}i=1;h=h+5|0;continue c}default:{s=58;break c}}}default:{s=81;break c}}}d:switch(s|0){case 27:{c[g>>2]=h;h=0;break a}case 30:{c[g>>2]=h;h=0;break a}case 34:{c[g>>2]=h;h=0;break a}case 38:{c[g>>2]=h;h=0;break a}case 41:{c[g>>2]=h;h=0;break a}case 44:{c[g>>2]=j;h=0;break a}case 48:{c[g>>2]=j;h=0;break a}case 52:{c[g>>2]=j;h=0;break a}case 56:{c[g>>2]=j;h=0;break a}case 58:{c[g>>2]=j;h=0;break a}case 59:{e:while(1){s=0;if((h|0)==(f|0)){h=-1;break a}e=h+1|0;switch(a[r+(d[h>>0]|0)>>0]|0){case 11:{s=76;break d}case 17:break d;case 10:case 9:case 21:{h=e;s=59;break}case 29:{s=61;break e}case 24:case 22:{h=e;break e}case 5:{s=62;break e}case 6:{s=66;break e}case 7:{s=70;break e}default:{s=74;break e}}}do if((s|0)==61){c[g>>2]=h;h=0;break a}else if((s|0)==62){if((o-h|0)<2){h=-2;break a}if(!(vb[c[n>>2]&127](b,h)|0)){c[g>>2]=h;h=0;break a}else{h=h+2|0;break}}else if((s|0)==66){if((o-h|0)<3){h=-2;break a}if(!(vb[c[q>>2]&127](b,h)|0)){c[g>>2]=h;h=0;break a}else{h=h+3|0;break}}else if((s|0)==70){if((o-h|0)<4){h=-2;break a}if(!(vb[c[p>>2]&127](b,h)|0)){c[g>>2]=h;h=0;break a}else{h=h+4|0;break}}else if((s|0)==74){c[g>>2]=h;h=0;break a}while(0);h=Q_(b,h,f,g)|0;break a}case 81:{c[g>>2]=h;h=0;break a}}if((s|0)==76){c[g>>2]=h+1;h=2;break}e=h+1|0;if((e|0)!=(f|0))if((a[e>>0]|0)==62){c[g>>2]=h+2;h=4;break}else{c[g>>2]=e;h=0;break}else h=-1}else h=-1;while(0);return h|0}function M_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){if((a[e>>0]|0)!=45){c[g>>2]=e;e=0;break}l=b+76|0;m=f;i=b+356|0;j=b+360|0;k=b+364|0;n=e+1|0;b:while(1){if((n|0)==(f|0)){e=-1;break a}e=n+1|0;h=m-n|0;switch(a[l+(d[n>>0]|0)>>0]|0){case 8:case 1:case 0:{h=19;break b}case 5:{if((h|0)<2){e=-2;break a}if(vb[c[i>>2]&127](b,n)|0){h=9;break b}n=n+2|0;continue b}case 6:{if((h|0)<3){e=-2;break a}if(vb[c[j>>2]&127](b,n)|0){h=13;break b}n=n+3|0;continue b}case 7:{if((h|0)<4){e=-2;break a}if(vb[c[k>>2]&127](b,n)|0){h=17;break b}n=n+4|0;continue b}case 27:{if((e|0)==(f|0)){e=-1;break a}if((a[e>>0]|0)==45){h=22;break b}else{n=e;continue b}}default:{n=e;continue b}}}if((h|0)==9){c[g>>2]=n;e=0;break}else if((h|0)==13){c[g>>2]=n;e=0;break}else if((h|0)==17){c[g>>2]=n;e=0;break}else if((h|0)==19){c[g>>2]=n;e=0;break}else if((h|0)==22){e=n+2|0;if((e|0)==(f|0)){e=-1;break}if((a[e>>0]|0)==62){c[g>>2]=n+3;e=13;break}else{c[g>>2]=e;e=0;break}}}else e=-1;while(0);return e|0}function N_(b,d,e){b=b|0;d=d|0;e=e|0;if((d-b|0)<6)d=-1;else{d=0;while(1){if((d|0)>=6){d=8;break}if((a[b>>0]|0)!=(a[144449+d>>0]|0)){d=0;break}d=d+1|0;b=b+1|0}c[e>>2]=b}return d|0}function O_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+16|0;q=s;a:do if((e|0)==(f|0))h=-1;else{r=b+76|0;p=f;h=p-e|0;switch(a[r+(d[e>>0]|0)>>0]|0){case 29:{c[g>>2]=e;h=0;break a}case 24:case 22:{h=1;break}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[b+344>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=2;break}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[b+348>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=3;break}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[b+352>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=4;break}default:{c[g>>2]=e;h=0;break a}}k=b+332|0;m=b+336|0;n=b+340|0;h=e+h|0;b:while(1){if((h|0)==(f|0)){h=-1;break a}j=h+1|0;i=p-h|0;switch(a[r+(d[h>>0]|0)>>0]|0){case 27:case 26:case 25:case 24:case 22:{h=j;continue b}case 29:{o=17;break b}case 10:case 9:case 21:{o=30;break b}case 15:{o=51;break b}case 5:{if((i|0)<2){h=-2;break a}if(!(vb[c[k>>2]&127](b,h)|0)){o=20;break b}h=h+2|0;continue b}case 6:{if((i|0)<3){h=-2;break a}if(!(vb[c[m>>2]&127](b,h)|0)){o=24;break b}h=h+3|0;continue b}case 7:{if((i|0)<4){h=-2;break a}if(!(vb[c[n>>2]&127](b,h)|0)){o=28;break b}h=h+4|0;continue b}default:break b}}if((o|0)==17){c[g>>2]=h;h=0;break}else if((o|0)==20){c[g>>2]=h;h=0;break}else if((o|0)==24){c[g>>2]=h;h=0;break}else if((o|0)==28){c[g>>2]=h;h=0;break}else if((o|0)==30){if(!(R_(e,h,q)|0)){c[g>>2]=h;h=0;break}k=b+356|0;m=b+360|0;n=b+364|0;c:while(1){if((j|0)==(f|0)){h=-1;break a}h=j+1|0;i=p-j|0;switch(a[r+(d[j>>0]|0)>>0]|0){case 8:case 1:case 0:{o=47;break c}case 5:{if((i|0)<2){h=-2;break a}if(vb[c[k>>2]&127](b,j)|0){o=37;break c}j=j+2|0;continue c}case 6:{if((i|0)<3){h=-2;break a}if(vb[c[m>>2]&127](b,j)|0){o=41;break c}j=j+3|0;continue c}case 7:{if((i|0)<4){h=-2;break a}if(vb[c[n>>2]&127](b,j)|0){o=45;break c}j=j+4|0;continue c}case 15:{if((h|0)==(f|0)){h=-1;break a}if((a[h>>0]|0)==62){o=50;break c}else{j=h;continue c}}default:{j=h;continue c}}}if((o|0)==37){c[g>>2]=j;h=0;break}else if((o|0)==41){c[g>>2]=j;h=0;break}else if((o|0)==45){c[g>>2]=j;h=0;break}else if((o|0)==47){c[g>>2]=j;h=0;break}else if((o|0)==50){c[g>>2]=j+2;h=c[q>>2]|0;break}}else if((o|0)==51){if(!(R_(e,h,q)|0)){c[g>>2]=h;h=0;break}if((j|0)==(f|0)){h=-1;break}if((a[j>>0]|0)==62){c[g>>2]=h+2;h=c[q>>2]|0;break}else h=j}c[g>>2]=h;h=0}while(0);l=s;return h|0}function P_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){n=b+76|0;m=f;h=m-e|0;switch(a[n+(d[e>>0]|0)>>0]|0){case 29:{c[g>>2]=e;h=0;break a}case 24:case 22:{h=1;break}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[b+344>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=2;break}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[b+348>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=3;break}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[b+352>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=4;break}default:{c[g>>2]=e;h=0;break a}}i=b+332|0;k=b+336|0;l=b+340|0;j=e+h|0;b:while(1){if((j|0)==(f|0)){h=-1;break a}h=j+1|0;e=m-j|0;switch(a[n+(d[j>>0]|0)>>0]|0){case 23:case 27:case 26:case 25:case 24:case 22:{j=h;continue b}case 29:{i=17;break b}case 10:case 9:case 21:{i=30;break b}case 11:{i=34;break b}case 5:{if((e|0)<2){h=-2;break a}if(!(vb[c[i>>2]&127](b,j)|0)){i=20;break b}j=j+2|0;continue b}case 6:{if((e|0)<3){h=-2;break a}if(!(vb[c[k>>2]&127](b,j)|0)){i=24;break b}j=j+3|0;continue b}case 7:{if((e|0)<4){h=-2;break a}if(!(vb[c[l>>2]&127](b,j)|0)){i=28;break b}j=j+4|0;continue b}default:{i=35;break b}}}if((i|0)==17){c[g>>2]=j;h=0;break}else if((i|0)==20){c[g>>2]=j;h=0;break}else if((i|0)==24){c[g>>2]=j;h=0;break}else if((i|0)==28){c[g>>2]=j;h=0;break}else if((i|0)==30){c:while(1){if((h|0)==(f|0)){h=-1;break a}e=h+1|0;switch(a[n+(d[h>>0]|0)>>0]|0){case 10:case 9:case 21:{h=e;i=30;break}case 11:{i=32;break c}default:{i=33;break c}}}if((i|0)==32){c[g>>2]=e;h=5;break}else if((i|0)==33){c[g>>2]=h;h=0;break}}else if((i|0)==34){c[g>>2]=h;h=5;break}else if((i|0)==35){c[g>>2]=j;h=0;break}}else h=-1;while(0);return h|0}function Q_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=l;l=l+16|0;x=z;c[x>>2]=e;s=b+76|0;t=b+344|0;u=b+348|0;v=f;w=b+352|0;m=b+332|0;n=b+336|0;o=b+340|0;p=b+356|0;q=b+360|0;r=b+364|0;i=0;a:while(1){if((e|0)==(f|0)){e=-1;break}h=v-e|0;j=e+1|0;b:do switch(a[s+(d[e>>0]|0)>>0]|0){case 29:{y=4;break a}case 27:case 26:case 25:case 24:case 22:{c[x>>2]=j;k=i;e=j;i=k;continue a}case 5:{if((h|0)<2){e=-2;break a}if(!(vb[c[m>>2]&127](b,e)|0)){y=8;break a}j=e+2|0;c[x>>2]=j;k=i;e=j;i=k;continue a}case 6:{if((h|0)<3){e=-2;break a}if(!(vb[c[n>>2]&127](b,e)|0)){y=12;break a}j=e+3|0;c[x>>2]=j;k=i;e=j;i=k;continue a}case 7:{if((h|0)<4){e=-2;break a}if(!(vb[c[o>>2]&127](b,e)|0)){y=16;break a}j=e+4|0;c[x>>2]=j;k=i;e=j;i=k;continue a}case 23:{if(i|0){y=19;break a}c[x>>2]=j;if((j|0)==(f|0)){e=-1;break a}h=v-j|0;switch(a[s+(d[j>>0]|0)>>0]|0){case 29:{y=22;break a}case 24:case 22:{k=e+2|0;c[x>>2]=k;i=1;e=k;continue a}case 5:{if((h|0)<2){e=-2;break a}if(!(vb[c[t>>2]&127](b,j)|0)){y=26;break a}k=e+3|0;c[x>>2]=k;i=1;e=k;continue a}case 6:{if((h|0)<3){e=-2;break a}if(!(vb[c[u>>2]&127](b,j)|0)){y=30;break a}k=e+4|0;c[x>>2]=k;i=1;e=k;continue a}case 7:{if((h|0)<4){e=-2;break a}if(!(vb[c[w>>2]&127](b,j)|0)){y=34;break a}k=e+5|0;c[x>>2]=k;i=1;e=k;continue a}default:{y=36;break a}}}case 10:case 9:case 21:while(1){e=e+1|0;c[x>>2]=e;if((e|0)==(f|0)){e=-1;break a}switch(a[s+(d[e>>0]|0)>>0]|0){case 14:break b;case 9:case 10:case 21:break;default:{y=39;break a}}}case 14:break;default:{y=92;break a}}while(0);while(1){h=e+1|0;c[x>>2]=h;if((h|0)==(f|0)){e=-1;break a}k=a[s+(d[h>>0]|0)>>0]|0;if((k|1)<<24>>24==13)break;switch(k<<24>>24){case 9:case 10:case 21:{e=h;break}default:{y=43;break a}}}e=e+2|0;c[x>>2]=e;c:while(1){if((e|0)==(f|0)){e=-1;break a}h=a[s+(d[e>>0]|0)>>0]|0;if(h<<24>>24==k<<24>>24)break;i=e+1|0;j=v-e|0;switch(h<<24>>24){case 8:case 1:case 0:{y=60;break a}case 2:{y=65;break a}case 5:{if((j|0)<2){e=-2;break a}if(vb[c[p>>2]&127](b,e)|0){y=50;break a}j=e+2|0;c[x>>2]=j;e=j;continue c}case 6:{if((j|0)<3){e=-2;break a}if(vb[c[q>>2]&127](b,e)|0){y=54;break a}j=e+3|0;c[x>>2]=j;e=j;continue c}case 7:{if((j|0)<4){e=-2;break a}if(vb[c[r>>2]&127](b,e)|0){y=58;break a}j=e+4|0;c[x>>2]=j;e=j;continue c}case 3:{e=H_(b,i,f,x)|0;if((e|0)<1){y=63;break a}e=c[x>>2]|0;continue c}default:{c[x>>2]=i;e=i;continue c}}}h=e+1|0;c[x>>2]=h;if((h|0)==(f|0)){e=-1;break}switch(a[s+(d[h>>0]|0)>>0]|0){case 11:{y=86;break a}case 17:{y=87;break a}case 10:case 9:case 21:{e=h;break}default:{y=69;break a}}d:while(1){h=e+1|0;c[x>>2]=h;if((h|0)==(f|0)){e=-1;break a}switch(a[s+(d[h>>0]|0)>>0]|0){case 29:{y=72;break a}case 11:{y=86;break a}case 17:{y=87;break a}case 10:case 9:case 21:{e=h;break}case 24:case 22:{y=73;break d}case 5:{y=74;break d}case 6:{y=78;break d}case 7:{y=82;break d}default:{y=91;break a}}}if((y|0)==73){y=0;e=e+2|0;c[x>>2]=e;i=0;continue}else if((y|0)==74){y=0;if((v-h|0)<2){e=-2;break}if(!(vb[c[t>>2]&127](b,h)|0)){y=76;break}e=e+3|0;c[x>>2]=e;i=0;continue}else if((y|0)==78){y=0;if((v-h|0)<3){e=-2;break}if(!(vb[c[u>>2]&127](b,h)|0)){y=80;break}e=e+4|0;c[x>>2]=e;i=0;continue}else if((y|0)==82){y=0;if((v-h|0)<4){e=-2;break}if(!(vb[c[w>>2]&127](b,h)|0)){y=84;break}e=e+5|0;c[x>>2]=e;i=0;continue}}switch(y|0){case 4:{c[g>>2]=e;e=0;break}case 8:{c[g>>2]=e;e=0;break}case 12:{c[g>>2]=e;e=0;break}case 16:{c[g>>2]=e;e=0;break}case 19:{c[g>>2]=e;e=0;break}case 22:{c[g>>2]=j;e=0;break}case 26:{c[g>>2]=j;e=0;break}case 30:{c[g>>2]=j;e=0;break}case 34:{c[g>>2]=j;e=0;break}case 36:{c[g>>2]=j;e=0;break}case 39:{c[g>>2]=e;e=0;break}case 43:{c[g>>2]=h;e=0;break}case 50:{c[g>>2]=e;e=0;break}case 54:{c[g>>2]=e;e=0;break}case 58:{c[g>>2]=e;e=0;break}case 60:{c[g>>2]=e;e=0;break}case 63:{if(!e){c[g>>2]=c[x>>2];e=0}break}case 65:{c[g>>2]=e;e=0;break}case 69:{c[g>>2]=h;e=0;break}case 72:{c[g>>2]=h;e=0;break}case 76:{c[g>>2]=h;e=0;break}case 80:{c[g>>2]=h;e=0;break}case 84:{c[g>>2]=h;e=0;break}case 86:{c[g>>2]=e+2;e=1;break}case 87:{e=h+1|0;c[x>>2]=e;if((e|0)!=(f|0))if((a[e>>0]|0)==62){c[g>>2]=h+2;e=3;break}else{c[g>>2]=e;e=0;break}else e=-1;break}case 91:{c[g>>2]=h;e=0;break}case 92:{c[g>>2]=e;e=0;break}}l=z;return e|0}function R_(b,d,e){b=b|0;d=d|0;e=e|0;c[e>>2]=11;a:do if((d-b|0)==3){switch(a[b>>0]|0){case 120:{d=0;break}case 88:{d=1;break}default:{d=1;break a}}switch(a[b+1>>0]|0){case 109:break;case 77:{d=1;break}default:{d=1;break a}}switch(a[b+2>>0]|0){case 108:break;case 76:{d=0;break a}default:{d=1;break a}}if(!d){c[e>>2]=12;d=1}else d=0}else d=1;while(0);return d|0}function S_(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;l=e+76|0;m=g;n=e+356|0;o=e+360|0;p=e+364|0;a:while(1){if((f|0)==(g|0)){f=-1;break}i=a[l+(d[f>>0]|0)>>0]|0;j=f+1|0;k=m-f|0;switch(i<<24>>24){case 8:case 1:case 0:{q=16;break a}case 5:{if((k|0)<2){f=-2;break a}if(vb[c[n>>2]&127](e,f)|0){q=6;break a}f=f+2|0;continue a}case 6:{if((k|0)<3){f=-2;break a}if(vb[c[o>>2]&127](e,f)|0){q=10;break a}f=f+3|0;continue a}case 7:{if((k|0)<4){f=-2;break a}if(vb[c[p>>2]&127](e,f)|0){q=14;break a}f=f+4|0;continue a}case 13:case 12:if((i&255|0)==(b|0)){q=18;break a}else{f=j;continue a}default:{f=j;continue a}}}b:do if((q|0)==6){c[h>>2]=f;f=0}else if((q|0)==10){c[h>>2]=f;f=0}else if((q|0)==14){c[h>>2]=f;f=0}else if((q|0)==16){c[h>>2]=f;f=0}else if((q|0)==18)if((j|0)==(g|0))f=-27;else{c[h>>2]=j;switch(a[l+(d[j>>0]|0)>>0]|0){case 20:case 30:case 11:case 10:case 9:case 21:{f=27;break b}default:{}}f=0}while(0);return f|0}function T_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;a:do if((e|0)==(f|0))h=-1;else{i=b+76|0;h=e+1|0;switch(a[i+(d[e>>0]|0)>>0]|0){case 27:{h=M_(b,h,f,g)|0;break a}case 20:{c[g>>2]=h;h=33;break a}case 24:case 22:{b:while(1){if((h|0)==(f|0)){h=-1;break a}b=h+1|0;switch(a[i+(d[h>>0]|0)>>0]|0){case 24:case 22:{h=b;break}case 30:{j=8;break b}case 10:case 9:case 21:break b;default:{j=12;break b}}}if((j|0)==12){c[g>>2]=h;h=0;break a}c:do if((j|0)==8){if((b|0)==(f|0)){h=-1;break a}switch(a[i+(d[b>>0]|0)>>0]|0){case 30:case 10:case 9:case 21:break;default:break c}c[g>>2]=h;h=0;break a}while(0);c[g>>2]=h;h=16;break a}default:{c[g>>2]=e;h=0;break a}}}while(0);return h|0}function U_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){n=b+76|0;m=f;h=m-e|0;switch(a[n+(d[e>>0]|0)>>0]|0){case 29:{c[g>>2]=e;h=0;break a}case 24:case 22:{h=1;break}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[b+344>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=2;break}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[b+348>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=3;break}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[b+352>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=4;break}default:{c[g>>2]=e;h=0;break a}}j=b+332|0;k=b+336|0;l=b+340|0;i=e+h|0;b:while(1){if((i|0)==(f|0)){h=-20;break a}h=m-i|0;switch(a[n+(d[i>>0]|0)>>0]|0){case 29:{e=17;break b}case 36:case 30:case 11:case 32:case 21:case 10:case 9:{e=28;break b}case 27:case 26:case 25:case 24:case 22:{h=1;break}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[j>>2]&127](b,i)|0)){e=20;break b}else h=2;break}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[k>>2]&127](b,i)|0)){e=23;break b}else h=3;break}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[l>>2]&127](b,i)|0)){e=26;break b}else h=4;break}default:{e=29;break b}}i=i+h|0}if((e|0)==17){c[g>>2]=i;h=0;break}else if((e|0)==20){c[g>>2]=i;h=0;break}else if((e|0)==23){c[g>>2]=i;h=0;break}else if((e|0)==26){c[g>>2]=i;h=0;break}else if((e|0)==28){c[g>>2]=i;h=20;break}else if((e|0)==29){c[g>>2]=i;h=0;break}}else h=-1;while(0);return h|0}function V_(){return 58448}function W_(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=c[d>>2]|0;b=c[f>>2]|0;g=g-b|0;a:do if((e-h|0)>(g|0)){e=h+g|0;while(1){if(e>>>0<=h>>>0)break a;g=e+-1|0;if((a[g>>0]&-64)<<24>>24==-128)e=g;else break}}while(0);while(1){if((h|0)==(e|0))break;a[b>>0]=a[h>>0]|0;h=h+1|0;b=b+1|0}c[d>>2]=e;c[f>>2]=b;return}function X_(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=d+76|0;d=c[g>>2]|0;i=c[e>>2]|0;a:while(1){if((i|0)==(f|0)|(d|0)==(h|0))break;j=a[i>>0]|0;k=i+1|0;l=d+2|0;m=i+3|0;n=j<<24>>24;o=i+2|0;switch(a[p+(j&255)>>0]|0){case 5:{b[d>>1]=a[k>>0]&63|n<<6&1984;d=l;i=o;continue a}case 6:{b[d>>1]=(a[k>>0]&63)<<6|n<<12|a[o>>0]&63;d=l;i=m;continue a}case 7:{if((l|0)==(h|0))break a;o=((a[k>>0]&63)<<12|n<<18&1835008|(a[o>>0]&63)<<6|a[m>>0]&63)+-65536|0;b[d>>1]=o>>>10|55296;b[l>>1]=o&1023|56320;d=d+4|0;i=i+4|0;continue a}default:{b[d>>1]=j<<24>>24;d=l;i=k;continue a}}}c[e>>2]=i;c[g>>2]=d;return}function Y_(a,b){a=a|0;b=b|0;a=d[b>>0]|0;b=d[b+1>>0]|0;return 1<<(b&31)&c[57168+(((d[144193+(a>>>2&7)>>0]|0)<<3|a<<1&6|b>>>5&1)<<2)>>2]|0}function Z_(b,e){b=b|0;e=e|0;var f=0;f=d[e+1>>0]|0;b=d[e+2>>0]|0;return 1<<(b&31)&c[57168+(((d[144193+(f>>>2&15|a[e>>0]<<4&255)>>0]|0)<<3|f<<1&6|b>>>5&1)<<2)>>2]|0}function __(a,b){a=a|0;b=b|0;return 0}function $_(a,b){a=a|0;b=b|0;a=d[b>>0]|0;b=d[b+1>>0]|0;return 1<<(b&31)&c[57168+(((d[143937+(a>>>2&7)>>0]|0)<<3|a<<1&6|b>>>5&1)<<2)>>2]|0}function a$(b,e){b=b|0;e=e|0;var f=0;f=d[e+1>>0]|0;b=d[e+2>>0]|0;return 1<<(b&31)&c[57168+(((d[143937+(f>>>2&15|a[e>>0]<<4&255)>>0]|0)<<3|f<<1&6|b>>>5&1)<<2)>>2]|0}function b$(a,b){a=a|0;b=b|0;if((d[b>>0]|0)<194)a=1;else{a=d[b+1>>0]|0;a=(a&128|0)==0|(a&192|0)==192}return a&1|0}function c$(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;d=a[c+2>>0]|0;e=d&255;do if(!(e&128))b=1;else{f=a[c>>0]|0;b=c+1|0;if(f<<24>>24==-17?(a[b>>0]|0)==-65:0)if((d&255)>189){b=1;break}else{b=191;d=-65;c=0}else{if((e&192|0)==192){b=1;break}d=a[b>>0]|0;b=d&255;c=(b&192|0)==192;if(f<<24>>24==-32){b=(d&255)<160|c;break}}b=(b&128|0)==0|(f<<24>>24==-19?(d&255)>159:c)}while(0);return b&1|0}function d$(b,c){b=b|0;c=c|0;var e=0,f=0;f=d[c+3>>0]|0;do if(!((f&128|0)==0|(f&192|0)==192)?(f=d[c+2>>0]|0,!((f&128|0)==0|(f&192|0)==192)):0){f=a[c>>0]|0;b=a[c+1>>0]|0;c=b&255;e=(c&192|0)==192;if(f<<24>>24==-16){b=(b&255)<144|e;break}else{b=(c&128|0)==0|(f<<24>>24==-12?(b&255)>143:e);break}}else b=1;while(0);return b&1|0}function e$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;a:do if((e|0)!=(f|0)){h=e;p=f-h|0;o=(p&1|0)==0;p=p&-2;q=(p|0)==0;p=o|q?f:e+p|0;if(o|q^1){i=a[e+1>>0]|0;q=b+76|0;m=a[e>>0]|0;if(!(i<<24>>24))l=d[q+(m&255)>>0]|0;else l=v$(i,m)|0;j=e+2|0;o=p;k=e+3|0;f=o-h|0;h=(j|0)==(p|0);n=e+4|0;do switch(l|0){case 12:{f=H$(12,b,j,p,g)|0;break a}case 13:{f=H$(13,b,j,p,g)|0;break a}case 2:{if(h){f=-1;break a}f=a[k>>0]|0;h=a[j>>0]|0;if(!(f<<24>>24))f=d[q+(h&255)>>0]|0;else f=v$(f,h)|0;switch(f|0){case 16:{f=I$(b,n,p,g)|0;break a}case 15:{f=D$(b,n,p,g)|0;break a}case 7:case 6:case 5:case 29:case 24:case 22:{c[g>>2]=e;f=29;break a}default:{c[g>>2]=j;f=0;break a}}}case 9:{if(h){c[g>>2]=p;f=-15;break a}else h=20;break}case 10:case 21:{h=20;break}case 30:{f=x$(b,j,p,g)|0;break a}case 35:{c[g>>2]=j;f=38;break a}case 20:{c[g>>2]=j;f=25;break a}case 4:{if(h){f=-26;break a}if((a[k>>0]|0)==0?(a[j>>0]|0)==93:0){if((n|0)==(p|0)){f=-1;break a}if((a[e+5>>0]|0)==0?(a[n>>0]|0)==62:0){c[g>>2]=e+6;f=34;break a}}c[g>>2]=j;f=26;break a}case 31:{c[g>>2]=j;f=23;break a}case 32:{if(h){f=-24;break a}f=a[k>>0]|0;h=a[j>>0]|0;if(!(f<<24>>24))f=d[q+(h&255)>>0]|0;else f=v$(f,h)|0;switch(f|0){case 33:{c[g>>2]=n;f=36;break a}case 15:{c[g>>2]=n;f=35;break a}case 34:{c[g>>2]=n;f=37;break a}case 32:case 36:case 35:case 11:case 21:case 10:case 9:{c[g>>2]=j;f=24;break a}default:{c[g>>2]=j;f=0;break a}}}case 36:{c[g>>2]=j;f=21;break a}case 11:{c[g>>2]=j;f=17;break a}case 19:{f=J$(b,j,p,g)|0;break a}case 5:{if((f|0)<2){f=-2;break a}c[g>>2]=e;f=0;break a}case 6:{if((f|0)<3){f=-2;break a}c[g>>2]=e;f=0;break a}case 7:{if((f|0)<4){f=-2;break a}c[g>>2]=e;f=0;break a}case 24:case 22:{f=18;h=63;break}case 23:case 27:case 26:case 25:{f=19;h=63;break}case 29:{i=i&255;h=m&255;f=h>>>5;h=1<<(h&31);if(!(h&c[57168+((f|d[143937+i>>0]<<3)<<2)>>2]))if(!(c[57168+((d[144193+i>>0]<<3|f)<<2)>>2]&h))h=62;else{f=19;h=63}else{f=18;h=63}break}default:h=62}while(0);if((h|0)==20){b:while(1){i=e;e=e+2|0;if((e|0)==(p|0)){h=27;break}f=a[i+3>>0]|0;h=a[e>>0]|0;if(!(f<<24>>24))f=d[q+(h&255)>>0]|0;else f=v$(f,h)|0;switch(f|0){case 10:case 21:{h=20;continue b}case 9:break;default:{h=26;break b}}if((i+4|0)==(p|0)){h=26;break}else h=20}if((h|0)==26){c[g>>2]=e;f=15;break}else if((h|0)==27){c[g>>2]=p;f=15;break}}else if((h|0)==62){c[g>>2]=e;f=0;break}else if((h|0)==63){c:while(1){if((j|0)==(p|0)){h=103;break}h=a[j+1>>0]|0;i=a[j>>0]|0;if(!(h<<24>>24))e=d[q+(i&255)>>0]|0;else e=v$(h,i)|0;k=j+2|0;switch(e|0){case 27:case 26:case 25:case 24:case 22:{h=f;j=k;f=h;h=63;continue c}case 5:{h=70;break c}case 6:{h=72;break c}case 7:{h=74;break c}case 10:case 9:case 21:case 30:case 20:case 36:case 35:case 32:case 11:{h=76;break c}case 34:{h=93;break c}case 33:{h=96;break c}case 15:{h=99;break c}case 29:{n=i&255;if(!(1<<(n&31)&c[57168+((n>>>5|d[144193+(h&255)>>0]<<3)<<2)>>2])){h=69;break c}else{h=f;j=k;f=h;h=63;continue c}}case 23:break;default:{h=102;break c}}switch(f&63){case 18:break;case 41:{f=19;j=k;h=63;continue c}default:{h=f;j=k;f=h;h=63;continue c}}if((k|0)==(p|0)){f=-1;break a}f=a[j+3>>0]|0;h=a[k>>0]|0;if(!(f<<24>>24))i=d[q+(h&255)>>0]|0;else i=v$(f,h)|0;switch(i|0){case 5:{h=86;break c}case 6:{h=88;break c}case 7:{h=90;break c}case 29:{n=h&255;if(!(1<<(n&31)&c[57168+((n>>>5|d[144193+(f&255)>>0]<<3)<<2)>>2])){h=84;break c}break}case 27:case 26:case 25:case 24:case 22:break;default:{f=19;j=k;h=63;continue c}}f=41;j=j+4|0;h=63}switch(h|0){case 69:{c[g>>2]=j;f=0;break a}case 70:{if((o-j|0)<2){f=-2;break a}c[g>>2]=j;f=0;break a}case 72:{if((o-j|0)<3){f=-2;break a}c[g>>2]=j;f=0;break a}case 74:{if((o-j|0)<4){f=-2;break a}c[g>>2]=j;f=0;break a}case 76:{c[g>>2]=j;break a}case 84:{c[g>>2]=k;f=0;break a}case 86:{if((o-k|0)<2){f=-2;break a}c[g>>2]=k;f=0;break a}case 88:{if((o-k|0)<3){f=-2;break a}c[g>>2]=k;f=0;break a}case 90:{if((o-k|0)<4){f=-2;break a}c[g>>2]=k;f=0;break a}case 93:if((f|0)==19){c[g>>2]=j;f=0;break a}else{c[g>>2]=k;f=32;break a}case 96:if((f|0)==19){c[g>>2]=j;f=0;break a}else{c[g>>2]=k;f=31;break a}case 99:if((f|0)==19){c[g>>2]=j;f=0;break a}else{c[g>>2]=k;f=30;break a}case 102:{c[g>>2]=j;f=0;break a}case 103:{f=0-f|0;break a}}}}else f=-1}else f=-4;while(0);return f|0}function f$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:do if((e|0)!=(f|0)){l=e;o=f-l|0;n=(o&1|0)==0;o=o&-2;p=(o|0)==0;o=n|p?f:e+o|0;if(n|p^1){f=a[e+1>>0]|0;h=a[e>>0]|0;p=b+76|0;if(!(f<<24>>24))j=d[p+(h&255)>>0]|0;else j=v$(f,h)|0;k=e+2|0;n=o;i=e+3|0;m=e+4|0;f=n-l|0;h=(k|0)==(o|0);switch(j|0){case 2:{f=A$(b,k,o,g)|0;break a}case 3:{f=w$(b,k,o,g)|0;break a}case 9:{if(h){f=-3;break a}f=a[i>>0]|0;h=a[k>>0]|0;if(!(f<<24>>24))f=d[p+(h&255)>>0]|0;else f=v$(f,h)|0;c[g>>2]=(f|0)==10?m:k;f=7;break a}case 10:{c[g>>2]=k;f=7;break a}case 4:{if(h){f=-5;break a}if((a[i>>0]|0)==0?(a[k>>0]|0)==93:0){if((m|0)==(o|0)){f=-5;break a}if((a[e+5>>0]|0)==0?(a[m>>0]|0)==62:0){c[g>>2]=m;f=0;break a}}break}case 5:{if((f|0)<2){f=-2;break a}break}case 6:{if((f|0)<3){f=-2;break a}else k=i;break}case 7:{if((f|0)<4){f=-2;break a}else k=m;break}case 8:case 1:case 0:{c[g>>2]=e;f=0;break a}default:{}}b:while(1){if((k|0)==(o|0)){h=46;break}f=a[k+1>>0]|0;h=a[k>>0]|0;if(!(f<<24>>24))i=d[p+(h&255)>>0]|0;else i=v$(f,h)|0;j=k+4|0;f=k+2|0;h=n-k|0;switch(i|0){case 10:case 9:case 8:case 1:case 0:case 2:case 3:{h=45;break b}case 5:if((h|0)<2){h=32;break b}else{k=f;continue b}case 6:{if((h|0)<3){h=34;break b}k=k+3|0;continue b}case 7:if((h|0)<4){h=37;break b}else{k=j;continue b}case 4:{if((f|0)==(o|0)){h=45;break b}if(a[k+3>>0]|0){k=f;continue b}if((a[f>>0]|0)!=93){k=f;continue b}if((j|0)==(o|0)){h=45;break b}if(a[k+5>>0]|0){k=f;continue b}if((a[j>>0]|0)==62){h=44;break b}else{k=f;continue b}}default:{k=f;continue b}}}if((h|0)==32){c[g>>2]=k;f=6;break}else if((h|0)==34){c[g>>2]=k;f=6;break}else if((h|0)==37){c[g>>2]=k;f=6;break}else if((h|0)==44){c[g>>2]=j;f=0;break}else if((h|0)==45){c[g>>2]=k;f=6;break}else if((h|0)==46){c[g>>2]=o;f=6;break}}else f=-1}else f=-4;while(0);return f|0}function g$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){k=e;m=f-k|0;l=(m&1|0)==0;m=m&-2;n=(m|0)==0;m=l|n?f:e+m|0;if(l|n^1){f=a[e+1>>0]|0;h=a[e>>0]|0;n=b+76|0;if(!(f<<24>>24))j=d[n+(h&255)>>0]|0;else j=v$(f,h)|0;i=e+2|0;l=m;h=(i|0)==(m|0);f=l-k|0;b=e+3|0;k=e+4|0;switch(j|0){case 4:{if(h){f=-1;break a}if((a[b>>0]|0)==0?(a[i>>0]|0)==93:0){if((k|0)==(m|0)){f=-1;break a}if((a[e+5>>0]|0)==0?(a[k>>0]|0)==62:0){c[g>>2]=e+6;f=40;break a}}break}case 9:{if(h){f=-1;break a}f=a[b>>0]|0;b=a[i>>0]|0;if(!(f<<24>>24))f=d[n+(b&255)>>0]|0;else f=v$(f,b)|0;c[g>>2]=(f|0)==10?k:i;f=7;break a}case 10:{c[g>>2]=i;f=7;break a}case 5:{if((f|0)<2){f=-2;break a}break}case 6:{if((f|0)<3){f=-2;break a}else i=b;break}case 7:{if((f|0)<4){f=-2;break a}else i=k;break}case 8:case 1:case 0:{c[g>>2]=e;f=0;break a}default:{}}b:while(1){if((i|0)==(m|0)){b=38;break}f=a[i+1>>0]|0;b=a[i>>0]|0;if(!(f<<24>>24))h=d[n+(b&255)>>0]|0;else h=v$(f,b)|0;f=i+2|0;b=l-i|0;switch(h|0){case 4:case 10:case 9:case 8:case 1:case 0:{b=37;break b}case 5:if((b|0)<2){b=30;break b}else{i=f;continue b}case 6:{if((b|0)<3){b=32;break b}i=i+3|0;continue b}case 7:{if((b|0)<4){b=35;break b}i=i+4|0;continue b}default:{i=f;continue b}}}if((b|0)==30){c[g>>2]=i;f=6;break}else if((b|0)==32){c[g>>2]=i;f=6;break}else if((b|0)==35){c[g>>2]=i;f=6;break}else if((b|0)==37){c[g>>2]=i;f=6;break}else if((b|0)==38){c[g>>2]=m;f=6;break}}else f=-1}else f=-4;while(0);return f|0}function h$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=f-e|0;r=(r&1|0)==0?f:e+(r&-2)|0;p=b+76|0;q=r;o=0;a:while(1){if((e|0)==(r|0)){f=-1;break}f=a[e+1>>0]|0;b=a[e>>0]|0;if(!(f<<24>>24))n=d[p+(b&255)>>0]|0;else n=v$(f,b)|0;f=e+2|0;b=(f|0)==(r|0);h=e+4|0;i=e+3|0;j=e+6|0;k=(h|0)==(r|0);l=e+5|0;m=q-e|0;switch(n|0){case 8:case 1:case 0:{s=10;break a}case 5:if((m|0)<2){f=-2;break a}else{n=o;e=f;o=n;continue a}case 6:if((m|0)<3){f=-2;break a}else{n=o;e=i;o=n;continue a}case 7:if((m|0)<4){f=-2;break a}else{n=o;e=h;o=n;continue a}case 2:{if(b){f=-1;break a}if(a[i>>0]|0){n=o;e=f;o=n;continue a}if((a[f>>0]|0)!=33){n=o;e=f;o=n;continue a}if(k){f=-1;break a}if(a[l>>0]|0){n=o;e=h;o=n;continue a}e=(a[h>>0]|0)==91;o=(e&1)+o|0;e=e?j:h;continue a}case 4:{if(b){f=-1;break a}if(a[i>>0]|0){n=o;e=f;o=n;continue a}if((a[f>>0]|0)!=93){n=o;e=f;o=n;continue a}if(k){f=-1;break a}if(a[l>>0]|0){n=o;e=h;o=n;continue a}if((a[h>>0]|0)!=62){n=o;e=h;o=n;continue a}if(!o){s=24;break a}o=o+-1|0;e=j;continue a}default:{n=o;e=f;o=n;continue a}}}if((s|0)==10){c[g>>2]=e;f=0}else if((s|0)==24){c[g>>2]=j;f=42}return f|0}function i$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;do if((e|0)!=(f|0)){l=b+76|0;j=e;a:while(1){if((j|0)==(f|0)){i=27;break}i=a[j+1>>0]|0;h=a[j>>0]|0;if(!(i<<24>>24))h=d[l+(h&255)>>0]|0;else h=v$(i,h)|0;k=j+2|0;switch(h|0){case 21:{i=24;break a}case 3:{i=10;break a}case 2:{i=13;break a}case 10:{i=14;break a}case 9:{i=17;break a}case 6:{j=j+3|0;continue a}case 7:{j=j+4|0;continue a}default:{j=k;continue a}}}if((i|0)==10)if((j|0)==(e|0)){h=w$(b,k,f,g)|0;break}else{c[g>>2]=j;h=6;break}else if((i|0)==13){c[g>>2]=j;h=0;break}else if((i|0)==14)if((j|0)==(e|0)){c[g>>2]=k;h=7;break}else{c[g>>2]=j;h=6;break}else if((i|0)==17){if((j|0)!=(e|0)){c[g>>2]=j;h=6;break}if((k|0)==(f|0)){h=-3;break}h=a[e+3>>0]|0;i=a[k>>0]|0;if(!(h<<24>>24))h=d[l+(i&255)>>0]|0;else h=v$(h,i)|0;c[g>>2]=(h|0)==10?e+4|0:k;h=7;break}else if((i|0)==24)if((j|0)==(e|0)){c[g>>2]=k;h=39;break}else{c[g>>2]=j;h=6;break}else if((i|0)==27){c[g>>2]=f;h=6;break}}else h=-4;while(0);return h|0}function j$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;do if((e|0)!=(f|0)){l=b+76|0;j=e;a:while(1){if((j|0)==(f|0)){i=26;break}i=a[j+1>>0]|0;h=a[j>>0]|0;if(!(i<<24>>24))h=d[l+(h&255)>>0]|0;else h=v$(i,h)|0;k=j+2|0;switch(h|0){case 9:{i=19;break a}case 3:{i=10;break a}case 30:{i=13;break a}case 10:{i=16;break a}case 6:{j=j+3|0;continue a}case 7:{j=j+4|0;continue a}default:{j=k;continue a}}}if((i|0)==10)if((j|0)==(e|0)){h=w$(b,k,f,g)|0;break}else{c[g>>2]=j;h=6;break}else if((i|0)==13)if((j|0)==(e|0)){h=x$(b,k,f,g)|0;h=(h|0)==22?0:h;break}else{c[g>>2]=j;h=6;break}else if((i|0)==16)if((j|0)==(e|0)){c[g>>2]=k;h=7;break}else{c[g>>2]=j;h=6;break}else if((i|0)==19){if((j|0)!=(e|0)){c[g>>2]=j;h=6;break}if((k|0)==(f|0)){h=-3;break}h=a[e+3>>0]|0;i=a[k>>0]|0;if(!(h<<24>>24))h=d[l+(i&255)>>0]|0;else h=v$(h,i)|0;c[g>>2]=(h|0)==10?e+4|0:k;h=7;break}else if((i|0)==26){c[g>>2]=f;h=6;break}}else h=-4;while(0);return h|0}function k$(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=b+76|0;f=e;b=c;a:while(1){h=b+1|0;i=a[h>>0]|0;e=a[b>>0]|0;if(!(i<<24>>24))g=d[j+(e&255)>>0]|0;else g=v$(i,e)|0;c=f+1|0;switch(g|0){case 7:{if(e<<24>>24==(a[f>>0]|0)){f=c;b=h;e=i;k=7}else{b=0;break a}break}case 6:{k=7;break}case 5:{k=9;break}case 27:case 26:case 25:case 24:case 23:case 22:case 29:{if((a[f>>0]|0)!=e<<24>>24){b=0;break a}if((a[c>>0]|0)==i<<24>>24)e=f;else{b=0;break a}break}default:{k=14;break a}}if((k|0)==7){k=0;c=b+1|0;if(e<<24>>24!=(a[f>>0]|0)){b=0;break}f=f+1|0;b=c;e=a[c>>0]|0;k=9}if((k|0)==9){k=0;if(e<<24>>24!=(a[f>>0]|0)){b=0;break}if((a[b+1>>0]|0)==(a[f+1>>0]|0))e=f;else{b=0;break}}f=e+2|0;b=b+2|0}b:do if((k|0)==14){e=a[c>>0]|0;b=a[f>>0]|0;if(!(e<<24>>24))b=d[j+(b&255)>>0]|0;else b=v$(e,b)|0;switch(b|0){case 27:case 26:case 25:case 24:case 23:case 22:case 29:case 7:case 6:case 5:{b=0;break b}default:{}}b=1}while(0);return b|0}function l$(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;b=c;while(1){c=a[e>>0]|0;f=(b|0)==(d|0);if(!(c<<24>>24)){g=7;break}if(f){b=0;break}if(a[b+1>>0]|0){b=0;break}if((a[b>>0]|0)!=c<<24>>24){b=0;break}e=e+1|0;b=b+2|0}if((g|0)==7)b=f&1;return b|0}function m$(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;g=b+76|0;f=c;a:while(1){b=a[f+1>>0]|0;e=a[f>>0]|0;if(!(b<<24>>24))b=d[g+(e&255)>>0]|0;else b=v$(b,e)|0;switch(b|0){case 27:case 26:case 25:case 24:case 23:case 22:case 29:case 5:{f=f+2|0;continue a}case 6:{f=f+3|0;continue a}case 7:{f=f+4|0;continue a}default:break a}}return f-c|0}function n$(b,c){b=b|0;c=c|0;var e=0,f=0;f=b+76|0;a:while(1){b=a[c+1>>0]|0;e=a[c>>0]|0;if(!(b<<24>>24))b=d[f+(e&255)>>0]|0;else b=v$(b,e)|0;switch(b|0){case 21:case 9:case 10:break;default:break a}c=c+2|0}return c|0}function o$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=b+76|0;x=0;y=0;u=1;a:while(1){w=e+2|0;r=e+3|0;b=a[r>>0]|0;s=b<<24>>24==0;t=a[w>>0]|0;if(s)p=d[z+(t&255)>>0]|0;else p=v$(b,t)|0;b=(y|0)<(f|0);q=e+4|0;h=(u|0)==1;i=(u|0)==2;v=g+(y<<4)+12|0;j=y+1|0;k=(u|0)==0;l=(u|0)!=2;m=g+(y<<4)+8|0;n=g+(y<<4)+4|0;o=g+(y<<4)|0;do switch(p|0){case 5:{if(!k){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=1;e=w;y=t;x=v;continue a}c[o>>2]=w;a[v>>0]=1;t=y;v=x;u=1;e=w;y=t;x=v;continue a}case 6:{if(!k){t=u;v=y;w=x;e=r;u=t;y=v;x=w;continue a}if(!b){v=y;w=x;u=1;e=r;y=v;x=w;continue a}c[o>>2]=w;a[v>>0]=1;v=y;w=x;u=1;e=r;y=v;x=w;continue a}case 7:{if(!k){t=u;v=y;w=x;e=q;u=t;y=v;x=w;continue a}if(!b){v=y;w=x;u=1;e=q;y=v;x=w;continue a}c[o>>2]=w;a[v>>0]=1;v=y;w=x;u=1;e=q;y=v;x=w;continue a}case 24:case 22:case 29:{if(!k){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=1;e=w;y=t;x=v;continue a}c[o>>2]=w;a[v>>0]=1;t=y;v=x;u=1;e=w;y=t;x=v;continue a}case 12:{if(l){if(!b){v=y;x=12;u=2;e=w;y=v;continue a}c[n>>2]=q;v=y;x=12;u=2;e=w;y=v;continue a}if((x|0)!=12){t=y;v=x;u=2;e=w;y=t;x=v;continue a}if(!b){x=12;y=j;u=0;e=w;continue a}c[m>>2]=w;x=12;y=j;u=0;e=w;continue a}case 13:{if(l){if(!b){v=y;x=13;u=2;e=w;y=v;continue a}c[n>>2]=q;v=y;x=13;u=2;e=w;y=v;continue a}if((x|0)!=13){t=y;v=x;u=2;e=w;y=t;x=v;continue a}if(!b){x=13;y=j;u=0;e=w;continue a}c[m>>2]=w;x=13;y=j;u=0;e=w;continue a}case 3:{if(!b){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}a[v>>0]=0;s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}case 21:{if(h){t=y;v=x;u=0;e=w;y=t;x=v;continue a}if(!i){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=2;e=w;y=t;x=v;continue a}if(!(a[v>>0]|0)){t=y;v=x;u=2;e=w;y=t;x=v;continue a}do if(s&(w|0)!=(c[n>>2]|0)&t<<24>>24==32){e=a[e+5>>0]|0;b=a[q>>0]|0;if(!(e<<24>>24)){if(b<<24>>24==32)break;b=d[z+(b&255)>>0]|0}else b=v$(e,b)|0;if((b|0)!=(x|0)){t=y;v=x;u=2;e=w;y=t;x=v;continue a}}while(0);a[v>>0]=0;t=y;v=x;u=2;e=w;y=t;x=v;continue a}case 10:case 9:{if(h){t=y;v=x;u=0;e=w;y=t;x=v;continue a}if(!i){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=2;e=w;y=t;x=v;continue a}a[v>>0]=0;t=y;v=x;u=2;e=w;y=t;x=v;continue a}case 17:case 11:if(l)break a;else{t=y;v=x;u=2;e=w;y=t;x=v;continue a}default:{s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}}while(0)}return y|0}function p$(b,c){b=b|0;c=c|0;var d=0,e=0;b=c+4|0;a:do if((a[c+5>>0]|0)==0?(a[b>>0]|0)==120:0){c=c+6|0;b=0;while(1){b:while(1){if(!(a[c+1>>0]|0)){d=a[c>>0]|0;if(d<<24>>24==59){e=17;break a}d=d<<24>>24;switch(d|0){case 57:case 56:case 55:case 54:case 53:case 52:case 51:case 50:case 49:case 48:{e=8;break b}case 70:case 69:case 68:case 67:case 66:case 65:{e=9;break b}case 102:case 101:case 100:case 99:case 98:case 97:{e=10;break b}default:{}}}c=c+2|0}if((e|0)==8){e=0;b=d+-48|b<<4}else if((e|0)==9){e=0;b=(b<<4)+-55+d|0}else if((e|0)==10){e=0;b=(b<<4)+-87+d|0}if((b|0)<1114112)c=c+2|0;else{b=-1;break}}}else{d=b;b=0;e=13}while(0);c:do if((e|0)==13)while(1){e=0;if(!(a[d+1>>0]|0)){c=a[d>>0]|0;if(c<<24>>24==59){e=17;break c}c=c<<24>>24}else c=-1;b=(b*10|0)+-48+c|0;if((b|0)>=1114112){b=-1;break}else{d=d+2|0;e=13}}while(0);if((e|0)==17)b=k_(b)|0;return b|0}function q$(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=c+2|0;b=c+1|0;h=c+3|0;e=c+4|0;f=c+5|0;a:do switch((d-c|0)/2|0|0){case 2:{if((a[h>>0]|0)==0?(a[g>>0]|0)==116:0){if(!(a[b>>0]|0))b=a[c>>0]|0;else b=-1;b=(b|0)==108?60:(b|0)==103?62:0}else i=27;break}case 3:{if((((((a[b>>0]|0)==0?(a[c>>0]|0)==97:0)?(a[h>>0]|0)==0:0)?(a[g>>0]|0)==109:0)?(a[f>>0]|0)==0:0)?(a[e>>0]|0)==112:0)b=38;else i=27;break}case 4:{if(!(a[b>>0]|0)){b=c+6|0;d=c+7|0;switch(a[c>>0]|0){case 113:{if(a[h>>0]|0){i=27;break a}if((a[g>>0]|0)!=117){i=27;break a}if(a[f>>0]|0){i=27;break a}if((a[e>>0]|0)!=111){i=27;break a}if(a[d>>0]|0){i=27;break a}if((a[b>>0]|0)==116){b=34;break a}else{i=27;break a}}case 97:{if(a[h>>0]|0){i=27;break a}if((a[g>>0]|0)!=112){i=27;break a}if(a[f>>0]|0){i=27;break a}if((a[e>>0]|0)!=111){i=27;break a}if(a[d>>0]|0){i=27;break a}if((a[b>>0]|0)==115){b=39;break a}else{i=27;break a}}default:{i=27;break a}}}else i=27;break}default:i=27}while(0);if((i|0)==27)b=0;return b|0}function r$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;j=b+76|0;k=g+4|0;b=e;while(1){if(b>>>0>=f>>>0)break;h=a[b+1>>0]|0;e=a[b>>0]|0;if(!(h<<24>>24))e=d[j+(e&255)>>0]|0;else e=v$(h,e)|0;i=b+2|0;switch(e|0){case 9:{c[g>>2]=(c[g>>2]|0)+1;if((i|0)==(f|0))b=f;else{e=a[b+3>>0]|0;h=a[i>>0]|0;if(!(e<<24>>24))e=d[j+(h&255)>>0]|0;else e=v$(e,h)|0;b=(e|0)==10?b+4|0:i}c[k>>2]=-1;break}case 6:{b=b+3|0;break}case 7:{b=b+4|0;break}case 10:{c[k>>2]=-1;c[g>>2]=(c[g>>2]|0)+1;b=i;break}default:b=i}c[k>>2]=(c[k>>2]|0)+1}return}function s$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;j=f+-2|0;i=b+76|0;f=e;a:while(1){h=f+2|0;if((h|0)==(j|0)){f=1;break}f=a[f+3>>0]|0;e=f<<24>>24==0;b=a[h>>0]|0;if(e)f=d[i+(b&255)>>0]|0;else f=v$(f,b)|0;switch(f|0){case 23:case 19:case 30:case 33:case 16:case 18:case 10:case 9:case 15:case 14:case 17:case 35:case 34:case 32:case 31:case 13:case 27:case 24:case 25:{f=h;continue a}case 21:if(e&b<<24>>24==9){k=12;break a}else{f=h;continue a}case 22:case 26:{if(!e){k=12;break a}if(b<<24>>24>=0){f=h;continue a}break}default:if(!e){k=12;break a}}switch(b<<24>>24|0){case 64:case 36:{f=h;break}default:{k=12;break a}}}if((k|0)==12){c[g>>2]=h;f=0}return f|0}function t$(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=h;b=c[e>>2]|0;a:while(1){if((b|0)==(f|0)){b=f;break}k=a[b>>0]|0;i=a[b+1>>0]|0;m=i&255;j=k&255;n=j>>>6;l=(j&63|128)&255;switch(i<<24>>24){case 0:{if(k<<24>>24>-1){i=c[g>>2]|0;if((i|0)==(h|0))break a;c[g>>2]=i+1;a[i>>0]=k}else p=7;break}case 7:case 6:case 5:case 4:case 3:case 2:case 1:{p=7;break}case -37:case -38:case -39:case -40:{i=c[g>>2]|0;if((o-i|0)<4)break a;m=(m<<2&12|n)+1|0;c[g>>2]=i+1;a[i>>0]=m>>>2|240;n=c[g>>2]|0;c[g>>2]=n+1;a[n>>0]=j>>>2&15|m<<4&48|128;n=b+2|0;m=d[n>>0]|0;l=(j<<4&48|m>>>6|a[b+3>>0]<<2&12|128)&255;b=c[g>>2]|0;c[g>>2]=b+1;a[b>>0]=l;b=c[g>>2]|0;c[g>>2]=b+1;a[b>>0]=m&63|128;b=n;break}default:{i=c[g>>2]|0;if((o-i|0)<3)break a;c[g>>2]=i+1;a[i>>0]=m>>>4|224;k=c[g>>2]|0;c[g>>2]=k+1;a[k>>0]=n|m<<2&60|128;n=c[g>>2]|0;c[g>>2]=n+1;a[n>>0]=l}}if((p|0)==7){p=0;i=c[g>>2]|0;if((o-i|0)<2)break;c[g>>2]=i+1;a[i>>0]=n|m<<2|192;n=c[g>>2]|0;c[g>>2]=n+1;a[n>>0]=l}b=b+2|0}c[e>>2]=b;return}function u$(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;e=c[f>>2]|0;if((g-e|0)>(i-(c[h>>2]|0)|0))g=(a[g+-1>>0]&-8)<<24>>24==-40?g+-2|0:g;while(1){if((e|0)==(g|0))break;j=c[h>>2]|0;if((j|0)==(i|0))break;k=((d[e+1>>0]|0)<<8|(d[e>>0]|0))&65535;c[h>>2]=j+2;b[j>>1]=k;j=(c[f>>2]|0)+2|0;c[f>>2]=j;e=j}return}function v$(a,b){a=a|0;b=b|0;var c=0;switch(a<<24>>24){case -37:case -38:case -39:case -40:{a=7;break}case -33:case -34:case -35:case -36:{a=8;break}case -1:{if((b&255)>253)a=0;else c=4;break}default:c=4}if((c|0)==4)a=29;return a|0}function w$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){k=a[e+1>>0]|0;m=b+76|0;l=a[e>>0]|0;if(!(k<<24>>24))j=d[m+(l&255)>>0]|0;else j=v$(k,l)|0;n=f;h=n-e|0;i=e+2|0;switch(j|0){case 29:{l=l&255;if(!(1<<(l&31)&c[57168+((l>>>5|(d[143937+(k&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((h|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((h|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((h|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}case 19:{b=y$(b,i,f,g)|0;break a}default:{c[g>>2]=e;b=0;break a}}b:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i+1>>0]|0;e=a[i>>0]|0;if(!(b<<24>>24))h=d[m+(e&255)>>0]|0;else h=v$(b,e)|0;j=i+2|0;switch(h|0){case 27:case 26:case 25:case 24:case 22:{i=j;continue b}case 5:{e=23;break b}case 6:{e=25;break b}case 7:{e=27;break b}case 18:{e=29;break b}case 29:break;default:{e=30;break b}}l=e&255;if(!(1<<(l&31)&c[57168+((l>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){e=22;break}else i=j}if((e|0)==22){c[g>>2]=i;b=0;break}else if((e|0)==23){if((n-i|0)<2){b=-2;break}c[g>>2]=i;b=0;break}else if((e|0)==25){if((n-i|0)<3){b=-2;break}c[g>>2]=i;b=0;break}else if((e|0)==27){if((n-i|0)<4){b=-2;break}c[g>>2]=i;b=0;break}else if((e|0)==29){c[g>>2]=j;b=9;break}else if((e|0)==30){c[g>>2]=i;b=0;break}}else b=-1;while(0);return b|0}function x$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){j=a[e+1>>0]|0;k=b+76|0;i=a[e>>0]|0;if(!(j<<24>>24))h=d[k+(i&255)>>0]|0;else h=v$(j,i)|0;l=f;b=l-e|0;switch(h|0){case 29:{i=i&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[143937+(j&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((b|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((b|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((b|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}case 30:case 9:case 10:case 21:{c[g>>2]=e;b=22;break a}default:{c[g>>2]=e;b=0;break a}}e=e+2|0;b:while(1){if((e|0)==(f|0)){b=-1;break a}b=a[e+1>>0]|0;h=a[e>>0]|0;if(!(b<<24>>24))i=d[k+(h&255)>>0]|0;else i=v$(b,h)|0;j=e+2|0;switch(i|0){case 27:case 26:case 25:case 24:case 22:{e=j;continue b}case 5:{h=24;break b}case 6:{h=26;break b}case 7:{h=28;break b}case 18:{h=30;break b}case 29:break;default:{h=31;break b}}i=h&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){h=23;break}else e=j}if((h|0)==23){c[g>>2]=e;b=0;break}else if((h|0)==24){if((l-e|0)<2){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==26){if((l-e|0)<3){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==28){if((l-e|0)<4){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==30){c[g>>2]=j;b=28;break}else if((h|0)==31){c[g>>2]=e;b=0;break}}else b=-1;while(0);return b|0}function y$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){h=a[e+1>>0]|0;i=h<<24>>24==0;j=e+2|0;k=a[e>>0]|0;if(i&k<<24>>24==120){b=z$(b,j,f,g)|0;break}l=b+76|0;if(i)b=d[l+(k&255)>>0]|0;else b=v$(h,k)|0;if((b|0)!=25){c[g>>2]=e;b=0;break}b:while(1){if((j|0)==(f|0)){b=-1;break a}b=a[j+1>>0]|0;h=a[j>>0]|0;if(!(b<<24>>24))b=d[l+(h&255)>>0]|0;else b=v$(b,h)|0;i=j+2|0;switch(b|0){case 25:{j=i;break}case 18:{h=14;break b}default:{h=15;break b}}}if((h|0)==14){c[g>>2]=i;b=10;break}else if((h|0)==15){c[g>>2]=j;b=0;break}}else b=-1;while(0);return b|0}function z$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;a:do if((e|0)!=(f|0)){h=a[e+1>>0]|0;j=b+76|0;b=a[e>>0]|0;if(!(h<<24>>24))b=d[j+(b&255)>>0]|0;else b=v$(h,b)|0;if((b&-2|0)!=24){c[g>>2]=e;b=0;break}i=e+2|0;b:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i+1>>0]|0;h=a[i>>0]|0;if(!(b<<24>>24))b=d[j+(h&255)>>0]|0;else b=v$(b,h)|0;e=i+2|0;switch(b|0){case 24:case 25:{i=e;break}case 18:{h=13;break b}default:{h=14;break b}}}if((h|0)==13){c[g>>2]=e;b=10;break}else if((h|0)==14){c[g>>2]=i;b=0;break}}else b=-1;while(0);return b|0}function A$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:do if((e|0)!=(f|0)){k=a[e+1>>0]|0;n=b+76|0;l=a[e>>0]|0;if(!(k<<24>>24))j=d[n+(l&255)>>0]|0;else j=v$(k,l)|0;h=e+2|0;m=f;i=m-e|0;switch(j|0){case 29:{l=l&255;if(!(1<<(l&31)&c[57168+((l>>>5|d[143937+(k&255)>>0]<<3)<<2)>>2])){c[g>>2]=e;h=0;break a}else l=0;break}case 24:case 22:{l=0;break}case 5:{if((i|0)<2){h=-2;break a}c[g>>2]=e;h=0;break a}case 6:{if((i|0)<3){h=-2;break a}c[g>>2]=e;h=0;break a}case 7:{if((i|0)<4){h=-2;break a}c[g>>2]=e;h=0;break a}case 16:{if((h|0)==(f|0)){h=-1;break a}i=a[e+3>>0]|0;j=a[h>>0]|0;if(!(i<<24>>24))j=d[n+(j&255)>>0]|0;else j=v$(i,j)|0;i=e+4|0;switch(j|0){case 27:{h=B$(b,i,f,g)|0;break a}case 20:{h=C$(i,f,g)|0;break a}default:{c[g>>2]=h;h=0;break a}}}case 15:{h=D$(b,h,f,g)|0;break a}case 17:{h=E$(b,h,f,g)|0;break a}default:{c[g>>2]=e;h=0;break a}}b:while(1){c:while(1){if((h|0)==(f|0)){h=-1;break a}i=a[h+1>>0]|0;j=a[h>>0]|0;if(!(i<<24>>24))k=d[n+(j&255)>>0]|0;else k=v$(i,j)|0;e=h+2|0;switch(k|0){case 5:{o=32;break b}case 6:{o=34;break b}case 7:{o=36;break b}case 10:case 9:case 21:{h=e;o=56;break b}case 11:{o=71;break b}case 17:break b;case 27:case 26:case 25:case 24:case 22:{h=e;continue c}case 23:break c;case 29:break;default:{o=77;break b}}k=j&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[144193+(i&255)>>0]<<3)<<2)>>2])){o=31;break b}else h=e}if(l|0){o=39;break}if((e|0)==(f|0)){h=-1;break a}i=a[h+3>>0]|0;j=a[e>>0]|0;if(!(i<<24>>24))k=d[n+(j&255)>>0]|0;else k=v$(i,j)|0;switch(k|0){case 5:{o=49;break b}case 6:{o=51;break b}case 7:{o=53;break b}case 29:{l=j&255;if(!(1<<(l&31)&c[57168+((l>>>5|d[143937+(i&255)>>0]<<3)<<2)>>2])){o=46;break b}break}case 24:case 22:break;default:{o=55;break b}}l=1;h=h+4|0}d:switch(o|0){case 31:{c[g>>2]=h;h=0;break a}case 32:{if((m-h|0)<2){h=-2;break a}c[g>>2]=h;h=0;break a}case 34:{if((m-h|0)<3){h=-2;break a}c[g>>2]=h;h=0;break a}case 36:{if((m-h|0)<4){h=-2;break a}c[g>>2]=h;h=0;break a}case 39:{c[g>>2]=h;h=0;break a}case 46:{c[g>>2]=e;h=0;break a}case 49:{if((m-e|0)<2){h=-2;break a}c[g>>2]=e;h=0;break a}case 51:{if((m-e|0)<3){h=-2;break a}c[g>>2]=e;h=0;break a}case 53:{if((m-e|0)<4){h=-2;break a}c[g>>2]=e;h=0;break a}case 55:{c[g>>2]=e;h=0;break a}case 56:{e:while(1){o=0;if((h|0)==(f|0)){h=-1;break a}i=a[h+1>>0]|0;j=a[h>>0]|0;if(!(i<<24>>24))l=d[n+(j&255)>>0]|0;else l=v$(i,j)|0;k=h+2|0;switch(l|0){case 11:{o=71;break d}case 17:break d;case 10:case 9:case 21:{h=k;o=56;break}case 29:{o=61;break e}case 24:case 22:break e;case 5:{o=64;break e}case 6:{o=66;break e}case 7:{o=68;break e}default:{o=70;break e}}}if((o|0)==61){o=j&255;if(!(1<<(o&31)&c[57168+((o>>>5|d[143937+(i&255)>>0]<<3)<<2)>>2])){c[g>>2]=h;h=0;break a}}else if((o|0)==64){if((m-h|0)<2){h=-2;break a}c[g>>2]=h;h=0;break a}else if((o|0)==66){if((m-h|0)<3){h=-2;break a}c[g>>2]=h;h=0;break a}else if((o|0)==68){if((m-h|0)<4){h=-2;break a}c[g>>2]=h;h=0;break a}else if((o|0)==70){c[g>>2]=h;h=0;break a}h=F$(b,k,f,g)|0;break a}case 77:{c[g>>2]=h;h=0;break a}}if((o|0)==71){c[g>>2]=h+2;h=2;break}i=h+2|0;if((i|0)!=(f|0)){if((a[h+3>>0]|0)==0?(a[i>>0]|0)==62:0){c[g>>2]=h+4;h=4;break}c[g>>2]=i;h=0}else h=-1}else h=-1;while(0);return h|0}function B$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)==(f|0))b=-1;else{if((a[e+1>>0]|0)==0?(a[e>>0]|0)==45:0){j=b+76|0;k=f;i=e+2|0;b:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i+1>>0]|0;e=a[i>>0]|0;if(!(b<<24>>24))h=d[j+(e&255)>>0]|0;else h=v$(b,e)|0;b=i+2|0;e=k-i|0;switch(h|0){case 8:case 1:case 0:{l=16;break b}case 5:if((e|0)<2){b=-2;break a}else{i=b;continue b}case 6:{if((e|0)<3){b=-2;break a}i=i+3|0;continue b}case 7:{if((e|0)<4){b=-2;break a}i=i+4|0;continue b}case 27:{if((b|0)==(f|0)){b=-1;break a}if(a[i+3>>0]|0){i=b;continue b}if((a[b>>0]|0)==45)break b;else{i=b;continue b}}default:{i=b;continue b}}}if((l|0)==16){c[g>>2]=i;b=0;break}b=i+4|0;if((b|0)==(f|0)){b=-1;break}if((a[i+5>>0]|0)==0?(a[b>>0]|0)==62:0){c[g>>2]=i+6;b=13;break}c[g>>2]=b;b=0;break}c[g>>2]=e;b=0}while(0);return b|0}function C$(b,d,e){b=b|0;d=d|0;e=e|0;if((d-b|0)<12)d=-1;else{d=0;while(1){if((d|0)>=6){d=8;break}if(a[b+1>>0]|0){d=0;break}if((a[b>>0]|0)!=(a[144449+d>>0]|0)){d=0;break}d=d+1|0;b=b+2|0}c[e>>2]=b}return d|0}function D$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;a:do if((e|0)==(f|0))b=-1;else{j=a[e+1>>0]|0;o=b+76|0;b=a[e>>0]|0;if(!(j<<24>>24))i=d[o+(b&255)>>0]|0;else i=v$(j,b)|0;n=f;h=n-e|0;switch(i|0){case 29:{k=b&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[143937+(j&255)>>0]<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((h|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((h|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((h|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}default:{c[g>>2]=e;b=0;break a}}b=e+2|0;b:while(1){if((b|0)==(f|0)){b=-1;break a}h=a[b+1>>0]|0;i=a[b>>0]|0;if(!(h<<24>>24))k=d[o+(i&255)>>0]|0;else k=v$(h,i)|0;j=b+2|0;switch(k|0){case 27:case 26:case 25:case 24:case 22:{b=j;continue b}case 5:{m=23;break b}case 6:{m=25;break b}case 7:{m=27;break b}case 10:case 9:case 21:{m=29;break b}case 15:{m=46;break b}case 29:break;default:break b}k=i&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[144193+(h&255)>>0]<<3)<<2)>>2])){m=22;break}else b=j}if((m|0)==22){c[g>>2]=b;b=0;break}else if((m|0)==23){if((n-b|0)<2){b=-2;break}c[g>>2]=b;b=0;break}else if((m|0)==25){if((n-b|0)<3){b=-2;break}c[g>>2]=b;b=0;break}else if((m|0)==27){if((n-b|0)<4){b=-2;break}c[g>>2]=b;b=0;break}else if((m|0)==29){if(!(G$(e,b,p)|0)){c[g>>2]=b;b=0;break}c:while(1){if((j|0)==(f|0)){b=-1;break a}b=a[j+1>>0]|0;h=a[j>>0]|0;if(!(b<<24>>24))i=d[o+(h&255)>>0]|0;else i=v$(b,h)|0;b=j+2|0;h=n-j|0;switch(i|0){case 8:case 1:case 0:{m=41;break c}case 5:if((h|0)<2){b=-2;break a}else{j=b;continue c}case 6:{if((h|0)<3){b=-2;break a}j=j+3|0;continue c}case 7:{if((h|0)<4){b=-2;break a}j=j+4|0;continue c}case 15:{if((b|0)==(f|0)){b=-1;break a}if(a[j+3>>0]|0){j=b;continue c}if((a[b>>0]|0)==62){m=45;break c}else{j=b;continue c}}default:{j=b;continue c}}}if((m|0)==41){c[g>>2]=j;b=0;break}else if((m|0)==45){c[g>>2]=j+4;b=c[p>>2]|0;break}}else if((m|0)==46){if(!(G$(e,b,p)|0)){c[g>>2]=b;b=0;break}if((j|0)==(f|0)){b=-1;break}if((a[b+3>>0]|0)==0?(a[j>>0]|0)==62:0){c[g>>2]=b+4;b=c[p>>2]|0;break}else b=j}c[g>>2]=b;b=0}while(0);l=q;return b|0}function E$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){j=a[e+1>>0]|0;l=b+76|0;i=a[e>>0]|0;if(!(j<<24>>24))h=d[l+(i&255)>>0]|0;else h=v$(j,i)|0;k=f;b=k-e|0;switch(h|0){case 29:{i=i&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[143937+(j&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((b|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((b|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((b|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}default:{c[g>>2]=e;b=0;break a}}j=e+2|0;b:while(1){if((j|0)==(f|0)){b=-1;break a}b=a[j+1>>0]|0;h=a[j>>0]|0;if(!(b<<24>>24))e=d[l+(h&255)>>0]|0;else e=v$(b,h)|0;i=j+2|0;switch(e|0){case 23:case 27:case 26:case 25:case 24:case 22:{j=i;continue b}case 5:{e=23;break b}case 6:{e=25;break b}case 7:{e=27;break b}case 10:case 9:case 21:{e=29;break b}case 11:{e=36;break b}case 29:break;default:{e=37;break b}}e=h&255;if(!(1<<(e&31)&c[57168+((e>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){e=22;break}else j=i}if((e|0)==22){c[g>>2]=j;b=0;break}else if((e|0)==23){if((k-j|0)<2){b=-2;break}c[g>>2]=j;b=0;break}else if((e|0)==25){if((k-j|0)<3){b=-2;break}c[g>>2]=j;b=0;break}else if((e|0)==27){if((k-j|0)<4){b=-2;break}c[g>>2]=j;b=0;break}else if((e|0)==29){c:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i+1>>0]|0;h=a[i>>0]|0;if(!(b<<24>>24))b=d[l+(h&255)>>0]|0;else b=v$(b,h)|0;h=i+2|0;switch(b|0){case 10:case 9:case 21:{i=h;e=29;break}case 11:{e=34;break c}default:{e=35;break c}}}if((e|0)==34){c[g>>2]=h;b=5;break}else if((e|0)==35){c[g>>2]=i;b=0;break}}else if((e|0)==36){c[g>>2]=i;b=5;break}else if((e|0)==37){c[g>>2]=j;b=0;break}}else b=-1;while(0);return b|0}function F$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;c[p>>2]=e;m=b+76|0;n=f;h=0;a:while(1){b:while(1){if((e|0)==(f|0)){e=-1;break a}k=a[e+1>>0]|0;i=a[e>>0]|0;if(!(k<<24>>24))j=d[m+(i&255)>>0]|0;else j=v$(k,i)|0;switch(j|0){case 5:{o=11;break a}case 6:{o=13;break a}case 7:{o=15;break a}case 23:{o=17;break b}case 10:case 9:case 21:{h=e;o=33;break b}case 14:{o=39;break b}case 29:{j=i&255;if(!(1<<(j&31)&c[57168+((j>>>5|d[144193+(k&255)>>0]<<3)<<2)>>2])){o=9;break a}break}case 27:case 26:case 25:case 24:case 22:break;default:{o=93;break a}}k=e+2|0;c[p>>2]=k;e=k}c:do if((o|0)==17){o=0;if(h|0){o=18;break a}h=e+2|0;c[p>>2]=h;if((h|0)==(f|0)){e=-1;break a}i=a[e+3>>0]|0;j=a[h>>0]|0;if(!(i<<24>>24))k=d[m+(j&255)>>0]|0;else k=v$(i,j)|0;switch(k|0){case 5:{o=26;break a}case 6:{o=28;break a}case 7:{o=30;break a}case 24:case 22:{h=1;break c}case 29:break;default:{o=32;break a}}k=j&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[143937+(i&255)>>0]<<3)<<2)>>2])){o=25;break a}else h=1}else if((o|0)==33)while(1){o=0;e=h+2|0;c[p>>2]=e;if((e|0)==(f|0)){e=-1;break a}h=a[h+3>>0]|0;i=a[e>>0]|0;if(!(h<<24>>24))h=d[m+(i&255)>>0]|0;else h=v$(h,i)|0;switch(h|0){case 14:{o=39;break c}case 9:case 10:case 21:{h=e;o=33;break}default:{o=38;break a}}}while(0);d:do if((o|0)==39){while(1){o=0;j=e+2|0;c[p>>2]=j;if((j|0)==(f|0)){e=-1;break a}h=a[e+3>>0]|0;i=a[j>>0]|0;if(!(h<<24>>24))k=d[m+(i&255)>>0]|0;else k=v$(h,i)|0;if((k|1|0)==13)break;switch(k|0){case 9:case 10:case 21:{e=j;o=39;break}default:{o=45;break a}}}e=e+4|0;c[p>>2]=e;e:while(1){if((e|0)==(f|0)){e=-1;break a}h=a[e+1>>0]|0;i=a[e>>0]|0;if(!(h<<24>>24))h=d[m+(i&255)>>0]|0;else h=v$(h,i)|0;if((h|0)==(k|0))break;switch(h|0){case 8:case 1:case 0:{o=59;break a}case 2:{o=64;break a}case 5:{if((n-e|0)<2){e=-2;break a}j=e+2|0;c[p>>2]=j;e=j;continue e}case 6:{if((n-e|0)<3){e=-2;break a}j=e+3|0;c[p>>2]=j;e=j;continue e}case 7:{if((n-e|0)<4){e=-2;break a}j=e+4|0;c[p>>2]=j;e=j;continue e}case 3:{e=w$(b,e+2|0,f,p)|0;if((e|0)<1){o=62;break a}e=c[p>>2]|0;continue e}default:{j=e+2|0;c[p>>2]=j;e=j;continue e}}}i=e+2|0;c[p>>2]=i;if((i|0)==(f|0)){e=-1;break a}h=a[e+3>>0]|0;j=a[i>>0]|0;if(!(h<<24>>24))h=d[m+(j&255)>>0]|0;else h=v$(h,j)|0;switch(h|0){case 11:{o=85;break a}case 17:{o=86;break a}case 10:case 9:case 21:{e=i;break}default:{o=71;break a}}f:while(1){i=e+2|0;c[p>>2]=i;if((i|0)==(f|0)){e=-1;break a}h=a[e+3>>0]|0;j=a[i>>0]|0;if(!(h<<24>>24))k=d[m+(j&255)>>0]|0;else k=v$(h,j)|0;switch(k|0){case 5:{o=79;break a}case 6:{o=81;break a}case 7:{o=83;break a}case 11:{o=85;break a}case 17:{o=86;break a}case 24:case 22:{h=0;break d}case 10:case 9:case 21:{e=i;break}case 29:break f;default:{o=91;break a}}}k=j&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[143937+(h&255)>>0]<<3)<<2)>>2])){o=78;break a}else h=0}while(0);e=e+4|0;c[p>>2]=e}switch(o|0){case 9:{c[g>>2]=e;e=0;break}case 11:{if((f-e|0)<2)e=-2;else{c[g>>2]=e;e=0}break}case 13:{if((f-e|0)<3)e=-2;else{c[g>>2]=e;e=0}break}case 15:{if((f-e|0)<4)e=-2;else{c[g>>2]=e;e=0}break}case 18:{c[g>>2]=e;e=0;break}case 25:{c[g>>2]=h;e=0;break}case 26:{if((f-h|0)<2)e=-2;else{c[g>>2]=h;e=0}break}case 28:{if((f-h|0)<3)e=-2;else{c[g>>2]=h;e=0}break}case 30:{if((f-h|0)<4)e=-2;else{c[g>>2]=h;e=0}break}case 32:{c[g>>2]=h;e=0;break}case 38:{c[g>>2]=e;e=0;break}case 45:{c[g>>2]=j;e=0;break}case 59:{c[g>>2]=e;e=0;break}case 62:{if(!e){c[g>>2]=c[p>>2];e=0}break}case 64:{c[g>>2]=e;e=0;break}case 71:{c[g>>2]=i;e=0;break}case 78:{c[g>>2]=i;e=0;break}case 79:{if((n-i|0)<2)e=-2;else{c[g>>2]=i;e=0}break}case 81:{if((n-i|0)<3)e=-2;else{c[g>>2]=i;e=0}break}case 83:{if((n-i|0)<4)e=-2;else{c[g>>2]=i;e=0}break}case 85:{c[g>>2]=e+4;e=1;break}case 86:{h=i+2|0;c[p>>2]=h;e=h;if((h|0)==(f|0))e=-1;else{if((a[i+3>>0]|0)==0?(a[h>>0]|0)==62:0){c[g>>2]=i+4;e=3;break}c[g>>2]=e;e=0}break}case 91:{c[g>>2]=i;e=0;break}case 93:{c[g>>2]=e;e=0;break}}l=q;return e|0}function G$(b,d,e){b=b|0;d=d|0;e=e|0;c[e>>2]=11;a:do if((d-b|0)==6?(a[b+1>>0]|0)==0:0){switch(a[b>>0]|0){case 120:{d=0;break}case 88:{d=1;break}default:{d=1;break a}}if(!(a[b+3>>0]|0)){switch(a[b+2>>0]|0){case 109:break;case 77:{d=1;break}default:{d=1;break a}}if(!(a[b+5>>0]|0)){switch(a[b+4>>0]|0){case 108:break;case 76:{d=0;break a}default:{d=1;break a}}if(!d){c[e>>2]=12;d=1}else d=0}else d=1}else d=1}else d=1;while(0);return d|0}function H$(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;l=e+76|0;k=g;a:while(1){if((f|0)==(g|0)){e=-1;break}i=a[f+1>>0]|0;e=a[f>>0]|0;if(!(i<<24>>24))i=d[l+(e&255)>>0]|0;else i=v$(i,e)|0;j=f+2|0;e=k-f|0;switch(i|0){case 8:case 1:case 0:{m=12;break a}case 5:if((e|0)<2){e=-2;break a}else{f=j;continue a}case 6:{if((e|0)<3){e=-2;break a}f=f+3|0;continue a}case 7:{if((e|0)<4){e=-2;break a}f=f+4|0;continue a}case 13:case 12:if((i|0)==(b|0)){m=14;break a}else{f=j;continue a}default:{f=j;continue a}}}b:do if((m|0)==12){c[h>>2]=f;e=0}else if((m|0)==14)if((j|0)==(g|0))e=-27;else{c[h>>2]=j;f=a[f+3>>0]|0;e=a[j>>0]|0;if(!(f<<24>>24))e=d[l+(e&255)>>0]|0;else e=v$(f,e)|0;switch(e|0){case 20:case 30:case 11:case 10:case 9:case 21:{e=27;break b}default:{}}e=0}while(0);return e|0}function I$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;a:do if((e|0)==(f|0))h=-1;else{h=a[e+1>>0]|0;i=a[e>>0]|0;k=b+76|0;if(!(h<<24>>24))i=d[k+(i&255)>>0]|0;else i=v$(h,i)|0;h=e+2|0;switch(i|0){case 27:{h=B$(b,h,f,g)|0;break a}case 20:{c[g>>2]=h;h=33;break a}case 24:case 22:{e=h;b:while(1){if((e|0)==(f|0)){h=-1;break a}h=a[e+1>>0]|0;i=a[e>>0]|0;if(!(h<<24>>24))h=d[k+(i&255)>>0]|0;else h=v$(h,i)|0;b=e+2|0;switch(h|0){case 24:case 22:{e=b;break}case 30:{j=14;break b}case 10:case 9:case 21:break b;default:{j=21;break b}}}if((j|0)==21){c[g>>2]=e;h=0;break a}c:do if((j|0)==14){if((b|0)==(f|0)){h=-1;break a}i=a[e+3>>0]|0;h=a[b>>0]|0;if(!(i<<24>>24))h=d[k+(h&255)>>0]|0;else h=v$(i,h)|0;switch(h|0){case 30:case 10:case 9:case 21:break;default:break c}c[g>>2]=e;h=0;break a}while(0);c[g>>2]=e;h=16;break a}default:{c[g>>2]=e;h=0;break a}}}while(0);return h|0}function J$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){j=a[e+1>>0]|0;k=b+76|0;i=a[e>>0]|0;if(!(j<<24>>24))h=d[k+(i&255)>>0]|0;else h=v$(j,i)|0;l=f;b=l-e|0;switch(h|0){case 29:{i=i&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[143937+(j&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((b|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((b|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((b|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}default:{c[g>>2]=e;b=0;break a}}b:while(1){b=e;e=e+2|0;if((e|0)==(f|0)){b=-20;break a}b=a[b+3>>0]|0;h=a[e>>0]|0;if(!(b<<24>>24))i=d[k+(h&255)>>0]|0;else i=v$(b,h)|0;switch(i|0){case 27:case 26:case 25:case 24:case 22:continue b;case 5:{h=22;break b}case 6:{h=24;break b}case 7:{h=26;break b}case 36:case 30:case 11:case 32:case 21:case 10:case 9:{h=28;break b}case 29:break;default:{h=29;break b}}j=h&255;if(!(1<<(j&31)&c[57168+((j>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){h=21;break}}if((h|0)==21){c[g>>2]=e;b=0;break}else if((h|0)==22){if((l-e|0)<2){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==24){if((l-e|0)<3){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==26){if((l-e|0)<4){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==28){c[g>>2]=e;b=20;break}else if((h|0)==29){c[g>>2]=e;b=0;break}}else b=-1;while(0);return b|0}function K$(b,d,e){b=b|0;d=d|0;e=e|0;e=L$(e)|0;if((e|0)==-1)e=0;else{a[b+73>>0]=e;c[b>>2]=67;c[b+4>>2]=68;c[b+52>>2]=31;c[b+76>>2]=d;c[d>>2]=b;e=1}return e|0}function L$(a){a=a|0;var b=0;a:do if(!a)b=6;else{b=0;while(1){if((b|0)>=6){b=-1;break a}if(u0(a,c[60316+(b<<2)>>2]|0)|0)break a;b=b+1|0}}while(0);return b|0}function M$(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return P$(59184,a,0,b,c,d)|0}function N$(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return P$(59184,a,1,b,c,d)|0}function O$(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;D_(58816,b,c,d);return}function P$(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:do if((f|0)==(g|0))d=-4;else{p=c[d+76>>2]|0;i=f+1|0;o=(e|0)==1;n=d+73|0;b:do if((i|0)==(g|0)){d=a[n>>0]|0;if(((d<<24>>24)+-3|0)>>>0<3){d=-1;break a}switch(a[f>>0]|0){case 60:case 0:{d=-1;break a}case -17:case -1:case -2:break;default:break b}if(!(o&d<<24>>24==0)){d=-1;break a}}else{l=a[f>>0]|0;d=a[i>>0]|0;i=b+16|0;m=b+20|0;j=f+2|0;k=((l&255)<<8|d&255)&65535;c:do if(k<<16>>16<-2){if(k<<16>>16>=-257){switch(k<<16>>16){case -257:break;default:break c}if(o&(a[n>>0]|0)==0)break b;c[h>>2]=j;c[p>>2]=c[i>>2];d=14;break a}switch(k<<16>>16){case -4165:break;default:break c}if(o)switch(a[n>>0]|0){case 0:case 3:case 4:case 5:break b;default:{}}if((j|0)==(g|0)){d=-1;break a}if((a[j>>0]|0)!=-65)break b;c[h>>2]=f+3;c[p>>2]=c[b+8>>2];d=14;break a}else{if(k<<16>>16<15360){switch(k<<16>>16){case -2:break;default:break c}if(o&(a[n>>0]|0)==0)break b;c[h>>2]=j;c[p>>2]=c[m>>2];d=14;break a}switch(k<<16>>16){case 15360:break;default:break c}d=a[n>>0]|0;if(d<<24>>24==4){if(o)break b}else if(o&d<<24>>24==3)break b;d=c[m>>2]|0;c[p>>2]=d;d=tb[c[d+(e<<2)>>2]&127](d,f,g,h)|0;break a}while(0);if(l<<24>>24){if(o|d<<24>>24!=0)break;d=c[m>>2]|0;c[p>>2]=d;d=tb[c[d+(e<<2)>>2]&127](d,f,g,h)|0;break a}if(o?(a[n>>0]|0)==5:0)break;d=c[i>>2]|0;c[p>>2]=d;d=tb[c[d+(e<<2)>>2]&127](d,f,g,h)|0;break a}while(0);d=c[b+(a[n>>0]<<2)>>2]|0;c[p>>2]=d;d=tb[c[d+(e<<2)>>2]&127](d,f,g,h)|0}while(0);return d|0}function Q$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;a:do if((e|0)!=(f|0)){h=e;p=f-h|0;o=(p&1|0)==0;p=p&-2;q=(p|0)==0;p=o|q?f:e+p|0;if(o|q^1){i=a[e>>0]|0;q=b+76|0;l=a[e+1>>0]|0;if(!(i<<24>>24))k=d[q+(l&255)>>0]|0;else k=v$(i,l)|0;j=e+2|0;o=p;m=e+3|0;f=o-h|0;h=(j|0)==(p|0);n=e+4|0;do switch(k|0){case 12:{f=q0(12,b,j,p,g)|0;break a}case 13:{f=q0(13,b,j,p,g)|0;break a}case 2:{if(h){f=-1;break a}h=a[j>>0]|0;f=a[m>>0]|0;if(!(h<<24>>24))f=d[q+(f&255)>>0]|0;else f=v$(h,f)|0;switch(f|0){case 16:{f=r0(b,n,p,g)|0;break a}case 15:{f=m0(b,n,p,g)|0;break a}case 7:case 6:case 5:case 29:case 24:case 22:{c[g>>2]=e;f=29;break a}default:{c[g>>2]=j;f=0;break a}}}case 9:{if(h){c[g>>2]=p;f=-15;break a}else h=20;break}case 10:case 21:{h=20;break}case 30:{f=g0(b,j,p,g)|0;break a}case 35:{c[g>>2]=j;f=38;break a}case 20:{c[g>>2]=j;f=25;break a}case 4:{if(h){f=-26;break a}if((a[j>>0]|0)==0?(a[m>>0]|0)==93:0){if((n|0)==(p|0)){f=-1;break a}if((a[n>>0]|0)==0?(a[e+5>>0]|0)==62:0){c[g>>2]=e+6;f=34;break a}}c[g>>2]=j;f=26;break a}case 31:{c[g>>2]=j;f=23;break a}case 32:{if(h){f=-24;break a}h=a[j>>0]|0;f=a[m>>0]|0;if(!(h<<24>>24))f=d[q+(f&255)>>0]|0;else f=v$(h,f)|0;switch(f|0){case 33:{c[g>>2]=n;f=36;break a}case 15:{c[g>>2]=n;f=35;break a}case 34:{c[g>>2]=n;f=37;break a}case 32:case 36:case 35:case 11:case 21:case 10:case 9:{c[g>>2]=j;f=24;break a}default:{c[g>>2]=j;f=0;break a}}}case 36:{c[g>>2]=j;f=21;break a}case 11:{c[g>>2]=j;f=17;break a}case 19:{f=s0(b,j,p,g)|0;break a}case 5:{if((f|0)<2){f=-2;break a}c[g>>2]=e;f=0;break a}case 6:{if((f|0)<3){f=-2;break a}c[g>>2]=e;f=0;break a}case 7:{if((f|0)<4){f=-2;break a}c[g>>2]=e;f=0;break a}case 24:case 22:{f=18;h=63;break}case 23:case 27:case 26:case 25:{f=19;h=63;break}case 29:{i=i&255;h=l&255;f=h>>>5;h=1<<(h&31);if(!(h&c[57168+((f|d[143937+i>>0]<<3)<<2)>>2]))if(!(c[57168+((d[144193+i>>0]<<3|f)<<2)>>2]&h))h=62;else{f=19;h=63}else{f=18;h=63}break}default:h=62}while(0);if((h|0)==20){b:while(1){i=e;e=e+2|0;if((e|0)==(p|0)){h=27;break}f=a[e>>0]|0;h=a[i+3>>0]|0;if(!(f<<24>>24))f=d[q+(h&255)>>0]|0;else f=v$(f,h)|0;switch(f|0){case 10:case 21:{h=20;continue b}case 9:break;default:{h=26;break b}}if((i+4|0)==(p|0)){h=26;break}else h=20}if((h|0)==26){c[g>>2]=e;f=15;break}else if((h|0)==27){c[g>>2]=p;f=15;break}}else if((h|0)==62){c[g>>2]=e;f=0;break}else if((h|0)==63){c:while(1){if((j|0)==(p|0)){h=103;break}h=a[j>>0]|0;i=a[j+1>>0]|0;if(!(h<<24>>24))e=d[q+(i&255)>>0]|0;else e=v$(h,i)|0;k=j+2|0;switch(e|0){case 27:case 26:case 25:case 24:case 22:{h=f;j=k;f=h;h=63;continue c}case 5:{h=70;break c}case 6:{h=72;break c}case 7:{h=74;break c}case 10:case 9:case 21:case 30:case 20:case 36:case 35:case 32:case 11:{h=76;break c}case 34:{h=93;break c}case 33:{h=96;break c}case 15:{h=99;break c}case 29:{n=i&255;if(!(1<<(n&31)&c[57168+((n>>>5|d[144193+(h&255)>>0]<<3)<<2)>>2])){h=69;break c}else{h=f;j=k;f=h;h=63;continue c}}case 23:break;default:{h=102;break c}}switch(f&63){case 18:break;case 41:{f=19;j=k;h=63;continue c}default:{h=f;j=k;f=h;h=63;continue c}}if((k|0)==(p|0)){f=-1;break a}f=a[k>>0]|0;h=a[j+3>>0]|0;if(!(f<<24>>24))i=d[q+(h&255)>>0]|0;else i=v$(f,h)|0;switch(i|0){case 5:{h=86;break c}case 6:{h=88;break c}case 7:{h=90;break c}case 29:{n=h&255;if(!(1<<(n&31)&c[57168+((n>>>5|d[144193+(f&255)>>0]<<3)<<2)>>2])){h=84;break c}break}case 27:case 26:case 25:case 24:case 22:break;default:{f=19;j=k;h=63;continue c}}f=41;j=j+4|0;h=63}switch(h|0){case 69:{c[g>>2]=j;f=0;break a}case 70:{if((o-j|0)<2){f=-2;break a}c[g>>2]=j;f=0;break a}case 72:{if((o-j|0)<3){f=-2;break a}c[g>>2]=j;f=0;break a}case 74:{if((o-j|0)<4){f=-2;break a}c[g>>2]=j;f=0;break a}case 76:{c[g>>2]=j;break a}case 84:{c[g>>2]=k;f=0;break a}case 86:{if((o-k|0)<2){f=-2;break a}c[g>>2]=k;f=0;break a}case 88:{if((o-k|0)<3){f=-2;break a}c[g>>2]=k;f=0;break a}case 90:{if((o-k|0)<4){f=-2;break a}c[g>>2]=k;f=0;break a}case 93:if((f|0)==19){c[g>>2]=j;f=0;break a}else{c[g>>2]=k;f=32;break a}case 96:if((f|0)==19){c[g>>2]=j;f=0;break a}else{c[g>>2]=k;f=31;break a}case 99:if((f|0)==19){c[g>>2]=j;f=0;break a}else{c[g>>2]=k;f=30;break a}case 102:{c[g>>2]=j;f=0;break a}case 103:{f=0-f|0;break a}}}}else f=-1}else f=-4;while(0);return f|0}function R$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:do if((e|0)!=(f|0)){l=e;o=f-l|0;n=(o&1|0)==0;o=o&-2;p=(o|0)==0;o=n|p?f:e+o|0;if(n|p^1){f=a[e>>0]|0;p=b+76|0;h=a[e+1>>0]|0;if(!(f<<24>>24))i=d[p+(h&255)>>0]|0;else i=v$(f,h)|0;k=e+2|0;n=o;h=(k|0)==(o|0);j=e+3|0;m=e+4|0;f=n-l|0;switch(i|0){case 2:{f=j0(b,k,o,g)|0;break a}case 3:{f=f0(b,k,o,g)|0;break a}case 9:{if(h){f=-3;break a}h=a[k>>0]|0;f=a[j>>0]|0;if(!(h<<24>>24))f=d[p+(f&255)>>0]|0;else f=v$(h,f)|0;c[g>>2]=(f|0)==10?m:k;f=7;break a}case 10:{c[g>>2]=k;f=7;break a}case 4:{if(h){f=-5;break a}if((a[k>>0]|0)==0?(a[j>>0]|0)==93:0){if((m|0)==(o|0)){f=-5;break a}if((a[m>>0]|0)==0?(a[e+5>>0]|0)==62:0){c[g>>2]=m;f=0;break a}}break}case 5:{if((f|0)<2){f=-2;break a}break}case 6:{if((f|0)<3){f=-2;break a}else k=j;break}case 7:{if((f|0)<4){f=-2;break a}else k=m;break}case 8:case 1:case 0:{c[g>>2]=e;f=0;break a}default:{}}b:while(1){if((k|0)==(o|0)){h=46;break}f=a[k>>0]|0;h=a[k+1>>0]|0;if(!(f<<24>>24))i=d[p+(h&255)>>0]|0;else i=v$(f,h)|0;j=k+4|0;f=k+2|0;h=n-k|0;switch(i|0){case 10:case 9:case 8:case 1:case 0:case 2:case 3:{h=45;break b}case 5:if((h|0)<2){h=32;break b}else{k=f;continue b}case 6:{if((h|0)<3){h=34;break b}k=k+3|0;continue b}case 7:if((h|0)<4){h=37;break b}else{k=j;continue b}case 4:{if((f|0)==(o|0)){h=45;break b}if(a[f>>0]|0){k=f;continue b}if((a[k+3>>0]|0)!=93){k=f;continue b}if((j|0)==(o|0)){h=45;break b}if(a[j>>0]|0){k=f;continue b}if((a[k+5>>0]|0)==62){h=44;break b}else{k=f;continue b}}default:{k=f;continue b}}}if((h|0)==32){c[g>>2]=k;f=6;break}else if((h|0)==34){c[g>>2]=k;f=6;break}else if((h|0)==37){c[g>>2]=k;f=6;break}else if((h|0)==44){c[g>>2]=j;f=0;break}else if((h|0)==45){c[g>>2]=k;f=6;break}else if((h|0)==46){c[g>>2]=o;f=6;break}}else f=-1}else f=-4;while(0);return f|0}function S$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){k=e;m=f-k|0;l=(m&1|0)==0;m=m&-2;n=(m|0)==0;m=l|n?f:e+m|0;if(l|n^1){h=a[e>>0]|0;n=b+76|0;f=a[e+1>>0]|0;if(!(h<<24>>24))h=d[n+(f&255)>>0]|0;else h=v$(h,f)|0;i=e+2|0;j=e+3|0;l=m;b=(i|0)==(m|0);f=l-k|0;k=e+4|0;switch(h|0){case 4:{if(b){f=-1;break a}if((a[i>>0]|0)==0?(a[j>>0]|0)==93:0){if((k|0)==(m|0)){f=-1;break a}if((a[k>>0]|0)==0?(a[e+5>>0]|0)==62:0){c[g>>2]=e+6;f=40;break a}}break}case 9:{if(b){f=-1;break a}b=a[i>>0]|0;f=a[j>>0]|0;if(!(b<<24>>24))f=d[n+(f&255)>>0]|0;else f=v$(b,f)|0;c[g>>2]=(f|0)==10?k:i;f=7;break a}case 10:{c[g>>2]=i;f=7;break a}case 5:{if((f|0)<2){f=-2;break a}break}case 6:{if((f|0)<3){f=-2;break a}else i=j;break}case 7:{if((f|0)<4){f=-2;break a}else i=k;break}case 8:case 1:case 0:{c[g>>2]=e;f=0;break a}default:{}}b:while(1){if((i|0)==(m|0)){b=38;break}f=a[i>>0]|0;b=a[i+1>>0]|0;if(!(f<<24>>24))h=d[n+(b&255)>>0]|0;else h=v$(f,b)|0;f=i+2|0;b=l-i|0;switch(h|0){case 4:case 10:case 9:case 8:case 1:case 0:{b=37;break b}case 5:if((b|0)<2){b=30;break b}else{i=f;continue b}case 6:{if((b|0)<3){b=32;break b}i=i+3|0;continue b}case 7:{if((b|0)<4){b=35;break b}i=i+4|0;continue b}default:{i=f;continue b}}}if((b|0)==30){c[g>>2]=i;f=6;break}else if((b|0)==32){c[g>>2]=i;f=6;break}else if((b|0)==35){c[g>>2]=i;f=6;break}else if((b|0)==37){c[g>>2]=i;f=6;break}else if((b|0)==38){c[g>>2]=m;f=6;break}}else f=-1}else f=-4;while(0);return f|0}function T$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=f-e|0;r=(r&1|0)==0?f:e+(r&-2)|0;p=b+76|0;q=r;o=0;a:while(1){if((e|0)==(r|0)){f=-1;break}f=a[e>>0]|0;b=a[e+1>>0]|0;if(!(f<<24>>24))n=d[p+(b&255)>>0]|0;else n=v$(f,b)|0;f=e+2|0;b=(f|0)==(r|0);h=e+3|0;i=e+4|0;j=e+5|0;k=e+6|0;l=q-e|0;m=(i|0)==(r|0);switch(n|0){case 8:case 1:case 0:{s=10;break a}case 5:if((l|0)<2){f=-2;break a}else{n=o;e=f;o=n;continue a}case 6:if((l|0)<3){f=-2;break a}else{n=o;e=h;o=n;continue a}case 7:if((l|0)<4){f=-2;break a}else{n=o;e=i;o=n;continue a}case 2:{if(b){f=-1;break a}if(a[f>>0]|0){n=o;e=f;o=n;continue a}if((a[h>>0]|0)!=33){n=o;e=f;o=n;continue a}if(m){f=-1;break a}if(a[i>>0]|0){n=o;e=i;o=n;continue a}e=(a[j>>0]|0)==91;o=(e&1)+o|0;e=e?k:i;continue a}case 4:{if(b){f=-1;break a}if(a[f>>0]|0){n=o;e=f;o=n;continue a}if((a[h>>0]|0)!=93){n=o;e=f;o=n;continue a}if(m){f=-1;break a}if(a[i>>0]|0){n=o;e=i;o=n;continue a}if((a[j>>0]|0)!=62){n=o;e=i;o=n;continue a}if(!o){s=24;break a}o=o+-1|0;e=k;continue a}default:{n=o;e=f;o=n;continue a}}}if((s|0)==10){c[g>>2]=e;f=0}else if((s|0)==24){c[g>>2]=k;f=42}return f|0}function U$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;do if((e|0)!=(f|0)){l=b+76|0;j=e;a:while(1){if((j|0)==(f|0)){i=27;break}i=a[j>>0]|0;h=a[j+1>>0]|0;if(!(i<<24>>24))h=d[l+(h&255)>>0]|0;else h=v$(i,h)|0;k=j+2|0;switch(h|0){case 21:{i=24;break a}case 3:{i=10;break a}case 2:{i=13;break a}case 10:{i=14;break a}case 9:{i=17;break a}case 6:{j=j+3|0;continue a}case 7:{j=j+4|0;continue a}default:{j=k;continue a}}}if((i|0)==10)if((j|0)==(e|0)){h=f0(b,k,f,g)|0;break}else{c[g>>2]=j;h=6;break}else if((i|0)==13){c[g>>2]=j;h=0;break}else if((i|0)==14)if((j|0)==(e|0)){c[g>>2]=k;h=7;break}else{c[g>>2]=j;h=6;break}else if((i|0)==17){if((j|0)!=(e|0)){c[g>>2]=j;h=6;break}if((k|0)==(f|0)){h=-3;break}h=a[k>>0]|0;i=a[e+3>>0]|0;if(!(h<<24>>24))h=d[l+(i&255)>>0]|0;else h=v$(h,i)|0;c[g>>2]=(h|0)==10?e+4|0:k;h=7;break}else if((i|0)==24)if((j|0)==(e|0)){c[g>>2]=k;h=39;break}else{c[g>>2]=j;h=6;break}else if((i|0)==27){c[g>>2]=f;h=6;break}}else h=-4;while(0);return h|0}function V$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;do if((e|0)!=(f|0)){l=b+76|0;j=e;a:while(1){if((j|0)==(f|0)){i=26;break}i=a[j>>0]|0;h=a[j+1>>0]|0;if(!(i<<24>>24))h=d[l+(h&255)>>0]|0;else h=v$(i,h)|0;k=j+2|0;switch(h|0){case 9:{i=19;break a}case 3:{i=10;break a}case 30:{i=13;break a}case 10:{i=16;break a}case 6:{j=j+3|0;continue a}case 7:{j=j+4|0;continue a}default:{j=k;continue a}}}if((i|0)==10)if((j|0)==(e|0)){h=f0(b,k,f,g)|0;break}else{c[g>>2]=j;h=6;break}else if((i|0)==13)if((j|0)==(e|0)){h=g0(b,k,f,g)|0;h=(h|0)==22?0:h;break}else{c[g>>2]=j;h=6;break}else if((i|0)==16)if((j|0)==(e|0)){c[g>>2]=k;h=7;break}else{c[g>>2]=j;h=6;break}else if((i|0)==19){if((j|0)!=(e|0)){c[g>>2]=j;h=6;break}if((k|0)==(f|0)){h=-3;break}h=a[k>>0]|0;i=a[e+3>>0]|0;if(!(h<<24>>24))h=d[l+(i&255)>>0]|0;else h=v$(h,i)|0;c[g>>2]=(h|0)==10?e+4|0:k;h=7;break}else if((i|0)==26){c[g>>2]=f;h=6;break}}else h=-4;while(0);return h|0}function W$(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=b+76|0;b=c;a:while(1){c=a[b>>0]|0;h=b+1|0;i=a[h>>0]|0;if(!(c<<24>>24))f=d[j+(i&255)>>0]|0;else f=v$(c,i)|0;g=e+1|0;switch(f|0){case 7:{if(c<<24>>24==(a[e>>0]|0)){e=g;b=h;c=i;k=7}else{b=0;break a}break}case 6:{k=7;break}case 5:{k=9;break}case 27:case 26:case 25:case 24:case 23:case 22:case 29:{if((a[e>>0]|0)!=c<<24>>24){b=0;break a}if((a[g>>0]|0)!=i<<24>>24){b=0;break a}break}default:{k=14;break a}}if((k|0)==7){k=0;f=b+1|0;if(c<<24>>24!=(a[e>>0]|0)){b=0;break}e=e+1|0;b=f;c=a[f>>0]|0;k=9}if((k|0)==9){k=0;if(c<<24>>24!=(a[e>>0]|0)){b=0;break}if((a[b+1>>0]|0)!=(a[e+1>>0]|0)){b=0;break}}e=e+2|0;b=b+2|0}b:do if((k|0)==14){e=a[e>>0]|0;b=a[g>>0]|0;if(!(e<<24>>24))b=d[j+(b&255)>>0]|0;else b=v$(e,b)|0;switch(b|0){case 27:case 26:case 25:case 24:case 23:case 22:case 29:case 7:case 6:case 5:{b=0;break b}default:{}}b=1}while(0);return b|0}function X$(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;b=c;while(1){c=a[e>>0]|0;f=(b|0)==(d|0);if(!(c<<24>>24)){g=7;break}if(f){b=0;break}if(a[b>>0]|0){b=0;break}if((a[b+1>>0]|0)!=c<<24>>24){b=0;break}e=e+1|0;b=b+2|0}if((g|0)==7)b=f&1;return b|0}function Y$(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;g=b+76|0;f=c;a:while(1){b=a[f>>0]|0;e=a[f+1>>0]|0;if(!(b<<24>>24))b=d[g+(e&255)>>0]|0;else b=v$(b,e)|0;switch(b|0){case 27:case 26:case 25:case 24:case 23:case 22:case 29:case 5:{f=f+2|0;continue a}case 6:{f=f+3|0;continue a}case 7:{f=f+4|0;continue a}default:break a}}return f-c|0}function Z$(b,c){b=b|0;c=c|0;var e=0,f=0;f=b+76|0;a:while(1){b=a[c>>0]|0;e=a[c+1>>0]|0;if(!(b<<24>>24))b=d[f+(e&255)>>0]|0;else b=v$(b,e)|0;switch(b|0){case 21:case 9:case 10:break;default:break a}c=c+2|0}return c|0}function _$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=b+76|0;x=0;y=0;u=1;a:while(1){w=e+2|0;b=a[w>>0]|0;r=b<<24>>24==0;s=e+3|0;t=a[s>>0]|0;if(r)q=d[z+(t&255)>>0]|0;else q=v$(b,t)|0;b=(y|0)<(f|0);h=e+4|0;i=(u|0)==1;j=(u|0)==2;v=g+(y<<4)+12|0;k=y+1|0;l=(u|0)==0;m=(u|0)!=2;n=g+(y<<4)+8|0;o=g+(y<<4)+4|0;p=g+(y<<4)|0;do switch(q|0){case 5:{if(!l){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=1;e=w;y=t;x=v;continue a}c[p>>2]=w;a[v>>0]=1;t=y;v=x;u=1;e=w;y=t;x=v;continue a}case 6:{if(!l){t=u;v=y;w=x;e=s;u=t;y=v;x=w;continue a}if(!b){v=y;w=x;u=1;e=s;y=v;x=w;continue a}c[p>>2]=w;a[v>>0]=1;v=y;w=x;u=1;e=s;y=v;x=w;continue a}case 7:{if(!l){t=u;v=y;w=x;e=h;u=t;y=v;x=w;continue a}if(!b){v=y;w=x;u=1;e=h;y=v;x=w;continue a}c[p>>2]=w;a[v>>0]=1;v=y;w=x;u=1;e=h;y=v;x=w;continue a}case 24:case 22:case 29:{if(!l){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=1;e=w;y=t;x=v;continue a}c[p>>2]=w;a[v>>0]=1;t=y;v=x;u=1;e=w;y=t;x=v;continue a}case 12:{if(m){if(!b){v=y;x=12;u=2;e=w;y=v;continue a}c[o>>2]=h;v=y;x=12;u=2;e=w;y=v;continue a}if((x|0)!=12){t=y;v=x;u=2;e=w;y=t;x=v;continue a}if(!b){x=12;y=k;u=0;e=w;continue a}c[n>>2]=w;x=12;y=k;u=0;e=w;continue a}case 13:{if(m){if(!b){v=y;x=13;u=2;e=w;y=v;continue a}c[o>>2]=h;v=y;x=13;u=2;e=w;y=v;continue a}if((x|0)!=13){t=y;v=x;u=2;e=w;y=t;x=v;continue a}if(!b){x=13;y=k;u=0;e=w;continue a}c[n>>2]=w;x=13;y=k;u=0;e=w;continue a}case 3:{if(!b){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}a[v>>0]=0;s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}case 21:{if(i){t=y;v=x;u=0;e=w;y=t;x=v;continue a}if(!j){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=2;e=w;y=t;x=v;continue a}if(!(a[v>>0]|0)){t=y;v=x;u=2;e=w;y=t;x=v;continue a}do if(r&(w|0)!=(c[o>>2]|0)&t<<24>>24==32){h=a[h>>0]|0;b=a[e+5>>0]|0;if(!(h<<24>>24)){if(b<<24>>24==32)break;b=d[z+(b&255)>>0]|0}else b=v$(h,b)|0;if((b|0)!=(x|0)){t=y;v=x;u=2;e=w;y=t;x=v;continue a}}while(0);a[v>>0]=0;t=y;v=x;u=2;e=w;y=t;x=v;continue a}case 10:case 9:{if(i){t=y;v=x;u=0;e=w;y=t;x=v;continue a}if(!j){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=2;e=w;y=t;x=v;continue a}a[v>>0]=0;t=y;v=x;u=2;e=w;y=t;x=v;continue a}case 17:case 11:if(m)break a;else{t=y;v=x;u=2;e=w;y=t;x=v;continue a}default:{s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}}while(0)}return y|0}function $$(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;b=c+4|0;d=a[b>>0]|0;a:do if(!(d<<24>>24))if((a[c+5>>0]|0)==120){c=c+6|0;b=0;while(1){b:while(1){if(!(a[c>>0]|0)){d=a[c+1>>0]|0;if(d<<24>>24==59){f=18;break a}d=d<<24>>24;switch(d|0){case 57:case 56:case 55:case 54:case 53:case 52:case 51:case 50:case 49:case 48:{f=8;break b}case 70:case 69:case 68:case 67:case 66:case 65:{f=9;break b}case 102:case 101:case 100:case 99:case 98:case 97:{f=10;break b}default:{}}}c=c+2|0}if((f|0)==8){f=0;b=d+-48|b<<4}else if((f|0)==9){f=0;b=(b<<4)+-55+d|0}else if((f|0)==10){f=0;b=(b<<4)+-87+d|0}if((b|0)<1114112)c=c+2|0;else{b=-1;break}}}else{e=b;b=0;c=0;f=13}else{e=b;b=0;c=d;f=13}while(0);c:do if((f|0)==13)while(1){f=0;if(!(c<<24>>24)){c=a[e+1>>0]|0;if(c<<24>>24==59){f=18;break c}c=c<<24>>24}else c=-1;b=(b*10|0)+-48+c|0;c=e+2|0;if((b|0)>=1114112){b=-1;break c}e=c;c=a[c>>0]|0;f=13}while(0);if((f|0)==18)b=k_(b)|0;return b|0}function a0(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=c+2|0;h=c+3|0;i=c+4|0;e=c+5|0;f=c+1|0;a:do switch((d-c|0)/2|0|0){case 2:{if((a[g>>0]|0)==0?(a[h>>0]|0)==116:0){if(!(a[c>>0]|0))b=a[f>>0]|0;else b=-1;b=(b|0)==108?60:(b|0)==103?62:0}else j=27;break}case 3:{if((((((a[c>>0]|0)==0?(a[f>>0]|0)==97:0)?(a[g>>0]|0)==0:0)?(a[h>>0]|0)==109:0)?(a[i>>0]|0)==0:0)?(a[e>>0]|0)==112:0)b=38;else j=27;break}case 4:{if(!(a[c>>0]|0)){d=c+6|0;b=c+7|0;switch(a[f>>0]|0){case 113:{if(a[g>>0]|0){j=27;break a}if((a[h>>0]|0)!=117){j=27;break a}if(a[i>>0]|0){j=27;break a}if((a[e>>0]|0)!=111){j=27;break a}if(a[d>>0]|0){j=27;break a}if((a[b>>0]|0)==116){b=34;break a}else{j=27;break a}}case 97:{if(a[g>>0]|0){j=27;break a}if((a[h>>0]|0)!=112){j=27;break a}if(a[i>>0]|0){j=27;break a}if((a[e>>0]|0)!=111){j=27;break a}if(a[d>>0]|0){j=27;break a}if((a[b>>0]|0)==115){b=39;break a}else{j=27;break a}}default:{j=27;break a}}}else j=27;break}default:j=27}while(0);if((j|0)==27)b=0;return b|0}function b0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;j=b+76|0;k=g+4|0;b=e;while(1){if(b>>>0>=f>>>0)break;h=a[b>>0]|0;e=a[b+1>>0]|0;if(!(h<<24>>24))e=d[j+(e&255)>>0]|0;else e=v$(h,e)|0;i=b+2|0;switch(e|0){case 9:{c[g>>2]=(c[g>>2]|0)+1;if((i|0)==(f|0))b=f;else{e=a[i>>0]|0;h=a[b+3>>0]|0;if(!(e<<24>>24))e=d[j+(h&255)>>0]|0;else e=v$(e,h)|0;b=(e|0)==10?b+4|0:i}c[k>>2]=-1;break}case 6:{b=b+3|0;break}case 7:{b=b+4|0;break}case 10:{c[k>>2]=-1;c[g>>2]=(c[g>>2]|0)+1;b=i;break}default:b=i}c[k>>2]=(c[k>>2]|0)+1}return}function c0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;k=f+-2|0;j=b+76|0;a:while(1){h=e+2|0;if((h|0)==(k|0)){f=1;break}f=a[h>>0]|0;i=f<<24>>24==0;b=a[e+3>>0]|0;if(i)f=d[j+(b&255)>>0]|0;else f=v$(f,b)|0;switch(f|0){case 23:case 19:case 30:case 33:case 16:case 18:case 10:case 9:case 15:case 14:case 17:case 35:case 34:case 32:case 31:case 13:case 27:case 24:case 25:{e=h;continue a}case 21:if(i&b<<24>>24==9){l=12;break a}else{e=h;continue a}case 22:case 26:{if(!i){l=12;break a}if(b<<24>>24>=0){e=h;continue a}break}default:if(!i){l=12;break a}}switch(b<<24>>24|0){case 64:case 36:{e=h;break}default:{l=12;break a}}}if((l|0)==12){c[g>>2]=h;f=0}return f|0}function d0(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=h;b=c[e>>2]|0;a:while(1){if((b|0)==(f|0)){b=f;break}k=a[b+1>>0]|0;i=a[b>>0]|0;m=i&255;j=k&255;n=j>>>6;l=(j&63|128)&255;switch(i<<24>>24){case 0:{if(k<<24>>24>-1){i=c[g>>2]|0;if((i|0)==(h|0))break a;c[g>>2]=i+1;a[i>>0]=k}else p=7;break}case 7:case 6:case 5:case 4:case 3:case 2:case 1:{p=7;break}case -37:case -38:case -39:case -40:{i=c[g>>2]|0;if((o-i|0)<4)break a;m=(m<<2&12|n)+1|0;c[g>>2]=i+1;a[i>>0]=m>>>2|240;n=c[g>>2]|0;c[g>>2]=n+1;a[n>>0]=j>>>2&15|m<<4&48|128;n=b+2|0;m=d[b+3>>0]|0;l=(j<<4&48|m>>>6|a[n>>0]<<2&12|128)&255;b=c[g>>2]|0;c[g>>2]=b+1;a[b>>0]=l;b=c[g>>2]|0;c[g>>2]=b+1;a[b>>0]=m&63|128;b=n;break}default:{i=c[g>>2]|0;if((o-i|0)<3)break a;c[g>>2]=i+1;a[i>>0]=m>>>4|224;k=c[g>>2]|0;c[g>>2]=k+1;a[k>>0]=n|m<<2&60|128;n=c[g>>2]|0;c[g>>2]=n+1;a[n>>0]=l}}if((p|0)==7){p=0;i=c[g>>2]|0;if((o-i|0)<2)break;c[g>>2]=i+1;a[i>>0]=n|m<<2|192;n=c[g>>2]|0;c[g>>2]=n+1;a[n>>0]=l}b=b+2|0}c[e>>2]=b;return}function e0(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;e=c[f>>2]|0;if((g-e|0)>(i-(c[h>>2]|0)|0)){j=g+-2|0;j=(a[j>>0]&-8)<<24>>24==-40?j:g}else j=g;while(1){if((e|0)==(j|0))break;g=c[h>>2]|0;if((g|0)==(i|0))break;k=((d[e>>0]|0)<<8|(d[e+1>>0]|0))&65535;c[h>>2]=g+2;b[g>>1]=k;g=(c[f>>2]|0)+2|0;c[f>>2]=g;e=g}return}function f0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){k=a[e>>0]|0;m=b+76|0;l=a[e+1>>0]|0;if(!(k<<24>>24))j=d[m+(l&255)>>0]|0;else j=v$(k,l)|0;n=f;h=n-e|0;i=e+2|0;switch(j|0){case 29:{l=l&255;if(!(1<<(l&31)&c[57168+((l>>>5|(d[143937+(k&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((h|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((h|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((h|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}case 19:{b=h0(b,i,f,g)|0;break a}default:{c[g>>2]=e;b=0;break a}}b:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i>>0]|0;e=a[i+1>>0]|0;if(!(b<<24>>24))h=d[m+(e&255)>>0]|0;else h=v$(b,e)|0;j=i+2|0;switch(h|0){case 27:case 26:case 25:case 24:case 22:{i=j;continue b}case 5:{e=23;break b}case 6:{e=25;break b}case 7:{e=27;break b}case 18:{e=29;break b}case 29:break;default:{e=30;break b}}l=e&255;if(!(1<<(l&31)&c[57168+((l>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){e=22;break}else i=j}if((e|0)==22){c[g>>2]=i;b=0;break}else if((e|0)==23){if((n-i|0)<2){b=-2;break}c[g>>2]=i;b=0;break}else if((e|0)==25){if((n-i|0)<3){b=-2;break}c[g>>2]=i;b=0;break}else if((e|0)==27){if((n-i|0)<4){b=-2;break}c[g>>2]=i;b=0;break}else if((e|0)==29){c[g>>2]=j;b=9;break}else if((e|0)==30){c[g>>2]=i;b=0;break}}else b=-1;while(0);return b|0}function g0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){j=a[e>>0]|0;k=b+76|0;i=a[e+1>>0]|0;if(!(j<<24>>24))h=d[k+(i&255)>>0]|0;else h=v$(j,i)|0;l=f;b=l-e|0;switch(h|0){case 29:{i=i&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[143937+(j&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((b|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((b|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((b|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}case 30:case 9:case 10:case 21:{c[g>>2]=e;b=22;break a}default:{c[g>>2]=e;b=0;break a}}e=e+2|0;b:while(1){if((e|0)==(f|0)){b=-1;break a}b=a[e>>0]|0;h=a[e+1>>0]|0;if(!(b<<24>>24))i=d[k+(h&255)>>0]|0;else i=v$(b,h)|0;j=e+2|0;switch(i|0){case 27:case 26:case 25:case 24:case 22:{e=j;continue b}case 5:{h=24;break b}case 6:{h=26;break b}case 7:{h=28;break b}case 18:{h=30;break b}case 29:break;default:{h=31;break b}}i=h&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){h=23;break}else e=j}if((h|0)==23){c[g>>2]=e;b=0;break}else if((h|0)==24){if((l-e|0)<2){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==26){if((l-e|0)<3){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==28){if((l-e|0)<4){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==30){c[g>>2]=j;b=28;break}else if((h|0)==31){c[g>>2]=e;b=0;break}}else b=-1;while(0);return b|0}function h0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){h=a[e>>0]|0;i=h<<24>>24==0;j=e+2|0;k=a[e+1>>0]|0;if(i&k<<24>>24==120){b=i0(b,j,f,g)|0;break}l=b+76|0;if(i)b=d[l+(k&255)>>0]|0;else b=v$(h,k)|0;if((b|0)!=25){c[g>>2]=e;b=0;break}b:while(1){if((j|0)==(f|0)){b=-1;break a}b=a[j>>0]|0;h=a[j+1>>0]|0;if(!(b<<24>>24))b=d[l+(h&255)>>0]|0;else b=v$(b,h)|0;i=j+2|0;switch(b|0){case 25:{j=i;break}case 18:{h=14;break b}default:{h=15;break b}}}if((h|0)==14){c[g>>2]=i;b=10;break}else if((h|0)==15){c[g>>2]=j;b=0;break}}else b=-1;while(0);return b|0}function i0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;a:do if((e|0)!=(f|0)){h=a[e>>0]|0;j=b+76|0;b=a[e+1>>0]|0;if(!(h<<24>>24))b=d[j+(b&255)>>0]|0;else b=v$(h,b)|0;if((b&-2|0)!=24){c[g>>2]=e;b=0;break}i=e+2|0;b:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i>>0]|0;h=a[i+1>>0]|0;if(!(b<<24>>24))b=d[j+(h&255)>>0]|0;else b=v$(b,h)|0;e=i+2|0;switch(b|0){case 24:case 25:{i=e;break}case 18:{h=13;break b}default:{h=14;break b}}}if((h|0)==13){c[g>>2]=e;b=10;break}else if((h|0)==14){c[g>>2]=i;b=0;break}}else b=-1;while(0);return b|0}function j0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:do if((e|0)!=(f|0)){k=a[e>>0]|0;n=b+76|0;l=a[e+1>>0]|0;if(!(k<<24>>24))j=d[n+(l&255)>>0]|0;else j=v$(k,l)|0;h=e+2|0;m=f;i=m-e|0;switch(j|0){case 29:{l=l&255;if(!(1<<(l&31)&c[57168+((l>>>5|d[143937+(k&255)>>0]<<3)<<2)>>2])){c[g>>2]=e;h=0;break a}else l=0;break}case 24:case 22:{l=0;break}case 5:{if((i|0)<2){h=-2;break a}c[g>>2]=e;h=0;break a}case 6:{if((i|0)<3){h=-2;break a}c[g>>2]=e;h=0;break a}case 7:{if((i|0)<4){h=-2;break a}c[g>>2]=e;h=0;break a}case 16:{if((h|0)==(f|0)){h=-1;break a}i=a[h>>0]|0;j=a[e+3>>0]|0;if(!(i<<24>>24))j=d[n+(j&255)>>0]|0;else j=v$(i,j)|0;i=e+4|0;switch(j|0){case 27:{h=k0(b,i,f,g)|0;break a}case 20:{h=l0(i,f,g)|0;break a}default:{c[g>>2]=h;h=0;break a}}}case 15:{h=m0(b,h,f,g)|0;break a}case 17:{h=n0(b,h,f,g)|0;break a}default:{c[g>>2]=e;h=0;break a}}b:while(1){c:while(1){if((h|0)==(f|0)){h=-1;break a}i=a[h>>0]|0;j=a[h+1>>0]|0;if(!(i<<24>>24))k=d[n+(j&255)>>0]|0;else k=v$(i,j)|0;e=h+2|0;switch(k|0){case 5:{o=32;break b}case 6:{o=34;break b}case 7:{o=36;break b}case 10:case 9:case 21:{h=e;o=56;break b}case 11:{o=71;break b}case 17:break b;case 27:case 26:case 25:case 24:case 22:{h=e;continue c}case 23:break c;case 29:break;default:{o=77;break b}}k=j&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[144193+(i&255)>>0]<<3)<<2)>>2])){o=31;break b}else h=e}if(l|0){o=39;break}if((e|0)==(f|0)){h=-1;break a}i=a[e>>0]|0;j=a[h+3>>0]|0;if(!(i<<24>>24))k=d[n+(j&255)>>0]|0;else k=v$(i,j)|0;switch(k|0){case 5:{o=49;break b}case 6:{o=51;break b}case 7:{o=53;break b}case 29:{l=j&255;if(!(1<<(l&31)&c[57168+((l>>>5|d[143937+(i&255)>>0]<<3)<<2)>>2])){o=46;break b}break}case 24:case 22:break;default:{o=55;break b}}l=1;h=h+4|0}d:switch(o|0){case 31:{c[g>>2]=h;h=0;break a}case 32:{if((m-h|0)<2){h=-2;break a}c[g>>2]=h;h=0;break a}case 34:{if((m-h|0)<3){h=-2;break a}c[g>>2]=h;h=0;break a}case 36:{if((m-h|0)<4){h=-2;break a}c[g>>2]=h;h=0;break a}case 39:{c[g>>2]=h;h=0;break a}case 46:{c[g>>2]=e;h=0;break a}case 49:{if((m-e|0)<2){h=-2;break a}c[g>>2]=e;h=0;break a}case 51:{if((m-e|0)<3){h=-2;break a}c[g>>2]=e;h=0;break a}case 53:{if((m-e|0)<4){h=-2;break a}c[g>>2]=e;h=0;break a}case 55:{c[g>>2]=e;h=0;break a}case 56:{e:while(1){o=0;if((h|0)==(f|0)){h=-1;break a}i=a[h>>0]|0;j=a[h+1>>0]|0;if(!(i<<24>>24))l=d[n+(j&255)>>0]|0;else l=v$(i,j)|0;k=h+2|0;switch(l|0){case 11:{o=71;break d}case 17:break d;case 10:case 9:case 21:{h=k;o=56;break}case 29:{o=61;break e}case 24:case 22:break e;case 5:{o=64;break e}case 6:{o=66;break e}case 7:{o=68;break e}default:{o=70;break e}}}if((o|0)==61){o=j&255;if(!(1<<(o&31)&c[57168+((o>>>5|d[143937+(i&255)>>0]<<3)<<2)>>2])){c[g>>2]=h;h=0;break a}}else if((o|0)==64){if((m-h|0)<2){h=-2;break a}c[g>>2]=h;h=0;break a}else if((o|0)==66){if((m-h|0)<3){h=-2;break a}c[g>>2]=h;h=0;break a}else if((o|0)==68){if((m-h|0)<4){h=-2;break a}c[g>>2]=h;h=0;break a}else if((o|0)==70){c[g>>2]=h;h=0;break a}h=o0(b,k,f,g)|0;break a}case 77:{c[g>>2]=h;h=0;break a}}if((o|0)==71){c[g>>2]=h+2;h=2;break}i=h+2|0;if((i|0)!=(f|0)){if((a[i>>0]|0)==0?(a[h+3>>0]|0)==62:0){c[g>>2]=h+4;h=4;break}c[g>>2]=i;h=0}else h=-1}else h=-1;while(0);return h|0}function k0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)==(f|0))b=-1;else{if((a[e>>0]|0)==0?(a[e+1>>0]|0)==45:0){j=b+76|0;k=f;i=e+2|0;b:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i>>0]|0;e=a[i+1>>0]|0;if(!(b<<24>>24))h=d[j+(e&255)>>0]|0;else h=v$(b,e)|0;b=i+2|0;e=k-i|0;switch(h|0){case 8:case 1:case 0:{l=16;break b}case 5:if((e|0)<2){b=-2;break a}else{i=b;continue b}case 6:{if((e|0)<3){b=-2;break a}i=i+3|0;continue b}case 7:{if((e|0)<4){b=-2;break a}i=i+4|0;continue b}case 27:{if((b|0)==(f|0)){b=-1;break a}if(a[b>>0]|0){i=b;continue b}if((a[i+3>>0]|0)==45)break b;else{i=b;continue b}}default:{i=b;continue b}}}if((l|0)==16){c[g>>2]=i;b=0;break}b=i+4|0;if((b|0)==(f|0)){b=-1;break}if((a[b>>0]|0)==0?(a[i+5>>0]|0)==62:0){c[g>>2]=i+6;b=13;break}c[g>>2]=b;b=0;break}c[g>>2]=e;b=0}while(0);return b|0}function l0(b,d,e){b=b|0;d=d|0;e=e|0;if((d-b|0)<12)d=-1;else{d=0;while(1){if((d|0)>=6){d=8;break}if(a[b>>0]|0){d=0;break}if((a[b+1>>0]|0)!=(a[144449+d>>0]|0)){d=0;break}d=d+1|0;b=b+2|0}c[e>>2]=b}return d|0}function m0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;a:do if((e|0)==(f|0))b=-1;else{j=a[e>>0]|0;o=b+76|0;b=a[e+1>>0]|0;if(!(j<<24>>24))i=d[o+(b&255)>>0]|0;else i=v$(j,b)|0;n=f;h=n-e|0;switch(i|0){case 29:{k=b&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[143937+(j&255)>>0]<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((h|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((h|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((h|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}default:{c[g>>2]=e;b=0;break a}}b=e+2|0;b:while(1){if((b|0)==(f|0)){b=-1;break a}h=a[b>>0]|0;i=a[b+1>>0]|0;if(!(h<<24>>24))k=d[o+(i&255)>>0]|0;else k=v$(h,i)|0;j=b+2|0;switch(k|0){case 27:case 26:case 25:case 24:case 22:{b=j;continue b}case 5:{m=23;break b}case 6:{m=25;break b}case 7:{m=27;break b}case 10:case 9:case 21:{m=29;break b}case 15:{m=46;break b}case 29:break;default:break b}k=i&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[144193+(h&255)>>0]<<3)<<2)>>2])){m=22;break}else b=j}if((m|0)==22){c[g>>2]=b;b=0;break}else if((m|0)==23){if((n-b|0)<2){b=-2;break}c[g>>2]=b;b=0;break}else if((m|0)==25){if((n-b|0)<3){b=-2;break}c[g>>2]=b;b=0;break}else if((m|0)==27){if((n-b|0)<4){b=-2;break}c[g>>2]=b;b=0;break}else if((m|0)==29){if(!(p0(e,b,p)|0)){c[g>>2]=b;b=0;break}c:while(1){if((j|0)==(f|0)){b=-1;break a}b=a[j>>0]|0;h=a[j+1>>0]|0;if(!(b<<24>>24))i=d[o+(h&255)>>0]|0;else i=v$(b,h)|0;b=j+2|0;h=n-j|0;switch(i|0){case 8:case 1:case 0:{m=41;break c}case 5:if((h|0)<2){b=-2;break a}else{j=b;continue c}case 6:{if((h|0)<3){b=-2;break a}j=j+3|0;continue c}case 7:{if((h|0)<4){b=-2;break a}j=j+4|0;continue c}case 15:{if((b|0)==(f|0)){b=-1;break a}if(a[b>>0]|0){j=b;continue c}if((a[j+3>>0]|0)==62){m=45;break c}else{j=b;continue c}}default:{j=b;continue c}}}if((m|0)==41){c[g>>2]=j;b=0;break}else if((m|0)==45){c[g>>2]=j+4;b=c[p>>2]|0;break}}else if((m|0)==46){if(!(p0(e,b,p)|0)){c[g>>2]=b;b=0;break}if((j|0)==(f|0)){b=-1;break}if((a[j>>0]|0)==0?(a[b+3>>0]|0)==62:0){c[g>>2]=b+4;b=c[p>>2]|0;break}else b=j}c[g>>2]=b;b=0}while(0);l=q;return b|0}function n0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){j=a[e>>0]|0;l=b+76|0;i=a[e+1>>0]|0;if(!(j<<24>>24))h=d[l+(i&255)>>0]|0;else h=v$(j,i)|0;k=f;b=k-e|0;switch(h|0){case 29:{i=i&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[143937+(j&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((b|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((b|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((b|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}default:{c[g>>2]=e;b=0;break a}}j=e+2|0;b:while(1){if((j|0)==(f|0)){b=-1;break a}b=a[j>>0]|0;h=a[j+1>>0]|0;if(!(b<<24>>24))e=d[l+(h&255)>>0]|0;else e=v$(b,h)|0;i=j+2|0;switch(e|0){case 23:case 27:case 26:case 25:case 24:case 22:{j=i;continue b}case 5:{e=23;break b}case 6:{e=25;break b}case 7:{e=27;break b}case 10:case 9:case 21:{e=29;break b}case 11:{e=36;break b}case 29:break;default:{e=37;break b}}e=h&255;if(!(1<<(e&31)&c[57168+((e>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){e=22;break}else j=i}if((e|0)==22){c[g>>2]=j;b=0;break}else if((e|0)==23){if((k-j|0)<2){b=-2;break}c[g>>2]=j;b=0;break}else if((e|0)==25){if((k-j|0)<3){b=-2;break}c[g>>2]=j;b=0;break}else if((e|0)==27){if((k-j|0)<4){b=-2;break}c[g>>2]=j;b=0;break}else if((e|0)==29){c:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i>>0]|0;h=a[i+1>>0]|0;if(!(b<<24>>24))b=d[l+(h&255)>>0]|0;else b=v$(b,h)|0;h=i+2|0;switch(b|0){case 10:case 9:case 21:{i=h;e=29;break}case 11:{e=34;break c}default:{e=35;break c}}}if((e|0)==34){c[g>>2]=h;b=5;break}else if((e|0)==35){c[g>>2]=i;b=0;break}}else if((e|0)==36){c[g>>2]=i;b=5;break}else if((e|0)==37){c[g>>2]=j;b=0;break}}else b=-1;while(0);return b|0}function o0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;c[p>>2]=e;m=b+76|0;n=f;h=0;a:while(1){b:while(1){if((e|0)==(f|0)){e=-1;break a}k=a[e>>0]|0;i=a[e+1>>0]|0;if(!(k<<24>>24))j=d[m+(i&255)>>0]|0;else j=v$(k,i)|0;switch(j|0){case 5:{o=11;break a}case 6:{o=13;break a}case 7:{o=15;break a}case 23:{o=17;break b}case 10:case 9:case 21:{h=e;o=33;break b}case 14:{o=39;break b}case 29:{j=i&255;if(!(1<<(j&31)&c[57168+((j>>>5|d[144193+(k&255)>>0]<<3)<<2)>>2])){o=9;break a}break}case 27:case 26:case 25:case 24:case 22:break;default:{o=93;break a}}k=e+2|0;c[p>>2]=k;e=k}c:do if((o|0)==17){o=0;if(h|0){o=18;break a}h=e+2|0;c[p>>2]=h;if((h|0)==(f|0)){e=-1;break a}i=a[h>>0]|0;j=a[e+3>>0]|0;if(!(i<<24>>24))k=d[m+(j&255)>>0]|0;else k=v$(i,j)|0;switch(k|0){case 5:{o=26;break a}case 6:{o=28;break a}case 7:{o=30;break a}case 24:case 22:{h=1;break c}case 29:break;default:{o=32;break a}}k=j&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[143937+(i&255)>>0]<<3)<<2)>>2])){o=25;break a}else h=1}else if((o|0)==33)while(1){o=0;e=h+2|0;c[p>>2]=e;if((e|0)==(f|0)){e=-1;break a}i=a[e>>0]|0;h=a[h+3>>0]|0;if(!(i<<24>>24))h=d[m+(h&255)>>0]|0;else h=v$(i,h)|0;switch(h|0){case 14:{o=39;break c}case 9:case 10:case 21:{h=e;o=33;break}default:{o=38;break a}}}while(0);d:do if((o|0)==39){while(1){o=0;j=e+2|0;c[p>>2]=j;if((j|0)==(f|0)){e=-1;break a}h=a[j>>0]|0;i=a[e+3>>0]|0;if(!(h<<24>>24))k=d[m+(i&255)>>0]|0;else k=v$(h,i)|0;if((k|1|0)==13)break;switch(k|0){case 9:case 10:case 21:{e=j;o=39;break}default:{o=45;break a}}}e=e+4|0;c[p>>2]=e;e:while(1){if((e|0)==(f|0)){e=-1;break a}h=a[e>>0]|0;i=a[e+1>>0]|0;if(!(h<<24>>24))h=d[m+(i&255)>>0]|0;else h=v$(h,i)|0;if((h|0)==(k|0))break;switch(h|0){case 8:case 1:case 0:{o=59;break a}case 2:{o=64;break a}case 5:{if((n-e|0)<2){e=-2;break a}j=e+2|0;c[p>>2]=j;e=j;continue e}case 6:{if((n-e|0)<3){e=-2;break a}j=e+3|0;c[p>>2]=j;e=j;continue e}case 7:{if((n-e|0)<4){e=-2;break a}j=e+4|0;c[p>>2]=j;e=j;continue e}case 3:{e=f0(b,e+2|0,f,p)|0;if((e|0)<1){o=62;break a}e=c[p>>2]|0;continue e}default:{j=e+2|0;c[p>>2]=j;e=j;continue e}}}i=e+2|0;c[p>>2]=i;if((i|0)==(f|0)){e=-1;break a}h=a[i>>0]|0;j=a[e+3>>0]|0;if(!(h<<24>>24))h=d[m+(j&255)>>0]|0;else h=v$(h,j)|0;switch(h|0){case 11:{o=85;break a}case 17:{o=86;break a}case 10:case 9:case 21:{e=i;break}default:{o=71;break a}}f:while(1){i=e+2|0;c[p>>2]=i;if((i|0)==(f|0)){e=-1;break a}h=a[i>>0]|0;j=a[e+3>>0]|0;if(!(h<<24>>24))k=d[m+(j&255)>>0]|0;else k=v$(h,j)|0;switch(k|0){case 5:{o=79;break a}case 6:{o=81;break a}case 7:{o=83;break a}case 11:{o=85;break a}case 17:{o=86;break a}case 24:case 22:{h=0;break d}case 10:case 9:case 21:{e=i;break}case 29:break f;default:{o=91;break a}}}k=j&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[143937+(h&255)>>0]<<3)<<2)>>2])){o=78;break a}else h=0}while(0);e=e+4|0;c[p>>2]=e}switch(o|0){case 9:{c[g>>2]=e;e=0;break}case 11:{if((f-e|0)<2)e=-2;else{c[g>>2]=e;e=0}break}case 13:{if((f-e|0)<3)e=-2;else{c[g>>2]=e;e=0}break}case 15:{if((f-e|0)<4)e=-2;else{c[g>>2]=e;e=0}break}case 18:{c[g>>2]=e;e=0;break}case 25:{c[g>>2]=h;e=0;break}case 26:{if((f-h|0)<2)e=-2;else{c[g>>2]=h;e=0}break}case 28:{if((f-h|0)<3)e=-2;else{c[g>>2]=h;e=0}break}case 30:{if((f-h|0)<4)e=-2;else{c[g>>2]=h;e=0}break}case 32:{c[g>>2]=h;e=0;break}case 38:{c[g>>2]=e;e=0;break}case 45:{c[g>>2]=j;e=0;break}case 59:{c[g>>2]=e;e=0;break}case 62:{if(!e){c[g>>2]=c[p>>2];e=0}break}case 64:{c[g>>2]=e;e=0;break}case 71:{c[g>>2]=i;e=0;break}case 78:{c[g>>2]=i;e=0;break}case 79:{if((n-i|0)<2)e=-2;else{c[g>>2]=i;e=0}break}case 81:{if((n-i|0)<3)e=-2;else{c[g>>2]=i;e=0}break}case 83:{if((n-i|0)<4)e=-2;else{c[g>>2]=i;e=0}break}case 85:{c[g>>2]=e+4;e=1;break}case 86:{h=i+2|0;c[p>>2]=h;e=h;if((h|0)==(f|0))e=-1;else{if((a[h>>0]|0)==0?(a[i+3>>0]|0)==62:0){c[g>>2]=i+4;e=3;break}c[g>>2]=e;e=0}break}case 91:{c[g>>2]=i;e=0;break}case 93:{c[g>>2]=e;e=0;break}}l=q;return e|0}function p0(b,d,e){b=b|0;d=d|0;e=e|0;c[e>>2]=11;a:do if((d-b|0)==6?(a[b>>0]|0)==0:0){switch(a[b+1>>0]|0){case 120:{d=0;break}case 88:{d=1;break}default:{d=1;break a}}if(!(a[b+2>>0]|0)){switch(a[b+3>>0]|0){case 109:break;case 77:{d=1;break}default:{d=1;break a}}if(!(a[b+4>>0]|0)){switch(a[b+5>>0]|0){case 108:break;case 76:{d=0;break a}default:{d=1;break a}}if(!d){c[e>>2]=12;d=1}else d=0}else d=1}else d=1}else d=1;while(0);return d|0}function q0(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;l=e+76|0;k=g;j=f;a:while(1){if((j|0)==(g|0)){e=-1;break}f=a[j>>0]|0;e=a[j+1>>0]|0;if(!(f<<24>>24))i=d[l+(e&255)>>0]|0;else i=v$(f,e)|0;e=j+2|0;f=k-j|0;switch(i|0){case 8:case 1:case 0:{m=12;break a}case 5:if((f|0)<2){e=-2;break a}else{j=e;continue a}case 6:{if((f|0)<3){e=-2;break a}j=j+3|0;continue a}case 7:{if((f|0)<4){e=-2;break a}j=j+4|0;continue a}case 13:case 12:if((i|0)==(b|0)){m=14;break a}else{j=e;continue a}default:{j=e;continue a}}}b:do if((m|0)==12){c[h>>2]=j;e=0}else if((m|0)==14)if((e|0)==(g|0))e=-27;else{c[h>>2]=e;f=a[e>>0]|0;e=a[j+3>>0]|0;if(!(f<<24>>24))e=d[l+(e&255)>>0]|0;else e=v$(f,e)|0;switch(e|0){case 20:case 30:case 11:case 10:case 9:case 21:{e=27;break b}default:{}}e=0}while(0);return e|0}function r0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;a:do if((e|0)==(f|0))h=-1;else{h=a[e>>0]|0;i=a[e+1>>0]|0;k=b+76|0;if(!(h<<24>>24))i=d[k+(i&255)>>0]|0;else i=v$(h,i)|0;h=e+2|0;switch(i|0){case 27:{h=k0(b,h,f,g)|0;break a}case 20:{c[g>>2]=h;h=33;break a}case 24:case 22:{b=h;b:while(1){if((b|0)==(f|0)){h=-1;break a}h=a[b>>0]|0;i=a[b+1>>0]|0;if(!(h<<24>>24))i=d[k+(i&255)>>0]|0;else i=v$(h,i)|0;h=b+2|0;switch(i|0){case 24:case 22:{b=h;break}case 30:{j=14;break b}case 10:case 9:case 21:break b;default:{j=21;break b}}}if((j|0)==21){c[g>>2]=b;h=0;break a}c:do if((j|0)==14){if((h|0)==(f|0)){h=-1;break a}h=a[h>>0]|0;i=a[b+3>>0]|0;if(!(h<<24>>24))h=d[k+(i&255)>>0]|0;else h=v$(h,i)|0;switch(h|0){case 30:case 10:case 9:case 21:break;default:break c}c[g>>2]=b;h=0;break a}while(0);c[g>>2]=b;h=16;break a}default:{c[g>>2]=e;h=0;break a}}}while(0);return h|0}function s0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){j=a[e>>0]|0;k=b+76|0;i=a[e+1>>0]|0;if(!(j<<24>>24))h=d[k+(i&255)>>0]|0;else h=v$(j,i)|0;l=f;b=l-e|0;switch(h|0){case 29:{i=i&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[143937+(j&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((b|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((b|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((b|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}default:{c[g>>2]=e;b=0;break a}}b:while(1){b=e;e=e+2|0;if((e|0)==(f|0)){b=-20;break a}i=a[e>>0]|0;b=a[b+3>>0]|0;if(!(i<<24>>24))h=d[k+(b&255)>>0]|0;else h=v$(i,b)|0;switch(h|0){case 27:case 26:case 25:case 24:case 22:continue b;case 5:{h=22;break b}case 6:{h=24;break b}case 7:{h=26;break b}case 36:case 30:case 11:case 32:case 21:case 10:case 9:{h=28;break b}case 29:break;default:{h=29;break b}}j=b&255;if(!(1<<(j&31)&c[57168+((j>>>5|(d[144193+(i&255)>>0]|0)<<3)<<2)>>2])){h=21;break}}if((h|0)==21){c[g>>2]=e;b=0;break}else if((h|0)==22){if((l-e|0)<2){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==24){if((l-e|0)<3){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==26){if((l-e|0)<4){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==28){c[g>>2]=e;b=20;break}else if((h|0)==29){c[g>>2]=e;b=0;break}}else b=-1;while(0);return b|0}function t0(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;while(1){b=c[d>>2]|0;if((b|0)==(e|0))break;if((c[f>>2]|0)==(g|0))break;c[d>>2]=b+1;h=a[b>>0]|0;b=c[f>>2]|0;c[f>>2]=b+1;a[b>>0]=h}return}function u0(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;a:while(1){f=a[b>>0]|0;g=a[c>>0]|0;f=(f+-97&255)<26?(f&255)+224&255:f;switch((f<<24>>24==((g+-97&255)<26?(g&255)+224&255:g)<<24>>24?(f<<24>>24==0?2:0):1)&3){case 0:{c=c+1|0;b=b+1|0;break}case 1:{e=3;break a}case 2:{d=1;break a}default:{e=5;break a}}}if((e|0)==3)d=0;return d|0}function v0(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;return x0(42,a,b,c,d,e,f,g,h,i,j)|0}function w0(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+144|0;i=h+4|0;f=h+8|0;g=h;c[i>>2]=d;c[g>>2]=f;fb[c[b+60>>2]&31](b,i,e,g,f+127|0);do if((c[i>>2]|0)==(e|0)){a[c[g>>2]>>0]=0;if(u0(f,144464)|0?(c[b+68>>2]|0)==2:0)break;b=L$(f)|0;if((b|0)!=-1)b=c[59184+(b<<2)>>2]|0;else b=0}else b=0;while(0);l=h;return b|0}function x0(a,b,d,e,f,g,h,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+16|0;t=v+8|0;q=v+12|0;o=v+4|0;p=v;c[q>>2]=0;c[o>>2]=0;c[p>>2]=0;u=d+68|0;s=c[u>>2]|0;r=e+(s*5|0)|0;c[t>>2]=r;s=f+(0-(s<<1))|0;r=(y0(d,r,s,o,p,q,t)|0)!=0;n=c[o>>2]|0;e=n;a:do if(r&(n|0)!=0){r=d+28|0;f=c[p>>2]|0;b=(b|0)!=0;do if(!(tb[c[r>>2]&127](d,n,f,144489)|0)){if(!b){c[g>>2]=e;e=0;break a}}else{if(h|0)c[h>>2]=c[q>>2];e=c[t>>2]|0;if(i|0)c[i>>2]=e;if(!(y0(d,e,s,o,p,q,t)|0)){c[g>>2]=c[t>>2];e=0;break a}e=c[o>>2]|0;if(e|0){n=e;f=c[p>>2]|0;break}if(!b){e=1;break a}c[g>>2]=c[t>>2];e=0;break a}while(0);if(tb[c[r>>2]&127](d,n,f,144497)|0){f=c[q>>2]|0;e=f;if((((z0(d,f,s)|0)&-33)+-65|0)>>>0>=26){c[g>>2]=e;e=0;break}if(j|0)c[j>>2]=e;e=c[t>>2]|0;if(k|0)c[k>>2]=eb[a&63](d,f,e+(0-(c[u>>2]|0))|0)|0;if(!(y0(d,e,s,o,p,q,t)|0)){c[g>>2]=c[t>>2];e=0;break}e=c[o>>2]|0;if(!e){e=1;break}n=e;f=c[p>>2]|0}if(b|(tb[c[r>>2]&127](d,n,f,144506)|0)==0){c[g>>2]=e;e=0;break}f=c[q>>2]|0;e=c[t>>2]|0;n=(m|0)!=0;b=f;if(!(tb[c[r>>2]&127](d,f,e+(0-(c[u>>2]|0))|0,107958)|0)){if(!(tb[c[r>>2]&127](d,f,e+(0-(c[u>>2]|0))|0,107950)|0)){c[g>>2]=b;e=0;break}if(n)c[m>>2]=0}else if(n)c[m>>2]=1;while(1){if(!(A0(z0(d,e,s)|0)|0))break;e=e+(c[u>>2]|0)|0}c[t>>2]=e;if((e|0)==(s|0))e=1;else{c[g>>2]=e;e=0}}else{c[g>>2]=c[t>>2];e=0}while(0);l=v;return e|0}function y0(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;a:do if((b|0)!=(d|0)){if(!(A0(z0(a,b,d)|0)|0)){c[h>>2]=b;b=0;break}j=a+68|0;do b=b+(c[j>>2]|0)|0;while((A0(z0(a,b,d)|0)|0)!=0);if((b|0)==(d|0)){c[e>>2]=0;b=1;break}c[e>>2]=b;b:while(1){i=z0(a,b,d)|0;switch(i|0){case -1:{i=11;break b}case 61:{i=12;break b}default:{}}if(A0(i)|0){i=14;break}b=b+(c[j>>2]|0)|0}if((i|0)==11){c[h>>2]=b;b=0;break}else if((i|0)==12)c[f>>2]=b;else if((i|0)==14){c[f>>2]=b;do{b=b+(c[j>>2]|0)|0;i=z0(a,b,d)|0}while((A0(i)|0)!=0);if((i|0)!=61){c[h>>2]=b;b=0;break}}if((b|0)==(c[e>>2]|0)){c[h>>2]=b;b=0;break}do{b=b+(c[j>>2]|0)|0;i=z0(a,b,d)|0}while((A0(i)|0)!=0);switch(i|0){case 34:case 39:break;default:{c[h>>2]=b;b=0;break a}}f=b+(c[j>>2]|0)|0;c[g>>2]=f;b=i<<24>>24;c:while(1){i=z0(a,f,d)|0;if((i|0)==(b|0)){i=30;break}if((i+-48|0)>>>0>9&((i&-33)+-65|0)>>>0>25)switch(i|0){case 45:case 46:case 95:break;default:{i=28;break c}}f=f+(c[j>>2]|0)|0}if((i|0)==28){c[h>>2]=f;b=0;break}else if((i|0)==30){c[h>>2]=f+(c[j>>2]|0);b=1;break}}else{c[e>>2]=0;b=1}while(0);return b|0}function z0(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+16|0;i=h+4|0;f=h+8|0;g=h;c[i>>2]=d;c[g>>2]=f;fb[c[b+60>>2]&31](b,i,e,g,f+1|0);l=h;return ((c[g>>2]|0)==(f|0)?-1:a[f>>0]|0)|0}function A0(a){a=a|0;switch(a|0){case 9:case 10:case 13:case 32:{a=1;break}default:a=0}return a|0}function B0(){return 60340}function C0(b,d,e){b=b|0;d=d|0;e=e|0;e=L$(e)|0;if((e|0)==-1)e=0;else{a[b+73>>0]=e;c[b>>2]=69;c[b+4>>2]=70;c[b+52>>2]=31;c[b+76>>2]=d;c[d>>2]=b;e=1}return e|0}function D0(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return P$(60708,a,0,b,c,d)|0}function E0(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return P$(60708,a,1,b,c,d)|0}function F0(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;return x0(43,a,b,c,d,e,f,g,h,i,j)|0}function G0(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+144|0;i=h+4|0;f=h+8|0;g=h;c[i>>2]=d;c[g>>2]=f;fb[c[b+60>>2]&31](b,i,e,g,f+127|0);do if((c[i>>2]|0)==(e|0)){a[c[g>>2]>>0]=0;if(u0(f,144464)|0?(c[b+68>>2]|0)==2:0)break;b=L$(f)|0;if((b|0)!=-1)b=c[60708+(b<<2)>>2]|0;else b=0}else b=0;while(0);l=h;return b|0}function H0(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;b=j_(b,c,d,e)|0;if(b|0)a[b+76+58>>0]=23;return b|0}function I0(a){a=a|0;c[a>>2]=4;c[a+16>>2]=1;c[a+12>>2]=0;c[a+20>>2]=0;return}function J0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;switch(b|0){case 15:{c[a>>2]=5;a=0;break}case 12:{c[a>>2]=5;a=1;break}case 11:{c[a>>2]=5;a=55;break}case 13:{c[a>>2]=5;a=56;break}case 14:{a=0;break}case 16:{if(!(tb[c[f+28>>2]&127](f,d+(c[f+68>>2]<<1)|0,e,144517)|0))g=9;else{c[a>>2]=6;a=3}break}case 29:{c[a>>2]=7;a=2;break}default:g=9}if((g|0)==9)a=N0(a,b)|0;return a|0}function K0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;switch(b|0){case 14:case 15:{a=0;break}case 11:{a=55;break}case 13:{a=56;break}case 16:{if(!(tb[c[f+28>>2]&127](f,d+(c[f+68>>2]<<1)|0,e,144517)|0))g=7;else{c[a>>2]=6;a=3}break}case 29:{c[a>>2]=7;a=2;break}default:g=7}if((g|0)==7)a=N0(a,b)|0;return a|0}function L0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=3;break}case 41:case 18:{c[a>>2]=8;a=4;break}default:a=N0(a,b)|0}return a|0}function M0(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0}function N0(a,b){a=a|0;b=b|0;if((b|0)==28&(c[a+16>>2]|0)==0)a=59;else{c[a>>2]=7;a=-1}return a|0}function O0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do switch(b|0){case 15:{a=3;break}case 25:{c[a>>2]=9;a=7;break}case 17:{c[a>>2]=10;a=8;break}case 18:{g=f+28|0;if(tb[c[g>>2]&127](f,d,e,144525)|0){c[a>>2]=11;a=3;break a}if(!(tb[c[g>>2]&127](f,d,e,144532)|0))h=8;else{c[a>>2]=12;a=3}break}default:h=8}while(0);if((h|0)==8)a=N0(a,b)|0;return a|0}function P0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;a:do switch(b|0){case -4:case 15:{a=0;break}case 16:{g=f+28|0;h=f+68|0;if(tb[c[g>>2]&127](f,d+(c[h>>2]<<1)|0,e,144539)|0){c[a>>2]=13;a=11;break a}if(tb[c[g>>2]&127](f,d+(c[h>>2]<<1)|0,e,144546)|0){c[a>>2]=14;a=33;break a}if(tb[c[g>>2]&127](f,d+(c[h>>2]<<1)|0,e,144554)|0){c[a>>2]=15;a=39;break a}if(!(tb[c[g>>2]&127](f,d+(c[h>>2]<<1)|0,e,144562)|0))i=14;else{c[a>>2]=16;a=17}break}case 11:{a=55;break}case 13:{a=56;break}case 28:{a=60;break}case 26:{c[a>>2]=17;a=3;break}default:i=14}while(0);if((i|0)==14)a=N0(a,b)|0;return a|0}function Q0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=b+-11|0;switch(f>>>1|f<<31|0){case 2:{a=0;break}case 0:{a=55;break}case 1:{a=56;break}case 9:{c[a>>2]=7;a=2;break}default:a=N0(a,b)|0}return a|0}function R0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=3;break}case 27:{c[a>>2]=18;a=5;break}default:a=N0(a,b)|0}return a|0}function S0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=3;break}case 27:{c[a>>2]=11;a=6;break}default:a=N0(a,b)|0}return a|0}function T0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=3;break}case 25:{c[a>>2]=9;a=7;break}case 17:{c[a>>2]=10;a=8;break}default:a=N0(a,b)|0}return a|0}function U0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 22:{c[a>>2]=19;a=11;break}case 18:{c[a>>2]=20;a=9;break}default:a=N0(a,b)|0}return a|0}function V0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 41:case 18:{c[a>>2]=21;a=34;break}default:a=N0(a,b)|0}return a|0}function W0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=39;break}case 41:case 18:{c[a>>2]=22;a=40;break}default:a=N0(a,b)|0}return a|0}function X0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=17;break}case 18:{c[a>>2]=23;a=18;break}default:a=N0(a,b)|0}return a|0}function Y0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=3;break}case 17:{c[a>>2]=10;a=8;break}default:a=N0(a,b)|0}return a|0}function Z0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do switch(b|0){case 15:{a=17;break}case 18:{g=f+28|0;if(tb[c[g>>2]&127](f,d,e,144525)|0){c[a>>2]=24;a=17;break a}if(!(tb[c[g>>2]&127](f,d,e,144532)|0))h=6;else{c[a>>2]=25;a=17}break}default:h=6}while(0);if((h|0)==6)a=N0(a,b)|0;return a|0}function _0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=17;break}case 27:{c[a>>2]=26;c[a+8>>2]=17;a=19;break}default:a=N0(a,b)|0}return a|0}function $0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=17;break}case 27:{c[a>>2]=27;a=21;break}default:a=N0(a,b)|0}return a|0}function a1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=17;break}case 27:{c[a>>2]=26;c[a+8>>2]=17;a=19;break}case 17:{c[a>>2]=c[a+16>>2]|0?9:28;a=20;break}default:a=N0(a,b)|0}return a|0}function b1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;d=a+8|0;switch(b|0){case 15:{d=c[d>>2]|0;break}case 17:{c[a>>2]=c[a+16>>2]|0?9:28;d=c[d>>2]|0;break}default:d=N0(a,b)|0}return d|0}function c1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=a+12|0;switch(b|0){case 33:{c[a>>2]=29;d=0;break}case 34:{d=c[g>>2]|0;if(!d)h=7;else{c[g>>2]=d+-1;d=0}break}case 15:{d=0;break}case 26:{h=7;break}case -4:{if(!(c[g>>2]|0))d=0;else h=7;break}default:d=P0(a,b,d,e,f)|0}if((h|0)==7)d=N0(a,b)|0;return d|0}function d1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do switch(b|0){case 15:{a=0;break}case 18:{g=f+28|0;if(tb[c[g>>2]&127](f,d,e,144571)|0){c[a>>2]=30;a=0;break a}if(!(tb[c[g>>2]&127](f,d,e,144579)|0))h=6;else{c[a>>2]=31;a=0}break}default:h=6}while(0);if((h|0)==6)a=N0(a,b)|0;return a|0}function e1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=0;break}case 25:{c[a>>2]=28;a=a+12|0;c[a>>2]=(c[a>>2]|0)+1;a=0;break}default:a=N0(a,b)|0}return a|0}function f1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=0;break}case 25:{c[a>>2]=28;a=58;break}default:a=N0(a,b)|0}return a|0}function g1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;a:do switch(b|0){case 15:{a=39;break}case 18:{g=f+28|0;h=a+8|0;if(tb[c[g>>2]&127](f,d,e,144586)|0){c[a>>2]=26;c[h>>2]=39;a=42;break a}if(!(tb[c[g>>2]&127](f,d,e,144592)|0))i=7;else{c[a>>2]=26;c[h>>2]=39;a=41}break}case 23:{c[a>>2]=32;c[a+4>>2]=1;a=44;break}default:i=7}while(0);if((i|0)==7)a=N0(a,b)|0;return a|0}function h1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;switch(b|0){case 15:{a=39;break}case 20:{if(!(tb[c[f+28>>2]&127](f,d+(c[f+68>>2]|0)|0,e,144596)|0))g=9;else{c[a>>2]=33;a=43}break}case 23:{c[a+4>>2]=2;c[a>>2]=34;a=44;break}case 41:case 18:{c[a>>2]=35;a=51;break}case 30:{c[a>>2]=35;a=53;break}case 31:{c[a>>2]=35;a=52;break}case 32:{c[a>>2]=35;a=54;break}default:g=9}if((g|0)==9)a=N0(a,b)|0;return a|0}function i1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;d=a+8|0;switch(b|0){case 15:{d=39;break}case 24:{c[a>>2]=26;c[d>>2]=39;d=45;break}case 36:{c[a>>2]=26;c[d>>2]=39;d=46;break}case 21:{c[a>>2]=36;d=39;break}default:d=N0(a,b)|0}return d|0}function j1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=39;break}case 23:{a=a+4|0;c[a>>2]=(c[a>>2]|0)+1;a=44;break}case 41:case 18:{c[a>>2]=35;a=51;break}case 30:{c[a>>2]=35;a=53;break}case 31:{c[a>>2]=35;a=52;break}case 32:{c[a>>2]=35;a=54;break}default:a=N0(a,b)|0}return a|0}function k1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;d=a+8|0;e=a+4|0;switch(b|0){case 15:{d=39;break}case 24:{b=(c[e>>2]|0)+-1|0;c[e>>2]=b;if(!b){c[a>>2]=26;c[d>>2]=39;d=45}else d=45;break}case 36:{b=(c[e>>2]|0)+-1|0;c[e>>2]=b;if(!b){c[a>>2]=26;c[d>>2]=39;d=46}else d=46;break}case 35:{b=(c[e>>2]|0)+-1|0;c[e>>2]=b;if(!b){c[a>>2]=26;c[d>>2]=39;d=47}else d=47;break}case 37:{b=(c[e>>2]|0)+-1|0;c[e>>2]=b;if(!b){c[a>>2]=26;c[d>>2]=39;d=48}else d=48;break}case 38:{c[a>>2]=34;d=50;break}case 21:{c[a>>2]=34;d=49;break}default:d=N0(a,b)|0}return d|0}function l1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=39;break}case 41:case 18:{c[a>>2]=37;a=51;break}default:a=N0(a,b)|0}return a|0}function m1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=39;break}case 36:{c[a>>2]=26;c[a+8>>2]=39;a=46;break}case 21:{c[a>>2]=36;a=39;break}default:a=N0(a,b)|0}return a|0}function n1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 17:{c[a>>2]=c[a+16>>2]|0?9:28;a=33;break}case 41:case 18:{c[a>>2]=38;a=22;break}default:a=N0(a,b)|0}return a|0}function o1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;a:do switch(b|0){case 15:{g=33;break}case 18:{h=f+28|0;g=0;while(1){i=c[h>>2]|0;if((g|0)>=8)break;if(tb[i&127](f,d,e,c[62576+(g<<2)>>2]|0)|0){j=6;break}g=g+1|0}if((j|0)==6){c[a>>2]=39;g=g+23|0;break a}if(!(tb[i&127](f,d,e,144562)|0))j=10;else{c[a>>2]=40;g=33}break}case 23:{c[a>>2]=41;g=33;break}default:j=10}while(0);if((j|0)==10)g=N0(a,b)|0;return g|0}function p1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;a:do switch(b|0){case 15:{a=33;break}case 20:{g=f+28|0;h=f+68|0;if(tb[c[g>>2]&127](f,d+(c[h>>2]|0)|0,e,144603)|0){c[a>>2]=21;a=35;break a}if(tb[c[g>>2]&127](f,d+(c[h>>2]|0)|0,e,144611)|0){c[a>>2]=21;a=36;break a}if(!(tb[c[g>>2]&127](f,d+(c[h>>2]|0)|0,e,144620)|0))i=9;else{c[a>>2]=42;a=33}break}case 27:{c[a>>2]=21;a=37;break}default:i=9}while(0);if((i|0)==9)a=N0(a,b)|0;return a|0}function q1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 23:{c[a>>2]=43;a=33;break}default:a=N0(a,b)|0}return a|0}function r1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 41:case 18:case 19:{c[a>>2]=44;a=31;break}default:a=N0(a,b)|0}return a|0}function s1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 24:{c[a>>2]=39;a=33;break}case 21:{c[a>>2]=41;a=33;break}default:a=N0(a,b)|0}return a|0}function t1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 18:{c[a>>2]=45;a=32;break}default:a=N0(a,b)|0}return a|0}function u1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 24:{c[a>>2]=39;a=33;break}case 21:{c[a>>2]=43;a=33;break}default:a=N0(a,b)|0}return a|0}function v1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 27:{c[a>>2]=21;a=38;break}default:a=N0(a,b)|0}return a|0}function w1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 18:{c[a>>2]=46;a=10;break}default:a=N0(a,b)|0}return a|0}function x1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do switch(b|0){case 15:{a=11;break}case 18:{g=f+28|0;if(tb[c[g>>2]&127](f,d,e,144525)|0){c[a>>2]=47;a=11;break a}if(!(tb[c[g>>2]&127](f,d,e,144532)|0))h=7;else{c[a>>2]=48;a=11}break}case 27:{c[a>>2]=26;c[a+8>>2]=11;a=12;break}default:h=7}while(0);if((h|0)==7)a=N0(a,b)|0;return a|0}function y1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 27:{c[a>>2]=49;a=13;break}default:a=N0(a,b)|0}return a|0}function z1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 27:{c[a>>2]=47;a=14;break}default:a=N0(a,b)|0}return a|0}function A1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;switch(b|0){case 15:{a=11;break}case 17:{c[a>>2]=c[a+16>>2]|0?9:28;a=15;break}case 18:{if(!(tb[c[f+28>>2]&127](f,d,e,144674)|0))g=5;else{c[a>>2]=50;a=11}break}default:g=5}if((g|0)==5)a=N0(a,b)|0;return a|0}function B1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 18:{c[a>>2]=26;c[a+8>>2]=11;a=16;break}default:a=N0(a,b)|0}return a|0}function C1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do switch(b|0){case 15:{a=11;break}case 18:{g=f+28|0;if(tb[c[g>>2]&127](f,d,e,144525)|0){c[a>>2]=51;a=11;break a}if(!(tb[c[g>>2]&127](f,d,e,144532)|0))h=7;else{c[a>>2]=52;a=11}break}case 27:{c[a>>2]=26;c[a+8>>2]=11;a=12;break}default:h=7}while(0);if((h|0)==7)a=N0(a,b)|0;return a|0}function D1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 27:{c[a>>2]=53;a=13;break}default:a=N0(a,b)|0}return a|0}function E1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 27:{c[a>>2]=51;a=14;break}default:a=N0(a,b)|0}return a|0}function F1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 17:{c[a>>2]=c[a+16>>2]|0?9:28;a=15;break}default:a=N0(a,b)|0}return a|0}function G1(){return 190360}function H1(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=O1(c[a+60>>2]|0)|0;a=K1(xa(6,d|0)|0)|0;l=b;return a|0}function I1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;n=l;l=l+48|0;k=n+16|0;g=n;f=n+32|0;i=a+28|0;e=c[i>>2]|0;c[f>>2]=e;j=a+20|0;e=(c[j>>2]|0)-e|0;c[f+4>>2]=e;c[f+8>>2]=b;c[f+12>>2]=d;e=e+d|0;h=a+60|0;c[g>>2]=c[h>>2];c[g+4>>2]=f;c[g+8>>2]=2;g=K1(bb(146,g|0)|0)|0;a:do if((e|0)!=(g|0)){b=2;while(1){if((g|0)<0)break;e=e-g|0;p=c[f+4>>2]|0;o=g>>>0>p>>>0;f=o?f+8|0:f;b=(o<<31>>31)+b|0;p=g-(o?p:0)|0;c[f>>2]=(c[f>>2]|0)+p;o=f+4|0;c[o>>2]=(c[o>>2]|0)-p;c[k>>2]=c[h>>2];c[k+4>>2]=f;c[k+8>>2]=b;g=K1(bb(146,k|0)|0)|0;if((e|0)==(g|0)){m=3;break a}}c[a+16>>2]=0;c[i>>2]=0;c[j>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[f+4>>2]|0)|0}else m=3;while(0);if((m|0)==3){p=c[a+44>>2]|0;c[a+16>>2]=p+(c[a+48>>2]|0);c[i>>2]=p;c[j>>2]=p}l=n;return d|0}function J1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+32|0;g=f;e=f+20|0;c[g>>2]=c[a+60>>2];c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=e;c[g+16>>2]=d;if((K1(Za(140,g|0)|0)|0)<0){c[e>>2]=-1;a=-1}else a=c[e>>2]|0;l=f;return a|0}function K1(a){a=a|0;if(a>>>0>4294963200){c[(L1()|0)>>2]=0-a;a=-1}return a|0}function L1(){return (M1()|0)+64|0}function M1(){return N1()|0}function N1(){return 62988}function O1(a){a=a|0;return a|0}function P1(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+32|0;f=k;i=k+16|0;c[i>>2]=d;g=i+4|0;j=b+48|0;m=c[j>>2]|0;c[g>>2]=e-((m|0)!=0&1);h=b+44|0;c[i+8>>2]=c[h>>2];c[i+12>>2]=m;c[f>>2]=c[b+60>>2];c[f+4>>2]=i;c[f+8>>2]=2;f=K1(ab(145,f|0)|0)|0;if((f|0)>=1){i=c[g>>2]|0;if(f>>>0>i>>>0){g=c[h>>2]|0;h=b+4|0;c[h>>2]=g;c[b+8>>2]=g+(f-i);if(!(c[j>>2]|0))f=e;else{c[h>>2]=g+1;a[d+(e+-1)>>0]=a[g>>0]|0;f=e}}}else c[b>>2]=c[b>>2]|f&48^16;l=k;return f|0}function Q1(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;c[b+36>>2]=18;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21523,c[f+8>>2]=g+16,Qa(54,f|0)|0):0)a[b+75>>0]=-1;f=I1(b,d,e)|0;l=g;return f|0}function R1(a){a=a|0;var b=0;b=(S1(a)|0)==0;return (b?a:a|32)|0}function S1(a){a=a|0;return (a+-65|0)>>>0<26|0}function T1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+128|0;h=j;c[h>>2]=0;i=h+4|0;c[i>>2]=a;c[h+44>>2]=a;g=h+8|0;c[g>>2]=(a|0)<0?-1:a+2147483647|0;c[h+76>>2]=-1;U1(h,0);d=V1(h,d,1,e,f)|0;if(b|0)c[b>>2]=a+((c[i>>2]|0)+(c[h+108>>2]|0)-(c[g>>2]|0));l=j;return d|0}function U1(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[a+104>>2]=b;d=c[a+8>>2]|0;e=c[a+4>>2]|0;f=d-e|0;c[a+108>>2]=f;c[a+100>>2]=(b|0)!=0&(f|0)>(b|0)?e+b|0:d;return}function V1(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a:do if(e>>>0>36){c[(L1()|0)>>2]=22;h=0;g=0}else{r=b+4|0;q=b+100|0;do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=W1(b)|0}while((X1(i)|0)!=0);b:do switch(i|0){case 43:case 45:{i=((i|0)==45)<<31>>31;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;p=i;i=d[j>>0]|0;break b}else{p=i;i=W1(b)|0;break b}}default:p=0}while(0);j=(e|0)==0;do if((e|16|0)==16&(i|0)==48){i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=W1(b)|0;if((i|32|0)!=120)if(j){e=8;n=46;break}else{n=32;break}i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=W1(b)|0;if((d[144681+i>>0]|0)>15){g=(c[q>>2]|0)!=0;if(g)c[r>>2]=(c[r>>2]|0)+-1;if(!f){U1(b,0);h=0;g=0;break a}if(!g){h=0;g=0;break a}c[r>>2]=(c[r>>2]|0)+-1;h=0;g=0;break a}else{e=16;n=46}}else{e=j?10:e;if((d[144681+i>>0]|0)>>>0>>0)n=32;else{if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;U1(b,0);c[(L1()|0)>>2]=22;h=0;g=0;break a}}while(0);c:do if((n|0)==32)if((e|0)==10){e=i+-48|0;if(e>>>0<10){i=0;j=e;do{i=(i*10|0)+j|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;e=d[e>>0]|0}else e=W1(b)|0;j=e+-48|0}while(j>>>0<10&i>>>0<429496729);f=0}else{e=i;i=0;f=0}k=e+-48|0;if(k>>>0<10){j=e;do{e=G6(i|0,f|0,10,0)|0;l=D;m=((k|0)<0)<<31>>31;o=~m;if(l>>>0>o>>>0|(l|0)==(o|0)&e>>>0>~k>>>0){e=10;n=72;break c}i=w6(e|0,l|0,k|0,m|0)|0;f=D;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=W1(b)|0;k=j+-48|0}while(k>>>0<10&(f>>>0<429496729|(f|0)==429496729&i>>>0<2576980378));if(k>>>0>9){j=p;e=f}else{e=10;n=72}}else{j=p;e=f}}else n=46;while(0);d:do if((n|0)==46){if(!(e+-1&e)){n=a[144937+((e*23|0)>>>5&7)>>0]|0;f=a[144681+i>>0]|0;j=f&255;if(j>>>0>>0){i=0;k=j;do{i=k|i<>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=W1(b)|0;f=a[144681+j>>0]|0;k=f&255}while(i>>>0<134217728&k>>>0>>0);k=0}else{j=i;k=0;i=0}l=z6(-1,-1,n|0)|0;m=D;if((f&255)>>>0>=e>>>0|(k>>>0>m>>>0|(k|0)==(m|0)&i>>>0>l>>>0)){f=k;n=72;break}else j=k;while(1){i=v6(i|0,j|0,n|0)|0;k=D;i=f&255|i;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=W1(b)|0;f=a[144681+j>>0]|0;if((f&255)>>>0>=e>>>0|(k>>>0>m>>>0|(k|0)==(m|0)&i>>>0>l>>>0)){f=k;n=72;break d}else j=k}}f=a[144681+i>>0]|0;j=f&255;if(j>>>0>>0){i=0;k=j;do{i=k+(S(i,e)|0)|0;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=W1(b)|0;f=a[144681+j>>0]|0;k=f&255}while(i>>>0<119304647&k>>>0>>0);k=0}else{j=i;i=0;k=0}if((f&255)>>>0>>0){n=E6(-1,-1,e|0,0)|0;o=D;m=k;while(1){if(m>>>0>o>>>0|(m|0)==(o|0)&i>>>0>n>>>0){f=m;n=72;break d}k=G6(i|0,m|0,e|0,0)|0;l=D;f=f&255;if(l>>>0>4294967295|(l|0)==-1&k>>>0>~f>>>0){f=m;n=72;break d}i=w6(f|0,0,k|0,l|0)|0;k=D;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=W1(b)|0;f=a[144681+j>>0]|0;if((f&255)>>>0>=e>>>0){f=k;n=72;break}else m=k}}else{f=k;n=72}}while(0);if((n|0)==72)if((d[144681+j>>0]|0)>>>0>>0){do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=W1(b)|0}while((d[144681+i>>0]|0)>>>0>>0);c[(L1()|0)>>2]=34;j=(g&1|0)==0&0==0?p:0;e=h;i=g}else{j=p;e=f}if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;if(!(e>>>0>>0|(e|0)==(h|0)&i>>>0>>0)){if(!((g&1|0)!=0|0!=0|(j|0)!=0)){c[(L1()|0)>>2]=34;g=w6(g|0,h|0,-1,-1)|0;h=D;break}if(e>>>0>h>>>0|(e|0)==(h|0)&i>>>0>g>>>0){c[(L1()|0)>>2]=34;break}}g=((j|0)<0)<<31>>31;g=t6(i^j|0,e^g|0,j|0,g|0)|0;h=D}while(0);D=h;return g|0}function W1(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=b+104|0;j=c[f>>2]|0;if((j|0)!=0?(c[b+108>>2]|0)>=(j|0):0)k=4;else{e=Y1(b)|0;if((e|0)>=0){g=c[f>>2]|0;f=b+8|0;if(g){i=c[f>>2]|0;f=c[b+4>>2]|0;h=b+108|0;g=g-(c[h>>2]|0)|0;j=i;if((i-f|0)<(g|0)){i=j;g=j}else{i=f+(g+-1)|0;g=j}}else{g=c[f>>2]|0;h=b+108|0;i=g;f=c[b+4>>2]|0}c[b+100>>2]=i;if(g|0)c[h>>2]=g+1-f+(c[h>>2]|0);f=f+-1|0;if((d[f>>0]|0|0)!=(e|0))a[f>>0]=e}else k=4}if((k|0)==4){c[b+100>>2]=0;e=-1}return e|0}function X1(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function Y1(a){a=a|0;var b=0,e=0;e=l;l=l+16|0;b=e;if((Z1(a)|0)==0?(eb[c[a+32>>2]&63](a,b,1)|0)==1:0)a=d[b>>0]|0;else a=-1;l=e;return a|0}function Z1(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=b+20|0;e=b+28|0;if((c[d>>2]|0)>>>0>(c[e>>2]|0)>>>0)eb[c[b+36>>2]&63](b,0,0)|0;c[b+16>>2]=0;c[e>>2]=0;c[d>>2]=0;d=c[b>>2]|0;if(!(d&4)){e=(c[b+44>>2]|0)+(c[b+48>>2]|0)|0;c[b+8>>2]=e;c[b+4>>2]=e;d=d<<27>>31}else{c[b>>2]=d|32;d=-1}return d|0}function _1(a,b,c){a=a|0;b=b|0;c=c|0;c=T1(a,b,c,-1,0)|0;return c|0}function $1(a,b,c){a=a|0;b=b|0;c=c|0;c=T1(a,b,c,-2147483648,0)|0;return c|0}function a2(a){a=a|0;var b=0;b=(b2(a)|0)==0;return (b?a:a&95)|0}function b2(a){a=a|0;return (a+-97|0)>>>0<26|0}function c2(a,b){a=+a;b=+b;var d=0.0,e=0,f=0,g=0,i=0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=l;l=l+32|0;m=q+24|0;n=q+16|0;o=q+8|0;p=q;h[j>>3]=a;t=c[j>>2]|0;g=c[j+4>>2]|0;h[j>>3]=b;e=c[j>>2]|0;g=g&2147483647;f=c[j+4>>2]&2147483647;i=g>>>0>>0|(g|0)==(f|0)&t>>>0>>0;s=i?e:t;r=i?f:g;e=i?t:e;f=i?g:f;g=z6(s|0,r|0,52)|0;i=z6(e|0,f|0,52)|0;c[j>>2]=s;c[j+4>>2]=r;a=+h[j>>3];c[j>>2]=e;c[j+4>>2]=f;k=+h[j>>3];do if((i|0)!=2047){if(!((e|0)==0&(f|0)==0|(g|0)==2047)){if((g-i|0)>64){a=a+k;break}if(g>>>0>1533){d=5260135901548373507240989.0e186;b=a*1.90109156629516e-211;a=k*1.90109156629516e-211}else{t=i>>>0<573;d=t?1.90109156629516e-211:1.0;b=t?a*5260135901548373507240989.0e186:a;a=t?k*5260135901548373507240989.0e186:k}d2(m,n,b);d2(o,p,a);a=d*+G(+(+h[p>>3]+ +h[n>>3]+ +h[o>>3]+ +h[m>>3]))}}else a=k;while(0);l=q;return +a}function d2(a,b,c){a=a|0;b=b|0;c=+c;var d=0.0,e=0.0;e=c*134217729.0;e=e+(c-e);d=c-e;c=c*c;h[a>>3]=c;h[b>>3]=d*d+(e*e-c+e*2.0*d);return}function e2(a,b){a=+a;b=+b;var d=0,e=0;h[j>>3]=a;e=c[j>>2]|0;d=c[j+4>>2]|0;h[j>>3]=b;d=c[j+4>>2]&-2147483648|d&2147483647;c[j>>2]=e;c[j+4>>2]=d;return +(+h[j>>3])}function f2(b,c){b=b|0;c=c|0;var d=0,e=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24)b=e;else{do{b=b+1|0;c=c+1|0;d=a[b>>0]|0;e=a[c>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=e<<24>>24));b=e}return (d&255)-(b&255)|0}function g2(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if(!d)b=0;else{while(1){e=a[b>>0]|0;f=a[c>>0]|0;if(e<<24>>24!=f<<24>>24)break;d=d+-1|0;if(!d){b=0;break a}else{b=b+1|0;c=c+1|0}}b=(e&255)-(f&255)|0}while(0);return b|0}function h2(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;if(!d)e=0;else{h=a[b>>0]|0;e=h&255;g=a[c>>0]|0;f=g&255;a:do if(h<<24>>24)do{d=d+-1|0;if(!(h<<24>>24==g<<24>>24&((d|0)!=0&g<<24>>24!=0)))break a;b=b+1|0;c=c+1|0;h=a[b>>0]|0;e=h&255;g=a[c>>0]|0;f=g&255}while(h<<24>>24!=0);while(0);e=e-f|0}return e|0}function i2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=j2(a,b,f)|0;l=e;return d|0}function j2(a,b,c){a=a|0;b=b|0;c=c|0;return k2(a,2147483647,b,c)|0}function k2(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+128|0;g=n+124|0;m=n;h=m;i=63492;j=h+124|0;do{c[h>>2]=c[i>>2];h=h+4|0;i=i+4|0}while((h|0)<(j|0));if((d+-1|0)>>>0>2147483646)if(!d){b=g;d=1;k=4}else{c[(L1()|0)>>2]=75;d=-1}else k=4;if((k|0)==4){k=-2-b|0;k=d>>>0>k>>>0?k:d;c[m+48>>2]=k;g=m+20|0;c[g>>2]=b;c[m+44>>2]=b;d=b+k|0;b=m+16|0;c[b>>2]=d;c[m+28>>2]=d;d=l2(m,e,f)|0;if(k){m=c[g>>2]|0;a[m+(((m|0)==(c[b>>2]|0))<<31>>31)>>0]=0}}l=n;return d|0}function l2(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+224|0;n=s+120|0;o=s+80|0;q=s;r=s+136|0;f=o;g=f+40|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[n>>2]=c[e>>2];if((m2(0,d,n,q,o)|0)<0)e=-1;else{if((c[b+76>>2]|0)>-1)p=n2(b)|0;else p=0;e=c[b>>2]|0;m=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;f=b+48|0;if(!(c[f>>2]|0)){g=b+44|0;h=c[g>>2]|0;c[g>>2]=r;i=b+28|0;c[i>>2]=r;j=b+20|0;c[j>>2]=r;c[f>>2]=80;k=b+16|0;c[k>>2]=r+80;e=m2(b,d,n,q,o)|0;if(h){eb[c[b+36>>2]&63](b,0,0)|0;e=(c[j>>2]|0)==0?-1:e;c[g>>2]=h;c[f>>2]=0;c[k>>2]=0;c[i>>2]=0;c[j>>2]=0}}else e=m2(b,d,n,q,o)|0;f=c[b>>2]|0;c[b>>2]=f|m;if(p|0)o2(b);e=(f&32|0)==0?e:-1}l=s;return e|0}function m2(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0;H=l;l=l+64|0;C=H+16|0;E=H;A=H+24|0;F=H+8|0;G=H+20|0;c[C>>2]=e;x=(d|0)!=0;y=A+40|0;z=y;A=A+39|0;B=F+4|0;k=0;j=0;p=0;a:while(1){do if((j|0)>-1)if((k|0)>(2147483647-j|0)){c[(L1()|0)>>2]=75;j=-1;break}else{j=k+j|0;break}while(0);k=a[e>>0]|0;if(!(k<<24>>24)){w=87;break}else m=e;b:while(1){switch(k<<24>>24){case 37:{k=m;w=9;break b}case 0:{k=m;break b}default:{}}v=m+1|0;c[C>>2]=v;k=a[v>>0]|0;m=v}c:do if((w|0)==9)while(1){w=0;if((a[m+1>>0]|0)!=37)break c;k=k+1|0;m=m+2|0;c[C>>2]=m;if((a[m>>0]|0)==37)w=9;else break}while(0);k=k-e|0;if(x)p2(d,e,k);if(k|0){e=m;continue}n=m+1|0;k=(a[n>>0]|0)+-48|0;if(k>>>0<10){v=(a[m+2>>0]|0)==36;u=v?k:-1;p=v?1:p;n=v?m+3|0:n}else u=-1;c[C>>2]=n;k=a[n>>0]|0;m=(k<<24>>24)+-32|0;d:do if(m>>>0<32){o=0;q=k;while(1){k=1<>2]=n;k=a[n>>0]|0;m=(k<<24>>24)+-32|0;if(m>>>0>=32)break;else q=k}}else o=0;while(0);if(k<<24>>24==42){m=n+1|0;k=(a[m>>0]|0)+-48|0;if(k>>>0<10?(a[n+2>>0]|0)==36:0){c[i+(k<<2)>>2]=10;k=c[g+((a[m>>0]|0)+-48<<3)>>2]|0;p=1;n=n+3|0}else{if(p|0){j=-1;break}if(x){p=(c[f>>2]|0)+(4-1)&~(4-1);k=c[p>>2]|0;c[f>>2]=p+4;p=0;n=m}else{k=0;p=0;n=m}}c[C>>2]=n;v=(k|0)<0;k=v?0-k|0:k;o=v?o|8192:o}else{k=q2(C)|0;if((k|0)<0){j=-1;break}n=c[C>>2]|0}do if((a[n>>0]|0)==46){if((a[n+1>>0]|0)!=42){c[C>>2]=n+1;m=q2(C)|0;n=c[C>>2]|0;break}q=n+2|0;m=(a[q>>0]|0)+-48|0;if(m>>>0<10?(a[n+3>>0]|0)==36:0){c[i+(m<<2)>>2]=10;m=c[g+((a[q>>0]|0)+-48<<3)>>2]|0;n=n+4|0;c[C>>2]=n;break}if(p|0){j=-1;break a}if(x){v=(c[f>>2]|0)+(4-1)&~(4-1);m=c[v>>2]|0;c[f>>2]=v+4}else m=0;c[C>>2]=q;n=q}else m=-1;while(0);t=0;while(1){if(((a[n>>0]|0)+-65|0)>>>0>57){j=-1;break a}v=n+1|0;c[C>>2]=v;q=a[(a[n>>0]|0)+-65+(144946+(t*58|0))>>0]|0;r=q&255;if((r+-1|0)>>>0<8){t=r;n=v}else break}if(!(q<<24>>24)){j=-1;break}s=(u|0)>-1;do if(q<<24>>24==19)if(s){j=-1;break a}else w=49;else{if(s){c[i+(u<<2)>>2]=r;s=g+(u<<3)|0;u=c[s+4>>2]|0;w=E;c[w>>2]=c[s>>2];c[w+4>>2]=u;w=49;break}if(!x){j=0;break a}r2(E,r,f)}while(0);if((w|0)==49?(w=0,!x):0){k=0;e=v;continue}n=a[n>>0]|0;n=(t|0)!=0&(n&15|0)==3?n&-33:n;s=o&-65537;u=(o&8192|0)==0?o:s;e:do switch(n|0){case 110:switch((t&255)<<24>>24){case 0:{c[c[E>>2]>>2]=j;k=0;e=v;continue a}case 1:{c[c[E>>2]>>2]=j;k=0;e=v;continue a}case 2:{k=c[E>>2]|0;c[k>>2]=j;c[k+4>>2]=((j|0)<0)<<31>>31;k=0;e=v;continue a}case 3:{b[c[E>>2]>>1]=j;k=0;e=v;continue a}case 4:{a[c[E>>2]>>0]=j;k=0;e=v;continue a}case 6:{c[c[E>>2]>>2]=j;k=0;e=v;continue a}case 7:{k=c[E>>2]|0;c[k>>2]=j;c[k+4>>2]=((j|0)<0)<<31>>31;k=0;e=v;continue a}default:{k=0;e=v;continue a}}case 112:{n=120;m=m>>>0>8?m:8;e=u|8;w=61;break}case 88:case 120:{e=u;w=61;break}case 111:{n=E;e=c[n>>2]|0;n=c[n+4>>2]|0;r=t2(e,n,y)|0;s=z-r|0;o=0;q=145410;m=(u&8|0)==0|(m|0)>(s|0)?m:s+1|0;s=u;w=67;break}case 105:case 100:{n=E;e=c[n>>2]|0;n=c[n+4>>2]|0;if((n|0)<0){e=t6(0,0,e|0,n|0)|0;n=D;o=E;c[o>>2]=e;c[o+4>>2]=n;o=1;q=145410;w=66;break e}else{o=(u&2049|0)!=0&1;q=(u&2048|0)==0?((u&1|0)==0?145410:145412):145411;w=66;break e}}case 117:{n=E;o=0;q=145410;e=c[n>>2]|0;n=c[n+4>>2]|0;w=66;break}case 99:{a[A>>0]=c[E>>2];e=A;o=0;q=145410;r=y;n=1;m=s;break}case 109:{n=v2(c[(L1()|0)>>2]|0)|0;w=71;break}case 115:{n=c[E>>2]|0;n=n|0?n:145420;w=71;break}case 67:{c[F>>2]=c[E>>2];c[B>>2]=0;c[E>>2]=F;r=-1;n=F;w=75;break}case 83:{e=c[E>>2]|0;if(!m){x2(d,32,k,0,u);e=0;w=84}else{r=m;n=e;w=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{k=z2(d,+h[E>>3],k,m,u,n)|0;e=v;continue a}default:{o=0;q=145410;r=y;n=m;m=u}}while(0);f:do if((w|0)==61){u=E;t=c[u>>2]|0;u=c[u+4>>2]|0;r=s2(t,u,y,n&32)|0;q=(e&8|0)==0|(t|0)==0&(u|0)==0;o=q?0:2;q=q?145410:145410+(n>>4)|0;s=e;e=t;n=u;w=67}else if((w|0)==66){r=u2(e,n,y)|0;s=u;w=67}else if((w|0)==71){w=0;u=w2(n,0,m)|0;t=(u|0)==0;e=n;o=0;q=145410;r=t?n+m|0:u;n=t?m:u-n|0;m=s}else if((w|0)==75){w=0;q=n;e=0;m=0;while(1){o=c[q>>2]|0;if(!o)break;m=y2(G,o)|0;if((m|0)<0|m>>>0>(r-e|0)>>>0)break;e=m+e|0;if(r>>>0>e>>>0)q=q+4|0;else break}if((m|0)<0){j=-1;break a}x2(d,32,k,e,u);if(!e){e=0;w=84}else{o=0;while(1){m=c[n>>2]|0;if(!m){w=84;break f}m=y2(G,m)|0;o=m+o|0;if((o|0)>(e|0)){w=84;break f}p2(d,G,m);if(o>>>0>=e>>>0){w=84;break}else n=n+4|0}}}while(0);if((w|0)==67){w=0;n=(e|0)!=0|(n|0)!=0;u=(m|0)!=0|n;n=((n^1)&1)+(z-r)|0;e=u?r:y;r=y;n=u?((m|0)>(n|0)?m:n):m;m=(m|0)>-1?s&-65537:s}else if((w|0)==84){w=0;x2(d,32,k,e,u^8192);k=(k|0)>(e|0)?k:e;e=v;continue}t=r-e|0;s=(n|0)<(t|0)?t:n;u=s+o|0;k=(k|0)<(u|0)?u:k;x2(d,32,k,u,m);p2(d,q,o);x2(d,48,k,u,m^65536);x2(d,48,s,t,0);p2(d,e,t);x2(d,32,k,u,m^8192);e=v}g:do if((w|0)==87)if(!d)if(!p)j=0;else{j=1;while(1){e=c[i+(j<<2)>>2]|0;if(!e)break;r2(g+(j<<3)|0,e,f);j=j+1|0;if((j|0)>=10){j=1;break g}}while(1){if(c[i+(j<<2)>>2]|0){j=-1;break g}j=j+1|0;if((j|0)>=10){j=1;break}}}while(0);l=H;return j|0}function n2(a){a=a|0;return 0}function o2(a){a=a|0;return}function p2(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))L2(b,d,a)|0;return}function q2(b){b=b|0;var d=0,e=0,f=0;e=c[b>>2]|0;f=(a[e>>0]|0)+-48|0;if(f>>>0<10){d=0;do{d=f+(d*10|0)|0;e=e+1|0;c[b>>2]=e;f=(a[e>>0]|0)+-48|0}while(f>>>0<10)}else d=0;return d|0}function r2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=0;break a}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);b=e;f=c[b>>2]|0;b=c[b+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=f;c[e+4>>2]=b;break a}case 13:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&65535)<<16>>16;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 14:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&65535;c[f+4>>2]=0;break a}case 15:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&255)<<24>>24;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 16:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&255;c[f+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function s2(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;if(!((b|0)==0&(c|0)==0))do{e=e+-1|0;a[e>>0]=d[145458+(b&15)>>0]|0|f;b=z6(b|0,c|0,4)|0;c=D}while(!((b|0)==0&(c|0)==0));return e|0}function t2(b,c,d){b=b|0;c=c|0;d=d|0;if(!((b|0)==0&(c|0)==0))do{d=d+-1|0;a[d>>0]=b&7|48;b=z6(b|0,c|0,3)|0;c=D}while(!((b|0)==0&(c|0)==0));return d|0}function u2(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){while(1){e=J6(b|0,c|0,10,0)|0;d=d+-1|0;a[d>>0]=e&255|48;e=b;b=E6(b|0,c|0,10,0)|0;if(!(c>>>0>9|(c|0)==9&e>>>0>4294967295))break;else c=D}c=b}else c=b;if(c)while(1){d=d+-1|0;a[d>>0]=(c>>>0)%10|0|48;if(c>>>0<10)break;else c=(c>>>0)/10|0}return d|0}function v2(a){a=a|0;return G2(a,c[(F2()|0)+188>>2]|0)|0}function w2(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=d&255;f=(e|0)!=0;a:do if(f&(b&3|0)!=0){g=d&255;while(1){if((a[b>>0]|0)==g<<24>>24){i=6;break a}b=b+1|0;e=e+-1|0;f=(e|0)!=0;if(!(f&(b&3|0)!=0)){i=5;break}}}else i=5;while(0);if((i|0)==5)if(f)i=6;else e=0;b:do if((i|0)==6){g=d&255;if((a[b>>0]|0)!=g<<24>>24){f=S(h,16843009)|0;c:do if(e>>>0>3)while(1){h=c[b>>2]^f;if((h&-2139062144^-2139062144)&h+-16843009|0)break;b=b+4|0;e=e+-4|0;if(e>>>0<=3){i=11;break c}}else i=11;while(0);if((i|0)==11)if(!e){e=0;break}while(1){if((a[b>>0]|0)==g<<24>>24)break b;b=b+1|0;e=e+-1|0;if(!e){e=0;break}}}}while(0);return (e|0?b:0)|0}function x2(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+256|0;f=g;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;u6(f|0,b|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;do{p2(a,f,256);e=e+-256|0}while(e>>>0>255);e=b&255}p2(a,f,e)}l=g;return}function y2(a,b){a=a|0;b=b|0;if(!a)a=0;else a=D2(a,b,0)|0;return a|0}function z2(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0;H=l;l=l+560|0;m=H+8|0;u=H;G=H+524|0;F=G;n=H+512|0;c[u>>2]=0;E=n+12|0;A2(e)|0;if((D|0)<0){e=-e;B=1;A=145427}else{B=(h&2049|0)!=0&1;A=(h&2048|0)==0?((h&1|0)==0?145428:145433):145430}A2(e)|0;C=D&2146435072;do if(C>>>0<2146435072|(C|0)==2146435072&0<0){r=+B2(e,u)*2.0;j=r!=0.0;if(j)c[u>>2]=(c[u>>2]|0)+-1;w=i|32;if((w|0)==97){s=i&32;q=(s|0)==0?A:A+9|0;p=B|2;j=12-g|0;do if(!(g>>>0>11|(j|0)==0)){e=8.0;do{j=j+-1|0;e=e*16.0}while((j|0)!=0);if((a[q>>0]|0)==45){e=-(e+(-r-e));break}else{e=r+e-e;break}}else e=r;while(0);k=c[u>>2]|0;j=(k|0)<0?0-k|0:k;j=u2(j,((j|0)<0)<<31>>31,E)|0;if((j|0)==(E|0)){j=n+11|0;a[j>>0]=48}a[j+-1>>0]=(k>>31&2)+43;o=j+-2|0;a[o>>0]=i+15;n=(g|0)<1;m=(h&8|0)==0;j=G;do{C=~~e;k=j+1|0;a[j>>0]=d[145458+C>>0]|s;e=(e-+(C|0))*16.0;if((k-F|0)==1?!(m&(n&e==0.0)):0){a[k>>0]=46;j=j+2|0}else j=k}while(e!=0.0);C=j-F|0;F=E-o|0;E=(g|0)!=0&(C+-2|0)<(g|0)?g+2|0:C;j=F+p+E|0;x2(b,32,f,j,h);p2(b,q,p);x2(b,48,f,j,h^65536);p2(b,G,C);x2(b,48,E-C|0,0,0);p2(b,o,F);x2(b,32,f,j,h^8192);break}k=(g|0)<0?6:g;if(j){j=(c[u>>2]|0)+-28|0;c[u>>2]=j;e=r*268435456.0}else{e=r;j=c[u>>2]|0}C=(j|0)<0?m:m+288|0;m=C;do{y=~~e>>>0;c[m>>2]=y;m=m+4|0;e=(e-+(y>>>0))*1.0e9}while(e!=0.0);if((j|0)>0){n=C;p=m;while(1){o=(j|0)<29?j:29;j=p+-4|0;if(j>>>0>=n>>>0){m=0;do{x=v6(c[j>>2]|0,0,o|0)|0;x=w6(x|0,D|0,m|0,0)|0;y=D;v=J6(x|0,y|0,1e9,0)|0;c[j>>2]=v;m=E6(x|0,y|0,1e9,0)|0;j=j+-4|0}while(j>>>0>=n>>>0);if(m){n=n+-4|0;c[n>>2]=m}}m=p;while(1){if(m>>>0<=n>>>0)break;j=m+-4|0;if(!(c[j>>2]|0))m=j;else break}j=(c[u>>2]|0)-o|0;c[u>>2]=j;if((j|0)>0)p=m;else break}}else n=C;if((j|0)<0){g=((k+25|0)/9|0)+1|0;t=(w|0)==102;do{s=0-j|0;s=(s|0)<9?s:9;if(n>>>0>>0){o=(1<>>s;q=0;j=n;do{y=c[j>>2]|0;c[j>>2]=(y>>>s)+q;q=S(y&o,p)|0;j=j+4|0}while(j>>>0>>0);j=(c[n>>2]|0)==0?n+4|0:n;if(!q){n=j;j=m}else{c[m>>2]=q;n=j;j=m+4|0}}else{n=(c[n>>2]|0)==0?n+4|0:n;j=m}m=t?C:n;m=(j-m>>2|0)>(g|0)?m+(g<<2)|0:j;j=(c[u>>2]|0)+s|0;c[u>>2]=j}while((j|0)<0);j=n;g=m}else{j=n;g=m}y=C;if(j>>>0>>0){m=(y-j>>2)*9|0;o=c[j>>2]|0;if(o>>>0>=10){n=10;do{n=n*10|0;m=m+1|0}while(o>>>0>=n>>>0)}}else m=0;t=(w|0)==103;v=(k|0)!=0;n=k-((w|0)!=102?m:0)+((v&t)<<31>>31)|0;if((n|0)<(((g-y>>2)*9|0)+-9|0)){n=n+9216|0;s=C+4+(((n|0)/9|0)+-1024<<2)|0;n=((n|0)%9|0)+1|0;if((n|0)<9){o=10;do{o=o*10|0;n=n+1|0}while((n|0)!=9)}else o=10;p=c[s>>2]|0;q=(p>>>0)%(o>>>0)|0;n=(s+4|0)==(g|0);if(!(n&(q|0)==0)){r=(((p>>>0)/(o>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;x=(o|0)/2|0;e=q>>>0>>0?.5:n&(q|0)==(x|0)?1.0:1.5;if(B){x=(a[A>>0]|0)==45;e=x?-e:e;r=x?-r:r}n=p-q|0;c[s>>2]=n;if(r+e!=r){x=n+o|0;c[s>>2]=x;if(x>>>0>999999999){m=s;while(1){n=m+-4|0;c[m>>2]=0;if(n>>>0>>0){j=j+-4|0;c[j>>2]=0}x=(c[n>>2]|0)+1|0;c[n>>2]=x;if(x>>>0>999999999)m=n;else break}}else n=s;m=(y-j>>2)*9|0;p=c[j>>2]|0;if(p>>>0>=10){o=10;do{o=o*10|0;m=m+1|0}while(p>>>0>=o>>>0)}}else n=s}else n=s;n=n+4|0;n=g>>>0>n>>>0?n:g;x=j}else{n=g;x=j}w=n;while(1){if(w>>>0<=x>>>0){u=0;break}j=w+-4|0;if(!(c[j>>2]|0))w=j;else{u=1;break}}g=0-m|0;do if(t){j=((v^1)&1)+k|0;if((j|0)>(m|0)&(m|0)>-5){o=i+-1|0;k=j+-1-m|0}else{o=i+-2|0;k=j+-1|0}j=h&8;if(!j){if(u?(z=c[w+-4>>2]|0,(z|0)!=0):0)if(!((z>>>0)%10|0)){n=0;j=10;do{j=j*10|0;n=n+1|0}while(!((z>>>0)%(j>>>0)|0|0))}else n=0;else n=9;j=((w-y>>2)*9|0)+-9|0;if((o|32|0)==102){s=j-n|0;s=(s|0)>0?s:0;k=(k|0)<(s|0)?k:s;s=0;break}else{s=j+m-n|0;s=(s|0)>0?s:0;k=(k|0)<(s|0)?k:s;s=0;break}}else s=j}else{o=i;s=h&8}while(0);t=k|s;p=(t|0)!=0&1;q=(o|32|0)==102;if(q){v=0;j=(m|0)>0?m:0}else{j=(m|0)<0?g:m;j=u2(j,((j|0)<0)<<31>>31,E)|0;n=E;if((n-j|0)<2)do{j=j+-1|0;a[j>>0]=48}while((n-j|0)<2);a[j+-1>>0]=(m>>31&2)+43;j=j+-2|0;a[j>>0]=o;v=j;j=n-j|0}j=B+1+k+p+j|0;x2(b,32,f,j,h);p2(b,A,B);x2(b,48,f,j,h^65536);if(q){o=x>>>0>C>>>0?C:x;s=G+9|0;p=s;q=G+8|0;n=o;do{m=u2(c[n>>2]|0,0,s)|0;if((n|0)==(o|0)){if((m|0)==(s|0)){a[q>>0]=48;m=q}}else if(m>>>0>G>>>0){u6(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}p2(b,m,p-m|0);n=n+4|0}while(n>>>0<=C>>>0);if(t|0)p2(b,145474,1);if(n>>>0>>0&(k|0)>0)while(1){m=u2(c[n>>2]|0,0,s)|0;if(m>>>0>G>>>0){u6(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}p2(b,m,(k|0)<9?k:9);n=n+4|0;m=k+-9|0;if(!(n>>>0>>0&(k|0)>9)){k=m;break}else k=m}x2(b,48,k+9|0,9,0)}else{t=u?w:x+4|0;if((k|0)>-1){u=G+9|0;s=(s|0)==0;g=u;p=0-F|0;q=G+8|0;o=x;do{m=u2(c[o>>2]|0,0,u)|0;if((m|0)==(u|0)){a[q>>0]=48;m=q}do if((o|0)==(x|0)){n=m+1|0;p2(b,m,1);if(s&(k|0)<1){m=n;break}p2(b,145474,1);m=n}else{if(m>>>0<=G>>>0)break;u6(G|0,48,m+p|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}while(0);F=g-m|0;p2(b,m,(k|0)>(F|0)?F:k);k=k-F|0;o=o+4|0}while(o>>>0>>0&(k|0)>-1)}x2(b,48,k+18|0,18,0);p2(b,v,E-v|0)}x2(b,32,f,j,h^8192)}else{G=(i&32|0)!=0;j=B+3|0;x2(b,32,f,j,h&-65537);p2(b,A,B);p2(b,e!=e|0.0!=0.0?(G?153609:145454):G?145446:145450,3);x2(b,32,f,j,h^8192)}while(0);l=H;return ((j|0)<(f|0)?f:j)|0}function A2(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;D=c[j+4>>2]|0;return b|0}function B2(a,b){a=+a;b=b|0;return +(+C2(a,b))}function C2(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=z6(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){a=+C2(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;a=+h[j>>3]}}return +a}function D2(b,d,e){b=b|0;d=d|0;e=e|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(!(c[c[(E2()|0)+188>>2]>>2]|0))if((d&-128|0)==57216){a[b>>0]=d;b=1;break}else{c[(L1()|0)>>2]=84;b=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[(L1()|0)>>2]=84;b=-1;break}}else b=1;while(0);return b|0}function E2(){return N1()|0}function F2(){return N1()|0}function G2(b,e){b=b|0;e=e|0;var f=0,g=0;g=0;while(1){if((d[145476+g>>0]|0)==(b|0)){b=2;break}f=g+1|0;if((f|0)==87){f=145564;g=87;b=5;break}else g=f}if((b|0)==2)if(!g)f=145564;else{f=145564;b=5}if((b|0)==5)while(1){do{b=f;f=f+1|0}while((a[b>>0]|0)!=0);g=g+-1|0;if(!g)break;else b=5}return H2(f,c[e+20>>2]|0)|0}function H2(a,b){a=a|0;b=b|0;return I2(a,b)|0}function I2(a,b){a=a|0;b=b|0;if(!b)b=0;else b=J2(c[b>>2]|0,c[b+4>>2]|0,a)|0;return (b|0?b:a)|0}function J2(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=(c[b>>2]|0)+1794895138|0;h=K2(c[b+8>>2]|0,o)|0;f=K2(c[b+12>>2]|0,o)|0;g=K2(c[b+16>>2]|0,o)|0;a:do if((h>>>0>>2>>>0?(n=d-(h<<2)|0,f>>>0>>0&g>>>0>>0):0)?((g|f)&3|0)==0:0){n=f>>>2;m=g>>>2;l=0;while(1){j=h>>>1;k=l+j|0;i=k<<1;g=i+n|0;f=K2(c[b+(g<<2)>>2]|0,o)|0;g=K2(c[b+(g+1<<2)>>2]|0,o)|0;if(!(g>>>0>>0&f>>>0<(d-g|0)>>>0)){f=0;break a}if(a[b+(g+f)>>0]|0){f=0;break a}f=f2(e,b+g|0)|0;if(!f)break;f=(f|0)<0;if((h|0)==1){f=0;break a}else{l=f?l:k;h=f?j:h-j|0}}f=i+m|0;g=K2(c[b+(f<<2)>>2]|0,o)|0;f=K2(c[b+(f+1<<2)>>2]|0,o)|0;if(f>>>0>>0&g>>>0<(d-f|0)>>>0)f=(a[b+(f+g)>>0]|0)==0?b+f|0:0;else f=0}else f=0;while(0);return f|0}function K2(a,b){a=a|0;b=b|0;var c=0;c=K6(a|0)|0;return ((b|0)==0?a:c)|0}function L2(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(M2(e)|0)){g=c[f>>2]|0;h=5}else f=0;else h=5;a:do if((h|0)==5){j=e+20|0;i=c[j>>2]|0;f=i;if((g-i|0)>>>0>>0){f=eb[c[e+36>>2]&63](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){i=d;while(1){if(!i){h=0;g=b;break b}g=i+-1|0;if((a[b+g>>0]|0)==10)break;else i=g}f=eb[c[e+36>>2]&63](e,b,i)|0;if(f>>>0>>0)break a;h=i;g=b+i|0;d=d-i|0;f=c[j>>2]|0}else{h=0;g=b}while(0);B6(f|0,g|0,d|0)|0;c[j>>2]=(c[j>>2]|0)+d;f=h+d|0}while(0);return f|0}function M2(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;e=c[b+44>>2]|0;c[b+28>>2]=e;c[b+20>>2]=e;c[b+16>>2]=e+(c[b+48>>2]|0);b=0}else{c[b>>2]=d|32;b=-1}return b|0}function N2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+20|0;f=c[e>>2]|0;a=(c[a+16>>2]|0)-f|0;a=a>>>0>d>>>0?d:a;B6(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function O2(a){a=a|0;return ((a+-48|0)>>>0<10|(P2(a)|0)!=0)&1|0}function P2(a){a=a|0;return ((a|32)+-97|0)>>>0<26|0}function Q2(a){a=a|0;return ((a|0)==32|(a|0)==9)&1|0}function R2(a){a=a|0;if(!(S2(a)|0))a=(T2(a)|0)!=0;else a=1;return a&1|0}function S2(a){a=a|0;return (a+-48|0)>>>0<10|0}function T2(a){a=a|0;if(a>>>0<131072)a=(d[147368+((d[147368+(a>>>8)>>0]|0)<<5|a>>>3&31)>>0]|0)>>>(a&7)&1;else a=a>>>0<196606&1;return a|0}function U2(a){a=a|0;return Q2(a)|0}function V2(a){a=a|0;return ((a+-65529|0)>>>0<3|((a&-2|0)==8232|(a>>>0<32|(a+-127|0)>>>0<33)))&1|0}function W2(a,b){a=a|0;b=b|0;do switch(b|0){case 1:{a=R2(a)|0;break}case 2:{a=T2(a)|0;break}case 3:{a=U2(a)|0;break}case 4:{a=V2(a)|0;break}case 5:{a=S2(a)|0;break}case 6:{a=X2(a)|0;break}case 7:{a=Y2(a)|0;break}case 8:{a=Z2(a)|0;break}case 9:{a=_2(a)|0;break}case 10:{a=$2(a)|0;break}case 11:{a=a3(a)|0;break}case 12:{a=b3(a)|0;break}default:a=0}while(0);return a|0}function X2(a){a=a|0;if(!($2(a)|0))a=(Z2(a)|0)!=0;else a=0;return a&1|0}function Y2(a){a=a|0;return (g3(a)|0)!=(a|0)|0}function Z2(a){a=a|0;if(a>>>0>=255)if((a+-57344|0)>>>0<8185|(a>>>0<8232|(a+-8234|0)>>>0<47062))a=1;else return (a&65534|0)!=65534&(a+-65532|0)>>>0<1048580&1|0;else a=(a+1&127)>>>0>32&1;return a|0}function _2(a){a=a|0;if(a>>>0<131072)a=(d[150344+((d[150344+(a>>>8)>>0]|0)<<5|a>>>3&31)>>0]|0)>>>(a&7)&1;else a=0;return a|0}function $2(a){a=a|0;if(!a)a=0;else a=(e3(63616,a)|0)!=0;return a&1|0}function a3(a){a=a|0;return (c3(a)|0)!=(a|0)|0}function b3(a){a=a|0;return ((a+-48|0)>>>0<10|((a|32)+-97|0)>>>0<6)&1|0}function c3(a){a=a|0;return d3(a,1)|0}function d3(c,f){c=c|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=(f<<1)+-1|0;l=f+-1|0;a:do if(!((c+-43008|0)>>>0<22272|((c+-11776|0)>>>0<30784|((c+-1536|0)>>>0<2560|(T2(c)|0)==0)))){g=(f|0)!=0;if(g&(c+-4256|0)>>>0<46){if((c|0)>4293)switch(c|0){case 4295:case 4301:break;default:break a}c=c+7264|0;break}if((c+-11520|0)>>>0<38&(g^1)){c=c+-7264|0;break}else g=0;do{i=a[66618+(g<<2)+2>>0]|0;j=i<<24>>24;h=c-(e[66618+(g<<2)>>1]|0)|0;if((h-(j&l)|0)>>>0<(d[66618+(g<<2)+3>>0]|0)>>>0){m=11;break}g=g+1|0}while((g|0)!=61);if((m|0)==11)if(i<<24>>24==1){c=f+c-(h&1)|0;break}else{c=(S(j,k)|0)+c|0;break}i=1-f|0;g=b[66130+(i<<1)>>1]|0;b:do if(g<<16>>16){h=0;while(1){if((g&65535|0)==(c|0))break;h=h+1|0;g=b[66130+(h<<2)+(i<<1)>>1]|0;if(!(g<<16>>16))break b}c=e[66130+(h<<2)+(f<<1)>>1]|0;break a}while(0);return ((c+-66600+(f*40|0)|0)>>>0<40?c+-40+(f*80|0)|0:c)|0}while(0);return c|0}function e3(a,b){a=a|0;b=b|0;var d=0,e=0;if(!b)a=a+((f3(a)|0)<<2)|0;else{while(1){e=c[a>>2]|0;d=(e|0)!=0;if((e|0)==(b|0)|d^1)break;else a=a+4|0}a=d?a:0}return a|0}function f3(a){a=a|0;var b=0;b=a;while(1)if(!(c[b>>2]|0))break;else b=b+4|0;return b-a>>2|0}function g3(a){a=a|0;return d3(a,0)|0}function h3(b){b=b|0;var c=0,d=0,e=0,f=0;e=a[b>>0]|0;c=1;d=153512;f=97;while(1){if(e<<24>>24==f<<24>>24?(f2(b,d)|0)==0:0)break;d=d+6|0;f=a[d>>0]|0;if(!(f<<24>>24)){c=0;break}else c=c+1|0}return c|0}function i3(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+48|0;f=g+40|0;e=g+8|0;d=g;c[d>>2]=a;c[d+4>>2]=b;d=Ha(197,d|0)|0;if((d|0)==-9?(c[e>>2]=a,c[e+4>>2]=1,(ua(221,e|0)|0)>=0):0){j3(e,a);c[f>>2]=e;c[f+4>>2]=b;b=K1(Ja(195,f|0)|0)|0}else b=K1(d)|0;l=g;return b|0}function j3(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;d=b;e=153585;f=d+15|0;do{a[d>>0]=a[e>>0]|0;d=d+1|0;e=e+1|0}while((d|0)<(f|0));if(!c){a[b+14>>0]=48;a[b+15>>0]=0}else{e=c;d=14;while(1){d=d+1|0;if(e>>>0<10)break;else e=(e>>>0)/10|0}a[b+d>>0]=0;while(1){d=d+-1|0;a[b+d>>0]=(c>>>0)%10|0|48;if(c>>>0<10)break;else c=(c>>>0)/10|0}}return}function k3(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+208|0;j=m+8|0;k=m;h=S(d,b)|0;i=k;c[i>>2]=1;c[i+4>>2]=0;a:do if(h|0){i=0-d|0;c[j+4>>2]=d;c[j>>2]=d;f=2;b=d;g=d;while(1){b=b+d+g|0;c[j+(f<<2)>>2]=b;if(b>>>0>>0){n=g;f=f+1|0;g=b;b=n}else break}g=a+h+i|0;if(g>>>0>a>>>0){h=g;f=1;b=1;do{do if((b&3|0)!=3){b=f+-1|0;if((c[j+(b<<2)>>2]|0)>>>0<(h-a|0)>>>0)l3(a,d,e,f,j);else n3(a,d,e,k,f,0,j);if((f|0)==1){o3(k,1);f=0;break}else{o3(k,b);f=1;break}}else{l3(a,d,e,f,j);m3(k,2);f=f+2|0}while(0);b=c[k>>2]|1;c[k>>2]=b;a=a+d|0}while(a>>>0>>0)}else{f=1;b=1}n3(a,d,e,k,f,0,j);g=k+4|0;while(1){if((f|0)==1&(b|0)==1){if(!(c[g>>2]|0))break a}else if((f|0)>=2){o3(k,2);n=f+-2|0;c[k>>2]=c[k>>2]^7;m3(k,1);n3(a+(0-(c[j+(n<<2)>>2]|0))+i|0,d,e,k,f+-1|0,1,j);o3(k,1);b=c[k>>2]|1;c[k>>2]=b;h=a+i|0;n3(h,d,e,k,n,1,j);a=h;f=n;continue}b=p3(k)|0;m3(k,b);a=a+i|0;f=b+f|0;b=c[k>>2]|0}}while(0);l=m;return}function l3(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+240|0;m=n;c[m>>2]=a;a:do if((e|0)>1){k=0-b|0;g=a;j=e;e=1;while(1){h=g+k|0;i=j+-2|0;g=h+(0-(c[f+(i<<2)>>2]|0))|0;if((vb[d&127](a,g)|0)>-1?(vb[d&127](a,h)|0)>-1:0)break a;a=e+1|0;e=m+(e<<2)|0;if((vb[d&127](g,h)|0)>-1){c[e>>2]=g;e=j+-1|0}else{c[e>>2]=h;g=h;e=i}if((e|0)<=1){e=a;break a}j=e;e=a;a=c[m>>2]|0}}else e=1;while(0);r3(b,m,e);l=n;return}function m3(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+4|0;if(b>>>0>31){e=c[f>>2]|0;c[a>>2]=e;c[f>>2]=0;b=b+-32|0;d=0}else{d=c[f>>2]|0;e=c[a>>2]|0}c[a>>2]=d<<32-b|e>>>b;c[f>>2]=d>>>b;return}function n3(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+240|0;n=p+232|0;o=p;q=c[e>>2]|0;c[n>>2]=q;j=c[e+4>>2]|0;k=n+4|0;c[k>>2]=j;c[o>>2]=a;a:do if((q|0)!=1|(j|0)!=0?(m=0-b|0,i=a+(0-(c[h+(f<<2)>>2]|0))|0,(vb[d&127](i,a)|0)>=1):0){e=1;g=(g|0)==0;j=i;while(1){if(g&(f|0)>1){g=a+m|0;i=c[h+(f+-2<<2)>>2]|0;if((vb[d&127](g,j)|0)>-1){i=10;break a}if((vb[d&127](g+(0-i)|0,j)|0)>-1){i=10;break a}}g=e+1|0;c[o+(e<<2)>>2]=j;q=p3(n)|0;m3(n,q);f=q+f|0;if(!((c[n>>2]|0)!=1|(c[k>>2]|0)!=0)){e=g;a=j;i=10;break a}a=j+(0-(c[h+(f<<2)>>2]|0))|0;if((vb[d&127](a,c[o>>2]|0)|0)<1){a=j;e=g;g=0;i=9;break}else{q=j;e=g;g=1;j=a;a=q}}}else{e=1;i=9}while(0);if((i|0)==9?(g|0)==0:0)i=10;if((i|0)==10){r3(b,o,e);l3(a,b,d,f,h)}l=p;return}function o3(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+4|0;if(b>>>0>31){e=c[a>>2]|0;c[f>>2]=e;c[a>>2]=0;b=b+-32|0;d=0}else{d=c[a>>2]|0;e=c[f>>2]|0}c[f>>2]=d>>>(32-b|0)|e<>2]=d<>2]|0)+-1|0)|0;if(!b){b=q3(c[a+4>>2]|0)|0;return ((b|0)==0?0:b+32|0)|0}else return b|0;return 0}function q3(a){a=a|0;var b=0;if(a)if(!(a&1)){b=a;a=0;do{a=a+1|0;b=b>>>1}while(!(b&1|0))}else a=0;else a=32;return a|0} -function yb(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function zb(){return l|0}function Ab(a){a=a|0;l=a}function Bb(a,b){a=a|0;b=b|0;l=a;m=b}function Cb(a,b){a=a|0;b=b|0;if(!o){o=a;p=b}}function Db(a){a=a|0;D=a}function Eb(){return D|0}function Fb(a){a=a|0;c[46696]=a;return 0}function Gb(){return c[46696]|0}function Hb(a,b){a=a|0;b=b|0;Sa(0,a|0,b|0)|0;return}function Ib(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=i+4|0;g=i;c[f>>2]=0;h=kG()|0;pG(h,11016);pG(h,17260);pG(h,17480);cA(1)|0;bA(18)|0;while(1){a=WB(a)|0;e=c[f>>2]|0;if(!a)break;if(e|0){a=195341;continue}lG(h,a,d)|0;oG(h,a,b,f,g)|0;a=195341}l=i;return e|0}function Jb(a){a=a|0;var d=0,e=0,f=0,g=0;g=l;l=l+16|0;d=g+4|0;e=g;f=c[(c[a+16>>2]|0)+8>>2]|0;a=a+64|0;switch(c[a>>2]|0){case 0:{HL(f);break}case 1:{if(b[(c[f+16>>2]|0)+136>>1]&1)SP(f);break}case 4:case 5:case 6:{EL(f,e,d);Mb(f,c[e>>2]|0,c[d>>2]|0,c[a>>2]|0);break}default:{}}l=g;return}function Kb(a){a=a|0;var b=0,d=0,e=0,f=0;e=c[(c[a+16>>2]|0)+8>>2]|0;if(!(c[46697]|0)){c[46697]=c[4689];c[46698]=57;c[46699]=19}f=e+64|0;d=(c[f>>2]|0)+8|0;b=c[d>>2]|0;c[d>>2]=186788;d=a+152|0;switch(c[a+64>>2]|0){case 2:{uL(a,e,a,0);break}case 3:{uL(a,e,a,1);break}case 1:case 0:{if(!(c[d>>2]&134217728))bE(e,a)|0;break}case 6:case 5:case 4:{Lb(e);if(!(c[d>>2]&134217728))bE(e,a)|0;break}default:{}}c[(c[f>>2]|0)+8>>2]=b;return}function Lb(b){b=b|0;var d=0,e=0;d=c[46701]|0;if((d|0)!=(c[46700]|0)){e=c[c[46732]>>2]|0;if(!e){e=YP(b,0,100109,195341)|0;c[c[46732]>>2]=e;d=c[46701]|0}if(d>>>0>=(c[46702]|0)>>>0){iA(186800,1)|0;d=c[46701]|0}a[d>>0]=0;d=c[46700]|0;c[46701]=d;HA(b,e,d)|0}if(c[(c[b+16>>2]|0)+12>>2]|0){e=c[(c[46732]|0)+4>>2]|0;d=c[46717]|0;if(d>>>0>=(c[46718]|0)>>>0){iA(186864,1)|0;d=c[46717]|0}a[d>>0]=0;d=c[46716]|0;c[46717]=d;HA(b,e,d)|0}QA(b,67025,c[(c[46732]|0)+8236>>2]|0,195341)|0;d=0;while(1){if((d|0)==8)break;lA(186800+(d<<4)|0);d=d+1|0}l6(c[46732]|0);h[1]=1.0;h[5]=1.0;c[46733]=0;c[46737]=0;return}function Mb(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=k6(8240)|0;c[46732]=j;h=j+8232|0;a:do switch(g|0){case 6:{b[h>>1]=14;g=67041;h=j;break}case 5:{b[h>>1]=12;g=67045;h=j;break}default:{g=NA(d,67025)|0;if((g|0?a[g>>0]|0:0)?(i=Nb(g)|0,(i&65535)>10):0){h=c[46732]|0;b[h+8232>>1]=i;break a}g=Nb(67037)|0;h=c[46732]|0;b[h+8232>>1]=g;g=67037}}while(0);c[h+8236>>2]=g;j=d+16|0;g=c[j>>2]|0;if(!(c[g+180>>2]|0))i=0;else{i=YP(d,0,100109,195341)|0;h=c[46732]|0;g=c[j>>2]|0}c[h>>2]=i;if(!(a[g+113>>0]&8))g=0;else g=YP(d,0,67049,195341)|0;c[(c[46732]|0)+4>>2]=g;i=YP(d,1,100109,195341)|0;c[(c[46732]|0)+8>>2]=i;i=YP(d,1,67049,195341)|0;c[(c[46732]|0)+12>>2]=i;i=YP(d,2,100109,195341)|0;g=c[46732]|0;c[g+16>>2]=i;if(!f)h=0;else{h=YP(d,2,67057,195341)|0;g=c[46732]|0}c[g+20>>2]=h;if(!e)h=0;else{h=YP(d,2,67065,195341)|0;g=c[46732]|0}c[g+24>>2]=h;h=a[(c[j>>2]|0)+113>>0]|0;if(!(h&33))i=0;else{i=YP(d,2,67049,195341)|0;g=c[46732]|0;h=a[(c[j>>2]|0)+113>>0]|0}c[g+28>>2]=i;if(!(h&2))i=0;else{i=YP(d,2,67073,195341)|0;g=c[46732]|0;h=a[(c[j>>2]|0)+113>>0]|0}c[g+32>>2]=i;if(!(h&4))h=0;else{h=YP(d,2,67082,195341)|0;g=c[46732]|0}c[g+36>>2]=h;g=0;while(1){if((g|0)==8)break;hA(186800+(g<<4)|0,1024,(c[46732]|0)+40+(g<<10)|0);g=g+1|0}return}function Nb(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+1040|0;h=j;i=j+8|0;g=0;d=b;a:while(1){e=d;do{f=e;e=e+1|0;f=a[f>>0]|0;if(!(f<<24>>24)){e=8;break a}}while(((f<<24>>24)+-48|0)>>>0>=10);d=i+g|0;if((g|0)>=1023){e=7;break}a[d>>0]=f;g=g+1|0;d=e}if((e|0)==7){c[h>>2]=b;dA(0,67091,h)|0}else if((e|0)==8)d=i+g|0;a[d>>0]=0;i=(d6(i)|0)&65535;l=j;return i|0}function Ob(b){b=b|0;var d=0,e=0;e=c[(c[b+16>>2]|0)+8>>2]|0;d=c[c[46732]>>2]|0;b=c[46705]|0;if(b>>>0>=(c[46706]|0)>>>0){iA(186816,1)|0;b=c[46705]|0}a[b>>0]=0;b=c[46704]|0;c[46705]=b;HA(e,d,b)|0;if(c[(c[e+16>>2]|0)+12>>2]|0){d=c[(c[46732]|0)+4>>2]|0;b=c[46721]|0;if(b>>>0>=(c[46722]|0)>>>0){iA(186880,1)|0;b=c[46721]|0}a[b>>0]=0;b=c[46720]|0;c[46721]=b;HA(e,d,b)|0}h[2]=1.0;h[6]=1.0;c[46734]=0;c[46738]=0;return}function Pb(b){b=b|0;var d=0,e=0;e=c[(c[b+16>>2]|0)+8>>2]|0;b=c[46705]|0;if((b|0)!=(c[46704]|0)){d=c[(c[46732]|0)+8>>2]|0;if(b>>>0>=(c[46706]|0)>>>0){iA(186816,1)|0;b=c[46705]|0}a[b>>0]=0;b=c[46704]|0;c[46705]=b;HA(e,d,b)|0}b=c[46721]|0;if((b|0)!=(c[46720]|0)){d=c[(c[46732]|0)+12>>2]|0;if(b>>>0>=(c[46722]|0)>>>0){iA(186880,1)|0;b=c[46721]|0}a[b>>0]=0;b=c[46720]|0;c[46721]=b;HA(e,d,b)|0}h[9]=1.0;h[11]=1.0;c[46741]=0;c[46743]=0;return}function Qb(b){b=b|0;var d=0,e=0;e=c[(c[b+16>>2]|0)+8>>2]|0;b=c[46705]|0;if((b|0)!=(c[46704]|0)){d=c[(c[46732]|0)+16>>2]|0;if(b>>>0>=(c[46706]|0)>>>0){iA(186816,1)|0;b=c[46705]|0}a[b>>0]=0;b=c[46704]|0;c[46705]=b;HA(e,d,b)|0}b=c[46709]|0;if((b|0)!=(c[46708]|0)){d=c[(c[46732]|0)+24>>2]|0;if(b>>>0>=(c[46710]|0)>>>0){iA(186832,1)|0;b=c[46709]|0}a[b>>0]=0;b=c[46708]|0;c[46709]=b;HA(e,d,b)|0}b=c[46713]|0;if((b|0)!=(c[46712]|0)){d=c[(c[46732]|0)+20>>2]|0;if(b>>>0>=(c[46714]|0)>>>0){iA(186848,1)|0;b=c[46713]|0}a[b>>0]=0;b=c[46712]|0;c[46713]=b;HA(e,d,b)|0}b=c[46721]|0;if((b|0)!=(c[46720]|0)){d=c[(c[46732]|0)+28>>2]|0;if(b>>>0>=(c[46722]|0)>>>0){iA(186880,1)|0;b=c[46721]|0}a[b>>0]=0;b=c[46720]|0;c[46721]=b;HA(e,d,b)|0}b=c[46725]|0;if((b|0)!=(c[46724]|0)){d=c[(c[46732]|0)+36>>2]|0;if(b>>>0>=(c[46726]|0)>>>0){iA(186896,1)|0;b=c[46725]|0}a[b>>0]=0;b=c[46724]|0;c[46725]=b;HA(e,d,b)|0}b=c[46729]|0;if((b|0)!=(c[46728]|0)){d=c[(c[46732]|0)+32>>2]|0;if(b>>>0>=(c[46730]|0)>>>0){iA(186912,1)|0;b=c[46729]|0}a[b>>0]=0;b=c[46728]|0;c[46729]=b;HA(e,d,b)|0}h[10]=1.0;h[12]=1.0;h[3]=1.0;h[4]=1.0;h[7]=1.0;h[8]=1.0;c[46742]=0;c[46744]=0;c[46735]=0;c[46736]=0;c[46739]=0;c[46740]=0;return}function Rb(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+1056|0;j=t+16|0;s=t+8|0;r=t;k=t+32|0;o=c[(c[d+16>>2]|0)+12>>2]|0;p=c[11456+(o<<2)>>2]|0;kA(p,67188)|0;g=f+4|0;_b(k,+h[(c[g>>2]|0)+16>>3]);kA(p,k)|0;bc(d,195341,c[c[g>>2]>>2]|0);Xb(d);q=a[f+48>>0]|0;q=q<<24>>24==108?-1:q<<24>>24==114&1;g=c[g>>2]|0;if(!g)g=0;else g=c[g+24>>2]&127;i=b[(c[46732]|0)+8232>>1]|0;if((i&65535)>14?(m=c[11504+((i&65535)+-15<<2)>>2]&g,n=186932+(o<<2)|0,(c[n>>2]|0)!=(m|0)):0){c[r>>2]=m;i2(k,67191,r)|0;kA(p,k)|0;c[n>>2]=m}r=e+8|0;h[r>>3]=+h[f+24>>3]+ +h[r>>3];kA(p,67197)|0;c[j>>2]=c[e>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];c[j+12>>2]=c[e+12>>2];Zb(p,j);c[s>>2]=q;i2(k,102521,s)|0;kA(p,k)|0;_b(k,+h[f+32>>3]);kA(p,k)|0;bc(d,195341,c[f>>2]|0);l=t;return}function Sb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0;i=l;l=l+1040|0;f=i;g=i+16|0;e=c[(c[a+16>>2]|0)+12>>2]|0;Wb(a);Xb(a);e=11456+(e<<2)|0;if(!d){a=c[e>>2]|0;kA(a,67185)|0}else{if((d|1|0)==3)dc(a,d,b,2);else ec(a);a=c[e>>2]|0;kA(a,67182)|0};c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];Zb(a,f);_b(g,+h[b+16>>3]-+h[b>>3]);kA(a,g)|0;_b(g,+h[b+24>>3]-+h[b+8>>3]);kA(a,g)|0;l=i;return}function Tb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Wb(a);Xb(a);if(!d)Yb(a,112,b,c);else{if((d|1|0)==3)dc(a,d,b,c);else ec(a);Yb(a,80,b,c)}return}function Ub(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Wb(a);Xb(a);if(!f)Yb(a,66,b,c);else{if((f|1|0)==3)dc(a,f,b,c);else ec(a);Yb(a,98,b,c)}return}function Vb(a,b,c){a=a|0;b=b|0;c=c|0;Wb(a);Xb(a);Yb(a,76,b,c);return}function Wb(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+1184|0;i=n;f=n+24|0;m=n+8|0;hA(m,1024,n+152|0);j=b+16|0;d=c[j>>2]|0;g=+h[d+152>>3];e=8+(c[d+12>>2]<<3)|0;if(g!=+h[e>>3]){h[e>>3]=g;kA(m,67154)|0;h[i>>3]=+h[(c[j>>2]|0)+152>>3];i2(f,67168,i)|0;$b(f,0);kA(m,f)|0;f=m+4|0;d=c[f>>2]|0;e=m+8|0;if(d>>>0>=(c[e>>2]|0)>>>0){iA(m,1)|0;d=c[f>>2]|0}c[f>>2]=d+1;a[d>>0]=41;d=c[f>>2]|0;if(d>>>0>=(c[e>>2]|0)>>>0){iA(m,1)|0;d=c[f>>2]|0}a[d>>0]=0;d=c[m>>2]|0;c[f>>2]=d;bc(b,67173,d);d=c[j>>2]|0}d=c[d+160>>2]|0;if(d|0){j=m+4|0;k=m+8|0;a:while(1){i=d+4|0;d=c[d>>2]|0;if(!d)break;switch(a[d>>0]|0){case 102:{if(!(f2(d,111402)|0)){d=i;continue a}break}case 98:{if(!(f2(d,111384)|0)){d=i;continue a}break}case 115:{if(!(f2(d,111389)|0)){d=i;continue a}break}default:{}}kA(m,d)|0;do{f=d;d=d+1|0}while((a[f>>0]|0)!=0);if(a[d>>0]|0){e=c[j>>2]|0;if(e>>>0>=(c[k>>2]|0)>>>0){iA(m,1)|0;e=c[j>>2]|0}c[j>>2]=e+1;a[e>>0]=40;f=0;while(1){if(!(a[d>>0]|0))break;if(f|0){e=c[j>>2]|0;if(e>>>0>=(c[k>>2]|0)>>>0){iA(m,1)|0;e=c[j>>2]|0}c[j>>2]=e+1;a[e>>0]=44}kA(m,d)|0;do{e=d;d=d+1|0}while((a[e>>0]|0)!=0);f=f+1|0}d=c[j>>2]|0;if(d>>>0>=(c[k>>2]|0)>>>0){iA(m,1)|0;d=c[j>>2]|0}c[j>>2]=d+1;a[d>>0]=41}d=c[j>>2]|0;if(d>>>0>=(c[k>>2]|0)>>>0){iA(m,1)|0;d=c[j>>2]|0}a[d>>0]=0;d=c[m>>2]|0;c[j>>2]=d;bc(b,67173,d);d=i}lA(m)}l=n;return}function Xb(a){a=a|0;ac((c[a+16>>2]|0)+16|0);bc(a,76106,194038);return}function Yb(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=l;l=l+1040|0;j=k;i=k+16|0;h=c[11456+(c[(c[b+16>>2]|0)+12>>2]<<2)>>2]|0;g=h+4|0;b=c[g>>2]|0;if(b>>>0>=(c[h+8>>2]|0)>>>0){iA(h,1)|0;b=c[g>>2]|0}c[g>>2]=b+1;a[b>>0]=d;c[j>>2]=f;i2(i,67118,j)|0;kA(h,i)|0;b=0;while(1){if((b|0)>=(f|0))break;i=e+(b<<4)|0;c[j>>2]=c[i>>2];c[j+4>>2]=c[i+4>>2];c[j+8>>2]=c[i+8>>2];c[j+12>>2]=c[i+12>>2];Zb(h,j);b=b+1|0}l=k;return}function Zb(a,b){a=a|0;b=b|0;var c=0,d=0;c=l;l=l+1024|0;d=c;_b(d,+h[b>>3]);kA(a,d)|0;_b(d,+tL(+h[b+8>>3]));kA(a,d)|0;l=c;return}function _b(a,b){a=a|0;b=+b;var c=0,d=0;c=l;l=l+16|0;d=c;h[d>>3]=b>-1.0e-08&b<1.0e-08?0.0:b;i2(a,67123,d)|0;$b(a,1);l=c;return}function $b(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;d=F3(b,46)|0;e=(c|0)!=0;if(!d){if(e){d=b+(D3(b)|0)|0;f=10}}else{while(1){c=d+1|0;if(!(a[c>>0]|0))break;else d=c}a:while(1){switch(a[d>>0]|0){case 46:{f=5;break a}case 48:break;default:{f=6;break a}}a[d>>0]=0;d=d+-1|0}if((f|0)==5)a[d>>0]=0;else if((f|0)==6)d=d+1|0;if(e)f=10}if((f|0)==10){a[d>>0]=32;a[d+1>>0]=0}return}function ac(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+32|0;i=j+16|0;h=j;e=a[b+3>>0]|0;f=d[b>>0]|0;g=d[b+1>>0]|0;b=d[b+2>>0]|0;if(e<<24>>24==-1){c[h>>2]=f;c[h+4>>2]=g;c[h+8>>2]=b;i2(194038,75986,h)|0}else{c[i>>2]=f;c[i+4>>2]=g;c[i+8>>2]=b;c[i+12>>2]=e&255;i2(194038,67136,i)|0}l=j;return}function bc(a,b,d){a=a|0;b=b|0;d=d|0;cc(c[11456+(c[(c[a+16>>2]|0)+12>>2]<<2)>>2]|0,b,d);return}function cc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=l;l=l+1040|0;h=f;g=f+8|0;i=D3(e)|0;c[h>>2]=d;c[h+4>>2]=i;i2(g,67129,h)|0;kA(b,g)|0;kA(b,e)|0;e=b+4|0;d=c[e>>2]|0;if(d>>>0>=(c[b+8>>2]|0)>>>0){iA(b,1)|0;d=c[e>>2]|0}c[e>>2]=d+1;a[d>>0]=32;l=f;return}function dc(b,d,f,i){b=b|0;d=d|0;f=f|0;i=i|0;var j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+1120|0;s=w+64|0;v=w+80|0;k=w+32|0;q=w+16|0;r=w;t=c[b+16>>2]|0;j=+(c[t+136>>2]|0)*3.141592653589793/180.0;if((e[(c[46732]|0)+8232>>1]|0)<14)ec(b);else{hA(v,1024,w+96|0);u=(d|0)==2;if(u){nQ(f,k,i,j,2);f=v+4|0;d=c[f>>2]|0;if(d>>>0>=(c[v+8>>2]|0)>>>0){iA(v,1)|0;d=c[f>>2]|0}c[f>>2]=d+1;a[d>>0]=91;c[s>>2]=c[k>>2];c[s+4>>2]=c[k+4>>2];c[s+8>>2]=c[k+8>>2];c[s+12>>2]=c[k+12>>2];Zb(v,s);r=k+16|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];Zb(v,s)}else{nQ(f,k,i,0.0,3);p=+h[k+24>>3];n=+h[k>>3];m=+h[k+8>>3];o=p*.25;if(j==0.0){h[q>>3]=n;j=m}else{h[q>>3]=n+o*+I(+j);j=m+o*+J(+j)}h[q+8>>3]=j;h[r>>3]=n;h[r+8>>3]=m;f=v+4|0;d=c[f>>2]|0;if(d>>>0>=(c[v+8>>2]|0)>>>0){iA(v,1)|0;d=c[f>>2]|0}c[f>>2]=d+1;a[d>>0]=40;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];Zb(v,s);fc(v,o);c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];Zb(v,s);fc(v,p)}kA(v,67179)|0;f=t+140|0;j=+g[f>>2];i=t+56|0;d=t+96|0;if(j>0.0){gc(v,j,i);gc(v,+g[f>>2],d)}else{gc(v,0.0,i);gc(v,1.0,d)}mA(v)|0;k=v+4|0;d=c[k>>2]|0;i=v+8|0;f=d>>>0>=(c[i>>2]|0)>>>0;if(u){if(f){iA(v,1)|0;d=c[k>>2]|0}c[k>>2]=d+1;a[d>>0]=93}else{if(f){iA(v,1)|0;d=c[k>>2]|0}c[k>>2]=d+1;a[d>>0]=41}d=c[k>>2]|0;if(d>>>0>=(c[i>>2]|0)>>>0){iA(v,1)|0;d=c[k>>2]|0}a[d>>0]=0;u=c[v>>2]|0;c[k>>2]=u;bc(b,67176,u);lA(v)}l=w;return}function ec(a){a=a|0;ac((c[a+16>>2]|0)+56|0);bc(a,67176,194038);return}function fc(a,b){a=a|0;b=+b;var c=0,d=0;c=l;l=l+1024|0;d=c;_b(d,b);kA(a,d)|0;l=c;return}function gc(a,b,c){a=a|0;b=+b;c=c|0;var d=0,e=0,f=0;d=l;l=l+1040|0;f=d;e=d+8|0;h[f>>3]=b;i2(e,94469,f)|0;$b(e,1);ac(c);cc(a,e,194038);l=d;return}function hc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0;e=l;l=l+1040|0;i=e;f=e+16|0;g=c[11456+(c[(c[a+16>>2]|0)+12>>2]<<2)>>2]|0;kA(g,67285)|0;c[i>>2]=c[d>>2];c[i+4>>2]=c[d+4>>2];c[i+8>>2]=c[d+8>>2];c[i+12>>2]=c[d+12>>2];Zb(g,i);_b(f,+h[d+16>>3]-+h[d>>3]);kA(g,f)|0;_b(f,+h[d+24>>3]-+h[d+8>>3]);kA(g,f)|0;bc(a,195341,c[b+8>>2]|0);l=e;return}function ic(a){a=a|0;var b=0;switch(c[a+64>>2]|0){case 0:{b=yF(c[a>>2]|0)|0;mG(b,c[(c[a+16>>2]|0)+8>>2]|0,68069,0)|0;zF(b);break}case 1:{HL(c[(c[a>>2]|0)+168>>2]|0);break}default:{}}return}function jc(b){b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+16|0;d=f;e=c[(c[b+16>>2]|0)+8>>2]|0;if(!(c[46745]|0)){c[46745]=c[4689];c[46746]=57;c[46747]=19}c[(c[e+64>>2]|0)+8>>2]=186980;kc(e,1);c[d>>2]=0;a[d+4>>0]=(a[(c[e+16>>2]|0)+115>>0]|0)==1&1;g=c[b+64>>2]|0;a[d+5>>0]=((g|0)==0|(g|0)==3)&1;a[d+6>>0]=0;lc(e,b,1,d);l=f;return}function kc(a,b){a=a|0;b=b|0;var d=0;c[a>>2]=c[a>>2]&-9;d=MD(a)|0;while(1){if(!d)break;kc(d,0);d=ND(d)|0}a:do if(b|0){b=gC(a)|0;while(1){if(!b)break a;c[b>>2]=c[b>>2]&-9;d=UA(a,b)|0;while(1){if(!d)break;c[d>>2]=c[d>>2]&-9;d=WA(a,d)|0}b=hC(a,b)|0}}while(0);return}function lc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q+8|0;o=q;n=(d|0)!=0;if(n){m=Sz(11876,c[4591]|0)|0;WC(a,1,141363,12,0);WC(a,2,141363,12,0);WC(a,0,141363,-12,0);f=mc(a,0,m)|0;j=gC(a)|0;i=0;g=0;while(1){if(!j)break;if(!(h2(HB(j)|0,108307,7)|0)){k=g;g=nc(m,HB(j)|0)|0}else{k=g+1|0;g=g+f|0}c[(PC(j,141363,0)|0)+8>>2]=g;h=UA(a,j)|0;g=i;while(1){if(!h)break;c[(PC(h,141363,0)|0)+8>>2]=g;h=WA(a,h)|0;g=g+1|0}j=hC(a,j)|0;i=g;g=k}Oz(m)|0}else f=0;m=c[e>>2]|0;c[e>>2]=m+1;oc(b,m);mF(b,97675)|0;pc(a,b,d,e);qc(a,b,e);mF(b,97646)|0;oc(b,c[e>>2]|0);if(n){c[o>>2]=f;sF(b,67288,o)}else{c[p>>2]=c[(PC(a,141363,0)|0)+8>>2];sF(b,67308,p)}sc(a,b,d,rc(a,b,d,e)|0,e);tc(a,b,d,e);mF(b,153748)|0;p=(c[e>>2]|0)+-1|0;c[e>>2]=p;oc(b,p);if(n)mF(b,111309)|0;else mF(b,75629)|0;l=q;return}function mc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((vC(a)|0)!=(a|0)){e=b+1|0;c[(PC(a,141363,0)|0)+8>>2]=b;if(!(h2(HB(a)|0,108307,7)|0)){b=HB(a)|0;Fc(d,b,c[(PC(a,141363,0)|0)+8>>2]|0);b=e}else b=e}e=MD(a)|0;while(1){if(!e)break;a=mc(e,b,d)|0;e=ND(e)|0;b=a}return b|0}function nc(a,b){a=a|0;b=b|0;a=eb[c[a>>2]&63](a,b,512)|0;if(!a)a=-1;else a=c[a+12>>2]|0;return a|0}function oc(a,b){a=a|0;b=b|0;while(1){if((b|0)<=0)break;mF(a,90875)|0;b=b+-1|0}return}function pc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;h=l;l=l+32|0;g=h+16|0;f=h+8|0;i=h;j=HB(a)|0;oc(b,c[e>>2]|0);c[i>>2]=wc(j,e)|0;sF(b,67396,i);if(d|0){mF(b,97646)|0;oc(b,c[e>>2]|0);j=(uB(a)|0)!=0;c[f>>2]=j?107953:137609;sF(b,68010,f);oc(b,c[e>>2]|0);j=(wB(a)|0)!=0;c[g>>2]=j?107953:137609;sF(b,68027,g)}l=h;return}function qc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o+8|0;m=o;i=vC(b)|0;j=c[b>>2]&3;f=IA(i,j,0)|0;a:do if(f|0){k=e+5|0;while(1){if(!f)break a;g=OA(b,f)|0;do if(g|0){h=f+8|0;if(!(a[g>>0]|0)){g=c[h>>2]|0;if((a[g>>0]|0)!=108)break;if(f2(g,108525)|0)break}mF(d,97646)|0;oc(d,c[e>>2]|0);c[m>>2]=wc(c[h>>2]|0,e)|0;sF(d,67446,m);if(a[k>>0]|0?yc(c[h>>2]|0)|0:0){zc(OA(b,f)|0,d,e);break}c[n>>2]=wc(OA(b,f)|0,e)|0;sF(d,67453,n)}while(0);f=IA(i,j,f)|0}}while(0);l=o;return}function rc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;f=MD(a)|0;if(f){mF(b,97646)|0;g=c[e>>2]|0;c[e>>2]=g+1;oc(b,g);g=(d|0)!=0;if(g){mF(b,67370)|0;a=0;d=f}else{mF(b,67430)|0;oc(b,c[e>>2]|0);a=0;d=f}while(1){if(!d)break;if(!a)a=1;else mF(b,97646)|0;if(g)xc(d,b,e);else{c[h>>2]=c[(PC(d,141363,0)|0)+8>>2];sF(b,137696,h)}d=ND(d)|0}if(g)a=1;else{c[e>>2]=(c[e>>2]|0)+-1;mF(b,153748)|0;oc(b,c[e>>2]|0);mF(b,97641)|0;a=1}}else a=0;l=i;return a|0}function sc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=gC(a)|0;e=(e|0)!=0;if(!g){if((d|0)!=0&e){c[f>>2]=(c[f>>2]|0)+-1;mF(b,153748)|0;oc(b,c[f>>2]|0);mF(b,97641)|0}}else{mF(b,97646)|0;h=(d|0)!=0;if(h)if(e)e=0;else{e=c[f>>2]|0;c[f>>2]=e+1;oc(b,e);mF(b,67370)|0;e=0}else{e=c[f>>2]|0;c[f>>2]=e+1;oc(b,e);mF(b,67384)|0;oc(b,c[f>>2]|0);e=0}while(1){if(!g)break;if(h2(HB(g)|0,108307,7)|0){do if(e)if(h){mF(b,97646)|0;break}else{mF(b,101300)|0;break}else e=1;while(0);vc(g,b,d,f)}g=hC(a,g)|0}c[f>>2]=(c[f>>2]|0)+-1;mF(b,153748)|0;oc(b,c[f>>2]|0);mF(b,97641)|0}return}function tc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=gC(a)|0;a:do if(f|0){while(1){if(!f)break a;if(UA(a,f)|0)break;f=hC(a,f)|0}mF(b,97646)|0;i=c[e>>2]|0;c[e>>2]=i+1;oc(b,i);mF(b,67320)|0;i=(d|0)!=0;if(i)g=0;else{oc(b,c[e>>2]|0);g=0}while(1){if(!f)break;h=UA(a,f)|0;while(1){if(!h)break;do if(g)if(i){mF(b,97646)|0;break}else{mF(b,101300)|0;break}else g=1;while(0);uc(h,b,d,e);h=WA(a,h)|0}f=hC(a,f)|0}c[e>>2]=(c[e>>2]|0)+-1;mF(b,153748)|0;oc(b,c[e>>2]|0);mF(b,97641)|0}while(0);return}function uc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=l;l=l+32|0;i=j+24|0;h=j+16|0;g=j+8|0;f=j;if(!d){c[i>>2]=c[(PC(a,141363,0)|0)+8>>2];sF(b,137696,i)}else{i=c[e>>2]|0;c[e>>2]=i+1;oc(b,i);mF(b,97675)|0;oc(b,c[e>>2]|0);c[f>>2]=c[(PC(a,141363,0)|0)+8>>2];sF(b,67332,f);oc(b,c[e>>2]|0);c[g>>2]=c[(PC(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0,141363,0)|0)+8>>2];sF(b,67346,g);oc(b,c[e>>2]|0);c[h>>2]=c[(PC(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0,141363,0)|0)+8>>2];sF(b,67359,h);qc(a,b,e);mF(b,153748)|0;i=(c[e>>2]|0)+-1|0;c[e>>2]=i;oc(b,i);mF(b,75629)|0}l=j;return}function vc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+32|0;h=i+16|0;g=i+8|0;f=i;if(!d){c[h>>2]=c[(PC(a,141363,0)|0)+8>>2];sF(b,137696,h)}else{h=c[e>>2]|0;c[e>>2]=h+1;oc(b,h);mF(b,97675)|0;oc(b,c[e>>2]|0);c[f>>2]=c[(PC(a,141363,0)|0)+8>>2];sF(b,67332,f);oc(b,c[e>>2]|0);c[g>>2]=wc(HB(a)|0,e)|0;sF(b,67396,g);qc(a,b,e);mF(b,153748)|0;h=(c[e>>2]|0)+-1|0;c[e>>2]=h;oc(b,h);mF(b,75629)|0}l=i;return}function wc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=d+4|0;if(a[g>>0]|0)b=cQ(b)|0;if(!(c[46748]|0)){hA(186992,1024,0);e=b}else e=b;a:while(1){f=a[e>>0]|0;switch(f<<24>>24){case 0:break a;case 34:{kA(186992,67409)|0;break}case 92:{kA(186992,96917)|0;break}case 47:{kA(186992,67412)|0;break}case 8:{kA(186992,67415)|0;break}case 12:{kA(186992,67418)|0;break}case 10:{kA(186992,67421)|0;break}case 13:{kA(186992,67424)|0;break}case 9:{kA(186992,67427)|0;break}default:{d=c[46749]|0;if(d>>>0>=(c[46750]|0)>>>0){iA(186992,1)|0;d=c[46749]|0}c[46749]=d+1;a[d>>0]=f}}e=e+1|0}d=c[46749]|0;if(d>>>0>=(c[46750]|0)>>>0){iA(186992,1)|0;d=c[46749]|0}a[d>>0]=0;d=c[46748]|0;c[46749]=d;if(a[g>>0]|0)l6(b);return d|0}function xc(a,b,c){a=a|0;b=b|0;c=c|0;lc(a,b,0,c);a=MD(a)|0;while(1){if(!a)break;mF(b,97646)|0;xc(a,b,c);a=ND(a)|0}return}function yc(b){b=b|0;var c=0;c=b+1|0;a:do if((a[b>>0]|0)==95){b=(a[c>>0]|0)+-100<<24>>24;switch(((b&255)>>>2|b<<6&255)<<24>>24){case 0:{if(!(f2(c,67967)|0)){b=1;break a}break}case 2:{if(!(f2(c,67973)|0)){b=1;break a}break}case 1:{if(!(f2(c,67980)|0)){b=1;break a}b=(f2(c,67994)|0)==0;break a}case 4:{if(!(f2(c,67987)|0)){b=1;break a}b=(f2(c,68002)|0)==0;break a}default:{b=0;break a}}b=0}else b=0;while(0);return b&1|0}function zc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=i;do if(b|0?a[b>>0]|0:0){h=BH(b)|0;if(!h){c[f>>2]=b;dA(0,67458,f)|0;break}mF(d,153748)|0;g=c[e>>2]|0;c[e>>2]=g+1;oc(d,g);mF(d,67485)|0;g=h+8|0;b=0;f=0;while(1){if((f|0)>=(c[h>>2]|0))break;if(!b)b=1;else mF(d,97646)|0;Ac((c[g>>2]|0)+(f*80|0)|0,d,e);f=f+1|0}c[e>>2]=(c[e>>2]|0)+-1;mF(d,153748)|0;oc(d,c[e>>2]|0);mF(d,97641)|0;CH(h)}while(0);l=i;return}function Ac(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0;A=l;l=l+240|0;y=A+224|0;x=A+216|0;w=A+208|0;v=A+200|0;u=A+192|0;t=A+184|0;s=A+176|0;r=A+152|0;q=A+136|0;p=A+128|0;o=A+112|0;n=A+104|0;m=A+96|0;k=A+88|0;j=A+72|0;i=A+48|0;z=A+40|0;g=A+8|0;f=A;e=c[d>>2]|0;c[d>>2]=e+1;oc(b,e);mF(b,97675)|0;oc(b,c[d>>2]|0);e=c[a>>2]|0;a:do switch(e|0){case 1:case 0:{c[f>>2]=(e|0)==0?69:101;sF(b,67488,f);oc(b,c[d>>2]|0);D=+h[a+16>>3];C=+h[a+24>>3];B=+h[a+32>>3];h[g>>3]=+h[a+8>>3];h[g+8>>3]=D;h[g+16>>3]=C;h[g+24>>3]=B;sF(b,67501,g);break}case 3:case 2:{c[z>>2]=(e|0)==2?80:112;sF(b,67488,z);oc(b,c[d>>2]|0);Bc(b,a+8|0);break}case 5:case 4:{c[i>>2]=(e|0)==4?66:98;sF(b,67488,i);oc(b,c[d>>2]|0);Bc(b,a+8|0);break}case 6:{sF(b,67536,A+56|0);oc(b,c[d>>2]|0);Bc(b,a+8|0);break}case 7:{sF(b,67548,A+64|0);oc(b,c[d>>2]|0);D=+h[a+16>>3];h[j>>3]=+h[a+8>>3];h[j+8>>3]=D;sF(b,67560,j);oc(b,c[d>>2]|0);z=c[a+24>>2]|0;c[k>>2]=(z|0)==0?108:(z|0)==1?99:114;sF(b,67582,k);oc(b,c[d>>2]|0);h[m>>3]=+h[a+32>>3];sF(b,67598,m);oc(b,c[d>>2]|0);c[n>>2]=wc(c[a+40>>2]|0,d)|0;sF(b,67615,n);break}case 9:case 8:{c[o>>2]=(e|0)==8?67:99;sF(b,67488,o);oc(b,c[d>>2]|0);sF(b,67629,A+120|0);oc(b,c[d>>2]|0);c[p>>2]=wc(c[a+8>>2]|0,d)|0;sF(b,67646,p);break}case 13:case 14:{c[q>>2]=(e|0)==13?67:99;sF(b,67488,q);oc(b,c[d>>2]|0);switch(c[a+8>>2]|0){case 0:{sF(b,67629,A+144|0);oc(b,c[d>>2]|0);c[r>>2]=wc(c[a+16>>2]|0,d)|0;sF(b,67646,r);break a}case 1:{sF(b,67661,A+160|0);oc(b,c[d>>2]|0);Cc(b,a+16|0,d);break a}default:{sF(b,67680,A+168|0);oc(b,c[d>>2]|0);Dc(b,a+16|0,d);break a}}}case 10:{sF(b,67699,s);oc(b,c[d>>2]|0);h[t>>3]=+h[a+8>>3];sF(b,67711,t);oc(b,c[d>>2]|0);c[u>>2]=wc(c[a+16>>2]|0,d)|0;sF(b,67727,u);break}case 11:{sF(b,67741,v);oc(b,c[d>>2]|0);c[w>>2]=wc(c[a+8>>2]|0,d)|0;sF(b,67753,w);break}case 15:{sF(b,67768,x);oc(b,c[d>>2]|0);c[y>>2]=c[a+8>>2];sF(b,67780,y);break}default:{}}while(0);z=(c[d>>2]|0)+-1|0;c[d>>2]=z;oc(b,z);mF(b,75629)|0;l=A;return}function Bc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0.0;j=l;l=l+48|0;i=j+32|0;g=j+16|0;f=j+8|0;e=c[b>>2]|0;d=c[b+4>>2]|0;sF(a,67941,j);b=0;while(1){if((b|0)>=(e|0))break;if((b|0)>0)sF(a,101300,f);k=+h[d+(b*24|0)+8>>3];h[g>>3]=+h[d+(b*24|0)>>3];h[g+8>>3]=k;sF(a,67953,g);b=b+1|0}sF(a,67894,i);l=j;return}function Cc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0;e=l;l=l+32|0;f=e+16|0;i=e;oc(a,c[d>>2]|0);g=+h[b+8>>3];h[i>>3]=+h[b>>3];h[i+8>>3]=g;sF(a,67897,i);oc(a,c[d>>2]|0);g=+h[b+24>>3];h[f>>3]=+h[b+16>>3];h[f+8>>3]=g;sF(a,67919,f);oc(a,c[d>>2]|0);Ec(a,c[b+32>>2]|0,c[b+36>>2]|0,d);l=e;return}function Dc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0;e=l;l=l+48|0;f=e+24|0;j=e;oc(a,c[d>>2]|0);g=+h[b+8>>3];i=+h[b+16>>3];h[j>>3]=+h[b>>3];h[j+8>>3]=g;h[j+16>>3]=i;sF(a,67796,j);oc(a,c[d>>2]|0);i=+h[b+32>>3];g=+h[b+40>>3];h[f>>3]=+h[b+24>>3];h[f+8>>3]=i;h[f+16>>3]=g;sF(a,67824,f);oc(a,c[d>>2]|0);Ec(a,c[b+48>>2]|0,c[b+52>>2]|0,d);l=e;return}function Ec(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0.0;m=l;l=l+48|0;k=m+32|0;j=m+16|0;i=m+8|0;sF(a,67852,m);f=0;while(1){if((f|0)>=(b|0))break;if((f|0)>0)sF(a,101300,i);o=+g[d+(f<<3)>>2];n=wc(c[d+(f<<3)+4>>2]|0,e)|0;h[j>>3]=o;c[j+8>>2]=n;sF(a,67863,j);f=f+1|0}sF(a,67894,k);l=m;return}function Fc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;e=eb[c[a>>2]&63](a,b,512)|0;if(e){if((c[e+12>>2]|0)!=(d|0)){c[f>>2]=b;dA(0,68040,f)|0}}else{f=m6(1,16)|0;c[f+8>>2]=Y3(b)|0;c[f+12>>2]=d;eb[c[a>>2]&63](a,f,1)|0}l=g;return}function Gc(a,b,d){a=a|0;b=b|0;d=d|0;l6(c[b+8>>2]|0);l6(b);return}function Hc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=l;l=l+32|0;d=b+24|0;e=b+16|0;g=b;f=c[a+16>>2]|0;mF(a,68895)|0;j=c[c[a+12>>2]>>2]|0;i=c[j+4>>2]|0;h=c[j+8>>2]|0;c[g>>2]=c[j>>2];c[g+4>>2]=i;c[g+8>>2]=h;sF(a,68905,g);c[e>>2]=HB(c[f+8>>2]|0)|0;sF(a,68940,e);c[d>>2]=S(c[a+168>>2]|0,c[a+164>>2]|0)|0;sF(a,68953,d);mF(a,68966)|0;mF(a,68976)|0;mF(a,68984)|0;mF(a,68992)|0;mF(a,69e3)|0;mF(a,69008)|0;mF(a,69016)|0;mF(a,69020)|0;mF(a,69025)|0;l=b;return}function Ic(a){a=a|0;mF(a,68876)|0;return}function Jc(a){a=a|0;c[46752]=2;return}function Kc(a){a=a|0;c[46752]=1;return}function Lc(a){a=a|0;c[46752]=2;return}function Mc(a){a=a|0;c[46752]=0;return}function Nc(a){a=a|0;c[46752]=2;return}function Oc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0.0,m=0,n=0,o=0,p=0,q=0.0,r=0.0;p=l;l=l+80|0;o=p;m=c[(c[b+16>>2]|0)+16>>2]|0;n=c[46752]|0;f=c[e+4>>2]|0;g=+h[f+16>>3]*+h[b+352>>3];i=c[b+360>>2]|0?1.5707963267948966:0.0;j=c[e>>2]|0;k=g*2.0/3.0*+((D3(j)|0)>>>0)*.5;f=c[f+8>>2]|0;if(!f)f=-1;else f=c[f+20>>2]|0;e=a[e+48>>0]|0;r=+h[d>>3];q=+h[d+8>>3]+-72.0;j=Yc(j)|0;c[o>>2]=4;c[o+4>>2]=e<<24>>24==108?0:e<<24>>24==114?2:1;c[o+8>>2]=m;c[o+12>>2]=n;c[o+16>>2]=0;c[o+20>>2]=f;h[o+24>>3]=g;h[o+32>>3]=i;c[o+40>>2]=6;h[o+48>>3]=g;h[o+56>>3]=k;c[o+64>>2]=~~(r+(r>=0.0?.5:-.5));c[o+68>>2]=~~(q+(q>=0.0?.5:-.5));c[o+72>>2]=j;sF(b,68821,o);l=p;return}function Pc(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;n=l;l=l+32|0;j=n;i=n+20|0;m=e+32|0;a:do switch(c[m>>2]|0){case 5:{f=0;while(1){g=c[12764+(f<<2)>>2]|0;if((f|0)==8)break a;h=c[e>>2]|0;if((a[g>>0]|0)==(a[h>>0]|0)?(f2(g,h)|0)==0:0){k=10;break a}f=f+1|0}}case 1:{g=e+1|0;h=e+2|0;f=(Xc(i,d[e>>0]|0,d[g>>0]|0,d[h>>0]|0)|0)+32|0;if(!(c[i>>2]|0))k=10;else{o=d[e>>0]|0;i=d[g>>0]|0;k=d[h>>0]|0;c[j>>2]=0;c[j+4>>2]=f;c[j+8>>2]=o;c[j+12>>2]=i;c[j+16>>2]=k;sF(b,68764,j);k=10}break}default:Aa(138697,68161,163,68192)}while(0);if((k|0)==10)c[e>>2]=f;c[m>>2]=6;l=n;return}function Qc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0;e=l;l=l+112|0;f=e+8|0;u=e+104|0;t=e;k=c[a+16>>2]|0;s=~~+h[k+152>>3];r=c[k+16>>2]|0;q=c[k+56>>2]|0;p=c[46752]|0;Vc(k,u,t);n=+h[b>>3];k=~~(n+(n>=0.0?.5:-.5));m=+h[b+8>>3];j=~~(m+(m>=0.0?.5:-.5));i=+h[b+16>>3];n=i-n;g=+h[b+24>>3];m=g-m;b=c[u>>2]|0;o=+h[t>>3];c[f>>2]=1;c[f+4>>2]=1;c[f+8>>2]=b;c[f+12>>2]=s;c[f+16>>2]=r;c[f+20>>2]=q;c[f+24>>2]=p;c[f+28>>2]=0;c[f+32>>2]=d|0?20:-1;h[f+40>>3]=o;c[f+48>>2]=0;h[f+56>>3]=0.0;c[f+64>>2]=k;c[f+68>>2]=j;c[f+72>>2]=~~(n+(n>=0.0?.5:-.5));c[f+76>>2]=~~(m+(m>=0.0?.5:-.5));c[f+80>>2]=k;c[f+84>>2]=j;c[f+88>>2]=~~(i+(i>=0.0?.5:-.5));c[f+92>>2]=~~(g+(g>=0.0?.5:-.5));sF(a,68699,f);l=e;return}function Rc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;f=l;l=l+96|0;g=f+8|0;o=f+80|0;p=f;q=c[a+16>>2]|0;n=~~+h[q+152>>3];m=c[q+16>>2]|0;k=c[q+56>>2]|0;j=c[46752]|0;Vc(q,o,p);o=c[o>>2]|0;i=+h[p>>3];c[g>>2]=2;c[g+4>>2]=3;c[g+8>>2]=o;c[g+12>>2]=n;c[g+16>>2]=m;c[g+20>>2]=k;c[g+24>>2]=j;c[g+28>>2]=0;c[g+32>>2]=e|0?20:-1;h[g+40>>3]=i;c[g+48>>2]=0;c[g+52>>2]=0;c[g+56>>2]=0;c[g+60>>2]=0;c[g+64>>2]=0;c[g+68>>2]=d+1;sF(a,68603,g);Wc(a,b,d,1);l=f;return}function Sc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0;C=l;l=l+192|0;B=C+176|0;z=C+168|0;A=C+104|0;y=C+96|0;i=C+88|0;u=C+180|0;v=C+80|0;w=C+16|0;x=C;f=a+16|0;e=c[f>>2]|0;q=~~+h[e+152>>3];r=c[e+16>>2]|0;s=c[46752]|0;if((d|0)<=3)Aa(68154,68161,360,68181);t=k6((d*140|0)+140|0)|0;Vc(e,u,v);if(!g){o=4;j=0;k=-1}else{o=5;j=c[(c[f>>2]|0)+56>>2]|0;k=20}E=+h[b>>3];n=w+48|0;h[n>>3]=E;D=+h[b+8>>3];h[w+56>>3]=D;c[i>>2]=~~(E+(E>=0.0?.5:-.5));c[i+4>>2]=~~(D+(D>=0.0?.5:-.5));m=x+8|0;e=t+(i2(t,81371,i)|0)|0;p=1;g=0;while(1){i=g+3|0;if((i|0)>=(d|0))break;c[w>>2]=c[n>>2];c[w+4>>2]=c[n+4>>2];c[w+8>>2]=c[n+8>>2];c[w+12>>2]=c[n+12>>2];f=1;while(1){if((f|0)==4){f=1;break}F=f+g|0;h[w+(f<<4)>>3]=+h[b+(F<<4)>>3];h[w+(f<<4)+8>>3]=+h[b+(F<<4)+8>>3];f=f+1|0}while(1){if((f|0)==7)break;iP(x,w,3,+(f|0)/6.0,0,0);D=+h[x>>3];E=+h[m>>3];c[y>>2]=~~(D+(D>=0.0?.5:-.5));c[y+4>>2]=~~(E+(E>=0.0?.5:-.5));f=f+1|0;e=e+(i2(e,81371,y)|0)|0}p=p+6|0;g=i}f=c[u>>2]|0;E=+h[v>>3];c[A>>2]=3;c[A+4>>2]=o;c[A+8>>2]=f;c[A+12>>2]=q;c[A+16>>2]=r;c[A+20>>2]=j;c[A+24>>2]=s;c[A+28>>2]=0;c[A+32>>2]=k;h[A+40>>3]=E;c[A+48>>2]=0;c[A+52>>2]=0;c[A+56>>2]=0;c[A+60>>2]=p;sF(a,68654,A);c[z>>2]=t;sF(a,81378,z);l6(t);f=p+-1|0;e=0;while(1){if((e|0)>=(p|0))break;c[B>>2]=((e|0)%(f|0)|0|0)!=0&1;sF(a,81383,B);e=e+1|0}mF(a,153748)|0;l=C;return}function Tc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0;e=l;l=l+96|0;f=e+8|0;m=e+80|0;n=e;o=c[a+16>>2]|0;k=~~+h[o+152>>3];j=c[o+16>>2]|0;i=c[46752]|0;Vc(o,m,n);m=c[m>>2]|0;g=+h[n>>3];c[f>>2]=2;c[f+4>>2]=1;c[f+8>>2]=m;c[f+12>>2]=k;c[f+16>>2]=j;c[f+20>>2]=0;c[f+24>>2]=i;c[f+28>>2]=0;c[f+32>>2]=0;h[f+40>>3]=g;c[f+48>>2]=0;c[f+52>>2]=0;c[f+56>>2]=0;c[f+60>>2]=0;c[f+64>>2]=0;c[f+68>>2]=d;sF(a,68603,f);Wc(a,b,d,0);l=e;return}function Uc(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;sF(a,68597,e);l=d;return}function Vc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0;switch(c[a+144>>2]|0){case 1:{e=10.0;a=1;break}case 2:{e=10.0;a=2;break}default:{e=0.0;a=0}}c[b>>2]=a;h[d>>3]=e;return}function Wc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,m=0.0;j=l;l=l+16|0;i=j+8|0;g=j;f=0;while(1){if((f|0)>=(d|0))break;m=+h[b+(f<<4)>>3];k=+h[b+(f<<4)+8>>3];c[g>>2]=~~(m+(m>=0.0?.5:-.5));c[g+4>>2]=~~(k+(k>=0.0?.5:-.5));sF(a,81371,g);f=f+1|0}if(e|0){k=+h[b>>3];m=+h[b+8>>3];c[i>>2]=~~(k+(k>=0.0?.5:-.5));c[i+4>>2]=~~(m+(m>=0.0?.5:-.5));sF(a,81371,i)}mF(a,153748)|0;l=j;return}function Xc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c[a>>2]=0;m=c[46753]|0;h=195075;g=0;i=-1;while(1){j=190960+(g<<1)|0;k=191472+(g<<1)|0;l=191984+(g<<1)|0;if((g|0)>=(m|0)){n=6;break}o=(b[j>>1]|0)-d|0;k=(b[k>>1]|0)-e|0;j=(b[l>>1]|0)-f|0;j=(S(k,k)|0)+(S(o,o)|0)+(S(j,j)|0)|0;if((j|0)<(h|0))if(!j)break;else{h=j;i=g}g=g+1|0}if((n|0)==6){c[46753]=m+1;if((m|0)==256)g=i;else{b[j>>1]=d;b[k>>1]=e;b[l>>1]=f;c[a>>2]=1}}return g|0}function Yc(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;d=c[46754]|0;if(!d){c[46755]=64;d=k6(64)|0;c[46754]=d;e=0}else e=0;while(1){g=b+1|0;f=a[b>>0]|0;if(!(f<<24>>24))break;b=c[46755]|0;if((e|0)>(b+-8|0)){d=b<<1;c[46755]=d;d=n6(c[46754]|0,d)|0;c[46754]=d;d=d+e|0}b=d+1|0;if(f<<24>>24<=-1){a[d>>0]=92;c[h>>2]=f&255;i2(b,81496,h)|0;b=g;d=d+4|0;e=e+4|0;continue}if(f<<24>>24==92){a[d>>0]=92;e=e+1|0;d=b}a[d>>0]=f;b=g;d=d+1|0;e=e+1|0}a[d>>0]=0;l=i;return c[46754]|0}function Zc(b){b=b|0;var d=0,e=0,f=0;e=c[b+16>>2]|0;switch(c[b+64>>2]|0){case 0:{mF(b,68492)|0;d=e+208|0;e=c[d>>2]|0;if(e|0?a[e>>0]|0:0){mF(b,68506)|0;mF(b,DK(c[d>>2]|0)|0)|0;mF(b,153748)|0}break}case 1:{d=e+208|0;f=c[d>>2]|0;if(f|0?a[f>>0]|0:0){mF(b,68506)|0;mF(b,DK(c[d>>2]|0)|0)|0;mF(b,102905)|0;mF(b,DK(HB(c[e+8>>2]|0)|0)|0)|0;mF(b,153748)|0}break}case 3:{f=DK(HB(c[e+8>>2]|0)|0)|0;mF(b,68515)|0;mF(b,f)|0;mF(b,68525)|0;mF(b,f)|0;mF(b,68480)|0;break}default:{}}return}function _c(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;d=c[a+16>>2]|0;e=d+264|0;f=d+228|0;g=d+244|0;h=d+208|0;i=d+272|0;b=d+268|0;d=d+212|0;switch(c[a+64>>2]|0){case 2:{ad(a,c[e>>2]|0,c[i>>2]|0,c[b>>2]|0,c[h>>2]|0,c[f>>2]|0,c[g>>2]|0,c[d>>2]|0);break}case 3:{ad(a,c[e>>2]|0,c[i>>2]|0,c[b>>2]|0,c[h>>2]|0,c[f>>2]|0,c[g>>2]|0,c[d>>2]|0);mF(a,68484)|0;break}default:{}}return}function $c(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=c[a+16>>2]|0;ad(a,c[g+264>>2]|0,c[g+272>>2]|0,c[g+268>>2]|0,b,d,e,f);return}function ad(b,d,e,f,g,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0;y=l;l=l+128|0;x=y+120|0;u=y+112|0;t=y+96|0;s=y+80|0;r=y+56|0;w=y+48|0;q=y+40|0;v=y+24|0;p=y;a:do if((e|0)!=0&(f|0)!=0){m=f+10|0;if((c[46756]|0)<(f|0)){c[46756]=m;o=n6(c[46757]|0,m<<3)|0;c[46757]=o}else o=c[46757]|0;m=0;while(1){if((m|0)>=(f|0))break;z=+h[e+(m<<4)>>3];c[o+(m<<3)>>2]=~~(z+(z>=0.0?.5:-.5));z=+h[e+(m<<4)+8>>3];c[o+(m<<3)+4>>2]=~~(z+(z>=0.0?.5:-.5));m=m+1|0}n=b+64|0;m=c[n>>2]|0;e=(g|0)!=0;if(e&(m|0)==0){if(!(a[g>>0]|0))break;switch(d|0){case 0:{v=c[o>>2]|0;w=c[o+12>>2]|0;x=c[o+8>>2]|0;f=c[o+4>>2]|0;c[p>>2]=g;c[p+4>>2]=v;c[p+8>>2]=w;c[p+12>>2]=x;c[p+16>>2]=f;sF(b,68226,p);break a}case 1:{w=c[o>>2]|0;x=c[o+4>>2]|0;f=(c[o+8>>2]|0)-w|0;c[v>>2]=g;c[v+4>>2]=w;c[v+8>>2]=x;c[v+12>>2]=f;sF(b,68247,v);break a}case 2:{c[q>>2]=g;sF(b,68267,q);m=0;while(1){if((m|0)>=(f|0))break;v=c[46757]|0;x=c[v+(m<<3)+4>>2]|0;c[w>>2]=c[v+(m<<3)>>2];c[w+4>>2]=x;sF(b,68275,w);m=m+1|0}mF(b,153748)|0;break a}default:Aa(138697,68282,63,68302)}}if(e&(m|0)==1){if(!(a[g>>0]|0))break;if(!d){w=c[o+12>>2]|0;x=c[o+8>>2]|0;f=c[o+4>>2]|0;c[r>>2]=c[o>>2];c[r+4>>2]=w;c[r+8>>2]=x;c[r+12>>2]=f;c[r+16>>2]=g;c[r+20>>2]=i;sF(b,68319,r);break}else Aa(138697,68282,75,68302)}if((m&-2|0)==2){switch(d|0){case 1:{mF(b,68352)|0;break}case 0:{mF(b,68373)|0;break}case 2:{mF(b,68392)|0;break}default:Aa(138697,68282,91,68302)}if(k|0?a[k>>0]|0:0){mF(b,73872)|0;mF(b,GK(k)|0)|0;mF(b,99045)|0}if(e?a[g>>0]|0:0){mF(b,68411)|0;mF(b,GK(g)|0)|0;mF(b,99045)|0}if(j|0?a[j>>0]|0:0){mF(b,74831)|0;mF(b,DK(j)|0)|0;mF(b,99045)|0}if(i|0?a[i>>0]|0:0){mF(b,68419)|0;mF(b,DK(i)|0)|0;mF(b,99045)|0}mF(b,68428)|0;mF(b,68436)|0;b:do switch(d|0){case 1:{f=c[46757]|0;w=c[f>>2]|0;x=c[f+4>>2]|0;f=(c[f+8>>2]|0)-w|0;c[s>>2]=w;c[s+4>>2]=x;c[s+8>>2]=f;sF(b,68446,s);break}case 0:{v=c[46757]|0;w=c[v+12>>2]|0;x=c[v+8>>2]|0;f=c[v+4>>2]|0;c[t>>2]=c[v>>2];c[t+4>>2]=w;c[t+8>>2]=x;c[t+12>>2]=f;sF(b,68455,t);break}case 2:{w=c[46757]|0;m=c[w+4>>2]|0;c[u>>2]=c[w>>2];c[u+4>>2]=m;sF(b,68467,u);m=1;while(1){if((m|0)>=(f|0))break b;v=c[46757]|0;w=c[v+(m<<3)+4>>2]|0;c[x>>2]=c[v+(m<<3)>>2];c[x+4>>2]=w;sF(b,68473,x);m=m+1|0}}default:{}}while(0);if((c[n>>2]|0)==3){mF(b,73696)|0;break}else{mF(b,68480)|0;break}}}while(0);l=y;return}function bd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=l;l=l+32|0;d=b+24|0;e=b+16|0;g=b;f=c[a+16>>2]|0;mF(a,68895)|0;j=c[c[a+12>>2]>>2]|0;i=c[j+4>>2]|0;h=c[j+8>>2]|0;c[g>>2]=c[j>>2];c[g+4>>2]=i;c[g+8>>2]=h;sF(a,68905,g);c[e>>2]=HB(c[f+8>>2]|0)|0;sF(a,68940,e);c[d>>2]=S(c[a+168>>2]|0,c[a+164>>2]|0)|0;sF(a,68953,d);mF(a,68966)|0;mF(a,68976)|0;mF(a,68984)|0;mF(a,68992)|0;mF(a,69e3)|0;mF(a,69008)|0;mF(a,69016)|0;mF(a,69020)|0;mF(a,69025)|0;l=b;return}function cd(a){a=a|0;mF(a,68876)|0;return}function dd(a){a=a|0;c[46758]=2;return}function ed(a){a=a|0;c[46758]=1;return}function fd(a){a=a|0;c[46758]=2;return}function gd(a){a=a|0;c[46758]=0;return}function hd(a){a=a|0;c[46758]=2;return}function id(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0;n=l;l=l+80|0;m=n;j=c[(c[b+16>>2]|0)+16>>2]|0;k=c[46758]|0;f=c[e+4>>2]|0;g=+h[f+16>>3]*+h[b+352>>3];i=c[b+360>>2]|0?1.5707963267948966:0.0;f=c[f+8>>2]|0;if(!f)f=-1;else f=c[f+20>>2]|0;q=a[e+48>>0]|0;p=+h[d>>3];o=+h[d+8>>3];e=sd(c[e>>2]|0)|0;c[m>>2]=4;c[m+4>>2]=q<<24>>24==108?0:q<<24>>24==114?2:1;c[m+8>>2]=j;c[m+12>>2]=k;c[m+16>>2]=0;c[m+20>>2]=f;h[m+24>>3]=g;h[m+32>>3]=i;c[m+40>>2]=4;h[m+48>>3]=0.0;h[m+56>>3]=0.0;c[m+64>>2]=~~(p+(p>=0.0?.5:-.5));c[m+68>>2]=~~(o+(o>=0.0?.5:-.5));c[m+72>>2]=e;sF(b,68821,m);l=n;return}function jd(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;n=l;l=l+32|0;j=n;i=n+20|0;m=e+32|0;a:do switch(c[m>>2]|0){case 5:{f=0;while(1){g=c[12764+(f<<2)>>2]|0;if((f|0)==8)break a;h=c[e>>2]|0;if((a[g>>0]|0)==(a[h>>0]|0)?(f2(g,h)|0)==0:0){k=10;break a}f=f+1|0}}case 1:{g=e+1|0;h=e+2|0;f=(rd(i,d[e>>0]|0,d[g>>0]|0,d[h>>0]|0)|0)+32|0;if(!(c[i>>2]|0))k=10;else{o=d[e>>0]|0;i=d[g>>0]|0;k=d[h>>0]|0;c[j>>2]=0;c[j+4>>2]=f;c[j+8>>2]=o;c[j+12>>2]=i;c[j+16>>2]=k;sF(b,68764,j);k=10}break}case 0:{f=0;k=10;break}default:Aa(138697,68785,168,68804)}while(0);if((k|0)==10)c[e>>2]=f;c[m>>2]=6;l=n;return}function kd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0;e=l;l=l+112|0;f=e+8|0;u=e+104|0;t=e;k=c[a+16>>2]|0;s=~~+h[k+152>>3];r=c[k+16>>2]|0;q=c[k+56>>2]|0;p=c[46758]|0;pd(k,u,t);n=+h[b>>3];k=~~(n+(n>=0.0?.5:-.5));m=+h[b+8>>3];j=~~(m+(m>=0.0?.5:-.5));i=+h[b+16>>3];n=i-n;g=+h[b+24>>3];m=g-m;b=c[u>>2]|0;o=+h[t>>3];c[f>>2]=1;c[f+4>>2]=1;c[f+8>>2]=b;c[f+12>>2]=s;c[f+16>>2]=r;c[f+20>>2]=q;c[f+24>>2]=p;c[f+28>>2]=0;c[f+32>>2]=d|0?20:-1;h[f+40>>3]=o;c[f+48>>2]=0;h[f+56>>3]=0.0;c[f+64>>2]=k;c[f+68>>2]=j;c[f+72>>2]=~~(n+(n>=0.0?.5:-.5));c[f+76>>2]=~~(m+(m>=0.0?.5:-.5));c[f+80>>2]=k;c[f+84>>2]=j;c[f+88>>2]=~~(i+(i>=0.0?.5:-.5));c[f+92>>2]=~~(g+(g>=0.0?.5:-.5));sF(a,68699,f);l=e;return}function ld(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;f=l;l=l+96|0;g=f+8|0;o=f+80|0;p=f;q=c[a+16>>2]|0;n=~~+h[q+152>>3];m=c[q+16>>2]|0;k=c[q+56>>2]|0;j=c[46758]|0;pd(q,o,p);o=c[o>>2]|0;i=+h[p>>3];c[g>>2]=2;c[g+4>>2]=3;c[g+8>>2]=o;c[g+12>>2]=n;c[g+16>>2]=m;c[g+20>>2]=k;c[g+24>>2]=j;c[g+28>>2]=0;c[g+32>>2]=e|0?20:-1;h[g+40>>3]=i;c[g+48>>2]=0;c[g+52>>2]=0;c[g+56>>2]=0;c[g+60>>2]=0;c[g+64>>2]=0;c[g+68>>2]=d+1;sF(a,68603,g);qd(a,b,d,1);l=f;return}function md(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0;C=l;l=l+192|0;B=C+176|0;z=C+168|0;A=C+104|0;y=C+96|0;f=C+88|0;u=C+180|0;v=C+80|0;w=C+16|0;x=C;e=a+16|0;p=c[e>>2]|0;q=~~+h[p+152>>3];r=c[p+16>>2]|0;s=c[46758]|0;t=k6((d*140|0)+140|0)|0;pd(p,u,v);if(!g){o=4;j=0;k=-1}else{o=5;j=c[(c[e>>2]|0)+56>>2]|0;k=20}E=+h[b>>3];n=w+48|0;h[n>>3]=E;D=+h[b+8>>3];h[w+56>>3]=D;c[f>>2]=~~(E+(E>=0.0?.5:-.5));c[f+4>>2]=~~(D+(D>=0.0?.5:-.5));m=x+8|0;e=t+(i2(t,81371,f)|0)|0;p=1;g=0;while(1){i=g+3|0;if((i|0)>=(d|0))break;c[w>>2]=c[n>>2];c[w+4>>2]=c[n+4>>2];c[w+8>>2]=c[n+8>>2];c[w+12>>2]=c[n+12>>2];f=1;while(1){if((f|0)==4){f=1;break}F=f+g|0;h[w+(f<<4)>>3]=+h[b+(F<<4)>>3];h[w+(f<<4)+8>>3]=+h[b+(F<<4)+8>>3];f=f+1|0}while(1){if((f|0)==7)break;iP(x,w,3,+(f|0)/6.0,0,0);D=+h[x>>3];E=+h[m>>3];c[y>>2]=~~(D+(D>=0.0?.5:-.5));c[y+4>>2]=~~(E+(E>=0.0?.5:-.5));f=f+1|0;e=e+(i2(e,81371,y)|0)|0}p=p+6|0;g=i}f=c[u>>2]|0;E=+h[v>>3];c[A>>2]=3;c[A+4>>2]=o;c[A+8>>2]=f;c[A+12>>2]=q;c[A+16>>2]=r;c[A+20>>2]=j;c[A+24>>2]=s;c[A+28>>2]=0;c[A+32>>2]=k;h[A+40>>3]=E;c[A+48>>2]=0;c[A+52>>2]=0;c[A+56>>2]=0;c[A+60>>2]=p;sF(a,68654,A);c[z>>2]=t;sF(a,81378,z);l6(t);f=p+-1|0;e=0;while(1){if((e|0)>=(p|0))break;c[B>>2]=((e|0)%(f|0)|0|0)!=0&1;sF(a,81383,B);e=e+1|0}mF(a,153748)|0;l=C;return}function nd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0;e=l;l=l+96|0;f=e+8|0;m=e+80|0;n=e;o=c[a+16>>2]|0;k=~~+h[o+152>>3];j=c[o+16>>2]|0;i=c[46758]|0;pd(o,m,n);m=c[m>>2]|0;g=+h[n>>3];c[f>>2]=2;c[f+4>>2]=1;c[f+8>>2]=m;c[f+12>>2]=k;c[f+16>>2]=j;c[f+20>>2]=0;c[f+24>>2]=i;c[f+28>>2]=0;c[f+32>>2]=0;h[f+40>>3]=g;c[f+48>>2]=0;c[f+52>>2]=0;c[f+56>>2]=0;c[f+60>>2]=0;c[f+64>>2]=0;c[f+68>>2]=d;sF(a,68603,f);qd(a,b,d,0);l=e;return}function od(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;sF(a,68597,e);l=d;return}function pd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0;switch(c[a+144>>2]|0){case 1:{e=10.0;a=1;break}case 2:{e=10.0;a=2;break}default:{e=0.0;a=0}}c[b>>2]=a;h[d>>3]=e;return}function qd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,m=0.0;j=l;l=l+16|0;i=j+8|0;g=j;f=0;while(1){if((f|0)>=(d|0))break;m=+h[b+(f<<4)>>3];k=+h[b+(f<<4)+8>>3];c[g>>2]=~~(m+(m>=0.0?.5:-.5));c[g+4>>2]=~~(k+(k>=0.0?.5:-.5));sF(a,81371,g);f=f+1|0}if(e|0){k=+h[b>>3];m=+h[b+8>>3];c[i>>2]=~~(k+(k>=0.0?.5:-.5));c[i+4>>2]=~~(m+(m>=0.0?.5:-.5));sF(a,81371,i)}mF(a,153748)|0;l=j;return}function rd(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c[a>>2]=0;m=c[46759]|0;h=195075;g=0;i=-1;while(1){j=192496+(g<<1)|0;k=193008+(g<<1)|0;l=193520+(g<<1)|0;if((g|0)>=(m|0)){n=6;break}o=(b[j>>1]|0)-d|0;k=(b[k>>1]|0)-e|0;j=(b[l>>1]|0)-f|0;j=(S(k,k)|0)+(S(o,o)|0)+(S(j,j)|0)|0;if((j|0)<(h|0))if(!j)break;else{h=j;i=g}g=g+1|0}if((n|0)==6){c[46759]=m+1;if((m|0)==256)g=i;else{b[j>>1]=d;b[k>>1]=e;b[l>>1]=f;c[a>>2]=1}}return g|0}function sd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;d=c[46760]|0;if(!d){c[46761]=64;d=k6(64)|0;c[46760]=d;e=0}else e=0;while(1){g=b+1|0;f=a[b>>0]|0;if(!(f<<24>>24))break;b=c[46761]|0;if((e|0)>(b+-8|0)){d=b<<1;c[46761]=d;d=n6(c[46760]|0,d)|0;c[46760]=d;d=d+e|0}b=d+1|0;if(f<<24>>24<=-1){a[d>>0]=92;c[h>>2]=f&255;i2(b,81496,h)|0;b=g;d=d+4|0;e=e+4|0;continue}if(f<<24>>24==92){a[d>>0]=92;e=e+1|0;d=b}a[d>>0]=f;b=g;d=d+1|0;e=e+1|0}a[d>>0]=0;l=i;return c[46760]|0}function td(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=l;l=l+16|0;b=d;mF(a,73604)|0;if((c[a+64>>2]|0)==2)mF(a,73619)|0;else mF(a,153748)|0;g=c[c[a+12>>2]>>2]|0;f=c[g+4>>2]|0;e=c[g+8>>2]|0;c[b>>2]=c[g>>2];c[b+4>>2]=f;c[b+8>>2]=e;sF(a,73630,b);l=d;return}function ud(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+8|0;e=g;mF(a,73558)|0;b=a+64|0;d=a+12|0;if((c[b>>2]|0)!=2){c[e>>2]=c[(c[d>>2]|0)+28>>2];sF(a,73569,e)}if((c[(c[d>>2]|0)+20>>2]|0)==0?(c[b>>2]|0)!=2:0){b=c[a+476>>2]|0;d=c[a+480>>2]|0;e=c[a+484>>2]|0;c[f>>2]=c[a+472>>2];c[f+4>>2]=b;c[f+8>>2]=d;c[f+12>>2]=e;sF(a,69938,f)}mF(a,73584)|0;mF(a,73597)|0;l=g;return}function vd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;k=l;l=l+32|0;j=k+24|0;f=k+8|0;i=k;g=c[b+16>>2]|0;a[194048]=0;e=b+12|0;h=g+8|0;if(!(c[(c[e>>2]|0)+28>>2]|0)){c[i>>2]=HB(c[h>>2]|0)|0;sF(b,69869,i);d=b+64|0;if((c[d>>2]|0)==2)mF(b,69902)|0;else mF(b,69884)|0;do if(!(c[(c[e>>2]|0)+20>>2]|0))if((c[d>>2]|0)==2){n=c[b+460>>2]|0;m=c[b+464>>2]|0;d=c[b+468>>2]|0;c[f>>2]=c[b+456>>2];c[f+4>>2]=n;c[f+8>>2]=m;c[f+12>>2]=d;sF(b,69938,f);break}else{mF(b,69914)|0;break}while(0);mF(b,69968)|0;wM(b,c[(c[e>>2]|0)+24>>2]|0,13040);yM(b);d=c[(c[e>>2]|0)+20>>2]|0;if(d|0){c[i>>2]=c[d>>2];c[i+4>>2]=0;wM(b,0,i)}}c[46762]=(a[(c[(c[h>>2]|0)+16>>2]|0)+115>>0]|0)==1?1:-1;if(!(a[194048]|0)){mF(b,69988)|0;a[194048]=1}d=c[g+208>>2]|0;if(d|0){c[j>>2]=zM(d,c[46762]|0)|0;sF(b,70001,j)}l=k;return}function wd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;b=l;l=l+16|0;f=b;c[f>>2]=d;c[f+4>>2]=e;sF(a,69853,f);l=b;return}function xd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0;s=l;l=l+144|0;r=s+128|0;q=s+112|0;p=s+72|0;o=s+56|0;n=s+40|0;m=s+32|0;e=s+24|0;b=s+8|0;d=s;f=c[a+456>>2]|0;j=c[a+460>>2]|0;g=c[a+464>>2]|0;i=c[a+468>>2]|0;k=a+12|0;t=(c[(c[k>>2]|0)+28>>2]|0)+1|0;c[d>>2]=t;c[d+4>>2]=t;sF(a,69480,d);if(!(c[(c[k>>2]|0)+20>>2]|0)){c[b>>2]=f;c[b+4>>2]=j;c[b+8>>2]=g;c[b+12>>2]=i;sF(a,69497,b)}d=a+360|0;c[e>>2]=c[d>>2]|0?69531:69541;sF(a,69550,e);b=a+64|0;if((c[b>>2]|0)==1){c[m>>2]=g;c[m+4>>2]=i;sF(a,69575,m)}m=c[a+200>>2]|0;t=c[a+204>>2]|0;c[n>>2]=c[a+196>>2];c[n+4>>2]=m;c[n+8>>2]=t;sF(a,69614,n);if(!(c[(c[k>>2]|0)+20>>2]|0)){c[o>>2]=f;c[o+4>>2]=j;c[o+8>>2]=g-f;c[o+12>>2]=i-j;sF(a,69634,o)}w=+h[a+496>>3];t=c[d>>2]|0;v=+h[a+504>>3];u=+h[a+512>>3];h[p>>3]=+h[a+488>>3];h[p+8>>3]=w;c[p+16>>2]=t;h[p+24>>3]=v;h[p+32>>3]=u;sF(a,69674,p);if((c[b>>2]|0)==1){if((g|0)>14399|(i|0)>14399){t=c[(c[k>>2]|0)+16>>2]|0;c[q>>2]=g;c[q+4>>2]=i;c[q+8>>2]=14400;lb[t&63](69717,q)}c[r>>2]=f;c[r+4>>2]=j;c[r+8>>2]=g;c[r+12>>2]=i;sF(a,69812,r)}l=s;return}function yd(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=e;b=a+12|0;if(c[(c[b>>2]|0)+20>>2]|0){mF(a,69404)|0;wM(a,0,(c[(c[b>>2]|0)+20>>2]|0)+4|0)}mF(a,69421)|0;mF(a,69448)|0;c[d>>2]=c[(c[b>>2]|0)+28>>2];sF(a,69463,d);l=e;return}function zd(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=HB(c[(c[a+16>>2]|0)+8>>2]|0)|0;sF(a,69397,d);mF(a,69390)|0;l=b;return}function Ad(a){a=a|0;mF(a,84824)|0;return}function Bd(a){a=a|0;mF(a,69390)|0;return}function Cd(a){a=a|0;mF(a,84824)|0;return}function Dd(a){a=a|0;mF(a,69390)|0;return}function Ed(a){a=a|0;mF(a,84824)|0;return}function Fd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;e=l;l=l+16|0;d=e;if(b|0?(g=(c[a+16>>2]|0)+272|0,c[g>>2]|0):0){mF(a,69286)|0;wF(a,c[g>>2]|0,2);mF(a,69297)|0;c[d>>2]=zM(b,c[46762]|0)|0;sF(a,69301,d)}l=e;return}function Gd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+32|0;j=m+8|0;k=m;f=c[b+16>>2]|0;if(!(+h[f+40>>3]<.5)){Nd(b,f+16|0);f=e+4|0;tF(b,+h[(c[f>>2]|0)+16>>3]);c[j>>2]=c[c[f>>2]>>2];sF(b,69245,j);f=zM(c[e>>2]|0,c[46762]|0)|0;i=e+32|0;switch(a[e+48>>0]|0){case 114:{g=+h[i>>3];break}case 108:{g=0.0;break}default:g=+h[i>>3]*.5}h[d>>3]=+h[d>>3]-g;n=d+8|0;h[n>>3]=+h[e+24>>3]+ +h[n>>3];c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];vF(b,j);mF(b,69260)|0;tF(b,+h[i>>3]);c[k>>2]=f;sF(b,69269,k)}l=m;return}function Hd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+32|0;f=g;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];h[f+16>>3]=+h[b+16>>3]-+h[b>>3];h[f+24>>3]=+h[b+24>>3]-+h[b+8>>3];b=a+16|0;if(d|0?(e=c[b>>2]|0,+h[e+80>>3]>.5):0){Nd(a,e+56|0);wF(a,f,2);mF(a,69203)|0}if(+h[(c[b>>2]|0)+40>>3]>.5){Od(a);Nd(a,(c[b>>2]|0)+16|0);wF(a,f,2);mF(a,69223)|0}l=g;return}function Id(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0;j=l;l=l+16|0;i=j;g=a+16|0;if(e|0?(f=c[g>>2]|0,+h[f+80>>3]>.5):0){Nd(a,f+56|0);mF(a,69124)|0;c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];vF(a,i);mF(a,69133)|0;e=1;while(1){if((e|0)>=(d|0))break;f=b+(e<<4)|0;c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];c[i+8>>2]=c[f+8>>2];c[i+12>>2]=c[f+12>>2];vF(a,i);mF(a,69142)|0;e=e+1|0}mF(a,69169)|0}if(+h[(c[g>>2]|0)+40>>3]>.5){Od(a);Nd(a,(c[g>>2]|0)+16|0);mF(a,69124)|0;c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];vF(a,i);mF(a,69133)|0;e=1;while(1){if((e|0)>=(d|0))break;g=b+(e<<4)|0;c[i>>2]=c[g>>2];c[i+4>>2]=c[g+4>>2];c[i+8>>2]=c[g+8>>2];c[i+12>>2]=c[g+12>>2];vF(a,i);mF(a,69142)|0;e=e+1|0}mF(a,69185)|0}l=j;return}function Jd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0;k=l;l=l+16|0;f=k;i=a+16|0;if(g|0?(j=c[i>>2]|0,+h[j+80>>3]>.5):0){Nd(a,j+56|0);mF(a,69124)|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];vF(a,f);mF(a,69133)|0;e=1;while(1){if((e|0)>=(d|0))break;wF(a,b+(e<<4)|0,3);mF(a,69159)|0;e=e+3|0}mF(a,69169)|0}if(+h[(c[i>>2]|0)+40>>3]>.5){Od(a);Nd(a,(c[i>>2]|0)+16|0);mF(a,69124)|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];vF(a,f);mF(a,69133)|0;e=1;while(1){if((e|0)>=(d|0))break;wF(a,b+(e<<4)|0,3);mF(a,69159)|0;e=e+3|0}mF(a,69151)|0}l=k;return}function Kd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0;g=l;l=l+16|0;f=g;e=a+16|0;if(+h[(c[e>>2]|0)+40>>3]>.5){Od(a);Nd(a,(c[e>>2]|0)+16|0);mF(a,69124)|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];vF(a,f);mF(a,69133)|0;e=1;while(1){if((e|0)>=(d|0))break;i=b+(e<<4)|0;c[f>>2]=c[i>>2];c[f+4>>2]=c[i+4>>2];c[f+8>>2]=c[i+8>>2];c[f+12>>2]=c[i+12>>2];vF(a,f);mF(a,69142)|0;e=e+1|0}mF(a,69151)|0}l=g;return}function Ld(a,b){a=a|0;b=b|0;mF(a,69121)|0;mF(a,b)|0;mF(a,153748)|0;return}function Md(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;g=n+16|0;m=n+8|0;k=n;i=a+16|0;if(f|0?(j=c[i>>2]|0,+h[j+80>>3]>.5):0){Nd(a,j+56|0);mF(a,84719)|0;wF(a,d,e);mF(a,102905)|0;c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];vF(a,g);c[k>>2]=e;c[k+4>>2]=b;sF(a,69038,k)}if(+h[(c[i>>2]|0)+40>>3]>.5){Od(a);Nd(a,(c[i>>2]|0)+16|0);mF(a,84719)|0;wF(a,d,e);mF(a,102905)|0;c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];vF(a,g);c[m>>2]=e;c[m+4>>2]=b;sF(a,69054,m)}l=n;return}function Nd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0;f=l;l=l+32|0;e=f;if(b|0){switch(c[(c[a+16>>2]|0)+4>>2]|0){case 1:case 0:{d=111795;break}case 2:{d=111782;break}case 3:{d=111751;break}default:d=69090}i=+h[b+8>>3];g=+h[b+16>>3];h[e>>3]=+h[b>>3];h[e+8>>3]=i;h[e+16>>3]=g;c[e+24>>2]=d;sF(a,69097,e)}l=f;return}function Od(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m+8|0;j=m;g=b+16|0;i=c[g>>2]|0;d=c[i+160>>2]|0;tF(b,+h[i+152>>3]);mF(b,69071)|0;while(1){if(!d)break;i=d+4|0;f=c[d>>2]|0;if(!f)break;if(!(f2(f,111389)|0)){d=i;continue}else e=f;while(1){d=e+1|0;if(!(a[e>>0]|0))break;else e=d}a:while(1){if(!(a[d>>0]|0))break;c[j>>2]=d;sF(b,69086,j);while(1){e=d+1|0;if(!(a[d>>0]|0)){d=e;continue a}else d=e}}if(!(f2(f,134636)|0))h[(c[g>>2]|0)+152>>3]=0.0;c[k>>2]=f;sF(b,96971,k);d=i}l=m;return}function Pd(b){b=b|0;var d=0;mF(b,75110)|0;d=NA(c[(c[b>>2]|0)+168>>2]|0,75166)|0;if(d|0?a[d>>0]|0:0){mF(b,75177)|0;mF(b,d)|0;mF(b,75201)|0}mF(b,75222)|0;mF(b,75270)|0;mF(b,75324)|0;d=b+12|0;mF(b,DK(c[c[c[d>>2]>>2]>>2]|0)|0)|0;mF(b,78453)|0;mF(b,DK(c[(c[c[d>>2]>>2]|0)+4>>2]|0)|0)|0;mF(b,78463)|0;mF(b,DK(c[(c[c[d>>2]>>2]|0)+8>>2]|0)|0)|0;mF(b,75706)|0;mF(b,75730)|0;return}function Qd(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0.0,m=0.0;i=l;l=l+48|0;g=i+16|0;f=i+8|0;e=i;d=c[b+16>>2]|0;mF(b,74945)|0;d=d+8|0;if(a[(HB(c[d>>2]|0)|0)>>0]|0){mF(b,75669)|0;mF(b,DK(HB(c[d>>2]|0)|0)|0)|0}c[e>>2]=S(c[b+168>>2]|0,c[b+164>>2]|0)|0;sF(b,74950,e);e=c[b+452>>2]|0;c[f>>2]=c[b+448>>2];c[f+4>>2]=e;sF(b,74966,f);m=+h[b+392>>3];k=+h[b+400>>3];j=+h[b+408>>3];h[g>>3]=+h[b+384>>3];h[g+8>>3]=m;h[g+16>>3]=k;h[g+24>>3]=j;sF(b,74999,g);mF(b,75030)|0;mF(b,75066)|0;mF(b,76660)|0;l=i;return}function Rd(a){a=a|0;mF(a,74937)|0;return}function Sd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;ne(a,b,0,101811,c[(c[a+16>>2]|0)+8>>2]|0);mF(a,76660)|0;return}function Td(a){a=a|0;mF(a,74785)|0;return}function Ud(b){b=b|0;var d=0,e=0,f=0,g=0;e=l;l=l+16|0;f=e;g=c[b+16>>2]|0;d=g+8|0;ne(b,c[g+212>>2]|0,0,111795,c[d>>2]|0);mF(b,74889)|0;tF(b,+h[b+488>>3]);mF(b,102905)|0;tF(b,+h[b+496>>3]);c[f>>2]=0-(c[b+360>>2]|0);sF(b,74908,f);tF(b,+h[b+504>>3]);mF(b,102905)|0;tF(b,-+h[b+512>>3]);mF(b,74932)|0;if(a[(HB(c[d>>2]|0)|0)>>0]|0){mF(b,74841)|0;mF(b,DK(HB(c[d>>2]|0)|0)|0)|0;mF(b,74849)|0}l=e;return}function Vd(a){a=a|0;mF(a,74785)|0;return}function Wd(a){a=a|0;var b=0,d=0;d=c[a+16>>2]|0;b=d+8|0;ne(a,c[d+212>>2]|0,0,108307,c[b>>2]|0);mF(a,76660)|0;mF(a,74841)|0;mF(a,DK(HB(c[b>>2]|0)|0)|0)|0;mF(a,74849)|0;return}function Xd(a){a=a|0;mF(a,74785)|0;return}function Yd(a){a=a|0;var b=0,d=0,e=0;d=c[a+16>>2]|0;b=c[a+160>>2]|0;if((b|0)>1)b=c[(c[(c[a>>2]|0)+308>>2]|0)+(b<<2)>>2]|0;else b=0;e=d+8|0;ne(a,c[d+212>>2]|0,b,111782,c[e>>2]|0);mF(a,76660)|0;mF(a,74841)|0;mF(a,DK(HB(c[e>>2]|0)|0)|0)|0;mF(a,74849)|0;return}function Zd(a){a=a|0;mF(a,74785)|0;return}function _d(a){a=a|0;var b=0,d=0;d=c[a+16>>2]|0;b=d+8|0;ne(a,c[d+212>>2]|0,0,111751,c[b>>2]|0);mF(a,76660)|0;mF(a,74841)|0;b=CK(102396,c[b>>2]|0)|0;mF(a,DK(b)|0)|0;l6(b);mF(a,74849)|0;return}function $d(a){a=a|0;mF(a,74785)|0;return}function ae(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;mF(b,74791)|0;if(f|0){mF(b,74794)|0;mF(b,DK(f)|0)|0;mF(b,99045)|0}mF(b,74684)|0;mF(b,76621)|0;if(c|0?a[c>>0]|0:0){mF(b,74802)|0;mF(b,c)|0;mF(b,99045)|0}if(d|0?a[d>>0]|0:0){mF(b,74816)|0;mF(b,EK(d,1)|0)|0;mF(b,99045)|0}if(e|0?a[e>>0]|0:0){mF(b,74831)|0;mF(b,DK(e)|0)|0;mF(b,99045)|0}mF(b,76660)|0;return}function be(a){a=a|0;mF(a,76615)|0;mF(a,74785)|0;return}function ce(e,f,g){e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0;M=l;l=l+176|0;L=M+160|0;K=M+152|0;F=M+136|0;J=M+128|0;E=M+120|0;D=M+112|0;C=M+104|0;B=M+96|0;A=M+88|0;y=M+80|0;w=M+72|0;v=M+64|0;u=M+56|0;t=M+48|0;i=M+40|0;q=M+32|0;s=M+24|0;r=M+16|0;p=M+8|0;o=M;I=c[e+16>>2]|0;mF(e,74316)|0;switch(a[g+48>>0]|0){case 108:{mF(e,74322)|0;break}case 114:{mF(e,74343)|0;break}default:mF(e,74362)|0}H=f+8|0;G=+h[g+24>>3]+ +h[H>>3];h[H>>3]=G;H=I+260|0;if(!(b[H>>1]&512)){mF(e,74384)|0;tF(e,+h[f>>3]);mF(e,74389)|0;tF(e,-G);mF(e,99045)|0}x=g+4|0;f=c[x>>2]|0;n=c[f+8>>2]|0;if(n){f=n+16|0;i=n+8|0;switch(c[(c[(c[(c[e>>2]|0)+168>>2]|0)+16>>2]|0)+244>>2]|0){case 1:{m=n;break}case 2:{m=n+24|0;f=n+32|0;i=n+28|0;break}default:m=n+4|0}j=c[f>>2]|0;f=c[i>>2]|0;k=c[n+12>>2]|0;c[o>>2]=c[m>>2];sF(e,74395,o);i=c[n+24>>2]|0;if(i|0){c[p>>2]=i;sF(e,74412,p)}mF(e,99045)|0;if(f|0){c[r>>2]=f;sF(e,74416,r)}if(k|0){c[s>>2]=k;sF(e,74434,s)}if(!j)j=0;else{c[q>>2]=j;sF(e,74453,q)}}else{c[i>>2]=c[f>>2];sF(e,74470,i);j=0;f=0}i=c[x>>2]|0;if(i|0?(z=c[i+24>>2]|0,z&127|0):0){if(!((f|0)!=0|(z&1|0)==0))sF(e,74488,t);if(!((j|0)!=0|(z&2|0)==0))sF(e,74508,u);if(z&100|0){sF(e,74529,v);if(!(z&4))f=0;else{sF(e,106287,w);f=1}if(z&64){c[y>>2]=f|0?101300:195341;sF(e,74548,y);f=1}if(z&32|0){c[A>>2]=f|0?101300:195341;sF(e,74559,A)}sF(e,99045,B)}if(z&8|0)sF(e,74574,C);if(z&16|0)sF(e,74598,D)}h[E>>3]=+h[(c[x>>2]|0)+16>>3];sF(e,74620,E);f=I+16|0;switch(c[I+48>>2]|0){case 5:{f=c[f>>2]|0;if(C3(f,137615)|0){c[J>>2]=f;sF(e,74638,J)}break}case 1:{E=d[f+1>>0]|0;J=d[f+2>>0]|0;c[F>>2]=d[f>>0];c[F+4>>2]=E;c[F+8>>2]=J;sF(e,74649,F);break}default:Aa(138697,73830,486,74671)}mF(e,74684)|0;if(b[H>>1]&512){c[K>>2]=DK(c[I+212>>2]|0)|0;sF(e,74686,K);mF(e,74735)|0;tF(e,-G);mF(e,74753)|0}mF(e,EK(c[g>>2]|0,1)|0)|0;if(b[H>>1]&512)sF(e,74756,L);mF(e,74776)|0;l=M;return}function de(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;switch(c|0){case 2:{d=ke(a,b,2)|0;break}case 3:{d=le(a)|0;break}default:d=0}mF(a,74280)|0;ie(a,c,d);mF(a,74289)|0;tF(a,+h[b>>3]);mF(a,74295)|0;c=b+8|0;tF(a,-+h[c>>3]);mF(a,74302)|0;tF(a,+h[b+16>>3]-+h[b>>3]);mF(a,74309)|0;tF(a,+h[b+24>>3]-+h[c>>3]);mF(a,73696)|0;return}function ee(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;switch(d|0){case 2:{e=ke(a,b,c)|0;break}case 3:{e=le(a)|0;break}default:e=0}mF(a,74271)|0;ie(a,d,e);mF(a,73686)|0;e=0;while(1){if((e|0)>=(c|0))break;tF(a,+h[b+(e<<4)>>3]);mF(a,101300)|0;tF(a,-+h[b+(e<<4)+8>>3]);mF(a,102905)|0;e=e+1|0}tF(a,+h[b>>3]);mF(a,101300)|0;tF(a,-+h[b+8>>3]);mF(a,73696)|0;return}function fe(a,d,e,f,g,h){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;g=c[a+16>>2]|0;switch(h|0){case 2:{f=ke(a,d,e)|0;break}case 3:{f=le(a)|0;break}default:f=0}mF(a,73866)|0;if(b[g+260>>1]&512){mF(a,73872)|0;mF(a,DK(c[g+212>>2]|0)|0)|0;mF(a,73878)|0}ie(a,h,f);mF(a,73883)|0;me(a,d,e);mF(a,73696)|0;return}function ge(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;mF(a,73676)|0;ie(a,0,0);mF(a,73686)|0;d=0;while(1){if((d|0)>=(c|0))break;tF(a,+h[b+(d<<4)>>3]);mF(a,101300)|0;tF(a,-+h[b+(d<<4)+8>>3]);mF(a,102905)|0;d=d+1|0}mF(a,73696)|0;return}function he(a,b){a=a|0;b=b|0;mF(a,73670)|0;mF(a,DK(b)|0)|0;mF(a,75730)|0;return}function ie(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+96|0;k=q+48|0;p=q+40|0;n=q+32|0;o=q+24|0;j=q+16|0;g=q+8|0;f=q;m=c[b+16>>2]|0;mF(b,73701)|0;a:do switch(d|0){case 2:{c[f>>2]=e;sF(b,73709,f);break}case 3:{c[g>>2]=e;sF(b,73720,g);break}case 0:{mF(b,136010)|0;break}default:{d=m+56|0;f=k;g=d;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0));je(b,k);if((c[m+88>>2]|0)==1){d=a[d+3>>0]|0;switch(d<<24>>24){case -1:case 0:break a;default:{}}h[j>>3]=+(d&255)/255.0;sF(b,73731,j)}}}while(0);mF(b,73750)|0;e=m+16|0;f=k;g=e;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0));je(b,k);d=m+152|0;if(+h[d>>3]!=1.0){mF(b,73761)|0;tF(b,+h[d>>3])}switch(c[m+144>>2]|0){case 1:{c[o>>2]=73801;sF(b,73778,o);break}case 2:{c[n>>2]=73805;sF(b,73778,n);break}default:{}}b:do if((c[m+48>>2]|0)==1){d=a[e+3>>0]|0;switch(d<<24>>24){case -1:case 0:break b;default:{}}h[p>>3]=+(d&255)/255.0;sF(b,73809,p)}while(0);mF(b,99045)|0;l=q;return}function je(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+16|0;f=g;a:do switch(c[e+32>>2]|0){case 5:{mF(b,c[e>>2]|0)|0;break}case 1:if(!(a[e+3>>0]|0)){mF(b,137680)|0;break a}else{i=d[e+1>>0]|0;h=d[e+2>>0]|0;c[f>>2]=d[e>>0];c[f+4>>2]=i;c[f+8>>2]=h;sF(b,75986,f);break a}default:Aa(138697,73830,117,73850)}while(0);l=g;return}function ke(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+112|0;o=t+64|0;r=t+56|0;n=t+48|0;m=t+40|0;i=t+32|0;k=t;q=c[46764]|0;c[46764]=q+1;p=c[b+16>>2]|0;f=+(c[p+136>>2]|0)*3.141592653589793/180.0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[k+24>>2]=0;c[k+28>>2]=0;nQ(d,k,e,f,0);c[o>>2]=q;sF(b,74103,o);mF(b,74168)|0;tF(b,+h[k>>3]);mF(b,74173)|0;tF(b,+h[k+8>>3]);mF(b,74180)|0;tF(b,+h[k+16>>3]);mF(b,74187)|0;tF(b,+h[k+24>>3]);mF(b,74194)|0;k=p+140|0;f=+g[k>>2];if(f>0.0){h[i>>3]=f+-.001;sF(b,74199,i)}else mF(b,73975)|0;d=p+56|0;e=o;i=d;j=e+40|0;do{c[e>>2]=c[i>>2];e=e+4|0;i=i+4|0}while((e|0)<(j|0));je(b,o);mF(b,74011)|0;a:do if((c[p+88>>2]|0)==1){d=a[d+3>>0]|0;switch(d<<24>>24){case -1:case 0:{s=7;break a}default:{}}h[m>>3]=+(d&255)/255.0;sF(b,99913,m)}else s=7;while(0);if((s|0)==7)mF(b,74026)|0;mF(b,74029)|0;f=+g[k>>2];if(f>0.0){h[n>>3]=f;sF(b,74199,n)}else mF(b,74035)|0;d=p+96|0;e=o;i=d;j=e+40|0;do{c[e>>2]=c[i>>2];e=e+4|0;i=i+4|0}while((e|0)<(j|0));je(b,o);mF(b,74011)|0;b:do if((c[p+128>>2]|0)==1){d=a[d+3>>0]|0;switch(d<<24>>24){case -1:case 0:{s=14;break b}default:{}}h[r>>3]=+(d&255)/255.0;sF(b,99913,r)}else s=14;while(0);if((s|0)==14)mF(b,74026)|0;mF(b,74239)|0;l=t;return q|0}function le(b){b=b|0;var d=0,e=0.0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0;q=l;l=l+64|0;k=q+16|0;o=q+8|0;j=q;n=c[46763]|0;c[46763]=n+1;m=c[b+16>>2]|0;r=+(c[m+136>>2]|0)*3.141592653589793/180.0;e=r;if(r==0.0){f=50;d=50}else{f=~~((+I(+e)+1.0)*50.0);d=~~((1.0-+J(+e))*50.0)}c[k>>2]=n;c[k+4>>2]=f;c[k+8>>2]=d;sF(b,73891,k);mF(b,73975)|0;d=m+56|0;f=k;g=d;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0));je(b,k);mF(b,74011)|0;a:do if((c[m+88>>2]|0)==1){d=a[d+3>>0]|0;switch(d<<24>>24){case -1:case 0:{p=6;break a}default:{}}h[j>>3]=+(d&255)/255.0;sF(b,99913,j)}else p=6;while(0);if((p|0)==6)mF(b,74026)|0;mF(b,74029)|0;mF(b,74035)|0;d=m+96|0;f=k;g=d;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0));je(b,k);mF(b,74011)|0;b:do if((c[m+128>>2]|0)==1){d=a[d+3>>0]|0;switch(d<<24>>24){case -1:case 0:{p=10;break b}default:{}}h[o>>3]=+(d&255)/255.0;sF(b,99913,o)}else p=10;while(0);if((p|0)==10)mF(b,74026)|0;mF(b,74071)|0;l=q;return n|0}function me(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0;i=l;l=l+16|0;g=i;e=77;f=0;while(1){if((f|0)>=(d|0))break;c[g>>2]=e;sF(a,73888,g);tF(a,+h[b+(f<<4)>>3]);mF(a,101300)|0;tF(a,-+h[b+(f<<4)+8>>3]);e=(f|0)==0?67:32;f=f+1|0}l=i;return}function ne(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=l;l=l+16|0;i=j+8|0;h=j;mF(b,74859)|0;mF(b,DK(d)|0)|0;if(e|0){c[h>>2]=DK(e)|0;sF(b,74867,h)}c[i>>2]=f;sF(b,74871,i);d=NA(g,74883)|0;if(d|0?a[d>>0]|0:0){mF(b,102905)|0;mF(b,DK(d)|0)|0}mF(b,99045)|0;l=j;return}function oe(a){a=a|0;var b=0;mF(a,75690)|0;b=a+12|0;mF(a,ye(c[c[c[b>>2]>>2]>>2]|0)|0)|0;mF(a,78453)|0;mF(a,ye(c[(c[c[b>>2]>>2]|0)+4>>2]|0)|0)|0;mF(a,78463)|0;mF(a,ye(c[(c[c[b>>2]>>2]|0)+8>>2]|0)|0)|0;mF(a,75706)|0;return}function pe(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;d=c[b+16>>2]|0;mF(b,75667)|0;d=d+8|0;if(a[(HB(c[d>>2]|0)|0)>>0]|0){mF(b,75669)|0;mF(b,ye(HB(c[d>>2]|0)|0)|0)|0}c[e>>2]=S(c[b+168>>2]|0,c[b+164>>2]|0)|0;sF(b,75678,e);c[46765]=0;l=f;return}function qe(a){a=a|0;c[46765]=1;return}function re(a){a=a|0;c[46765]=-1;return}function se(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+48|0;i=n+8|0;m=n;f=c[b+16>>2]|0;if(c[f+144>>2]|0?(k=e+4|0,j=~~(+h[(c[k>>2]|0)+16>>3]*+h[b+352>>3]),j|0):0){ze(b);mF(b,75606)|0;g=d+8|0;h[g>>3]=+h[g>>3]-+(j|0)*.55;c[i>>2]=c[d>>2];c[i+4>>2]=c[d+4>>2];c[i+8>>2]=c[d+8>>2];c[i+12>>2]=c[d+12>>2];vF(b,i);mF(b,75620)|0;mF(b,c[e>>2]|0)|0;mF(b,75629)|0;mF(b,75427)|0;g=i;d=f+16|0;f=g+40|0;do{c[g>>2]=c[d>>2];g=g+4|0;d=d+4|0}while((g|0)<(f|0));Ae(b,i);mF(b,75631)|0;i=c[k>>2]|0;k=c[i+8>>2]|0;k=c[((k|0)==0?i:k+4|0)>>2]|0;mF(b,99045)|0;mF(b,k)|0;mF(b,99045)|0;c[m>>2]=j;sF(b,75640,m);switch(a[e+48>>0]|0){case 108:{mF(b,75645)|0;break}case 114:{mF(b,75656)|0;break}default:{}}Be(b);mF(b,153748)|0}l=n;return}function te(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0.0,m=0.0,n=0.0;j=l;l=l+48|0;f=j;g=c[a+16>>2]|0;i=g+144|0;if(c[i>>2]|0){n=+h[b>>3];e=b+8|0;m=+h[e>>3];k=+h[b+24>>3]-m;h[b>>3]=n-(+h[b+16>>3]-n);h[e>>3]=m-k;ze(a);mF(a,75592)|0;wF(a,b,2);mF(a,75427)|0;do if(!d)if(!(c[46765]|0)){mF(a,97610)|0;break}else{mF(a,137499)|0;break}else{b=f;d=g+56|0;e=b+40|0;do{c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}while((b|0)<(e|0));Ae(a,f)}while(0);if((c[46765]|0)==1)c[46765]=0;mF(a,75538)|0;tF(a,+h[g+152>>3]);mF(a,75581)|0;b=f;d=g+16|0;e=b+40|0;do{c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}while((b|0)<(e|0));Ae(a,f);b=c[i>>2]|0;if((b|0)==1){mF(a,75435)|0;b=c[i>>2]|0}if((b|0)==2)mF(a,75444)|0;Be(a);mF(a,153748)|0}l=j;return}function ue(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0;j=l;l=l+48|0;f=j;g=c[a+16>>2]|0;i=g+144|0;if(c[i>>2]|0){ze(a);mF(a,75564)|0;wF(a,b,d);mF(a,75427)|0;do if(!e)if(!(c[46765]|0)){mF(a,97610)|0;break}else{mF(a,137499)|0;break}else{b=f;d=g+56|0;e=b+40|0;do{c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}while((b|0)<(e|0));Ae(a,f)}while(0);if((c[46765]|0)==1)c[46765]=0;mF(a,75538)|0;tF(a,+h[g+152>>3]);mF(a,75581)|0;b=f;d=g+16|0;e=b+40|0;do{c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}while((b|0)<(e|0));Ae(a,f);b=c[i>>2]|0;if((b|0)==1){mF(a,75435)|0;b=c[i>>2]|0}if((b|0)==2)mF(a,75444)|0;Be(a);mF(a,153748)|0}l=j;return}function ve(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0;m=l;l=l+48|0;i=m;j=c[a+16>>2]|0;k=j+144|0;if(c[k>>2]|0){ze(a);mF(a,75413)|0;wF(a,b,d);mF(a,75427)|0;e=i;f=j+16|0;g=e+40|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(g|0));Ae(a,i);mF(a,75538)|0;tF(a,+h[j+152>>3]);e=c[k>>2]|0;if((e|0)==1){mF(a,75435)|0;e=c[k>>2]|0}if((e|0)==2)mF(a,75444)|0;mF(a,75547)|0;Be(a);mF(a,153748)|0}l=m;return}function we(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+48|0;g=i;e=c[a+16>>2]|0;h=e+144|0;if(c[h>>2]|0){ze(a);mF(a,75413)|0;wF(a,b,d);mF(a,75427)|0;f=g;b=e+16|0;d=f+40|0;do{c[f>>2]=c[b>>2];f=f+4|0;b=b+4|0}while((f|0)<(d|0));Ae(a,g);b=c[h>>2]|0;if((b|0)==1){mF(a,75435)|0;b=c[h>>2]|0}if((b|0)==2)mF(a,75444)|0;Be(a);mF(a,153748)|0}l=i;return}function xe(a,b){a=a|0;b=b|0;mF(a,75410)|0;mF(a,ye(b)|0)|0;mF(a,153748)|0;return}function ye(a){a=a|0;return a|0}function ze(b){b=b|0;if(!(a[b+144>>0]|0))mF(b,75535)|0;else mF(b,c[b+148>>2]|0)|0;return}function Ae(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+16|0;f=g;a:do switch(c[e+32>>2]|0){case 5:{mF(b,c[e>>2]|0)|0;break}case 1:if(!(a[e+3>>0]|0)){mF(b,97610)|0;break a}else{i=d[e+1>>0]|0;h=d[e+2>>0]|0;c[f>>2]=d[e>>0];c[f+4>>2]=i;c[f+8>>2]=h;sF(b,75986,f);break a}default:Aa(138697,75453,49,75517)}while(0);l=g;return}function Be(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;g=l;l=l+16|0;f=g;h=c[a+16>>2]|0;e=h+8|0;switch(c[h+12>>2]|0){case 8:{b=1;d=111782;break}case 10:{b=0;d=111782;break}case 3:case 2:case 9:{b=1;d=111751;break}case 7:case 6:case 11:{b=0;d=111751;break}case 0:{b=1;d=111795;break}case 4:{b=0;d=75489;break}case 1:{b=1;d=111795;break}case 5:{b=0;d=111795;break}default:Aa(138697,75453,106,75472)}h=c[(c[e>>2]|0)+8>>2]|0;c[f>>2]=b;c[f+4>>2]=d;c[f+8>>2]=h;sF(a,75501,f);l=g;return}function Ce(a){a=a|0;var b=0;mF(a,78425)|0;mF(a,78433)|0;b=a+12|0;mF(a,Ne(c[c[c[b>>2]>>2]>>2]|0)|0)|0;mF(a,78453)|0;mF(a,Ne(c[(c[c[b>>2]>>2]|0)+4>>2]|0)|0)|0;mF(a,78463)|0;mF(a,Ne(c[(c[c[b>>2]>>2]|0)+8>>2]|0)|0)|0;mF(a,78466)|0;return}function De(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0;j=l;l=l+32|0;i=j+24|0;g=j+16|0;f=j+8|0;e=j;d=c[b+16>>2]|0;c[46769]=~~(+h[b+232>>3]-+h[b+216>>3]);c[46768]=~~(+h[b+224>>3]-+h[b+208>>3]);mF(b,77112)|0;mF(b,77119)|0;d=HB(c[d+8>>2]|0)|0;if(a[d>>0]|0){mF(b,77188)|0;mF(b,Ne(d)|0)|0;mF(b,77196)|0}c[e>>2]=S(c[b+168>>2]|0,c[b+164>>2]|0)|0;sF(b,77205,e);mF(b,77225)|0;mF(b,77260)|0;mF(b,77288)|0;mF(b,77294)|0;mF(b,77337)|0;mF(b,77378)|0;mF(b,77397)|0;mF(b,77414)|0;mF(b,77462)|0;mF(b,77515)|0;mF(b,77591)|0;mF(b,77667)|0;mF(b,77676)|0;mF(b,77699)|0;mF(b,77726)|0;mF(b,77779)|0;mF(b,77801)|0;mF(b,77846)|0;mF(b,77858)|0;mF(b,77868)|0;mF(b,77894)|0;mF(b,77779)|0;mF(b,77946)|0;mF(b,77846)|0;mF(b,77858)|0;mF(b,77990)|0;mF(b,77699)|0;mF(b,77726)|0;mF(b,77779)|0;mF(b,77946)|0;mF(b,77846)|0;mF(b,77858)|0;mF(b,77868)|0;mF(b,77894)|0;mF(b,77779)|0;mF(b,77801)|0;mF(b,77846)|0;mF(b,77858)|0;mF(b,78003)|0;mF(b,78011)|0;mF(b,78017)|0;mF(b,78031)|0;mF(b,78039)|0;mF(b,78072)|0;e=(c[46769]|0)+10|0;c[f>>2]=c[46768];c[f+4>>2]=e;sF(b,78149,f);mF(b,78179)|0;mF(b,78188)|0;mF(b,78246)|0;mF(b,78256)|0;mF(b,78321)|0;f=c[46769]|0;c[g>>2]=c[46768];c[g+4>>2]=f;sF(b,78358,g);g=c[46769]|0;c[i>>2]=c[46768];c[i+4>>2]=g;sF(b,78386,i);l=j;return}function Ee(a){a=a|0;mF(a,76663)|0;mF(a,76675)|0;mF(a,76683)|0;mF(a,76746)|0;mF(a,76675)|0;mF(a,76791)|0;mF(a,76840)|0;mF(a,76894)|0;mF(a,76675)|0;mF(a,76994)|0;mF(a,77043)|0;mF(a,76675)|0;mF(a,77095)|0;return}function Fe(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=l;l=l+32|0;i=j+16|0;h=j+8|0;g=j;mF(b,76621)|0;if(d|0?a[d>>0]|0:0){c[g>>2]=Ne(d)|0;sF(b,76624,g)}if(e|0?a[e>>0]|0:0){c[h>>2]=Ne(e)|0;sF(b,76635,h)}if(f|0?a[f>>0]|0:0){c[i>>2]=Ne(f)|0;sF(b,76647,i)}mF(b,76660)|0;l=j;return}function Ge(a){a=a|0;mF(a,76615)|0;return}function He(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0;A=l;l=l+112|0;y=A+96|0;z=A+88|0;w=A+80|0;q=A+72|0;v=A+64|0;t=A+56|0;s=A+48|0;r=A+40|0;p=A+24|0;o=A+8|0;n=A;x=c[b+16>>2]|0;m=+h[f+32>>3];switch(a[f+48>>0]|0){case 108:{j=+h[e>>3];break}case 114:{j=+h[e>>3]-m;break}default:j=+h[e>>3]-m*.5}g=f+40|0;i=+h[g>>3];u=f+4|0;k=+h[(c[u>>2]|0)+16>>3];if(i>3]=i}D=j+-8.0;B=+((c[46769]|0)>>>0)-+h[e+8>>3];C=k/5.0+(k<12.0?1.4:2.0);k=C+(B-i);sF(b,76277,n);h[o>>3]=D;h[o+8>>3]=k;sF(b,76214,o);h[p>>3]=m+j+8.0-D;h[p+8>>3]=C+B-k;sF(b,76238,p);mF(b,76312)|0;mF(b,76346)|0;g=c[u>>2]|0;e=c[g+8>>2]|0;if(e){c[r>>2]=c[e+4>>2];sF(b,76436,r);g=c[e+8>>2]|0;if(g|0){c[s>>2]=g;sF(b,76455,s)}g=c[e+12>>2]|0;if(g|0){c[t>>2]=g;sF(b,76472,t)}g=c[e+16>>2]|0;if(g|0){c[v>>2]=g;sF(b,76490,v)}}else{c[q>>2]=c[g>>2];sF(b,76436,q)}h[w>>3]=+h[(c[u>>2]|0)+16>>3];sF(b,76506,w);g=x+16|0;switch(c[x+48>>2]|0){case 5:{g=c[g>>2]|0;if(C3(g,137615)|0){c[z>>2]=g;sF(b,76526,z)}break}case 1:{x=d[g+1>>0]|0;z=d[g+2>>0]|0;c[y>>2]=d[g>>0];c[y+4>>2]=x;c[y+8>>2]=z;sF(b,76536,y);break}default:Aa(138697,76e3,438,76557)}mF(b,76570)|0;mF(b,Ne(c[f>>2]|0)|0)|0;mF(b,76581)|0;mF(b,76604)|0;l=A;return}function Ie(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0,k=0.0,m=0.0;e=l;l=l+32|0;f=e+16|0;j=e;mF(a,76178)|0;m=+h[b>>3];i=+h[b+16>>3]-m;k=+h[b+8>>3];g=+h[b+24>>3]-k;k=+((c[46769]|0)>>>0)-(k+g);h[j>>3]=m-i;h[j+8>>3]=k;sF(a,76214,j);h[f>>3]=i*2.0;h[f+8>>3]=g*2.0;sF(a,76238,f);Re(a,d);mF(a,76060)|0;Pe(a);mF(a,76266)|0;l=e;return}function Je(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0.0,j=0,k=0,m=0,n=0;m=l;l=l+48|0;k=m+24|0;j=m+8|0;g=m;mF(a,75783)|0;n=c[46769]|0;c[g>>2]=c[46768];c[g+4>>2]=n;sF(a,76036,g);Re(a,e);mF(a,76060)|0;Pe(a);mF(a,76063)|0;g=d+-1|0;e=0;while(1){if((e|0)>=(d|0))break;i=+h[b+(e<<4)>>3];f=+((c[46769]|0)>>>0)-+h[b+(e<<4)+8>>3];if(!e){mF(a,76090)|0;h[j>>3]=i;h[j+8>>3]=f;sF(a,76156,j);mF(a,76167)|0}else{h[k>>3]=i;h[k+8>>3]=f;sF(a,76156,k)}if((e|0)==(g|0))mF(a,76170)|0;e=e+1|0}mF(a,75899)|0;l=m;return}function Ke(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;f=l;l=l+16|0;e=f;mF(a,75783)|0;h=c[46769]|0;c[e>>2]=c[46768];c[e+4>>2]=h;sF(a,76036,e);Re(a,g);mF(a,76060)|0;Pe(a);mF(a,76063)|0;Se(a,b,d);mF(a,76076)|0;l=f;return}function Le(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0.0;k=l;l=l+48|0;j=k+24|0;i=k+8|0;f=k;mF(a,75783)|0;g=c[46769]|0;c[f>>2]=c[46768];c[f+4>>2]=g;sF(a,75820,f);mF(a,75860)|0;f=d+-1|0;g=b+8|0;e=0;while(1){if((e|0)>=(d|0))break;if(!e){mF(a,75872)|0;m=+((c[46769]|0)>>>0)-+h[g>>3];h[i>>3]=+h[b>>3];h[i+8>>3]=m;sF(a,75876,i);mF(a,75887)|0}else{m=+((c[46769]|0)>>>0)-+h[b+(e<<4)+8>>3];h[j>>3]=+h[b+(e<<4)>>3];h[j+8>>3]=m;sF(a,75876,j)}if((e|0)==(f|0))mF(a,75891)|0;e=e+1|0}mF(a,75895)|0;Pe(a);mF(a,75899)|0;l=k;return}function Me(a,b){a=a|0;b=b|0;mF(a,75718)|0;mF(a,Ne(b)|0)|0;mF(a,75730)|0;return}function Ne(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+16|0;e=u;d=c[46766]|0;if(!d){c[46767]=64;d=IK(64)|0;c[46766]=d}s=e+15|0;r=e+14|0;g=0;q=0;o=0;e=0;f=0;a:while(1){n=(o|0)!=0;m=g;p=b;j=e;k=f;b:while(1){if(!p){t=29;break a}b=a[p>>0]|0;if(!(b<<24>>24)){t=29;break a}e=c[46767]|0;if((q|0)>(e+-8|0)){d=e<<1;c[46767]=d;d=KK(c[46766]|0,d)|0;c[46766]=d;d=d+q|0;e=a[p>>0]|0}else e=b;b=p+1|0;switch(e<<24>>24){case 60:{e=4;f=102454;t=24;break b}case 62:{e=4;f=102437;t=25;break b}case 38:{t=11;break b}case 45:{e=5;f=102448;i=m;break b}default:{}}if(n&e<<24>>24==32){t=13;break}switch(e<<24>>24){case 34:{e=6;f=102411;t=24;break b}case 39:{e=5;f=102442;t=25;break b}default:{}}if(e<<24>>24<0){i=127;f=0}else{e=1;f=p;t=24;break}while(1){g=i&255;h=e&255;if(g>>>0>=h>>>0)break;e=h&i&255;i=g>>>1;f=f+1|0}g=(f|0)>1;j=v6(j|0,k|0,6)|0;k=g?f:m;f=w6(e&255|0,0,(g?0:j)|0,(g?0:D)|0)|0;g=D;m=k+-1|0;if((k|0)>1){p=b;j=f;k=g}else{t=19;break}}if((t|0)==11){t=0;f=(Oe(p)|0)==0;e=f?5:1;f=f?102431:p;i=m}else if((t|0)==13){t=0;f=(a[o>>0]|0)==32;e=f?6:1;f=f?102424:p;i=m}else if((t|0)==19){t=0;a[s>>0]=59;e=3;i=r;j=f;k=g;while(1){f=J6(j|0,k|0,10,0)|0;h=i+-1|0;a[i>>0]=f|48;f=j;j=E6(j|0,k|0,10,0)|0;g=k;k=D;o=e;e=e+1|0;if((o|0)>11){t=21;break a}if(!(g>>>0>0|(g|0)==0&f>>>0>9))break;else i=h}f=i+-2|0;a[h>>0]=35;a[f>>0]=38;i=m}else if((t|0)==24){t=0;i=m}else if((t|0)==25){t=0;i=m}h=d+e|0;g=e;while(1){if(!g)break;a[d>>0]=a[f>>0]|0;g=g+-1|0;f=f+1|0;d=d+1|0}g=i;q=e+q|0;o=p;d=h;e=j;f=k}if((t|0)==21){_3(75736,46,1,c[15715]|0)|0;$a(1)}else if((t|0)==29){a[d>>0]=0;l=u;return c[46766]|0}return 0}function Oe(b){b=b|0;var c=0,d=0;d=b+1|0;c=a[d>>0]|0;a:do if(c<<24>>24==35){d=b+2|0;c=a[d>>0]|0;switch(c<<24>>24){case 88:case 120:break;default:{b=d;while(1){d=b+1|0;if((c+-48&255)>=10)break a;b=d;c=a[d>>0]|0}}}d=b+3|0;while(1){c=a[d>>0]|0;if((c+-48&255)>=10)switch(c<<24>>24){case 65:case 66:case 67:case 68:case 69:case 70:case 97:case 98:case 99:case 100:case 101:case 102:break;default:break a}d=d+1|0}}else while(1){b=d+1|0;if(((c&-33)+-65&255)>=26)break a;d=b;c=a[b>>0]|0}while(0);return c<<24>>24==59|0}function Pe(a){a=a|0;var b=0.0,d=0,e=0,f=0,g=0,i=0,j=0,k=0;k=l;l=l+48|0;d=k+8|0;j=k;i=c[a+16>>2]|0;mF(a,75911)|0;e=d;f=i+16|0;g=e+40|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(g|0));Qe(a,d);b=+h[i+152>>3];if(b!=1.0){h[j>>3]=b;sF(a,75929,j)}switch(c[i+144>>2]|0){case 1:{mF(a,75946)|0;break}case 2:{mF(a,75964)|0;break}default:{}}mF(a,75981)|0;l=k;return}function Qe(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+16|0;f=g;a:do switch(c[e+32>>2]|0){case 5:{mF(b,c[e>>2]|0)|0;break}case 1:if(!(a[e+3>>0]|0)){mF(b,136010)|0;break a}else{i=d[e+1>>0]|0;h=d[e+2>>0]|0;c[f>>2]=d[e>>0];c[f+4>>2]=i;c[f+8>>2]=h;sF(b,75986,f);break a}default:Aa(138697,76e3,94,76020)}while(0);l=g;return}function Re(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+48|0;f=g;if(!b)mF(a,76139)|0;else{d=c[a+16>>2]|0;mF(a,76109)|0;b=f;d=d+56|0;e=b+40|0;do{c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}while((b|0)<(e|0));Qe(a,f);mF(a,76136)|0}l=g;return}function Se(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0,k=0.0;i=l;l=l+32|0;g=i;e=76090;f=0;while(1){if((f|0)>=(d|0))break;k=+h[b+(f<<4)>>3];j=+((c[46769]|0)>>>0)-+h[b+(f<<4)+8>>3];c[g>>2]=e;h[g+8>>3]=k;h[g+16>>3]=j;sF(a,76093,g);e=(f|0)==0?76106:195341;f=f+1|0}mF(a,99045)|0;l=i;return}function Te(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+8|0;e=b;mF(a,80723)|0;mF(a,80738)|0;mF(a,80777)|0;mF(a,80826)|0;c[e>>2]=137615;c[e+4>>2]=80914;sF(a,80895,e);c[d>>2]=137499;c[d+4>>2]=80920;sF(a,80895,d);l=b;return}function Ue(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0.0,i=0.0,j=0;b=l;l=l+64|0;d=b+8|0;j=b;c[j>>2]=HB(c[(c[a+16>>2]|0)+8>>2]|0)|0;sF(a,79676,j);i=+h[a+368>>3]*.5*+h[a+488>>3];g=+h[a+376>>3]*.5*+h[a+496>>3];f=+N(+(i/500.0))*180.0/3.141592653589793*2.0;e=+N(+(g/500.0))*180.0/3.141592653589793*2.0;h[d>>3]=i;h[d+8>>3]=g;h[d+16>>3]=-500.0;h[d+24>>3]=i;h[d+32>>3]=g;h[d+40>>3]=0.0;h[d+48>>3]=(f>e?f:e)*1.2;sF(a,79698,d);mF(a,79845)|0;mF(a,80675)|0;l=b;return}function Ve(a){a=a|0;mF(a,79659)|0;return}function We(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0;f=l;l=l+16|0;h=f;c[h>>2]=b;c[h+4>>2]=d;c[h+8>>2]=e;sF(a,79629,h);g[46770]=+(S(d,-10)|0);l=f;return}function Xe(a){a=a|0;mF(a,79612)|0;return}function Ye(a){a=a|0;mF(a,79594)|0;return}function Ze(a){a=a|0;mF(a,79578)|0;return}function _e(a){a=a|0;mF(a,79557)|0;g[46770]=+g[46770]+-2.0;return}function $e(a){a=a|0;mF(a,79538)|0;return}function af(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=HB(c[(c[a+16>>2]|0)+8>>2]|0)|0;sF(a,79516,d);l=b;return}function bf(a){a=a|0;mF(a,79500)|0;return}function cf(a){a=a|0;mF(a,79482)|0;g[46770]=+g[46770]+-5.0;return}function df(a){a=a|0;mF(a,79466)|0;g[46770]=+g[46770]+5.0;return}function ef(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0;r=l;l=l+144|0;o=r+104|0;q=r+56|0;m=r+32|0;j=r+24|0;i=r;p=e+4|0;n=c[p>>2]|0;f=+h[n+16>>3];n=c[n>>2]|0;c[i>>2]=c[e>>2];h[i+8>>3]=f;c[i+16>>2]=n;sF(b,79312,i);g[46771]=+g[46770]+-9.0;i=e+32|0;switch(a[e+48>>0]|0){case 108:{f=+h[d>>3];break}case 114:{f=+h[d>>3]-+h[i>>3];k=5;break}default:{f=+h[d>>3]-+h[i>>3]*.5;k=5}}if((k|0)==5)h[d>>3]=f;u=+h[b+488>>3];t=(f+ +h[b+504>>3])*u;s=(+h[d+8>>3]+ +h[b+512>>3])*+h[b+496>>3];h[j>>3]=u*+h[(c[p>>2]|0)+16>>3];n=lf(b,79364,j)|0;f=+(c[b+360>>2]|0);h[m>>3]=0.0;h[m+8>>3]=0.0;h[m+16>>3]=f;i=lf(b,78581,m)|0;f=+g[46771];h[o>>3]=t;h[o+8>>3]=s;h[o+16>>3]=f;d=lf(b,78613,o)|0;j=o;k=(c[b+16>>2]|0)+16|0;m=j+40|0;do{c[j>>2]=c[k>>2];j=j+4|0;k=k+4|0}while((j|0)<(m|0));o=mf(b,o,0.0)|0;e=c[e>>2]|0;c[q>>2]=c[c[p>>2]>>2];h[q+8>>3]=.25;h[q+16>>3]=0.0;c[q+24>>2]=e;c[q+28>>2]=79451;c[q+32>>2]=n;c[q+36>>2]=i;c[q+40>>2]=d;c[q+44>>2]=o;q=lf(b,79376,q)|0;mF(b,q)|0;l6(q);l6(i);l6(o);l6(d);l6(n);l=r;return}function ff(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0;z=l;l=l+240|0;x=z+192|0;y=z+152|0;t=z+128|0;r=z+104|0;o=z+80|0;n=z+48|0;e=z+24|0;m=z;mF(a,79189)|0;g[46771]=+g[46770]+-6.0;j=+h[b>>3];i=+h[a+488>>3];p=(j+ +h[a+504>>3])*i;k=+h[b+8>>3];A=+h[a+496>>3];q=(k+ +h[a+512>>3])*A;j=i*(+h[b+16>>3]-j);k=A*(+h[b+24>>3]-k);s=a+16|0;A=j+k;i=+h[(c[s>>2]|0)+152>>3]/A*.5*5.0;h[m>>3]=j;h[m+8>>3]=A*.25;h[m+16>>3]=k;b=lf(a,78549,m)|0;m=a+360|0;A=+(c[m>>2]|0);h[e>>3]=90.0;h[e+8>>3]=0.0;h[e+16>>3]=A;e=lf(a,78581,e)|0;A=+g[46771];h[x>>3]=p;h[x+8>>3]=q;h[x+16>>3]=A;f=lf(a,78613,x)|0;u=x;v=(c[s>>2]|0)+16|0;w=u+40|0;do{c[u>>2]=c[v>>2];u=u+4|0;v=v+4|0}while((u|0)<(w|0));v=mf(a,x,0.0)|0;h[n>>3]=1.0;h[n+8>>3]=i;c[n+16>>2]=b;c[n+20>>2]=e;c[n+24>>2]=f;c[n+28>>2]=v;w=lf(a,79204,n)|0;mF(a,w)|0;l6(b);l6(e);l6(f);l6(v);l6(w);if(d|0){h[o>>3]=j;h[o+8>>3]=k;h[o+16>>3]=1.0;f=lf(a,78549,o)|0;A=+(c[m>>2]|0);h[r>>3]=0.0;h[r+8>>3]=0.0;h[r+16>>3]=A;e=lf(a,78581,r)|0;A=+g[46771];h[t>>3]=p;h[t+8>>3]=q;h[t+16>>3]=A;b=lf(a,78613,t)|0;u=x;v=(c[s>>2]|0)+56|0;w=u+40|0;do{c[u>>2]=c[v>>2];u=u+4|0;v=v+4|0}while((u|0)<(w|0));x=mf(a,x,0.0)|0;h[y>>3]=0.0;h[y+8>>3]=0.0;h[y+16>>3]=0.0;c[y+24>>2]=f;c[y+28>>2]=e;c[y+32>>2]=b;c[y+36>>2]=x;y=lf(a,79250,y)|0;mF(a,y)|0;l6(f);l6(e);l6(b);l6(x);l6(y)}l=z;return}function gf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;N=l;l=l+336|0;E=N+296|0;M=N+288|0;L=N+272|0;K=N+264|0;J=N+240|0;G=N+232|0;D=N+208|0;C=N+184|0;A=N+160|0;z=N+152|0;y=N+136|0;x=N+128|0;w=N+96|0;v=N+88|0;u=N+56|0;f=N+48|0;m=N+24|0;k=N;mF(a,79054)|0;g[46771]=+g[46770]+-2.0;s=a+488|0;t=a+496|0;q=+h[t>>3];h[k>>3]=+h[s>>3];h[k+8>>3]=q;h[k+16>>3]=1.0;k=lf(a,78549,k)|0;B=a+360|0;q=+(c[B>>2]|0);h[m>>3]=0.0;h[m+8>>3]=0.0;h[m+16>>3]=q;m=lf(a,78581,m)|0;q=+g[46771]+-2.0;h[E>>3]=0.0;h[E+8>>3]=0.0;h[E+16>>3]=q;n=lf(a,78613,E)|0;F=a+16|0;i=E;j=(c[F>>2]|0)+16|0;r=i+40|0;do{c[i>>2]=c[j>>2];i=i+4|0;j=j+4|0}while((i|0)<(r|0));j=mf(a,E,0.0)|0;c[f>>2]=78676;c[f+4>>2]=d+1;H=a+512|0;I=a+504|0;i=0;f=lf(a,78645,f)|0;while(1){o=+h[H>>3];p=+h[I>>3];q=+h[(c[F>>2]|0)+152>>3];if((i|0)>=(d|0))break;o=o+ +h[b+(i<<4)+8>>3];h[u>>3]=p+ +h[b+(i<<4)>>3];h[u+8>>3]=o;h[u+16>>3]=0.0;h[u+24>>3]=q;O=lf(a,78690,u)|0;c[v>>2]=f;c[v+4>>2]=O;r=lf(a,78719,v)|0;l6(O);l6(f);i=i+1|0;f=r}o=o+ +h[b+8>>3];h[w>>3]=p+ +h[b>>3];h[w+8>>3]=o;h[w+16>>3]=0.0;h[w+24>>3]=q;w=lf(a,78690,w)|0;c[x>>2]=f;c[x+4>>2]=w;O=lf(a,78719,x)|0;l6(w);l6(f);c[y>>2]=k;c[y+4>>2]=m;c[y+8>>2]=n;c[y+12>>2]=j;y=lf(a,79069,y)|0;c[z>>2]=O;c[z+4>>2]=y;O=lf(a,78774,z)|0;l6(y);mF(a,O)|0;l6(k);l6(m);l6(n);l6(j);l6(O);if(e|0){q=+h[t>>3];h[A>>3]=+h[s>>3];h[A+8>>3]=q;h[A+16>>3]=1.0;n=lf(a,78549,A)|0;q=+(c[B>>2]|0);h[C>>3]=0.0;h[C+8>>3]=0.0;h[C+16>>3]=q;m=lf(a,78581,C)|0;q=+g[46771]+-2.0;h[D>>3]=0.0;h[D+8>>3]=0.0;h[D+16>>3]=q;k=lf(a,78613,D)|0;i=E;j=(c[F>>2]|0)+56|0;r=i+40|0;do{c[i>>2]=c[j>>2];i=i+4|0;j=j+4|0}while((i|0)<(r|0));j=mf(a,E,.25)|0;c[G>>2]=d;i=0;f=lf(a,79114,G)|0;while(1){if((i|0)>=(d|0))break;q=+h[b+(i<<4)+8>>3]+ +h[H>>3];h[J>>3]=+h[b+(i<<4)>>3]+ +h[I>>3];h[J+8>>3]=q;h[J+16>>3]=0.0;G=lf(a,79129,J)|0;c[K>>2]=f;c[K+4>>2]=G;O=lf(a,79151,K)|0;l6(G);l6(f);i=i+1|0;f=O}c[L>>2]=n;c[L+4>>2]=m;c[L+8>>2]=k;c[L+12>>2]=j;L=lf(a,79161,L)|0;c[M>>2]=f;c[M+4>>2]=L;O=lf(a,78774,M)|0;l6(L);mF(a,O)|0;l6(n);l6(m);l6(k);l6(j);l6(O)}l=N;return}function hf(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0;B=l;l=l+208|0;e=B+160|0;A=B+152|0;z=B+136|0;y=B+128|0;x=B+96|0;w=B+88|0;v=B+56|0;k=B+48|0;s=B+24|0;r=B;mF(a,78981)|0;g[46771]=+g[46770]+-4.0;C=+h[a+496>>3];h[r>>3]=+h[a+488>>3];h[r+8>>3]=C;h[r+16>>3]=1.0;r=lf(a,78549,r)|0;C=+(c[a+360>>2]|0);h[s>>3]=0.0;h[s+8>>3]=0.0;h[s+16>>3]=C;s=lf(a,78581,s)|0;C=+g[46771]+-2.0;h[e>>3]=0.0;h[e+8>>3]=0.0;h[e+16>>3]=C;t=lf(a,78613,e)|0;u=a+16|0;f=e;i=(c[u>>2]|0)+56|0;j=f+40|0;do{c[f>>2]=c[i>>2];f=f+4|0;i=i+4|0}while((f|0)<(j|0));n=mf(a,e,0.0)|0;c[k>>2]=78995;c[k+4>>2]=d+2;o=a+504|0;p=a+512|0;q=d+-1|0;m=0;e=lf(a,78645,k)|0;while(1){if((m|0)>=(d|0))break;f=b+(m<<4)|0;i=b+(m<<4)+8|0;D=+h[i>>3]+ +h[p>>3];C=+h[(c[u>>2]|0)+152>>3];h[v>>3]=+h[f>>3]+ +h[o>>3];h[v+8>>3]=D;h[v+16>>3]=0.0;h[v+24>>3]=C;k=lf(a,78690,v)|0;c[w>>2]=e;c[w+4>>2]=k;j=lf(a,78719,w)|0;l6(k);l6(e);if((m|0)==0|(m|0)==(q|0)){C=+h[i>>3]+ +h[p>>3];D=+h[(c[u>>2]|0)+152>>3];h[x>>3]=+h[f>>3]+ +h[o>>3];h[x+8>>3]=C;h[x+16>>3]=0.0;h[x+24>>3]=D;k=lf(a,78690,x)|0;c[y>>2]=j;c[y+4>>2]=k;e=lf(a,78719,y)|0;l6(k);l6(j)}else e=j;m=m+1|0}c[z>>2]=r;c[z+4>>2]=s;c[z+8>>2]=t;c[z+12>>2]=n;b=lf(a,79004,z)|0;c[A>>2]=e;c[A+4>>2]=b;d=lf(a,78774,A)|0;l6(b);mF(a,d)|0;l6(r);l6(s);l6(t);l6(n);l6(d);l=B;return}function jf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0.0;v=l;l=l+160|0;e=v+120|0;u=v+112|0;t=v+96|0;s=v+88|0;r=v+56|0;m=v+48|0;n=v+24|0;q=v;mF(a,78533)|0;g[46771]=+g[46770]+-6.0;w=+h[a+496>>3];h[q>>3]=+h[a+488>>3];h[q+8>>3]=w;h[q+16>>3]=1.0;q=lf(a,78549,q)|0;w=+(c[a+360>>2]|0);h[n>>3]=0.0;h[n+8>>3]=0.0;h[n+16>>3]=w;n=lf(a,78581,n)|0;w=+g[46771];h[e>>3]=0.0;h[e+8>>3]=0.0;h[e+16>>3]=w;o=lf(a,78613,e)|0;p=a+16|0;f=e;i=(c[p>>2]|0)+16|0;j=f+40|0;do{c[f>>2]=c[i>>2];f=f+4|0;i=i+4|0}while((f|0)<(j|0));i=mf(a,e,0.0)|0;c[m>>2]=78676;c[m+4>>2]=d;j=a+504|0;k=a+512|0;f=0;e=lf(a,78645,m)|0;while(1){if((f|0)>=(d|0))break;y=+h[b+(f<<4)+8>>3]+ +h[k>>3];w=+h[(c[p>>2]|0)+152>>3];h[r>>3]=+h[b+(f<<4)>>3]+ +h[j>>3];h[r+8>>3]=y;h[r+16>>3]=0.0;h[r+24>>3]=w;x=lf(a,78690,r)|0;c[s>>2]=e;c[s+4>>2]=x;m=lf(a,78719,s)|0;l6(x);l6(e);f=f+1|0;e=m}c[t>>2]=q;c[t+4>>2]=n;c[t+8>>2]=o;c[t+12>>2]=i;t=lf(a,78728,t)|0;c[u>>2]=e;c[u+4>>2]=t;x=lf(a,78774,u)|0;l6(t);mF(a,x)|0;l6(q);l6(n);l6(o);l6(i);l6(x);l=v;return}function kf(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;sF(a,78514,e);l=d;return}function lf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+1056|0;h=i;e=i+24|0;f=i+8|0;c[f>>2]=d;g=k2(e,1024,b,f)|0;do if((g|0)>=0)if((g|0)>1023){a=k6(g+1|0)|0;c[f>>2]=d;j2(a,b,f)|0;break}else{a=Y3(e)|0;break}else{a=c[(c[a+12>>2]|0)+16>>2]|0;c[h>>2]=v2(c[(L1()|0)>>2]|0)|0;lb[a&63](78959,h);a=Y3(195341)|0}while(0);l=i;return a|0}function mf(a,b,e){a=a|0;b=b|0;e=+e;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0;q=l;l=l+112|0;o=q+104|0;j=q+96|0;i=q+64|0;m=q+48|0;p=q+32|0;n=q+16|0;k=q;g=c[b+32>>2]|0;a:do switch(g|0){case 5:{f=c[b>>2]|0;if(!(f2(f,136603)|0)){c[k>>2]=78796;h[k+8>>3]=e;f=lf(a,78779,k)|0;break a}if(!(f2(f,133733)|0)){c[n>>2]=78800;h[n+8>>3]=e;f=lf(a,78779,n)|0;break a}if(!(f2(f,131732)|0)){c[p>>2]=78806;h[p+8>>3]=e;f=lf(a,78779,p)|0;break a}else{c[m>>2]=f;h[m+8>>3]=e;f=lf(a,78779,m)|0;break a}}case 1:{s=+(d[b+1>>0]|0)*.00390625;r=+(d[b+2>>0]|0)*.00390625;h[i>>3]=+(d[b>>0]|0)*.00390625;h[i+8>>3]=s;h[i+16>>3]=r;h[i+24>>3]=e;f=lf(a,78811,i)|0;break}default:{p=c[15715]|0;n=c[b>>2]|0;c[j>>2]=g;c[j+4>>2]=n;z4(p,78850,j)|0;Aa(138697,78900,436,78920)}}while(0);c[o>>2]=f;p=lf(a,78937,o)|0;l6(f);l=q;return p|0}function nf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=l;l=l+32|0;d=b+24|0;e=b+16|0;g=b;f=c[a+16>>2]|0;h=c[c[a+12>>2]>>2]|0;j=c[h>>2]|0;i=c[h+4>>2]|0;h=c[h+8>>2]|0;c[g>>2]=81366;c[g+4>>2]=j;c[g+8>>2]=i;c[g+12>>2]=h;sF(a,83976,g);f=HB(c[f+8>>2]|0)|0;c[e>>2]=81366;c[e+4>>2]=f;sF(a,84008,e);c[d>>2]=81366;sF(a,84022,d);l=b;return}function of(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=81366;sF(a,83924,d);l=b;return}function pf(a){a=a|0;var b=0.0,d=0.0,e=0.0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;W=l;l=l+304|0;V=W+296|0;U=W+288|0;T=W+272|0;R=W+264|0;Q=W+256|0;P=W+248|0;O=W+240|0;N=W+232|0;M=W+224|0;L=W+216|0;K=W+208|0;J=W+200|0;I=W+192|0;G=W+184|0;F=W+176|0;E=W+168|0;D=W+160|0;C=W+152|0;A=W+144|0;z=W+136|0;y=W+128|0;x=W+120|0;w=W+112|0;v=W+104|0;u=W+96|0;t=W+88|0;s=W+80|0;r=W+72|0;q=W+64|0;p=W+56|0;o=W+48|0;S=W+40|0;B=W+24|0;n=W+16|0;m=W;f=c[a+456>>2]|0;g=c[a+460>>2]|0;i=c[a+464>>2]|0;j=c[a+468>>2]|0;k=a+360|0;a:do if(c[4035]|0){switch(c[k>>2]|0){case 90:case 0:break a;default:{}}Bf();c[4035]=0}while(0);e=(+(j|0)-+(g|0))/72.0;b=(+(i|0)-+(f|0))/72.0;k=(c[k>>2]|0)==90;d=k?e:b;e=k?b:e;h[m>>3]=d;h[m+8>>3]=e;sF(a,81553,m);c[n>>2]=81366;sF(a,81568,n);if(d>0.0){b=+V3(d);h[19233]=b;b=b+(3.0-+(~~b|0))}else b=3.0;b=+H(10.0,+b);h[19233]=b;h[B>>3]=b;h[B+8>>3]=b;sF(a,81737,B);c[S>>2]=81366;sF(a,81772,S);c[o>>2]=81366;sF(a,81830,o);c[p>>2]=81366;sF(a,81890,p);c[q>>2]=81366;sF(a,81939,q);c[r>>2]=81366;sF(a,81978,r);c[s>>2]=81366;sF(a,82029,s);c[t>>2]=81366;sF(a,82091,t);c[u>>2]=81366;sF(a,82201,u);c[v>>2]=81366;sF(a,82292,v);c[w>>2]=81366;sF(a,82346,w);c[x>>2]=81366;sF(a,82415,x);sF(a,82451,y);c[z>>2]=81366;sF(a,82576,z);c[A>>2]=81366;sF(a,82605,A);sF(a,82645,C);c[D>>2]=81366;sF(a,82738,D);c[E>>2]=81366;sF(a,82797,E);c[F>>2]=81366;sF(a,82878,F);sF(a,82948,G);c[I>>2]=81366;sF(a,83037,I);c[J>>2]=81366;sF(a,83142,J);c[K>>2]=81366;sF(a,83218,K);c[L>>2]=81366;sF(a,83257,L);c[M>>2]=81366;sF(a,83356,M);c[N>>2]=81366;sF(a,83402,N);sF(a,83491,O);c[P>>2]=81366;sF(a,83532,P);c[Q>>2]=81366;sF(a,83615,Q);c[R>>2]=81366;sF(a,83716,R);h[T>>3]=e;h[T+8>>3]=d;sF(a,83780,T);sF(a,83808,U);sF(a,83816,V);l=W;return}function qf(a){a=a|0;var b=0;b=l;l=l+16|0;sF(a,81546,b);l=b;return}function rf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0,m=0.0,n=0,o=0,p=0,q=0,r=0;q=l;l=l+48|0;p=q+24|0;o=q+8|0;n=q;j=+h[e+32>>3];switch(a[e+48>>0]|0){case 108:{i=+h[d>>3];break}case 114:{g=j;f=4;break}default:{g=j*.5;f=4}}if((f|0)==4){i=+h[d>>3]-g;h[d>>3]=i}k=e+4|0;f=c[k>>2]|0;g=+h[f+16>>3];r=d+8|0;m=+h[r>>3]+g/216.0;h[r>>3]=m;i=j/144.0+i;h[d>>3]=i;f=c[f>>2]|0;do if(f){d=c[46772]|0;if(d|0?(f2(d,f)|0)==0:0)break;c[n>>2]=zf(f)|0;sF(b,81445,n);r=c[k>>2]|0;c[46772]=c[r>>2];g=+h[r+16>>3]}while(0);f=~~g;f=(f|0)>1?f:1;if((f|0)!=(c[46773]|0)){j=+h[19233];c[o>>2]=f;h[o+8>>3]=j;sF(b,81453,o);c[46773]=f}c[p>>2]=Af(c[e>>2]|0)|0;h[p+8>>3]=i;h[p+16>>3]=m;sF(b,81474,p);l=q;return}function sf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+48|0;f=e;i=+h[b>>3];k=(+h[b+16>>3]-i)*2.0/72.0;g=+h[b+8>>3];j=(+h[b+24>>3]-g)*2.0/72.0;c[f>>2]=1;c[f+4>>2]=d|0?81387:195341;h[f+8>>3]=k;h[f+16>>3]=j;h[f+24>>3]=i/72.0;h[f+32>>3]=g/72.0;sF(a,81393,f);l=e;return}function tf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=l;l=l+16|0;xf(c[a+16>>2]|0,e+8|0,e);yf(a,b,d,1);l=e;return}function uf(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0;t=l;l=l+128|0;s=t+112|0;q=t+104|0;p=t+96|0;e=t+88|0;n=t+16|0;o=t;k=c[a+16>>2]|0;j=k6((d*140|0)+140|0)|0;xf(k,t+116|0,t+80|0);v=+h[b>>3];k=n+48|0;h[k>>3]=v;u=+h[b+8>>3];h[n+56>>3]=u;c[e>>2]=~~(v+(v>=0.0?.5:-.5));c[e+4>>2]=~~(u+(u>=0.0?.5:-.5));i=o+8|0;e=j+(i2(j,81371,e)|0)|0;r=1;g=0;while(1){m=g+3|0;if((m|0)>=(d|0))break;c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];f=1;while(1){if((f|0)==4){f=1;break}w=f+g|0;h[n+(f<<4)>>3]=+h[b+(w<<4)>>3];h[n+(f<<4)+8>>3]=+h[b+(w<<4)+8>>3];f=f+1|0}while(1){if((f|0)==7)break;iP(o,n,3,+(f|0)/6.0,0,0);u=+h[o>>3];v=+h[i>>3];c[p>>2]=~~(u+(u>=0.0?.5:-.5));c[p+4>>2]=~~(v+(v>=0.0?.5:-.5));f=f+1|0;e=e+(i2(e,81371,p)|0)|0}r=r+6|0;g=m}c[q>>2]=j;sF(a,81378,q);l6(j);f=r+-1|0;e=0;while(1){if((e|0)>=(r|0))break;c[s>>2]=((e|0)%(f|0)|0|0)!=0&1;sF(a,81383,s);e=e+1|0}mF(a,153748)|0;l=t;return}function vf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;xf(c[a+16>>2]|0,e+8|0,e);yf(a,b,d,0);l=e;return}function wf(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=81366;c[e+4>>2]=b;sF(a,81359,e);l=d;return}function xf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0;switch(c[a+144>>2]|0){case 1:{e=10.0;a=1;break}case 2:{e=10.0;a=2;break}default:{e=0.0;a=0}}c[b>>2]=a;h[d>>3]=e;return}function yf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,m=0.0;j=l;l=l+16|0;i=j+8|0;g=j;f=0;while(1){if((f|0)>=(d|0))break;m=+h[b+(f<<4)>>3];k=+h[b+(f<<4)+8>>3];c[g>>2]=~~(m+(m>=0.0?.5:-.5));c[g+4>>2]=~~(k+(k>=0.0?.5:-.5));sF(a,81371,g);f=f+1|0}if(e|0){k=+h[b>>3];m=+h[b+8>>3];c[i>>2]=~~(k+(k>=0.0?.5:-.5));c[i+4>>2]=~~(m+(m>=0.0?.5:-.5));sF(a,81371,i)}mF(a,153748)|0;l=j;return}function zf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;a:while(1){d=15868;while(1){e=c[d+4>>2]|0;if(!e)break;if(!(f2(e,b)|0)){g=6;break a}d=d+8|0}c[f>>2]=81527;c[f+4>>2]=b;dA(1,81501,f)|0;d=I4(b,45)|0;if(!d){d=81544;break}a[d>>0]=0}l=h;return d|0}function Af(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;d=c[46774]|0;if(!d){c[46775]=64;d=k6(64)|0;c[46774]=d;e=0}else e=0;while(1){g=b+1|0;f=a[b>>0]|0;if(!(f<<24>>24))break;b=c[46775]|0;if((e|0)>(b+-8|0)){d=b<<1;c[46775]=d;d=n6(c[46774]|0,d)|0;c[46774]=d;d=d+e|0}b=d+1|0;if(f<<24>>24<=-1){a[d>>0]=92;c[h>>2]=f&255;i2(b,81496,h)|0;b=g;d=d+4|0;e=e+4|0;continue}if(f<<24>>24==92){a[d>>0]=92;e=e+1|0;d=b}a[d>>0]=f;b=g;d=d+1|0;e=e+1|0}a[d>>0]=0;l=i;return c[46774]|0}function Bf(){var a=0,b=0;a=l;l=l+16|0;b=a;c[b>>2]=81527;c[b+4>>2]=91570;dA(0,83906,b)|0;l=a;return}function Cf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0;e=l;l=l+32|0;f=e+8|0;j=e;b=b+8|0;k=c[b>>2]|0;c[j>>2]=k;c[j+4>>2]=k;sF(a,84495,j);i=(+h[d+16>>3]+ +h[d>>3])*.5;g=(+h[d+24>>3]+ +h[d+8>>3])*.5;c[f>>2]=c[b>>2];h[f+8>>3]=i;h[f+16>>3]=g;sF(a,84537,f);l=e;return}function Df(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+48|0;f=e;i=+h[d>>3];k=+h[d+16>>3]-i;g=+h[d+24>>3];j=g-+h[d+8>>3];g=+(~~(+h[a+232>>3]-+h[a+216>>3])>>>0)-g;c[f>>2]=c[b+8>>2];h[f+8>>3]=k;h[f+16>>3]=j;h[f+24>>3]=i;h[f+32>>3]=g;sF(a,84582,f);mF(a,84674)|0;l=e;return}function Ef(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function Ff(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;t=l;l=l+160|0;s=t+152|0;r=t+136|0;q=t+120|0;k=t+112|0;n=t+104|0;m=t+88|0;j=t+72|0;i=t+64|0;o=t;if(!a)Aa(111583,84679,212,84698);if(!b)Aa(111613,84679,213,84698);p=b+8|0;if(!(c[p>>2]|0))Aa(111616,84679,214,84698);if(c[b+52>>2]|0){c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];b=o+32|0;d=d+16|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];f=+h[o>>3];h[o+16>>3]=f;h[o+24>>3]=+h[o+40>>3];h[o+48>>3]=+h[b>>3];g=+h[o+8>>3];h[o+56>>3]=g;if(e<<24>>24){sF(a,84719,i);b=0;while(1){if((b|0)==4)break;u=+h[o+(b<<4)+8>>3];h[j>>3]=+h[o+(b<<4)>>3];h[j+8>>3]=u;sF(a,84722,j);b=b+1|0}h[m>>3]=f;h[m+8>>3]=g;sF(a,84722,m);m=c[p>>2]|0;c[n>>2]=4;c[n+4>>2]=m;sF(a,84729,n)}sF(a,84719,k);b=0;while(1){if((b|0)==4)break;u=+h[o+(b<<4)+8>>3];h[q>>3]=+h[o+(b<<4)>>3];h[q+8>>3]=u;sF(a,84722,q);b=b+1|0}h[r>>3]=f;h[r+8>>3]=g;sF(a,84722,r);r=c[p>>2]|0;c[s>>2]=4;c[s+4>>2]=r;sF(a,84744,s)}l=t;return}function Gf(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0;p=l;l=l+112|0;o=p+24|0;n=p+16|0;m=p;g=p+28|0;if(!b)Aa(111583,84679,153,84760);if(!d)Aa(111613,84679,154,84760);if(!(c[d+8>>2]|0))Aa(111616,84679,155,84760);j=d+52|0;k=d+60|0;if(c[j>>2]|0){f=c[k>>2]|0;if((f|0)==100)i=18;else{db[f&127](d);c[j>>2]=0;c[k>>2]=0;c[d+56>>2]=0;i=10}}else i=10;do if((i|0)==10){if(!((MF(d)|0)<<24>>24))break;f=V5(c[d+20>>2]|0)|0;if((c[d+24>>2]&-2|0)==6){i3(f,g)|0;g=c[g+36>>2]|0;c[d+56>>2]=g;f=K4(0,g,1,1,f,0)|0;c[j>>2]=f;a[d+16>>0]=1}else f=c[j>>2]|0;if(f|0)c[k>>2]=100;NF(d);if(c[j>>2]|0)i=18}while(0);if((i|0)==18){q=+h[e+8>>3]-+(c[d+36>>2]|0);h[m>>3]=+h[e>>3]-+(c[d+32>>2]|0);h[m+8>>3]=q;sF(b,84778,m);if(!(a[d+16>>0]|0)){c[n>>2]=c[d+12>>2];sF(b,84809,n)}else xM(b,d);sF(b,84824,o)}l=p;return}function Hf(a){a=a|0;E3(c[a+52>>2]|0,c[a+56>>2]|0)|0;return}function If(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+80|0;f=g+48|0;if(!a)Aa(111583,84679,121,84834);e=c[a+16>>2]|0;if(!e)Aa(100203,84679,123,84834);if(!b)Aa(111613,84679,124,84834);d=b+8|0;if(!(c[d>>2]|0))Aa(111616,84679,125,84834);if(!(c[e+8>>2]|0))Aa(139182,84679,128,84834);else{sF(a,84854,g);sF(a,84863,g+8|0);sF(a,84890,g+16|0);sF(a,84915,g+24|0);sF(a,84944,g+32|0);sF(a,84972,g+40|0);c[f>>2]=c[d>>2];sF(a,84979,f);sF(a,85018,g+56|0);sF(a,111309,g+64|0);l=g;return}}function Jf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0.0;i=l;l=l+128|0;g=i+80|0;f=i;if(!a)Aa(111583,84679,97,85023);if(!b)Aa(111613,84679,98,85023);e=c[b+8>>2]|0;if(!e)Aa(111616,84679,99,85023);else{m=+h[d>>3];j=~~(m+(m>=0.0?.5:-.5));m=+h[d+8>>3];b=~~(m+(m>=0.0?.5:-.5));m=+h[d+16>>3];k=~~(m+(m>=0.0?.5:-.5));m=+h[d+24>>3];d=~~(m+(m>=0.0?.5:-.5));c[f>>2]=2;c[f+4>>2]=5;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=-1;c[f+24>>2]=1;c[f+28>>2]=-1;c[f+32>>2]=0;h[f+40>>3]=0.0;c[f+48>>2]=0;c[f+52>>2]=0;c[f+56>>2]=0;c[f+60>>2]=0;c[f+64>>2]=0;c[f+68>>2]=5;c[f+72>>2]=0;c[f+76>>2]=e;sF(a,85042,f);c[g>>2]=j;c[g+4>>2]=b;c[g+8>>2]=j;c[g+12>>2]=d;c[g+16>>2]=k;c[g+20>>2]=d;c[g+24>>2]=k;c[g+28>>2]=b;c[g+32>>2]=j;c[g+36>>2]=b;sF(a,85100,g);l=i;return}}function Kf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0.0;p=l;l=l+96|0;o=p+56|0;n=p+32|0;m=p;q=+h[d+16>>3];i=+h[d>>3];k=q-i;j=+h[d+24>>3];f=+h[d+8>>3];g=j-f;i=(q+i-k)*.5;if(!a)Aa(111583,84679,53,85132);if(!b)Aa(111613,84679,54,85132);e=b+8|0;if(!(c[e>>2]|0))Aa(111616,84679,55,85132);mF(a,85151)|0;mF(a,c[e>>2]|0)|0;e=a+360|0;f=-((j+f+g)*.5);if(!(c[e>>2]|0)){h[o>>3]=k;h[o+8>>3]=g;h[o+16>>3]=i;h[o+24>>3]=f;sF(a,85280,o)}else{h[m>>3]=g;h[m+8>>3]=k;h[m+16>>3]=i;h[m+24>>3]=f;sF(a,85171,m);c[n>>2]=c[e>>2];h[n+8>>3]=i;h[n+16>>3]=f;sF(a,85250,n)}mF(a,85359)|0;l=p;return}function Lf(a){a=a|0;var b=0,c=0;b=gC(a)|0;while(1){if(!b)break;Mf(b);b=hC(a,b)|0}c=gC(a)|0;while(1){if(!c)break;b=UA(a,c)|0;while(1){if(!b)break;Nf(b);b=WA(a,b)|0}c=hC(a,c)|0}return}function Mf(a){a=a|0;var b=0,d=0;RC(a,137750,304,1)|0;qP(a);oQ(a,c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&1);a=a+16|0;c[(c[a>>2]|0)+176>>2]=0;b=HK(20)|0;d=c[a>>2]|0;c[d+172>>2]=b;c[d+184>>2]=0;d=HK(20)|0;b=c[a>>2]|0;c[b+180>>2]=d;c[b+200>>2]=0;b=HK(12)|0;d=c[a>>2]|0;c[d+196>>2]=b;c[d+192>>2]=0;d=HK(12)|0;b=c[a>>2]|0;c[b+188>>2]=d;c[b+208>>2]=0;b=HK(12)|0;a=c[a>>2]|0;c[a+204>>2]=b;c[a+216>>2]=1;return}function Nf(d){d=d|0;var e=0,f=0,g=0,h=0,i=0;RC(d,137763,176,1)|0;rP(d)|0;h=XO(d,c[47236]|0,1,0)|0;g=d+16|0;c[(c[g>>2]|0)+156>>2]=h;h=_O(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0,c[47230]|0,195341)|0;i=_O(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0,c[47230]|0,195341)|0;e=c[g>>2]|0;f=e+154|0;b[f>>1]=1;b[e+168>>1]=1;if((h|0)==(i|0)&(a[h>>0]|0)!=0){b[f>>1]=1e3;i=e+156|0;c[i>>2]=(c[i>>2]|0)*100}if(Jk(d)|0){i=c[g>>2]|0;b[i+154>>1]=0;c[i+156>>2]=0}i=(XO(d,c[47256]|0,0,0)|0)&255;a[(c[g>>2]|0)+152>>0]=i;i=(XO(d,c[47237]|0,1,0)|0)&65535;b[(c[g>>2]|0)+170>>1]=i;return}function Of(a){a=a|0;var b=0,d=0;Pf(c[(c[a+16>>2]|0)+192>>2]|0);d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;WP(b);b=WA(a,b)|0}Qf(d);d=hC(a,d)|0}Rf(a);return}function Pf(b){b=b|0;var d=0,e=0,f=0,g=0;while(1){if(!b)break;f=b+16|0;g=c[(c[f>>2]|0)+164>>2]|0;Sf(b);d=c[f>>2]|0;if((a[d+156>>0]|0)!=1){b=g;continue}e=c[d+180>>2]|0;if(e){l6(e);d=c[f>>2]|0}e=c[d+172>>2]|0;if(e){l6(e);d=c[f>>2]|0}l6(d);l6(b);b=g}return}function Qf(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;b=c[e>>2]|0;d=c[b+172>>2]|0;if(d){l6(d);b=c[e>>2]|0}d=c[b+180>>2]|0;if(d){l6(d);b=c[e>>2]|0}d=c[b+188>>2]|0;if(d){l6(d);b=c[e>>2]|0}d=c[b+196>>2]|0;if(d){l6(d);b=c[e>>2]|0}d=c[b+204>>2]|0;if(d){l6(d);b=c[e>>2]|0}AK(c[b+104>>2]|0);AK(c[(c[e>>2]|0)+108>>2]|0);b=c[(c[e>>2]|0)+8>>2]|0;if(b|0)db[c[(c[b+4>>2]|0)+4>>2]&127](a);TC(a,137750)|0;return}function Rf(a){a=a|0;var d=0,e=0,f=0,g=0,h=0;d=MD(a)|0;while(1){if(!d)break;Rf(d);d=ND(d)|0}if(RC(a,137786,0,1)|0){g=a+16|0;d=c[g>>2]|0;e=c[d+184>>2]|0;if(e){l6(e);d=c[g>>2]|0}e=c[d+268>>2]|0;if(e){l6(e);d=c[g>>2]|0}e=c[d+216>>2]|0;if(e){l6(e);d=c[g>>2]|0}e=c[d+196>>2]|0;do if(e|0){f=b[d+236>>1]|0;while(1){if((f|0)>(b[d+238>>1]|0))break;l6(c[e+(f<<6)+12>>2]|0);h=c[g>>2]|0;f=f+1|0;d=h;e=c[h+196>>2]|0}if((b[d+236>>1]|0)==-1){l6(e+-64|0);break}else{l6(e);break}}while(0);if((vC(a)|0)!=(a|0)){AK(c[(c[g>>2]|0)+12>>2]|0);TC(a,137786)|0}}return}function Sf(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;d=c[e>>2]|0;b=c[d+176>>2]|0;while(1){a=b+-1|0;if((b|0)<=0)break;b=c[(c[d+172>>2]|0)+(a<<2)>>2]|0;fh(b);l6(c[b+16>>2]|0);l6(b);b=a;d=c[e>>2]|0}b=c[d+184>>2]|0;while(1){a=b+-1|0;if((b|0)<=0)break;b=c[(c[(c[e>>2]|0)+180>>2]|0)+(a<<2)>>2]|0;fh(b);l6(c[b+16>>2]|0);l6(b);b=a}return}function Tf(a){a=a|0;if(qB(a)|0)Uf(a);rM(a);return}function Uf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=l;l=l+48|0;g=h+32|0;f=h;b=jH(a,-1,8)|0;d=kH(a,0,f)|0;iH(a,2,8,f)|0;d=(d|0)==0;e=(b|0)<0;if(e&d)Vf(a);else{if(d)c[f+16>>2]=3;else b=e?8:b;c[f+8>>2]=b;c[f+20>>2]=0;e=EG(a,g,0)|0;b=c[g>>2]|0;do if((b|0)==1){Vf(a);b=0}else{if(c[(c[(c[a+16>>2]|0)+8>>2]|0)+84>>2]|0){Vf(a);b=0;break}c[f+12>>2]=1;d=0;while(1){if((d|0)>=(b|0))break;b=c[e+(d<<2)>>2]|0;Wf(b,a);Vf(b);d=d+1|0;b=c[g>>2]|0}Xf(a);hH(c[g>>2]|0,e,a,f)|0;Yf(a);Zf(c[g>>2]|0,e,a);b=0}while(0);while(1){if((b|0)>=(c[g>>2]|0))break;f=e+(b<<2)|0;l6(c[(c[(c[f>>2]|0)+16>>2]|0)+8>>2]|0);Rf(c[f>>2]|0);tC(a,c[f>>2]|0)|0;b=b+1|0}l6(e)}l=h;return}function Vf(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+48|0;k=m+40|0;e=m;i=XO(a,DA(a,0,85374,0)|0,-1,1)|0;mQ(a,10);d=Ik(a,e)|0;$f(a,a);Lf(a);f=(i|0)==1;g=e+32|0;h=(i|0)==2;i=(i|0)==3;j=e+28|0;e=e+24|0;while(1){uj(a,d);if(f){d=3;break}if(c[g>>2]|0){dA(0,85380,k)|0;c[e>>2]=0;d=0}Eh(a,(d|0)!=0&1);if(h){d=7;break}Hi(a,d);if(i){d=9;break}n=(c[j>>2]|0)+-1|0;c[j>>2]=n;if(!((n|0)!=0&(c[e>>2]|0)!=0)){d=11;break}}if((d|0)==3)ag(a,1);else if((d|0)==7)ag(a,2);else if((d|0)==9)ag(a,2);else if((d|0)==11){if(b[(c[a+16>>2]|0)+136>>1]&16)bg(a);ok(a);fg(a);if((bP(NA(a,85471)|0)|0)<<24>>24)il(a)}l=m;return}function Wf(b,d){b=b|0;d=d|0;var e=0,f=0;RC(b,137786,280,1)|0;e=HK(96)|0;b=c[b+16>>2]|0;c[b+8>>2]=e;d=c[d+16>>2]|0;f=c[d+8>>2]|0;h[e>>3]=+h[f>>3];h[e+24>>3]=+h[f+24>>3];c[b+144>>2]=c[d+144>>2];a[b+115>>0]=a[d+115>>0]|0;c[b+116>>2]=c[d+116>>2];c[b+248>>2]=c[d+248>>2];c[b+252>>2]=c[d+252>>2];c[b+244>>2]=c[d+244>>2];return}function Xf(a){a=a|0;var b=0,d=0,e=0;b=HK((qB(a)|0)<<4)|0;d=gC(a)|0;while(1){if(!d)break;e=c[d+16>>2]|0;c[e+132>>2]=b;h[b>>3]=+h[e+16>>3]/72.0;h[b+8>>3]=+h[e+24>>3]/72.0;b=b+16|0;d=hC(a,d)|0}return}function Yf(a){a=a|0;var b=0,d=0,e=0,f=0;e=c[(c[(gC(a)|0)+16>>2]|0)+132>>2]|0;b=e;d=gC(a)|0;while(1){if(!d)break;f=c[d+16>>2]|0;c[f+132>>2]=0;h[f+16>>3]=+h[b>>3]*72.0;h[f+24>>3]=+h[b+8>>3]*72.0;b=b+16|0;d=hC(a,d)|0}l6(e);return}function Zf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=0;f=0;while(1){if((e|0)>=(a|0))break;i=(c[(c[(c[b+(e<<2)>>2]|0)+16>>2]|0)+180>>2]|0)+f|0;e=e+1|0;f=i}i=d+16|0;c[(c[i>>2]|0)+180>>2]=f;g=HK((f<<2)+4|0)|0;c[(c[i>>2]|0)+184>>2]=g;g=0;e=1;while(1){if((g|0)>=(a|0))break;h=(c[b+(g<<2)>>2]|0)+16|0;f=1;while(1){d=c[h>>2]|0;if((f|0)>(c[d+180>>2]|0))break;d=DG(c[(c[d+184>>2]|0)+(f<<2)>>2]|0)|0;c[(c[(c[i>>2]|0)+184>>2]|0)+(e<<2)>>2]=d;_f(c[(c[(c[h>>2]|0)+184>>2]|0)+(f<<2)>>2]|0,d);f=f+1|0;e=e+1|0}g=g+1|0}return}function _f(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;RC(d,137786,280,1)|0;g=d+16|0;d=(c[g>>2]|0)+16|0;f=b+16|0;b=(c[f>>2]|0)+16|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];c[d+16>>2]=c[b+16>>2];c[d+20>>2]=c[b+20>>2];c[d+24>>2]=c[b+24>>2];c[d+28>>2]=c[b+28>>2];b=c[f>>2]|0;d=c[g>>2]|0;a[d+275>>0]=a[b+275>>0]|0;d=d+48|0;b=b+48|0;e=d+64|0;do{c[d>>2]=c[b>>2];d=d+4|0;b=b+4|0}while((d|0)<(e|0));b=c[(c[f>>2]|0)+180>>2]|0;c[(c[g>>2]|0)+180>>2]=b;d=HK((b<<2)+4|0)|0;c[(c[g>>2]|0)+184>>2]=d;d=1;while(1){e=c[f>>2]|0;if((d|0)>(b|0))break;e=DG(c[(c[e+184>>2]|0)+(d<<2)>>2]|0)|0;c[(c[(c[g>>2]|0)+184>>2]|0)+(d<<2)>>2]=e;_f(c[(c[(c[f>>2]|0)+184>>2]|0)+(d<<2)>>2]|0,e);d=d+1|0}f=e+12|0;c[(c[g>>2]|0)+12>>2]=c[f>>2];c[f>>2]=0;return}function $f(a,b){a=a|0;b=b|0;if((vC(a)|0)!=(a|0))RC(a,137786,280,1)|0;if((a|0)==(b|0))c[(c[(vC(a)|0)+16>>2]|0)+188>>2]=a;a=MD(a)|0;while(1){if(!a)break;$f(a,b);a=ND(a)|0}return}function ag(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+1040|0;k=m+8|0;j=m;e=m+16|0;f=DA(a,1,87443,195341)|0;g=DA(a,1,85514,195341)|0;h=(b|0)>0;d=(b|0)==1;b=gC(a)|0;while(1){if(!b)break;if(h?(i=b+16|0,c[j>>2]=c[(c[i>>2]|0)+232>>2],i2(e,137696,j)|0,HA(b,f,e)|0,!d):0){c[k>>2]=c[(c[i>>2]|0)+236>>2];i2(e,137696,k)|0;HA(b,g,e)|0}b=hC(a,b)|0}l=m;return}function bg(a){a=a|0;var b=0,c=0,d=0;c=LD(a,86947,0)|0;if(c|0){b=gC(c)|0;while(1){if(!b)break;d=hC(c,b)|0;nh(a,b);cg(a,b);Qf(b);sC(a,b)|0;b=d}PD(a,c)|0}return}function cg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=c[(c[b+16>>2]|0)+232>>2]|0;i=a+16|0;a=c[(c[i>>2]|0)+196>>2]|0;d=c[a+(j<<6)>>2]|0;h=a+(j<<6)+4|0;g=0;e=0;while(1){if((e|0)>=(d|0)){f=7;break}f=c[(c[h>>2]|0)+(e<<2)>>2]|0;e=e+1|0;if((f|0)==(b|0)){f=4;break}else g=f}if((f|0)==4){while(1){if((e|0)>=(d|0))break;f=c[a+(j<<6)+4>>2]|0;c[f+(e+-1<<2)>>2]=c[f+(e<<2)>>2];f=c[(c[i>>2]|0)+196>>2]|0;e=e+1|0;d=c[f+(j<<6)>>2]|0;a=f;f=4}c[a+(j<<6)>>2]=d+-1}else if((f|0)==7?(g|0)!=(b|0):0)Aa(85480,85487,248,85497);return}function dg(a){a=a|0;return c[(c[(vC(a)|0)+16>>2]|0)+188>>2]|0}function eg(b,c){b=b|0;c=c|0;var d=0;d=a[b+28>>0]|0;if(a[c+28>>0]|0)if(d<<24>>24){d=~~(+h[b>>3]-+h[c>>3]);if(!d)d=~~(+h[b+8>>3]-+h[c+8>>3])}else d=-1;else d=d<<24>>24!=0&1;return d|0}function fg(a){a=a|0;gg(a,1);return}function gg(d,e){d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;_=l;l=l+656|0;P=_+592|0;O=_+552|0;g=_+544|0;U=_+96|0;V=_;Z=_+632|0;W=d+16|0;Y=b[(c[W>>2]|0)+136>>1]&14;Q=Y&65535;R=U+16|0;c[R>>2]=_+368;S=V+16|0;c[S>>2]=_+192;do if(Y<<16>>16){T=Y<<16>>16==4;f=d+60|0;do if(T){hg(d);if(!(a[(c[(c[f>>2]|0)+16>>2]|0)+113>>0]&1))C=9;else{dA(0,85520,g)|0;C=9}}else if(Y<<16>>16==8){hg(d);if(!(a[(c[(c[f>>2]|0)+16>>2]|0)+113>>0]&1)){pQ(d,0);n=0;m=0;k=0;break}else{ig(d);pQ(d,1);n=0;m=0;k=0;break}}else C=9;while(0);if((C|0)==9){gl(d);if(DM()|0)break;X=HK(96)|0;L=c[(c[W>>2]|0)+248>>2]|0;c[Z+8>>2]=(L|0)/4|0;c[Z+12>>2]=L;q=HK(512)|0;G=Z+4|0;c[G>>2]=0;c[Z>>2]=0;j=c[W>>2]|0;D=b[j+236>>1]|0;E=0;M=0;N=q;F=q;m=q;n=q;p=q;I=0;J=0;a:while(1){if((D|0)>(b[j+238>>1]|0))break;r=c[j+196>>2]|0;i=c[r+(D<<6)>>2]|0;H=i+E|0;g=c[r+(D<<6)+4>>2]|0;f=c[g>>2]|0;if(!f)f=I;else{o=+(I|0);f=c[f+16>>2]|0;z=+h[f+16>>3]-+h[f+88>>3];f=~~(o>2]|0,(K|0)!=0):0){o=+(J|0);g=c[K+16>>2]|0;z=+h[g+16>>3]+ +h[g+96>>3];g=~~(o>z?o:z)}else g=J;B=f+-16|0;A=g+16|0;y=0;u=M;v=N;s=j;w=F;k=m;g=q;f=r;while(1){if((y|0)>=(i|0))break;q=c[(c[f+(D<<6)+4>>2]|0)+(y<<2)>>2]|0;x=q+16|0;f=c[x>>2]|0;i=c[f+112>>2]|0;if(i){i=i+16|0;j=c[(c[i>>2]|0)+96>>2]|0;if(!j){C=21;break a}t=j+56|0;f=f+16|0;c[t>>2]=c[f>>2];c[t+4>>2]=c[f+4>>2];c[t+8>>2]=c[f+8>>2];c[t+12>>2]=c[f+12>>2];a[(c[(c[i>>2]|0)+96>>2]|0)+81>>0]=1;f=c[x>>2]|0}if((a[f+156>>0]|0)!=0?(pb[c[17340>>2]&63](q)|0)<<24>>24==0:0){r=u;f=v;j=w;i=p}else{t=0;r=u;s=v;j=w;C=25}b:do if((C|0)==25){while(1){C=0;q=c[x>>2]|0;i=c[(c[q+180>>2]|0)+(t<<2)>>2]|0;if(!i)break;switch(a[(c[i+16>>2]|0)+112>>0]|0){case 6:case 4:{f=r;i=s;break}default:{jg(i,1,16,64);f=r+1|0;c[s+(r<<2)>>2]=i;if(!(f&127)){g=KK(g,(r<<2)+516|0)|0;i=g;j=g;k=g;n=g;p=g}else i=s}}t=t+1|0;r=f;s=i;C=25}f=c[q+188>>2]|0;c:do if(!f)i=p;else{t=0;i=p;while(1){f=c[f+(t<<2)>>2]|0;if(!f)break c;jg(f,2,0,128);p=r+1|0;c[s+(r<<2)>>2]=f;if(!(p&127)){g=KK(i,(r<<2)+516|0)|0;f=g;j=g;k=g;n=g;i=g}else f=s;q=c[x>>2]|0;t=t+1|0;r=p;s=f;f=c[q+188>>2]|0}}while(0);f=c[q+204>>2]|0;if(!f)f=s;else{if(!(a[q+156>>0]|0)){w=q+96|0;z=+h[w>>3];t=q+240|0;h[w>>3]=+h[t>>3];h[t>>3]=z;t=0;q=s}else{t=0;q=s}while(1){f=c[f+(t<<2)>>2]|0;if(!f){f=q;break b}jg(f,0,0,128);p=r+1|0;c[q+(r<<2)>>2]=f;if(!(p&127)){g=KK(n,(r<<2)+516|0)|0;f=g;j=g;k=g;n=g;i=g}else f=q;t=t+1|0;r=p;q=f;f=c[(c[x>>2]|0)+204>>2]|0}}}while(0);s=c[W>>2]|0;x=c[s+196>>2]|0;y=y+1|0;u=r;v=f;w=j;p=i;i=c[x+(D<<6)>>2]|0;f=x}D=D+1|0;E=H;M=u;N=v;F=w;j=s;m=k;q=g;I=B;J=A}if((C|0)==21)Aa(85588,85601,313,85614);c[Z>>2]=I;c[G>>2]=J;k3(F,M,4,58);c[X+84>>2]=HK((E<<5)+11520|0)|0;c[Z+16>>2]=HK(D<<5)|0;d:do if(Y<<16>>16==2){f=(c[W>>2]|0)+192|0;while(1){g=c[f>>2]|0;if(!g)break d;i=g+16|0;f=c[i>>2]|0;if((a[f+156>>0]|0)==1?(c[f+104>>2]|0)!=0:0){lg(g);f=c[i>>2]|0}f=f+164|0}}while(0);B=V+48|0;C=V+-48|0;D=U+48|0;E=U+-48|0;A=V+16|0;z=+(L|0);y=0;e:while(1){if((y|0)>=(M|0))break;v=N+(y<<2)|0;s=c[v>>2]|0;t=mg(s)|0;u=s+16|0;g=c[u>>2]|0;if(!(a[g+44>>0]|0)){g=(a[g+84>>0]|0)==0?t:s;f=g;g=c[g+16>>2]|0}else f=s;i=f+16|0;if(c[g+164>>2]&32){g=c[R>>2]|0;B6(g|0,c[i>>2]|0,176)|0;n=U;p=f;q=n+48|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));c[R>>2]=g;p=c[f>>2]&3;n=c[U>>2]&3;c[((n|0)==3?U:D)+40>>2]=c[((p|0)==2?f:f+-48|0)+40>>2];c[((n|0)==2?U:E)+40>>2]=c[((p|0)==3?f:f+48|0)+40>>2];n=g+16|0;p=(c[i>>2]|0)+56|0;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));n=g+56|0;p=(c[i>>2]|0)+16|0;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));a[g+112>>0]=1;c[g+116>>2]=f;f=U}r=f+16|0;x=1;f=y;while(1){w=f+1|0;if((w|0)>=(M|0))break;j=N+(w<<2)|0;f=c[j>>2]|0;if((t|0)!=(mg(f)|0))break;if(!(a[(c[u>>2]|0)+113>>0]|0)){k=f+16|0;g=c[k>>2]|0;if(!(a[g+44>>0]|0)){g=(a[g+84>>0]|0)==0?t:f;f=g;g=c[g+16>>2]|0}i=f+16|0;if(c[g+164>>2]&32){g=c[S>>2]|0;B6(g|0,c[i>>2]|0,176)|0;n=V;p=f;q=n+48|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));c[S>>2]=g;p=c[f>>2]&3;n=c[V>>2]&3;c[((n|0)==3?V:B)+40>>2]=c[((p|0)==2?f:f+-48|0)+40>>2];c[((n|0)==2?V:C)+40>>2]=c[((p|0)==3?f:f+48|0)+40>>2];n=g+16|0;p=(c[i>>2]|0)+56|0;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));n=g+56|0;p=(c[i>>2]|0)+16|0;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));a[g+112>>0]=1;c[g+116>>2]=f;g=c[A>>2]|0}i=c[r>>2]|0;f=g+16|0;n=O;p=i+16|0;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));n=P;p=f;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));if(eg(O,P)|0)break;f=g+56|0;n=O;p=i+56|0;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));n=P;p=f;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));if(eg(O,P)|0)break;L=c[u>>2]|0;if((c[L+164>>2]&15|0)==2?(c[L+96>>2]|0)!=(c[(c[k>>2]|0)+96>>2]|0):0)break;if(c[(c[(c[j>>2]|0)+16>>2]|0)+164>>2]&64|0)break}x=x+1|0;f=w}if(T){if((x|0)==1)f=P;else f=HK(x<<2)|0;c[f>>2]=mg(c[v>>2]|0)|0;g=1;while(1){if((g|0)>=(x|0))break;c[f+(g<<2)>>2]=c[v+(g<<2)>>2];g=g+1|0}NM(d,f,x,Q,17336);if((x|0)>1)l6(f);y=w;continue}f=c[s>>2]&3;L=c[((f|0)==3?s:s+48|0)+40>>2]|0;f=c[((f|0)==2?s:s+-48|0)+40>>2]|0;g=c[L+16>>2]|0;n=c[g+232>>2]|0;if((L|0)!=(f|0))if((n|0)==(c[(c[f+16>>2]|0)+232>>2]|0)){ng(d,Z,X,N,y,x,Q);y=w;continue}else{og(d,Z,X,N,y,x,Q);y=w;continue}j=c[W>>2]|0;f=j+196|0;k=n+-1|0;i=g+24|0;do if((n|0)==(b[j+238>>1]|0))if((n|0)>0){f=~~(+h[(c[(c[c[(c[f>>2]|0)+(k<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]-+h[i>>3]);break}else{f=~~+h[g+80>>3];break}else{g=c[f>>2]|0;o=+h[i>>3];f=~~(o-+h[(c[(c[c[g+(n+1<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]);if((n|0)!=(b[j+236>>1]|0)){L=~~(+h[(c[(c[c[g+(k<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]-o);f=(L|0)<(f|0)?L:f}}while(0);jO(X,N,y,x,z,+((f|0)/2|0|0),17336);f=0;while(1){if((f|0)>=(x|0)){y=w;continue e}g=c[(c[(c[N+(f+y<<2)>>2]|0)+16>>2]|0)+96>>2]|0;if(g|0)xP(d,g);f=f+1|0}}f=(c[W>>2]|0)+192|0;while(1){g=c[f>>2]|0;if(!g)break;i=g+16|0;f=c[i>>2]|0;if((a[f+156>>0]|0)==1?(c[f+104>>2]|0)!=0:0){lg(g);xP(d,c[(c[i>>2]|0)+104>>2]|0);f=c[i>>2]|0}f=f+164|0}if(!e){n=X;k=X}else{pg(d);n=X;k=X}}f:do if((c[47266]|0)!=0|(c[47267]|0)!=0?(c[47272]|0)!=0|(c[47271]|0)!=0:0){j=gC(d)|0;while(1){if(!j)break f;g:do if(c[47266]|0){f=XA(d,j)|0;while(1){if(!f)break g;g=f+-48|0;i=(c[f>>2]&3|0)==2?f:g;if(c[(c[i+16>>2]|0)+100>>2]|0){rO(i,1)|0;xP(d,c[(c[((c[f>>2]&3|0)==2?f:g)+16>>2]|0)+100>>2]|0)}f=YA(d,f)|0}}while(0);h:do if(c[47267]|0){f=UA(d,j)|0;while(1){if(!f)break h;g=f+16|0;if(c[(c[g>>2]|0)+104>>2]|0?rO(f,0)|0:0)xP(d,c[(c[g>>2]|0)+104>>2]|0);f=WA(d,f)|0}}while(0);j=hC(d,j)|0}}while(0);switch(Y&15){case 4:case 8:break;default:{l6(m);l6(c[n+84>>2]|0);l6(k);l6(c[Z+16>>2]|0);EM()}}c[47185]=1;c[47186]=1}while(0);l=_;return}function hg(a){a=a|0;var b=0,d=0,e=0.0,f=0;b=gC(a)|0;while(1){if(!b)break;d=c[b+16>>2]|0;if(c[d+204>>2]|0){f=d+96|0;e=+h[f>>3];d=d+240|0;h[f>>3]=+h[d>>3];h[d>>3]=e}b=hC(a,b)|0}return}function ig(b){b=b|0;var d=0,e=0,f=0,g=0;d=(c[b+16>>2]|0)+192|0;a:while(1){f=c[d>>2]|0;if(!f){d=12;break}g=f+16|0;d=c[g>>2]|0;do if((a[d+156>>0]|0)==1){e=c[d+112>>2]|0;if(!e){e=c[d+104>>2]|0;if(!e)break;lg(f);d=e}else{e=c[(c[e+16>>2]|0)+96>>2]|0;if(!e){d=6;break a}f=e+56|0;d=d+16|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];a[e+81>>0]=1;d=e}xP(b,d);d=c[g>>2]|0}while(0);d=d+164|0}if((d|0)==6)Aa(85788,85601,234,85807);else if((d|0)==12)return}function jg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;h=b+-48|0;i=b+48|0;j=b+16|0;do if(!d){g=c[b>>2]&3;d=c[((g|0)==3?b:i)+40>>2]|0;g=c[((g|0)==2?b:h)+40>>2]|0;if((d|0)!=(g|0)){d=(c[(c[d+16>>2]|0)+232>>2]|0)==(c[(c[g+16>>2]|0)+232>>2]|0)?2:1;break}d=c[j>>2]|0;if(!(a[d+44>>0]|0))d=(a[d+84>>0]|0)==0?8:4;else d=4}while(0);a:do if(!e)switch(d|0){case 1:{e=c[b>>2]&3;e=(c[(c[(c[((e|0)==3?b:i)+40>>2]|0)+16>>2]|0)+232>>2]|0)<(c[(c[(c[((e|0)==2?b:h)+40>>2]|0)+16>>2]|0)+232>>2]|0)?16:32;break a}case 2:{e=c[b>>2]&3;e=(c[(c[(c[((e|0)==3?b:i)+40>>2]|0)+16>>2]|0)+236>>2]|0)<(c[(c[(c[((e|0)==2?b:h)+40>>2]|0)+16>>2]|0)+236>>2]|0)?16:32;break a}default:{e=16;break a}}while(0);c[(c[j>>2]|0)+164>>2]=d|f|e;return}function kg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=l;l=l+624|0;y=C+584|0;x=C+544|0;r=C+368|0;s=C+96|0;u=C;t=s+16|0;c[t>>2]=r;v=u+16|0;c[v>>2]=C+192;B=c[b>>2]|0;A=c[d>>2]|0;w=B+16|0;p=c[w>>2]|0;d=c[p+164>>2]|0;e=d&15;z=A+16|0;b=c[z>>2]|0;f=c[b+164>>2]&15;do if((f|0)==(e|0)){o=mg(B)|0;q=mg(A)|0;m=c[o>>2]|0;f=m&3;e=c[(c[((f|0)==3?o:o+48|0)+40>>2]|0)+16>>2]|0;f=c[(c[((f|0)==2?o:o+-48|0)+40>>2]|0)+16>>2]|0;g=(c[e+232>>2]|0)-(c[f+232>>2]|0)|0;n=c[q>>2]|0;k=n&3;j=c[(c[((k|0)==3?q:q+48|0)+40>>2]|0)+16>>2]|0;k=c[(c[((k|0)==2?q:q+-48|0)+40>>2]|0)+16>>2]|0;i=(c[j+232>>2]|0)-(c[k+232>>2]|0)|0;g=(g|0)>-1?g:0-g|0;i=(i|0)>-1?i:0-i|0;if((g|0)!=(i|0)){b=g-i|0;break}f=~~(+h[e+16>>3]-+h[f+16>>3]);f=(f|0)>-1?f:0-f|0;e=~~(+h[j+16>>3]-+h[k+16>>3]);e=(e|0)>-1?e:0-e|0;if((f|0)!=(e|0)){b=f-e|0;break}f=m>>>4;e=n>>>4;if((f|0)!=(e|0)){b=f-e|0;break}if(!(a[p+44>>0]|0)){d=(a[p+84>>0]|0)==0?o:B;f=d;d=c[(c[d+16>>2]|0)+164>>2]|0}else f=B;e=f+16|0;if(d&32){B6(r|0,c[e>>2]|0,176)|0;g=s;i=f;j=g+48|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));c[t>>2]=r;i=c[f>>2]&3;g=c[s>>2]&3;c[((g|0)==3?s:s+48|0)+40>>2]=c[((i|0)==2?f:f+-48|0)+40>>2];c[((g|0)==2?s:s+-48|0)+40>>2]=c[((i|0)==3?f:f+48|0)+40>>2];g=r+16|0;i=(c[e>>2]|0)+56|0;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));g=r+56|0;i=(c[e>>2]|0)+16|0;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));a[r+112>>0]=1;c[r+116>>2]=f;f=s;b=c[z>>2]|0}if(!(a[b+44>>0]|0)){b=(a[b+84>>0]|0)==0?q:A;e=b;b=c[b+16>>2]|0}else e=A;d=e+16|0;if(!(c[b+164>>2]&32))e=b;else{b=c[v>>2]|0;B6(b|0,c[d>>2]|0,176)|0;g=u;i=e;j=g+48|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));c[v>>2]=b;i=c[e>>2]&3;g=c[u>>2]&3;c[((g|0)==3?u:u+48|0)+40>>2]=c[((i|0)==2?e:e+-48|0)+40>>2];c[((g|0)==2?u:u+-48|0)+40>>2]=c[((i|0)==3?e:e+48|0)+40>>2];g=b+16|0;i=(c[d>>2]|0)+56|0;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));g=b+56|0;i=(c[d>>2]|0)+16|0;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));a[b+112>>0]=1;c[b+116>>2]=e;e=c[u+16>>2]|0}d=c[f+16>>2]|0;b=e+16|0;g=x;i=d+16|0;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));g=y;i=b;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));b=eg(x,y)|0;if(!b){b=e+56|0;g=x;i=d+56|0;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));g=y;i=b;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));b=eg(x,y)|0;if(!b){d=c[(c[w>>2]|0)+164>>2]&192;b=c[(c[z>>2]|0)+164>>2]&192;if((d|0)==(b|0)){b=((c[B>>2]|0)>>>4)-((c[A>>2]|0)>>>4)|0;break}else{b=d-b|0;break}}}}else b=f-e|0;while(0);l=C;return b|0}function lg(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0;f=b+16|0;d=c[f>>2]|0;if(c[d+176>>2]|0){d=c[d+180>>2]|0;while(1){d=(c[d>>2]|0)+16|0;e=c[d>>2]|0;if(!(a[e+112>>0]|0))break;else d=e+116|0}e=c[e+96>>2]|0;g=+h[e+24>>3];i=+h[e+32>>3];e=(c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&1|0)!=0;b=c[f>>2]|0;f=c[(c[d>>2]|0)+96>>2]|0;h[f+56>>3]=+h[b+16>>3]+(e?i:g)*.5;h[f+64>>3]=+h[b+24>>3];a[f+81>>0]=1}return}function mg(a){a=a|0;var b=0,d=0;while(1){b=c[a+16>>2]|0;d=c[b+172>>2]|0;if(!d)break;else a=d}while(1){b=c[b+116>>2]|0;if(!b)break;a=b;b=c[b+16>>2]|0}return a|0}function ng(b,d,e,f,g,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0;B=l;l=l+1712|0;x=B+1664|0;o=B+1488|0;u=B+1392|0;A=B+1696|0;y=B+696|0;z=B;n=u+16|0;c[n>>2]=o;s=c[f+(g<<2)>>2]|0;t=s+16|0;k=c[t>>2]|0;v=a[k+113>>0]|0;if(c[k+164>>2]&32){B6(o|0,k|0,176)|0;p=u;q=s;r=p+48|0;do{c[p>>2]=c[q>>2];p=p+4|0;q=q+4|0}while((p|0)<(r|0));c[n>>2]=o;p=c[u>>2]&3;c[((p|0)==3?u:u+48|0)+40>>2]=c[((c[s>>2]&3|0)==2?s:s+-48|0)+40>>2];c[((p|0)==2?u:u+-48|0)+40>>2]=c[((c[s>>2]&3|0)==3?s:s+48|0)+40>>2];p=o+16|0;q=(c[t>>2]|0)+56|0;r=p+40|0;do{c[p>>2]=c[q>>2];p=p+4|0;q=q+4|0}while((p|0)<(r|0));k=c[n>>2]|0;p=k+56|0;q=(c[t>>2]|0)+16|0;r=p+40|0;do{c[p>>2]=c[q>>2];p=p+4|0;q=q+4|0}while((p|0)<(r|0));a[k+112>>0]=1;c[k+116>>2]=s;s=u}k=1;while(1){if((k|0)>=(i|0)){u=6;break}if(!(a[(c[(c[f+(k+g<<2)>>2]|0)+16>>2]|0)+113>>0]|0))k=k+1|0;else{u=7;break}}a:do if((u|0)==6)if(!(v<<24>>24)){k=c[s+16>>2]|0;if(c[k+96>>2]|0){Ng(b,d,e,s,j);break}n=s+48|0;o=s+-48|0;if((j|0)==2){A=c[s>>2]&3;Og(c[((A|0)==3?s:n)+40>>2]|0,c[((A|0)==2?s:o)+40>>2]|0,f,g,i,2);break}r=a[k+49>>0]|0;v=a[k+89>>0]|0;t=(j|0)==10;if(!(r<<24>>24==1&v<<24>>24!=4)?!(r<<24>>24!=4&v<<24>>24==1):0){p=c[s>>2]&3;q=c[((p|0)==3?s:n)+40>>2]|0;p=c[((p|0)==2?s:o)+40>>2]|0;k=c[q+16>>2]|0;n=c[k+232>>2]|0;o=c[b+16>>2]|0;if((n|0)>0){j=c[o+196>>2]|0;v=n+~(a[(c[(c[b+60>>2]|0)+16>>2]|0)+113>>0]&1)|0;m=+h[(c[(c[c[j+(v<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]-+h[j+(v<<6)+16>>3]-+h[k+24>>3]-+h[j+(n<<6)+24>>3]}else m=+(c[o+252>>2]|0);C=+(i+1|0);w=+(c[d+12>>2]|0)/C;m=m/C;Qg(b,d,e,q,s,y,1);Qg(b,d,e,p,s,z,0);p=y+52|0;q=z+52|0;r=e+80|0;k=0;while(1){if((k|0)>=(i|0))break a;s=c[f+(k+g<<2)>>2]|0;o=c[p>>2]|0;n=o+-1|0;G=+h[y+56+(n<<5)>>3];F=+h[y+56+(n<<5)+16>>3];C=+h[y+56+(n<<5)+24>>3];h[19234]=G;h[19235]=C;k=k+1|0;E=+(k|0);D=w*E;h[19236]=D+F;C=m*E+C;h[19237]=C;h[19238]=G;h[19239]=C;n=(c[q>>2]|0)+-1|0;G=+h[z+56+(n<<5)+16>>3];h[19240]=G;h[19241]=m+C;E=+h[z+56+(n<<5)>>3];F=+h[z+56+(n<<5)+24>>3];h[19244]=G;h[19243]=F;h[19242]=E-D;h[19245]=C;n=0;while(1){if((n|0)>=(o|0)){n=0;break}o=y+56+(n<<5)|0;c[x>>2]=c[o>>2];c[x+4>>2]=c[o+4>>2];c[x+8>>2]=c[o+8>>2];c[x+12>>2]=c[o+12>>2];c[x+16>>2]=c[o+16>>2];c[x+20>>2]=c[o+20>>2];c[x+24>>2]=c[o+24>>2];c[x+28>>2]=c[o+28>>2];dO(e,x);n=n+1|0;o=c[p>>2]|0}while(1){if((n|0)==3)break;d=153872+(n<<5)|0;c[x>>2]=c[d>>2];c[x+4>>2]=c[d+4>>2];c[x+8>>2]=c[d+8>>2];c[x+12>>2]=c[d+12>>2];c[x+16>>2]=c[d+16>>2];c[x+20>>2]=c[d+20>>2];c[x+24>>2]=c[d+24>>2];c[x+28>>2]=c[d+28>>2];dO(e,x);n=n+1|0}o=c[q>>2]|0;while(1){n=o+-1|0;if((o|0)<=0)break;o=z+56+(n<<5)|0;c[x>>2]=c[o>>2];c[x+4>>2]=c[o+4>>2];c[x+8>>2]=c[o+8>>2];c[x+12>>2]=c[o+12>>2];c[x+16>>2]=c[o+16>>2];c[x+20>>2]=c[o+20>>2];c[x+24>>2]=c[o+24>>2];c[x+28>>2]=c[o+28>>2];dO(e,x);o=n}if(t)n=FM(e,A)|0;else n=LM(e,A)|0;o=c[A>>2]|0;if(!o)break a;bO(s,c[((c[s>>2]&3|0)==2?s:s+-48|0)+40>>2]|0,n,o,17336);c[r>>2]=0}}Pg(b,d,e,f,g,i,s,t&1)}else u=7;while(0);if((u|0)==7)Mg(b,f,g,i,s,j);l=B;return}function og(b,d,e,f,g,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;da=l;l=l+2576|0;T=da+2528|0;aa=da+2568|0;k=da+2352|0;n=da+2176|0;w=da+1904|0;Z=da+1808|0;ba=da+1712|0;U=da+1016|0;V=da+320|0;W=da+256|0;Y=da+2564|0;_=da+2560|0;B=da+288|0;C=da+224|0;M=da+192|0;N=da+160|0;O=da+128|0;P=da+96|0;Q=da+64|0;R=da+32|0;X=da;t=w+16|0;c[t>>2]=k;o=Z+16|0;c[o>>2]=n;ca=ba+16|0;c[ca>>2]=da+2e3;if(!(c[46776]|0)){c[46776]=IK(32e3)|0;c[46777]=IK(32e3)|0;c[46778]=2e3;c[46779]=2e3}x=c[f+(g<<2)>>2]|0;K=c[x>>2]&3;p=x+48|0;q=x+-48|0;K=(c[(c[(c[((K|0)==3?x:p)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((K|0)==2?x:q)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0;u=w+-48|0;$=Z+-48|0;r=x+16|0;s=w+48|0;if((((K|0)>-1?K:0-K|0)|0)<=1){k=c[r>>2]|0;if(!(c[k+164>>2]&32)){w=x;n=0}else{n=c[t>>2]|0;B6(n|0,k|0,176)|0;y=w;z=x;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));c[t>>2]=n;y=c[w>>2]&3;c[((y|0)==3?w:s)+40>>2]=c[((c[x>>2]&3|0)==2?x:q)+40>>2];c[((y|0)==2?w:u)+40>>2]=c[((c[x>>2]&3|0)==3?x:p)+40>>2];y=n+16|0;z=(c[r>>2]|0)+56|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));k=c[t>>2]|0;y=k+56|0;z=(c[r>>2]|0)+16|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));a[k+112>>0]=1;n=0;L=12}}else{B6(k|0,c[r>>2]|0,176)|0;y=w;z=x;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));y=w+48|0;z=p;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));c[t>>2]=k;k=c[r>>2]|0;if(!(c[k+164>>2]&32)){B6(n|0,k|0,176)|0;y=Z;z=x;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));c[o>>2]=n;o=c[w>>2]|0;c[((o&3|0)==3?w:s)+40>>2]=c[((c[x>>2]&3|0)==3?x:p)+40>>2];y=Z+48|0;z=p;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0))}else{n=c[o>>2]|0;B6(n|0,k|0,176)|0;y=Z;z=x;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));c[o>>2]=n;y=c[Z>>2]&3;c[((y|0)==3?Z:Z+48|0)+40>>2]=c[((c[x>>2]&3|0)==2?x:q)+40>>2];c[((y|0)==2?Z:$)+40>>2]=c[((c[x>>2]&3|0)==3?x:p)+40>>2];y=n+16|0;z=(c[r>>2]|0)+56|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));k=c[o>>2]|0;y=k+56|0;z=(c[r>>2]|0)+16|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));a[k+112>>0]=1;c[k+116>>2]=x;o=c[w>>2]|0;c[((o&3|0)==3?w:s)+40>>2]=c[((c[x>>2]&3|0)==2?x:q)+40>>2];y=(c[t>>2]|0)+16|0;z=(c[r>>2]|0)+56|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0))}k=mg(x)|0;while(1){n=c[(c[k+16>>2]|0)+172>>2]|0;if(!n)break;else k=n}c[((o&3|0)==2?w:u)+40>>2]=c[((c[k>>2]&3|0)==2?k:k+-48|0)+40>>2];k=c[t>>2]|0;a[k+84>>0]=0;a[k+112>>0]=1;n=k+56|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;n=1;L=12}if((L|0)==12)c[k+116>>2]=x;J=(j|0)==2;if(J?(v=sg(b,w,c[46776]|0,aa)|0,c[_>>2]=v,(v|0)!=0):0)L=63;else L=15;a:do if((L|0)==15){I=(j|0)==10;c[_>>2]=0;o=c[w>>2]&3;k=c[((o|0)==3?w:w+48|0)+40>>2]|0;o=c[((o|0)==2?w:w+-48|0)+40>>2]|0;c[aa>>2]=o;tg(B,b,d,k,0,w);c[U>>2]=c[B>>2];c[U+4>>2]=c[B+4>>2];c[U+8>>2]=c[B+8>>2];c[U+12>>2]=c[B+12>>2];c[U+16>>2]=c[B+16>>2];c[U+20>>2]=c[B+20>>2];c[U+24>>2]=c[B+24>>2];c[U+28>>2]=c[B+28>>2];c[W>>2]=c[B>>2];c[W+4>>2]=c[B+4>>2];c[W+8>>2]=c[B+8>>2];c[W+12>>2]=c[B+12>>2];c[W+16>>2]=c[B+16>>2];c[W+20>>2]=c[B+20>>2];eO(e,w,1,U,ug(k)|0);D=U+52|0;K=(c[D>>2]|0)+-1|0;F=W+24|0;h[F>>3]=+h[U+56+(K<<5)+24>>3];G=W+8|0;h[G>>3]=+h[U+56+(K<<5)+8>>3];K=c[k+16>>2]|0;H=b+16|0;m=+h[K+24>>3]-+h[(c[(c[H>>2]|0)+196>>2]|0)+(c[K+232>>2]<<6)+16>>3];c[T>>2]=c[W>>2];c[T+4>>2]=c[W+4>>2];c[T+8>>2]=c[W+8>>2];c[T+12>>2]=c[W+12>>2];c[T+16>>2]=c[W+16>>2];c[T+20>>2]=c[W+20>>2];c[T+24>>2]=c[W+24>>2];c[T+28>>2]=c[W+28>>2];vg(C,T,1,m);c[W>>2]=c[C>>2];c[W+4>>2]=c[C+4>>2];c[W+8>>2]=c[C+8>>2];c[W+12>>2]=c[C+12>>2];c[W+16>>2]=c[C+16>>2];c[W+20>>2]=c[C+20>>2];c[W+24>>2]=c[C+24>>2];c[W+28>>2]=c[C+28>>2];C=W+16|0;if(+h[W>>3]<+h[C>>3]?+h[G>>3]<+h[F>>3]:0){K=c[D>>2]|0;c[D>>2]=K+1;K=U+56+(K<<5)|0;c[K>>2]=c[W>>2];c[K+4>>2]=c[W+4>>2];c[K+8>>2]=c[W+8>>2];c[K+12>>2]=c[W+12>>2];c[K+16>>2]=c[W+16>>2];c[K+20>>2]=c[W+20>>2];c[K+24>>2]=c[W+24>>2];c[K+28>>2]=c[W+28>>2]}y=b+60|0;E=V+52|0;z=e+56|0;A=e+69|0;j=e+16|0;B=e+29|0;K=w;q=0;r=-1;b:while(1){s=0;p=0;v=K;while(1){t=o;x=o;u=s|1;o=153872+(s<<5)|0;k=k+16|0;if((a[(c[t+16>>2]|0)+156>>0]|0)!=1)break b;if((pb[c[17340>>2]&63](t)|0)<<24>>24)break b;wg(M,d,b,c[(c[k>>2]|0)+232>>2]|0);c[o>>2]=c[M>>2];c[o+4>>2]=c[M+4>>2];c[o+8>>2]=c[M+8>>2];c[o+12>>2]=c[M+12>>2];c[o+16>>2]=c[M+16>>2];c[o+20>>2]=c[M+20>>2];c[o+24>>2]=c[M+24>>2];c[o+28>>2]=c[M+28>>2];if(!p){q=xg(t)|0;o=(q|0)<((a[(c[(c[y>>2]|0)+16>>2]|0)+113>>0]<<1&2)+3&255|0);q=o?q:q+-2|0;r=o?r:1;o=(o^1)&1}else o=p;if(!((o|0)==0|(r|0)>0))break;u=153872+(u<<5)|0;tg(N,b,d,t,v,c[c[(c[t+16>>2]|0)+180>>2]>>2]|0);c[u>>2]=c[N>>2];c[u+4>>2]=c[N+4>>2];c[u+8>>2]=c[N+8>>2];c[u+12>>2]=c[N+12>>2];c[u+16>>2]=c[N+16>>2];c[u+20>>2]=c[N+20>>2];c[u+24>>2]=c[N+24>>2];c[u+28>>2]=c[N+28>>2];u=c[c[(c[x+16>>2]|0)+180>>2]>>2]|0;x=c[u>>2]&3;k=c[((x|0)==3?u:u+48|0)+40>>2]|0;x=c[((x|0)==2?u:u+-48|0)+40>>2]|0;c[aa>>2]=x;s=s+2|0;r=r+-1|0;p=o;v=u;o=x}tg(O,b,d,t,v,c[c[(c[t+16>>2]|0)+180>>2]>>2]|0);c[V>>2]=c[O>>2];c[V+4>>2]=c[O+4>>2];c[V+8>>2]=c[O+8>>2];c[V+12>>2]=c[O+12>>2];c[V+16>>2]=c[O+16>>2];c[V+20>>2]=c[O+20>>2];c[V+24>>2]=c[O+24>>2];c[V+28>>2]=c[O+28>>2];hO(e,v,1,V,ug(c[((c[v>>2]&3|0)==2?v:v+-48|0)+40>>2]|0)|0);t=V+56+((c[E>>2]|0)+-1<<5)|0;s=c[x+16>>2]|0;m=+h[s+24>>3]+ +h[(c[(c[H>>2]|0)+196>>2]|0)+(c[s+232>>2]<<6)+24>>3];c[T>>2]=c[t>>2];c[T+4>>2]=c[t+4>>2];c[T+8>>2]=c[t+8>>2];c[T+12>>2]=c[t+12>>2];c[T+16>>2]=c[t+16>>2];c[T+20>>2]=c[t+20>>2];c[T+24>>2]=c[t+24>>2];c[T+28>>2]=c[t+28>>2];vg(W,T,4,m);if(+h[W>>3]<+h[C>>3]?+h[G>>3]<+h[F>>3]:0){t=c[E>>2]|0;c[E>>2]=t+1;t=V+56+(t<<5)|0;c[t>>2]=c[W>>2];c[t+4>>2]=c[W+4>>2];c[t+8>>2]=c[W+8>>2];c[t+12>>2]=c[W+12>>2];c[t+16>>2]=c[W+16>>2];c[t+20>>2]=c[W+20>>2];c[t+24>>2]=c[W+24>>2];c[t+28>>2]=c[W+28>>2]}h[z>>3]=1.5707963267948966;a[A>>0]=1;yg(e,K,v,U,V,u);if(!I){k=LM(e,Y)|0;o=c[Y>>2]|0;if(J&(o|0)>4){v=k+16|0;c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];v=k+32|0;o=k+(o+-1<<4)|0;c[v>>2]=c[o>>2];c[v+4>>2]=c[o+4>>2];c[v+8>>2]=c[o+8>>2];c[v+12>>2]=c[o+12>>2];I6(k+48|0,o|0,16)|0;c[Y>>2]=4;o=4}else L=33}else{k=FM(e,Y)|0;o=c[Y>>2]|0;L=33}if((L|0)==33){L=0;if(!o)break a}u=c[_>>2]|0;p=u+o|0;if((p|0)>(c[46778]|0)){c[46778]=p<<1;t=KK(c[46776]|0,p<<5)|0;c[46776]=t;o=c[Y>>2]|0}else t=c[46776]|0;s=0;p=u;while(1){if((s|0)>=(o|0))break;v=t+(p<<4)|0;u=k+(s<<4)|0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];s=s+1|0;p=p+1|0}c[_>>2]=p;o=zg(c[c[(c[x+16>>2]|0)+180>>2]>>2]|0,q,t,_)|0;Ag(K,e);p=c[o>>2]&3;k=c[((p|0)==3?o:o+48|0)+40>>2]|0;p=c[((p|0)==2?o:o+-48|0)+40>>2]|0;c[aa>>2]=p;x=k+16|0;tg(P,b,d,k,c[c[(c[x>>2]|0)+172>>2]>>2]|0,o);c[U>>2]=c[P>>2];c[U+4>>2]=c[P+4>>2];c[U+8>>2]=c[P+8>>2];c[U+12>>2]=c[P+12>>2];c[U+16>>2]=c[P+16>>2];c[U+20>>2]=c[P+20>>2];c[U+24>>2]=c[P+24>>2];c[U+28>>2]=c[P+28>>2];eO(e,o,1,U,ug(k)|0);K=U+56+((c[D>>2]|0)+-1<<5)|0;x=c[x>>2]|0;m=+h[x+24>>3]-+h[(c[(c[H>>2]|0)+196>>2]|0)+(c[x+232>>2]<<6)+16>>3];c[T>>2]=c[K>>2];c[T+4>>2]=c[K+4>>2];c[T+8>>2]=c[K+8>>2];c[T+12>>2]=c[K+12>>2];c[T+16>>2]=c[K+16>>2];c[T+20>>2]=c[K+20>>2];c[T+24>>2]=c[K+24>>2];c[T+28>>2]=c[K+28>>2];vg(W,T,1,m);if(+h[W>>3]<+h[C>>3]?+h[G>>3]<+h[F>>3]:0){K=c[D>>2]|0;c[D>>2]=K+1;K=U+56+(K<<5)|0;c[K>>2]=c[W>>2];c[K+4>>2]=c[W+4>>2];c[K+8>>2]=c[W+8>>2];c[K+12>>2]=c[W+12>>2];c[K+16>>2]=c[W+16>>2];c[K+20>>2]=c[W+20>>2];c[K+24>>2]=c[W+24>>2];c[K+28>>2]=c[W+28>>2]}h[j>>3]=-1.5707963267948966;a[B>>0]=1;K=o;o=p}s=v+-48|0;wg(Q,d,b,c[(c[k>>2]|0)+232>>2]|0);c[o>>2]=c[Q>>2];c[o+4>>2]=c[Q+4>>2];c[o+8>>2]=c[Q+8>>2];c[o+12>>2]=c[Q+12>>2];c[o+16>>2]=c[Q+16>>2];c[o+20>>2]=c[Q+20>>2];c[o+24>>2]=c[Q+24>>2];c[o+28>>2]=c[Q+28>>2];tg(R,b,d,t,v,0);c[V>>2]=c[R>>2];c[V+4>>2]=c[R+4>>2];c[V+8>>2]=c[R+8>>2];c[V+12>>2]=c[R+12>>2];c[V+16>>2]=c[R+16>>2];c[V+20>>2]=c[R+20>>2];c[V+24>>2]=c[R+24>>2];c[V+28>>2]=c[R+28>>2];c[W>>2]=c[R>>2];c[W+4>>2]=c[R+4>>2];c[W+8>>2]=c[R+8>>2];c[W+12>>2]=c[R+12>>2];c[W+16>>2]=c[R+16>>2];c[W+20>>2]=c[R+20>>2];c[W+24>>2]=c[R+24>>2];c[W+28>>2]=c[R+28>>2];r=(n|0)!=0;hO(e,r?Z:v,1,V,ug(c[((c[v>>2]&3|0)==2?v:s)+40>>2]|0)|0);R=(c[E>>2]|0)+-1|0;h[F>>3]=+h[V+56+(R<<5)+24>>3];h[G>>3]=+h[V+56+(R<<5)+8>>3];R=c[x+16>>2]|0;m=+h[R+24>>3]+ +h[(c[(c[H>>2]|0)+196>>2]|0)+(c[R+232>>2]<<6)+24>>3];c[T>>2]=c[W>>2];c[T+4>>2]=c[W+4>>2];c[T+8>>2]=c[W+8>>2];c[T+12>>2]=c[W+12>>2];c[T+16>>2]=c[W+16>>2];c[T+20>>2]=c[W+20>>2];c[T+24>>2]=c[W+24>>2];c[T+28>>2]=c[W+28>>2];vg(X,T,4,m);c[W>>2]=c[X>>2];c[W+4>>2]=c[X+4>>2];c[W+8>>2]=c[X+8>>2];c[W+12>>2]=c[X+12>>2];c[W+16>>2]=c[X+16>>2];c[W+20>>2]=c[X+20>>2];c[W+24>>2]=c[X+24>>2];c[W+28>>2]=c[X+28>>2];if(+h[W>>3]<+h[C>>3]?+h[G>>3]<+h[F>>3]:0){X=c[E>>2]|0;c[E>>2]=X+1;X=V+56+(X<<5)|0;c[X>>2]=c[W>>2];c[X+4>>2]=c[W+4>>2];c[X+8>>2]=c[W+8>>2];c[X+12>>2]=c[W+12>>2];c[X+16>>2]=c[W+16>>2];c[X+20>>2]=c[W+20>>2];c[X+24>>2]=c[W+24>>2];c[X+28>>2]=c[W+28>>2]}yg(e,K,v,U,V,u);if(I)q=FM(e,Y)|0;else q=LM(e,Y)|0;k=c[Y>>2]|0;if(!(J&(k|0)>4)){if(!k)break}else{X=q+32|0;k=q+(k+-1<<4)|0;W=q+16|0;c[W>>2]=c[q>>2];c[W+4>>2]=c[q+4>>2];c[W+8>>2]=c[q+8>>2];c[W+12>>2]=c[q+12>>2];c[X>>2]=c[k>>2];c[X+4>>2]=c[k+4>>2];c[X+8>>2]=c[k+8>>2];c[X+12>>2]=c[k+12>>2];I6(q+48|0,k|0,16)|0;c[Y>>2]=4;k=4}o=c[_>>2]|0;n=o+k|0;if((n|0)>(c[46778]|0)){c[46778]=n<<1;p=KK(c[46776]|0,n<<5)|0;c[46776]=p;k=c[Y>>2]|0}else p=c[46776]|0;n=0;while(1){if((n|0)>=(k|0))break;Y=p+(o<<4)|0;X=q+(n<<4)|0;c[Y>>2]=c[X>>2];c[Y+4>>2]=c[X+4>>2];c[Y+8>>2]=c[X+8>>2];c[Y+12>>2]=c[X+12>>2];n=n+1|0;o=o+1|0}c[_>>2]=o;Ag(K,e);if(r)k=(c[Z>>2]&3|0)==2?Z:$;else k=(c[v>>2]&3|0)==2?v:s;c[aa>>2]=c[k+40>>2];v=o;L=63}while(0);c:do if((L|0)==63){if((i|0)==1){bO(w,c[aa>>2]|0,c[46776]|0,v,17336);break}t=d+12|0;u=v+-1|0;m=+((S(c[t>>2]|0,i+-1|0)|0)/2|0|0);n=c[46776]|0;k=1;while(1){if((k|0)>=(u|0))break;d=n+(k<<4)|0;h[d>>3]=+h[d>>3]-m;k=k+1|0}k=c[46778]|0;if((k|0)>(c[46779]|0)){c[46779]=k;o=KK(c[46777]|0,k<<4)|0;c[46777]=o;n=c[46776]|0}else o=c[46777]|0;k=0;while(1){if((k|0)>=(v|0))break;d=o+(k<<4)|0;$=n+(k<<4)|0;c[d>>2]=c[$>>2];c[d+4>>2]=c[$+4>>2];c[d+8>>2]=c[$+8>>2];c[d+12>>2]=c[$+12>>2];k=k+1|0}bO(w,c[aa>>2]|0,o,v,17336);r=ba+48|0;s=ba+-48|0;q=1;while(1){if((q|0)>=(i|0))break c;o=c[f+(q+g<<2)>>2]|0;p=o+16|0;k=c[p>>2]|0;if(c[k+164>>2]&32){n=c[ca>>2]|0;B6(n|0,k|0,176)|0;y=ba;z=o;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));c[ca>>2]=n;y=c[ba>>2]&3;c[((y|0)==3?ba:r)+40>>2]=c[((c[o>>2]&3|0)==2?o:o+-48|0)+40>>2];c[((y|0)==2?ba:s)+40>>2]=c[((c[o>>2]&3|0)==3?o:o+48|0)+40>>2];y=n+16|0;z=(c[p>>2]|0)+56|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));k=c[ca>>2]|0;y=k+56|0;z=(c[p>>2]|0)+16|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));a[k+112>>0]=1;c[k+116>>2]=o;o=ba}p=c[46776]|0;k=1;while(1){if((k|0)>=(u|0))break;aa=p+(k<<4)|0;h[aa>>3]=+(c[t>>2]|0)+ +h[aa>>3];k=k+1|0}n=c[46777]|0;k=0;while(1){if((k|0)>=(v|0))break;aa=n+(k<<4)|0;d=p+(k<<4)|0;c[aa>>2]=c[d>>2];c[aa+4>>2]=c[d+4>>2];c[aa+8>>2]=c[d+8>>2];c[aa+12>>2]=c[d+12>>2];k=k+1|0}bO(o,c[((c[o>>2]&3|0)==2?o:o+-48|0)+40>>2]|0,n,v,17336);q=q+1|0}}while(0);l=da;return}function pg(a){a=a|0;var b=0,d=0,e=0;b=gC(a)|0;while(1){if(!b)break;d=UA(a,b)|0;while(1){if(!d)break;if((pb[c[4334]&63](d)|0)<<24>>24?(e=c[(c[d+16>>2]|0)+8>>2]|0,e|0):0)qg(e);d=WA(a,d)|0}b=hC(a,b)|0}return}function qg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=c[a+4>>2]|0;g=IK(f*48|0)|0;b=g;d=0;e=(c[a>>2]|0)+((f+-1|0)*48|0)|0;while(1){if((d|0)>=(f|0)){b=0;break}rg(e,b);b=b+48|0;d=d+1|0;e=e+-48|0}while(1){d=c[a>>2]|0;if((b|0)>=(f|0))break;l6(c[d+(b*48|0)>>2]|0);b=b+1|0}l6(d);c[a>>2]=g;return}function rg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;g=c[a+4>>2]|0;h=IK(g<<4)|0;d=h;e=0;f=(c[a>>2]|0)+(g+-1<<4)|0;while(1){if((e|0)>=(g|0))break;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];d=d+16|0;e=e+1|0;f=f+-16|0}c[b>>2]=h;c[b+4>>2]=g;c[b+8>>2]=c[a+12>>2];c[b+12>>2]=c[a+8>>2];h=b+16|0;g=a+32|0;c[h>>2]=c[g>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[h+12>>2]=c[g+12>>2];h=b+32|0;g=a+16|0;c[h>>2]=c[g>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[h+12>>2]=c[g+12>>2];return}function sg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;y=l;l=l+96|0;r=y+80|0;t=y+64|0;s=y+48|0;v=y+32|0;w=y+16|0;x=y;n=d;while(1){u=n+16|0;g=c[u>>2]|0;if(!(a[g+112>>0]|0))break;n=c[g+116>>2]|0}g=c[n>>2]&3;q=c[((g|0)==2?n:n+-48|0)+40>>2]|0;g=c[((g|0)==3?n:n+48|0)+40>>2]|0;n=q+16|0;o=g+16|0;z=(c[(c[n>>2]|0)+232>>2]|0)-(c[(c[o>>2]|0)+232>>2]|0)|0;switch(((z|0)>-1?z:0-z|0)|0){case 1:{g=0;break}case 2:{if(!(a[(c[(c[b+60>>2]|0)+16>>2]|0)+113>>0]&1))p=6;else g=0;break}default:p=6}do if((p|0)==6){if((c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)==(g|0)){c[f>>2]=q;z=(c[o>>2]|0)+16|0;p=(c[u>>2]|0)+16|0;c[t>>2]=c[z>>2];c[t+4>>2]=c[z+4>>2];c[t+8>>2]=c[z+8>>2];c[t+12>>2]=c[z+12>>2];c[r>>2]=c[p>>2];c[r+4>>2]=c[p+4>>2];c[r+8>>2]=c[p+8>>2];c[r+12>>2]=c[p+12>>2];Kg(v,t,r);p=(c[n>>2]|0)+16|0;z=(c[u>>2]|0)+56|0;c[t>>2]=c[p>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[t+12>>2]=c[p+12>>2];c[r>>2]=c[z>>2];c[r+4>>2]=c[z+4>>2];c[r+8>>2]=c[z+8>>2];c[r+12>>2]=c[z+12>>2];Kg(w,t,r)}else{c[f>>2]=g;z=(c[n>>2]|0)+16|0;p=(c[u>>2]|0)+56|0;c[t>>2]=c[z>>2];c[t+4>>2]=c[z+4>>2];c[t+8>>2]=c[z+8>>2];c[t+12>>2]=c[z+12>>2];c[r>>2]=c[p>>2];c[r+4>>2]=c[p+4>>2];c[r+8>>2]=c[p+8>>2];c[r+12>>2]=c[p+12>>2];Kg(v,t,r);p=(c[o>>2]|0)+16|0;z=(c[u>>2]|0)+16|0;c[t>>2]=c[p>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[t+12>>2]=c[p+12>>2];c[r>>2]=c[z>>2];c[r+4>>2]=c[z+4>>2];c[r+8>>2]=c[z+8>>2];c[r+12>>2]=c[z+12>>2];Kg(w,t,r)}g=c[(c[u>>2]|0)+96>>2]|0;n=e+16|0;o=e+32|0;b=e+48|0;if(!g){c[e>>2]=c[v>>2];c[e+4>>2]=c[v+4>>2];c[e+8>>2]=c[v+8>>2];c[e+12>>2]=c[v+12>>2];c[n>>2]=c[v>>2];c[n+4>>2]=c[v+4>>2];c[n+8>>2]=c[v+8>>2];c[n+12>>2]=c[v+12>>2];c[o>>2]=c[w>>2];c[o+4>>2]=c[w+4>>2];c[o+8>>2]=c[w+8>>2];c[o+12>>2]=c[w+12>>2];c[b>>2]=c[w>>2];c[b+4>>2]=c[w+4>>2];c[b+8>>2]=c[w+8>>2];c[b+12>>2]=c[w+12>>2];g=4;break}k=+h[g+24>>3];m=+h[g+32>>3];q=(c[(c[(uC(q)|0)+16>>2]|0)+116>>2]&1|0)==0;z=(c[(c[u>>2]|0)+96>>2]|0)+56|0;c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];c[s>>2]=c[w>>2];c[s+4>>2]=c[w+4>>2];c[s+8>>2]=c[w+8>>2];c[s+12>>2]=c[w+12>>2];c[t>>2]=c[v>>2];c[t+4>>2]=c[v+4>>2];c[t+8>>2]=c[v+8>>2];c[t+12>>2]=c[v+12>>2];c[r>>2]=c[z>>2];c[r+4>>2]=c[z+4>>2];c[r+8>>2]=c[z+8>>2];c[r+12>>2]=c[z+12>>2];z=(Lg(s,t,r)|0)==0;i=(q?k:m)*.5;j=+h[x>>3];g=x+8|0;k=(q?m:k)*.5;m=+h[g>>3];if(z){h[x>>3]=j-i;i=k+m}else{h[x>>3]=i+j;i=m-k}h[g>>3]=i;c[e>>2]=c[v>>2];c[e+4>>2]=c[v+4>>2];c[e+8>>2]=c[v+8>>2];c[e+12>>2]=c[v+12>>2];c[n>>2]=c[v>>2];c[n+4>>2]=c[v+4>>2];c[n+8>>2]=c[v+8>>2];c[n+12>>2]=c[v+12>>2];g=e+64|0;c[g>>2]=c[x>>2];c[g+4>>2]=c[x+4>>2];c[g+8>>2]=c[x+8>>2];c[g+12>>2]=c[x+12>>2];c[b>>2]=c[x>>2];c[b+4>>2]=c[x+4>>2];c[b+8>>2]=c[x+8>>2];c[b+12>>2]=c[x+12>>2];c[o>>2]=c[x>>2];c[o+4>>2]=c[x+4>>2];c[o+8>>2]=c[x+8>>2];c[o+12>>2]=c[x+12>>2];g=e+80|0;z=e+96|0;c[z>>2]=c[w>>2];c[z+4>>2]=c[w+4>>2];c[z+8>>2]=c[w+8>>2];c[z+12>>2]=c[w+12>>2];c[g>>2]=c[w>>2];c[g+4>>2]=c[w+4>>2];c[g+8>>2]=c[w+8>>2];c[g+12>>2]=c[w+12>>2];g=7}while(0);l=y;return g|0}function tg(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k=0,l=0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0,s=0;s=c[f+16>>2]|0;q=+h[s+16>>3];m=q-+h[s+88>>3]+-4.0;k=Gg(d,f,g,i,-1)|0;p=e+8|0;r=d+16|0;if(!k){n=~~(m+(m>=0.0?.5:-.5));k=c[e>>2]|0;k=(n|0)<(k|0)?n:k}else{l=Hg(d,f,k)|0;do if(!l){n=c[k+16>>2]|0;j=+h[n+16>>3]+ +h[n+240>>3];if(!(a[n+156>>0]|0)){j=j+ +(c[(c[r>>2]|0)+248>>2]|0)*.5;break}else{j=j+ +(c[p>>2]|0);break}}else j=+h[(c[l+16>>2]|0)+32>>3]+ +(c[p>>2]|0);while(0);o=j=0.0?.5:-.5))}o=+(k|0);n=(a[s+156>>0]|0)==1;if(n?(c[s+104>>2]|0)!=0:0)m=q+10.0;else m=q+ +h[s+96>>3]+4.0;l=Gg(d,f,g,i,1)|0;if(!l){p=~~(m+(m>=0.0?.5:-.5));k=c[e+4>>2]|0;k=(p|0)>(k|0)?p:k}else{k=Hg(d,f,l)|0;do if(!k){f=c[l+16>>2]|0;j=+h[f+16>>3]-+h[f+88>>3];if(!(a[f+156>>0]|0)){j=j-+(c[(c[r>>2]|0)+248>>2]|0)*.5;break}else{j=j-+(c[p>>2]|0);break}}else j=+h[(c[k+16>>2]|0)+16>>3]-+(c[p>>2]|0);while(0);m=j>m?j:m;k=~~(m+(m>=0.0?.5:-.5))}j=+(k|0);if(n?(c[s+104>>2]|0)!=0:0){j=j-+h[s+96>>3];if(j>3];r=c[(c[r>>2]|0)+196>>2]|0;s=c[s+232>>2]|0;m=q-+h[r+(s<<6)+16>>3];q=q+ +h[r+(s<<6)+24>>3];h[b>>3]=o;h[b+8>>3]=m;h[b+16>>3]=j;h[b+24>>3]=q;return}function ug(b){b=b|0;b=c[b+16>>2]|0;if((a[b+156>>0]|0)==1)if((c[b+176>>2]|0)>1)b=1;else b=(c[b+184>>2]|0)>1&1;else b=0;return b|0}function vg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,g=0,i=0;i=l;l=l+32|0;f=i;g=b+16|0;switch(d|0){case 1:{Fg(f,+h[b>>3],e,+h[g>>3],+h[b+8>>3]);break}case 4:{Fg(f,+h[b>>3],+h[b+24>>3],+h[g>>3],e);break}default:{}}c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];c[a+16>>2]=c[f+16>>2];c[a+20>>2]=c[f+20>>2];c[a+24>>2]=c[f+24>>2];c[a+28>>2]=c[f+28>>2];l=i;return}function wg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0;l=c[b+16>>2]|0;k=l+(e<<5)|0;j=+h[k>>3];m=l+(e<<5)+8|0;g=+h[m>>3];n=l+(e<<5)+16|0;f=+h[n>>3];l=l+(e<<5)+24|0;i=+h[l>>3];if(j==f){d=c[(c[d+16>>2]|0)+196>>2]|0;o=e+1|0;j=+(c[b>>2]|0);g=+h[(c[(c[c[d+(o<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]+ +h[d+(o<<6)+24>>3];f=+(c[b+4>>2]|0);i=+h[(c[(c[c[d+(e<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]-+h[d+(e<<6)+16>>3];h[k>>3]=j;h[m>>3]=g;h[n>>3]=f;h[l>>3]=i}h[a>>3]=j;h[a+8>>3]=g;h[a+16>>3]=f;h[a+24>>3]=i;return}function xg(b){b=b|0;var d=0,e=0;b=c[b+16>>2]|0;e=b+16|0;d=0;while(1){b=c[c[b+180>>2]>>2]|0;b=c[(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)+16>>2]|0;if((a[b+156>>0]|0)!=1)break;if((c[b+184>>2]|0)!=1)break;if((c[b+176>>2]|0)!=1)break;if(+h[b+16>>3]!=+h[e>>3])break;d=d+1|0}return d|0}function yg(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+32|0;j=k;h=Cg(b,-1)|0;b=Cg(b,1)|0;if(!((h|0)!=0?!(sO(h)|0):0))i=3;do if((i|0)==3){if(b|0?(sO(b)|0)==0:0)break;h=Dg(d,-1)|0;b=Dg(d,1)|0;if(h|0?(sO(h)|0)==0:0)break;if(b|0?(sO(b)|0)==0:0)break;h=e+52|0;b=0;while(1){if((b|0)>=(c[h>>2]|0))break;d=e+56+(b<<5)|0;c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];c[j+16>>2]=c[d+16>>2];c[j+20>>2]=c[d+20>>2];c[j+24>>2]=c[d+24>>2];c[j+28>>2]=c[d+28>>2];dO(a,j);b=b+1|0}h=c[a+80>>2]|0;i=g+-3|0;b=0;while(1){if((b|0)>=(g|0))break;e=153872+(b<<5)|0;c[j>>2]=c[e>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];c[j+12>>2]=c[e+12>>2];c[j+16>>2]=c[e+16>>2];c[j+20>>2]=c[e+20>>2];c[j+24>>2]=c[e+24>>2];c[j+28>>2]=c[e+28>>2];dO(a,j);b=b+1|0}d=h+1|0;i=i+d|0;h=c[f+52>>2]|0;while(1){b=h+-1|0;if((h|0)<=0)break;h=f+56+(b<<5)|0;c[j>>2]=c[h>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[j+12>>2]=c[h+12>>2];c[j+16>>2]=c[h+16>>2];c[j+20>>2]=c[h+20>>2];c[j+24>>2]=c[h+24>>2];c[j+28>>2]=c[h+28>>2];dO(a,j);h=b}Eg(a,d,i)}while(0);l=k;return}function zg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=c[e>>2]|0;while(1){if(!b)break;a=c[c[(c[(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0;b=b+-1|0}c[e>>2]=f+1;g=d+(f<<4)|0;b=d+(f+-1<<4)|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];f=c[e>>2]|0;c[e>>2]=f+1;f=d+(f<<4)|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];f=d+(c[e>>2]<<4)|0;e=(c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+16|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];return a|0}function Ag(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0;n=d+80|0;m=d+84|0;e=0;d=b;a:while(1){k=c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0;l=k+16|0;if((a[(c[l>>2]|0)+156>>0]|0)!=1)break;if((pb[c[17340>>2]&63](k)|0)<<24>>24)break;d=c[n>>2]|0;while(1){if((e|0)>=(d|0))break a;b=c[m>>2]|0;j=c[l>>2]|0;f=+h[j+24>>3];if(!(+h[b+(e<<5)+8>>3]>f))break;e=e+1|0}do if(!(+h[b+(e<<5)+24>>3]>3];i=~~g;f=+h[b+(e<<5)+16>>3];d=~~f;if(!(c[j+104>>2]|0)){Bg(k,i,~~((g+f)*.5),d);break}else{Bg(k,i,d,~~(f+ +h[j+96>>3]));break}}while(0);d=c[c[(c[l>>2]|0)+180>>2]>>2]|0}return}function Bg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[a+16>>2]|0;h[a+16>>3]=+(d|0);h[a+88>>3]=+(d-b|0);h[a+96>>3]=+(e-d|0);return}function Cg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=c[a>>2]&3;i=c[(c[(c[((h|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+180>>2]|0;h=((h|0)==2?a:a+-48|0)+40|0;g=0;a=0;while(1){e=c[i+(g<<2)>>2]|0;if(!e)break;f=c[(c[(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;do if((S(f-(c[(c[(c[h>>2]|0)+16>>2]|0)+236>>2]|0)|0,b)|0)>=1){d=c[e+16>>2]|0;if(!(c[d+8>>2]|0)){d=c[d+116>>2]|0;if(!d)break;if(!(c[(c[d+16>>2]|0)+8>>2]|0))break}if(a|0?(S((c[(c[(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)-f|0,b)|0)<=0:0)break;a=e}while(0);g=g+1|0}return a|0}function Dg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=c[a>>2]&3;i=c[(c[(c[((h|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+172>>2]|0;h=((h|0)==3?a:a+48|0)+40|0;g=0;a=0;while(1){e=c[i+(g<<2)>>2]|0;if(!e)break;f=c[(c[(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;do if((S(f-(c[(c[(c[h>>2]|0)+16>>2]|0)+236>>2]|0)|0,b)|0)>=1){d=c[e+16>>2]|0;if(!(c[d+8>>2]|0)){d=c[d+116>>2]|0;if(!d)break;if(!(c[(c[d+16>>2]|0)+8>>2]|0))break}if(a|0?(S((c[(c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)-f|0,b)|0)<=0:0)break;a=e}while(0);g=g+1|0}return a|0}function Eg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0,p=0;p=a+84|0;f=b+-1|0;while(1){if((f|0)>(d|0))break;i=c[p>>2]|0;g=i+(f<<5)|0;e=+h[g>>3];i=i+(f<<5)+16|0;j=+h[i>>3];o=~~((e+j)*.5);k=+(o+-8|0);l=+(o+8|0);if(!(f-b&1)){if(e>=j){h[g>>3]=k;h[i>>3]=l}}else if(e+16.0>j){h[g>>3]=k;h[i>>3]=l}f=f+1|0}o=(c[a+80>>2]|0)+-1|0;f=0;while(1){if((f|0)>=(o|0))break;g=c[p>>2]|0;n=f+1|0;i=g+(n<<5)|0;m=g+(f<<5)+16|0;a=g+(n<<5)+16|0;g=g+(f<<5)|0;if(!((f|0)<(b|0)|(f|0)>(d|0))?(f-b&1|0)==0:0){e=+h[g>>3]+16.0;if(e>+h[a>>3])h[a>>3]=e;e=+h[m>>3]+-16.0;if(!(e<+h[i>>3])){f=n;continue}h[i>>3]=e;f=n;continue}if(!((f|0)<(d|0)&(n|0)>=(b|0))){f=n;continue}if(n-b&1|0){f=n;continue}e=+h[a>>3];if(+h[g>>3]+16.0>e)h[g>>3]=e+-16.0;e=+h[i>>3];if(!(+h[m>>3]+-16.0>3]=e+16.0;f=n}return}function Fg(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;h[a>>3]=b;h[a+8>>3]=c;h[a+16>>3]=d;h[a+24>>3]=e;return}function Gg(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=c[(c[b+16>>2]|0)+196>>2]|0;h=c[d+16>>2]|0;j=c[h+232>>2]|0;i=k+(j<<6)|0;j=k+(j<<6)+4|0;h=c[h+236>>2]|0;a:do{h=h+g|0;if((h|0)<=-1){b=0;break}if((h|0)>=(c[i>>2]|0)){b=0;break}b=c[(c[j>>2]|0)+(h<<2)>>2]|0;k=c[b+16>>2]|0;switch(a[k+156>>0]|0){case 0:break a;case 1:{if(c[k+104>>2]|0)break a;break}default:{}}}while((Jg(b,d,e,f)|0)<<24>>24!=0);return b|0}function Hg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;d=c[d+16>>2]|0;if(!(a[d+156>>0]|0)){i=c[d+212>>2]|0;h=i}else{i=c[(c[(c[c[d+180>>2]>>2]|0)+16>>2]|0)+116>>2]|0;g=c[i>>2]&3;h=c[(c[(c[((g|0)==2?i:i+-48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0;i=c[(c[(c[((g|0)==3?i:i+48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0}d=c[e+16>>2]|0;if(!(a[d+156>>0]|0)){e=c[d+212>>2]|0;e=(e|0)==(b|0)?0:e;return ((e|0)==(h|0)|((e|0)==0|(e|0)==(i|0))?0:e)|0}f=c[(c[(c[c[d+180>>2]>>2]|0)+16>>2]|0)+116>>2]|0;g=c[f>>2]&3;d=c[(c[(c[((g|0)==3?f:f+48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0;d=(d|0)==(b|0)?0:d;if(!(!((d|0)==(h|0)|((d|0)==0|(d|0)==(i|0)))?(Ig(d,e)|0)!=0:0)){d=c[(c[(c[((g|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0;d=(d|0)==(b|0)?0:d;if((d|0)==(h|0)|((d|0)==0|(d|0)==(i|0)))d=0;else{e=(Ig(d,e)|0)==0;return (e?0:d)|0}}return d|0}function Ig(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0;d=c[a+16>>2]|0;a=c[b+16>>2]|0;f=+h[a+16>>3];if((+h[d+16>>3]<=f?f<=+h[d+32>>3]:0)?(e=+h[a+24>>3],+h[d+24>>3]<=e):0)a=e<=+h[d+40>>3];else a=0;return a&1|0}function Jg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=c[b+16>>2]|0;j=(c[i+236>>2]|0)>(c[(c[d+16>>2]|0)+236>>2]|0);a:do if((c[i+184>>2]|0)==1){b:do if(f|0){h=0;b=c[c[i+180>>2]>>2]|0;while(1){if((h|0)>=2)break b;b=c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0;d=c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0;if((b|0)==(d|0))break b;g=c[b+16>>2]|0;b=c[d+16>>2]|0;if(j^(c[g+236>>2]|0)>(c[b+236>>2]|0)){b=1;break a}if((c[g+184>>2]|0)!=1)break b;if(!(a[g+156>>0]|0))break b;if((c[b+184>>2]|0)!=1)break b;if(!(a[b+156>>0]|0))break b;h=h+1|0;f=c[c[b+180>>2]>>2]|0;b=c[c[g+180>>2]>>2]|0}}while(0);if(e|0?(c[i+176>>2]|0)==1:0){g=0;d=e;b=c[c[i+172>>2]>>2]|0;while(1){if((g|0)>=2){b=0;break a}b=c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0;d=c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0;if((b|0)==(d|0)){b=0;break a}f=c[b+16>>2]|0;b=c[d+16>>2]|0;if(j^(c[f+236>>2]|0)>(c[b+236>>2]|0)){b=1;break a}if((c[f+176>>2]|0)!=1){b=0;break a}if(!(a[f+156>>0]|0)){b=0;break a}if((c[b+176>>2]|0)!=1){b=0;break a}if(!(a[b+156>>0]|0)){b=0;break a}g=g+1|0;d=c[c[b+172>>2]>>2]|0;b=c[c[f+172>>2]>>2]|0}}else b=0}else b=0;while(0);return b|0}function Kg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=d;return}function Lg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0;e=+h[b+8>>3];d=+h[b>>3];return (~~((+h[a+8>>3]-e)*(+h[c>>3]-d)-(+h[c+8>>3]-e)*(+h[a>>3]-d))|0)>0|0}function Mg(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;S=l;l=l+256|0;E=S+232|0;D=S+216|0;Q=S+88|0;P=S+80|0;L=S+64|0;M=S+200|0;N=S+184|0;O=S;F=S+168|0;G=S+152|0;H=S+136|0;I=S+120|0;J=S+104|0;C=c[g>>2]&3;K=c[((C|0)==3?g:g+48|0)+40>>2]|0;C=c[((C|0)==2?g:g+-48|0)+40>>2]|0;do if((UM(K)|0)!=2?(UM(C)|0)!=2:0){g=0;j=0;m=0;while(1){if((m|0)>=(f|0))break;B=c[(c[d+(m+e<<2)>>2]|0)+16>>2]|0;g=((c[B+96>>2]|0)!=0&1)+g|0;if(!((a[B+44>>0]|0)==0?(a[B+84>>0]|0)==0:0))j=1;m=m+1|0}if(!j)if(!g){Og(K,C,d,e,f,i);break}else{Tg(K,C,d,e,f,i,g);break}z=HK(156)|0;A=Ug(b,z)|0;w=LD(A,85750,1)|0;RC(w,137786,280,1)|0;PA(w,87443,87457)|0;k=+h[(c[C+16>>2]|0)+16>>3];n=+h[(c[K+16>>2]|0)+16>>3];B=b+16|0;u=(c[(c[B>>2]|0)+116>>2]&1|0)==0;v=u?C:K;u=u?K:C;w=Vg(w,u)|0;x=Vg(A,v)|0;g=0;t=0;while(1){s=(g|0)!=0;if((t|0)>=(f|0))break;j=d+(t+e<<2)|0;while(1){r=c[j>>2]|0;q=r+16|0;j=c[q>>2]|0;if(!(a[j+112>>0]|0))break;else j=j+116|0}if((c[((c[r>>2]&3|0)==3?r:r+48|0)+40>>2]|0)==(u|0))m=Wg(A,w,x,r)|0;else m=Wg(A,x,w,r)|0;j=c[q>>2]|0;c[j+120>>2]=m;if(!s)if((a[j+44>>0]|0)==0?(a[j+84>>0]|0)==0:0){c[(c[m+16>>2]|0)+120>>2]=r;g=m}else g=0;t=t+1|0}if(s)y=g;else y=fB(A,w,x,0,1)|0;HA(y,c[47236]|0,85754)|0;g=A+16|0;r=c[g>>2]|0;c[r+144>>2]=c[(c[B>>2]|0)+144>>2];c[r+188>>2]=A;mQ(A,i);Lf(A);uj(A,0);Eh(A,0);Hi(A,0);r=u+16|0;u=c[r>>2]|0;i=c[v+16>>2]|0;s=w+16|0;p=+(~~((+h[(c[s>>2]|0)+16>>3]+ +h[(c[x+16>>2]|0)+16>>3])*.5)|0);o=+(~~k|0);k=+(~~n|0);n=+(~~((+h[u+16>>3]-+h[u+96>>3]+ +h[i+16>>3]+ +h[i+88>>3])*.5)|0);g=(c[g>>2]|0)+192|0;while(1){g=c[g>>2]|0;if(!g)break;j=c[g+16>>2]|0;m=j+16|0;q=j+24|0;do if((g|0)!=(w|0))if((g|0)==(x|0)){h[q>>3]=k;h[m>>3]=p;break}else{h[q>>3]=n;break}else{h[q>>3]=o;h[m>>3]=p}while(0);g=j+164|0}ok(A);gg(A,0);rM(A);w=c[r>>2]|0;p=+h[w+16>>3];x=c[s>>2]|0;k=+h[w+24>>3];n=+h[x+16>>3];o=+h[x+24>>3];if(!(c[(c[B>>2]|0)+116>>2]&1)){h[L>>3]=p-n;k=k-o}else{h[L>>3]=p-o;k=k+n}h[L+8>>3]=k;v=O+16|0;i=O+32|0;w=O+48|0;u=0;while(1){if((u|0)>=(f|0))break;g=d+(u+e<<2)|0;while(1){j=c[g>>2]|0;t=j+16|0;g=c[t>>2]|0;if(!(a[g+112>>0]|0))break;else g=g+116|0}x=c[g+120>>2]|0;s=x+16|0;g=c[s>>2]|0;if(!((x|0)==(y|0)&(c[g+120>>2]|0)==0)){q=c[c[g+8>>2]>>2]|0;r=q+4|0;j=aO(j,c[r>>2]|0)|0;c[j+8>>2]=c[q+8>>2];g=j+16|0;x=q+16|0;m=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[x>>2];c[D+4>>2]=c[x+4>>2];c[D+8>>2]=c[x+8>>2];c[D+12>>2]=c[x+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(M,D,E,m);c[g>>2]=c[M>>2];c[g+4>>2]=c[M+4>>2];c[g+8>>2]=c[M+8>>2];c[g+12>>2]=c[M+12>>2];c[j+12>>2]=c[q+12>>2];g=j+32|0;m=q+32|0;x=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[m>>2];c[D+4>>2]=c[m+4>>2];c[D+8>>2]=c[m+8>>2];c[D+12>>2]=c[m+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(N,D,E,x);c[g>>2]=c[N>>2];c[g+4>>2]=c[N+4>>2];c[g+8>>2]=c[N+8>>2];c[g+12>>2]=c[N+12>>2];g=0;while(1){if((g|0)>=(c[r>>2]|0))break;m=(c[j>>2]|0)+(g<<4)|0;T=(c[q>>2]|0)+(g<<4)|0;x=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[T>>2];c[D+4>>2]=c[T+4>>2];c[D+8>>2]=c[T+8>>2];c[D+12>>2]=c[T+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(F,D,E,x);c[m>>2]=c[F>>2];c[m+4>>2]=c[F+4>>2];c[m+8>>2]=c[F+8>>2];c[m+12>>2]=c[F+12>>2];c[O>>2]=c[F>>2];c[O+4>>2]=c[F+4>>2];c[O+8>>2]=c[F+8>>2];c[O+12>>2]=c[F+12>>2];m=g+1|0;if((m|0)>=(c[r>>2]|0)){R=48;break}x=(c[j>>2]|0)+(m<<4)|0;m=(c[q>>2]|0)+(m<<4)|0;T=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[m>>2];c[D+4>>2]=c[m+4>>2];c[D+8>>2]=c[m+8>>2];c[D+12>>2]=c[m+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(G,D,E,T);c[x>>2]=c[G>>2];c[x+4>>2]=c[G+4>>2];c[x+8>>2]=c[G+8>>2];c[x+12>>2]=c[G+12>>2];c[v>>2]=c[G>>2];c[v+4>>2]=c[G+4>>2];c[v+8>>2]=c[G+8>>2];c[v+12>>2]=c[G+12>>2];x=g+2|0;T=(c[j>>2]|0)+(x<<4)|0;x=(c[q>>2]|0)+(x<<4)|0;m=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[x>>2];c[D+4>>2]=c[x+4>>2];c[D+8>>2]=c[x+8>>2];c[D+12>>2]=c[x+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(H,D,E,m);c[T>>2]=c[H>>2];c[T+4>>2]=c[H+4>>2];c[T+8>>2]=c[H+8>>2];c[T+12>>2]=c[H+12>>2];c[i>>2]=c[H>>2];c[i+4>>2]=c[H+4>>2];c[i+8>>2]=c[H+8>>2];c[i+12>>2]=c[H+12>>2];T=g+3|0;m=(c[q>>2]|0)+(T<<4)|0;x=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[m>>2];c[D+4>>2]=c[m+4>>2];c[D+8>>2]=c[m+8>>2];c[D+12>>2]=c[m+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(I,D,E,x);c[w>>2]=c[I>>2];c[w+4>>2]=c[I+4>>2];c[w+8>>2]=c[I+8>>2];c[w+12>>2]=c[I+12>>2];jI((c[B>>2]|0)+16|0,O);g=T}if((R|0)==48)R=0;g=c[(c[t>>2]|0)+96>>2]|0;if(g|0){T=g+56|0;s=(c[(c[s>>2]|0)+96>>2]|0)+56|0;x=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[s>>2];c[D+4>>2]=c[s+4>>2];c[D+8>>2]=c[s+8>>2];c[D+12>>2]=c[s+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(J,D,E,x);c[T>>2]=c[J>>2];c[T+4>>2]=c[J+4>>2];c[T+8>>2]=c[J+8>>2];c[T+12>>2]=c[J+12>>2];T=c[(c[t>>2]|0)+96>>2]|0;a[T+81>>0]=1;xP(b,T)}}u=u+1|0}Yg(A,z)}else R=3;while(0);if((R|0)==3?(c[46780]|0)==0:0){c[46780]=1;dA(0,85627,P)|0;P=HB(K)|0;R=(uB(b)|0)!=0;T=HB(C)|0;c[Q>>2]=P;c[Q+4>>2]=R?138041:142050;c[Q+8>>2]=T;dA(3,85733,Q)|0}l=S;return}function Ng(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0;z=l;l=l+1600|0;u=z+1552|0;n=z+1536|0;t=z+840|0;v=z+144|0;w=z+1584|0;j=z+32|0;s=z+16|0;o=z;q=c[f>>2]&3;p=c[((q|0)==3?f:f+48|0)+40>>2]|0;x=f+-48|0;q=c[((q|0)==2?f:x)+40>>2]|0;r=f+16|0;k=c[r>>2]|0;i=c[k+172>>2]|0;while(1){m=c[(c[i+16>>2]|0)+172>>2]|0;if(!m)break;else i=m}k=(c[k+96>>2]|0)+56|0;i=(c[((c[i>>2]&3|0)==3?i:i+48|0)+40>>2]|0)+16|0;m=(c[i>>2]|0)+16|0;c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];k=c[r>>2]|0;a[(c[k+96>>2]|0)+81>>0]=1;m=c[p+16>>2]|0;if((g|0)!=2){k=c[i>>2]|0;C=+h[k+16>>3];E=C-+h[k+88>>3];C=C+ +h[k+96>>3];B=+h[k+24>>3];D=B+ +h[k+80>>3]*.5;k=c[(c[b+16>>2]|0)+196>>2]|0;j=c[m+232>>2]|0;B=+(~~(+(~~(B-+h[k+(j<<6)+16>>3]-+h[m+24>>3]+ +h[k+(j<<6)+24>>3])|0)/6.0)|0);B=D-(B<5.0?5.0:B);Qg(b,d,e,p,f,t,1);Qg(b,d,e,q,f,v,0);j=t+52|0;k=c[j>>2]|0;m=k+-1|0;A=+h[t+56+(m<<5)>>3];h[19234]=A;h[19235]=+h[t+56+(m<<5)+24>>3];h[19236]=E;h[19237]=B;h[19238]=A;h[19239]=B;m=v+52|0;i=(c[m>>2]|0)+-1|0;A=+h[v+56+(i<<5)+16>>3];h[19240]=A;h[19241]=D;h[19242]=C;h[19245]=B;h[19243]=+h[v+56+(i<<5)+24>>3];h[19244]=A;i=0;while(1){if((i|0)>=(k|0)){i=0;break}k=t+56+(i<<5)|0;c[u>>2]=c[k>>2];c[u+4>>2]=c[k+4>>2];c[u+8>>2]=c[k+8>>2];c[u+12>>2]=c[k+12>>2];c[u+16>>2]=c[k+16>>2];c[u+20>>2]=c[k+20>>2];c[u+24>>2]=c[k+24>>2];c[u+28>>2]=c[k+28>>2];dO(e,u);i=i+1|0;k=c[j>>2]|0}while(1){if((i|0)==3)break;t=153872+(i<<5)|0;c[u>>2]=c[t>>2];c[u+4>>2]=c[t+4>>2];c[u+8>>2]=c[t+8>>2];c[u+12>>2]=c[t+12>>2];c[u+16>>2]=c[t+16>>2];c[u+20>>2]=c[t+20>>2];c[u+24>>2]=c[t+24>>2];c[u+28>>2]=c[t+28>>2];dO(e,u);i=i+1|0}j=c[m>>2]|0;while(1){i=j+-1|0;if((j|0)<=0)break;j=v+56+(i<<5)|0;c[u>>2]=c[j>>2];c[u+4>>2]=c[j+4>>2];c[u+8>>2]=c[j+8>>2];c[u+12>>2]=c[j+12>>2];c[u+16>>2]=c[j+16>>2];c[u+20>>2]=c[j+20>>2];c[u+24>>2]=c[j+24>>2];c[u+28>>2]=c[j+28>>2];dO(e,u);j=i}if((g|0)==10)j=FM(e,w)|0;else j=LM(e,w)|0;i=c[w>>2]|0;if(i|0)y=17}else{i=m+16|0;v=k+16|0;c[n>>2]=c[i>>2];c[n+4>>2]=c[i+4>>2];c[n+8>>2]=c[i+8>>2];c[n+12>>2]=c[i+12>>2];c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];Kg(s,n,u);v=(c[q+16>>2]|0)+16|0;i=(c[r>>2]|0)+56|0;c[n>>2]=c[v>>2];c[n+4>>2]=c[v+4>>2];c[n+8>>2]=c[v+8>>2];c[n+12>>2]=c[v+12>>2];c[u>>2]=c[i>>2];c[u+4>>2]=c[i+4>>2];c[u+8>>2]=c[i+8>>2];c[u+12>>2]=c[i+12>>2];Kg(o,n,u);i=c[(c[r>>2]|0)+96>>2]|0;D=+h[i+56>>3];E=+h[i+64>>3]-+h[i+32>>3]*.5;i=j+16|0;c[j>>2]=c[s>>2];c[j+4>>2]=c[s+4>>2];c[j+8>>2]=c[s+8>>2];c[j+12>>2]=c[s+12>>2];c[i>>2]=c[s>>2];c[i+4>>2]=c[s+4>>2];c[i+8>>2]=c[s+8>>2];c[i+12>>2]=c[s+12>>2];i=j+32|0;v=j+48|0;y=j+64|0;h[j+64>>3]=D;h[j+72>>3]=E;c[v>>2]=c[y>>2];c[v+4>>2]=c[y+4>>2];c[v+8>>2]=c[y+8>>2];c[v+12>>2]=c[y+12>>2];c[i>>2]=c[y>>2];c[i+4>>2]=c[y+4>>2];c[i+8>>2]=c[y+8>>2];c[i+12>>2]=c[y+12>>2];i=j+80|0;y=j+96|0;c[y>>2]=c[o>>2];c[y+4>>2]=c[o+4>>2];c[y+8>>2]=c[o+8>>2];c[y+12>>2]=c[o+12>>2];c[i>>2]=c[o>>2];c[i+4>>2]=c[o+4>>2];c[i+8>>2]=c[o+8>>2];c[i+12>>2]=c[o+12>>2];c[w>>2]=7;i=7;y=17}if((y|0)==17)bO(f,c[((c[f>>2]&3|0)==2?f:x)+40>>2]|0,j,i,17336);l=z;return}function Og(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;P=l;l=l+352|0;z=P+336|0;y=P+320|0;N=P+144|0;u=P+304|0;A=P+128|0;O=P+112|0;G=P+96|0;H=P+80|0;I=P+64|0;J=P+48|0;K=P+32|0;L=P+16|0;M=P;a=a+16|0;s=(c[a>>2]|0)+16|0;x=(c[d+(e<<2)>>2]|0)+16|0;t=(c[x>>2]|0)+16|0;c[y>>2]=c[s>>2];c[y+4>>2]=c[s+4>>2];c[y+8>>2]=c[s+8>>2];c[y+12>>2]=c[s+12>>2];c[z>>2]=c[t>>2];c[z+4>>2]=c[t+4>>2];c[z+8>>2]=c[t+8>>2];c[z+12>>2]=c[t+12>>2];Kg(u,y,z);E=+h[u>>3];F=+h[u+8>>3];u=(c[b+16>>2]|0)+16|0;x=(c[x>>2]|0)+56|0;c[y>>2]=c[u>>2];c[y+4>>2]=c[u+4>>2];c[y+8>>2]=c[u+8>>2];c[y+12>>2]=c[u+12>>2];c[z>>2]=c[x>>2];c[z+4>>2]=c[x+4>>2];c[z+8>>2]=c[x+8>>2];c[z+12>>2]=c[x+12>>2];Kg(A,y,z);C=+h[A>>3];D=+h[A+8>>3];if((f|0)>1){B=+h[(c[a>>2]|0)+80>>3];i=B*.5;B=B/+(f+-1|0)}else{i=0.0;B=0.0}r=(g|8|0)==10;o=N+8|0;s=N+16|0;t=N+48|0;u=N+32|0;v=(E*2.0+C)/3.0;w=(E+C*2.0)/3.0;p=N+24|0;x=N+64|0;y=N+80|0;z=N+96|0;A=N+112|0;m=N+128|0;q=N+136|0;n=N+144|0;i=F-i;b=0;while(1){if((b|0)>=(f|0))break;k=c[d+(b+e<<2)>>2]|0;h[N>>3]=E;h[o>>3]=F;if(r){Sg(O,v,i);c[s>>2]=c[O>>2];c[s+4>>2]=c[O+4>>2];c[s+8>>2]=c[O+8>>2];c[s+12>>2]=c[O+12>>2];Sg(G,w,i);c[u>>2]=c[G>>2];c[u+4>>2]=c[G+4>>2];c[u+8>>2]=c[G+8>>2];c[u+12>>2]=c[G+12>>2];a=4;g=3;j=t}else{h[s>>3]=E;h[p>>3]=F;Sg(H,v,i);c[u>>2]=c[H>>2];c[u+4>>2]=c[H+4>>2];c[u+8>>2]=c[H+8>>2];c[u+12>>2]=c[H+12>>2];Sg(I,v,i);c[t>>2]=c[I>>2];c[t+4>>2]=c[I+4>>2];c[t+8>>2]=c[I+8>>2];c[t+12>>2]=c[I+12>>2];Sg(J,v,i);c[x>>2]=c[J>>2];c[x+4>>2]=c[J+4>>2];c[x+8>>2]=c[J+8>>2];c[x+12>>2]=c[J+12>>2];Sg(K,w,i);c[y>>2]=c[K>>2];c[y+4>>2]=c[K+4>>2];c[y+8>>2]=c[K+8>>2];c[y+12>>2]=c[K+12>>2];Sg(L,w,i);c[z>>2]=c[L>>2];c[z+4>>2]=c[L+4>>2];c[z+8>>2]=c[L+8>>2];c[z+12>>2]=c[L+12>>2];Sg(M,w,i);c[A>>2]=c[M>>2];c[A+4>>2]=c[M+4>>2];c[A+8>>2]=c[M+8>>2];c[A+12>>2]=c[M+12>>2];h[m>>3]=C;h[q>>3]=D;a=10;g=9;j=n}h[j>>3]=C;h[N+(g<<4)+8>>3]=D;bO(k,c[((c[k>>2]&3|0)==2?k:k+-48|0)+40>>2]|0,N,a,17336);i=B+i;b=b+1|0}l=P;return}function Pg(a,d,e,f,g,i,j,k){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;var m=0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0;x=l;l=l+1440|0;t=x+1392|0;v=x+1424|0;w=x+696|0;u=x;r=c[j>>2]&3;q=c[((r|0)==3?j:j+48|0)+40>>2]|0;r=c[((r|0)==2?j:j+-48|0)+40>>2]|0;m=c[q+16>>2]|0;o=c[m+232>>2]|0;p=c[a+16>>2]|0;if((o|0)<(b[p+238>>1]|0)){y=c[p+196>>2]|0;p=o+1|0;n=+h[m+24>>3]-+h[y+(o<<6)+32>>3]-(+h[(c[(c[c[y+(p<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]+ +h[y+(p<<6)+40>>3])}else n=+(c[p+252>>2]|0);z=+(i+1|0);s=+(c[d+12>>2]|0)/z;n=n/z;Rg(a,d,e,q,j,w,1);Rg(a,d,e,r,j,u,0);r=w+52|0;j=u+52|0;a=(k|0)==0;d=e+80|0;m=0;while(1){if((m|0)>=(i|0))break;q=c[f+(m+g<<2)>>2]|0;p=c[r>>2]|0;o=p+-1|0;D=+h[w+56+(o<<5)>>3];B=+h[w+56+(o<<5)+8>>3];C=+h[w+56+(o<<5)+16>>3];h[19234]=D;h[19237]=B;m=m+1|0;z=+(m|0);A=s*z;h[19236]=A+C;z=B-n*z;h[19235]=z;h[19238]=D;h[19241]=z;o=(c[j>>2]|0)+-1|0;D=+h[u+56+(o<<5)+16>>3];h[19240]=D;h[19239]=z-n;B=+h[u+56+(o<<5)>>3];C=+h[u+56+(o<<5)+8>>3];h[19244]=D;h[19245]=C;h[19242]=B-A;h[19243]=z;o=0;while(1){if((o|0)>=(p|0)){o=0;break}p=w+56+(o<<5)|0;c[t>>2]=c[p>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[t+12>>2]=c[p+12>>2];c[t+16>>2]=c[p+16>>2];c[t+20>>2]=c[p+20>>2];c[t+24>>2]=c[p+24>>2];c[t+28>>2]=c[p+28>>2];dO(e,t);o=o+1|0;p=c[r>>2]|0}while(1){if((o|0)==3)break;y=153872+(o<<5)|0;c[t>>2]=c[y>>2];c[t+4>>2]=c[y+4>>2];c[t+8>>2]=c[y+8>>2];c[t+12>>2]=c[y+12>>2];c[t+16>>2]=c[y+16>>2];c[t+20>>2]=c[y+20>>2];c[t+24>>2]=c[y+24>>2];c[t+28>>2]=c[y+28>>2];dO(e,t);o=o+1|0}p=c[j>>2]|0;while(1){o=p+-1|0;if((p|0)<=0)break;p=u+56+(o<<5)|0;c[t>>2]=c[p>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[t+12>>2]=c[p+12>>2];c[t+16>>2]=c[p+16>>2];c[t+20>>2]=c[p+20>>2];c[t+24>>2]=c[p+24>>2];c[t+28>>2]=c[p+28>>2];dO(e,t);p=o}if(a)o=LM(e,v)|0;else o=FM(e,v)|0;p=c[v>>2]|0;if(!p)break;bO(q,c[((c[q>>2]&3|0)==2?q:q+-48|0)+40>>2]|0,o,p,17336);c[d>>2]=0}l=x;return}function Qg(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0.0;n=l;l=l+128|0;j=n+96|0;k=n+64|0;o=n+32|0;m=n;tg(o,a,b,e,0,f);c[g>>2]=c[o>>2];c[g+4>>2]=c[o+4>>2];c[g+8>>2]=c[o+8>>2];c[g+12>>2]=c[o+12>>2];c[g+16>>2]=c[o+16>>2];c[g+20>>2]=c[o+20>>2];c[g+24>>2]=c[o+24>>2];c[g+28>>2]=c[o+28>>2];c[k>>2]=c[o>>2];c[k+4>>2]=c[o+4>>2];c[k+8>>2]=c[o+8>>2];c[k+12>>2]=c[o+12>>2];c[k+16>>2]=c[o+16>>2];c[k+20>>2]=c[o+20>>2];c[k+24>>2]=c[o+24>>2];c[k+28>>2]=c[o+28>>2];c[g+48>>2]=4;if(!(i<<24>>24))hO(d,f,2,g,0);else eO(d,f,2,g,0);b=g+52|0;f=(c[b>>2]|0)+-1|0;o=k+24|0;h[o>>3]=+h[g+56+(f<<5)+24>>3];i=k+8|0;h[i>>3]=+h[g+56+(f<<5)+8>>3];e=c[e+16>>2]|0;p=+h[e+24>>3]+ +h[(c[(c[a+16>>2]|0)+196>>2]|0)+(c[e+232>>2]<<6)+24>>3];c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];c[j+16>>2]=c[k+16>>2];c[j+20>>2]=c[k+20>>2];c[j+24>>2]=c[k+24>>2];c[j+28>>2]=c[k+28>>2];vg(m,j,4,p);c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];c[k+16>>2]=c[m+16>>2];c[k+20>>2]=c[m+20>>2];c[k+24>>2]=c[m+24>>2];c[k+28>>2]=c[m+28>>2];if(+h[k>>3]<+h[k+16>>3]?+h[i>>3]<+h[o>>3]:0){o=c[b>>2]|0;c[b>>2]=o+1;o=g+56+(o<<5)|0;c[o>>2]=c[k>>2];c[o+4>>2]=c[k+4>>2];c[o+8>>2]=c[k+8>>2];c[o+12>>2]=c[k+12>>2];c[o+16>>2]=c[k+16>>2];c[o+20>>2]=c[k+20>>2];c[o+24>>2]=c[k+24>>2];c[o+28>>2]=c[k+28>>2]}l=n;return}function Rg(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0.0;n=l;l=l+128|0;j=n+96|0;k=n+64|0;o=n+32|0;m=n;tg(o,a,b,e,0,f);c[g>>2]=c[o>>2];c[g+4>>2]=c[o+4>>2];c[g+8>>2]=c[o+8>>2];c[g+12>>2]=c[o+12>>2];c[g+16>>2]=c[o+16>>2];c[g+20>>2]=c[o+20>>2];c[g+24>>2]=c[o+24>>2];c[g+28>>2]=c[o+28>>2];c[k>>2]=c[o>>2];c[k+4>>2]=c[o+4>>2];c[k+8>>2]=c[o+8>>2];c[k+12>>2]=c[o+12>>2];c[k+16>>2]=c[o+16>>2];c[k+20>>2]=c[o+20>>2];c[k+24>>2]=c[o+24>>2];c[k+28>>2]=c[o+28>>2];c[g+48>>2]=1;if(!(i<<24>>24))hO(d,f,2,g,0);else eO(d,f,2,g,0);b=g+52|0;f=(c[b>>2]|0)+-1|0;o=k+24|0;h[o>>3]=+h[g+56+(f<<5)+24>>3];i=k+8|0;h[i>>3]=+h[g+56+(f<<5)+8>>3];e=c[e+16>>2]|0;p=+h[e+24>>3]-+h[(c[(c[a+16>>2]|0)+196>>2]|0)+(c[e+232>>2]<<6)+24>>3];c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];c[j+16>>2]=c[k+16>>2];c[j+20>>2]=c[k+20>>2];c[j+24>>2]=c[k+24>>2];c[j+28>>2]=c[k+28>>2];vg(m,j,1,p);c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];c[k+16>>2]=c[m+16>>2];c[k+20>>2]=c[m+20>>2];c[k+24>>2]=c[m+24>>2];c[k+28>>2]=c[m+28>>2];if(+h[k>>3]<+h[k+16>>3]?+h[i>>3]<+h[o>>3]:0){o=c[b>>2]|0;c[b>>2]=o+1;o=g+56+(o<<5)|0;c[o>>2]=c[k>>2];c[o+4>>2]=c[k+4>>2];c[o+8>>2]=c[k+8>>2];c[o+12>>2]=c[k+12>>2];c[o+16>>2]=c[k+16>>2];c[o+20>>2]=c[k+20>>2];c[o+24>>2]=c[k+24>>2];c[o+28>>2]=c[k+28>>2]}l=n;return}function Sg(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function Tg(b,d,e,f,g,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;$=l;l=l+288|0;U=$+256|0;T=$+240|0;S=$+224|0;Y=$+280|0;Z=$+272|0;_=$+32|0;V=$+16|0;W=$;m=$+208|0;n=$+192|0;o=c[e+(f<<2)>>2]|0;X=HK(g<<2)|0;k=0;while(1){if((k|0)>=(g|0))break;c[X+(k<<2)>>2]=c[e+(k+f<<2)>>2];k=k+1|0}k3(X,g,4,59);E=b+16|0;G=(c[E>>2]|0)+16|0;F=o+16|0;K=(c[F>>2]|0)+16|0;c[T>>2]=c[G>>2];c[T+4>>2]=c[G+4>>2];c[T+8>>2]=c[G+8>>2];c[T+12>>2]=c[G+12>>2];c[U>>2]=c[K>>2];c[U+4>>2]=c[K+4>>2];c[U+8>>2]=c[K+8>>2];c[U+12>>2]=c[K+12>>2];Kg(m,T,U);c[V>>2]=c[m>>2];c[V+4>>2]=c[m+4>>2];c[V+8>>2]=c[m+8>>2];c[V+12>>2]=c[m+12>>2];K=d+16|0;G=(c[K>>2]|0)+16|0;F=(c[F>>2]|0)+56|0;c[T>>2]=c[G>>2];c[T+4>>2]=c[G+4>>2];c[T+8>>2]=c[G+8>>2];c[T+12>>2]=c[G+12>>2];c[U>>2]=c[F>>2];c[U+4>>2]=c[F+4>>2];c[U+8>>2]=c[F+8>>2];c[U+12>>2]=c[F+12>>2];Kg(n,T,U);c[W>>2]=c[n>>2];c[W+4>>2]=c[n+4>>2];c[W+8>>2]=c[n+8>>2];c[W+12>>2]=c[n+12>>2];y=+h[V>>3]+ +h[(c[E>>2]|0)+96>>3];z=+h[W>>3]-+h[(c[K>>2]|0)+88>>3];x=(y+z)*.5;K=c[X>>2]|0;c[_>>2]=c[V>>2];c[_+4>>2]=c[V+4>>2];c[_+8>>2]=c[V+8>>2];c[_+12>>2]=c[V+12>>2];E=_+16|0;c[E>>2]=c[V>>2];c[E+4>>2]=c[V+4>>2];c[E+8>>2]=c[V+8>>2];c[E+12>>2]=c[V+12>>2];F=_+32|0;c[F>>2]=c[W>>2];c[F+4>>2]=c[W+4>>2];c[F+8>>2]=c[W+8>>2];c[F+12>>2]=c[W+12>>2];G=_+48|0;c[G>>2]=c[W>>2];c[G+4>>2]=c[W+4>>2];c[G+8>>2]=c[W+8>>2];c[G+12>>2]=c[W+12>>2];bO(K,c[((c[K>>2]&3|0)==2?K:K+-48|0)+40>>2]|0,_,4,17336);K=c[(c[K+16>>2]|0)+96>>2]|0;h[K+56>>3]=x;H=V+8|0;v=+h[H>>3];w=+h[K+32>>3];h[K+64>>3]=v+(w+6.0)*.5;a[K+81>>0]=1;v=v+3.0;J=+h[K+24>>3]*.5;I=x-J;J=x+J;K=W+8|0;L=_+72|0;M=_+40|0;N=_+120|0;O=_+64|0;P=Y+4|0;Q=_+56|0;R=_+24|0;o=(i|0)==6&1;e=_+104|0;f=_+96|0;i=_+80|0;C=_+88|0;D=_+112|0;t=0.0;s=0.0;w=v+w;m=1;while(1){if((m|0)>=(j|0)){B=6;break}d=c[X+(m<<2)>>2]|0;p=+h[V>>3];q=+h[K>>3];r=+h[W>>3];u=+h[H>>3];n=d+16|0;if(!(m&1)){c[_>>2]=c[V>>2];c[_+4>>2]=c[V+4>>2];c[_+8>>2]=c[V+8>>2];c[_+12>>2]=c[V+12>>2];h[E>>3]=I;h[R>>3]=u;h[F>>3]=I;h[M>>3]=w;h[G>>3]=J;h[Q>>3]=w;h[O>>3]=J;h[L>>3]=q;h[i>>3]=r;h[C>>3]=q;h[f>>3]=r;A=w+6.0;h[e>>3]=A;h[D>>3]=p;h[N>>3]=A;A=+h[(c[(c[n>>2]|0)+96>>2]|0)+32>>3];p=w+A*.5+6.0;w=w+(A+6.0)}else{k=c[(c[n>>2]|0)+96>>2]|0;if((m|0)==1){s=+h[k+24>>3]*.5;t=x+s;s=x-s}v=v-(+h[k+32>>3]+6.0);c[_>>2]=c[V>>2];c[_+4>>2]=c[V+4>>2];c[_+8>>2]=c[V+8>>2];c[_+12>>2]=c[V+12>>2];h[E>>3]=p;p=v+-6.0;h[R>>3]=p;h[F>>3]=r;h[M>>3]=p;c[G>>2]=c[W>>2];c[G+4>>2]=c[W+4>>2];c[G+8>>2]=c[W+8>>2];c[G+12>>2]=c[W+12>>2];h[O>>3]=t;h[L>>3]=q;h[i>>3]=t;h[C>>3]=v;h[f>>3]=s;h[e>>3]=v;h[D>>3]=s;h[N>>3]=u;p=v+ +h[(c[(c[n>>2]|0)+96>>2]|0)+32>>3]*.5}c[P>>2]=8;c[Y>>2]=_;c[S>>2]=c[V>>2];c[S+4>>2]=c[V+4>>2];c[S+8>>2]=c[V+8>>2];c[S+12>>2]=c[V+12>>2];c[T>>2]=c[W>>2];c[T+4>>2]=c[W+4>>2];c[T+8>>2]=c[W+8>>2];c[T+12>>2]=c[W+12>>2];c[U>>2]=c[Y>>2];c[U+4>>2]=c[Y+4>>2];k=BM(S,T,U,Z,o)|0;b=c[Z>>2]|0;if(!b)break;n=c[(c[n>>2]|0)+96>>2]|0;h[n+56>>3]=x;h[n+64>>3]=p;a[n+81>>0]=1;bO(d,c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0,k,b,17336);m=m+1|0}a:do if((B|0)==6){A=(y*2.0+z)/3.0;x=(y+z*2.0)/3.0;while(1){if((m|0)>=(g|0))break;d=c[X+(m<<2)>>2]|0;p=+h[V>>3];q=+h[K>>3];r=+h[W>>3];u=+h[H>>3];if(!(m&1)){c[_>>2]=c[V>>2];c[_+4>>2]=c[V+4>>2];c[_+8>>2]=c[V+8>>2];c[_+12>>2]=c[V+12>>2];h[E>>3]=I;h[R>>3]=u;h[F>>3]=I;h[M>>3]=w;h[G>>3]=J;h[Q>>3]=w;h[O>>3]=J;h[L>>3]=q;h[i>>3]=r;h[C>>3]=q;h[f>>3]=r;q=w+6.0;w=q;r=q}else{B=(m|0)==1;y=B?A:s;t=B?x:t;z=v+-6.0;c[_>>2]=c[V>>2];c[_+4>>2]=c[V+4>>2];c[_+8>>2]=c[V+8>>2];c[_+12>>2]=c[V+12>>2];h[E>>3]=p;v=z+-6.0;h[R>>3]=v;h[F>>3]=r;h[M>>3]=v;c[G>>2]=c[W>>2];c[G+4>>2]=c[W+4>>2];c[G+8>>2]=c[W+8>>2];c[G+12>>2]=c[W+12>>2];h[O>>3]=t;h[L>>3]=q;h[i>>3]=t;h[C>>3]=z;h[f>>3]=y;v=z;s=y;r=u;p=y;q=z}h[e>>3]=q;h[D>>3]=p;h[N>>3]=r;c[P>>2]=8;c[Y>>2]=_;c[S>>2]=c[V>>2];c[S+4>>2]=c[V+4>>2];c[S+8>>2]=c[V+8>>2];c[S+12>>2]=c[V+12>>2];c[T>>2]=c[W>>2];c[T+4>>2]=c[W+4>>2];c[T+8>>2]=c[W+8>>2];c[T+12>>2]=c[W+12>>2];c[U>>2]=c[Y>>2];c[U+4>>2]=c[Y+4>>2];k=BM(S,T,U,Z,o)|0;b=c[Z>>2]|0;if(!b)break a;bO(d,c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0,k,b,17336);m=m+1|0}l6(X)}while(0);l=$;return}function Ug(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0;g=l;l=l+16|0;f=g;j=(uB(b)|0)==0;c[f>>2]=c[(j?18636:18628)>>2];f=lB(85765,f,0)|0;RC(f,137786,280,1)|0;DA(f,0,87443,195341)|0;j=HK(96)|0;e=c[f+16>>2]|0;c[e+8>>2]=j;i=c[b+16>>2]|0;k=c[i+8>>2]|0;h[j>>3]=+h[k>>3];h[j+24>>3]=+h[k+24>>3];a[e+115>>0]=a[i+115>>0]|0;c[e+116>>2]=c[i+116>>2]&1^1;c[e+248>>2]=c[i+248>>2];c[e+252>>2]=c[i+252>>2];e=IA(vC(b)|0,1,0)|0;while(1){if(!e)break;DA(f,1,c[e+8>>2]|0,c[e+12>>2]|0)|0;e=IA(vC(b)|0,1,e)|0}e=IA(vC(b)|0,2,0)|0;while(1){if(!e)break;DA(f,2,c[e+8>>2]|0,c[e+12>>2]|0)|0;e=IA(vC(b)|0,2,e)|0}if(!(DA(f,2,111765,0)|0))DA(f,2,111765,195341)|0;if(!(DA(f,2,111756,0)|0))DA(f,2,111756,195341)|0;Zg(f,d);l=g;return f|0}function Vg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=l;l=l+16|0;d=e;a=qC(a,HB(b)|0,1)|0;RC(a,137750,304,1)|0;RA(b,a)|0;if((UM(b)|0)==2){f=b+16|0;b=IK((D3(c[c[(c[f>>2]|0)+104>>2]>>2]|0)|0)+3|0)|0;c[d>>2]=c[c[(c[f>>2]|0)+104>>2]>>2];i2(b,85760,d)|0;PA(a,108525,b)|0}l=e;return a|0}function Wg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=fB(a,b,c,0,1)|0;RC(c,137763,176,1)|0;RA(d,c)|0;return c|0}function Xg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0.0;i=l;l=l+32|0;g=i+16|0;f=i;if(e|0){j=+h[b>>3];e=b+8|0;h[b>>3]=+h[e>>3];h[e>>3]=-j};c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];Kg(a,f,g);l=i;return}function Yg(a,b){a=a|0;b=b|0;c[47258]=c[b>>2];c[47262]=c[b+4>>2];c[47263]=c[b+8>>2];c[47236]=c[b+12>>2];c[47237]=c[b+16>>2];c[47250]=c[b+20>>2];c[47249]=c[b+24>>2];c[47248]=c[b+28>>2];c[47274]=c[b+32>>2];c[47266]=c[b+36>>2];c[47251]=c[b+40>>2];c[47261]=c[b+44>>2];c[47270]=c[b+48>>2];c[47269]=c[b+52>>2];c[47268]=c[b+56>>2];c[47273]=c[b+60>>2];c[47267]=c[b+64>>2];c[47252]=c[b+68>>2];c[47199]=c[b+72>>2];c[47200]=c[b+76>>2];c[47201]=c[b+80>>2];c[47219]=c[b+84>>2];c[47212]=c[b+88>>2];c[47213]=c[b+92>>2];c[47214]=c[b+96>>2];c[47216]=c[b+100>>2];c[47217]=c[b+104>>2];c[47220]=c[b+108>>2];c[47223]=c[b+112>>2];c[47221]=c[b+116>>2];c[47222]=c[b+120>>2];c[47225]=c[b+124>>2];c[47224]=c[b+128>>2];c[47226]=c[b+132>>2];c[47227]=c[b+136>>2];c[47218]=c[b+140>>2];c[47230]=c[b+144>>2];c[47194]=c[b+148>>2];c[47185]=c[b+152>>2];l6(b);Of(a);pB(a)|0;return}function Zg(a,b){a=a|0;b=b|0;c[b>>2]=c[47258];c[b+4>>2]=c[47262];c[b+8>>2]=c[47263];c[b+12>>2]=c[47236];c[b+16>>2]=c[47237];c[b+20>>2]=c[47250];c[b+24>>2]=c[47249];c[b+28>>2]=c[47248];c[b+32>>2]=c[47274];c[b+36>>2]=c[47266];c[b+40>>2]=c[47251];c[b+44>>2]=c[47261];c[b+48>>2]=c[47270];c[b+52>>2]=c[47269];c[b+56>>2]=c[47268];c[b+60>>2]=c[47273];c[b+64>>2]=c[47267];c[b+68>>2]=c[47252];c[b+72>>2]=c[47199];c[b+76>>2]=c[47200];c[b+80>>2]=c[47201];c[b+84>>2]=c[47219];c[b+88>>2]=c[47212];c[b+92>>2]=c[47213];c[b+96>>2]=c[47214];c[b+100>>2]=c[47216];c[b+104>>2]=c[47217];c[b+108>>2]=c[47220];c[b+112>>2]=c[47223];c[b+116>>2]=c[47221];c[b+120>>2]=c[47222];c[b+124>>2]=c[47225];c[b+128>>2]=c[47224];c[b+132>>2]=c[47226];c[b+136>>2]=c[47227];c[b+140>>2]=c[47218];c[b+144>>2]=c[47230];c[b+152>>2]=c[47185];c[b+148>>2]=c[47194];c[47258]=0;c[47262]=DA(a,2,87684,0)|0;c[47263]=DA(a,2,87693,0)|0;b=DA(a,2,101842,0)|0;c[47236]=b;if(!b)c[47236]=DA(a,2,101842,195341)|0;c[47237]=0;c[47250]=0;c[47249]=DA(a,2,101738,0)|0;c[47248]=DA(a,2,101729,0)|0;c[47274]=DA(a,2,102018,0)|0;c[47266]=0;c[47251]=DA(a,2,108525,0)|0;c[47261]=DA(a,2,85770,0)|0;c[47270]=0;c[47269]=DA(a,2,101918,0)|0;c[47268]=DA(a,2,101904,0)|0;c[47273]=DA(a,2,102009,0)|0;c[47267]=0;c[47252]=0;c[47199]=DA(a,1,141351,0)|0;c[47200]=DA(a,1,141419,0)|0;c[47201]=DA(a,1,108531,0)|0;c[47219]=0;c[47212]=DA(a,1,101729,0)|0;c[47213]=DA(a,1,101738,0)|0;c[47214]=0;c[47216]=DA(a,1,108525,0)|0;c[47217]=0;c[47220]=0;c[47223]=DA(a,1,101710,0)|0;c[47221]=DA(a,1,141379,0)|0;c[47222]=DA(a,1,101773,0)|0;c[47225]=DA(a,1,101785,0)|0;c[47224]=DA(a,1,101649,0)|0;c[47226]=DA(a,1,101790,0)|0;c[47227]=DA(a,1,85782,0)|0;c[47218]=0;c[47230]=0;c[47194]=DA(a,0,101710,0)|0;return}function _g(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0.0,i=0.0;d=c[(c[(c[a>>2]|0)+16>>2]|0)+96>>2]|0;a=c[(c[(c[b>>2]|0)+16>>2]|0)+96>>2]|0;b=(a|0)!=0;if(d)if(b?(f=+h[d+24>>3],i=+h[d+32>>3],e=+h[a+24>>3],g=+h[a+32>>3],!(f>e)):0)if(!(fg)a=-1;else a=i>0]|0)!=37?(h=c[i>>2]|0,h=wb[c[(c[h+4>>2]|0)+4>>2]&63](c[h+16>>2]|0,d,e,f,g)|0,h|0):0)break;h=JB(b,d,e,f)|0;if(!h)k=5}else k=5;while(0);if((k|0)==5)if(g){h=c[i>>2]|0;h=wb[c[(c[h+4>>2]|0)+4>>2]&63](c[h+16>>2]|0,d,0,f,g)|0;if(j&(h|0)!=0){k=f;KB(b,d,e,c[k>>2]|0,c[k+4>>2]|0)}}else h=0;return h|0}function FB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[a+64>>2]|0;return tb[c[(c[a+4>>2]|0)+8>>2]&127](c[a+16>>2]|0,b,d,e)|0}function GB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;PB(a,b,d,e)|0;a=c[a+64>>2]|0;xb[c[(c[a+4>>2]|0)+12>>2]&31](c[a+16>>2]|0,b,d,e);return}function HB(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;d=uC(a)|0;f=a+8|0;b=f;b=NB(d,c[a>>2]&3,c[b>>2]|0,c[b+4>>2]|0)|0;do if(!b){b=c[d+64>>2]|0;d=c[(c[b+4>>2]|0)+16>>2]|0;if(d|0?(e=f,e=tb[d&127](c[b+16>>2]|0,c[a>>2]&3,c[e>>2]|0,c[e+4>>2]|0)|0,e|0):0){b=e;break}if((c[a>>2]&3|0)==2)b=0;else{e=c[f>>2]|0;f=c[f+4>>2]|0;c[g>>2]=37;b=g+8|0;c[b>>2]=e;c[b+4>>2]=f;i2(195053,96757,g)|0;b=195053}}while(0);l=h;return b|0}function IB(a,b,d){a=a|0;b=b|0;d=d|0;a=c[a+64>>2]|0;rb[c[(c[a+4>>2]|0)+24>>2]&127](c[a+16>>2]|0,b,d);return}function JB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+32|0;h=i;b=c[(c[a+64>>2]|0)+56+(((b|0)==3?2:b)<<2)>>2]|0;if(((b|0)!=0?(f=aD(a,d)|0,(f|0)!=0):0)?(c[h+24>>2]=f,g=eb[c[b>>2]&63](b,h,4)|0,(g|0)!=0):0){d=g+16|0;h=c[d+4>>2]|0;b=e;c[b>>2]=c[d>>2];c[b+4>>2]=h;b=1}else b=0;l=i;return b|0}function KB(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=aC(a,32)|0;g=h+16|0;c[g>>2]=e;c[g+4>>2]=f;c[h+24>>2]=dD(a,d)|0;e=(b|0)==3?2:b;g=a+64|0;d=c[g>>2]|0;b=c[d+56+(e<<2)>>2]|0;if(!b){f=SD(a,18684,c[4599]|0)|0;c[(c[g>>2]|0)+56+(e<<2)>>2]=f;b=c[g>>2]|0}else{f=b;b=d}b=c[b+68+(e<<2)>>2]|0;if(!b){b=SD(a,18720,c[4599]|0)|0;c[(c[g>>2]|0)+68+(e<<2)>>2]=b}eb[c[f>>2]&63](f,h,1)|0;eb[c[b>>2]&63](b,h,1)|0;return}function LB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=b+16|0;b=c[a>>2]|0;a=c[a+4>>2]|0;d=d+16|0;e=c[d>>2]|0;d=c[d+4>>2]|0;return (a>>>0>d>>>0|(a|0)==(d|0)&b>>>0>e>>>0?1:(a>>>0>>0|(a|0)==(d|0)&b>>>0>>0)<<31>>31)|0}function MB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=c[b+24>>2]|0;e=c[d+24>>2]|0;return (b>>>0>e>>>0?1:(b>>>0>>0)<<31>>31)|0}function NB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=OB(a,b,d,e)|0;if(!a)a=0;else a=c[a+24>>2]|0;return a|0}function OB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;a=c[(c[a+64>>2]|0)+68+(((b|0)==3?2:b)<<2)>>2]|0;if(!a)a=0;else{b=f+16|0;c[b>>2]=d;c[b+4>>2]=e;a=eb[c[a>>2]&63](a,f,4)|0}l=g;return a|0}function PB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=(b|0)==3?2:b;b=OB(a,f,d,e)|0;if(!b)b=0;else{e=a+64|0;d=c[(c[e>>2]|0)+56+(f<<2)>>2]|0;eb[c[d>>2]&63](d,b,2)|0;e=c[(c[e>>2]|0)+68+(f<<2)>>2]|0;eb[c[e>>2]&63](e,b,2)|0;fD(a,c[b+24>>2]|0)|0;bC(a,b);b=1}return b|0}function QB(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;c[46985]=b;g=c[b+64>>2]|0;f=0;while(1){if((f|0)==3)break;h=g+56+(f<<2)|0;d=c[h>>2]|0;a:do if(d|0){d=eb[c[d>>2]&63](d,0,128)|0;while(1){if(!d)break a;e=c[h>>2]|0;e=eb[c[e>>2]&63](e,d,8)|0;if((a[c[d+24>>2]>>0]|0)!=37){d=e;continue}i=d+16|0;PB(b,f,c[i>>2]|0,c[i+4>>2]|0)|0;d=e}}while(0);f=f+1|0}return}function RB(a){a=a|0;c[46985]=a;a=a+64|0;SB((c[a>>2]|0)+56|0);SB((c[a>>2]|0)+68|0);return}function SB(a){a=a|0;var b=0,d=0,e=0;b=0;while(1){if((b|0)==3)break;d=a+(b<<2)|0;e=c[d>>2]|0;if(e|0){Oz(e)|0;c[d>>2]=0}b=b+1|0}return}function TB(a,b,c){a=a|0;b=b|0;c=c|0;if(!(o4(b,c,a)|0))a=0;else a=D3(b)|0;return a|0}function UB(a,b){a=a|0;b=b|0;return Z3(b,a)|0}function VB(a){a=a|0;return m4(a)|0}function WB(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+32|0;e=b+12|0;d=b;c[4693]=c[4690];c[4694]=c[4691];c[e>>2]=a;c[e+4>>2]=D3(a)|0;c[e+8>>2]=0;c[d>>2]=18780;c[d+4>>2]=18656;c[d+8>>2]=18768;a=hF(e,d)|0;iD(0);l=b;return a|0}function XB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if((e|0)!=0?(h=b+8|0,f=c[h>>2]|0,(f|0)<(c[b+4>>2]|0)):0){i=(c[b>>2]|0)+f|0;b=0;g=a[i>>0]|0;f=d;d=i;while(1){d=d+1|0;a[f>>0]=g;b=b+1|0;if(!(g<<24>>24!=10&(b|0)<(e|0)))break;g=a[d>>0]|0;if(!(g<<24>>24))break;else f=f+1|0}c[h>>2]=(c[h>>2]|0)+b}else b=0;return b|0}function YB(a){a=a|0;return 0}function ZB(a,b){a=a|0;b=b|0;a=k6(b)|0;u6(a|0,0,b|0)|0;return a|0}function _B(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a=n6(b,d)|0;if(d>>>0>c>>>0)u6(a+c|0,0,d-c|0)|0;return a|0}function $B(a,b){a=a|0;b=b|0;l6(b);return}function aC(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;a=c[a+64>>2]|0;a=vb[c[(c[a>>2]|0)+4>>2]&127](c[a+12>>2]|0,b)|0;if(!a)dA(1,96763,d)|0;l=d;return a|0}function bC(a,b){a=a|0;b=b|0;if(b|0){a=c[a+64>>2]|0;lb[c[(c[a>>2]|0)+12>>2]&63](c[a+12>>2]|0,b)}return}function cC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=(c[b+16>>2]|0)+8|0;b=c[a>>2]|0;a=c[a+4>>2]|0;d=(c[d+16>>2]|0)+8|0;e=c[d>>2]|0;d=c[d+4>>2]|0;return (a>>>0>>0|(a|0)==(d|0)&b>>>0>>0?-1:(a>>>0>d>>>0|(a|0)==(d|0)&b>>>0>e>>>0)&1)|0}function dC(a,b,d){a=a|0;b=b|0;d=d|0;a=c[b+16>>2]|0;if((a+28|0)!=(b|0))bC(c[a+24>>2]|0,b);return}function eC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=(c[c[b+16>>2]>>2]|0)>>>4;e=(c[c[d+16>>2]>>2]|0)>>>4;return (b>>>0>>0?-1:b>>>0>e>>>0&1)|0}function fC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=186424;c[e>>2]=b;c[e+4>>2]=d;c[46990]=186416;a=c[a+40>>2]|0;a=eb[c[a>>2]&63](a,187944,4)|0;if(!a)a=0;else a=c[a+16>>2]|0;return a|0}function gC(a){a=a|0;a=c[a+36>>2]|0;a=eb[c[a>>2]&63](a,0,128)|0;if(!a)a=0;else a=c[a+16>>2]|0;return a|0}function hC(a,b){a=a|0;b=b|0;var d=0;b=VA(a,b)|0;if((b|0)!=0?(d=c[a+36>>2]|0,d=eb[c[d>>2]&63](d,b,8)|0,(d|0)!=0):0)b=c[d+16>>2]|0;else b=0;return b|0}function iC(a){a=a|0;a=c[a+36>>2]|0;a=eb[c[a>>2]&63](a,0,256)|0;if(!a)a=0;else a=c[a+16>>2]|0;return a|0}function jC(a,b){a=a|0;b=b|0;var d=0;b=VA(a,b)|0;if((b|0)!=0?(d=c[a+36>>2]|0,d=eb[c[d>>2]&63](d,b,16)|0,(d|0)!=0):0)b=c[d+16>>2]|0;else b=0;return b|0}function kC(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=fC(a,b,c)|0;do if((d|0)!=0&(e|0)==0){e=vC(a)|0;if((e|0)!=(a|0)?(f=fC(e,b,c)|0,f|0):0){lC(a,f,1)|0;e=f;break}if(!(FB(a,1,b,c)|0))e=0;else{e=oB(a,1)|0;e=mC(a,b,c,e,D)|0;nC(a,e);oC(a,e)}}while(0);return e|0}function lC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=vC(a)|0;if((e|0)==(c[b+24>>2]|0)){e=b+8|0;e=fC(a,c[e>>2]|0,c[e+4>>2]|0)|0;if((d|0)!=0&(e|0)==0){e=OD(a)|0;if(!e)e=0;else{d=lC(e,b,d)|0;pC(a,d);return d|0}}}else e=0;return e|0}function mC(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;g=aC(b,64)|0;h=c[g>>2]|0;i=g+8|0;c[i>>2]=d;c[i+4>>2]=e;c[g>>2]=h&12|f<<4|1;c[g+24>>2]=vC(b)|0;if(a[(vC(b)|0)+24>>0]&64)RC(g,c[4610]|0,16,0)|0;return g|0}function nC(a,b){a=a|0;b=b|0;do{pC(a,b);a=OD(a)|0}while((a|0)!=0);return}function oC(b,c){b=b|0;c=c|0;if(a[(vC(b)|0)+24>>0]&64)rA(b,c);wC(b,c);return}function pC(a,b){a=a|0;b=b|0;var d=0,e=0;e=a+40|0;Uz(c[e>>2]|0)|0;if((vC(a)|0)==(a|0))d=b+28|0;else d=aC(a,36)|0;c[d+16>>2]=b;e=c[e>>2]|0;eb[c[e>>2]&63](e,d,1)|0;e=c[a+36>>2]|0;eb[c[e>>2]&63](e,d,1)|0;return}function qC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;g=j;h=vC(a)|0;e=(d|0)!=0;if(EB(a,1,b,g,0)|0){d=g;d=fC(a,c[d>>2]|0,c[d+4>>2]|0)|0;if(!d)if(!((h|0)==(a|0)|e^1)?(f=g,f=fC(h,c[f>>2]|0,c[f+4>>2]|0)|0,(f|0)!=0):0)d=lC(a,f,1)|0;else i=6}else i=6;if((i|0)==6)if(e?(EB(a,1,b,g,1)|0)!=0:0){i=g;h=c[i>>2]|0;i=c[i+4>>2]|0;d=oB(a,1)|0;d=mC(a,h,i,d,D)|0;nC(a,d);oC(a,d);IB(a,1,d)}else d=0;l=j;return d|0}function rC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;c[46999]=b;d=ZA(a,b)|0;while(1){if(!d)break;e=_A(a,d,b)|0;gB(a,d,0);d=e}e=c[a+40>>2]|0;eb[c[e>>2]&63](e,187980,2)|0;e=c[a+36>>2]|0;eb[c[e>>2]&63](e,187980,2)|0;return}function sC(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d+8|0;e=f;if(fC(b,c[e>>2]|0,c[e+4>>2]|0)|0){if((vC(b)|0)==(b|0)){e=ZA(b,d)|0;while(1){if(!e)break;g=_A(b,e,d)|0;iB(b,e)|0;e=g}if(a[b+24>>0]&64)LA(d);AC(b,d);ZC(d);g=f;GB(b,1,c[g>>2]|0,c[g+4>>2]|0)}if(!(zE(b,d,59,0,0)|0))if((vC(b)|0)==(b|0)){bC(b,d);e=0}else e=0;else e=-1}else e=-1;return e|0}function tC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;e=h;d=c[b>>2]|0;do if(!(d&3))if((OD(b)|0)==(a|0)){d=c[b>>2]|0;g=5;break}else{dA(1,96789,e)|0;f=-1;break}else g=5;while(0);a:do if((g|0)==5)switch(d&3){case 1:{f=sC(a,b)|0;break a}case 2:case 3:{f=iB(a,b)|0;break a}case 0:{f=pB(b)|0;break a}default:{}}while(0);l=h;return f|0}function uC(a){a=a|0;var b=0;switch(c[a>>2]&3){case 2:case 3:{b=c[(c[a+40>>2]|0)+24>>2]|0;break}case 1:{b=c[a+24>>2]|0;break}case 0:{b=a;break}default:{}}return b|0}function vC(a){a=a|0;var b=0;switch(c[a>>2]&3){case 2:case 3:{b=(c[a+40>>2]|0)+24|0;break}case 1:{b=a+24|0;break}case 0:{b=a+60|0;break}default:{}}return c[b>>2]|0}function wC(b,d){b=b|0;d=d|0;var e=0;e=c[b+64>>2]|0;if(!(a[e+52>>0]|0))GC(b,d,100,0);else xC(b,d,c[e+48>>2]|0);return}function xC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;a:do if(d|0){xC(a,b,c[d+8>>2]|0);switch(c[b>>2]&3){case 0:{e=c[d>>2]|0;break}case 1:{e=(c[d>>2]|0)+12|0;break}case 2:{e=(c[d>>2]|0)+24|0;break}default:break a}e=c[e>>2]|0;if(e|0)rb[e&127](a,b,c[d+4>>2]|0)}while(0);return}function yC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=c[b+64>>2]|0;if(!(a[f+52>>0]|0))GC(b,d,101,e);else zC(b,d,e,c[f+48>>2]|0);return}function zC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;a:do if(e|0){zC(a,b,d,c[e+8>>2]|0);switch(c[b>>2]&3){case 0:{f=(c[e>>2]|0)+4|0;break}case 1:{f=(c[e>>2]|0)+16|0;break}case 2:{f=(c[e>>2]|0)+28|0;break}default:break a}f=c[f>>2]|0;if(f|0)xb[f&31](a,b,c[e+4>>2]|0,d)}while(0);return}function AC(b,d){b=b|0;d=d|0;var e=0;e=c[b+64>>2]|0;if(!(a[e+52>>0]|0))GC(b,d,102,0);else BC(b,d,c[e+48>>2]|0);return}function BC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;a:do if(d|0){BC(a,b,c[d+8>>2]|0);switch(c[b>>2]&3){case 0:{e=(c[d>>2]|0)+8|0;break}case 1:{e=(c[d>>2]|0)+20|0;break}case 2:{e=(c[d>>2]|0)+32|0;break}default:break a}e=c[e>>2]|0;if(e|0)rb[e&127](a,b,c[d+4>>2]|0)}while(0);return}function CC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=aC(a,12)|0;c[e>>2]=b;c[e+4>>2]=d;d=(c[a+64>>2]|0)+48|0;c[e+8>>2]=c[d>>2];c[d>>2]=e;return}function DC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=(c[a+64>>2]|0)+48|0;d=c[e>>2]|0;a:do if(!d)d=-1;else{if((c[d>>2]|0)!=(b|0)){while(1){e=d+8|0;if(!d){d=-1;break a}f=c[e>>2]|0;if((c[f>>2]|0)==(b|0))break;else d=f}if(f)c[e>>2]=c[f+8>>2]}else c[e>>2]=c[d+8>>2];bC(a,d);d=0}while(0);return d|0}function EC(a,b){a=a|0;b=b|0;var d=0;d=vC(a)|0;a:do if((d|0)==(vC(b)|0))switch(c[b>>2]&3){case 0:{while(1){if((b|0)==(a|0)){b=1;break a}b=OD(b)|0;if(!b){b=0;break}}break}case 1:{b=b+8|0;b=(kC(a,c[b>>2]|0,c[b+4>>2]|0,0)|0)!=0;break a}default:{b=(jB(a,b,0)|0)!=0;break a}}else b=0;while(0);return b&1|0}function FC(a){a=a|0;return c[a>>2]&3|0}function GC(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;e=RC(a,96813,44,0)|0;switch(c|0){case 100:{c=HC(e,b,100)|0;if(!(IC(c,b)|0))JC(c,a,b,d)|0;break}case 101:{if((IC(HC(e,b,100)|0,b)|0)==0?(IC(HC(e,b,102)|0,b)|0)==0:0){e=HC(e,b,101)|0;c=IC(e,b)|0;if(!c)c=JC(e,a,b,d)|0;KC(b,c,d)}break}case 102:{LC(HC(e,b,100)|0,b);LC(HC(e,b,101)|0,b);c=HC(e,b,102)|0;if(!(IC(c,b)|0))JC(c,a,b,d)|0;break}default:dA(1,96825,f)|0}l=g;return}function HC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;e=g;a:do switch(c[b>>2]&3){case 0:switch(d|0){case 100:{d=a+8|0;break a}case 101:{d=a+20|0;break a}case 102:{d=a+32|0;break a}default:{f=14;break a}}case 1:switch(d|0){case 100:{d=a+12|0;break a}case 101:{d=a+24|0;break a}case 102:{d=a+36|0;break a}default:{f=14;break a}}case 2:switch(d|0){case 100:{d=a+16|0;break a}case 101:{d=a+28|0;break a}case 102:{d=a+40|0;break a}default:{f=14;break a}}default:f=14}while(0);if((f|0)==14){dA(1,96859,e)|0;d=0}a=c[d>>2]|0;if(!a){a=uC(b)|0;a=SD(a,18872,c[4599]|0)|0;c[d>>2]=a}l=g;return a|0}function IC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+32|0;e=d;f=MC(b)|0;b=e+8|0;c[b>>2]=f;c[b+4>>2]=D;b=eb[c[a>>2]&63](a,e,4)|0;l=d;return b|0}function JC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=aC(uC(d)|0,32)|0;c[f+20>>2]=d;g=MC(d)|0;d=f+8|0;c[d>>2]=g;c[d+4>>2]=D;c[f+16>>2]=b;if(e|0){g=aC(b,8)|0;c[f+24>>2]=g;c[g>>2]=e}eb[c[a>>2]&63](a,f,1)|0;return f|0}function KC(a,b,d){a=a|0;b=b|0;d=d|0;a=b+24|0;while(1){a=c[a>>2]|0;if(!a)break;if((c[a>>2]|0)==(d|0))break;else a=a+4|0}return}function LC(a,b){a=a|0;b=b|0;b=IC(a,b)|0;if(b|0)eb[c[a>>2]&63](a,b,2)|0;return}function MC(a){a=a|0;a=a+8|0;D=c[a+4>>2]|0;return c[a>>2]|0}function NC(a,b,d){a=a|0;b=b|0;d=d|0;OC(b);bC(c[b+16>>2]|0,b);return}function OC(a){a=a|0;var b=0,d=0;b=a+16|0;a=c[a+24>>2]|0;while(1){if(!a)break;d=c[a+4>>2]|0;bC(c[b>>2]|0,a);a=d}return}function PC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;i=k;h=c[b+16>>2]|0;f=h;while(1){if(!f){f=0;break}g=c[f>>2]|0;if((g|0)==(d|0)){j=7;break}if((a[d>>0]|0)==(a[g>>0]|0)?(f2(d,g)|0)==0:0){j=7;break}f=c[f+4>>2]|0;if((f|0)==(h|0)){f=0;break}}do if((j|0)==7){if(!(c[b>>2]&4)){if((f|0)==(h|0)&(e|0)==0){f=h;break}QC(b,f,e);break}if(e)if((h|0)==(f|0))f=h;else dA(1,96884,i)|0}while(0);l=k;return f|0}function QC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;c[a+16>>2]=b;e=c[a>>2]|0;d=d<<2&4;c[a>>2]=e&-5|d;if(e&2|0){e=(e&3|0)==3?-1:1;c[a+(e*48|0)+16>>2]=b;e=a+(e*48|0)|0;c[e>>2]=c[e>>2]&-5|d}return}function RC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=uC(a)|0;f=PC(a,b,0)|0;a:do if((d|0)!=0&(f|0)==0){d=aC(h,d)|0;c[d>>2]=dD(h,b)|0;switch(c[a>>2]&3){case 0:{SC(a,d);g=d;break a}case 1:{SC(a,d);g=d;break a}case 2:case 3:{SC(a,d);g=d;break a}default:{}}}else g=f;while(0);if(e|0)PC(a,b,1)|0;return g|0}function SC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[a+16>>2]|0;do if(d){e=d+4|0;f=c[e>>2]|0;if((f|0)==(d|0)){c[e>>2]=b;e=d;d=b;break}else{c[b+4>>2]=f;e=b;break}}else{e=b;d=b}while(0);c[d+4>>2]=e;if(!(c[a>>2]&4))QC(a,b,0);return}function TC(a,b){a=a|0;b=b|0;var d=0,e=0;e=uC(a)|0;d=PC(a,b,0)|0;if(!d)b=-1;else{UC(a,d);if(!(c[a>>2]&3)){VC(e,a,d);b=d}else{zE(vC(e)|0,a,60,d,0)|0;b=d}fD(e,c[d>>2]|0)|0;bC(e,b);b=0}return b|0}function UC(a,b){a=a|0;b=b|0;var d=0;a=c[a+16>>2]|0;do{d=a+4|0;a=c[d>>2]|0}while((a|0)!=(b|0));c[d>>2]=c[b+4>>2];return}function VC(a,b,d){a=a|0;b=b|0;d=d|0;if((c[b+16>>2]|0)==(d|0)){a=c[d+4>>2]|0;QC(b,(a|0)==(d|0)?0:a,0)}return}function WC(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=(d|0)>-1;g=f?d:0-d|0;a:do switch(b|0){case 0:{RC(a,c,g,e)|0;if(!f){b=MD(a)|0;while(1){if(!b)break a;WC(b,0,c,d,e);b=ND(b)|0}}break}case 3:case 2:case 1:{d=(b|0)==1;b=gC(a)|0;while(1){if(!b)break a;b:do if(d)RC(b,c,g,e)|0;else{f=UA(a,b)|0;while(1){if(!f)break b;RC(f,c,g,e)|0;f=WA(a,f)|0}}while(0);b=hC(a,b)|0}}default:{}}while(0);return}function XC(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;a:do switch(b|0){case 0:{zE(a,a,61,c,1)|0;break}case 3:case 2:case 1:{e=(b|0)==1;d=gC(a)|0;while(1){if(!d)break a;b:do if(e)TC(d,c)|0;else{b=UA(a,d)|0;while(1){if(!b)break b;TC(b,c)|0;b=WA(a,b)|0}}while(0);d=hC(a,d)|0}}default:{}}while(0);return}function YC(a,b,c){a=a|0;b=b|0;c=c|0;TC(b,c)|0;return}function ZC(a){a=a|0;var b=0,d=0,e=0;d=uC(a)|0;b=a+16|0;a=c[b>>2]|0;if(a|0)do{e=a;a=c[a+4>>2]|0;fD(d,c[e>>2]|0)|0;bC(d,e)}while((a|0)!=(c[b>>2]|0));c[b>>2]=0;return}function _C(a){a=a|0;return UD(a,$C(a)|0)|0}function $C(a){a=a|0;var b=0,d=0;if(!a)d=188016;else d=(c[a+64>>2]|0)+20|0;b=c[d>>2]|0;if(!b){b=SD(a,18908,c[4599]|0)|0;c[d>>2]=b;a=186480;c[a>>2]=-2147483648;c[a+4>>2]=0;a=186488;c[a>>2]=2147483647;c[a+4>>2]=-1}return b|0}function aD(a,b){a=a|0;b=b|0;return bD($C(a)|0,b)|0}function bD(a,b){a=a|0;b=b|0;a=cD(a,b)|0;if(!a)a=0;else a=c[a+16>>2]|0;return a|0}function cD(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+32|0;e=d;c[e+16>>2]=b;b=eb[c[a>>2]&63](a,e,4)|0;l=d;return b|0}function dD(a,b){a=a|0;b=b|0;var d=0,e=0;if(!b)d=0;else{e=$C(a)|0;d=cD(e,b)|0;if(!d){d=(D3(b)|0)+24|0;if(!a)d=k6(d)|0;else d=aC(a,d)|0;a=d+8|0;c[a>>2]=1;c[a+4>>2]=0;a=d+20|0;O3(a,b)|0;c[d+16>>2]=a;eb[c[e>>2]&63](e,d,1)|0}else{e=d+8|0;b=e;b=w6(c[b>>2]|0,c[b+4>>2]|0,1,0)|0;c[e>>2]=b;c[e+4>>2]=D}d=c[d+16>>2]|0}return d|0}function eD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(!b)d=0;else{e=$C(a)|0;d=cD(e,b)|0;if(!d){d=(D3(b)|0)+24|0;if(!a)d=k6(d)|0;else d=aC(a,d)|0;g=186480;f=c[g+4>>2]|0;a=d+8|0;c[a>>2]=c[g>>2]|1;c[a+4>>2]=f;a=d+20|0;O3(a,b)|0;c[d+16>>2]=a;eb[c[e>>2]&63](e,d,1)|0}else{g=d+8|0;f=g;f=w6(c[f>>2]|0,c[f+4>>2]|0,1,0)|0;c[g>>2]=f;c[g+4>>2]=D}d=c[d+16>>2]|0}return d|0}function fD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if((b|0)!=0?(d=$C(a)|0,e=cD(d,b)|0,(e|0)!=0):0)if((c[e+16>>2]|0)==(b|0)?(b=e+8|0,g=b,g=w6(c[g>>2]|0,c[g+4>>2]|0,-1,-1)|0,f=D,b,c[b>>2]=g,c[b+4>>2]=f,b=186488,!(((g|0)!=0|(f|0)!=0)&((c[b>>2]|0)!=0|(c[b+4>>2]|0)!=0))):0){TD(a,d,e)|0;a=0}else a=0;else a=-1;return a|0}function gD(a){a=a|0;var b=0;if(!a)a=0;else{a=a+-12|0;b=186480;a=c[b>>2]&c[a>>2]}return a|0}function hD(a){a=a|0;var b=0,d=0,e=0;if(a|0){d=186480;a=a+-12|0;e=a;b=c[e+4>>2]|c[d+4>>2];c[a>>2]=c[e>>2]|c[d>>2];c[a+4>>2]=b}return}function iD(a){a=a|0;c[47009]=a;c[4736]=1;return}function jD(a,b){a=a|0;b=b|0;c[47010]=a;c[47011]=b;c[47012]=0;return}function kD(){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(!(c[47013]|0)){c[47013]=1;if(!(c[47014]|0))c[47014]=1;if(!(c[47005]|0))c[47005]=c[15808];if(!(c[47006]|0))c[47006]=c[15840];k=c[47015]|0;if(!((k|0)!=0?(c[k+(c[47016]<<2)>>2]|0)!=0:0)){lD();k=mD(c[47005]|0,16384)|0;c[(c[47015]|0)+(c[47016]<<2)>>2]=k}nD()}a:while(1){h=c[47017]|0;a[h>>0]=a[195085]|0;e=(c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]|0)+(c[47014]|0)|0;f=h;b:while(1){i=f;while(1){f=c[18948+(d[i>>0]<<2)>>2]|0;if(b[64128+(e<<1)>>1]|0){c[47018]=e;c[47019]=i}c:while(1){g=f&255;do{f=(b[64314+(e<<1)>>1]|0)+g|0;if((b[64524+(f<<1)>>1]|0)==(e|0))break c;k=b[65060+(e<<1)>>1]|0;e=k<<16>>16}while(k<<16>>16<=92);f=c[19972+(g<<2)>>2]|0}e=b[65270+(f<<1)>>1]|0;f=i+1|0;if((b[64314+(e<<1)>>1]|0)==219)break;else i=f}d:while(1){k=h;e:while(1){e=b[64128+(e<<1)>>1]|0;if(!(e<<16>>16)){e=b[64128+(c[47018]<<1)>>1]|0;f=c[47019]|0}else e=e<<16>>16;c[47007]=h;j=f;c[47008]=j-k;a[195085]=a[f>>0]|0;a[f>>0]=0;c[47017]=f;f:while(1){switch(e|0){case 1:{m=27;break a}case 12:{m=53;break a}case 13:{m=55;break a}case 14:{m=57;break a}case 15:{m=61;break a}case 16:{m=65;break a}case 17:{m=67;break a}case 18:{m=69;break a}case 19:{m=72;break a}case 20:{m=75;break a}case 21:{m=78;break a}case 23:{m=86;break a}case 33:{m=118;break a}case 39:case 38:case 37:case 36:{l=0;break a}case 2:{m=29;break b}case 3:{m=32;break b}case 4:{m=35;break b}case 5:{m=37;break b}case 6:{m=39;break b}case 7:{m=42;break b}case 8:{m=44;break b}case 9:{m=47;break b}case 10:{m=49;break b}case 11:{m=51;break b}case 22:{m=83;break b}case 24:{m=89;break b}case 25:{m=92;break b}case 26:{m=95;break b}case 27:{m=98;break b}case 28:{m=101;break b}case 29:{m=104;break b}case 30:{m=109;break b}case 31:{m=112;break b}case 32:{m=115;break b}case 34:{m=121;break b}case 0:break f;case 35:break;default:{m=134;break a}}i=c[47007]|0;a[f>>0]=a[195085]|0;e=(c[47015]|0)+(c[47016]<<2)|0;g=c[e>>2]|0;if(!(c[g+44>>2]|0)){n=c[g+16>>2]|0;c[47021]=n;c[g>>2]=c[47005];g=c[e>>2]|0;c[g+44>>2]=1;e=n}else e=c[47021]|0;if((c[47017]|0)>>>0<=((c[g+4>>2]|0)+e|0)>>>0){m=128;break e}switch(wD()|0){case 0:{m=132;break d}case 2:{m=133;break e}case 1:break;default:continue a}c[47017]=c[47007];e=(((c[47014]|0)+-1|0)/2|0)+36|0}a[f>>0]=a[195085]|0;f=c[47019]|0;e=c[47018]|0}if((m|0)==128){m=0;g=(c[47007]|0)+(j-i+-1)|0;c[47017]=g;e=uD()|0;f=vD(e)|0;h=c[47007]|0;if(!f){f=g;continue}else{m=129;break}}else if((m|0)==133){m=0;f=(c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+4>>2]|0)+(c[47021]|0)|0;c[47017]=f;e=uD()|0;h=c[47007]|0;continue}}if((m|0)==129){m=0;n=g+1|0;c[47017]=n;e=f;f=n;continue}else if((m|0)==132){m=0;f=(c[47007]|0)+(j-i+-1)|0;c[47017]=f;e=uD()|0;h=c[47007]|0;continue}}switch(m|0){case 29:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[4736]=(c[4736]|0)+1;continue a}case 32:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[47014]=3;continue a}case 35:{m=0;e=c[47008]|0;if(!e)continue a;c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;continue a}case 37:{m=0;e=c[47008]|0;if(!e)continue a;c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;continue a}case 39:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[47014]=1;continue a}case 42:{m=0;e=c[47008]|0;if(!e)continue a;c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;continue a}case 44:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;oD();continue a}case 47:{m=0;e=c[47008]|0;if(!e)continue a;c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;continue a}case 49:{m=0;e=c[47008]|0;if(!e)continue a;c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;continue a}case 51:{m=0;e=c[47008]|0;if(!e)continue a;c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;continue a}case 83:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[47014]=5;qD();continue a}case 89:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;sD(99045);continue a}case 92:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;sD(96917);continue a}case 95:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[4736]=(c[4736]|0)+1;continue a}case 98:{m=0;e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;sD(f);continue a}case 101:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[47014]=7;c[47020]=1;qD();continue a}case 104:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;n=(c[47020]|0)+-1|0;c[47020]=n;if(!n){m=108;break a}sD(c[47007]|0);continue a}case 109:{m=0;e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;c[47020]=(c[47020]|0)+1;sD(f);continue a}case 112:{m=0;e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;sD(f);c[4736]=(c[4736]|0)+1;continue a}case 115:{m=0;e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;sD(f);continue a}case 121:{m=0;e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;_3(f,e,1,c[47006]|0)|0;continue a}}}switch(m|0){case 27:{e=c[47008]|0;if(!e)l=-1;else{c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=-1}break}case 53:{e=c[47008]|0;if(!e)l=259;else{c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=259}break}case 55:{e=c[47008]|0;if(!e)l=260;else{c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=260}break}case 57:{e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;if(!(c[47012]|0)){c[47012]=258;l=258}else l=258;break}case 61:{e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;if(!(c[47012]|0)){c[47012]=261;l=261}else l=261;break}case 65:{e=c[47008]|0;if(!e)l=263;else{c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=263}break}case 67:{e=c[47008]|0;if(!e)l=262;else{c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=262}break}case 69:{e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=(c[47012]|0)==261?264:45;break}case 72:{e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=(c[47012]|0)==258?264:45;break}case 75:{e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;c[47036]=dD(c[46985]|0,f)|0;l=267;break}case 78:{e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;if(pD()|0){m=(c[47008]|0)+-1|0;a[f>>0]=a[195085]|0;n=h+m|0;c[47017]=n;c[47007]=h;c[47008]=m;a[195085]=a[n>>0]|0;a[n>>0]=0;c[47017]=n}c[47036]=dD(c[46985]|0,c[47007]|0)|0;l=267;break}case 86:{e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[47014]=1;rD();l=268;break}case 108:{c[47014]=1;tD();l=268;break}case 118:{e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;l=a[f>>0]|0;break}case 134:{xD(96920);break}}return l|0}function lD(){var a=0,b=0,d=0;b=c[47015]|0;do if(!b){a=ED(4)|0;c[47015]=a;if(!a)xD(97278);else{c[a>>2]=0;c[47027]=1;c[47016]=0;break}}else{a=c[47027]|0;if((c[47016]|0)>>>0>=(a+-1|0)>>>0){d=a+8|0;a=yD(b,d<<2)|0;c[47015]=a;if(!a)xD(97278);else{b=a+(c[47027]<<2)|0;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[b+20>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;c[47027]=d;break}}}while(0);return}function mD(a,b){a=a|0;b=b|0;var d=0;d=ED(48)|0;if(!d)xD(97233);c[d+12>>2]=b;b=ED(b+2|0)|0;c[d+4>>2]=b;if(!b)xD(97233);else{c[d+20>>2]=1;AD(d,a);return d|0}return 0}function nD(){var b=0,d=0;d=(c[47015]|0)+(c[47016]<<2)|0;b=c[d>>2]|0;c[47021]=c[b+16>>2];b=c[b+8>>2]|0;c[47017]=b;c[47007]=b;c[47005]=c[c[d>>2]>>2];a[195085]=a[b>>0]|0;return}function oD(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0;g=l;l=l+32|0;f=g;d=g+16|0;e=g+12|0;h=c[47007]|0;b=h+1|0;i=(h2(b,97217,4)|0)==0;b=i?h+5|0:b;c[f>>2]=e;c[f+4>>2]=g+20;c[f+8>>2]=d;f=q4(b,97222,f)|0;if((f|0)>0?(c[4736]=(c[e>>2]|0)+-1,(f|0)!=1):0){d=b+(c[d>>2]|0)|0;b=d;a:while(1){e=a[b>>0]|0;switch(e<<24>>24){case 0:case 34:break a;default:{}}b=b+1|0}if((b|0)!=(d|0)&e<<24>>24==34){a[b>>0]=0;DD(d,b-d|0)}}l=g;return}function pD(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=l;l=l+2080|0;i=j+8|0;f=j;b=j+1056|0;d=j+32|0;h=j+16|0;k=a[(c[47007]|0)+((c[47008]|0)+-1)>>0]|0;e=k<<24>>24==46;if(e|((k&255)+-48|0)>>>0<10)if(e?(CD()|0)!=0:0)g=4;else b=0;else g=4;if((g|0)==4){k=c[47009]|0;hA(h,1024,b);kA(h,97128)|0;kA(h,c[47007]|0)|0;c[f>>2]=c[4736];i2(d,97172,f)|0;kA(h,d)|0;kA(h,(k|0)==0?97122:k)|0;kA(h,97189)|0;d=h+4|0;b=c[d>>2]|0;if(b>>>0>=(c[h+8>>2]|0)>>>0){iA(h,1)|0;b=c[d>>2]|0}a[b>>0]=0;b=c[h>>2]|0;c[d>>2]=b;c[i>>2]=b;dA(0,97214,i)|0;lA(h);b=1}l=j;return b|0}function qD(){var b=0;b=c[47022]|0;if(!b){b=k6(1024)|0;c[47022]=b;c[47024]=b+1024}c[47023]=b;a[b>>0]=0;return}function rD(){c[47036]=dD(c[46985]|0,c[47022]|0)|0;a[c[47022]>>0]=0;return}function sD(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=c[47023]|0;d=c[47022]|0;if(e>>>0>d>>>0){e=e+-1|0;f=3}a:while(1){if((f|0)==3)c[47023]=e;f=c[47024]|0;g=f;do{h=b;b=b+1|0;h=a[h>>0]|0;i=e;e=e+1|0;a[i>>0]=h;if(!(h<<24>>24))break a}while(e>>>0>>0);c[47023]=e;f=d;i=g-f<<1;d=n6(d,i)|0;c[47022]=d;c[47024]=d+i;e=d+(e-f)|0;f=3}c[47023]=e;return}function tD(){c[47036]=eD(c[46985]|0,c[47022]|0)|0;a[c[47022]>>0]=0;return}function uD(){var d=0,e=0,f=0,g=0,h=0;h=c[47017]|0;g=c[47007]|0;e=(c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]|0)+(c[47014]|0)|0;while(1){if(g>>>0>=h>>>0)break;d=a[g>>0]|0;if(!(d<<24>>24))d=1;else d=c[18948+((d&255)<<2)>>2]|0;if(b[64128+(e<<1)>>1]|0){c[47018]=e;c[47019]=g}a:while(1){f=d&255;do{d=(b[64314+(e<<1)>>1]|0)+f|0;if((b[64524+(d<<1)>>1]|0)==(e|0))break a;d=b[65060+(e<<1)>>1]|0;e=d<<16>>16}while(d<<16>>16<=92);d=c[19972+(f<<2)>>2]|0}g=g+1|0;e=b[65270+(d<<1)>>1]|0}return e|0}function vD(a){a=a|0;var d=0;if(b[64128+(a<<1)>>1]|0){d=c[47017]|0;c[47018]=a;c[47019]=d}while(1){d=(b[64314+(a<<1)>>1]|0)+1|0;if((b[64524+(d<<1)>>1]|0)==(a|0))break;a=b[65060+(a<<1)>>1]|0}d=b[65270+(d<<1)>>1]|0;return (d<<16>>16==92?0:d<<16>>16)|0}function wD(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;i=(c[47015]|0)+(c[47016]<<2)|0;g=c[i>>2]|0;h=c[g+4>>2]|0;e=c[47007]|0;l=c[47017]|0;j=l;if(l>>>0>(h+((c[47021]|0)+1)|0)>>>0)xD(96975);f=j-e|0;if(!(c[g+40>>2]|0))b=(f|0)==1?1:2;else{l=f+-1|0;g=h;f=0;while(1){if((f|0)>=(l|0))break;a[g>>0]=a[e>>0]|0;g=g+1|0;e=e+1|0;f=f+1|0}e=c[i>>2]|0;do if((c[e+44>>2]|0)==2){c[47021]=0;c[e+16>>2]=0;m=17}else{while(1){h=e+12|0;g=c[h>>2]|0;f=g-l+-1|0;if(f|0){m=16;break}f=e+4|0;i=c[f>>2]|0;if(!(c[e+20>>2]|0)){m=12;break}e=g<<1;e=(e|0)==0?(g>>>3)+g|0:e;c[h>>2]=e;e=yD(i,e+2|0)|0;c[f>>2]=e;if(!e)break;i=e+(j-i)|0;c[47017]=i;e=c[(c[47015]|0)+(c[47016]<<2)>>2]|0;j=i}if((m|0)==12)c[f>>2]=0;else if((m|0)==16){d=eb[c[c[(c[47010]|0)+8>>2]>>2]&63](c[47011]|0,(c[e+4>>2]|0)+l|0,f>>>0<8192?f:8192)|0;c[47021]=d;e=c[(c[47015]|0)+(c[47016]<<2)>>2]|0;c[e+16>>2]=d;if(!d){m=17;break}else{b=0;k=e;break}}xD(97031)}while(0);do if((m|0)==17)if(!l){zD(c[47005]|0);b=1;d=c[47021]|0;k=c[(c[47015]|0)+(c[47016]<<2)>>2]|0;break}else{c[e+44>>2]=2;b=2;d=0;k=e;break}while(0);e=d+l|0;do if(e>>>0>(c[k+12>>2]|0)>>>0){m=yD(c[k+4>>2]|0,e+(d>>>1)|0)|0;d=(c[47015]|0)+(c[47016]<<2)|0;c[(c[d>>2]|0)+4>>2]=m;d=c[(c[d>>2]|0)+4>>2]|0;if(!d)xD(97075);else{n=c[47021]|0;o=d;break}}else{n=d;o=c[k+4>>2]|0}while(0);n=n+l|0;c[47021]=n;a[o+n>>0]=0;o=(c[47015]|0)+(c[47016]<<2)|0;a[(c[(c[o>>2]|0)+4>>2]|0)+((c[47021]|0)+1)>>0]=0;c[47007]=c[(c[o>>2]|0)+4>>2]}return b|0}function xD(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=c[15715]|0;c[b>>2]=a;z4(d,96971,b)|0;$a(2)}function yD(a,b){a=a|0;b=b|0;return n6(a,b)|0}function zD(a){a=a|0;var b=0,d=0,e=0;d=c[47015]|0;if((d|0)!=0?(b=c[d+(c[47016]<<2)>>2]|0,(b|0)!=0):0)e=4;else{lD();b=mD(c[47005]|0,16384)|0;d=c[47015]|0;c[d+(c[47016]<<2)>>2]=b;if(!d)b=0;else e=4}AD(b,a);nD();return}function AD(a,b){a=a|0;b=b|0;var d=0;d=c[(L1()|0)>>2]|0;BD(a);c[a>>2]=b;c[a+40>>2]=1;b=c[47015]|0;if(!b)b=0;else b=c[b+(c[47016]<<2)>>2]|0;if((b|0)!=(a|0)){c[a+32>>2]=1;c[a+36>>2]=0}c[a+24>>2]=0;c[(L1()|0)>>2]=d;return}function BD(b){b=b|0;var d=0;if(b|0){c[b+16>>2]=0;d=b+4|0;a[c[d>>2]>>0]=0;a[(c[d>>2]|0)+1>>0]=0;c[b+8>>2]=c[d>>2];c[b+28>>2]=1;c[b+44>>2]=0;d=c[47015]|0;if(!d)d=0;else d=c[d+(c[47016]<<2)>>2]|0;if((d|0)==(b|0))nD()}return}function CD(){var b=0,d=0;d=c[47007]|0;b=(c[47008]|0)+-2|0;while(1){if((b|0)<=-1){b=0;break}if((a[d+b>>0]|0)==46){b=1;break}else b=b+-1|0}return b|0}function DD(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[47025]|0;if((d|0)<(b|0)){e=b+1|0;if(!d)d=k6(e)|0;else d=n6(c[47026]|0,e)|0;c[47026]=d;c[47025]=b}else d=c[47026]|0;O3(d,a)|0;c[47009]=c[47026];return}function ED(a){a=a|0;return k6(a)|0}function FD(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+2112|0;k=m+32|0;i=m+24|0;h=m+16|0;g=m+8|0;f=m;d=m+56|0;j=m+40|0;hA(j,1024,m+1080|0);e=c[47009]|0;if(e|0){kA(j,e)|0;kA(j,97328)|0}kA(j,b)|0;c[f>>2]=c[4736];i2(d,97331,f)|0;kA(j,d)|0;a:do if(!(a[c[47007]>>0]|0))switch(((c[47014]|0)+-1|0)/2|0|0){case 2:{c[g>>2]=16384;i2(d,97351,g)|0;kA(j,d)|0;b=c[47022]|0;if(!(a[b>>0]|0))break a;i=D3(b)|0;kA(j,97413)|0;b=c[47022]|0;if((i|0)>80)a[b+80>>0]=0;kA(j,b)|0;break a}case 3:{c[h>>2]=16384;i2(d,97432,h)|0;kA(j,d)|0;b=c[47022]|0;if(!(a[b>>0]|0))break a;i=D3(b)|0;kA(j,97500)|0;b=c[47022]|0;if((i|0)>80)a[b+80>>0]=0;kA(j,b)|0;break a}case 1:{c[i>>2]=16384;i2(d,97519,i)|0;kA(j,d)|0;break a}default:break a}else{kA(j,97343)|0;kA(j,c[47007]|0)|0;d=j+4|0;b=c[d>>2]|0;if(b>>>0>=(c[j+8>>2]|0)>>>0){iA(j,1)|0;b=c[d>>2]|0}c[d>>2]=b+1;a[b>>0]=39}while(0);e=j+4|0;b=c[e>>2]|0;d=j+8|0;if(b>>>0>=(c[d>>2]|0)>>>0){iA(j,1)|0;b=c[e>>2]|0}c[e>>2]=b+1;a[b>>0]=10;b=c[e>>2]|0;if(b>>>0>=(c[d>>2]|0)>>>0){iA(j,1)|0;b=c[e>>2]|0}a[b>>0]=0;i=c[j>>2]|0;c[e>>2]=i;c[k>>2]=i;dA(1,97214,k)|0;lA(j);l=m;return}function GD(){HD(c[47007]|0);return}function HD(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=c[47017]|0;a[j>>0]=a[195085]|0;i=(c[47015]|0)+(c[47016]<<2)|0;e=c[i>>2]|0;d=c[e+4>>2]|0;if(j>>>0<(d+2|0)>>>0){f=d+((c[47021]|0)+2)|0;g=d+((c[e+12>>2]|0)+2)|0;k=d;h=e;while(1){if(f>>>0<=k>>>0)break;e=f+-1|0;k=g+-1|0;a[k>>0]=a[e>>0]|0;h=c[i>>2]|0;f=e;g=k;k=c[h+4>>2]|0}e=g-f|0;d=j+e|0;j=c[h+12>>2]|0;c[47021]=j;c[h+16>>2]=j;if(d>>>0<(k+2|0)>>>0)xD(97578);else{l=b+e|0;m=d}}else{l=b;m=j}b=m+-1|0;a[b>>0]=64;c[47007]=l;a[195085]=a[b>>0]|0;c[47017]=b;return}function ID(){var a=0;a=c[47015]|0;if(!a)a=0;else a=c[a+(c[47016]<<2)>>2]|0;BD(a);return}function JD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+80|0;f=e;g=a+52|0;VD(a,c[g>>2]|0,18592);a=f+8|0;c[a>>2]=b;c[a+4>>2]=d;d=c[g>>2]|0;d=eb[c[d>>2]&63](d,f,4)|0;l=e;return d|0}function KD(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=JD(b,d,e)|0;if(!f){f=aC(b,72)|0;c[f+64>>2]=c[b+64>>2];g=f+24|0;h=c[b+24>>2]|0;c[g>>2]=h;a[g>>0]=h&255&-9;c[f+56>>2]=b;c[f+60>>2]=c[b+60>>2];b=f+8|0;c[b>>2]=d;c[b+4>>2]=e;nB(f)|0}return f|0}function LD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;if(!(((b|0)!=0?(EB(a,0,b,f,0)|0)!=0:0)?(e=f,e=JD(a,c[e>>2]|0,c[e+4>>2]|0)|0,(e|0)!=0):0))if((d|0)!=0?(EB(a,0,b,f,1)|0)!=0:0){e=f;e=KD(a,c[e>>2]|0,c[e+4>>2]|0)|0;IB(a,0,e)}else e=0;l=g;return e|0}function MD(a){a=a|0;a=c[a+52>>2]|0;return eb[c[a>>2]&63](a,0,128)|0}function ND(a){a=a|0;var b=0;b=OD(a)|0;if(!b)a=0;else{b=c[b+52>>2]|0;a=eb[c[b>>2]&63](b,a,8)|0}return a|0}function OD(a){a=a|0;return c[a+56>>2]|0}function PD(a,b){a=a|0;b=b|0;a=c[a+52>>2]|0;return eb[c[a>>2]&63](a,b,2)|0}function QD(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[47028]|0;e=(b|0)!=0;do if(!a)if(e){l6(b);a=0;break}else{a=k6(d)|0;break}else if(e){bC(a,b);a=0;break}else{a=aC(a,d)|0;break}while(0);return a|0}function RD(a,b,d){a=a|0;b=b|0;d=d|0;a=c[47028]|0;if(!a)l6(b);else bC(a,b);return}function SD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=b+28|0;f=c[e>>2]|0;c[e>>2]=7;c[47028]=a;d=Sz(b,d)|0;c[e>>2]=f;c[47028]=0;return d|0}function TD(a,b,d){a=a|0;b=b|0;d=d|0;c[47028]=a;return eb[c[b>>2]&63](b,d,2)|0}function UD(a,b){a=a|0;b=b|0;var d=0,e=0;d=(_z(b,0,0)|0)+28|0;e=c[d>>2]|0;c[d>>2]=7;c[47028]=a;if(!(Oz(b)|0)){c[d>>2]=e;c[47028]=0;a=0}else a=1;return a|0}function VD(a,b,c){a=a|0;b=b|0;c=c|0;if(c|0?(_z(b,0,0)|0)!=(c|0):0)_z(b,c,0)|0;return}function WD(a,b){a=a|0;b=b|0;if(!(gD(a)|0))b=YD(a,b)|0;else XD(a,b)|0;return b|0}function XD(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;a[c>>0]=60;f=c+1|0;while(1){d=a[b>>0]|0;e=f+1|0;if(!(d<<24>>24))break;a[f>>0]=d;f=e;b=b+1|0}a[f>>0]=62;a[e>>0]=0;return c|0}function YD(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;a:do if((b|0)!=0?(a[b>>0]|0)!=0:0){a[d>>0]=34;k=a[b>>0]|0;t=0;g=((k+-45&255)<2|((k&255)+-48|0)>>>0<10)&1;h=0;i=0;j=0;e=d+1|0;f=b+1|0;b:while(1){o=g;l=e;p=k;while(1){g=l+1|0;if(!(p<<24>>24))break b;e=p&255;c:do if(p<<24>>24==34){a[l>>0]=92;h=1}else{if(!o){g=p<<24>>24>-1&(p<<24>>24!=95&(O2(e)|0)==0);o=0;h=g?1:h;g=l;break}switch(p<<24>>24){case 45:{g=(j|0)==0;o=g?o:0;h=g?h:1;g=l;break c}case 46:{g=(i|0)==0;o=g?o:0;h=g?h:1;i=i+1|0;g=l;break c}default:{g=(e+-48|0)>>>0<10;o=g?o:0;h=g?h:1;g=l;break c}}}while(0);e=g+1|0;a[g>>0]=p;s=f+1|0;r=a[f>>0]|0;j=j+1|0;f=c[5042]|0;if(!f){l=e;f=s;p=r;continue}k=r&255;l=r<<24>>24!=0;m=g+2|0;n=r<<24>>24>-1;q=g+3|0;if((t&l?!(p<<24>>24==92|p<<24>>24>-1&((p+-45&255)>1&(O2(p<<24>>24)|0)==0)^1):0)?(r+-45&255)<2|(O2(k)|0)!=0|n^1:0)break;if((j|0)<(f|0)|l^1){l=e;f=s;p=r;continue}if(p<<24>>24==92|p<<24>>24>-1&((O2(p<<24>>24)|0)==0&(p+-45&255)>1)^1){t=1;g=o;k=r;f=s;continue b}if(!((r+-45&255)<2|(O2(k)|0)!=0|n^1)){t=1;g=o;k=r;f=s;continue b}a[e>>0]=92;a[m>>0]=10;h=1;j=0;l=q;f=s;p=r}a[e>>0]=92;a[m>>0]=10;t=0;g=o;h=1;j=0;k=r;e=q;f=s}a[l>>0]=34;a[g>>0]=0;if(!h){if((j|0)==1?((a[b>>0]|0)+-45&255)<2:0){b=d;break}else e=20172;while(1){f=c[e>>2]|0;if(!f)break a;if(!(C3(f,b)|0)){b=d;break}else e=e+4|0}}else b=d}else b=97610;while(0);return b|0}function ZD(a){a=a|0;return WD(a,_D(a)|0)|0}function _D(a){a=a|0;var b=0;b=((D3(a)|0)<<1)+2|0;b=b>>>0>1024?b:1024;a=c[47030]|0;if(b>>>0>(c[47029]|0)>>>0){if(!a)a=k6(b)|0;else a=n6(a,b)|0;c[47030]=a;c[47029]=b}return a|0}function $D(a,b){a=a|0;b=b|0;a=MD(a)|0;while(1){if(!a){a=0;break}if((aE(a)|0)==0?lC(a,b,0)|0:0){a=1;break}a=ND(a)|0}return a|0}function aE(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=HB(b)|0;if((h|0)!=0?(a[h>>0]|0)!=37:0)d=0;else e=3;a:do if((e|0)==3){d=tA(b)|0;b:do if(d|0?(f=tA(OD(b)|0)|0,f|0):0){h=Uz(c[(tA(vC(b)|0)|0)+8>>2]|0)|0;g=d+12|0;e=f+12|0;d=0;while(1){if((d|0)>=(h|0))break b;f=c[(c[g>>2]|0)+(d<<2)>>2]|0;if((f|0?(i=c[(c[e>>2]|0)+(d<<2)>>2]|0,i|0):0)?f2(f,i)|0:0){d=0;break a}d=d+1|0}}while(0);d=oA(b,0)|0;if(d)if((Uz(c[d+8>>2]|0)|0)>0)d=0;else return (Uz(c[d+12>>2]|0)|0)<1|0;else d=1}while(0);return d|0}function bE(b,d){b=b|0;d=d|0;var e=0,f=0;c[47031]=0;e=NA(b,97620)|0;if((e|0?((a[e>>0]|0)+-48|0)>>>0<10:0)?(f=$1(e,0,10)|0,(f|0)==0|(f|0)>59):0)c[5042]=f;cE(b,1);if(((dE(b,d,1)|0)!=-1?(eE(b,d)|0)!=-1:0)?(fE(b,d)|0)!=-1:0){c[5042]=128;b=pb[c[(c[(c[b+64>>2]|0)+8>>2]|0)+8>>2]&63](d)|0}else b=-1;return b|0}function cE(a,b){a=a|0;b=b|0;var d=0;c[a>>2]=c[a>>2]&-9;d=MD(a)|0;while(1){if(!d)break;cE(d,0);d=ND(d)|0}a:do if(b|0){b=gC(a)|0;while(1){if(!b)break a;c[b>>2]=c[b>>2]&-9;d=UA(a,b)|0;while(1){if(!d)break;c[d>>2]=c[d>>2]&-9;d=WA(a,d)|0}b=hC(a,b)|0}}while(0);return}function dE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;if((e|0)==0?(OD(b)|0)!=0:0){i=0;g=195341;k=109815}else{k=(a[b+24>>0]&1)==0?195341:97664;g=(wB(b)|0)==0;c[47032]=DA(b,2,111756,0)|0;c[47033]=DA(b,2,111765,0)|0;i=1;g=g?195341:97667}f=HB(b)|0;if((f|0)!=0?(a[f>>0]|0)!=37:0){h=1;j=102905}else{h=0;j=195341;f=195341}do if((gE(b,d)|0)!=-1?(hE(b,d,g)|0)!=-1:0){g=(h|0)==0;if(h|i|0){if((hE(b,d,k)|0)==-1){f=-1;break}if((hE(b,d,102898)|0)==-1){f=-1;break}}if(!g?(sE(b,d,f)|0)==-1:0){f=-1;break}if(((hE(b,d,j)|0)!=-1?(hE(b,d,97675)|0)!=-1:0)?(c[47031]=(c[47031]|0)+1,(xE(b,d,e)|0)!=-1):0){c[b>>2]=c[b>>2]|8;f=0}else f=-1}else f=-1;while(0);return f|0}function eE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:do if((iE(a,b)|0)==-1)d=-1;else{k=oA(vC(a)|0,0)|0;i=(k|0)!=0;j=k+8|0;k=k+12|0;h=gC(a)|0;while(1){if(!h){d=0;break a}if(jE(a,h,(c[h>>2]|0)>>>4,0)|0){if(i)d=c[j>>2]|0;else d=0;if((kE(h,b,d)|0)==-1){d=-1;break a}}g=UA(a,h)|0;d=h;while(1){if(!g)break;f=g+-48|0;e=c[((c[g>>2]&3|0)==2?g:f)+40>>2]|0;if((d|0)!=(e|0)?(jE(a,e,(c[h>>2]|0)>>>4,0)|0)!=0:0){if(i)d=c[j>>2]|0;else d=0;if((kE(c[((c[g>>2]&3|0)==2?g:f)+40>>2]|0,b,d)|0)==-1){d=-1;break a}d=c[((c[g>>2]&3|0)==2?g:f)+40>>2]|0}if(lE(a,g)|0){if(i)e=c[k>>2]|0;else e=0;if((mE(g,b,e)|0)==-1){d=-1;break a}}g=WA(a,g)|0}h=hC(a,h)|0}}while(0);return d|0}function fE(a,b){a=a|0;b=b|0;c[47031]=(c[47031]|0)+-1;if((gE(a,b)|0)==-1)a=-1;else a=((hE(a,b,111309)|0)==-1)<<31>>31;return a|0}function gE(a,b){a=a|0;b=b|0;var d=0;d=c[47031]|0;while(1){if((d|0)<=0){d=0;break}if((hE(a,b,153746)|0)==-1){d=-1;break}else d=d+-1|0}return d|0}function hE(a,b,d){a=a|0;b=b|0;d=d|0;return vb[c[(c[(c[a+64>>2]|0)+8>>2]|0)+4>>2]&127](b,d)|0}function iE(a,b){a=a|0;b=b|0;a=MD(a)|0;while(1){if(!a){a=0;break}if(!(aE(a)|0)){if((dE(a,b,0)|0)==-1){a=-1;break}if((eE(a,b)|0)==-1){a=-1;break}if((fE(a,b)|0)==-1){a=-1;break}}else iE(a,b)|0;a=ND(a)|0}return a|0}function jE(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(($D(a,b)|0)==0?(uE(a,b,c,d)|0)!=0:0)if((vE(a,b)|0)==0?(wE(b)|0)==0:0)e=5;else a=1;else e=5;if((e|0)==5)a=0;return a|0}function kE(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=uC(a)|0;do if((gE(d,b)|0)!=-1?(nE(a,b)|0)!=-1:0){if((pE(a)|0)==0?(qE(a,b,c)|0)==-1:0){a=-1;break}a=hE(d,b,97631)|0}else a=-1;while(0);return a|0}function lE(a,b){a=a|0;b=b|0;a=MD(a)|0;while(1){if(!a){a=1;break}if((aE(a)|0)==0?jB(a,b,0)|0:0){a=0;break}a=ND(a)|0}return a|0}function mE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=c[a>>2]&3;g=c[((e|0)==3?a:a+48|0)+40>>2]|0;e=c[((e|0)==2?a:a+-48|0)+40>>2]|0;f=uC(g)|0;do if((((((gE(f,b)|0)!=-1?(nE(g,b)|0)!=-1:0)?(oE(a,b,c[47032]|0)|0)!=-1:0)?(g=(uB(uC(g)|0)|0)!=0,(hE(f,b,g?100380:100385)|0)!=-1):0)?(nE(e,b)|0)!=-1:0)?(oE(a,b,c[47033]|0)|0)!=-1:0){if(!(pE(a)|0)){if((qE(a,b,d)|0)==-1){a=-1;break}}else if((rE(a,b,1)|0)==-1){a=-1;break}a=hE(f,b,97631)|0}else a=-1;while(0);return a|0}function nE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;i=l;l=l+32|0;g=i;d=i+8|0;e=HB(a)|0;f=uC(a)|0;if(!e){j=a+8|0;a=c[j+4>>2]|0;e=g;c[e>>2]=c[j>>2];c[e+4>>2]=a;i2(d,97651,g)|0;if((hE(f,b,d)|0)==-1)a=-1;else h=4}else if((sE(f,b,e)|0)==-1)a=-1;else h=4;if((h|0)==4)a=0;l=i;return a|0}function oE(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if((d|0)!=0?(e=uC(b)|0,f=OA(b,d)|0,(a[f>>0]|0)!=0):0)if((hE(e,c,108285)|0)==-1)b=-1;else{do if(gD(f)|0){if((sE(e,c,f)|0)==-1){b=-1;break a}}else{b=F3(f,58)|0;if(!b)if((tE(e,c,f,0)|0)==-1){b=-1;break a}else break;a[b>>0]=0;if((tE(e,c,f,0)|0)==-1){b=-1;break a}if((hE(e,c,108285)|0)==-1){b=-1;break a}if((tE(e,c,b+1|0,0)|0)==-1){b=-1;break a}a[b>>0]=58}while(0);b=0}else b=0;while(0);return b|0}function pE(a){a=a|0;return (c[a>>2]|0)>>>3&1|0}function qE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:do if(!(c[a>>2]&2)){e=0;k=4}else{switch(rE(a,b,0)|0){case -1:{e=-1;break a}case 0:{e=0;k=4;break a}default:{}}e=1;k=4}while(0);b:do if((k|0)==4){f=tA(a)|0;j=uC(a)|0;c:do if(f){i=f+12|0;h=eb[c[d>>2]&63](d,0,128)|0;while(1){if(!h)break c;f=h+16|0;do if(c[a>>2]&2){g=c[47032]|0;if(g|0?(c[f>>2]|0)==(c[g+16>>2]|0):0)break;g=c[47033]|0;if(!((g|0)!=0?(c[f>>2]|0)==(c[g+16>>2]|0):0))k=12}else k=12;while(0);if((k|0)==12){k=0;if((c[(c[i>>2]|0)+(c[f>>2]<<2)>>2]|0)!=(c[h+12>>2]|0)){g=e+1|0;if(e){if((hE(j,b,97646)|0)==-1){e=-1;break b}if((gE(j,b)|0)==-1){e=-1;break b}}else{if((gE(j,b)|0)==-1){e=-1;break b}if((hE(j,b,97643)|0)==-1){e=-1;break b}c[47031]=(c[47031]|0)+1}if((sE(j,b,c[h+8>>2]|0)|0)==-1){e=-1;break b}if((hE(j,b,97649)|0)==-1){e=-1;break b}if((sE(j,b,c[(c[i>>2]|0)+(c[f>>2]<<2)>>2]|0)|0)==-1){e=-1;break b}else e=g}}h=eb[c[d>>2]&63](d,h,8)|0}}while(0);if((e|0)>0){if((hE(j,b,97641)|0)==-1){e=-1;break}c[47031]=(c[47031]|0)+-1}c[a>>2]=c[a>>2]|8;e=0}while(0);return e|0}function rE(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;e=HB(b)|0;b=uC(b)|0;if((e|0)!=0?(a[e>>0]|0)!=0:0)if((hE(b,c,97634)|0)!=-1?(sE(b,c,e)|0)!=-1:0)if((d|0)!=0?(hE(b,c,97641)|0)==-1:0)b=-1;else{b=1;f=7}else b=-1;else{b=0;f=7}return b|0}function sE(a,b,c){a=a|0;b=b|0;c=c|0;return tE(a,b,c,1)|0}function tE(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(!d)c=YD(c,_D(c)|0)|0;else c=ZD(c)|0;return hE(a,b,c)|0}function uE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a:do if(0>>0|(0==(e|0)?(c[b>>2]|0)>>>4>>>0>>0:0))b=0;else{b=XA(a,b)|0;while(1){if(!b){b=1;break a}if(0>>0|(0==(e|0)?(c[c[b+40>>2]>>2]|0)>>>4>>>0>>0:0)){b=0;break a}b=YA(a,b)|0}}while(0);return b|0}function vE(a,b){a=a|0;b=b|0;if(!(XA(a,b)|0))a=(UA(a,b)|0)==0;else a=0;return a&1|0}function wE(a){a=a|0;var b=0,d=0,e=0;a=tA(a)|0;a:do if(!a)a=0;else{d=a+8|0;e=c[d>>2]|0;b=a+12|0;a=eb[c[e>>2]&63](e,0,128)|0;while(1){if(!a){a=0;break a}if((c[(c[b>>2]|0)+(c[a+16>>2]<<2)>>2]|0)!=(c[a+12>>2]|0)){a=1;break a}e=c[d>>2]|0;a=eb[c[e>>2]&63](e,a,8)|0}}while(0);return a|0}function xE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=oA(a,0)|0;if(e)if(((yE(a,b,111795,c[e+16>>2]|0,d)|0)!=-1?(yE(a,b,111782,c[e+8>>2]|0,d)|0)!=-1:0)?(yE(a,b,111751,c[e+12>>2]|0,d)|0)!=-1:0)f=5;else a=-1;else f=5;if((f|0)==5)a=0;return a|0}function yE(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=(g|0)!=0;if(m)l=0;else l=Xz(f,0)|0;k=(l|0)==0;j=eb[c[f>>2]&63](f,0,128)|0;g=0;while(1){if(!j){n=23;break}i=j+12|0;n=c[i>>2]|0;if((n|0)!=0?(a[n>>0]|0)!=0:0)n=12;else n=7;do if((n|0)==7){n=0;if(!(a[j+22>>0]|0)){if(!k){h=eb[c[l>>2]&63](l,j,4)|0;o=c[h+12>>2]|0;if(o|0?a[o>>0]|0:0){n=12;break}if(!(a[h+22>>0]|0))n=12}}else n=12}while(0);if((n|0)==12){n=0;h=g+1|0;if(g){if((hE(b,d,97646)|0)==-1){g=-1;break}if((gE(b,d)|0)==-1){g=-1;break}}else{if((gE(b,d)|0)==-1){g=-1;break}if((hE(b,d,e)|0)==-1){g=-1;break}if((hE(b,d,97643)|0)==-1){g=-1;break}c[47031]=(c[47031]|0)+1}if((sE(b,d,c[j+8>>2]|0)|0)==-1){g=-1;break}if((hE(b,d,97649)|0)==-1){g=-1;break}if((sE(b,d,c[i>>2]|0)|0)==-1){g=-1;break}else g=h}j=eb[c[f>>2]&63](f,j,8)|0}do if((n|0)==23){if((g|0)>0){c[47031]=(c[47031]|0)+-1;if((g|0)!=1){if((hE(b,d,153748)|0)==-1){g=-1;break}if((gE(b,d)|0)==-1){g=-1;break}}g=(hE(b,d,97678)|0)==-1;if(m|g){g=g<<31>>31;break}}else if(m){g=0;break}Xz(f,l)|0;g=0}while(0);return g|0}function zE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;switch(c[b>>2]&3){case 0:{g=82;break}case 1:{g=83;break}case 3:case 2:{g=84;break}default:{}}b=vb[g&127](a,b)|0;if(!b)b=-1;else{DE(a,b,d,e,g,f);b=0}return b|0}function AE(a,b){a=a|0;b=b|0;if((uC(b)|0)!=(a|0))b=jB(a,b,0)|0;return b|0}function BE(a,b){a=a|0;b=b|0;if((uC(b)|0)!=(a|0))b=lC(a,b,0)|0;return b|0}function CE(a,b){a=a|0;b=b|0;return a|0}function DE(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;h=(f|0)!=0;if(h)rb[c&127](a,b,d);g=MD(a)|0;while(1){if(!g)break;i=vb[e&127](g,b)|0;if(i|0)DE(g,i,c,d,e,f);g=ND(g)|0}if(!h)rb[c&127](a,b,d);return}function EE(){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+1200|0;s=u+800|0;h=u;c[47034]=0;c[47035]=-2;f=s;i=200;n=h;o=0;p=0;g=s;a:while(1){b[g>>1]=o;if((f+(i<<1)+-2|0)>>>0>g>>>0){q=i;r=f;k=h}else{m=(g-f>>1)+1|0;if(i>>>0>9999){t=76;break}j=i<<1;j=j>>>0<1e4?j:1e4;e=k6(j*6|3)|0;if(e){B6(e|0,f|0,m<<1|0)|0;i=e+(j>>>1<<2)|0;B6(i|0,n|0,m<<2|0)|0;if((f|0)==(s|0)){k=0;f=e}else{l6(f);k=0;f=e}}else{k=4;i=n}e=(k|0)==0;switch((e?((j|0)>(m|0)?0:9):k)&15){case 9:{e=1;t=77;break a}case 4:{t=76;break a}case 0:{q=j;r=f;k=e?i+(m<<2)+-4|0:h;n=i;g=e?f+(m<<1)+-2|0:g;break}default:{e=0;break a}}}if((o|0)==6){e=0;f=r;t=77;break}e=a[97682+o>>0]|0;i=e<<24>>24;j=(p|0)!=0;do if(e<<24>>24!=-18){f=c[47035]|0;if((f|0)==-2){f=kD()|0;c[47035]=f}if((f|0)>=1)if(f>>>0<269)h=d[97762+f>>0]|0;else h=2;else{c[47035]=0;h=0}f=h+i|0;if(f>>>0<=59?(d[98031+f>>0]|0)==(h|0):0){o=a[98091+f>>0]|0;e=o<<24>>24;if(o<<24>>24<1){f=0-e|0;t=23;break}else{c[47035]=-2;h=k+4|0;c[h>>2]=c[47036];j=j?p+-1|0:0;break}}else t=22}else t=22;while(0);if((t|0)==22){t=0;o=a[98151+o>>0]|0;f=o&255;if(!(o<<24>>24)){do if(j)if((p|0)==3){f=c[47035]|0;if((f|0)<1)if(!f){e=1;f=r;t=77;break a}else{f=k;break}else{c[47035]=-2;f=k;break}}else f=k;else{c[47034]=(c[47034]|0)+1;FD(142682);f=k}while(0);while(1){if(e<<24>>24==18)break;if((g|0)==(r|0)){e=1;f=r;t=77;break a}e=g+-2|0;f=f+-4|0;g=e;e=a[97682+(b[e>>1]|0)>>0]|0}h=f+4|0;c[h>>2]=c[47036];e=1;j=3}else t=23}do if((t|0)==23){t=0;j=d[98231+f>>0]|0;e=c[k+(1-j<<2)>>2]|0;h=k+-4|0;i=k+-8|0;b:do switch(f|0){case 2:{FE();GE();break}case 3:{if(c[47037]|0){FE();GE();pB(c[47037]|0)|0;c[46985]=0;c[47037]=0}break}case 6:{HE(c[k>>2]|0,c[h>>2]|0,c[i>>2]|0);break}case 7:{e=c[k>>2]|0;break}case 8:{e=0;break}case 9:{e=1;break}case 10:{e=0;break}case 11:{e=0;break}case 12:{e=1;break}case 21:if(!(c[h>>2]|0)){JE();break b}else{IE();break b}case 24:{KE();break}case 25:{KE();break}case 26:{e=1;break}case 27:{e=0;break}case 30:{LE(c[k>>2]|0,0,0);break}case 31:{LE(c[i>>2]|0,c[k>>2]|0,0);break}case 32:{LE(c[k+-16>>2]|0,c[i>>2]|0,c[k>>2]|0);break}case 33:{ME(c[i>>2]|0,c[h>>2]|0);break}case 34:{ME(258,0);break}case 35:{e=258;break}case 36:{e=259;break}case 37:{e=260;break}case 38:{e=c[h>>2]|0;break}case 39:{e=0;break}case 48:{NE(c[i>>2]|0,c[k>>2]|0);break}case 49:{NE(c[k>>2]|0,0);break}case 51:{OE(c[k>>2]|0);break}case 52:{PE();break}case 53:{e=c[k>>2]|0;break}case 54:{e=0;break}case 55:{e=0;break}case 59:{e=c[k>>2]|0;break}case 60:{e=c[k>>2]|0;break}case 61:{e=c[k>>2]|0;break}case 62:{e=QE(c[i>>2]|0,c[k>>2]|0)|0;break}default:{}}while(0);h=0-j|0;o=k+(h<<2)|0;g=g+(h<<1)|0;h=o+4|0;c[o+4>>2]=e;e=(d[98294+f>>0]|0)+-24|0;o=b[g>>1]|0;f=o+(a[98357+e>>0]|0)|0;if(f>>>0<60?(d[98031+f>>0]|0)==(o|0):0){e=a[98091+f>>0]|0;j=p;break}e=a[98392+e>>0]|0;j=p}while(0);f=r;i=q;o=e;p=j;g=g+2|0}if((t|0)==76){FD(140861);e=2;t=77}if((t|0)==77)if((f|0)!=(s|0))l6(f);l=u;return e|0}function FE(){var a=0,b=0;a=c[47038]|0;while(1){if(!a)break;YE(a+8|0);YE((c[47038]|0)+24|0);YE((c[47038]|0)+16|0);b=RE(c[47038]|0)|0;c[47038]=b;a=b}return}function GE(){GD();QB(c[47037]|0);return}function HE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;g=h;f=c[47037]|0;if(!f){a[188156]=d&1|(e&255)<<1&2|a[188156]&-12|8;f=c[47040]|0;c[g>>2]=c[47039];f=lB(b,g,f)|0;c[47037]=f}c[46985]=f;c[47038]=SE(c[47038]|0,f)|0;fD(0,b)|0;l=h;return}function IE(){var b=0,d=0,e=0,f=0,g=0,h=0;XE(2);e=c[47038]|0;f=a[98427]|0;h=0;b=e+24|0;while(1){d=c[b>>2]|0;if(!d)break;if(((c[d>>2]|0)==267?(g=c[d+4>>2]|0,(a[g>>0]|0)==f<<24>>24):0)?(f2(g,98427)|0)==0:0)b=c[d+8>>2]|0;else b=h;h=b;b=d+12|0}b=e+16|0;a:while(1){e=c[b>>2]|0;b=e+12|0;if(!(c[b>>2]|0))break;d=e+4|0;if((c[e>>2]|0)==262){e=c[d>>2]|0;d=gC(e)|0;while(1){if(!d)continue a;g=lC(c[c[47038]>>2]|0,d,0)|0;dF(g,0,c[b>>2]|0,h);d=hC(e,d)|0}}else while(1){d=c[d>>2]|0;if(!d)continue a;dF(c[d+4>>2]|0,c[d+8>>2]|0,c[b>>2]|0,h);d=d+12|0}}YE((c[47038]|0)+8|0);YE((c[47038]|0)+16|0);YE((c[47038]|0)+24|0);c[(c[47038]|0)+4>>2]=0;return}function JE(){var a=0;XE(1);a=(c[47038]|0)+8|0;while(1){a=c[a>>2]|0;if(!a)break;cF(c[a+4>>2]|0);a=a+12|0}YE((c[47038]|0)+8|0);YE((c[47038]|0)+24|0);YE((c[47038]|0)+16|0);c[(c[47038]|0)+4>>2]=0;return}function KE(){var a=0,b=0;a=c[47038]|0;b=c[a+8>>2]|0;if(!b){b=c[a+4>>2]|0;if(!b)b=0;else{b=bF(b)|0;a=c[47038]|0}c[a+4>>2]=0}else{b=aF(b)|0;a=c[47038]|0;c[a+12>>2]=0;c[a+8>>2]=0}if(b|0)UE(a+16|0,b);return}function LE(a,b,d){a=a|0;b=b|0;d=d|0;if(d)b=_E(b,d)|0;d=$E(qC(c[c[47038]>>2]|0,a,1)|0,b)|0;UE((c[47038]|0)+8|0,d);fD(c[47037]|0,a)|0;return}function ME(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;if(d|0)WE();d=(c[47038]|0)+24|0;while(1){d=c[d>>2]|0;if(!d)break;if(!(c[d+8>>2]|0))WE();d=d+12|0}g=(b|0)==260?2:(b|0)==259&1;XE(g);b=c[47038]|0;d=b+24|0;while(1){f=c[d>>2]|0;if(!f)break;do if((c[f>>2]|0)!=267){d=c[f+4>>2]|0;e=c[b>>2]|0;if(!((a[d+21>>0]|0)!=0&(e|0)==(c[47037]|0))){d=DA(e,g,c[d+8>>2]|0,c[f+8>>2]|0)|0;b=c[47038]|0;if((c[b>>2]|0)!=(c[47037]|0))break}a[d+22>>0]=1}while(0);d=f+12|0}YE(b+24|0);return}function NE(a,b){a=a|0;b=b|0;b=TE(a,b)|0;UE((c[47038]|0)+24|0,b);return}function OE(a){a=a|0;var b=0;b=c[47038]|0;c[47038]=SE(b,LD(c[b>>2]|0,a,1)|0)|0;fD(c[47037]|0,a)|0;return}function PE(){var a=0,b=0;a=c[47038]|0;b=c[a>>2]|0;a=RE(a)|0;c[47038]=a;c[a+4>>2]=b;return}function QE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+1024|0;f=g;d=D3(a)|0;d=d+1+(D3(b)|0)|0;if(d>>>0<1025)d=f;else d=k6(d)|0;O3(d,a)|0;g6(d,b)|0;e=dD(c[47037]|0,d)|0;fD(c[47037]|0,a)|0;fD(c[47037]|0,b)|0;if((d|0)!=(f|0))l6(d);l=g;return e|0}function RE(a){a=a|0;var b=0;b=c[(c[47038]|0)+32>>2]|0;bC(c[47037]|0,a);return b|0}function SE(a,b){a=a|0;b=b|0;var d=0;d=aC(c[47037]|0,36)|0;c[d+32>>2]=a;c[d>>2]=b;return d|0}function TE(a,b){a=a|0;b=b|0;return VE(267,a,b)|0}function UE(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+4|0;e=c[d>>2]|0;if(e|0)c[e+12>>2]=b;c[d>>2]=b;if(!(c[a>>2]|0))c[a>>2]=b;return}function VE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=aC(c[47037]|0,16)|0;c[e>>2]=a;c[e+4>>2]=b;c[e+8>>2]=d;return e|0}function WE(){var a=0;a=l;l=l+16|0;dA(0,98431,a)|0;l=a;return}function XE(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;g=(b|0)==2;d=(c[47038]|0)+24|0;while(1){d=c[d>>2]|0;if(!d)break;e=d+4|0;f=c[e>>2]|0;if(!((g?(a[f>>0]|0)==(a[98427]|0):0)?!(f2(f,98427)|0):0)){h=DA(c[c[47038]>>2]|0,b,f,0)|0;c[e>>2]=h;if(!h)c[e>>2]=DA(c[c[47038]>>2]|0,b,f,195341)|0;c[d>>2]=266;fD(c[47037]|0,f)|0}d=d+12|0}return}function YE(a){a=a|0;ZE(c[a>>2]|0);c[a+4>>2]=0;c[a>>2]=0;return}function ZE(a){a=a|0;var b=0;while(1){if(!a)break;b=c[a+12>>2]|0;switch(c[a>>2]|0){case 265:{ZE(c[a+4>>2]|0);break}case 266:case 267:{fD(c[47037]|0,c[a+8>>2]|0)|0;break}default:{}}bC(c[47037]|0,a);a=b}return}function _E(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+1040|0;f=h;g=h+8|0;d=D3(a)|0;d=d+2+(D3(b)|0)|0;if(d>>>0<1025)e=g;else e=k6(d)|0;c[f>>2]=a;c[f+4>>2]=b;i2(e,98464,f)|0;d=dD(c[47037]|0,e)|0;fD(c[47037]|0,a)|0;fD(c[47037]|0,b)|0;if((e|0)!=(g|0))l6(e);l=h;return d|0}function $E(a,b){a=a|0;b=b|0;return VE(259,a,b)|0}function aF(a){a=a|0;return VE(265,a,0)|0}function bF(a){a=a|0;return VE(262,a,0)|0}function cF(a){a=a|0;var b=0,d=0;b=(c[47038]|0)+24|0;while(1){b=c[b>>2]|0;if(!b)break;if((c[b>>2]|0)==266?(d=c[b+4>>2]|0,d|0):0)HA(a,d,c[b+8>>2]|0)|0;b=b+12|0}return}function dF(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=d+4|0;a:do if((c[d>>2]|0)==262){d=c[f>>2]|0;f=gC(d)|0;while(1){if(!f)break a;eF(a,b,lC(c[c[47038]>>2]|0,f,0)|0,0,e);f=hC(d,f)|0}}else while(1){f=c[f>>2]|0;if(!f)break a;d=lC(c[c[47038]>>2]|0,c[f+4>>2]|0,0)|0;eF(a,b,d,c[f+8>>2]|0,e);f=f+12|0}while(0);return}function eF(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;d=fB(c[c[47038]>>2]|0,a,d,f,1)|0;if(d|0){g=c[d>>2]&3;f=c[((g|0)==2?d:d+-48|0)+40>>2]|0;a=(f|0)==(a|0)?(c[((g|0)==3?d:d+48|0)+40>>2]|0)!=(f|0):0;fF(d,111756,a?e:b);fF(d,111765,a?b:e);cF(d)}return}function fF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if(d|0){e=DA(c[c[47038]>>2]|0,2,b,0)|0;if(!e)e=DA(c[c[47038]>>2]|0,2,b,195341)|0;HA(a,e,d)|0}return}function gF(a,b,d){a=a|0;b=b|0;d=d|0;c[47005]=b;c[47037]=a;c[46985]=0;a=d|0?d:18644;c[47040]=a;jD(a,b);EE()|0;a=c[46985]|0;if(!a){ID();a=c[46985]|0}return a|0}function hF(a,b){a=a|0;b=b|0;return gF(0,a,b)|0}function iF(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m+8|0;j=m;d=c[b+76>>2]|0;f=c[b>>2]|0;i=b+12|0;if((d|0)!=0?(e=c[d>>2]|0,(e|0)!=0):0){db[e&127](b);g=12}else g=4;do if((g|0)==4)if((c[b+40>>2]|0)==0?(h=b+36|0,(c[h>>2]|0)==0):0){if(a[f+13>>0]|0)jF(b);d=b+32|0;e=c[d>>2]|0;if(!e){c[h>>2]=c[15840];g=12;break}f=f4(e,106813)|0;c[h>>2]=f;if(!f){k=c[(c[i>>2]|0)+16>>2]|0;i=c[d>>2]|0;d=v2(c[(L1()|0)>>2]|0)|0;c[j>>2]=i;c[j+4>>2]=d;lb[k&63](98470,j);d=1}else g=12}else g=12;while(0);if((g|0)==12)if(!(c[b+152>>2]&1024))d=0;else{lb[c[(c[i>>2]|0)+16>>2]&63](98508,k);d=1}l=m;return d|0}function jF(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+112|0;e=h;g=h+4|0;d=c[b+24>>2]|0;if(!d)a[g>>0]=0;else{c[e>>2]=d+1;i2(g,98526,e)|0}e=c[b+20>>2]|0;e=e|0?e:98530;d=D3(e)|0;i=D3(g)|0;f=b+52|0;i=d+1+i+(D3(c[f>>2]|0)|0)|0;d=i+11|0;if((c[47041]|0)>>>0<(i+1|0)>>>0){c[47041]=d;d=n6(c[47042]|0,d)|0;c[47042]=d}else d=c[47042]|0;O3(d,e)|0;g6(c[47042]|0,g)|0;d=c[47042]|0;d=d+(D3(d)|0)|0;a[d>>0]=46;a[d+1>>0]=0;d=Y3(c[f>>2]|0)|0;f=c[47042]|0;while(1){e=I4(d,58)|0;if(!e)break;g6(f,e+1|0)|0;i=c[47042]|0;g=i+(D3(i)|0)|0;a[g>>0]=46;a[g+1>>0]=0;a[e>>0]=0;f=i}g6(f,d)|0;l6(d);c[b+32>>2]=c[47042];l=h;return}function kF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i+8|0;g=i;if((b|0)!=0&(d|0)!=0){f=a+12|0;if(c[a+152>>2]&1024|0){lb[c[(c[f>>2]|0)+16>>2]&63](98508,g);$a(1)}if((lF(a,b,d)|0)==(d|0))e=d;else{g=c[(c[f>>2]|0)+16>>2]|0;c[h>>2]=d;lb[g&63](98540,h);$a(1)}}else e=0;l=i;return e|0}function lF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o;f=c[(c[b>>2]|0)+104>>2]|0;do if(!f){j=b+40|0;h=c[j>>2]|0;if(!h){e=_3(d,1,e,c[b+36>>2]|0)|0;break}f=b+44|0;i=b+48|0;g=c[i>>2]|0;do if(((c[f>>2]|0)+-1-g|0)>>>0>>0){g=e+4096+g&-4096;c[f>>2]=g;f=n6(h,g)|0;c[j>>2]=f;if(!f){lb[c[(c[b+12>>2]|0)+16>>2]&63](98565,n);$a(1)}else{k=f;m=c[i>>2]|0;break}}else{k=h;m=g}while(0);B6(k+m|0,d|0,e|0)|0;n=(c[i>>2]|0)+e|0;c[i>>2]=n;a[(c[j>>2]|0)+n>>0]=0}else e=eb[f&63](b,d,e)|0;while(0);l=o;return e|0}function mF(a,b){a=a|0;b=b|0;var c=0;c=D3(b)|0;b=(kF(a,b,c)|0)==(c|0);return (b?1:-1)|0}function nF(b,c){b=b|0;c=c|0;var d=0,e=0;d=l;l=l+16|0;e=d;a[e>>0]=c;b=(kF(b,e,1)|0)==1;l=d;return (b?c:-1)|0}function oF(b){b=b|0;var d=0;d=c[b+36>>2]|0;if(((d|0)!=0?(a[b+144>>0]|0)==0:0)?(c[(c[b>>2]|0)+104>>2]|0)==0:0)b=m4(d)|0;else b=0;return b|0}function pF(a){a=a|0;var b=0,d=0;b=c[a+76>>2]|0;if(b|0?(d=c[b+4>>2]|0,d|0):0)db[d&127](a);oF(a)|0;return}function qF(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=c[a+76>>2]|0;if(c[a+152>>2]&1024|0){lb[c[(c[a+12>>2]|0)+16>>2]&63](98592,e);$a(1)}if((d|0)!=0?(b=c[d+8>>2]|0,(b|0)!=0):0)db[b&127](a);else{oF(a)|0;rF(a)}l=e;return}function rF(b){b=b|0;var d=0,e=0,f=0;d=b+32|0;if((c[d>>2]|0?(e=b+36|0,f=c[e>>2]|0,(f|0)!=(c[15840]|0)):0)?(a[b+144>>0]|0)==0:0){if(f|0){l4(f)|0;c[e>>2]=0}c[d>>2]=0}return}function sF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+1056|0;f=i;h=i+24|0;g=i+8|0;c[g>>2]=d;e=k2(h,1024,b,g)|0;if((e|0)>=0){if((e|0)>1023){e=IK(e+1|0)|0;c[g>>2]=d;f=e;e=j2(e,b,g)|0}else f=h;kF(a,f,e)|0;if((f|0)!=(h|0))l6(f)}else{c[f>>2]=v2(c[(L1()|0)>>2]|0)|0;dA(1,98609,f)|0}l=i;return}function tF(a,b){a=a|0;b=+b;var d=0,e=0,f=0;d=l;l=l+16|0;e=d;f=uF(e,b)|0;kF(a,f,c[e>>2]|0)|0;l=d;return}function uF(b,d){b=b|0;d=+d;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(!(d<-1.0e15))if(!(d>1.0e15)){d=d*1.0e4;f=~~(d+(d<0.0?-.5:.5));if(!f){f=138697;e=1}else{l=(f|0)<0;k=4;i=0;e=195106;f=l?0-f|0:f;while(1){h=e+-1|0;if(!((f|0)!=0|(k|0)>0))break;g=(f|0)%10|0;j=(f|0)/10|0;if((g|0)==0&i<<24>>24==0)f=0;else{a[h>>0]=g|48;f=1;e=h}if((k|0)==1)if(!(f<<24>>24))f=1;else{e=e+-1|0;a[e>>0]=46;f=1}k=k+-1|0;i=f;f=j}if(l){a[h>>0]=45;e=h}f=e;e=195106-e|0}}else{f=98624;e=18}else{f=98623;e=19}c[b>>2]=e;return f|0}function vF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d;f=uF(e,+h[b>>3])|0;kF(a,f,c[e>>2]|0)|0;kF(a,102905,1)|0;b=uF(e,+h[b+8>>3])|0;kF(a,b,c[e>>2]|0)|0;l=d;return}function wF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;f=g;e=0;while(1){h=b+(e<<4)|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];vF(a,f);e=e+1|0;if((e|0)>=(d|0))break;kF(a,102905,1)|0}l=g;return}function xF(a,b){a=a|0;b=b|0;var d=0;d=HK(392)|0;if(d|0){c[d>>2]=20200;c[d+16>>2]=23;c[d+32>>2]=a;c[d+36>>2]=b}return d|0}function yF(a){a=a|0;var b=0,d=0,e=0,f=0;b=HK(392)|0;d=b;e=a;f=d+40|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));f=b+60|0;e=a+60|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];c[f+16>>2]=c[e+16>>2];f=b+80|0;e=a+80|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];c[f+16>>2]=c[e+16>>2];return b|0}function zF(a){a=a|0;GF(a);l6(a);return}function AF(a,b){a=a|0;b=b|0;var d=0,e=0;e=a+160|0;d=c[e>>2]|0;if(d){e=c[47043]|0;if(e){d=c[e+4>>2]|0;if(!d){d=HK(632)|0;c[(c[47043]|0)+4>>2]=d}}}else{d=HK(632)|0;c[e>>2]=d;c[a+164>>2]=d}c[47043]=d;c[d+32>>2]=b;c[d>>2]=a;return}function BF(a,b){a=a|0;b=b|0;var d=0,e=0;e=a+160|0;d=c[e>>2]|0;if(d){e=c[47044]|0;if(e){d=c[e+4>>2]|0;if(!d){d=HK(632)|0;c[(c[47044]|0)+4>>2]=d}}}else{d=HK(632)|0;c[e>>2]=d;c[a+164>>2]=d}c[47044]=d;c[d+52>>2]=b;c[d>>2]=a;return (JF(a,3,b)|0)!=0|0}function CF(a){a=a|0;var b=0;b=c[a+160>>2]|0;c[a+164>>2]=b;return b|0}function DF(a){a=a|0;var b=0,d=0,e=0;a=a+164|0;b=c[a>>2]|0;d=c[b+4>>2]|0;if(d|0?(e=d+52|0,(c[e>>2]|0)==0):0)c[e>>2]=c[b+52>>2];c[a>>2]=d;return d|0}function EF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+8|0;f=b+10|0;if((c[e>>2]|0)>(b|0))a=c[a>>2]|0;else{c[e>>2]=f;f=KK(c[a>>2]|0,f<<2)|0;c[a>>2]=f;a=f}c[a+(b<<2)>>2]=d;return}function FF(a){a=a|0;var b=0;b=c[a>>2]|0;if(b|0)l6(b);c[a>>2]=0;c[a+8>>2]=0;c[a+4>>2]=0;return}function GF(a){a=a|0;var b=0,d=0,e=0;d=a+160|0;b=c[d>>2]|0;while(1){if(!b)break;e=c[b+4>>2]|0;FF(b+604|0);FF(b+592|0);l6(c[b+584>>2]|0);l6(c[b+588>>2]|0);l6(b);b=e}c[47044]=0;c[47043]=0;c[a+192>>2]=0;c[a+164>>2]=0;c[d>>2]=0;c[a+28>>2]=0;return}function HF(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0;m=l;l=l+128|0;j=m+64|0;k=m;N4(j,e,63)|0;i=F3(j,58)|0;if(i|0)a[i>>0]=0;d=b+60+(d<<2)|0;while(1){b=c[d>>2]|0;if(!b)break;N4(k,c[b+4>>2]|0,63)|0;b=F3(k,58)|0;if(b|0)a[b>>0]=0;if((f2(j,k)|0)<1)break;d=c[d>>2]|0}while(1){b=c[d>>2]|0;if(!b)break;N4(k,c[b+4>>2]|0,63)|0;b=F3(k,58)|0;if(b|0)a[b>>0]=0;if(f2(j,k)|0)break;b=c[d>>2]|0;if((c[b+8>>2]|0)>(f|0))d=b;else break}k=IK(20)|0;c[k>>2]=c[d>>2];c[d>>2]=k;c[k+4>>2]=e;c[k+8>>2]=f;c[k+12>>2]=g;c[k+16>>2]=h;l=m;return 1}function IF(a,b){a=a|0;b=b|0;b=l;l=l+16|0;dA(1,98697,b)|0;l=b;return 0}function JF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+144|0;r=s;o=s+80|0;p=s+16|0;n=(d+-3|0)>>>0<2?0:d;N4(o,e,63)|0;e=F3(o,58)|0;if(e){f=e+1|0;a[e>>0]=0;e=F3(f,58)|0;if(!e)m=0;else{a[e>>0]=0;m=e+1|0}}else{m=0;f=0}i=(f|0)!=0;j=(m|0)==0;k=(n|0)==(d|0);h=b+60+(d<<2)|0;a:while(1){e=c[h>>2]|0;if(!e){e=0;break}N4(p,c[e+4>>2]|0,63)|0;e=F3(p,58)|0;if(!e)e=0;else{a[e>>0]=0;e=e+1|0}do if(!(f2(p,o)|0)){g=(e|0)!=0;if(i&g?f2(e,f)|0:0)break;if(!j?f2(m,c[(c[(c[h>>2]|0)+12>>2]|0)+8>>2]|0)|0:0)break;if(k|g^1){q=16;break a}if(JF(b,n,e)|0){q=16;break a}}while(0);h=c[h>>2]|0}do if((q|0)==16){e=c[h>>2]|0;f=e+16|0;g=b+8|0;if(e){if((c[f>>2]|0)==0?(IF(0,0)|0,(c[f>>2]|0)==0):0){e=0;break}if((c[g>>2]|0)>0){q=c[15715]|0;o=c[e+4>>2]|0;p=c[(c[e+12>>2]|0)+8>>2]|0;c[r>>2]=c[20212+(d<<2)>>2];c[r+4>>2]=o;c[r+8>>2]=p;z4(q,98728,r)|0}}else e=0}while(0);c[b+80+(d<<2)>>2]=e;l=s;return e|0}function KF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;do if(!e)e=0;else{if(c[5058]|0){hA(188180,0,0);c[5058]=0}h=Y3(e)|0;e=F3(h,58)|0;if(e){a[e>>0]=0;f=b+60+(d<<2)|0;e=1;g=f;while(1){b=c[g>>2]|0;if(!b)break;d=Y3(c[b+4>>2]|0)|0;b=F3(d,58)|0;if(b|0)a[b>>0]=0;if(!((a[h>>0]|0)!=0?(C3(h,d)|0)!=0:0)){e=c[47046]|0;if(e>>>0>=(c[47047]|0)>>>0){iA(188180,1)|0;e=c[47046]|0}c[47046]=e+1;a[e>>0]=32;kA(188180,c[(c[g>>2]|0)+4>>2]|0)|0;e=c[47046]|0;if(e>>>0>=(c[47047]|0)>>>0){iA(188180,1)|0;e=c[47046]|0}c[47046]=e+1;a[e>>0]=58;kA(188180,c[(c[(c[g>>2]|0)+12>>2]|0)+8>>2]|0)|0;e=0}l6(d);g=c[g>>2]|0}l6(h);if(e<<24>>24){g=0;i=19}}else{l6(h);g=0;f=b+60+(d<<2)|0;e=1;i=19}if((i|0)==19){while(1){b=c[f>>2]|0;if(!b)break;d=Y3(c[b+4>>2]|0)|0;b=F3(d,58)|0;if(b|0)a[b>>0]=0;if(!((g|0)!=0?(C3(g,d)|0)==0:0)){e=c[47046]|0;if(e>>>0>=(c[47047]|0)>>>0){iA(188180,1)|0;e=c[47046]|0}c[47046]=e+1;a[e>>0]=32;kA(188180,d)|0;e=0}g=d;f=c[f>>2]|0;i=19}if(e<<24>>24){e=195341;break}}e=c[47046]|0;if(e>>>0>=(c[47047]|0)>>>0){iA(188180,1)|0;e=c[47046]|0}a[e>>0]=0;e=c[47045]|0;c[47046]=e}while(0);return e|0}function LF(b){b=b|0;var d=0;if(!b)Aa(111509,98745,573,98759);if(!(a[b>>0]|0))Aa(111514,98745,574,98759);d=c[47049]|0;if(!d)b=0;else b=eb[c[d>>2]&63](d,b,512)|0;return b|0}function MF(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;i=k;if(!b)Aa(111613,98745,589,98776);g=b+8|0;e=c[g>>2]|0;if(!e)Aa(111616,98745,590,98776);if(!(a[e>>0]|0))Aa(111625,98745,591,98776);h=b+20|0;f=c[h>>2]|0;do if(!f){d=kP(e)|0;if(!d){c[i>>2]=c[g>>2];dA(0,98800,i)|0;d=0;break}i=f4(d,139124)|0;c[h>>2]=i;if(!i){c[j>>2]=v2(c[(L1()|0)>>2]|0)|0;c[j+4>>2]=d;dA(0,98825,j)|0;d=0;break}d=c[47050]|0;if((d|0)>49){a[b+17>>0]=1;d=1;break}else{c[47050]=d+1;d=1;break}}else{y4(f,0,0)|0;if(!(c[h>>2]|0))Aa(98846,98745,614,98776);else d=1}while(0);l=k;return d|0}function NF(b){b=b|0;var d=0,e=0;if(a[b+17>>0]|0?(d=b+20|0,e=c[d>>2]|0,e|0):0){l4(e)|0;c[d>>2]=0}return}function OF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0;if(!b){e=-1;d=-1}else{i=c[b+48>>2]|0;e=d+8|0;f=+(i|0);if(!i){g=+h[d>>3];f=+h[e>>3]}else{h[e>>3]=f;h[d>>3]=f;g=f}e=~~(+((c[b+40>>2]|0)*72|0)/g);d=~~(+((c[b+44>>2]|0)*72|0)/f)}c[a>>2]=e;c[a+4>>2]=d;return}function PF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0.0;n=l;l=l+48|0;f=n+16|0;j=n;k=n+32|0;m=b+4|0;if((e|0)!=0?(a[e>>0]|0)!=0:0){if(((c[47179]|0)==0?(g=c[47178]|0,(c[47051]|0)!=(g|0)):0)?(c[47051]=g,i=c[47049]|0,i|0):0){Oz(i)|0;c[47049]=0}o=+h[(c[(c[d+16>>2]|0)+8>>2]|0)+24>>3];o=!(o>=1.0)?96.0:o;h[j+8>>3]=o;h[j>>3]=o;d=QF(e)|0;c[f>>2]=c[j>>2];c[f+4>>2]=c[j+4>>2];c[f+8>>2]=c[j+8>>2];c[f+12>>2]=c[j+12>>2];OF(k,d,f);d=c[k+4>>2]|0;f=c[k>>2]|0}else{d=-1;f=-1}c[b>>2]=f;c[m>>2]=d;l=n;return}function QF(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+16|0;e=f;if(!a)Aa(111509,98745,638,98852);if(!(c[47049]|0))c[47049]=Sz(20236,c[4599]|0)|0;b=LF(a)|0;a:do if(!b){b=HK(64)|0;if(!b)b=0;else{d=b+8|0;c[d>>2]=dD(0,a)|0;if(!((MF(b)|0)<<24>>24)){RF(b);b=0;break}if(!(c[b+20>>2]|0))Aa(98846,98745,653,98852);do switch(SF(b)|0){case 0:{a=gN(c[d>>2]|0)|0;c[b+52>>2]=a;if(!a){c[e>>2]=c[d>>2];dA(0,98869,e)|0;RF(b);b=0;break a}break}case 2:{TF(b);break}case 3:{UF(b);break}case 1:{VF(b);break}case 4:{WF(b);break}case 6:{XF(b);break}case 11:{YF(b);break}case 8:{ZF(b);break}case 5:{_F(b);break}case 12:{$F(b);break}default:{}}while(0);NF(b);e=c[47049]|0;eb[c[e>>2]&63](e,b,1)|0}}else NF(b);while(0);l=f;return b|0}function RF(a){a=a|0;var b=0;b=c[a+8>>2]|0;if(b|0)fD(0,b)|0;l6(a);return}function SF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+224|0;e=j+200|0;f=j;g=a+20|0;b=c[g>>2]|0;h=a+24|0;d=a+28|0;a:do if((b|0)!=0?(X5(e,1,20,b)|0)==20:0){b=0;while(1){if(b>>>0>=10){i=13;break a}if(!(g2(e,c[20272+(b<<4)>>2]|0,c[20272+(b<<4)+4>>2]|0)|0))break;b=b+1|0}c[d>>2]=c[20272+(b<<4)+12>>2];a=c[20272+(b<<4)+8>>2]|0;c[h>>2]=a;switch(b|0){case 7:break;case 8:{if(g2(e+8|0,99085,4)|0)break a;c[d>>2]=99090;c[h>>2]=11;a=11;break a}default:break a}while(1){if(!(o4(f,200,c[g>>2]|0)|0)){i=11;break}if(!(g2(f,99080,4)|0)){i=8;break}}if((i|0)==8){c[d>>2]=102104;c[h>>2]=8;a=8;break}else if((i|0)==11){a=c[h>>2]|0;break}}else i=13;while(0);if((i|0)==13){c[d>>2]=99095;c[h>>2]=0;a=0}l=j;return a|0}function TF(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+16|0;b=f+4|0;d=f;c[a+48>>2]=0;e=a+20|0;y4(c[e>>2]|0,6,0)|0;if((iG(c[e>>2]|0,2,b)|0)<<24>>24?(iG(c[e>>2]|0,2,d)|0)<<24>>24:0){c[a+40>>2]=c[b>>2];c[a+44>>2]=c[d>>2]}l=f;return}function UF(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+16|0;b=f+4|0;d=f;c[a+48>>2]=0;e=a+20|0;y4(c[e>>2]|0,16,0)|0;if((aG(c[e>>2]|0,4,b)|0)<<24>>24?(aG(c[e>>2]|0,4,d)|0)<<24>>24:0){c[a+40>>2]=c[b>>2];c[a+44>>2]=c[d>>2]}l=f;return}function VF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;b=h+12|0;d=h+8|0;e=h+4|0;f=h;c[a+48>>2]=0;g=a+20|0;y4(c[g>>2]|0,16,0)|0;if((((iG(c[g>>2]|0,2,b)|0)<<24>>24?(iG(c[g>>2]|0,2,d)|0)<<24>>24:0)?(iG(c[g>>2]|0,2,e)|0)<<24>>24:0)?(iG(c[g>>2]|0,2,f)|0)<<24>>24:0){c[a+40>>2]=c[b>>2]<<16|c[d>>2];c[a+44>>2]=c[e>>2]<<16|c[f>>2]}l=h;return}function WF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;b=o+16|0;e=o+12|0;j=o+8|0;k=o+4|0;m=o;c[a+48>>2]=0;n=a+20|0;while(1){if(!((aG(c[n>>2]|0,1,b)|0)<<24>>24))break;d=c[b>>2]|0;if((d|0)==255)continue;if(F3(99068,d)|0)continue;if((d|0)==192){i=6;break}f=c[n>>2]|0;if((d|0)==194){i=11;break}if(!((aG(f,2,e)|0)<<24>>24))break;y4(c[n>>2]|0,(c[e>>2]|0)+-2|0,1)|0}if((i|0)==6){d=a+40|0;b=a+44|0;if(((aG(c[n>>2]|0,3,m)|0)<<24>>24?(aG(c[n>>2]|0,2,j)|0)<<24>>24:0)?(aG(c[n>>2]|0,2,k)|0)<<24>>24:0){c[b>>2]=c[j>>2];c[d>>2]=c[k>>2]}}else if((((i|0)==11?(g=a+40|0,h=a+44|0,(aG(f,3,m)|0)<<24>>24):0)?(aG(c[n>>2]|0,2,j)|0)<<24>>24:0)?(aG(c[n>>2]|0,2,k)|0)<<24>>24:0){c[h>>2]=c[j>>2];c[g>>2]=c[k>>2]}l=o;return}function XF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+1056|0;j=m;b=m+32|0;e=m+28|0;f=m+24|0;g=m+20|0;h=m+16|0;c[a+48>>2]=72;i=a+20|0;y4(c[i>>2]|0,0,0)|0;while(1){if(!(o4(b,1024,c[i>>2]|0)|0))break;d=C4(b,99053)|0;if(!d)continue;c[j>>2]=e;c[j+4>>2]=f;c[j+8>>2]=g;c[j+12>>2]=h;if((q4(d,104612,j)|0)==4){k=5;break}}if((k|0)==5){j=c[e>>2]|0;c[a+32>>2]=j;k=c[f>>2]|0;c[a+36>>2]=k;c[a+40>>2]=(c[g>>2]|0)-j;c[a+44>>2]=(c[h>>2]|0)-k}l=m;return}function YF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+16|0;b=h+4|0;e=h;c[a+48>>2]=0;f=a+20|0;y4(c[f>>2]|0,15,0)|0;i=(S5(c[f>>2]|0)|0)==88;g=c[f>>2]|0;d=a+40|0;a=a+44|0;if(i){y4(g,24,0)|0;if((iG(c[f>>2]|0,4,b)|0)<<24>>24?(iG(c[f>>2]|0,4,e)|0)<<24>>24:0){c[d>>2]=c[b>>2];c[a>>2]=c[e>>2]}}else{y4(g,26,0)|0;if((iG(c[f>>2]|0,2,b)|0)<<24>>24?(iG(c[f>>2]|0,2,e)|0)<<24>>24:0){c[d>>2]=c[b>>2];c[a>>2]=c[e>>2]}}l=h;return}function ZF(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=l;l=l+352|0;C=F+80|0;B=F+72|0;E=F+64|0;D=F+56|0;A=F+48|0;d=F+40|0;s=F+32|0;t=F+24|0;u=F+16|0;v=F+8|0;w=F;x=F+328|0;y=F+128|0;z=F+96|0;if(!(c[47052]|0)){if(X4(188212,98938,1)|0){c[d>>2]=98938;dA(1,98965,d)|0}c[47052]=188212}m=b+20|0;y4(c[m>>2]|0,0,0)|0;n=z+12|0;o=z+20|0;p=z+8|0;q=z+16|0;r=z+4|0;d=0;g=0;f=0;e=0;a:while(1){if(!(o4(y,200,c[m>>2]|0)|0))break;if(g<<24>>24==0|d<<24>>24==0){i=y;k=e}else break;b:while(1){j=f;c:while(1){while(1){if(M5(188212,i,4,z,0)|0){f=j;e=k;continue a}a[i+(c[n>>2]|0)>>0]=0;a[i+(c[o>>2]|0)>>0]=0;e=i+(c[p>>2]|0)|0;f=i+(c[q>>2]|0)|0;i=i+((c[r>>2]|0)+1)|0;if(!(f2(e,141419)|0))break;if(!(f2(e,141351)|0))break c;if(f2(e,99012)|0)continue;c[C>>2]=t;c[C+4>>2]=u;c[C+8>>2]=v;c[C+12>>2]=w;if((q4(f,99020,C)|0)==4)break b}c[A>>2]=s;c[A+4>>2]=x;if((q4(f,99002,A)|0)!=2){c[D>>2]=s;if((q4(f,101510,D)|0)==1){e=1;f=hG(+h[s>>3],99009)|0}else{e=g;f=j}}else{e=1;f=hG(+h[s>>3],x)|0}if(!(d<<24>>24)){d=0;g=e;j=f}else{g=e;e=k;continue a}}c[E>>2]=s;c[E+4>>2]=x;if((q4(f,99002,E)|0)!=2){c[B>>2]=s;if((q4(f,101510,B)|0)==1){d=1;e=hG(+h[s>>3],99009)|0}else e=k}else{d=1;e=hG(+h[s>>3],x)|0}if(!(g<<24>>24)){g=0;f=j;k=e}else{f=j;continue a}}d=1;g=1;f=~~(+h[v>>3]-+h[t>>3]+1.0)>>>0;e=~~(+h[w>>3]-+h[u>>3]+1.0)>>>0}c[b+48>>2]=0;c[b+40>>2]=f;c[b+44>>2]=e;l=F;return}function _F(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0.0;d=l;l=l+32|0;b=d;c[a+48>>2]=0;e=a+20|0;y4(c[e>>2]|0,0,0)|0;if(!(bG(c[e>>2]|0,b)|0)){g=+h[b>>3];c[a+32>>2]=~~g;f=+h[b+8>>3];c[a+36>>2]=~~f;c[a+40>>2]=~~(+h[b+16>>3]-g);c[a+44>>2]=~~(+h[b+24>>3]-f)}l=d;return}function $F(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+16|0;b=f+4|0;d=f;c[a+48>>2]=0;e=a+20|0;y4(c[e>>2]|0,6,0)|0;if((aG(c[e>>2]|0,1,b)|0)<<24>>24?(aG(c[e>>2]|0,1,d)|0)<<24>>24:0){c[a+40>>2]=c[b>>2];c[a+44>>2]=c[d>>2]}l=f;return}function aG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;c[d>>2]=0;e=0;while(1){if(e>>>0>=b>>>0){e=1;break}f=S5(a)|0;if(p4(a)|0){e=0;break}c[d>>2]=c[d>>2]<<8|f;e=e+1|0}return e|0}function bG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+1040|0;d=h;e=h+16|0;while(1){if(!(o4(e,1024,a)|0)){a=1;break}f=C4(e,98928)|0;if(f|0){g=4;break}}if((g|0)==4){c[d+4>>2]=e;c[d>>2]=f+9;c[d+8>>2]=a;a=cG(d,b)|0}l=h;return a|0}function cG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+1024|0;f=g;dG(b);e=a[c[b>>2]>>0]|0;if(!(e<<24>>24))e=(eG(b)|0)&255;else e=e<<24>>24;if((((e|0)==91?(c[b>>2]=(c[b>>2]|0)+1,fG(b,f),(gG(f,d)|0)==0):0)?(fG(b,f),(gG(f,d+8|0)|0)==0):0)?(fG(b,f),(gG(f,d+16|0)|0)==0):0){fG(b,f);e=(gG(f,d+24|0)|0)!=0&1}else e=1;l=g;return e|0}function dG(b){b=b|0;var d=0;d=c[b>>2]|0;while(1){d=a[d>>0]|0;if(!(d<<24>>24))d=(eG(b)|0)&255;else d=d<<24>>24;if(!((d&255)<<24>>24))break;if(!(X1(d&255)|0))break;d=(c[b>>2]|0)+1|0;c[b>>2]=d}return}function eG(b){b=b|0;var d=0;d=b+4|0;if(!(o4(c[d>>2]|0,1024,c[b+8>>2]|0)|0))b=0;else{d=c[d>>2]|0;c[b>>2]=d;b=a[d>>0]|0}return b|0}function fG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;dG(b);e=0;f=c[b>>2]|0;while(1){f=a[f>>0]|0;if(!(f<<24>>24))g=(eG(b)|0)&255;else g=f<<24>>24;f=g<<24>>24;if(!f)break;if(!((f|0)==46|(f+-48|0)>>>0<10))break;a[d+e>>0]=g;e=e+1|0;f=(c[b>>2]|0)+1|0;c[b>>2]=f;if((e|0)==1023){e=1023;break}}a[d+e>>0]=0;return}function gG(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0;e=l;l=l+16|0;f=e;d=+b6(a,f);if((c[f>>2]|0)==(a|0))a=1;else{h[b>>3]=d;a=0}l=e;return a|0}function hG(a,b){a=+a;b=b|0;var c=0.0,d=0.0;d=a*72.0;do if(!(f2(b,99036)|0)){c=d;a=d>=0.0?.5:-.5}else{if(!(f2(b,99039)|0)){a=d/96.0;c=a;a=a>=0.0?.5:-.5;break}if(!(f2(b,99042)|0)){a=d/6.0;c=a;a=a>=0.0?.5:-.5;break}if(f2(b,99009)|0?f2(b,99045)|0:0)if(!(f2(b,99047)|0)){a=a*28.346456664;c=a;a=a>=0.0?.5:-.5;break}else{b=(f2(b,99050)|0)==0;d=a*2.8346456663999997;return (b?~~(d+(d>=0.0?.5:-.5)):0)|0}c=a>=0.0?.5:-.5}while(0);return ~~(a+c)|0}function iG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;c[d>>2]=0;e=0;while(1){if(e>>>0>=b>>>0){e=1;break}f=S5(a)|0;if(p4(a)|0){e=0;break}c[d>>2]=c[d>>2]|f<<(e<<3);e=e+1|0}return e|0}function jG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;a=c[b+20>>2]|0;if(a|0)l4(a)|0;if(c[b+52>>2]|0?(e=c[b+60>>2]|0,e|0):0)db[e&127](b);l6(b);return}function kG(){var a=0;DA(0,1,108525,105794)|0;a=xF(0,1)|0;_S(a,0);return a|0}function lG(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0;m=l;l=l+304|0;k=m+24|0;j=m+8|0;f=m;i=m+40|0;if((tS(b,e)|0)!=999)if((uS(b,d)|0)==-1)b=-1;else{n=c[d+16>>2]|0;p=+h[n+32>>3];q=+h[n+16>>3];r=+h[n+24>>3];o=+h[n+40>>3];b=~~(r+(r>=0.0?.5:-.5));e=~~(q+(q>=0.0?.5:-.5));f=~~(p+(p>=0.0?.5:-.5));g=~~(o+(o>=0.0?.5:-.5));if(!(a[(c[n+8>>2]|0)+81>>0]|0)){c[k>>2]=e;c[k+4>>2]=b;c[k+8>>2]=f;c[k+12>>2]=g;i2(i,99200,k)|0}else{c[j>>2]=b;c[j+4>>2]=e;c[j+8>>2]=g;c[j+12>>2]=f;i2(i,99200,j)|0}QA(d,102972,i,195341)|0;b=0}else{b=KF(b,1,e)|0;c[f>>2]=e;c[f+4>>2]=b;dA(1,111534,f)|0;b=-1}l=m;return b|0}function mG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=c[b+60>>2]|0;BF(a,d)|0;d=c[a+164>>2]|0;c[d+56>>2]=HR(d,c[d+52>>2]|0)|0;b=d+152|0;if((RC(f,137786,0,1)|0)!=0?(c[(c[f+16>>2]|0)+8>>2]|0)!=0:0)h=5;else if(!(c[b>>2]&67108864)){gA(99212,g);b=-1}else h=5;if((h|0)==5){c[d+36>>2]=e;if(!e)c[b>>2]=c[b>>2]|134217728;b=QJ(a,f)|0;JR(d);GF(a)}l=i;return b|0}function nG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=c[b+60>>2]|0;BF(a,d)|0;b=c[a+164>>2]|0;c[b+56>>2]=HR(b,c[b+52>>2]|0)|0;if((RC(f,137786,0,1)|0)!=0?(c[(c[f+16>>2]|0)+8>>2]|0)!=0:0)h=5;else if(!(c[b+152>>2]&67108864)){gA(99212,g);b=-1}else h=5;if((h|0)==5){AF(a,e);h=QJ(a,f)|0;JR(b);qF(b);GF(a);b=h}l=i;return b|0}function oG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;h=m+8|0;g=m;b=c[b+60>>2]|0;BF(a,d)|0;j=c[a+164>>2]|0;c[j+56>>2]=HR(j,c[j+52>>2]|0)|0;if((RC(b,137786,0,1)|0)!=0?(c[(c[b+16>>2]|0)+8>>2]|0)!=0:0)k=5;else if(!(c[j+152>>2]&67108864)){gA(99212,g);b=-1}else k=5;do if((k|0)==5){if(e|0?(i=k6(4096)|0,c[e>>2]=i,i|0):0){g=j+40|0;c[g>>2]=i;c[j+44>>2]=4096;d=j+48|0;c[d>>2]=0;b=QJ(a,b)|0;JR(j);if(!b){c[e>>2]=c[g>>2];c[f>>2]=c[d>>2]}GF(a);break}dA(1,99233,h)|0;b=-1}while(0);l=m;return b|0}function pG(a,b){a=a|0;b=b|0;YS(a,0,b);return}function qG(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0;G=l;l=l+4288|0;C=G+8|0;B=G;E=4;F=k6(40)|0;c[F>>2]=0;y=G+4152|0;z=G+4148|0;A=G+4128|0;j=G+4112|0;k=G+16|0;o=0;i=la(24,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;a:do if((h|0)!=1){if(!i){c[d>>2]=0;g=0;break}o=0;n=aa(32,e|0,z|0,y|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)!=1){o=0;m=la(23,40)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)!=1){o=0;ba(16,A|0,j|0,k|0,24,85);g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)!=1){o=0;e=la(25,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)!=1){j=A+16|0;i=c[j>>2]|0;g=e;while(1){if(!g)break;o=0;ra(i|0,g|0,0)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){e=A6(c[h>>2]|0,F|0,E|0)|0;if(!e)Ca(h|0,p|0);D=p}else e=-1;if((e|0)==1){x=0;w=j;v=m;u=n;g=D;m=15;break a}o=0;g=ra(86,b|0,g|0)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){e=A6(c[h>>2]|0,F|0,E|0)|0;if(!e)Ca(h|0,p|0);D=p}else e=-1;if((e|0)==1){x=0;w=j;v=m;u=n;g=D;m=15;break a}}F=x6(188244,1,F|0,E|0)|0;E=D;o=0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){x=m;w=j;v=m;u=n;g=D;m=15}else{x=m;w=j;v=m;u=n;g=0;m=15}}else{x=0;w=0;v=m;u=n;g=D;m=15}}else{x=0;w=0;v=m;u=n;g=D;m=15}}else{x=0;w=0;v=m;u=n;g=D;m=15}}else{x=0;w=0;v=0;u=n;g=D;m=15}}else{x=0;w=0;v=0;u=0;g=D;m=15}while(0);do if((m|0)==15){b:while(1){c:do if(!g){o=0;e=la(25,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}t=u+(c[z>>2]|0)|0;k=0;m=0;j=0;while(1){if(!e)break;o=0;g=ra(c[w>>2]|0,e|0,-1)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){i=A6(c[h>>2]|0,F|0,E|0)|0;if(!i)Ca(h|0,p|0);D=p}else i=-1;if((i|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}if((g|0)==0?(a[(c[e+16>>2]|0)+119>>0]|0)==3:0){if(!m){o=0;c[B>>2]=j;aa(33,t|0,137696,B|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}o=0;i=aa(34,b|0,u|0,1)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}o=0;pa(53,i|0,137786,280,1)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}c[x+(j<<2)>>2]=i;k=1;j=j+1|0}else i=m;o=0;pa(54,b|0,e|0,i|0,A|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}}else i=m;o=0;e=ra(86,b|0,e|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}m=i}o=0;e=la(25,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}i=10;q=x;n=v;s=v;while(1){if(!e){e=0;m=q;i=s;break c}o=0;g=ra(c[w>>2]|0,e|0,-1)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){m=A6(c[h>>2]|0,F|0,E|0)|0;if(!m)Ca(h|0,p|0);D=p}else m=-1;if((m|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}if(!g){o=0;c[C>>2]=j;aa(33,t|0,137696,C|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}o=0;r=aa(34,b|0,u|0,1)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}o=0;pa(53,r|0,137786,280,1)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){g=A6(c[h>>2]|0,F|0,E|0)|0;if(!g)Ca(h|0,p|0);D=p}else g=-1;if((g|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}o=0;pa(54,b|0,e|0,r|0,A|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}if((j|0)==(i|0)){i=j<<1;o=0;m=ra(87,n|0,j<<3|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}g=m;n=m;h=m}else{g=q;h=s}c[g+(j<<2)>>2]=r;q=g;j=j+1|0;m=h}else m=s;o=0;e=ra(86,b|0,e|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}s=m}}else{e=1;k=0;m=x;j=0;i=v}while(0);o=0;$(108,A|0);g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue}if((u|0)!=(y|0)){o=0;$(105,u|0);g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue}}if(!e){o=0;g=ra(87,i|0,j<<2|0)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){e=A6(c[h>>2]|0,F|0,E|0)|0;if(!e)Ca(h|0,p|0);D=p}else e=-1;if((e|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue}else{m=58;break}}c[d>>2]=0;g=0;while(1){if((g|0)>=(j|0))break;o=0;la(26,c[m+(g<<2)>>2]|0)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){e=A6(c[h>>2]|0,F|0,E|0)|0;if(!e)Ca(h|0,p|0);D=p}else e=-1;if((e|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}g=g+1|0}o=0;$(105,i|0);g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15}else{m=56;break}}if((m|0)==56){g=0;break}else if((m|0)==58){c[d>>2]=j;a[f>>0]=k;break}}while(0);l6(F|0);l=G;return g|0}function rG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if(!((a|0)!=0?(AG(a)|0)!=0:0))a=99289;f=D3(a)|0;e=f+25|0;if((e|0)>=129){d=IK(e)|0;if(!d)d=0;else g=6}else g=6;if((g|0)==6){O3(d,a)|0;c[b>>2]=f}return d|0}function sG(a,b){a=a|0;b=b|0;lC(b,a,1)|0;return}function tG(b,d){b=b|0;d=d|0;var e=0;b=(c[b+16>>2]|0)+157|0;e=a[b>>0]|0;if((d|0)>=0)a[b>>0]=d;return e|0}function uG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[b>>2]=d;c[b+4>>2]=d+4096;c[b+12>>2]=0;c[b+8>>2]=0;c[a>>2]=b;c[a+4>>2]=b;c[a+8>>2]=d;c[a+12>>2]=e;c[a+16>>2]=f;return}function vG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;yG(e,b);i=e+12|0;j=e+16|0;b=0;a:while(1){k=zG(e)|0;if(!k)break;b=b+1|0;f=c[i>>2]|0;if(f|0)lb[f&63](k,d);h=ZA(a,k)|0;while(1){if(!h)continue a;g=c[h>>2]&3;f=c[((g|0)==3?h:h+48|0)+40>>2]|0;if((f|0)==(k|0))f=c[((g|0)==2?h:h+-48|0)+40>>2]|0;if(!(vb[c[j>>2]&127](f,-1)|0))yG(e,f);h=_A(a,h,k)|0}}return b|0}function wG(a){a=a|0;var b=0;a=c[(c[a>>2]|0)+12>>2]|0;while(1){if(!a)break;b=c[a+12>>2]|0;xG(a);a=b}return}function xG(a){a=a|0;l6(c[a>>2]|0);l6(a);return}function yG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;f=k;g=a+8|0;i=a+4|0;d=c[i>>2]|0;if((c[g>>2]|0)==(c[d+4>>2]|0)){d=c[d+12>>2]|0;do if(!d){e=IK(16)|0;if(!e){dA(1,99270,f)|0;Ca(188244,1)}c[e+8>>2]=c[i>>2];c[e+12>>2]=0;d=IK(4e6)|0;c[e>>2]=d;if(!d){dA(1,99270,j)|0;Ca(188244,1)}else{c[e+4>>2]=d+4e6;c[(c[i>>2]|0)+12>>2]=e;h=e;break}}else h=d;while(0);c[i>>2]=h;c[g>>2]=c[h>>2]}vb[c[a+16>>2]&127](b,1)|0;j=c[g>>2]|0;c[g>>2]=j+4;c[j>>2]=b;l=k;return}function zG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=a+8|0;b=c[f>>2]|0;d=a+4|0;e=c[d>>2]|0;if((b|0)==(c[e>>2]|0))if((e|0)==(c[a>>2]|0))b=0;else{b=c[e+8>>2]|0;c[d>>2]=b;b=c[b+4>>2]|0;c[f>>2]=b;g=4}else g=4;if((g|0)==4){b=b+-4|0;c[f>>2]=b;b=c[b>>2]|0}return b|0}function AG(b){b=b|0;var c=0;a:while(1){c=b;b=b+1|0;c=a[c>>0]|0;switch(c<<24>>24){case 95:continue a;case 0:{b=1;break a}default:{}}if(!(O2(c&255)|0)){b=0;break}}return b|0}function BG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=l;l=l+4272|0;w=z;x=4;y=k6(40)|0;c[y>>2]=0;t=z+4144|0;u=z+4140|0;v=z+4120|0;h=z+4104|0;i=z+8|0;o=0;f=la(24,a|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){e=A6(c[g>>2]|0,y|0,x|0)|0;if(!e)Ca(g|0,p|0);D=p}else e=-1;a:do if((e|0)!=1)if(f){o=0;k=aa(32,d|0,u|0,t|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)!=1){o=0;j=la(23,40)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)!=1){o=0;ba(16,v|0,h|0,i|0,24,85);e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)!=1){o=0;f=la(25,a|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)!=1){h=v+16|0;g=c[h>>2]|0;e=f;while(1){if(!e)break;o=0;ra(g|0,e|0,0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){f=A6(c[d>>2]|0,y|0,x|0)|0;if(!f)Ca(d|0,p|0);D=p}else f=-1;if((f|0)==1){s=h;r=j;q=k;e=D;j=14;break a}o=0;e=ra(86,a|0,e|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){f=A6(c[d>>2]|0,y|0,x|0)|0;if(!f)Ca(d|0,p|0);D=p}else f=-1;if((f|0)==1){s=h;r=j;q=k;e=D;j=14;break a}}y=x6(188244,1,y|0,x|0)|0;x=D;o=0;e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)==1){s=h;r=j;q=k;e=D;j=14}else{s=h;r=j;q=k;e=0;j=14}}else{s=0;r=j;q=k;e=D;j=14}}else{s=0;r=j;q=k;e=D;j=14}}else{s=0;r=j;q=k;e=D;j=14}}else{s=0;r=0;q=k;e=D;j=14}}else{d=0;e=0}else{s=0;r=0;q=0;e=D;j=14}while(0);b:do if((j|0)==14){c:while(1){if(e|0){o=0;$(108,v|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue}o=0;$(105,r|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue}if((q|0)==(t|0)){d=0;e=0;break b}o=0;$(105,q|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue}else{j=19;break}}o=0;f=la(25,a|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue}n=q+(c[u>>2]|0)|0;m=10;i=r;e=0;j=r;while(1){if(!f)break;o=0;d=ra(c[s>>2]|0,f|0,-1)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,y|0,x|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}if(!d){o=0;c[w>>2]=e;aa(33,n|0,137696,w|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,y|0,x|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}o=0;k=aa(34,a|0,q|0,1)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,y|0,x|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}o=0;pa(53,k|0,137786,280,1)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,y|0,x|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}o=0;pa(54,a|0,f|0,k|0,v|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,y|0,x|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}if((e|0)==(m|0)){h=e<<1;o=0;i=ra(87,j|0,e<<3|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,y|0,x|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}g=i;d=i}else{h=m;g=i;d=j}c[g+(e<<2)>>2]=k;e=e+1|0;i=g;j=d}else h=m;o=0;f=ra(86,a|0,f|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,y|0,x|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}m=h}o=0;$(108,v|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){f=A6(c[d>>2]|0,y|0,x|0)|0;if(!f)Ca(d|0,p|0);D=p}else f=-1;if((f|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue}o=0;d=ra(87,j|0,e<<2|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,y|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue}if((q|0)==(t|0))break b;o=0;$(105,q|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,y|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14}else{j=39;break}}if((j|0)==19){d=0;e=0;break}else if((j|0)==39)break}while(0);c[b>>2]=e;l6(y|0);l=z;return d|0}function CG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=0;f=gC(a)|0;while(1){if(!f)break;e=UA(b,f)|0;while(1){if(!e)break;if(lC(a,c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,0)|0){jB(a,e,1)|0;d=d+1|0}e=WA(b,e)|0}f=hC(a,f)|0}return d|0}function DG(a){a=a|0;a=PC(a,99294,0)|0;if(!a)Aa(99299,99302,529,99311);else return c[a+8>>2]|0;return 0}function EG(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;u=l;l=l+4320|0;s=u+24|0;r=u+8|0;q=u;t=u+4184|0;p=u+4160|0;f=u+40|0;if(qB(b)|0){WC(b,0,99320,-12,0);WC(b,1,99332,16,0);o=rG(e,f,t)|0;k=FG(b)|0;m=IK((qB(k)|0)<<2)|0;uG(p,u+4144|0,u+48|0,24,88);h=gC(k)|0;n=p+16|0;i=o+(c[f>>2]|0)|0;j=c[15715]|0;e=0;while(1){if(!h)break;if(!(vb[c[n>>2]&127](h,-1)|0)){c[q>>2]=e;i2(i,100234,q)|0;v=LD(k,o,1)|0;w=LD(b,o,1)|0;RC(w,99320,12,0)|0;a[(PC(w,99320,0)|0)+8>>0]=1;f=vG(k,h,v,p)|0;HG(v,w);g=IG(w)|0;JG(b,w);c[m+(e<<2)>>2]=w;tC(k,v)|0;if(a[195234]|0){c[r>>2]=e;c[r+4>>2]=f;c[r+8>>2]=g;z4(j,99344,r)|0}e=e+1|0}h=hC(k,h)|0}if(a[195234]|0){r=qB(b)|0;v=rB(b)|0;w=HB(b)|0;c[s>>2]=r;c[s+4>>2]=v;c[s+8>>2]=e;c[s+12>>2]=w;z4(j,99374,s)|0}pB(k)|0;XC(b,0,99320);XC(b,1,99332);wG(p);f=KK(m,e<<2)|0;if((o|0)!=(t|0))l6(o)}else{f=0;e=0}c[d>>2]=e;l=u;return f|0}function FG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;c[g>>2]=c[4660];g=lB(99421,g,0)|0;MG(g,a);b=gC(a)|0;while(1){if(!b)break;if(!(c[(PC(b,99332,0)|0)+12>>2]|0)){f=qC(g,HB(b)|0,1)|0;RC(f,99332,16,1)|0;c[(c[f+16>>2]|0)+12>>2]=b;c[(PC(b,99332,0)|0)+12>>2]=f}b=hC(a,b)|0}d=gC(a)|0;while(1){if(!d)break;e=c[(PC(d,99332,0)|0)+12>>2]|0;b=UA(a,d)|0;while(1){if(!b)break;f=c[(PC(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0,99332,0)|0)+12>>2]|0;do if((f|0)!=(e|0))if(f>>>0>e>>>0){fB(g,e,f,0,1)|0;break}else{fB(g,f,e,0,1)|0;break}while(0);b=WA(a,b)|0}d=hC(a,d)|0}l=h;return g|0}function GG(b,d){b=b|0;d=d|0;var e=0;b=(c[b+16>>2]|0)+8|0;e=a[b>>0]|0;if((d|0)>=0)a[b>>0]=d;return e|0}function HG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=gC(a)|0;while(1){if(!e)break;f=c[(c[e+16>>2]|0)+12>>2]|0;a:do if((c[f>>2]&3|0)==1)lC(b,f,1)|0;else{d=gC(f)|0;while(1){if(!d)break a;lC(b,d,1)|0;d=hC(f,d)|0}}while(0);e=hC(a,e)|0}return}function IG(a){a=a|0;return CG(a,c[a+60>>2]|0)|0}function JG(a,b){a=a|0;b=b|0;KG(a,b,0);return}function KG(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;g=(d|0)==0;b=MD(b)|0;while(1){if(!b)break;if((a[(PC(b,99320,0)|0)+8>>0]|0)==0?(f=LG(b,c,d)|0,f|0):0){if(g)e=(h2(HB(b)|0,108307,7)|0)==0;else e=1;KG(b,f,e&1)}b=ND(b)|0}return}function LG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;h=gC(a)|0;while(1){f=(e|0)==0;if(!h)break;g=qC(b,HB(h)|0,0)|0;if(g){if(f)e=LD(b,HB(a)|0,1)|0;lC(e,g,1)|0}h=hC(a,h)|0}if((d|0)!=0&f)e=LD(b,HB(a)|0,1)|0;if(e|0?(CG(e,a)|0,RA(a,e)|0,(h2(HB(e)|0,108307,7)|0)==0):0)c[(RC(e,99294,12,0)|0)+8>>2]=a;return e|0}function MG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=l;l=l+16|0;g=h;d=MD(b)|0;e=c[15715]|0;while(1){if(!d)break;a:do if(!(h2(HB(d)|0,108307,7)|0)){f=qC(a,HB(d)|0,1)|0;RC(f,99332,16,1)|0;c[(c[f+16>>2]|0)+12>>2]=d;b=gC(d)|0;while(1){if(!b)break a;if(c[(PC(b,99332,0)|0)+12>>2]|0){k=HB(b)|0;j=HB(d)|0;i=HB(c[(PC(b,99332,0)|0)+12>>2]|0)|0;c[g>>2]=k;c[g+4>>2]=j;c[g+8>>2]=i;z4(e,99424,g)|0}c[(PC(b,99332,0)|0)+12>>2]=f;b=hC(d,b)|0}}else MG(a,d);while(0);d=ND(d)|0}l=h;return}function NG(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0.0;n=+h[a>>3];j=~~(n+(n>=0.0?.5:-.5));n=+h[a+8>>3];a=~~(n+(n>=0.0?.5:-.5));n=+h[b>>3];g=~~(n+(n>=0.0?.5:-.5));n=+h[b+8>>3];f=~~(n+(n>=0.0?.5:-.5));l=g-j|0;i=((l|0)>-1?l:0-l|0)<<1;l=l>>31|1;m=f-a|0;k=((m|0)>-1?m:0-m|0)<<1;m=m>>31|1;a:do if((i|0)>(k|0)){e=0-i|0;d=k-(i>>1)|0;b=j;while(1){OL(c,b,a);if((b|0)==(g|0))break a;j=(d|0)>-1;d=d+k+(j?e:0)|0;b=b+l|0;a=(j?m:0)+a|0}}else{e=0-k|0;d=j;b=i-(k>>1)|0;while(1){OL(c,d,a);if((a|0)==(f|0))break a;k=(b|0)>-1;d=(k?l:0)+d|0;b=b+i+(k?e:0)|0;a=a+m|0}}while(0);return}function OG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;k=n;j=n+4|0;do if((a|0)<1)d=0;else{f=e+16|0;if((c[f>>2]|0)>>>0<4){d=PG(a,b,d,e)|0;break}m=IK(a<<5)|0;d=0;while(1){if((d|0)==(a|0))break;g=c[b+(d<<2)>>2]|0;zP(g);h=m+(d<<5)|0;g=(c[g+16>>2]|0)+16|0;c[h>>2]=c[g>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[h+12>>2]=c[g+12>>2];c[h+16>>2]=c[g+16>>2];c[h+20>>2]=c[g+20>>2];c[h+24>>2]=c[g+24>>2];c[h+28>>2]=c[g+28>>2];d=d+1|0}if((c[f>>2]|0)==4){h=e+28|0;a:do if(c[h>>2]&2|0){f=e+24|0;c[f>>2]=HK(a<<2)|0;d=0;while(1){if((d|0)==(a|0))break a;g=NA(c[b+(d<<2)>>2]|0,99491)|0;if(g|0?(c[k>>2]=j,g=(q4(g,137696,k)|0)>0,i=c[j>>2]|0,g&(i|0)>-1):0)c[(c[f>>2]|0)+(d<<2)>>2]=i;d=d+1|0}}while(0);d=QG(a,m,e)|0;if(c[h>>2]&2)l6(c[e+24>>2]|0)}else d=0;l6(m)}while(0);l=n;return d|0}function PG(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0;H=l;l=l+144|0;C=H+136|0;B=H+64|0;G=H+48|0;w=H+40|0;v=H;u=H+120|0;A=H+104|0;D=H+96|0;E=c[g+20>>2]|0;c[A>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;c[A+12>>2]=0;a:do if((b|0)>=1){x=A+12|0;y=A+8|0;z=A+4|0;p=(E|0)==0;F=c[15715]|0;q=u+4|0;r=u+8|0;s=u+12|0;o=0;i=0;while(1){if((o|0)==(b|0))break;t=c[e+(o<<2)>>2]|0;zP(t);if(!p?(a[E+o>>0]|0)!=0:0){n=c[t+16>>2]|0;I=+h[n+16>>3];j=~~(I+(I>=0.0?.5:-.5));c[u>>2]=j;I=+h[n+24>>3];k=~~(I+(I>=0.0?.5:-.5));c[q>>2]=k;I=+h[n+32>>3];m=~~(I+(I>=0.0?.5:-.5));c[r>>2]=m;I=+h[n+40>>3];n=~~(I+(I>=0.0?.5:-.5));c[s>>2]=n;if(!i){c[A>>2]=c[u>>2];c[A+4>>2]=c[u+4>>2];c[A+8>>2]=c[u+8>>2];c[A+12>>2]=c[u+12>>2]}else{c[A>>2]=c[((j|0)<(c[A>>2]|0)?u:A)>>2];c[z>>2]=c[((k|0)<(c[z>>2]|0)?u:A)+4>>2];c[y>>2]=c[((m|0)>(c[y>>2]|0)?u:A)+8>>2];c[x>>2]=c[((n|0)>(c[x>>2]|0)?u:A)+12>>2]}i=i+1|0}if((d[195234]|0)>2){n=HB(t)|0;t=c[t+16>>2]|0;L=+h[t+16>>3];K=+h[t+24>>3];J=+h[t+32>>3];I=+h[t+40>>3];c[v>>2]=n;h[v+8>>3]=L;h[v+16>>3]=K;h[v+24>>3]=J;h[v+32>>3]=I;z4(F,99558,v)|0}o=o+1|0}r=IK(b<<5)|0;i=0;while(1){if((i|0)==(b|0))break;v=r+(i<<5)|0;u=(c[(c[e+(i<<2)>>2]|0)+16>>2]|0)+16|0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];c[v+16>>2]=c[u+16>>2];c[v+20>>2]=c[u+20>>2];c[v+24>>2]=c[u+24>>2];c[v+28>>2]=c[u+28>>2];i=i+1|0}p=g+8|0;q=TG(b,r,c[p>>2]|0)|0;if(a[195234]|0){c[w>>2]=q;z4(F,99586,w)|0}if((q|0)>=1){o=(E|0)!=0;i=D+4|0;if(o){c[D>>2]=((c[y>>2]|0)+(c[A>>2]|0)|0)/2|0;c[i>>2]=((c[x>>2]|0)+(c[z>>2]|0)|0)/2|0}else{c[i>>2]=0;c[D>>2]=0}n=HK(b<<4)|0;m=g+16|0;i=0;while(1){if((i|0)>=(b|0))break;j=c[e+(i<<2)>>2]|0;k=n+(i<<4)|0;c[n+(i<<4)+12>>2]=i;if((c[m>>2]|0)==3){y=(c[j+16>>2]|0)+16|0;z=c[p>>2]|0;A=HB(j)|0;c[B>>2]=c[y>>2];c[B+4>>2]=c[y+4>>2];c[B+8>>2]=c[y+8>>2];c[B+12>>2]=c[y+12>>2];c[B+16>>2]=c[y+16>>2];c[B+20>>2]=c[y+20>>2];c[B+24>>2]=c[y+24>>2];c[B+28>>2]=c[y+28>>2];c[C>>2]=c[D>>2];c[C+4>>2]=c[D+4>>2];UG(B,k,q,z,C,A)}else{c[C>>2]=c[D>>2];c[C+4>>2]=c[D+4>>2];VG(f,j,k,q,g,C)}i=i+1|0}k=HK(b<<2)|0;i=0;while(1){if((i|0)>=(b|0))break;c[k+(i<<2)>>2]=n+(i<<4);i=i+1|0}k3(k,b,4,89);m=IL()|0;i=HK(b<<3)|0;b:do if(o){j=0;while(1){if((j|0)>=(b|0)){j=0;break}if(a[E+j>>0]|0){f=c[k+(j<<2)>>2]|0;g=i+(c[f+12>>2]<<3)|0;c[C>>2]=c[D>>2];c[C+4>>2]=c[D+4>>2];XG(f,m,g,C)}j=j+1|0}while(1){if((j|0)>=(b|0))break b;if(!(a[E+j>>0]|0)){D=c[k+(j<<2)>>2]|0;YG(j,D,m,i+(c[D+12>>2]<<3)|0,q,c[p>>2]|0,r)}j=j+1|0}}else{j=0;while(1){if((j|0)>=(b|0))break b;E=c[k+(j<<2)>>2]|0;YG(j,E,m,i+(c[E+12>>2]<<3)|0,q,c[p>>2]|0,r);j=j+1|0}}while(0);l6(k);j=0;while(1){if((j|0)>=(b|0))break;l6(c[n+(j<<4)+4>>2]|0);j=j+1|0}l6(n);LL(m);l6(r);if((d[195234]|0)>1){j=0;while(1){if((j|0)>=(b|0))break a;D=c[i+(j<<3)>>2]|0;E=c[i+(j<<3)+4>>2]|0;c[G>>2]=j;c[G+4>>2]=D;c[G+8>>2]=E;z4(F,99602,G)|0;j=j+1|0}}}else i=0}else i=0;while(0);l=H;return i|0}function QG(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=l;l=l+16|0;f=C;A=HK(b<<3)|0;y=c[e+4>>2]|0;B=e+28|0;z=(c[B>>2]&1|0)==0;v=(y|0)>0;w=b+-1|0;x=~~+R(+(+G(+(+(b|0)))));w=v?(w+y|0)/(y|0)|0:(w+x|0)/(x|0)|0;x=v?y:x;y=z?x:w;x=z?w:x;if(a[195234]|0){w=c[15715]|0;c[f>>2]=z?99497:99507;c[f+4>>2]=x;c[f+8>>2]=y;z4(w,99520,f)|0}u=HK((y<<3)+8|0)|0;v=HK((x<<3)+8|0)|0;w=HK(b*24|0)|0;j=e+8|0;f=0;i=w;while(1){if((f|0)>=(b|0))break;o=+h[d+(f<<5)+8>>3];n=+h[d+(f<<5)+24>>3];p=+((c[j>>2]|0)>>>0);h[i>>3]=+h[d+(f<<5)+16>>3]-+h[d+(f<<5)>>3]+p;h[i+8>>3]=n-o+p;c[i+16>>2]=f;f=f+1|0;i=i+24|0}t=HK(b<<2)|0;f=0;while(1){if((f|0)>=(b|0))break;c[t+(f<<2)>>2]=w+(f*24|0);f=f+1|0}f=c[e+24>>2]|0;if(!f)if(!(c[B>>2]&64)){k3(t,b,4,91);i=0;f=0;k=0}else{i=0;f=0;k=0}else{c[47100]=f;k3(t,b,4,90);i=0;f=0;k=0}while(1){if((k|0)>=(b|0)){g=0.0;f=0;break}e=c[t+(k<<2)>>2]|0;j=u+(f<<3)|0;p=+h[j>>3];o=+h[e>>3];h[j>>3]=p>o?p:o;j=v+(i<<3)|0;o=+h[j>>3];p=+h[e+8>>3];h[j>>3]=o>p?o:p;j=i+1|0;e=f+1|0;if(z){f=(e|0)==(y|0);i=f?j:i;f=f?0:e}else{s=(j|0)==(x|0);i=s?0:j;f=s?e:f}k=k+1|0}while(1){if((f|0)>(y|0)){g=0.0;f=x;break}s=u+(f<<3)|0;p=+h[s>>3];h[s>>3]=g;g=g+p;f=f+1|0}while(1){if((f|0)<=0)break;s=f+-1|0;p=+h[v+(s<<3)>>3];h[v+(f<<3)>>3]=g;g=g+p;f=s}h[v>>3]=g;i=0;f=0;s=0;while(1){if((s|0)>=(b|0))break;q=c[(c[t+(s<<2)>>2]|0)+16>>2]|0;g=+h[d+(q<<5)>>3];p=+h[d+(q<<5)+8>>3];m=+h[d+(q<<5)+16>>3];o=+h[d+(q<<5)+24>>3];k=c[B>>2]|0;j=u+(f<<3)|0;r=f+1|0;do if(!(k&4)){n=+h[u+(r<<3)>>3];if(!(k&8)){g=(n+ +h[j>>3]-m-g)*.5;break}else{g=n-(m-g);break}}else g=+h[j>>3];while(0);c[A+(q<<3)>>2]=~~g;j=v+(i<<3)|0;e=i+1|0;if(!(k&16)){g=+h[v+(e<<3)>>3];if(!(k&32))g=(g+ +h[j>>3]-o-p)*.5}else g=+h[j>>3]-(o-p);c[A+(q<<3)+4>>2]=~~g;if(z){f=(r|0)==(y|0);i=f?e:i;f=f?0:r}else{q=(e|0)==(x|0);i=q?0:e;f=q?r:f}s=s+1|0}l6(w);l6(t);l6(u);l6(v);l=C;return A|0}function RG(a,b){a=a|0;b=b|0;var d=0;d=c[47100]|0;a=c[d+(c[(c[a>>2]|0)+16>>2]<<2)>>2]|0;b=c[d+(c[(c[b>>2]|0)+16>>2]<<2)>>2]|0;return ((a|0)>(b|0)?1:((a|0)<(b|0))<<31>>31)|0}function SG(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;a=c[a>>2]|0;b=c[b>>2]|0;e=+h[a+8>>3]+ +h[a>>3];d=+h[b+8>>3]+ +h[b>>3];return (ed)<<31>>31)|0}function TG(a,b,e){a=a|0;b=b|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0;t=l;l=l+96|0;r=t+80|0;s=t+48|0;q=t+8|0;n=t;m=(a*100|0)+-1|0;f=+(e<<1|0);o=0.0;p=0.0;e=0;while(1){if((e|0)>=(a|0))break;j=f+(+h[b+(e<<5)+16>>3]-+h[b+(e<<5)>>3]);k=f+(+h[b+(e<<5)+24>>3]-+h[b+(e<<5)+8>>3]);o=o-(j+k);p=p-j*k;e=e+1|0}j=+(m|0);k=o*o-j*4.0*p;if(!(k<0.0)){f=+G(+k);i=j*2.0;g=(f-o)/i;i=(-o-f)/i;e=~~g;e=(e|0)==0?1:e;if((d[195234]|0)>2){n=c[15715]|0;_3(99745,27,1,n)|0;h[q>>3]=j;h[q+8>>3]=o;h[q+16>>3]=p;h[q+24>>3]=k;h[q+32>>3]=f;z4(n,99773,q)|0;c[s>>2]=e;h[s+8>>3]=g;c[s+16>>2]=~~i;h[s+24>>3]=i;z4(n,99799,s)|0;h[r>>3]=p+(o*g+g*(j*g));h[r+8>>3]=p+(o*i+i*(j*i));z4(n,99821,r)|0}}else{h[n>>3]=k;dA(1,99718,n)|0;e=-1}l=t;return e|0}function UG(a,b,e,f,g,i){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0.0,x=0.0;v=l;l=l+32|0;u=v+16|0;t=v;q=+h[a>>3];r=+h[a+8>>3];o=+h[a+16>>3];p=+h[a+24>>3];s=IL()|0;k=c[g>>2]|0;a=k-f|0;m=c[g+4>>2]|0;j=m-f|0;k=f-~~(q+(q>=0.0?.5:-.5))+k+~~(o+(o>=0.0?.5:-.5))|0;m=f-~~(r+(r>=0.0?.5:-.5))+m+~~(p+(p>=0.0?.5:-.5))|0;if((a|0)>-1)g=(a|0)/(e|0)|0;else g=((a+1|0)/(e|0)|0)+-1|0;if((j|0)>-1)n=(j|0)/(e|0)|0;else n=((j+1|0)/(e|0)|0)+-1|0;if((k|0)>-1)k=(k|0)/(e|0)|0;else k=((k+1|0)/(e|0)|0)+-1|0;if((m|0)>-1)j=(m|0)/(e|0)|0;else j=((m+1|0)/(e|0)|0)+-1|0;while(1){if((g|0)>(k|0))break;else a=n;while(1){if((a|0)>(j|0))break;OL(s,g,a);a=a+1|0}g=g+1|0}m=b+4|0;c[m>>2]=SL(s)|0;k=RL(s)|0;n=b+8|0;c[n>>2]=k;x=+(f<<1|0);w=+(e|0);j=~~+R(+((x+(o-q))/w));a=~~+R(+((x+(p-r))/w));c[b>>2]=a+j;a:do if((d[195234]|0)>2){g=c[15715]|0;c[t>>2]=i;c[t+4>>2]=k;c[t+8>>2]=j;c[t+12>>2]=a;z4(g,99677,t)|0;a=0;while(1){if((a|0)>=(c[n>>2]|0))break a;i=c[m>>2]|0;t=c[i+(a<<3)+4>>2]|0;c[u>>2]=c[i+(a<<3)>>2];c[u+4>>2]=t;z4(g,99704,u)|0;a=a+1|0}}while(0);LL(s);l=v;return}function VG(a,b,e,f,g,i){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,S=0.0;P=l;l=l+128|0;G=P+112|0;F=P+104|0;O=P+16|0;N=P;I=P+64|0;J=P+56|0;A=P+40|0;B=P+96|0;z=P+88|0;w=P+24|0;x=P+80|0;y=P+72|0;L=c[g+8>>2]|0;H=c[g+12>>2]|0;D=(a|0)==0?b:a;M=IL()|0;K=b+16|0;C=c[K>>2]|0;u=+h[C+16>>3];E=(c[i>>2]|0)-~~(u+(u>=0.0?.5:-.5))|0;u=+h[C+24>>3];C=(c[i+4>>2]|0)-~~(u+(u>=0.0?.5:-.5))|0;a:do if((c[g+16>>2]|0)==1){w=IK((qB(b)|0)<<2)|0;a=0;i=gC(b)|0;while(1){if(!i)break;y=i+16|0;c[w+(a<<2)>>2]=c[(c[y>>2]|0)+112>>2];c[(c[y>>2]|0)+112>>2]=0;a=a+1|0;i=hC(b,i)|0}p=E-L|0;q=C-L|0;r=E+L|0;s=C+L|0;o=1;while(1){a=c[K>>2]|0;if((o|0)>(c[a+180>>2]|0))break;n=c[(c[a+184>>2]|0)+(o<<2)>>2]|0;j=c[n+16>>2]|0;u=+h[j+16>>3];a=~~(u+(u>=0.0?.5:-.5));u=+h[j+24>>3];i=~~(u+(u>=0.0?.5:-.5));u=+h[j+32>>3];g=~~(u+(u>=0.0?.5:-.5));u=+h[j+40>>3];j=~~(u+(u>=0.0?.5:-.5));b:do if((g|0)>(a|0)&(j|0)>(i|0)){a=p+a|0;k=q+i|0;g=r+g|0;m=s+j|0;if((a|0)>-1)i=(a|0)/(f|0)|0;else i=((a+1|0)/(f|0)|0)+-1|0;if((k|0)>-1)k=(k|0)/(f|0)|0;else k=((k+1|0)/(f|0)|0)+-1|0;if((g|0)>-1)j=(g|0)/(f|0)|0;else j=((g+1|0)/(f|0)|0)+-1|0;if((m|0)>-1)g=(m|0)/(f|0)|0;else g=((m+1|0)/(f|0)|0)+-1|0;while(1){if((i|0)>(j|0))break;else a=k;while(1){if((a|0)>(g|0))break;OL(M,i,a);a=a+1|0}i=i+1|0}a=gC(n)|0;while(1){if(!a)break b;c[(c[a+16>>2]|0)+212>>2]=n;a=hC(n,a)|0}}while(0);o=o+1|0}s=A+8|0;t=I+4|0;u=+(L|0);v=J+4|0;r=B+4|0;q=z+4|0;p=gC(b)|0;while(1){if(!p)break;hP(A,p);S=+h[A>>3];Q=+h[s>>3];n=~~(S+(S>=0.0?.5:-.5))+E|0;c[I>>2]=n;o=~~(Q+(Q>=0.0?.5:-.5))+C|0;c[t>>2]=o;i=p+16|0;a=c[i>>2]|0;c:do if(!(c[a+212>>2]|0)){c[J>>2]=~~(u+(+h[a+88>>3]+ +h[a+96>>3])*.5);c[v>>2]=~~(u+ +h[a+80>>3]*.5);c[F>>2]=c[I>>2];c[F+4>>2]=c[I+4>>2];c[G>>2]=c[J>>2];c[G+4>>2]=c[J+4>>2];_G(B,F,G);a=c[B>>2]|0;g=c[r>>2]|0;c[F>>2]=c[I>>2];c[F+4>>2]=c[I+4>>2];c[G>>2]=c[J>>2];c[G+4>>2]=c[J+4>>2];$G(z,F,G);j=c[z>>2]|0;k=c[q>>2]|0;if((a|0)>-1)i=(a|0)/(f|0)|0;else i=((a+1|0)/(f|0)|0)+-1|0;if((g|0)>-1)m=(g|0)/(f|0)|0;else m=((g+1|0)/(f|0)|0)+-1|0;if((j|0)>-1)j=(j|0)/(f|0)|0;else j=((j+1|0)/(f|0)|0)+-1|0;if((k|0)>-1)g=(k|0)/(f|0)|0;else g=((k+1|0)/(f|0)|0)+-1|0;while(1){if((i|0)>(j|0))break;else a=m;while(1){if((a|0)>(g|0))break;OL(M,i,a);a=a+1|0}i=i+1|0}if((n|0)>-1)a=(n|0)/(f|0)|0;else a=((n+1|0)/(f|0)|0)+-1|0;c[I>>2]=a;if((o|0)>-1)a=(o|0)/(f|0)|0;else a=((o+1|0)/(f|0)|0)+-1|0;c[t>>2]=a;a=UA(D,p)|0;while(1){if(!a)break c;c[G>>2]=c[I>>2];c[G+4>>2]=c[I+4>>2];aH(a,G,M,E,C,f,H);a=WA(D,a)|0}}else{if((n|0)>-1)a=(n|0)/(f|0)|0;else a=((n+1|0)/(f|0)|0)+-1|0;c[I>>2]=a;if((o|0)>-1)a=(o|0)/(f|0)|0;else a=((o+1|0)/(f|0)|0)+-1|0;c[t>>2]=a;a=UA(D,p)|0;while(1){if(!a)break c;if((c[(c[i>>2]|0)+212>>2]|0)!=(c[(c[(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0)){c[G>>2]=c[I>>2];c[G+4>>2]=c[I+4>>2];aH(a,G,M,E,C,f,H)}a=WA(D,a)|0}}while(0);p=hC(b,p)|0}a=0;i=gC(b)|0;while(1){if(!i)break;c[(c[i+16>>2]|0)+112>>2]=c[w+(a<<2)>>2];a=a+1|0;i=hC(b,i)|0}l6(w)}else{s=w+8|0;t=I+4|0;u=+(L|0);v=J+4|0;r=x+4|0;q=y+4|0;p=gC(b)|0;while(1){if(!p)break a;hP(w,p);Q=+h[w>>3];S=+h[s>>3];n=~~(Q+(Q>=0.0?.5:-.5))+E|0;c[I>>2]=n;o=~~(S+(S>=0.0?.5:-.5))+C|0;c[t>>2]=o;a=c[p+16>>2]|0;c[J>>2]=~~(u+(+h[a+88>>3]+ +h[a+96>>3])*.5);c[v>>2]=~~(u+ +h[a+80>>3]*.5);c[F>>2]=c[I>>2];c[F+4>>2]=c[I+4>>2];c[G>>2]=c[J>>2];c[G+4>>2]=c[J+4>>2];_G(x,F,G);a=c[x>>2]|0;g=c[r>>2]|0;c[F>>2]=c[I>>2];c[F+4>>2]=c[I+4>>2];c[G>>2]=c[J>>2];c[G+4>>2]=c[J+4>>2];$G(y,F,G);j=c[y>>2]|0;k=c[q>>2]|0;if((a|0)>-1)i=(a|0)/(f|0)|0;else i=((a+1|0)/(f|0)|0)+-1|0;if((g|0)>-1)m=(g|0)/(f|0)|0;else m=((g+1|0)/(f|0)|0)+-1|0;if((j|0)>-1)j=(j|0)/(f|0)|0;else j=((j+1|0)/(f|0)|0)+-1|0;if((k|0)>-1)g=(k|0)/(f|0)|0;else g=((k+1|0)/(f|0)|0)+-1|0;while(1){if((i|0)>(j|0))break;else a=m;while(1){if((a|0)>(g|0))break;OL(M,i,a);a=a+1|0}i=i+1|0}if((n|0)>-1)a=(n|0)/(f|0)|0;else a=((n+1|0)/(f|0)|0)+-1|0;c[I>>2]=a;if((o|0)>-1)a=(o|0)/(f|0)|0;else a=((o+1|0)/(f|0)|0)+-1|0;c[t>>2]=a;a=UA(D,p)|0;while(1){if(!a)break;c[G>>2]=c[I>>2];c[G+4>>2]=c[I+4>>2];aH(a,G,M,E,C,f,H);a=WA(D,a)|0}p=hC(b,p)|0}}while(0);j=e+4|0;c[j>>2]=SL(M)|0;k=e+8|0;c[k>>2]=RL(M)|0;i=c[K>>2]|0;Q=+(L<<1|0);S=+(f|0);a=~~+R(+((Q+(+h[i+32>>3]-+h[i+16>>3]))/S));i=~~+R(+((Q+(+h[i+40>>3]-+h[i+24>>3]))/S));c[e>>2]=i+a;d:do if((d[195234]|0)>2){g=c[15715]|0;e=HB(b)|0;b=c[k>>2]|0;c[N>>2]=e;c[N+4>>2]=b;c[N+8>>2]=a;c[N+12>>2]=i;z4(g,99677,N)|0;a=0;while(1){if((a|0)>=(c[k>>2]|0))break d;b=c[j>>2]|0;N=c[b+(a<<3)+4>>2]|0;c[O>>2]=c[b+(a<<3)>>2];c[O+4>>2]=N;z4(g,99704,O)|0;a=a+1|0}}while(0);LL(M);l=P;return}function WG(a,b){a=a|0;b=b|0;return (c[c[b>>2]>>2]|0)-(c[c[a>>2]>>2]|0)|0}function XG(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+32|0;i=k+16|0;j=k;m=c[a+4>>2]|0;h=c[a+8>>2]|0;c[e>>2]=0-(c[f>>2]|0);g=e+4|0;c[g>>2]=0-(c[f+4>>2]|0);a=0;f=m;while(1){if((a|0)>=(h|0))break;c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];ML(b,i);a=a+1|0;f=f+8|0}if((d[195234]|0)>1){m=c[15715]|0;b=c[e>>2]|0;e=c[g>>2]|0;c[j>>2]=h;c[j+4>>2]=b;c[j+8>>2]=e;z4(m,99651,j)|0}l=k;return}function YG(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k=0.0,l=0,m=0,n=0.0,o=0.0;m=c[b+12>>2]|0;j=+h[i+(m<<5)+24>>3]-+h[i+(m<<5)+8>>3];k=+h[i+(m<<5)+16>>3]-+h[i+(m<<5)>>3];if(!((a|0)==0?(o=+(g<<1|0),n=+(f|0),(ZG((~~+R(+((o+k)/n))|0)/-2|0,(~~+R(+((o+j)/n))|0)/-2|0,b,d,e,f,i)|0)!=0):0))l=3;a:do if((l|0)==3?(ZG(0,0,b,d,e,f,i)|0)==0:0)if((~~+R(+k)|0)<(~~+R(+j)|0)){m=1;while(1){l=0-m|0;a=0;while(1){if((a|0)<=(l|0)){g=l;break}if(ZG(l,a,b,d,e,f,i)|0)break a;a=a+-1|0}while(1){if((g|0)>=(m|0))break;if(ZG(g,a,b,d,e,f,i)|0)break a;g=g+1|0}while(1){if((a|0)>=(m|0))break;if(ZG(g,a,b,d,e,f,i)|0)break a;a=a+1|0}while(1){if((g|0)<=(l|0))break;if(ZG(g,a,b,d,e,f,i)|0)break a;g=g+-1|0}while(1){if((a|0)<=0)break;if(!(ZG(g,a,b,d,e,f,i)|0))a=a+-1|0;else break a}m=m+1|0}}else{m=1;while(1){l=0-m|0;a=0;while(1){if((a|0)>=(m|0)){g=l;break}if(ZG(a,l,b,d,e,f,i)|0)break a;a=a+1|0}while(1){if((g|0)>=(m|0))break;if(ZG(a,g,b,d,e,f,i)|0)break a;g=g+1|0}while(1){if((a|0)<=(l|0))break;if(ZG(a,g,b,d,e,f,i)|0)break a;a=a+-1|0}while(1){if((g|0)<=(l|0))break;if(ZG(a,g,b,d,e,f,i)|0)break a;g=g+-1|0}while(1){if((a|0)>=0)break;if(!(ZG(a,g,b,d,e,f,i)|0))a=a+1|0;else break a}m=m+1|0}}while(0);return}function ZG(a,b,e,f,g,i,j){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0;u=l;l=l+48|0;s=u+32|0;t=u+8|0;r=u;n=e+4|0;p=c[e+8>>2]|0;q=r+4|0;k=c[n>>2]|0;m=0;while(1){if((m|0)>=(p|0)){o=5;break}w=k;v=c[w+4>>2]|0;c[r>>2]=(c[w>>2]|0)+a;c[q>>2]=v+b;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];if(PL(f,s)|0){k=0;break}k=k+8|0;m=m+1|0}if((o|0)==5){e=c[e+12>>2]|0;y=+h[j+(e<<5)>>3];x=+h[j+(e<<5)+8>>3];c[g>>2]=(S(i,a)|0)-~~(y+(y>=0.0?.5:-.5));e=g+4|0;c[e>>2]=(S(i,b)|0)-~~(x+(x>=0.0?.5:-.5));k=c[n>>2]|0;m=0;while(1){if((m|0)>=(p|0))break;v=k;w=c[v+4>>2]|0;c[r>>2]=(c[v>>2]|0)+a;c[q>>2]=w+b;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];ML(f,s);k=k+8|0;m=m+1|0}if((d[195234]|0)>1){k=c[15715]|0;v=c[g>>2]|0;w=c[e>>2]|0;c[t>>2]=p;c[t+4>>2]=a;c[t+8>>2]=b;c[t+12>>2]=v;c[t+16>>2]=w;z4(k,99617,t)|0;k=1}else k=1}l=u;return k|0}function _G(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(c[b+4>>2]|0)-(c[d+4>>2]|0)|0;c[a>>2]=(c[b>>2]|0)-(c[d>>2]|0);c[a+4>>2]=e;return}function $G(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(c[d+4>>2]|0)+(c[b+4>>2]|0)|0;c[a>>2]=(c[d>>2]|0)+(c[b>>2]|0);c[a+4>>2]=e;return}function aH(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0;A=l;l=l+112|0;x=A+96|0;w=A+80|0;q=A+48|0;r=A+32|0;y=A+16|0;z=A;n=A+64|0;h[y>>3]=+(c[b>>2]|0);s=y+8|0;h[s>>3]=+(c[b+4>>2]|0);v=+(g|0);a:do if((i|0)!=0?(t=a+16|0,m=c[(c[t>>2]|0)+8>>2]|0,(m|0)!=0):0){p=+(e|0);o=+(f|0);i=z+8|0;e=0;while(1){if((e|0)>=(c[m+4>>2]|0))break a;n=c[m>>2]|0;b=c[n+(e*48|0)>>2]|0;g=c[n+(e*48|0)+4>>2]|0;f=c[n+(e*48|0)+8>>2]|0;a=c[n+(e*48|0)+12>>2]|0;m=n+(e*48|0)+16|0;c[q>>2]=c[m>>2];c[q+4>>2]=c[m+4>>2];c[q+8>>2]=c[m+8>>2];c[q+12>>2]=c[m+12>>2];n=n+(e*48|0)+32|0;c[r>>2]=c[n>>2];c[r+4>>2]=c[n+4>>2];c[r+8>>2]=c[n+8>>2];c[r+12>>2]=c[n+12>>2];if(!f){c[y>>2]=c[b>>2];c[y+4>>2]=c[b+4>>2];c[y+8>>2]=c[b+8>>2];c[y+12>>2]=c[b+12>>2];m=b+16|0;c[z>>2]=c[m>>2];c[z+4>>2]=c[m+4>>2];c[z+8>>2]=c[m+8>>2];c[z+12>>2]=c[m+12>>2];m=2}else{c[y>>2]=c[q>>2];c[y+4>>2]=c[q+4>>2];c[y+8>>2]=c[q+8>>2];c[y+12>>2]=c[q+12>>2];c[z>>2]=c[b>>2];c[z+4>>2]=c[b+4>>2];c[z+8>>2]=c[b+8>>2];c[z+12>>2]=c[b+12>>2];m=1}j=p+ +h[y>>3];h[y>>3]=j;k=o+ +h[s>>3];h[s>>3]=k;if(!(j>=0.0))j=(j+1.0)/v+-1.0;else j=j/v;h[y>>3]=j;if(!(k>=0.0))j=(k+1.0)/v+-1.0;else j=k/v;h[s>>3]=j;j=p+ +h[z>>3];h[z>>3]=j;k=o+ +h[i>>3];h[i>>3]=k;if(!(j>=0.0))j=(j+1.0)/v+-1.0;else j=j/v;h[z>>3]=j;if(!(k>=0.0))j=(k+1.0)/v+-1.0;else j=k/v;h[i>>3]=j;c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];NG(w,x,d);while(1){if((m|0)>=(g|0))break;c[y>>2]=c[z>>2];c[y+4>>2]=c[z+4>>2];c[y+8>>2]=c[z+8>>2];c[y+12>>2]=c[z+12>>2];f=b+(m<<4)|0;c[z>>2]=c[f>>2];c[z+4>>2]=c[f+4>>2];c[z+8>>2]=c[f+8>>2];c[z+12>>2]=c[f+12>>2];j=p+ +h[z>>3];h[z>>3]=j;k=o+ +h[i>>3];h[i>>3]=k;if(!(j>=0.0))j=(j+1.0)/v+-1.0;else j=j/v;h[z>>3]=j;if(!(k>=0.0))j=(k+1.0)/v+-1.0;else j=k/v;h[i>>3]=j;c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];NG(w,x,d);m=m+1|0}if(a|0){c[y>>2]=c[z>>2];c[y+4>>2]=c[z+4>>2];c[y+8>>2]=c[z+8>>2];c[y+12>>2]=c[z+12>>2];c[z>>2]=c[r>>2];c[z+4>>2]=c[r+4>>2];c[z+8>>2]=c[r+8>>2];c[z+12>>2]=c[r+12>>2];j=p+ +h[z>>3];h[z>>3]=j;k=o+ +h[i>>3];h[i>>3]=k;if(!(j>=0.0))j=(j+1.0)/v+-1.0;else j=j/v;h[z>>3]=j;if(!(k>=0.0))j=(k+1.0)/v+-1.0;else j=k/v;h[i>>3]=j;c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];NG(w,x,d)}e=e+1|0;m=c[(c[t>>2]|0)+8>>2]|0}}else u=4;while(0);if((u|0)==4){hP(n,c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0);c[z>>2]=c[n>>2];c[z+4>>2]=c[n+4>>2];c[z+8>>2]=c[n+8>>2];c[z+12>>2]=c[n+12>>2];j=+(e|0)+ +h[z>>3];h[z>>3]=j;m=z+8|0;k=+(f|0)+ +h[m>>3];h[m>>3]=k;if(!(j>=0.0))j=(j+1.0)/v+-1.0;else j=j/v;h[z>>3]=j;if(!(k>=0.0))j=(k+1.0)/v+-1.0;else j=k/v;h[m>>3]=j;c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];NG(w,x,d)}l=A;return}function bH(a,b,d){a=a|0;b=b|0;d=d|0;a:do if((a|0)<1)a=0;else switch(c[d+16>>2]|0){case 4:{a=QG(a,b,d)|0;break a}case 3:{a=cH(a,b,d)|0;break a}default:{a=0;break a}}while(0);return a|0}function cH(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+80|0;i=p+64|0;h=p+24|0;o=p+8|0;g=p;j=p+56|0;m=f+8|0;n=TG(b,e,c[m>>2]|0)|0;if(a[195234]|0){k=c[15715]|0;c[g>>2]=n;z4(k,99586,g)|0}a:do if((n|0)>=1){c[j+4>>2]=0;c[j>>2]=0;k=HK(b<<4)|0;f=0;while(1){if((f|0)>=(b|0))break;c[k+(f<<4)+12>>2]=f;q=e+(f<<5)|0;g=c[m>>2]|0;c[h>>2]=c[q>>2];c[h+4>>2]=c[q+4>>2];c[h+8>>2]=c[q+8>>2];c[h+12>>2]=c[q+12>>2];c[h+16>>2]=c[q+16>>2];c[h+20>>2]=c[q+20>>2];c[h+24>>2]=c[q+24>>2];c[h+28>>2]=c[q+28>>2];c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];UG(h,k+(f<<4)|0,n,g,i,195341);f=f+1|0}h=HK(b<<2)|0;f=0;while(1){if((f|0)>=(b|0))break;c[h+(f<<2)>>2]=k+(f<<4);f=f+1|0}k3(h,b,4,89);i=IL()|0;f=HK(b<<3)|0;g=0;while(1){if((g|0)>=(b|0))break;q=c[h+(g<<2)>>2]|0;YG(g,q,i,f+(c[q+12>>2]<<3)|0,n,c[m>>2]|0,e);g=g+1|0}l6(h);g=0;while(1){if((g|0)>=(b|0))break;l6(c[k+(g<<4)+4>>2]|0);g=g+1|0}l6(k);LL(i);if((d[195234]|0)>1){h=c[15715]|0;g=0;while(1){if((g|0)>=(b|0))break a;e=c[f+(g<<3)>>2]|0;q=c[f+(g<<3)+4>>2]|0;c[o>>2]=g;c[o+4>>2]=e;c[o+8>>2]=q;z4(h,99602,o)|0;g=g+1|0}}}else f=0;while(0);l=p;return f|0}function dH(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0;a:do if((a|0)<1)f=0-a|0;else{s=(e|0)==0;q=(f|0)==0;j=0;while(1){if((j|0)==(a|0)){f=0;break a}r=c[b+(j<<2)>>2]|0;g=s?r:e;k=c[d+(j<<3)>>2]|0;l=c[d+(j<<3)+4>>2]|0;m=+(k|0);n=m/72.0;o=+(l|0);p=o/72.0;i=gC(r)|0;while(1){if(!i)break;f=c[i+16>>2]|0;t=c[f+132>>2]|0;h[t>>3]=n+ +h[t>>3];t=t+8|0;h[t>>3]=p+ +h[t>>3];t=f+16|0;h[t>>3]=m+ +h[t>>3];t=f+24|0;h[t>>3]=o+ +h[t>>3];f=c[f+108>>2]|0;if(f|0){t=f+56|0;h[t>>3]=m+ +h[t>>3];t=f+64|0;h[t>>3]=o+ +h[t>>3]}b:do if(!q){f=UA(g,i)|0;while(1){if(!f)break b;eH(f,k,l);f=WA(g,f)|0}}while(0);i=hC(r,i)|0}fH(r,k,l);j=j+1|0}}while(0);return f|0}function eH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0;e=c[a+16>>2]|0;a=c[e+96>>2]|0;m=+(b|0);l=+(d|0);if(a|0){k=a+56|0;h[k>>3]=m+ +h[k>>3];k=a+64|0;h[k>>3]=l+ +h[k>>3]}a=c[e+108>>2]|0;if(a|0){k=a+56|0;h[k>>3]=m+ +h[k>>3];k=a+64|0;h[k>>3]=l+ +h[k>>3]}a=c[e+100>>2]|0;if(a|0){k=a+56|0;h[k>>3]=m+ +h[k>>3];k=a+64|0;h[k>>3]=l+ +h[k>>3]}a=c[e+104>>2]|0;if(a|0){k=a+56|0;h[k>>3]=m+ +h[k>>3];k=a+64|0;h[k>>3]=l+ +h[k>>3]}j=c[e+8>>2]|0;a:do if(j|0){d=c[j+4>>2]|0;a=0;while(1){if((a|0)>=(d|0))break a;k=c[j>>2]|0;e=c[k+(a*48|0)>>2]|0;f=c[k+(a*48|0)+4>>2]|0;g=c[k+(a*48|0)+8>>2]|0;i=c[k+(a*48|0)+12>>2]|0;b=0;while(1){if((b|0)>=(f|0))break;n=e+(b<<4)|0;h[n>>3]=m+ +h[n>>3];n=e+(b<<4)+8|0;h[n>>3]=l+ +h[n>>3];b=b+1|0}if(g|0){n=k+(a*48|0)+16|0;h[n>>3]=m+ +h[n>>3];n=k+(a*48|0)+24|0;h[n>>3]=l+ +h[n>>3]}if(i|0){n=k+(a*48|0)+32|0;h[n>>3]=m+ +h[n>>3];n=k+(a*48|0)+40|0;h[n>>3]=l+ +h[n>>3]}a=a+1|0}}while(0);return}function fH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0;j=b+16|0;b=c[j>>2]|0;o=b+16|0;m=b+24|0;f=b+32|0;b=b+40|0;g=+(d|0);l=g+ +h[f>>3];i=+(e|0);n=i+ +h[m>>3];k=i+ +h[b>>3];h[o>>3]=g+ +h[o>>3];h[m>>3]=n;h[f>>3]=l;h[b>>3]=k;b=c[j>>2]|0;f=c[b+12>>2]|0;if((f|0)!=0?(a[f+81>>0]|0)!=0:0){o=f+56|0;h[o>>3]=g+ +h[o>>3];f=f+64|0;h[f>>3]=i+ +h[f>>3];f=1}else f=1;while(1){if((f|0)>(c[b+180>>2]|0))break;fH(c[(c[b+184>>2]|0)+(f<<2)>>2]|0,d,e);f=f+1|0;b=c[j>>2]|0}return}function gH(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=OG(a,b,d,e)|0;if(!f)a=1;else{a=dH(a,b,f,d,c[e+12>>2]|0)|0;l6(f)}return a|0}function hH(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;p=l;l=l+32|0;o=p;n=gH(a,b,d,e)|0;if(!n){zP(d);m=(c[d+16>>2]|0)+16|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];c[o+16>>2]=c[m+16>>2];c[o+20>>2]=c[m+20>>2];c[o+24>>2]=c[m+24>>2];c[o+28>>2]=c[m+28>>2];f=o+8|0;g=o+16|0;i=o+24|0;e=0;while(1){if((e|0)>=(a|0))break;k=c[(c[b+(e<<2)>>2]|0)+16>>2]|0;j=c[k+180>>2]|0;k=k+184|0;d=1;while(1){if((d|0)>(j|0))break;r=c[(c[(c[k>>2]|0)+(d<<2)>>2]|0)+16>>2]|0;q=r+16|0;h[o>>3]=+h[(+h[o>>3]<+h[q>>3]?o:q)>>3];h[f>>3]=+h[(+h[f>>3]<+h[r+24>>3]?o:q)+8>>3];h[g>>3]=+h[(+h[g>>3]>+h[r+32>>3]?o:q)+16>>3];h[i>>3]=+h[(+h[i>>3]>+h[r+40>>3]?o:q)+24>>3];d=d+1|0}e=e+1|0}c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];c[m+16>>2]=c[o+16>>2];c[m+20>>2]=c[o+20>>2];c[m+24>>2]=c[o+24>>2];c[m+28>>2]=c[o+28>>2]}l=p;return n|0}function iH(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;h=l;l=l+16|0;g=h;if(!f)Aa(99835,99841,1400,99848);e=jH(b,e,e)|0;c[f+8>>2]=e;if(a[195234]|0){i=c[15715]|0;c[g>>2]=e;z4(i,99860,g)|0}c[f+12>>2]=0;c[f+20>>2]=0;kH(b,d,f)|0;l=h;return c[f+16>>2]|0}function jH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;f=i+4|0;g=NA(b,99990)|0;a:do if(g){c[h>>2]=f;h=(q4(g,137696,h)|0)==1;b=c[f>>2]|0;if(h&(b|0)>-1)d=b;else{switch(a[g>>0]|0){case 84:case 116:break;default:break a}d=e}}while(0);l=i;return d|0}function kH(a,b,c){a=a|0;b=b|0;c=c|0;return lH(NA(a,99873)|0,b,c)|0}function lH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0;u=l;l=l+64|0;r=u+40|0;q=u+32|0;t=u+24|0;s=u+16|0;m=u+8|0;k=u;i=u+48|0;j=u+44|0;if(!e)Aa(99835,99841,1292,99882);o=e+28|0;c[o>>2]=0;p=e+16|0;c[p>>2]=d;n=e+4|0;c[n>>2]=0;c[e+24>>2]=0;a:do if(b|0?(f=a[b>>0]|0,f<<24>>24):0)switch(f<<24>>24|0){case 97:{d=b+5|0;if(!(h2(b,99900,5)|0)){c[p>>2]=4;m=mH(d,e)|0;c[k>>2]=j;m=(q4(m,137696,k)|0)>0;d=c[j>>2]|0;if(!(m&(d|0)>0))break a;c[n>>2]=d;break a}else{if(h2(b,99906,6)|0)break a;c[p>>2]=5;c[m>>2]=i;m=(q4(d,99913,m)|0)>0;v=+g[i>>2];g[e>>2]=m&v>0.0?v:1.0;break a}}case 99:{if(f<<24>>24!=99)break a;if(f2(b,108307)|0)break a;c[p>>2]=1;break a}case 103:{if(f<<24>>24!=103)break a;if(f2(b,111795)|0)break a;c[p>>2]=3;break a}case 110:{if(f<<24>>24!=110)break a;if(f2(b,111782)|0)break a;c[p>>2]=2;break a}default:break a}while(0);if(a[195234]|0){d=c[15715]|0;_3(99916,11,1,d)|0;c[s>>2]=nH(c[p>>2]|0)|0;z4(d,99928,s)|0;if((c[p>>2]|0)==5){h[t>>3]=+g[e>>2];z4(d,99941,t)|0}c[q>>2]=c[n>>2];z4(d,99954,q)|0;c[r>>2]=c[o>>2];z4(d,99967,r)|0}l=u;return c[p>>2]|0}function mH(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;a:do if((a[b>>0]|0)==95){f=d+28|0;e=1;while(1){b=b+1|0;b:while(1){if(!e)break a;d=a[b>>0]|0;if(!(d<<24>>24))break a;switch(d<<24>>24|0){case 99:{g=10;break b}case 105:{g=9;break b}case 117:{g=11;break b}case 116:{g=12;break b}case 98:{d=32;break b}case 108:{g=7;break b}case 114:{g=8;break b}default:e=0}}if((g|0)==7){g=0;d=4}else if((g|0)==8){g=0;d=8}else if((g|0)==9){g=0;d=64}else if((g|0)==10){g=0;d=1}else if((g|0)==11){g=0;d=2}else if((g|0)==12){g=0;d=16}c[f>>2]=c[f>>2]|d}}while(0);return b|0}function nH(a){a=a|0;switch(a|0){case 1:{a=108307;break}case 2:{a=111782;break}case 3:{a=111795;break}case 4:{a=99900;break}case 5:{a=99906;break}default:a=99980}return a|0}function oH(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+96|0;k=n;m=n+80|0;do if(a){if(!e){e=m6(1,20)|0;c[e+4>>2]=d>>>0>80?d:80}d=c[e>>2]|0;j=c[e+4>>2]|0;if(!d){h=100;d=a;i=m6(100,j)|0}else{h=d+100|0;i=n6(c[e+8>>2]|0,S(h,j)|0)|0;u6(i+(S(j,d)|0)|0,0,j*100|0)|0;d=a}while(1){d=pH(k,d,b,m)|0;if(!d)break;a=c[e>>2]|0;f=h<<1;g=S(h,j)|0;if((a|0)==(h|0)){i=n6(i,S(f,j)|0)|0;u6(i+g|0,0,g|0)|0;a=c[e>>2]|0}else f=h;a=i+(S(a,j)|0)|0;g=k;h=a+80|0;do{c[a>>2]=c[g>>2];a=a+4|0;g=g+4|0}while((a|0)<(h|0));c[e>>2]=(c[e>>2]|0)+1;h=f}if(c[m>>2]|0){m=e+16|0;c[m>>2]=c[m>>2]|1}d=c[e>>2]|0;if(!d){l6(i);l6(e);e=0;break}else{c[e+8>>2]=n6(i,S(d,j)|0)|0;break}}while(0);l=n;return e|0}function pH(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+80|0;n=r+64|0;g=r;c[f>>2]=0;do{h=a[d>>0]|0;d=d+1|0}while((X1(h)|0)!=0);p=(e|0)!=0;j=e+4|0;k=g+8|0;q=b+72|0;m=e+8|0;o=e+40|0;i=b+8|0;a:do switch(h|0){case 69:{c[b>>2]=0;d=qH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e>>2];break}case 101:{c[b>>2]=1;d=qH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e>>2];break}case 80:{c[b>>2]=2;d=rH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[j>>2];break}case 112:{c[b>>2]=3;d=rH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[j>>2];break}case 98:{c[b>>2]=4;d=rH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[m>>2];break}case 66:{c[b>>2]=5;d=rH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[m>>2];break}case 99:{d=sH(d,n)|0;if(!d){c[f>>2]=1;d=0;break a}m=tH(c[n>>2]|0,g)|0;c[n>>2]=m;if(!m){c[f>>2]=1;d=0;break a}if(!(c[g>>2]|0)){c[b>>2]=9;c[i>>2]=c[k>>2];if(!p)break a;c[q>>2]=c[e+24>>2];break a}else{c[b>>2]=14;h=i+64|0;do{c[i>>2]=c[g>>2];i=i+4|0;g=g+4|0}while((i|0)<(h|0));if(!p)break a;c[q>>2]=c[o>>2];break a}}case 67:{d=sH(d,n)|0;if(!d){c[f>>2]=1;d=0;break a}m=tH(c[n>>2]|0,g)|0;c[n>>2]=m;if(!m){c[f>>2]=1;d=0;break a}if(!(c[g>>2]|0)){c[b>>2]=8;c[i>>2]=c[k>>2];if(!p)break a;c[q>>2]=c[e+20>>2];break a}else{c[b>>2]=13;h=i+64|0;do{c[i>>2]=c[g>>2];i=i+4|0;g=g+4|0}while((i|0)<(h|0));if(!p)break a;c[q>>2]=c[o>>2];break a}}case 76:{c[b>>2]=6;d=rH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e+12>>2];break}case 84:{c[b>>2]=7;d=uH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}d=uH(d,b+16|0)|0;if(!d){c[f>>2]=1;d=0;break a}d=vH(d,b+24|0)|0;if(!d){c[f>>2]=1;d=0;break a}d=uH(d,b+32|0)|0;if(!d){c[f>>2]=1;d=0;break a}d=sH(d,b+40|0)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e+16>>2];break}case 70:{c[b>>2]=10;d=uH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}d=sH(d,b+16|0)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e+28>>2];break}case 83:{c[b>>2]=11;d=sH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e+32>>2];break}case 73:{c[b>>2]=12;d=qH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}d=sH(d,b+40|0)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e+36>>2];break}case 116:{c[b>>2]=15;d=wH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e+44>>2];break}case 0:{d=0;break}default:{c[f>>2]=1;d=0}}while(0);l=r;return d|0}function qH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0;i=l;l=l+16|0;e=i;h[b>>3]=+b6(a,e);f=c[e>>2]|0;if(((f|0)!=(a|0)?(h[b+8>>3]=+b6(f,e),g=c[e>>2]|0,(f|0)!=(g|0)):0)?(h[b+16>>3]=+b6(g,e),d=c[e>>2]|0,(g|0)!=(d|0)):0){h[b+24>>3]=+b6(d,e);a=c[e>>2]|0;a=(d|0)==(a|0)?0:a}else a=0;l=i;return a|0}function rH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+4|0;g=k;a=xH(a,j)|0;do if(a){d=c[j>>2]|0;i=m6(d,24)|0;c[b>>2]=d;e=i;f=0;while(1){if((f|0)>=(d|0)){d=9;break}h[e>>3]=+b6(a,g);d=c[g>>2]|0;if((a|0)==(d|0)){d=5;break}h[e+8>>3]=+b6(d,g);a=c[g>>2]|0;if((d|0)==(a|0)){d=7;break}h[e+16>>3]=0.0;e=e+24|0;d=c[b>>2]|0;f=f+1|0}if((d|0)==5){c[j>>2]=f;l6(i);a=0;break}else if((d|0)==7){c[j>>2]=f;l6(i);a=0;break}else if((d|0)==9){c[j>>2]=f;c[b+4>>2]=i;break}}else a=0;while(0);l=k;return a|0}function sH(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j;b=xH(b,i)|0;f=c[i>>2]|0;do if(!((b|0)==0|(f|0)<1)){do{h=a[b>>0]|0;e=h<<24>>24==0;b=b+1|0}while(h<<24>>24!=45&(e^1));if(!e){h=m6(f+1|0,1)|0;g=h;e=f;while(1){if((e|0)<=0){e=9;break}e=a[b>>0]|0;if(!(e<<24>>24)){e=8;break}a[g>>0]=e;e=(c[i>>2]|0)+-1|0;c[i>>2]=e;g=g+1|0;b=b+1|0}if((e|0)==8){l6(h);b=0;break}else if((e|0)==9){a[g>>0]=0;c[d>>2]=h;break}}else b=0}else b=0;while(0);l=j;return b|0}function tH(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=a[b>>0]|0;f=d+8|0;g=b+1|0;switch(e|0){case 91:{b=yH(g,d)|0;break}case 40:{b=zH(g,d)|0;break}case 47:case 35:{c[d>>2]=0;c[f>>2]=b;break}default:if(!(O2(e)|0))b=0;else{c[d>>2]=0;c[f>>2]=b}}return b|0}function uH(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0;f=l;l=l+16|0;d=f;e=+b6(a,d);d=c[d>>2]|0;if((d|0)==(a|0))d=0;else h[b>>3]=e;l=f;return d|0}function vH(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;a=xH(a,e)|0;e=c[e>>2]|0;c[b>>2]=(e|0)<0?0:e|0?2:1;l=d;return a|0}function wH(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[b>>2]=_1(a,e,10)|0;b=c[e>>2]|0;l=d;return ((b|0)==(a|0)?0:b)|0}function xH(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[b>>2]=$1(a,e,10)|0;b=c[e>>2]|0;l=d;return ((b|0)==(a|0)?0:b)|0}function yH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;m=o;c[b>>2]=1;n=b+8|0;i=uH(a,n)|0;do if(((((i|0)!=0?(j=uH(i,b+16|0)|0,(j|0)!=0):0)?(e=uH(j,b+24|0)|0,(e|0)!=0):0)?(f=uH(e,b+32|0)|0,(f|0)!=0):0)?(k=b+40|0,d=xH(f,k)|0,(d|0)!=0):0){b=c[k>>2]|0;f=m6(b,8)|0;e=0;while(1){if((e|0)>=(b|0)){d=13;break}d=uH(d,m)|0;if(!d){d=9;break}g[f+(e<<3)>>2]=+h[m>>3];d=sH(d,f+(e<<3)+4|0)|0;if(!d){d=12;break}e=e+1|0;b=c[k>>2]|0}if((d|0)==9){l6(f);a=0;break}else if((d|0)==12){l6(f);a=0;break}else if((d|0)==13){c[n+36>>2]=f;break}}else a=0;while(0);l=o;return a|0}function zH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;n=p;c[b>>2]=2;k=uH(a,b+8|0)|0;do if(((((((k|0)!=0?(m=uH(k,b+16|0)|0,(m|0)!=0):0)?(e=uH(m,b+24|0)|0,(e|0)!=0):0)?(f=uH(e,b+32|0)|0,(f|0)!=0):0)?(i=uH(f,b+40|0)|0,(i|0)!=0):0)?(j=uH(i,b+48|0)|0,(j|0)!=0):0)?(o=b+56|0,d=xH(j,o)|0,(d|0)!=0):0){e=c[o>>2]|0;i=m6(e,8)|0;f=0;while(1){if((f|0)>=(e|0)){d=15;break}d=uH(d,n)|0;if(!d){d=11;break}g[i+(f<<3)>>2]=+h[n>>3];d=sH(d,i+(f<<3)+4|0)|0;if(!d){d=14;break}f=f+1|0;e=c[o>>2]|0}if((d|0)==11){l6(i);a=0;break}else if((d|0)==14){l6(i);a=0;break}else if((d|0)==15){c[b+60>>2]=i;break}}else a=0;while(0);l=p;return a|0}function AH(a,b,c){a=a|0;b=b|0;c=c|0;return oH(a,b,c,0)|0}function BH(a){a=a|0;return AH(a,0,0)|0}function CH(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;e=c[a+12>>2]|0;if(a|0){f=c[a+8>>2]|0;g=a+4|0;h=(e|0)==0;b=0;while(1){if((b|0)>=(c[a>>2]|0))break;d=f+(S(c[g>>2]|0,b)|0)|0;if(!h)db[e&127](d);DH(d);b=b+1|0}l6(f);l6(a)}return}function DH(a){a=a|0;var b=0,d=0;b=a+8|0;d=b+4|0;switch(c[a>>2]|0){case 3:case 2:{l6(c[d>>2]|0);break}case 5:case 4:{l6(c[d>>2]|0);break}case 6:{l6(c[d>>2]|0);break}case 7:{l6(c[a+40>>2]|0);break}case 9:case 8:{l6(c[b>>2]|0);break}case 14:case 13:{EH(b);break}case 10:{l6(c[a+16>>2]|0);break}case 11:{l6(c[b>>2]|0);break}case 12:{l6(c[a+40>>2]|0);break}default:{}}return}function EH(a){a=a|0;var b=0,d=0,e=0;switch(c[a>>2]|0){case 1:{e=a+40|0;b=a+8+36|0;a=0;while(1){d=c[b>>2]|0;if((a|0)>=(c[e>>2]|0))break;l6(c[d+(a<<3)+4>>2]|0);a=a+1|0}l6(d);break}case 2:{e=a+56|0;d=a+60|0;a=0;while(1){b=c[d>>2]|0;if((a|0)>=(c[e>>2]|0))break;l6(c[b+(a<<3)+4>>2]|0);a=a+1|0}l6(b);break}default:{}}return}function FH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;k=o+4|0;n=o;c[d>>2]=0;c[e>>2]=(uB(uC(b)|0)|0)!=0&1;f=c[47253]|0;a:do if(f|0?(h=OA(b,f)|0,i=a[h>>0]|0,i<<24>>24):0){f=20432;while(1){g=c[f>>2]|0;if(!g)break a;if(i<<24>>24==(a[g>>0]|0)?(f2(h,g)|0)==0:0)break;f=f+12|0}c[d>>2]=c[f+4>>2];c[e>>2]=c[f+8>>2]}while(0);f=c[47264]|0;if((f|0?(c[e>>2]|0)==1:0)?(j=OA(b,f)|0,a[j>>0]|0):0)GH(j,e);f=c[47265]|0;if((f|0?(c[d>>2]|0)==1:0)?(m=OA(b,f)|0,a[m>>0]|0):0)GH(m,d);if(a[(c[b+16>>2]|0)+153>>0]|0){j=b+-48|0;i=uC(c[((c[b>>2]&3|0)==2?b:j)+40>>2]|0)|0;m=c[b>>2]&3;FH(fB(i,c[((m|0)==2?b:j)+40>>2]|0,c[((m|0)==3?b:b+48|0)+40>>2]|0,0,0)|0,k,n);c[e>>2]=c[k>>2]|c[e>>2];c[d>>2]=c[n>>2]|c[d>>2]}l=o;return}function GH(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;m=o;k=o+4|0;j=0;e=0;a:while(1){c[d>>2]=e;f=(j|0)<4;g=(j|0)==3;h=(j|0)==0;while(1){if(!(f&(a[b>>0]|0)!=0))break a;c[k>>2]=0;i=HH(b,k)|0;e=c[k>>2]|0;if(!e){n=5;break a}b=(e|0)==8;if(!(g&b)){if(!(h&b)){b=e;break}if(a[i>>0]|0){b=8;break}}c[k>>2]=0;b=i}e=c[d>>2]|b<<(j<<3);j=j+1|0;b=i}if((n|0)==5){c[m>>2]=b;dA(0,99995,m)|0}l=o;return}function HH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;c[e>>2]=0;d=IH(a,20492,e)|0;if((d|0)==(a|0)){while(1){d=IH(a,20508,e)|0;if((a|0)==(d|0))break;else a=d}d=IH(a,20556,e)|0}a=c[e>>2]|0;if((a|0)!=0&(a&15|0)==0){a=a|1;c[e>>2]=a}c[b>>2]=c[b>>2]|a;l=f;return d|0}function IH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;while(1){e=c[b>>2]|0;if(!e)break;f=D3(e)|0;if(!(h2(a,e,f)|0)){g=4;break}b=b+8|0}if((g|0)==4){c[d>>2]=c[d>>2]|c[b+4>>2];a=a+f|0}return a|0}function JH(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0,i=0;g=0;d=0.0;while(1){if((g|0)==4)break;f=b>>(g<<3)&15;e=1400;while(1){if(!(c[e+16>>2]|0))break;if((f|0)==(c[e>>2]|0)){i=6;break}e=e+24|0}if((i|0)==6){i=0;d=d+ +h[e+8>>3]}g=g+1|0}return +(d*10.0*+YO(a,c[47257]|0,1.0,0.0))}function KH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0,k=0.0,m=0.0,n=0,o=0.0,p=0,q=0,r=0,s=0;s=l;l=l+96|0;n=s+80|0;r=s;m=f>4.0?f*.25*.35:.35;k=+h[d+8>>3];o=m*k;i=+h[d>>3];m=m*i;f=+h[b>>3];i=i+f;h[n>>3]=i;e=+h[b+8>>3];k=k+e;h[n+8>>3]=k;d=r+64|0;p=r+32|0;q=r+16|0;j=r+24|0;if(!(g&32)){c[d>>2]=c[n>>2];c[d+4>>2]=c[n+4>>2];c[d+8>>2]=c[n+8>>2];c[d+12>>2]=c[n+12>>2];c[r>>2]=c[n>>2];c[r+4>>2]=c[n+4>>2];c[r+8>>2]=c[n+8>>2];c[r+12>>2]=c[n+12>>2];h[q>>3]=o+i;h[j>>3]=k-m;c[p>>2]=c[b>>2];c[p+4>>2]=c[b+4>>2];c[p+8>>2]=c[b+8>>2];c[p+12>>2]=c[b+12>>2];f=i;e=k}else{c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];c[r>>2]=c[b>>2];c[r+4>>2]=c[b+4>>2];c[r+8>>2]=c[b+8>>2];c[r+12>>2]=c[b+12>>2];h[q>>3]=o+f;h[j>>3]=e-m;c[p>>2]=c[n>>2];c[p+4>>2]=c[n+4>>2];c[p+8>>2]=c[n+8>>2];c[p+12>>2]=c[n+12>>2]}h[r+48>>3]=f-o;h[r+56>>3]=m+e;d=g>>>4&1^1;do if(!(g&64))if(!(g&128)){lS(a,q,3,d);break}else{lS(a,p,3,d);break}else lS(a,r,3,d);while(0);l=s;return}function LH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0,D=0,E=0;D=l;l=l+160|0;A=D+144|0;C=D;u=e*4.0;E=(g&32|0)!=0;z=E^1;u=!(u1.0)|z?0.0:(f+-1.0)*.05/e;y=+h[d+8>>3];v=-y;B=u*v;x=+h[d>>3];u=u*x;v=w*v;w=w*x;f=+h[b>>3];s=x+f;h[A>>3]=s;t=+h[b+8>>3];e=y+t;h[A+8>>3]=e;x=f+x*.5;y=y*.5+t;d=C+128|0;i=x-v;j=y-w;z=C+48|0;k=C+64|0;m=C+40|0;n=C+32|0;o=C+24|0;p=C+16|0;q=C+80|0;r=C+56|0;if(E){c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];c[C>>2]=c[b>>2];c[C+4>>2]=c[b+4>>2];c[C+8>>2]=c[b+8>>2];c[C+12>>2]=c[b+12>>2];h[p>>3]=s-B;h[o>>3]=e-u;h[n>>3]=i;h[m>>3]=j;h[z>>3]=s-v;h[r>>3]=e-w;c[k>>2]=c[A>>2];c[k+4>>2]=c[A+4>>2];c[k+8>>2]=c[A+8>>2];c[k+12>>2]=c[A+12>>2];h[q>>3]=v+s;i=w+e;f=s}else{c[d>>2]=c[A>>2];c[d+4>>2]=c[A+4>>2];c[d+8>>2]=c[A+8>>2];c[d+12>>2]=c[A+12>>2];c[C>>2]=c[A>>2];c[C+4>>2]=c[A+4>>2];c[C+8>>2]=c[A+8>>2];c[C+12>>2]=c[A+12>>2];h[p>>3]=f-B;h[o>>3]=t-u;h[n>>3]=i;h[m>>3]=j;h[z>>3]=f;h[r>>3]=t;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];h[q>>3]=f;i=t;e=t}h[C+88>>3]=i;h[C+96>>3]=v+x;h[C+104>>3]=w+y;h[C+112>>3]=B+f;h[C+120>>3]=u+e;do if(!(g&64))if(!(g&128)){lS(a,C,9,1);break}else{lS(a,z,6,1);break}else lS(a,C,6,1);while(0);l=D;return}function MH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0;q=l;l=l+64|0;p=q;t=+h[d+8>>3];s=+h[d>>3];k=+h[b>>3];e=s+k;m=+h[b+8>>3];f=t+m;i=k+s*.2;j=t*.2+m;k=k+s*.6;m=t*.6+m;h[p>>3]=i-t;h[p+8>>3]=s+j;n=p+16|0;h[n>>3]=t+i;o=p+24|0;h[o>>3]=j-s;h[p+32>>3]=t+k;h[p+40>>3]=m-s;h[p+48>>3]=k-t;h[p+56>>3]=s+m;if(!(g&64)){if(g&128|0){d=2;g=1;r=3}}else{d=3;g=0;r=3}if((r|0)==3){h[p+(g<<4)>>3]=i;h[p+(g<<4)+8>>3]=j;h[p+(d<<4)>>3]=k;h[p+(d<<4)+8>>3]=m}lS(a,p,4,1);c[p>>2]=c[b>>2];c[p+4>>2]=c[b+4>>2];c[p+8>>2]=c[b+8>>2];c[p+12>>2]=c[b+12>>2];h[n>>3]=e;h[o>>3]=f;oS(a,p,2);l=q;return}function NH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0;o=l;l=l+64|0;n=o;j=+h[d+8>>3];r=j*-.4;i=+h[d>>3];q=i*.4;t=+h[b>>3];e=t+i*.8;s=+h[b+8>>3];f=j*.8+s;i=i+t;j=j+s;h[n>>3]=r+t;k=n+8|0;h[k>>3]=q+s;d=n+16|0;h[d>>3]=t-r;m=n+24|0;h[m>>3]=s-q;h[n+32>>3]=e-r;h[n+40>>3]=f-q;h[n+48>>3]=r+e;h[n+56>>3]=q+f;if(!(g&64)){if(g&128|0){c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];d=2;p=5}}else{c[n>>2]=c[b>>2];c[n+4>>2]=c[b+4>>2];c[n+8>>2]=c[b+8>>2];c[n+12>>2]=c[b+12>>2];d=3;p=5}if((p|0)==5){h[n+(d<<4)>>3]=e;h[n+(d<<4)+8>>3]=f}lS(a,n,4,g>>>4&1^1);h[n>>3]=e;h[k>>3]=f;h[n+16>>3]=i;h[m>>3]=j;oS(a,n,2);l=o;return}function OH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;k=l;l=l+80|0;j=k;p=+h[d+8>>3];m=-p/3.0;r=+h[d>>3];f=r/3.0;q=+h[b>>3];n=q+r*.5;o=+h[b+8>>3];e=p*.5+o;i=j+64|0;h[j+64>>3]=r+q;h[j+72>>3]=p+o;c[j>>2]=c[i>>2];c[j+4>>2]=c[i+4>>2];c[j+8>>2]=c[i+8>>2];c[j+12>>2]=c[i+12>>2];h[j+16>>3]=m+n;h[j+24>>3]=f+e;i=j+32|0;c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];h[j+48>>3]=n-m;h[j+56>>3]=e-f;d=g>>>4&1^1;do if(!(g&64))if(!(g&128)){lS(a,j,4,d);break}else{lS(a,j,3,d);break}else lS(a,i,3,d);while(0);l=k;return}function PH(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=+e;f=f|0;var g=0,i=0,j=0.0;g=l;l=l+32|0;i=g;j=+h[c>>3];e=+h[c+8>>3];d=+G(+(j*j+e*e))*.5;j=j*.5+ +h[b>>3];h[i>>3]=j-d;e=e*.5+ +h[b+8>>3];h[i+8>>3]=e-d;h[i+16>>3]=d+j;h[i+24>>3]=d+e;kS(a,i,2,f>>>4&1^1);l=g;return}function QH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0;r=l;l=l+112|0;o=r+48|0;p=r+16|0;q=r;t=f>4.0?f*.5*.25:.5;s=+h[b>>3];m=+h[d>>3];f=+h[b+8>>3];e=+h[d+8>>3];k=t*e;t=t*m;c[p>>2]=c[b>>2];c[p+4>>2]=c[b+4>>2];c[p+8>>2]=c[b+8>>2];c[p+12>>2]=c[b+12>>2];h[p+16>>3]=s+m;h[p+24>>3]=f+e;h[o>>3]=t+(s-k);e=f+t+k;h[o+8>>3]=e;h[o+48>>3]=t+(s+k);f=f-t+k;h[o+56>>3]=f;m=k*-.95;i=t+(s+m);j=t*4.0/3.0;b=o+32|0;k=k*4.0/3.0;m=t+(s-m);d=o+16|0;n=o+24|0;if(!(g&32)){h[d>>3]=i-j;h[n>>3]=e-k;h[b>>3]=m-j;e=f-k}else{h[d>>3]=j+i;h[n>>3]=k+e;h[b>>3]=j+m;e=f+k}h[o+40>>3]=e;oS(a,p,2);if(!(g&64)){if(g&128|0)iP(q,o,3,.5,o,0)}else iP(q,o,3,.5,0,o);nS(a,o,4,0,0,0);l=r;return}function RH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0;g=l;l=l+32|0;i=g;e=+h[b>>3]+ +h[d>>3];f=+h[b+8>>3]+ +h[d+8>>3];c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];h[i+16>>3]=e;h[i+24>>3]=f;oS(a,i,2);l=g;return}function SH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0;n=l;l=l+80|0;j=n+72|0;k=n+8|0;m=n;i=+JH(a,g);i=i*i;h[m>>3]=i;c[f+12>>2]=g;g=f+32|0;a=e+3|0;f=b+(a<<4)|0;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];if((e|0)>(d|0)?(p=+h[b+(e<<4)>>3]-+h[f>>3],o=+h[b+(e<<4)+8>>3]-+h[b+(a<<4)+8>>3],p*p+o*o>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];q=k+32|0;a=b+(e+1<<4)|0;c[q>>2]=c[a>>2];c[q+4>>2]=c[a+4>>2];c[q+8>>2]=c[a+8>>2];c[q+12>>2]=c[a+12>>2];f=k+16|0;d=b+(e+2<<4)|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];c[j>>2]=k;c[j+4>>2]=m;ZN(j,92,k,1);c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];c[a>>2]=c[q>>2];c[a+4>>2]=c[q+4>>2];c[a+8>>2]=c[q+8>>2];c[a+12>>2]=c[q+12>>2];c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];m=b+(e+3<<4)|0;c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];l=n;return e|0}function TH(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0;f=c[a>>2]|0;e=+h[b>>3]-+h[f>>3];d=+h[b+8>>3]-+h[f+8>>3];return e*e+d*d<=+h[c[a+4>>2]>>3]|0}function UH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0;o=l;l=l+80|0;k=o+72|0;m=o+8|0;n=o;j=+JH(a,g);j=j*j;h[n>>3]=j;c[f+8>>2]=g;f=f+16|0;a=b+(d<<4)|0;c[f>>2]=c[a>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[f+12>>2]=c[a+12>>2];if(!((e|0)>(d|0)?(i=d+3|0,q=+h[a>>3]-+h[b+(i<<4)>>3],p=+h[b+(d<<4)+8>>3]-+h[b+(i<<4)+8>>3],q*q+p*p>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];g=m+16|0;d=b+(i+2<<4)|0;c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];r=m+32|0;a=b+(i+1<<4)|0;c[r>>2]=c[a>>2];c[r+4>>2]=c[a+4>>2];c[r+8>>2]=c[a+8>>2];c[r+12>>2]=c[a+12>>2];s=m+48|0;c[s>>2]=c[f>>2];c[s+4>>2]=c[f+4>>2];c[s+8>>2]=c[f+8>>2];c[s+12>>2]=c[f+12>>2];c[k>>2]=s;c[k+4>>2]=n;ZN(k,92,m,0);n=b+(i<<4)|0;c[n>>2]=c[s>>2];c[n+4>>2]=c[s+4>>2];c[n+8>>2]=c[s+8>>2];c[n+12>>2]=c[s+12>>2];c[a>>2]=c[r>>2];c[a+4>>2]=c[r+4>>2];c[a+8>>2]=c[r+8>>2];c[a+12>>2]=c[r+12>>2];c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];c[e>>2]=c[m>>2];c[e+4>>2]=c[m+4>>2];c[e+8>>2]=c[m+8>>2];c[e+12>>2]=c[m+12>>2];l=o;return i|0}function VH(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0;t=(g|0)!=0;p=(i|0)!=0;F=f+24|0;D=f+12|0;A=e+3|0;B=b+(A<<4)|0;x=e+1|0;E=f+16|0;A=b+(A<<4)+8|0;C=b+(x<<4)|0;z=f+32|0;v=b+(e<<4)|0;H=f+8|0;w=f+40|0;y=b+(e+2<<4)|0;x=b+(x<<4)+8|0;f=b+(e<<4)+8|0;if(!((e|0)==(d|0)&(t&p))){if(p){j=+JH(a,i);o=+h[v>>3];n=+h[f>>3];l=+h[B>>3];m=+h[A>>3];r=o-l;s=n-m;s=+G(+(r*r+s*s))*.9;j=j>=s?s:j;if(n==m){k=l+(o>3]=o;h[x>>3]=n;h[B>>3]=k;h[A>>3]=j;c[y>>2]=c[B>>2];c[y+4>>2]=c[B+4>>2];c[y+8>>2]=c[B+8>>2];c[y+12>>2]=c[B+12>>2];c[D>>2]=i;h[z>>3]=l;h[w>>3]=m}if(t){l=+JH(a,g);f=b+(d<<4)|0;k=+h[f>>3];j=+h[b+(d<<4)+8>>3];D=d+3|0;n=+h[b+(D<<4)>>3];o=+h[b+(D<<4)+8>>3];r=k-n;s=j-o;s=+G(+(r*r+s*s))*.9;l=l>=s?s:l;if(j==o){m=k+(k>3]=m;h[b+(D<<4)+8>>3]=l;c[f>>2]=c[u>>2];c[f+4>>2]=c[u+4>>2];c[f+8>>2]=c[u+8>>2];c[f+12>>2]=c[u+12>>2];u=d+2|0;h[b+(u<<4)>>3]=n;h[b+(u<<4)+8>>3]=o;u=16}}else{s=+h[v>>3];r=+h[f>>3];k=+h[B>>3];j=+h[A>>3];l=+JH(a,g);q=+JH(a,i);o=s-k;m=r-j;m=+G(+(o*o+m*m));d=!(l+q>=m);m=m/3.0;l=d?l:m;m=d?q:m;if(r==j){d=s>3]=q;h[x>>3]=n;c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];h[B>>3]=o;h[A>>3]=l;c[y>>2]=c[B>>2];c[y+4>>2]=c[B+4>>2];c[y+8>>2]=c[B+8>>2];c[y+12>>2]=c[B+12>>2];c[D>>2]=i;h[z>>3]=s;h[w>>3]=r;u=16}if((u|0)==16){c[H>>2]=g;h[E>>3]=k;h[F>>3]=j}return}function WH(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0;m=+h[b>>3];k=+h[c>>3]-m;o=+h[b+8>>3];j=+h[c+8>>3]-o;l=d*10.0/(+G(+(j*j+k*k))+.0001);k=(k+(k>=0.0?.0001:-.0001))*l;j=l*(j+(j>=0.0?.0001:-.0001));l=k*.5;n=j*.5;i=m-n;f=o-l;n=m+n;l=o+l;o=k+i;m=f+j;k=k+n;j=l+j;g=o>k?o:k;g=n>g?n:g;d=m>j?m:j;d=l>d?l:d;k=o>3]=i>3]=f>3]=i>g?i:g;h[a+24>>3]=f>d?f:d;return}function XH(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=+g;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0;q=l;l=l+48|0;m=q+32|0;k=q+16|0;p=q;n=(c[a+16>>2]|0)+12|0;o=c[n>>2]|0;c[n>>2]=b;jS(a,c[(c[a>>2]|0)+336>>2]|0);sS(a,g);t=+h[e>>3]-+h[d>>3];b=e+8|0;r=+h[b>>3]-+h[d+8>>3];s=10.0/(+G(+(r*r+t*t))+.0001);h[e>>3]=(t+(t>=0.0?.0001:-.0001))*s;h[b>>3]=s*(r+(r>=0.0?.0001:-.0001));b=0;while(1){if((b|0)>=4)break;j=i>>(b<<3)&255;if(!j)break;c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];YH(p,a,k,m,f,g,j);c[d>>2]=c[p>>2];c[d+4>>2]=c[p+4>>2];c[d+8>>2]=c[p+8>>2];c[d+12>>2]=c[p+12>>2];b=b+1|0}c[n>>2]=o;l=q;return}function YH(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=+g;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0;q=l;l=l+32|0;m=q+16|0;k=q;n=i&15;j=1400;while(1){o=c[j>>2]|0;if(!o)break;if((n|0)==(o|0)){p=4;break}j=j+24|0}if((p|0)==4){r=+h[j+8>>3]*f;h[e>>3]=+h[e>>3]*r;o=e+8|0;h[o>>3]=r*+h[o>>3];p=c[j+16>>2]|0;c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];nb[p&15](b,k,m,f,g,i);h[d>>3]=+h[d>>3]+ +h[e>>3];p=d+8|0;h[p>>3]=+h[p>>3]+ +h[o>>3]};c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];l=q;return}function ZH(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i+8|0;f=i;d=NA(b,100097)|0;if((d|0)!=0?(a[d>>0]|0)!=0:0){e=d;h=5}else{d=NA(b,100109)|0;if((d|0)!=0?(a[d>>0]|0)!=0:0){e=d;h=5}else d=0}if((h|0)==5){d=AH(e,0,120)|0;if(!d){c[f>>2]=HB(b)|0;dA(0,100116,f)|0;c[g>>2]=e;dA(3,100169,g)|0}}l=i;return d|0}function _H(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0;k=l;l=l+16|0;j=HK(304)|0;if(!j)dA(1,100177,k)|0;b=a+16|0;a=c[b>>2]|0;c[j>>2]=a;c[b>>2]=j;b=j+152|0;d=j+144|0;e=j+148|0;if(!a){c[d>>2]=3;c[e>>2]=0;h[b>>3]=1.0}else{f=j+16|0;g=a+16|0;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0));f=j+56|0;g=a+56|0;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0));c[d>>2]=c[a+144>>2];c[e>>2]=c[a+148>>2];h[b>>3]=+h[a+152>>3];c[j+136>>2]=c[a+136>>2];f=j+96|0;g=a+96|0;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0))}l=k;return j|0}function $H(a){a=a|0;var b=0;a=a+16|0;b=c[a>>2]|0;if(!b)Aa(100203,100207,117,100214);else{l6(c[b+212>>2]|0);l6(c[b+208>>2]|0);l6(c[b+216>>2]|0);l6(c[b+220>>2]|0);l6(c[b+224>>2]|0);l6(c[b+228>>2]|0);l6(c[b+232>>2]|0);l6(c[b+236>>2]|0);l6(c[b+240>>2]|0);l6(c[b+244>>2]|0);l6(c[b+248>>2]|0);l6(c[b+252>>2]|0);l6(c[b+256>>2]|0);l6(c[b+272>>2]|0);l6(c[b+284>>2]|0);l6(c[b+280>>2]|0);c[a>>2]=c[b>>2];l6(b);return}}function aI(d,e,f,g,h,i,j){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0;m=c[d+16>>2]|0;l=c[d+152>>2]|0;k=m+192|0;if((e|0)!=0&(l&32768|0)!=0)c[k>>2]=e;if(((l&65536|0)!=0?(c[m+212>>2]=CK(i,j)|0,(f|0)!=0):0)?(a[f>>0]|0)!=0:0){c[m+208>>2]=CK(f,j)|0;d=1}else d=0;do if(l&4194304){if(g|0?a[g>>0]|0:0){c[m+228>>2]=CK(g,j)|0;d=m+260|0;b[d>>1]=b[d>>1]|1;d=1;break}e=c[k>>2]|0;if(e){c[m+228>>2]=Y3(e)|0;d=1}}while(0);if((h|0)!=0&(l&8388608|0)!=0?(a[h>>0]|0)!=0:0){c[m+244>>2]=CK(h,j)|0;d=1}return d|0}function bI(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=l;l=l+80|0;i=j;h=j+8|0;g=c[(c[b>>2]|0)+168>>2]|0;f=c[(c[(c[g+16>>2]|0)+8>>2]|0)+92>>2]|0;cI(b,e);b=NA(d,141363)|0;if((b|0)!=0?(a[b>>0]|0)!=0:0){kA(e,b)|0;f=e+4|0;b=c[f>>2]|0;if(b>>>0>=(c[e+8>>2]|0)>>>0){iA(e,1)|0;b=c[f>>2]|0}a[b>>0]=0;b=c[e>>2]|0;c[f>>2]=b}else{if((g|0)!=(d|0)&(f|0)!=0){kA(e,f)|0;f=e+4|0;b=c[f>>2]|0;if(b>>>0>=(c[e+8>>2]|0)>>>0){iA(e,1)|0;b=c[f>>2]|0}c[f>>2]=b+1;a[b>>0]=95}switch(FC(d)|0){case 0:{f=(g|0)==(d|0)?111795:100228;b=(c[d>>2]|0)>>>4;break}case 1:{f=111782;b=(c[d>>2]|0)>>>4;break}case 2:{f=111751;b=(c[d>>2]|0)>>>4;break}default:{f=0;b=0}}kA(e,f)|0;c[i>>2]=b;i2(h,100234,i)|0;kA(e,h)|0;f=e+4|0;b=c[f>>2]|0;if(b>>>0>=(c[e+8>>2]|0)>>>0){iA(e,1)|0;b=c[f>>2]|0}a[b>>0]=0;b=c[e>>2]|0;c[f>>2]=b}l=j;return b|0}function cI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+144|0;h=i;g=i+8|0;e=c[b+160>>2]|0;if((e|0)>1?c[b+152>>2]&64|0:0){kA(d,c[(c[(c[b>>2]|0)+308>>2]|0)+(e<<2)>>2]|0)|0;f=d+4|0;e=c[f>>2]|0;if(e>>>0>=(c[d+8>>2]|0)>>>0){iA(d,1)|0;e=c[f>>2]|0}c[f>>2]=e+1;a[e>>0]=95}f=c[b+196>>2]|0;e=c[b+200>>2]|0;if((f|0)>0|(e|0)>0){c[h>>2]=f;c[h+4>>2]=e;i2(g,100238,h)|0;kA(d,g)|0}l=i;return}function dI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,i=0.0,j=0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0;s=l;l=l+48|0;p=s+16|0;f=s+32|0;q=s;r=+h[(c[a+16>>2]|0)+152>>3];o=eI(d,0,f)|0;if((o+-1|0)>>>0>=2){e=+h[b+16>>3];k=(+h[b>>3]+e)*.5;h[q>>3]=k;i=+h[b+24>>3];m=(+h[b+8>>3]+i)*.5;h[q+8>>3]=m;k=e-k;m=i-m;n=r>.5;if(n)sS(a,.5);j=c[f>>2]|0;i=0.0;f=c[j+8>>2]|0;while(1){d=c[f>>2]|0;if(!d)break;b=f+4|0;if(+g[b>>2]==0.0)e=i;else{hS(a,d);if(!(c[f+12>>2]|0))e=6.283185307179586;else e=i+ +g[b>>2]*6.283185307179586;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];b=GT(p,k,m,i,e)|0;nS(a,c[b>>2]|0,c[b+4>>2]|0,0,0,1);CY(b)}i=e;f=f+12|0}if(n)sS(a,r);fI(j)}l=s;return o|0}function eI(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;n=q+8|0;i=q;p=HK(12)|0;h=Y3(b)|0;a:do if(!d){d=1;f=h;while(1){switch(a[f>>0]|0){case 0:break a;case 58:{d=d+1|0;break}default:{}}f=f+1|0}}while(0);c[p+4>>2]=h;o=HK((d*12|0)+12|0)|0;c[p+8>>2]=o;j=1.0;f=0;d=0;while(1){h=i6(h,108285)|0;if(!h){h=20;break}k=+gI(h);if(!(k>=0.0)){h=17;break}m=k-j;if(m>0.0)if((c[5167]|0)!=0?!(m<1.0e-05&m>-1.0e-05):0){c[i>>2]=b;dA(0,100249,i)|0;c[5167]=0;k=j;d=3}else k=j;j=j-k;if(k>0.0)a[o+(f*12|0)+8>>0]=1;if(a[h>>0]|0)c[o+(f*12|0)>>2]=h;g[o+(f*12|0)+4>>2]=k;if(j<1.0e-05&j>-1.0e-05){h=30;break}else{f=f+1|0;h=0}}b:do if((h|0)==17){if(!(c[5167]|0))d=1;else{c[n>>2]=b;dA(1,100284,n)|0;c[5167]=0;d=2}fI(p)}else if((h|0)==20){b=f+-1|0;if(j>0.0){h=0;i=0;while(1){if((h|0)>=(f|0))break;n=(+g[o+(h*12|0)+4>>2]==0.0&1)+i|0;h=h+1|0;i=n}if((i|0)<=0){f=o+(b*12|0)+4|0;g[f>>2]=j+ +g[f>>2];f=b;h=30;break}j=j/+(i|0);h=0;while(1){if((h|0)>=(f|0)){f=b;h=30;break b}i=o+(h*12|0)+4|0;if(+g[i>>2]==0.0)g[i>>2]=j;h=h+1|0}}else{f=b;h=30}}while(0);if((h|0)==30){while(1){if((f|0)<=-1)break;if(+g[o+(f*12|0)+4>>2]>0.0)break;f=f+-1|0}n=f+1|0;c[o+(n*12|0)>>2]=0;c[p>>2]=n;c[e>>2]=p}l=q;return d|0}function fI(a){a=a|0;l6(c[a+4>>2]|0);l6(c[a+8>>2]|0);l6(a);return}function gI(b){b=b|0;var d=0.0,e=0,f=0,g=0;f=l;l=l+16|0;e=f;b=F3(b,59)|0;if(!b)d=0.0;else{g=b+1|0;a[b>>0]=0;d=+b6(g,e);d=(d>=0.0?(c[e>>2]|0)!=(g|0):0)?d:-1.0}l=f;return +d}function hI(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0;u=l;l=l+80|0;o=u+64|0;s=u;t=+h[(c[a+16>>2]|0)+152>>3];p=eI(d,0,o)|0;if((p+-1|0)>>>0>=2){q=s+16|0;d=s+48|0;i=b+48|0;r=s+32|0;j=b+32|0;k=b+16|0;if(!e){c[s>>2]=c[b>>2];c[s+4>>2]=c[b+4>>2];c[s+8>>2]=c[b+8>>2];c[s+12>>2]=c[b+12>>2];c[q>>2]=c[k>>2];c[q+4>>2]=c[k+4>>2];c[q+8>>2]=c[k+8>>2];c[q+12>>2]=c[k+12>>2];c[r>>2]=c[j>>2];c[r+4>>2]=c[j+4>>2];c[r+8>>2]=c[j+8>>2];c[r+12>>2]=c[j+12>>2];c[d>>2]=c[i>>2];c[d+4>>2]=c[i+4>>2];c[d+8>>2]=c[i+8>>2];c[d+12>>2]=c[i+12>>2]}else{c[s>>2]=c[j>>2];c[s+4>>2]=c[j+4>>2];c[s+8>>2]=c[j+8>>2];c[s+12>>2]=c[j+12>>2];c[q>>2]=c[i>>2];c[q+4>>2]=c[i+4>>2];c[q+8>>2]=c[i+8>>2];c[q+12>>2]=c[i+12>>2];c[r>>2]=c[b>>2];c[r+4>>2]=c[b+4>>2];c[r+8>>2]=c[b+8>>2];c[r+12>>2]=c[b+12>>2];c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2]}m=+h[q>>3];f=+h[s>>3];n=m-f;h[r>>3]=f;h[q>>3]=f;e=t>.5;if(e)sS(a,.5);k=c[o>>2]|0;b=s+48|0;j=c[k+8>>2]|0;while(1){d=c[j>>2]|0;if(!d)break;i=j+4|0;if(!(+g[i>>2]==0.0)){hS(a,d);if(!(c[j+12>>2]|0))f=m;else f=+h[s>>3]+n*+g[i>>2];h[r>>3]=f;h[q>>3]=f;lS(a,s,4,1);f=+h[q>>3];h[b>>3]=f;h[s>>3]=f}j=j+12|0}if(e)sS(a,t);fI(k)}l=u;return p|0}function iI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[a+16>>2]|0;e=c[a+152>>2]|0;if(e&4259840|0){f=e&131072;g=f>>>16^2;c[d+264>>2]=g;h=d+268|0;c[h>>2]=g+2;g=d+272|0;l6(c[g>>2]|0);d=HK(c[h>>2]<<4)|0;c[g>>2]=d;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];g=d+16|0;b=b+16|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];if(!(e&8192))LR(a,d,d,2)|0;if(!f)hK(d)}return}function jI(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0,f=0.0,g=0.0,i=0.0,j=0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+144|0;c=r+80|0;e=r+16|0;j=r;k=+h[b>>3];o=a+16|0;m=+h[o>>3];p=a+24|0;n=a+8|0;if(!(((((((((!(k>m)?(d=+h[a>>3],!(k>3],g=+h[p>>3],!(f>g)):0)?(i=+h[n>>3],!(f>3],!(k>m|k>3],!(k>g|k>3],!(k>m|k>3],!(k>g|k>3],!(k>m|k>3],!(m>g|m>3];if(!(d>+h[o>>3])){if(d<+h[a>>3]){c=a;q=15}}else{c=o;q=15}if((q|0)==15){q=0;h[c>>3]=d}d=+h[b+(e<<4)+8>>3];if(!(d>+h[p>>3])){if(d<+h[n>>3]){c=a;q=18}}else{c=o;q=18}if((q|0)==18){q=0;h[c+8>>3]=d}e=e+1|0}}while(0);l=r;return}function kI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0,h=0,i=0;b=l;l=l+48|0;d=b+32|0;e=b+16|0;f=b;i=a+48|0;h=a+16|0;c[f>>2]=c[a>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[f+12>>2]=c[a+12>>2];c[e>>2]=c[i>>2];c[e+4>>2]=c[i+4>>2];c[e+8>>2]=c[i+8>>2];c[e+12>>2]=c[i+12>>2];c[d>>2]=c[h>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];c[d+12>>2]=c[h+12>>2];g=+mK(f,e,d);h=a+32|0;c[f>>2]=c[a>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[f+12>>2]=c[a+12>>2];c[e>>2]=c[i>>2];c[e+4>>2]=c[i+4>>2];c[e+8>>2]=c[i+8>>2];c[e+12>>2]=c[i+12>>2];c[d>>2]=c[h>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];c[d+12>>2]=c[h+12>>2];a=g<4.0&+mK(f,e,d)<4.0&1;l=b;return a|0}function lI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0;G=l;l=l+272|0;x=G+256|0;y=G+224|0;z=G+192|0;A=G+160|0;B=G+64|0;C=G;D=G+128|0;E=G+96|0;F=G+32|0;w=c[d+16>>2]|0;v=c[w+144>>2]|0;u=w+16|0;c[A>>2]=c[u>>2];c[A+4>>2]=c[u+4>>2];c[A+8>>2]=c[u+8>>2];c[A+12>>2]=c[u+12>>2];c[A+16>>2]=c[u+16>>2];c[A+20>>2]=c[u+20>>2];c[A+24>>2]=c[u+24>>2];c[A+28>>2]=c[u+28>>2];w=c[(c[w+8>>2]|0)+88>>2]|0;c[C>>2]=0;c[C+4>>2]=0;c[C+8>>2]=0;c[C+12>>2]=0;c[C+16>>2]=0;c[C+20>>2]=0;c[C+24>>2]=0;c[C+28>>2]=0;if(!w){c[b>>2]=c[A>>2];c[b+4>>2]=c[A+4>>2];c[b+8>>2]=c[A+8>>2];c[b+12>>2]=c[A+12>>2];c[b+16>>2]=c[A+16>>2];c[b+20>>2]=c[A+20>>2];c[b+24>>2]=c[A+24>>2];c[b+28>>2]=c[A+28>>2]}else{d=A+16|0;if(+h[A>>3]==+h[d>>3]?(e=A+8|0,f=A+24|0,+h[e>>3]==+h[f>>3]):0){h[e>>3]=1797693134862315708145274.0e284;h[A>>3]=1797693134862315708145274.0e284;h[f>>3]=-1797693134862315708145274.0e284;h[d>>3]=-1797693134862315708145274.0e284}n=y+8|0;o=y+16|0;p=y+24|0;q=B+16|0;r=B+24|0;s=v+144|0;t=z+16|0;u=w+12|0;d=0;k=c[w+8>>2]|0;e=0;g=0.0;m=0;while(1){if((m|0)>=(c[w>>2]|0))break;c[B>>2]=c[C>>2];c[B+4>>2]=c[C+4>>2];c[B+8>>2]=c[C+8>>2];c[B+12>>2]=c[C+12>>2];c[B+16>>2]=c[C+16>>2];c[B+20>>2]=c[C+20>>2];c[B+24>>2]=c[C+24>>2];c[B+28>>2]=c[C+28>>2];j=k+8|0;f=k+80|0;i=j+4|0;switch(c[k>>2]|0){case 1:case 0:{K=+h[j>>3];J=+h[k+24>>3];h[y>>3]=K-J;I=+h[k+16>>3];H=+h[k+32>>3];h[n>>3]=I-H;h[o>>3]=K+J;h[p>>3]=I+H;c[f>>2]=c[y>>2];c[f+4>>2]=c[y+4>>2];c[f+8>>2]=c[y+8>>2];c[f+12>>2]=c[y+12>>2];j=k+96|0;c[j>>2]=c[o>>2];c[j+4>>2]=c[o+4>>2];c[j+8>>2]=c[o+8>>2];c[j+12>>2]=c[o+12>>2];c[x>>2]=c[y>>2];c[x+4>>2]=c[y+4>>2];c[x+8>>2]=c[y+8>>2];c[x+12>>2]=c[y+12>>2];mI(A,x);c[x>>2]=c[o>>2];c[x+4>>2]=c[o+4>>2];c[x+8>>2]=c[o+8>>2];c[x+12>>2]=c[o+12>>2];mI(A,x);break}case 3:case 2:{nI(D,c[i>>2]|0,c[j>>2]|0,A);c[f>>2]=c[D>>2];c[f+4>>2]=c[D+4>>2];c[f+8>>2]=c[D+8>>2];c[f+12>>2]=c[D+12>>2];c[f+16>>2]=c[D+16>>2];c[f+20>>2]=c[D+20>>2];c[f+24>>2]=c[D+24>>2];c[f+28>>2]=c[D+28>>2];break}case 5:case 4:{nI(E,c[i>>2]|0,c[j>>2]|0,A);c[f>>2]=c[E>>2];c[f+4>>2]=c[E+4>>2];c[f+8>>2]=c[E+8>>2];c[f+12>>2]=c[E+12>>2];c[f+16>>2]=c[E+16>>2];c[f+20>>2]=c[E+20>>2];c[f+24>>2]=c[E+24>>2];c[f+28>>2]=c[E+28>>2];break}case 6:{nI(F,c[i>>2]|0,c[j>>2]|0,A);c[f>>2]=c[F>>2];c[f+4>>2]=c[F+4>>2];c[f+8>>2]=c[F+8>>2];c[f+12>>2]=c[F+12>>2];c[f+16>>2]=c[F+16>>2];c[f+20>>2]=c[F+20>>2];c[f+24>>2]=c[F+24>>2];c[f+28>>2]=c[F+28>>2];break}case 7:{i=k+112|0;c[i>>2]=HK(56)|0;L=Y3(c[k+40>>2]|0)|0;M=c[i>>2]|0;c[M>>2]=L;a[M+48>>0]=a[100330+(c[k+24>>2]|0)>>0]|0;c[B>>2]=e;h[q>>3]=g;c[r>>2]=c[r>>2]&-128|d&127;M=c[s>>2]|0;M=eb[c[M>>2]&63](M,B,1)|0;L=c[i>>2]|0;c[L+4>>2]=M;JO(x,v,L);oI(z,+h[j>>3],+h[k+16>>3],c[i>>2]|0);c[f>>2]=c[z>>2];c[f+4>>2]=c[z+4>>2];c[f+8>>2]=c[z+8>>2];c[f+12>>2]=c[z+12>>2];c[f+16>>2]=c[z+16>>2];c[f+20>>2]=c[z+20>>2];c[f+24>>2]=c[z+24>>2];c[f+28>>2]=c[z+28>>2];c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];mI(A,x);c[x>>2]=c[t>>2];c[x+4>>2]=c[t+4>>2];c[x+8>>2]=c[t+8>>2];c[x+12>>2]=c[t+12>>2];mI(A,x);if(!(c[u>>2]|0))c[u>>2]=109;break}case 10:{e=c[k+16>>2]|0;g=+h[j>>3];break}case 15:{d=c[j>>2]|0;break}default:{}}k=k+120|0;m=m+1|0}c[b>>2]=c[A>>2];c[b+4>>2]=c[A+4>>2];c[b+8>>2]=c[A+8>>2];c[b+12>>2]=c[A+12>>2];c[b+16>>2]=c[A+16>>2];c[b+20>>2]=c[A+20>>2];c[b+24>>2]=c[A+24>>2];c[b+28>>2]=c[A+28>>2]}l=G;return}function mI(a,b){a=a|0;b=b|0;var c=0.0,d=0;c=+h[b>>3];d=a+16|0;if(c>+h[d>>3])h[d>>3]=c;if(c<+h[a>>3])h[a>>3]=c;c=+h[b+8>>3];b=a+24|0;if(c>+h[b>>3])h[b>>3]=c;b=a+8|0;if(c<+h[b>>3])h[b>>3]=c;return}function nI(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+48|0;k=r+32|0;n=r;f=+h[b>>3];o=n+16|0;h[o>>3]=f;h[n>>3]=f;f=+h[b+8>>3];p=n+24|0;h[p>>3]=f;m=n+8|0;h[m>>3]=f;j=1;while(1){if((j|0)>=(d|0))break;i=b+24|0;f=+h[i>>3];if(!(f<+h[n>>3])){if(f>+h[o>>3]){g=o;q=5}}else{g=n;q=5}if((q|0)==5){q=0;h[g>>3]=f}f=+h[b+32>>3];if(!(f<+h[m>>3])){if(f>+h[p>>3]){b=o;q=8}}else{b=n;q=8}if((q|0)==8){q=0;h[b+8>>3]=f}j=j+1|0;b=i}c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];mI(e,k);c[k>>2]=c[o>>2];c[k+4>>2]=c[o+4>>2];c[k+8>>2]=c[o+8>>2];c[k+12>>2]=c[o+12>>2];mI(e,k);c[a>>2]=c[n>>2];c[a+4>>2]=c[n+4>>2];c[a+8>>2]=c[n+8>>2];c[a+12>>2]=c[n+12>>2];c[a+16>>2]=c[n+16>>2];c[a+20>>2]=c[n+20>>2];c[a+24>>2]=c[n+24>>2];c[a+28>>2]=c[n+28>>2];l=r;return}function oI(b,c,d,e){b=b|0;c=+c;d=+d;e=e|0;var f=0.0,g=0,i=0,j=0,k=0.0,m=0,n=0;n=l;l=l+16|0;i=n+8|0;j=n;f=+h[e+32>>3];k=+h[e+40>>3];switch(a[e+48>>0]|0){case 108:{h[i>>3]=c;f=f+c;g=j;m=5;break}case 110:{f=f*.5;h[i>>3]=c-f;f=f+c;g=j;m=5;break}case 114:{h[j>>3]=c;f=c-f;g=i;m=5;break}default:{c=0.0;f=0.0}}if((m|0)==5){h[g>>3]=f;c=+h[i>>3];f=+h[j>>3]}d=+h[e+16>>3]+d;h[b>>3]=c;h[b+8>>3]=d-k;h[b+16>>3]=f;h[b+24>>3]=d;l=n;return}function pI(a){a=a|0;if((c[a>>2]|0)==7)zK(c[a+112>>2]|0,1);return}function qI(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0.0,j=0,k=0,m=0,n=0.0,o=0,p=0;m=l;l=l+16|0;k=m;j=c[b+152>>2]|0;g=+h[b+352>>3];n=+h[b+432>>3];f=g*n/72.0;h[b+488>>3]=f;i=+h[b+440>>3];g=g*i/72.0;h[b+496>>3]=g;h[b+520>>3]=n/72.0;i=i/72.0;e=b+528|0;h[e>>3]=i;if(c[47187]|j&4096|0)h[e>>3]=-i;p=(c[b+360>>2]|0)==0;o=b+376|0;n=+((c[b+452>>2]|0)>>>0);e=b+368|0;h[(p?e:o)>>3]=+((c[b+448>>2]|0)>>>0)/(p?f:g);h[(p?o:e)>>3]=n/(p?g:f);pS(b,_O(d,DA(d,0,101823,0)|0,195341)|0);c[b+160>>2]=0;rI(b,d);if(j&2|0)sI(b,d);e=gC(d)|0;while(1){if(!e)break;a[(c[e+16>>2]|0)+116>>0]=0;e=hC(d,e)|0}tI(b,k);while(1){if(!((uI(b)|0)<<24>>24))break;if((vI(b)|0)>1)QR(b);wI(b);while(1){if(!((xI(b)|0)<<24>>24))break;yI(b,d);zI(b)}if((vI(b)|0)>1)RR(b);AI(b,k)}BI(b);l=m;return}function rI(a,b){a=a|0;b=b|0;var d=0;d=_H(a)|0;c[d+4>>2]=0;c[d+8>>2]=b;c[d+12>>2]=0;AJ(a,c[(c[b+16>>2]|0)+12>>2]|0,b);MR(a,b);return}function sI(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;hS(b,135101);d=NA(c,141280)|0;if(d|0?a[d>>0]|0:0)hS(b,d);d=NA(c,101747)|0;if(d|0?a[d>>0]|0:0)fS(b,d);MJ(b,c);g=gC(c)|0;while(1){if(!g)break;d=NA(g,141126)|0;if(d|0?a[d>>0]|0:0)fS(b,d);d=NA(g,138032)|0;if(d|0?a[d>>0]|0:0)hS(b,d);d=NA(g,101719)|0;do if(d|0?a[d>>0]|0:0){if(!(F3(d,58)|0)){fS(b,d);break}e=Y3(d)|0;d=e;while(1){d=i6(d,108285)|0;if(!d)break;if(!(a[d>>0]|0)){d=0;continue}fS(b,d);d=0}l6(e)}while(0);d=NA(g,101747)|0;if(d|0?a[d>>0]|0:0)fS(b,d);f=UA(c,g)|0;while(1){if(!f)break;d=NA(f,141126)|0;do if(d|0?a[d>>0]|0:0){if(!(F3(d,58)|0)){fS(b,d);break}e=Y3(d)|0;d=e;while(1){d=i6(d,108285)|0;if(!d)break;if(!(a[d>>0]|0)){d=0;continue}fS(b,d);d=0}l6(e)}while(0);d=NA(f,101747)|0;if(d|0?a[d>>0]|0:0)fS(b,d);f=WA(c,f)|0}g=hC(c,g)|0}return}function tI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;e=m+8|0;j=m;h=c[a>>2]|0;d=c[h+312>>2]|0;g=a+156|0;c[g>>2]=d;h=c[h+316>>2]|0;i=a+152|0;f=a+52|0;k=a+160|0;if(!h)if((d|0)>1?(c[i>>2]&64|0)==0:0){c[e>>2]=c[f>>2];dA(0,100868,e)|0;c[g>>2]=1;d=0;a=1}else{d=0;a=1}else{a=h+4|0;if((c[h>>2]|0)>1?(c[i>>2]&64|0)==0:0){c[j>>2]=c[f>>2];dA(0,100868,j)|0;c[h+8>>2]=(c[g>>2]|0)+1}d=h+8|0;a=c[a>>2]|0}c[k>>2]=a;c[b>>2]=d;l=m;return}function uI(a){a=a|0;return (c[a+160>>2]|0)<=(c[a+156>>2]|0)|0}function vI(a){a=a|0;var b=0;b=c[(c[a>>2]|0)+316>>2]|0;return c[((b|0)==0?a+156|0:b)>>2]|0}function wI(a){a=a|0;var b=0,d=0;d=a+172|0;b=c[d+4>>2]|0;a=a+196|0;c[a>>2]=c[d>>2];c[a+4>>2]=b;return}function xI(a){a=a|0;var b=0,d=0;d=c[a+196>>2]|0;if(((d|0)>-1?(d|0)<(c[a+164>>2]|0):0)?(b=c[a+200>>2]|0,(b|0)>-1):0)a=(b|0)<(c[a+168>>2]|0)&1;else a=0;return a|0}function yI(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=l;l=l+176|0;m=q;f=q+48|0;n=q+32|0;o=c[d+16>>2]|0;p=c[d+152>>2]|0;if((c[d+160>>2]|0)<=1?(c[d+196>>2]|0)<=0:0)h=0;else{hA(n,128,f);g=o+212|0;h=c[g>>2]|0;cI(d,n);kA(n,h)|0;i=n+4|0;f=c[i>>2]|0;if(f>>>0>=(c[n+8>>2]|0)>>>0){iA(n,1)|0;f=c[i>>2]|0}a[f>>0]=0;j=c[n>>2]|0;c[i>>2]=j;c[g>>2]=j}FT(NA(e,100333)|0);DI(d);OR(d);fS(d,137615);hS(d,135101);i=o+208|0;j=o+260|0;do if(p&4259840|0){if((c[i>>2]|0)==0?(b[j>>1]&1)==0:0)break;if(p&655360){g=p&131072;c[o+264>>2]=g>>>16^2;f=HK((g>>>12^32)+32|0)|0;r=d+288|0;c[f>>2]=c[r>>2];c[f+4>>2]=c[r+4>>2];c[f+8>>2]=c[r+8>>2];c[f+12>>2]=c[r+12>>2];r=f+16|0;s=d+304|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];if(!g){hK(f);g=4}else g=2}else{f=0;g=0}if(!(p&8192))LR(d,f,f,g)|0;c[o+272>>2]=f;c[o+268>>2]=g}while(0);f=e+16|0;if(p&32768|0?(k=c[(c[f>>2]|0)+12>>2]|0,k|0):0)c[o+192>>2]=c[k>>2];g=(p&4|0)!=0;do if(!g){if((c[i>>2]|0)==0?(b[j>>1]&1)==0:0)break;s=d+256|0;c[m>>2]=c[s>>2];c[m+4>>2]=c[s+4>>2];c[m+8>>2]=c[s+8>>2];c[m+12>>2]=c[s+12>>2];c[m+16>>2]=c[s+16>>2];c[m+20>>2]=c[s+20>>2];c[m+24>>2]=c[s+24>>2];c[m+28>>2]=c[s+28>>2];iI(d,m);aS(d,c[i>>2]|0,c[o+228>>2]|0,c[o+244>>2]|0,c[o+212>>2]|0)}while(0);EI(d,e);f=c[(c[f>>2]|0)+12>>2]|0;if(f|0)BK(d,4,f);do if(!g){if((c[i>>2]|0)==0?(b[j>>1]&1)==0:0)break;bS(d)}while(0);FI(d,e,p);PR(d);if(h|0){lA(n);c[o+212>>2]=h}l=q;return}function zI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;h=l;l=l+32|0;d=h+24|0;b=h+16|0;j=h+8|0;f=h;g=a+196|0;i=a+188|0;c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[d>>2]=c[i>>2];c[d+4>>2]=c[i+4>>2];CI(j,b,d);i=c[j+4>>2]|0;e=g;c[e>>2]=c[j>>2];c[e+4>>2]=i;if(!((xI(a)|0)<<24>>24)){e=a+180|0;if(!(c[a+184>>2]|0))c[a+200>>2]=c[a+176>>2];else c[g>>2]=c[a+172>>2];c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];CI(f,b,d);i=c[f+4>>2]|0;j=g;c[j>>2]=c[f>>2];c[j+4>>2]=i}l=h;return}function AI(a,b){a=a|0;b=b|0;var d=0;d=c[b>>2]|0;a=a+160|0;if(!d)c[a>>2]=(c[a>>2]|0)+1;else{c[a>>2]=c[d>>2];c[b>>2]=d+4}return}function BI(a){a=a|0;NR(a);$H(a);return}function CI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(c[d+4>>2]|0)+(c[b+4>>2]|0)|0;c[a>>2]=(c[d>>2]|0)+(c[b>>2]|0);c[a+4>>2]=e;return}function DI(a){a=a|0;var b=0.0,d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0;v=l;l=l+48|0;n=v+32|0;g=v+24|0;j=v+8|0;k=v+16|0;m=v;e=a+196|0;d=c[e>>2]|0;e=c[e+4>>2]|0;o=g;c[o>>2]=d;c[o+4>>2]=e;o=a+164|0;i=c[o>>2]|0;o=c[o+4>>2]|0;u=j;c[u>>2]=i;c[u+4>>2]=o;u=a+360|0;if(c[u>>2]|0){c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];LJ(k,n);e=k;d=c[e>>2]|0;e=c[e+4>>2]|0;o=g;c[o>>2]=d;c[o+4>>2]=e;c[n>>2]=c[j>>2];c[n+4>>2]=c[j+4>>2];LJ(m,n);o=m;i=c[o>>2]|0;o=c[o+4>>2]|0;n=j;c[n>>2]=i;c[n+4>>2]=o}r=+(d|0);s=+h[a+320>>3];f=r*s-+h[a+240>>3];h[a+288>>3]=f;p=+(e|0);q=+h[a+328>>3];t=p*q-+h[a+248>>3];h[a+296>>3]=t;h[a+304>>3]=s+f;h[a+312>>3]=q+t;d=a+472|0;e=a+456|0;if(!(c[(c[a+12>>2]|0)+28>>2]|0)){c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2]}else{c[d>>2]=c[((c[d>>2]|0)<(c[e>>2]|0)?d:e)>>2];n=a+476|0;c[n>>2]=c[((c[n>>2]|0)<(c[a+460>>2]|0)?d:e)+4>>2];n=a+480|0;c[n>>2]=c[((c[n>>2]|0)>(c[a+464>>2]|0)?d:e)+8>>2];n=a+484|0;c[n>>2]=c[((c[n>>2]|0)>(c[a+468>>2]|0)?d:e)+12>>2]}j=c[a+152>>2]|0;b=+h[a+336>>3];d=a+256|0;e=a+264|0;f=+h[a+344>>3];g=a+272|0;if(!(j&128)){b=b+s*(r-+(i|0)*.5);h[d>>3]=b;t=f+q*(p-+(o|0)*.5);h[e>>3]=t;r=s+b;h[g>>3]=r;f=q+t;s=b;q=r}else{q=+h[a+368>>3]*.5;s=b-q;h[d>>3]=s;r=+h[a+376>>3]*.5;t=f-r;h[e>>3]=t;q=b+q;h[g>>3]=q;f=f+r}h[a+280>>3]=f;b=+h[a+352>>3];d=a+512|0;e=a+504|0;g=(c[47187]|j&4096|0)!=0;r=+h[a+384>>3]/b;b=+h[a+392>>3]/b;if(!(c[u>>2]|0)){h[e>>3]=r-s;p=b;b=b-t}else{h[d>>3]=-f-b;p=r;f=q;d=e;b=r-s}h[d>>3]=g?-f-p:b;l=v;return} -function EI(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+48|0;q=s;o=s+40|0;p=s+36|0;r=s+32|0;e=NA(d,141280)|0;if(!e){j=1;e=137499}else{i=(a[e>>0]|0)==0;j=i&1;e=i?137499:e}h=c[b+152>>2]|0;i=(a[e>>0]|0)==116;if(!(h&256))if(i){m=(f2(e,137680)|0)==0;k=m?137499:e;m=m?1:j;n=8}else{k=e;m=j;n=8}else if(!(i?!(f2(e,137680)|0):0)){k=e;m=j;n=8}if((n|0)==8?!((m|0)!=0&(h&33554432|0)!=0):0)if(!((HJ(k,o,p)|0)<<24>>24)){hS(b,k);fS(b,137680);r=b+256|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];c[q+16>>2]=c[r+16>>2];c[q+20>>2]=c[r+20>>2];c[q+24>>2]=c[r+24>>2];c[q+28>>2]=c[r+28>>2];mS(b,q,1)}else{c[r>>2]=0;i=c[o>>2]|0;hS(b,i);fS(b,137680);GJ(d,r)|0;e=c[o+4>>2]|0;h=XO(d,c[47197]|0,0,0)|0;f=+g[p>>2];if(!e)iS(b,137615,h,f);else iS(b,e,h,f);r=(c[r>>2]|0)>>>1&1|2;p=b+256|0;c[q>>2]=c[p>>2];c[q+4>>2]=c[p+4>>2];c[q+8>>2]=c[p+8>>2];c[q+12>>2]=c[p+12>>2];c[q+16>>2]=c[p+16>>2];c[q+20>>2]=c[p+20>>2];c[q+24>>2]=c[p+24>>2];c[q+28>>2]=c[p+28>>2];mS(b,q,r);l6(i)}e=c[(c[(c[d+16>>2]|0)+8>>2]|0)+88>>2]|0;if(e|0)JJ(b,e);l=s;return}function FI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=(c[a>>2]|0)+28|0;c[g>>2]=(c[g>>2]|0)+1;g=(d&4|0)!=0;if(!g)GI(a,b,d);a:do if(!(d&1)){if(d&16|0){WR(a);f=gC(b)|0;while(1){if(!f)break;e=UA(b,f)|0;while(1){if(!e)break;II(a,e);e=WA(b,e)|0}f=hC(b,f)|0}XR(a);UR(a);e=gC(b)|0;while(1){if(!e)break;HI(a,e);e=hC(b,e)|0}VR(a);break}if(!(d&8)){f=gC(b)|0;while(1){if(!f)break a;HI(a,f);e=UA(b,f)|0;while(1){if(!e)break;HI(a,c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0);II(a,e);e=WA(b,e)|0}f=hC(b,f)|0}}UR(a);e=gC(b)|0;while(1){if(!e)break;if((JI(b,e)|0)<<24>>24)HI(a,e);e=hC(b,e)|0}VR(a);WR(a);f=gC(b)|0;while(1){if(!f)break;e=UA(b,f)|0;while(1){if(!e)break;if((KI(b,e)|0)<<24>>24)II(a,e);e=WA(b,e)|0}f=hC(b,f)|0}XR(a)}else{UR(a);e=gC(b)|0;while(1){if(!e)break;HI(a,e);e=hC(b,e)|0}VR(a);WR(a);f=gC(b)|0;while(1){if(!f)break;e=UA(b,f)|0;while(1){if(!e)break;II(a,e);e=WA(b,e)|0}f=hC(b,f)|0}XR(a)}while(0);if(g)GI(a,b,d);return}function GI(e,f,i){e=e|0;f=f|0;i=i|0;var j=0,k=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;R=l;l=l+128|0;y=R+72|0;P=R+64|0;J=R+112|0;K=R;L=R+104|0;M=f+16|0;N=(i&4|0)!=0;O=e+16|0;z=K+24|0;A=K+56|0;C=K+8|0;D=K+16|0;E=K+32|0;F=K+40|0;G=K+48|0;H=(i&8|0)==0;I=L+4|0;x=1;while(1){j=c[M>>2]|0;if((x|0)>(c[j+180>>2]|0))break;w=c[(c[j+184>>2]|0)+(x<<2)>>2]|0;if((EJ(e,w)|0)<<24>>24){if(N)GI(e,w,i);FJ(e,w);j=c[O>>2]|0;s=j+208|0;if(!(c[s>>2]|0))v=(b[j+260>>1]&1)!=0;else v=1;FT(NA(w,100333)|0);t=j+212|0;u=j+228|0;q=j+244|0;r=w+16|0;if(!(N|v^1)){p=(c[r>>2]|0)+16|0;c[y>>2]=c[p>>2];c[y+4>>2]=c[p+4>>2];c[y+8>>2]=c[p+8>>2];c[y+12>>2]=c[p+12>>2];c[y+16>>2]=c[p+16>>2];c[y+20>>2]=c[p+20>>2];c[y+24>>2]=c[p+24>>2];c[y+28>>2]=c[p+28>>2];iI(e,y);aS(e,c[s>>2]|0,c[u>>2]|0,c[q>>2]|0,c[t>>2]|0)}c[J>>2]=0;j=GJ(w,J)|0;if(!j)o=0;else{jS(e,j);o=c[J>>2]&1}j=d[(c[r>>2]|0)+112>>0]|0;do if(!(j&1)){if(j&2|0){j=$O(w,c[47188]|0,106557)|0;k=$O(w,c[47189]|0,106565)|0;Q=29;break}if(j&8|0){j=$O(w,c[47192]|0,106573)|0;k=$O(w,c[47193]|0,106581)|0;Q=29;break}if(j&4|0){j=$O(w,c[47190]|0,106589)|0;k=$O(w,c[47191]|0,106597)|0;Q=29;break}j=NA(w,141126)|0;if(!j)k=0;else k=(a[j>>0]|0)==0?0:j;j=NA(w,138032)|0;if(!j)j=k;else j=(a[j>>0]|0)==0?k:j;m=NA(w,101719)|0;if(m)k=(a[m>>0]|0)==0?k:m;if(!((o|0)!=0&(k|0)!=0)){m=NA(w,141280)|0;if(m|0?a[m>>0]|0:0){k=m;Q=29;break}j=(j|0)==0?137615:j;m=(k|0)==0?135101:k;c[L>>2]=0;if(!o){k=0;o=m}else{o=m;Q=31}}else Q=29}else{j=$O(w,c[47188]|0,106541)|0;k=$O(w,c[47189]|0,106549)|0;Q=29}while(0);if((Q|0)==29){c[L>>2]=0;j=(j|0)==0?137615:j;o=(k|0)==0?135101:k;Q=31}if((Q|0)==31){Q=0;if(!((HJ(o,L,y)|0)<<24>>24)){hS(e,o);k=1}else{hS(e,c[L>>2]|0);k=c[I>>2]|0;m=XO(w,c[47197]|0,0,0)|0;n=+g[y>>2];if(!k)iS(e,137615,m,n);else iS(e,k,m,n);k=(c[J>>2]|0)>>>1&1|2}}m=c[47196]|0;if((m|0?(B=OA(w,m)|0,B|0):0)?a[B>>0]|0:0)sS(e,+YO(w,c[47196]|0,1.0,0.0));p=c[J>>2]|0;m=c[47195]|0;do if(p&4){m=XO(w,m,1,0)|0;if(m|k|0){o=c[r>>2]|0;S=o+16|0;c[K>>2]=c[S>>2];c[K+4>>2]=c[S+4>>2];c[K+8>>2]=c[S+8>>2];c[K+12>>2]=c[S+12>>2];o=o+32|0;c[E>>2]=c[o>>2];c[E+4>>2]=c[o+4>>2];c[E+8>>2]=c[o+8>>2];c[E+12>>2]=c[o+12>>2];h[D>>3]=+h[E>>3];h[z>>3]=+h[C>>3];h[G>>3]=+h[K>>3];h[A>>3]=+h[F>>3];if(!m)fS(e,137680);else fS(e,j);RM(e,K,4,p,k)}}else{if(!(p&64)){if(XO(w,m,1,0)|0){fS(e,j);S=(c[r>>2]|0)+16|0;c[y>>2]=c[S>>2];c[y+4>>2]=c[S+4>>2];c[y+8>>2]=c[S+8>>2];c[y+12>>2]=c[S+12>>2];c[y+16>>2]=c[S+16>>2];c[y+20>>2]=c[S+20>>2];c[y+24>>2]=c[S+24>>2];c[y+28>>2]=c[S+28>>2];mS(e,y,k);break}if(!k)break;fS(e,137680);S=(c[r>>2]|0)+16|0;c[y>>2]=c[S>>2];c[y+4>>2]=c[S+4>>2];c[y+8>>2]=c[S+8>>2];c[y+12>>2]=c[S+12>>2];c[y+16>>2]=c[S+16>>2];c[y+20>>2]=c[S+20>>2];c[y+24>>2]=c[S+24>>2];c[y+28>>2]=c[S+28>>2];mS(e,y,k);break}S=c[r>>2]|0;p=S+16|0;c[K>>2]=c[p>>2];c[K+4>>2]=c[p+4>>2];c[K+8>>2]=c[p+8>>2];c[K+12>>2]=c[p+12>>2];S=S+32|0;c[E>>2]=c[S>>2];c[E+4>>2]=c[S+4>>2];c[E+8>>2]=c[S+8>>2];c[E+12>>2]=c[S+12>>2];h[D>>3]=+h[E>>3];h[z>>3]=+h[C>>3];h[G>>3]=+h[K>>3];h[A>>3]=+h[F>>3];if(!(XO(w,m,1,0)|0))fS(e,137680);else fS(e,j);if((hI(e,K,o,0)|0)>1){c[P>>2]=HB(w)|0;dA(3,100701,P)|0}S=(c[r>>2]|0)+16|0;c[y>>2]=c[S>>2];c[y+4>>2]=c[S+4>>2];c[y+8>>2]=c[S+8>>2];c[y+12>>2]=c[S+12>>2];c[y+16>>2]=c[S+16>>2];c[y+20>>2]=c[S+20>>2];c[y+24>>2]=c[S+24>>2];c[y+28>>2]=c[S+28>>2];mS(e,y,0)}while(0);l6(c[L>>2]|0);j=c[(c[r>>2]|0)+12>>2]|0;if(j|0)BK(e,5,j);if(v){if(N){S=(c[r>>2]|0)+16|0;c[y>>2]=c[S>>2];c[y+4>>2]=c[S+4>>2];c[y+8>>2]=c[S+8>>2];c[y+12>>2]=c[S+12>>2];c[y+16>>2]=c[S+16>>2];c[y+20>>2]=c[S+20>>2];c[y+24>>2]=c[S+24>>2];c[y+28>>2]=c[S+28>>2];iI(e,y);aS(e,c[s>>2]|0,c[u>>2]|0,c[q>>2]|0,c[t>>2]|0)}bS(e)}a:do if(!H){k=gC(w)|0;while(1){if(!k)break a;HI(e,k);j=UA(w,k)|0;while(1){if(!j)break;II(e,j);j=WA(w,j)|0}k=hC(w,k)|0}}while(0);IJ(e,f);if(!N)GI(e,w,i)}x=x+1|0}l=R;return}function HI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=l;l=l+32|0;e=j;h=c[b>>2]|0;i=d+16|0;a:do if(((c[(c[i>>2]|0)+8>>2]|0?(wJ(b,uC(d)|0,d)|0)<<24>>24:0)?(k=b+256|0,c[e>>2]=c[k>>2],c[e+4>>2]=c[k+4>>2],c[e+8>>2]=c[k+8>>2],c[e+12>>2]=c[k+12>>2],c[e+16>>2]=c[k+16>>2],c[e+20>>2]=c[k+20>>2],c[e+24>>2]=c[k+24>>2],c[e+28>>2]=c[k+28>>2],(xJ(d,e)|0)<<24>>24):0)?(f=(c[i>>2]|0)+116|0,g=c[h+28>>2]|0,(a[f>>0]|0)!=(g|0)):0){a[f>>0]=g;pS(b,HB(d)|0);e=_O(d,c[47231]|0,195341)|0;if(a[e>>0]|0)pS(b,e);e=_O(d,c[47219]|0,195341)|0;b:do if(a[e>>0]|0){NI(e)|0;e=188404;while(1){f=e;e=e+4|0;f=c[f>>2]|0;if(!f)break b;if((a[f>>0]|0)!=105)continue;if(!(f2(f,134636)|0))break a}}while(0);yJ(b,d);lb[c[(c[(c[(c[i>>2]|0)+8>>2]|0)+4>>2]|0)+20>>2]&63](b,d);e=c[(c[i>>2]|0)+108>>2]|0;if(e|0?a[e+81>>0]|0:0)BK(b,10,e);zJ(b)}while(0);l=j;return}function II(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=l;l=l+32|0;g=h;e=b+256|0;c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];c[g+16>>2]=c[e+16>>2];c[g+20>>2]=c[e+20>>2];c[g+24>>2]=c[e+24>>2];c[g+28>>2]=c[e+28>>2];a:do if((LI(d,g)|0)<<24>>24?(f=d+-48|0,(MI(b,d)|0)<<24>>24):0){i=d+48|0;e=D3(HB(c[((c[d>>2]&3|0)==3?d:i)+40>>2]|0)|0)|0;e=k6(e+3+(D3(HB(c[((c[d>>2]&3|0)==2?d:f)+40>>2]|0)|0)|0)|0)|0;O3(e,HB(c[((c[d>>2]&3|0)==3?d:i)+40>>2]|0)|0)|0;i=(uB(uC(c[((c[d>>2]&3|0)==2?d:f)+40>>2]|0)|0)|0)==0;g=e+(D3(e)|0)|0;if(i){a[g>>0]=a[142050]|0;a[g+1>>0]=a[142051]|0;a[g+2>>0]=a[142052]|0}else{a[g>>0]=a[138041]|0;a[g+1>>0]=a[138042]|0;a[g+2>>0]=a[138043]|0}g6(e,HB(c[((c[d>>2]&3|0)==2?d:f)+40>>2]|0)|0)|0;pS(b,e);l6(e);e=_O(d,c[47260]|0,195341)|0;if(a[e>>0]|0)pS(b,e);e=_O(d,c[47254]|0,195341)|0;b:do if(!(a[e>>0]|0))e=0;else{NI(e)|0;e=188404;while(1){f=e;e=e+4|0;f=c[f>>2]|0;if(!f){e=188404;break b}if((a[f>>0]|0)!=105)continue;if(!(f2(f,134636)|0))break a}}while(0);OI(b,d,e);PI(b,d,e);QI(b)}while(0);l=h;return}function JI(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+16|0;a=1;while(1){e=c[d>>2]|0;if((a|0)>(c[e+180>>2]|0)){a=1;break}if(!(EC(c[(c[e+184>>2]|0)+(a<<2)>>2]|0,b)|0))a=a+1|0;else{a=0;break}}return a|0}function KI(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+16|0;a=1;while(1){e=c[d>>2]|0;if((a|0)>(c[e+180>>2]|0)){a=1;break}if(!(EC(c[(c[e+184>>2]|0)+(a<<2)>>2]|0,b)|0))a=a+1|0;else{a=0;break}}return a|0}function LI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+64|0;i=j+32|0;f=j;g=b+16|0;b=c[g>>2]|0;e=c[b+8>>2]|0;if((e|0)!=0?(e=e+8|0,c[f>>2]=c[e>>2],c[f+4>>2]=c[e+4>>2],c[f+8>>2]=c[e+8>>2],c[f+12>>2]=c[e+12>>2],c[f+16>>2]=c[e+16>>2],c[f+20>>2]=c[e+20>>2],c[f+24>>2]=c[e+24>>2],c[f+28>>2]=c[e+28>>2],c[i>>2]=c[d>>2],c[i+4>>2]=c[d+4>>2],c[i+8>>2]=c[d+8>>2],c[i+12>>2]=c[d+12>>2],c[i+16>>2]=c[d+16>>2],c[i+20>>2]=c[d+20>>2],c[i+24>>2]=c[d+24>>2],c[i+28>>2]=c[d+28>>2],(vJ(f,i)|0)!=0):0)b=1;else h=3;do if((h|0)==3){e=c[b+96>>2]|0;if(e){c[i>>2]=c[d>>2];c[i+4>>2]=c[d+4>>2];c[i+8>>2]=c[d+8>>2];c[i+12>>2]=c[d+12>>2];c[i+16>>2]=c[d+16>>2];c[i+20>>2]=c[d+20>>2];c[i+24>>2]=c[d+24>>2];c[i+28>>2]=c[d+28>>2];if((gQ(e,i)|0)<<24>>24){b=1;break}b=c[g>>2]|0}b=c[b+108>>2]|0;if((b|0?a[b+81>>0]|0:0)?(c[i>>2]=c[d>>2],c[i+4>>2]=c[d+4>>2],c[i+8>>2]=c[d+8>>2],c[i+12>>2]=c[d+12>>2],c[i+16>>2]=c[d+16>>2],c[i+20>>2]=c[d+20>>2],c[i+24>>2]=c[d+24>>2],c[i+28>>2]=c[d+28>>2],(gQ(b,i)|0)<<24>>24):0){b=1;break}b=0}while(0);l=j;return b|0}function MI(b,d){b=b|0;d=d|0;var e=0,f=0;a:do if((c[b+156>>2]|0)>=2?(e=_O(d,c[47259]|0,195341)|0,(rJ(b,e)|0)<<24>>24==0):0)if(!(a[e>>0]|0)){e=0;while(1){if((e|0)>=2){e=0;break a}f=(e|0)==1;f=_O(c[((c[d>>2]&3|0)==((f?2:3)|0)?d:d+((f?-1:1)*48|0)|0)+40>>2]|0,c[47229]|0,195341)|0;if(!(a[f>>0]|0)){e=1;break a}if(!((rJ(b,f)|0)<<24>>24))e=e+1|0;else{e=1;break}}}else e=0;else e=1;while(0);return e|0}function NI(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+192|0;q=r+24|0;p=r+16|0;o=r+8|0;n=r;i=r+48|0;m=r+32|0;if(a[100583]|0){hA(188668,128,195106);a[100583]=0}hA(m,128,r+56|0);c[i>>2]=b;j=m+4|0;k=m+8|0;d=0;h=0;a:while(1){b:while(1){e=pJ(i,m)|0;f=d<<24>>24!=0;if(!e){d=22;break a}g=d<<24>>24==0;switch(e|0){case 40:if(f){d=8;break a}else{d=1;continue b}case 41:if(g){d=10;break a}else{d=0;continue b}default:break b}}f=188404+(h<<2)|0;if(g){if((h|0)==63){d=13;break}e=c[47168]|0;if(e>>>0>=(c[47169]|0)>>>0){iA(188668,1)|0;e=c[47168]|0}c[47168]=e+1;a[e>>0]=0;c[f>>2]=c[47168];f=h+1|0}else f=h;e=c[j>>2]|0;if(e>>>0>=(c[k>>2]|0)>>>0){iA(m,1)|0;e=c[j>>2]|0}a[e>>0]=0;e=c[m>>2]|0;c[j>>2]=e;kA(188668,e)|0;e=c[47168]|0;if(e>>>0>=(c[47169]|0)>>>0){iA(188668,1)|0;e=c[47168]|0}c[47168]=e+1;a[e>>0]=0;h=f}do if((d|0)==8){c[n>>2]=b;dA(1,100584,n)|0;c[47101]=0;lA(m)}else if((d|0)==10){c[o>>2]=b;dA(1,100618,o)|0;c[47101]=0;lA(m)}else if((d|0)==13){c[p>>2]=b;dA(0,100646,p)|0;c[f>>2]=0;lA(m)}else if((d|0)==22){if(f){c[q>>2]=b;dA(1,100669,q)|0;c[47101]=0;lA(m);break}c[188404+(h<<2)>>2]=0;lA(m);d=c[47168]|0;if(d>>>0>=(c[47169]|0)>>>0){iA(188668,1)|0;d=c[47168]|0}a[d>>0]=0;c[47168]=c[47167]}while(0);l=r;return 188404}function OI(d,f,g){d=d|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=l;l=l+160|0;B=E+24|0;z=E+20|0;y=E+16|0;k=E;n=E+32|0;A=c[d+152>>2]|0;c[B>>2]=0;c[z>>2]=0;c[y>>2]=0;C=_H(d)|0;c[C+4>>2]=3;c[C+8>>2]=f;c[C+12>>2]=9;w=f+16|0;t=c[(c[w>>2]|0)+96>>2]|0;D=C+260|0;if((t|0?(a[t+82>>0]|0)==0:0)?(cP(NA(f,100406)|0,0)|0)<<24>>24:0)b[D>>1]=b[D>>1]|512;if(g|0?c[(c[w>>2]|0)+8>>2]|0:0)jS(d,g);g=c[47275]|0;if((g|0?(i=OA(f,g)|0,i|0):0)?a[i>>0]|0:0)sS(d,+YO(f,c[47275]|0,1.0,0.0));do if(A&16777216|0){g=f+48|0;i=C+176|0;if((e[(c[(uC(c[((c[f>>2]&3|0)==3?f:g)+40>>2]|0)|0)+16>>2]|0)+178>>1]|0)>2){m=+h[(c[(c[(c[((c[f>>2]&3|0)==3?f:g)+40>>2]|0)+16>>2]|0)+132>>2]|0)+16>>3]*72.0;h[i>>3]=+(~~(m+(m>=0.0?.5:-.5))|0);m=+h[(c[(c[(c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+132>>2]|0)+16>>3]*72.0;h[C+184>>3]=+(~~(m+(m>=0.0?.5:-.5))|0);break}else{c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;break}}while(0);r=C+200|0;s=C+204|0;q=C+192|0;if(A&32768|0){j=c[w>>2]|0;g=c[j+96>>2]|0;if(!g)g=c[q>>2]|0;else{g=c[g>>2]|0;c[q>>2]=g}i=C+196|0;c[i>>2]=g;c[s>>2]=g;c[r>>2]=g;g=c[j+108>>2]|0;if(g|0)c[i>>2]=c[g>>2];g=c[j+104>>2]|0;if(g|0)c[r>>2]=c[g>>2];g=c[j+100>>2]|0;if(g|0)c[s>>2]=c[g>>2]}t=C+208|0;if(!(A&65536))k=0;else{hA(k,128,n);c[C+212>>2]=CK(bI(d,f,k)|0,f)|0;lA(k);g=NA(f,141358)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=31;else{g=NA(f,111778)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=31;else j=0}if((p|0)==31)j=CK(g,f)|0;g=NA(f,100419)|0;i=(j|0)!=0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=36;else p=34;do if((p|0)==34){g=NA(f,100428)|0;if(g|0?a[g>>0]|0:0){p=36;break}if(i){g=Y3(j)|0;p=39}}while(0);if((p|0)==36){g=CK(g,f)|0;p=39}if((p|0)==39)c[t>>2]=g;g=NA(f,100436)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=44;else p=42;do if((p|0)==42){g=NA(f,100446)|0;if(g|0?a[g>>0]|0:0){p=44;break}if(i){g=Y3(j)|0;p=47}}while(0);if((p|0)==44){g=CK(g,f)|0;p=47}if((p|0)==47)c[C+216>>2]=g;g=NA(f,100455)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=52;else p=50;do if((p|0)==50){g=NA(f,100464)|0;if(g|0?a[g>>0]|0:0){p=52;break}if(i)c[C+220>>2]=Y3(j)|0}while(0);if((p|0)==52){c[C+220>>2]=CK(g,f)|0;b[D>>1]=b[D>>1]|128}g=NA(f,100472)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=59;else p=57;do if((p|0)==57){g=NA(f,100481)|0;if(g|0?a[g>>0]|0:0){p=59;break}if(i)c[C+224>>2]=Y3(j)|0}while(0);if((p|0)==59){c[C+224>>2]=CK(g,f)|0;b[D>>1]=b[D>>1]|256}k=j}o=C+244|0;do if(A&8388608){g=NA(f,141391)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)i=CK(g,f)|0;else i=0;g=NA(f,100489)|0;j=(i|0)!=0;if((g|0)!=0?(a[g>>0]|0)!=0:0){b[D>>1]=b[D>>1]|64;g=CK(g,f)|0;p=72}else p=70;if((p|0)==70?j:0){g=Y3(i)|0;p=72}if((p|0)==72)c[o>>2]=g;g=NA(f,100500)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0){g=CK(g,f)|0;p=78}else p=76;if((p|0)==76?j:0){g=Y3(i)|0;p=78}if((p|0)==78)c[C+248>>2]=g;g=NA(f,100512)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0){c[C+252>>2]=CK(g,f)|0;b[D>>1]=b[D>>1]|16}else p=82;if((p|0)==82?j:0)c[C+252>>2]=Y3(i)|0;g=NA(f,100523)|0;if(g|0?a[g>>0]|0:0){b[D>>1]=b[D>>1]|32;c[C+256>>2]=CK(g,f)|0;break}if(j)c[C+256>>2]=Y3(i)|0;else i=0}else i=0;while(0);do if(A&4194304|0){g=NA(f,141404)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=94;else p=92;do if((p|0)==92){g=NA(f,100534)|0;if(g|0?a[g>>0]|0:0){p=94;break}g=c[q>>2]|0;if(g|0)c[C+228>>2]=Y3(g)|0}while(0);if((p|0)==94){n=hJ(g,f)|0;c[C+228>>2]=CK(n,f)|0;l6(n);b[D>>1]=b[D>>1]|1}g=NA(f,100546)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0){n=hJ(g,f)|0;c[C+232>>2]=CK(n,f)|0;l6(n);b[D>>1]=b[D>>1]|8}else p=100;if((p|0)==100?(u=c[q>>2]|0,u|0):0)c[C+232>>2]=Y3(u)|0;g=NA(f,100559)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0){u=hJ(g,f)|0;c[C+236>>2]=CK(u,f)|0;l6(u);b[D>>1]=b[D>>1]|2}else p=105;if((p|0)==105?(v=c[r>>2]|0,v|0):0)c[C+236>>2]=Y3(v)|0;g=NA(f,100571)|0;if(g|0?a[g>>0]|0:0){v=hJ(g,f)|0;c[C+240>>2]=CK(v,f)|0;l6(v);b[D>>1]=b[D>>1]|4;break}g=c[s>>2]|0;if(g|0)c[C+240>>2]=Y3(g)|0}while(0);l6(k);l6(i);n=C+228|0;do if(A&4259840|0?(x=c[(c[w>>2]|0)+8>>2]|0,x|0):0){if(!(c[t>>2]|0)){if((A&524288|0)==0|(c[n>>2]|0)==0)break}else if(!(A&524288))break;m=+h[(c[d+16>>2]|0)+152>>3]*.5;m=m>2.0?m:2.0;i=c[x+4>>2]|0;g=0;while(1){if((g|0)>=(i|0))break;iJ(B,z,y,(c[x>>2]|0)+(g*48|0)|0,m);g=g+1|0}j=c[y>>2]|0;c[C+276>>2]=j;k=c[z>>2]|0;c[C+280>>2]=k;if(!(A&8192)){g=0;i=0;while(1){if((i|0)>=(j|0))break;g=(c[k+(i<<2)>>2]|0)+g|0;i=i+1|0}B=c[B>>2]|0;LR(d,B,B,g)|0;g=B}else g=c[B>>2]|0;c[C+284>>2]=g;c[C+264>>2]=2;c[C+272>>2]=g;c[C+268>>2]=c[k>>2]}while(0);_R(d,f);g=c[t>>2]|0;if(!((g|0)==0?!(b[D>>1]&1):0))aS(d,g,c[n>>2]|0,c[o>>2]|0,c[C+212>>2]|0);l=E;return}function PI(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0.0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0;T=l;l=l+240|0;P=T+224|0;O=T+208|0;z=T+144|0;y=T+112|0;S=T+64|0;C=T+48|0;D=T+32|0;E=T+16|0;F=T;G=T+192|0;H=T+176|0;A=T+160|0;B=T+128|0;c[E>>2]=0;c[E+4>>2]=0;c[E+8>>2]=0;c[E+12>>2]=0;Q=+h[(c[b+16>>2]|0)+152>>3];FT(NA(e,100333)|0);N=e+16|0;a:do if(c[(c[N>>2]|0)+8>>2]|0){R=+YO(e,c[47257]|0,1.0,0.0);k=_O(e,c[47238]|0,195341)|0;r=(f|0)!=0;b:do if(r){g=f;while(1){i=g;g=g+4|0;i=c[i>>2]|0;if(!i){p=0;break b}if((a[i>>0]|0)!=116)continue;if(!(f2(i,111418)|0)){p=1;break}}}else p=0;while(0);j=k;q=0;i=0;c:while(1){g=q+1|0;switch(a[j>>0]|0){case 0:break c;case 58:break;case 59:{g=q;i=i+1|0;break}default:g=q}j=j+1|0;q=g}o=(q|0)!=0;if((i|0)!=0&o)if(!(XI(b,e,f,k,g,R,Q)|0))break;else m=137615;else m=k;g=d[(c[N>>2]|0)+115>>0]|0;if(!(g&1))if(!(g&2))if(!(g&8))if(!(g&4)){u=m;g=$O(e,c[47239]|0,m)|0}else{j=106597;g=106589;k=188980;i=188976;n=18}else{j=106581;g=106573;k=188988;i=188984;n=18}else{j=106565;g=106557;k=188972;i=188968;n=18}else{j=106549;g=106541;k=188964;i=188960;n=18}if((n|0)==18){i=c[i>>2]|0;i=$O(e,i,YI(m,g)|0)|0;g=$O(e,c[k>>2]|0,j)|0;if((i|0)==(m|0))u=m;else{fS(b,i);u=i}}if((g|0)!=(m|0))hS(b,g);J=S+16|0;L=S+4|0;M=S+32|0;K=S+12|0;I=S+8|0;if(p<<24>>24){i=(a[u>>0]|0)==0?137615:u;g=(a[g>>0]|0)==0?137615:g;fS(b,137680);hS(b,i);o=S;m=c[c[(c[N>>2]|0)+8>>2]>>2]|0;n=o+48|0;do{c[o>>2]=c[m>>2];o=o+4|0;m=m+4|0}while((o|0)<(n|0));N=xO(S,ZI(e)|0,Q,0,0)|0;lS(b,c[N+8>>2]|0,c[N>>2]|0,1);_I(N);fS(b,i);if((g|0)!=(i|0))hS(b,g);g=c[I>>2]|0;if(g|0){N=c[S>>2]|0;c[O>>2]=c[J>>2];c[O+4>>2]=c[J+4>>2];c[O+8>>2]=c[J+8>>2];c[O+12>>2]=c[J+12>>2];c[P>>2]=c[N>>2];c[P+4>>2]=c[N+4>>2];c[P+8>>2]=c[N+8>>2];c[P+12>>2]=c[N+12>>2];XH(b,2,O,P,R,Q,g)}g=c[K>>2]|0;if(!g)break;S=(c[S>>2]|0)+((c[L>>2]|0)+-1<<4)|0;c[O>>2]=c[M>>2];c[O+4>>2]=c[M+4>>2];c[O+8>>2]=c[M+8>>2];c[O+12>>2]=c[M+12>>2];c[P>>2]=c[S>>2];c[P+4>>2]=c[S+4>>2];c[P+8>>2]=c[S+8>>2];c[P+12>>2]=c[S+12>>2];XH(b,3,O,P,R,Q,g);break}i=c[N>>2]|0;if(!o){do if(!(a[i+115>>0]&3)){if(a[u>>0]|0){fS(b,u);hS(b,g);break}fS(b,137615);if(!(a[g>>0]|0)){hS(b,137615);break}else{hS(b,g);break}}while(0);k=b+152|0;j=0;while(1){g=c[(c[N>>2]|0)+8>>2]|0;if((j|0)>=(c[g+4>>2]|0))break a;o=S;m=(c[g>>2]|0)+(j*48|0)|0;n=o+48|0;do{c[o>>2]=c[m>>2];o=o+4|0;m=m+4|0}while((o|0)<(n|0));g=c[S>>2]|0;i=c[L>>2]|0;do if(!(c[k>>2]&16384)){nS(b,g,i,0,0,0);g=c[I>>2]|0;if(g|0){H=c[S>>2]|0;c[O>>2]=c[J>>2];c[O+4>>2]=c[J+4>>2];c[O+8>>2]=c[J+8>>2];c[O+12>>2]=c[J+12>>2];c[P>>2]=c[H>>2];c[P+4>>2]=c[H+4>>2];c[P+8>>2]=c[H+8>>2];c[P+12>>2]=c[H+12>>2];XH(b,2,O,P,R,Q,g)}g=c[K>>2]|0;if(g|0){H=(c[S>>2]|0)+((c[L>>2]|0)+-1<<4)|0;c[O>>2]=c[M>>2];c[O+4>>2]=c[M+4>>2];c[O+8>>2]=c[M+8>>2];c[O+12>>2]=c[M+12>>2];c[P>>2]=c[H>>2];c[P+4>>2]=c[H+4>>2];c[P+8>>2]=c[H+8>>2];c[P+12>>2]=c[H+12>>2];XH(b,3,O,P,R,Q,g)}if((c[(c[(c[N>>2]|0)+8>>2]|0)+4>>2]|0)>1){if(!(c[I>>2]|0)){if(!(r&(c[K>>2]|0)!=0))break}else if(!r)break;jS(b,f)}}else nS(b,g,i,c[I>>2]|0,c[K>>2]|0,0);while(0);j=j+1|0}}w=c[(c[i+8>>2]|0)+4>>2]|0;v=w*48|0;x=k6(v)|0;v=k6(v)|0;t=+(q+2|0)*.5;e=C+8|0;f=D+8|0;r=E+8|0;s=F+8|0;q=0;while(1){if((q|0)>=(w|0))break;o=S;m=(c[c[(c[N>>2]|0)+8>>2]>>2]|0)+(q*48|0)|0;n=o+48|0;do{c[o>>2]=c[m>>2];o=o+4|0;m=m+4|0}while((o|0)<(n|0));g=c[L>>2]|0;c[x+(q*48|0)+4>>2]=g;c[v+(q*48|0)+4>>2]=g;k=g<<4;j=k6(k)|0;c[x+(q*48|0)>>2]=j;k=k6(k)|0;c[v+(q*48|0)>>2]=k;i=c[S>>2]|0;c[F>>2]=c[i>>2];c[F+4>>2]=c[i+4>>2];c[F+8>>2]=c[i+8>>2];c[F+12>>2]=c[i+12>>2];i=0;while(1){m=j+(i<<4)|0;n=k+(i<<4)+8|0;o=k+(i<<4)|0;p=j+(i<<4)+8|0;if((i|0)>=(g+-1|0))break;c[C>>2]=c[F>>2];c[C+4>>2]=c[F+4>>2];c[C+8>>2]=c[F+8>>2];c[C+12>>2]=c[F+12>>2];g=i+1|0;U=(c[S>>2]|0)+(g<<4)|0;c[D>>2]=c[U>>2];c[D+4>>2]=c[U+4>>2];c[D+8>>2]=c[U+8>>2];c[D+12>>2]=c[U+12>>2];if(!i){c[O>>2]=c[C>>2];c[O+4>>2]=c[C+4>>2];c[O+8>>2]=c[C+8>>2];c[O+12>>2]=c[C+12>>2];c[P>>2]=c[D>>2];c[P+4>>2]=c[D+4>>2];c[P+8>>2]=c[D+8>>2];c[P+12>>2]=c[D+12>>2];$I(G,O,P);c[m>>2]=c[G>>2];c[m+4>>2]=c[G+4>>2];c[m+8>>2]=c[G+8>>2];c[m+12>>2]=c[G+12>>2]}else{c[O>>2]=c[E>>2];c[O+4>>2]=c[E+4>>2];c[O+8>>2]=c[E+8>>2];c[O+12>>2]=c[E+12>>2];c[P>>2]=c[D>>2];c[P+4>>2]=c[D+4>>2];c[P+8>>2]=c[D+8>>2];c[P+12>>2]=c[D+12>>2];$I(H,O,P);c[m>>2]=c[H>>2];c[m+4>>2]=c[H+4>>2];c[m+8>>2]=c[H+8>>2];c[m+12>>2]=c[H+12>>2]}Y=c[S>>2]|0;V=i+2|0;Z=Y+(V<<4)|0;c[E>>2]=c[Z>>2];c[E+4>>2]=c[Z+4>>2];c[E+8>>2]=c[Z+8>>2];c[E+12>>2]=c[Z+12>>2];U=i+3|0;Y=Y+(U<<4)|0;c[F>>2]=c[Y>>2];c[F+4>>2]=c[Y+4>>2];c[F+8>>2]=c[Y+8>>2];c[F+12>>2]=c[Y+12>>2];X=j+(g<<4)|0;W=j+(V<<4)|0;c[y>>2]=c[C>>2];c[y+4>>2]=c[C+4>>2];c[y+8>>2]=c[C+8>>2];c[y+12>>2]=c[C+12>>2];c[z>>2]=c[D>>2];c[z+4>>2]=c[D+4>>2];c[z+8>>2]=c[D+8>>2];c[z+12>>2]=c[D+12>>2];c[O>>2]=c[Z>>2];c[O+4>>2]=c[Z+4>>2];c[O+8>>2]=c[Z+8>>2];c[O+12>>2]=c[Z+12>>2];c[P>>2]=c[Y>>2];c[P+4>>2]=c[Y+4>>2];c[P+8>>2]=c[Y+8>>2];c[P+12>>2]=c[Y+12>>2];aJ(A,y,z,O,P);c[W>>2]=c[A>>2];c[W+4>>2]=c[A+4>>2];c[W+8>>2]=c[A+8>>2];c[W+12>>2]=c[A+12>>2];c[X>>2]=c[A>>2];c[X+4>>2]=c[A+4>>2];c[X+8>>2]=c[A+8>>2];c[X+12>>2]=c[A+12>>2];h[o>>3]=+h[C>>3]-t*+h[m>>3];h[n>>3]=+h[e>>3]-t*+h[p>>3];h[k+(g<<4)>>3]=+h[D>>3]-t*+h[X>>3];h[k+(g<<4)+8>>3]=+h[f>>3]-t*+h[j+(g<<4)+8>>3];h[k+(V<<4)>>3]=+h[E>>3]-t*+h[W>>3];h[k+(V<<4)+8>>3]=+h[r>>3]-t*+h[j+(V<<4)+8>>3];i=U;g=c[L>>2]|0}c[O>>2]=c[E>>2];c[O+4>>2]=c[E+4>>2];c[O+8>>2]=c[E+8>>2];c[O+12>>2]=c[E+12>>2];c[P>>2]=c[F>>2];c[P+4>>2]=c[F+4>>2];c[P+8>>2]=c[F+8>>2];c[P+12>>2]=c[F+12>>2];$I(B,O,P);c[m>>2]=c[B>>2];c[m+4>>2]=c[B+4>>2];c[m+8>>2]=c[B+8>>2];c[m+12>>2]=c[B+12>>2];h[o>>3]=+h[F>>3]-t*+h[m>>3];h[n>>3]=+h[s>>3]-t*+h[p>>3];q=q+1|0}s=Y3(u)|0;f=0;r=u;i=u;j=u;g=s;while(1){g=i6(g,108285)|0;if(!g)break;e=(a[g>>0]|0)==0?137615:g;if((e|0)!=(j|0))if(!(a[(c[N>>2]|0)+115>>0]&3)){fS(b,e);hS(b,e);j=e}else j=e;m=(f|0)==0;n=(f|1|0)==1;g=0;while(1){if((g|0)>=(w|0))break;o=c[v+(g*48|0)>>2]|0;p=c[x+(g*48|0)>>2]|0;q=c[v+(g*48|0)+4>>2]|0;k=0;while(1){if((k|0)>=(q|0))break;Z=o+(k<<4)|0;h[Z>>3]=+h[p+(k<<4)>>3]+ +h[Z>>3];Z=o+(k<<4)+8|0;h[Z>>3]=+h[p+(k<<4)+8>>3]+ +h[Z>>3];k=k+1|0}nS(b,o,q,0,0,0);g=g+1|0}f=f+1|0;r=m?e:r;i=n?e:i;g=0}g=c[I>>2]|0;if(!g)i=0;else{if(i){if(!(a[(c[N>>2]|0)+115>>0]&3)){fS(b,i);hS(b,i)}}else i=0;Z=c[S>>2]|0;c[O>>2]=c[J>>2];c[O+4>>2]=c[J+4>>2];c[O+8>>2]=c[J+8>>2];c[O+12>>2]=c[J+12>>2];c[P>>2]=c[Z>>2];c[P+4>>2]=c[Z+4>>2];c[P+8>>2]=c[Z+8>>2];c[P+12>>2]=c[Z+12>>2];XH(b,2,O,P,R,Q,g)}g=c[K>>2]|0;if(g|0){if((i|0)!=(r|0)?(a[(c[N>>2]|0)+115>>0]&3)==0:0){fS(b,r);hS(b,r);g=c[K>>2]|0}Z=(c[S>>2]|0)+((c[L>>2]|0)+-1<<4)|0;c[O>>2]=c[M>>2];c[O+4>>2]=c[M+4>>2];c[O+8>>2]=c[M+8>>2];c[O+12>>2]=c[M+12>>2];c[P>>2]=c[Z>>2];c[P+4>>2]=c[Z+4>>2];c[P+8>>2]=c[Z+8>>2];c[P+12>>2]=c[Z+12>>2];XH(b,3,O,P,R,Q,g)}l6(s);g=0;while(1){if((g|0)>=(w|0))break;l6(c[x+(g*48|0)>>2]|0);l6(c[v+(g*48|0)>>2]|0);g=g+1|0}l6(x);l6(v)}while(0);l=T;return}function QI(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=l;l=l+64|0;q=D+48|0;t=D+32|0;s=D+16|0;r=D;z=c[a+16>>2]|0;A=c[z+8>>2]|0;p=z+208|0;C=z+212|0;m=z+268|0;B=z+260|0;n=z+272|0;if(!((c[p>>2]|0)==0?!(b[B>>1]&1):0))d=3;a:do if((d|0)==3?(bS(a),o=z+276|0,e=c[o>>2]|0,e|0):0){h=z+280|0;d=c[h>>2]|0;i=z+284|0;j=z+228|0;k=z+244|0;f=c[d>>2]|0;g=1;while(1){if((g|0)>=(e|0))break a;c[m>>2]=c[d+(g<<2)>>2];c[n>>2]=(c[i>>2]|0)+(f<<4);aS(a,c[p>>2]|0,c[j>>2]|0,c[k>>2]|0,c[C>>2]|0);bS(a);y=c[h>>2]|0;f=(c[y+(g<<2)>>2]|0)+f|0;g=g+1|0;e=c[o>>2]|0;d=y}}while(0);c[m>>2]=0;c[n>>2]=0;o=A+16|0;d=c[o>>2]|0;e=c[d+8>>2]|0;p=z+236|0;u=z+240|0;v=z+224|0;w=z+256|0;x=z+220|0;y=z+252|0;if(e){m=c[e>>2]|0;d=c[m>>2]|0;n=c[m+8>>2]|0;k=m+16|0;c[s>>2]=c[k>>2];c[s+4>>2]=c[k+4>>2];c[s+8>>2]=c[k+8>>2];c[s+12>>2]=c[k+12>>2];m=m+32|0;c[r>>2]=c[m>>2];c[r+4>>2]=c[m+4>>2];c[r+8>>2]=c[m+8>>2];c[r+12>>2]=c[m+12>>2];if(!n){c[t>>2]=c[d>>2];c[t+4>>2]=c[d+4>>2];c[t+8>>2]=c[d+8>>2];c[t+12>>2]=c[d+12>>2]}else{c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2]}m=b[B>>1]|0;k=c[x>>2]|0;c[q>>2]=c[t>>2];c[q+4>>2]=c[t+4>>2];c[q+8>>2]=c[t+8>>2];c[q+12>>2]=c[t+12>>2];RI(a,q,(m<<8&65535)<<16>>16>>15&255,k,(m<<14&65535)<<16>>16>>15&255);m=c[(c[o>>2]|0)+8>>2]|0;k=c[m>>2]|0;m=(c[m+4>>2]|0)+-1|0;d=c[k+(m*48|0)>>2]|0;e=c[k+(m*48|0)+4>>2]|0;n=c[k+(m*48|0)+12>>2]|0;j=k+(m*48|0)+16|0;c[s>>2]=c[j>>2];c[s+4>>2]=c[j+4>>2];c[s+8>>2]=c[j+8>>2];c[s+12>>2]=c[j+12>>2];s=k+(m*48|0)+32|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];if(!n){s=d+(e+-1<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2]}else{c[t>>2]=c[r>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2]}d=b[B>>1]|0;s=c[v>>2]|0;c[q>>2]=c[t>>2];c[q+4>>2]=c[t+4>>2];c[q+8>>2]=c[t+8>>2];c[q+12>>2]=c[t+12>>2];RI(a,q,(d<<7&65535)<<16>>16>>15&255,s,(d<<13&65535)<<16>>16>>15&255);d=c[o>>2]|0}g=c[d+96>>2]|0;h=(b[B>>1]<<12&65535)<<16>>16>>15<<16>>16;k=z+216|0;i=c[k>>2]|0;m=z+232|0;j=c[m>>2]|0;n=z+248|0;e=c[n>>2]|0;f=c[C>>2]|0;if(!((bP(_O(A,c[47255]|0,137609)|0)|0)<<24>>24))d=0;else d=c[(c[o>>2]|0)+8>>2]|0;SI(a,g,11,h,i,j,e,f,d);i=c[(c[o>>2]|0)+108>>2]|0;j=(b[B>>1]<<12&65535)<<16>>16>>15<<16>>16;h=c[k>>2]|0;g=c[m>>2]|0;e=c[n>>2]|0;f=c[C>>2]|0;if(!((bP(_O(A,c[47255]|0,137609)|0)|0)<<24>>24))d=0;else d=c[(c[o>>2]|0)+8>>2]|0;SI(a,i,11,j,h,g,e,f,d);SI(a,c[(c[o>>2]|0)+100>>2]|0,7,(b[B>>1]<<13&65535)<<16>>16>>15<<16>>16,c[v>>2]|0,c[u>>2]|0,c[w>>2]|0,c[C>>2]|0,0);SI(a,c[(c[o>>2]|0)+104>>2]|0,6,(b[B>>1]<<14&65535)<<16>>16>>15<<16>>16,c[x>>2]|0,c[p>>2]|0,c[y>>2]|0,c[C>>2]|0,0);$R(a);$H(a);l=D;return}function RI(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=l;l=l+16|0;h=j;i=c[a+16>>2]|0;if(!(e<<24>>24))f=c[i+208>>2]|0;if(!(g<<24>>24==0?((f|0)==0?(b[i+260>>1]&1)==0:0):0)){c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];WI(a,h)}l=j;return}function SI(b,d,e,f,g,h,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+16|0;o=s;r=c[b+152>>2]|0;if(d|0?a[d+81>>0]|0:0){if(!j)n=0;else{n=HK((D3(j)|0)+11|0)|0;switch(e|0){case 11:{m=108525;break}case 7:{m=101884;break}case 6:{m=101894;break}default:Aa(138697,100207,2730,100345)}c[o>>2]=j;c[o+4>>2]=m;i2(n,100361,o)|0}o=b+16|0;q=(c[o>>2]|0)+12|0;p=c[q>>2]|0;c[q>>2]=e;q=(g|0)!=0;j=(f|0)!=0;m=(r&4|0)!=0;if(!(m|(j|q)^1)){TI(b,d);aS(b,g,h,i,n)}BK(b,e,d);if(k|0)UI(b,d,k);if(j|q){if(m){TI(b,d);aS(b,g,h,i,n)}bS(b)}l6(n);c[(c[o>>2]|0)+12>>2]=p}l=s;return}function TI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0;d=c[a+16>>2]|0;e=c[a+152>>2]|0;if(e&4259840|0){f=e&131072;j=f>>>16^2;c[d+264>>2]=j;i=d+268|0;c[i>>2]=j+2;j=d+272|0;l6(c[j>>2]|0);d=HK(c[i>>2]<<4)|0;c[j>>2]=d;j=b+56|0;i=b+24|0;h[d>>3]=+h[j>>3]-+h[i>>3]*.5;g=b+64|0;b=b+32|0;h[d+8>>3]=+h[g>>3]-+h[b>>3]*.5;h[d+16>>3]=+h[j>>3]+ +h[i>>3]*.5;h[d+24>>3]=+h[g>>3]+ +h[b>>3]*.5;if(!(e&8192))LR(a,d,d,2)|0;if(!f)hK(d)}return}function UI(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0;o=l;l=l+96|0;g=o+80|0;i=o+32|0;j=o+16|0;k=o;f=c[d>>2]|0;while(1){m=a[f>>0]|0;if(!(m<<24>>24))break;if(!(X1(m&255)|0)){n=4;break}else f=f+1|0}if((n|0)==4){p=+h[d+24>>3];m=d+56|0;VI(i,p*.5+ +h[m>>3],+h[d+64>>3]-+h[d+32>>3]*.5);n=i+16|0;VI(j,+h[i>>3]-p,+h[i+8>>3]);c[n>>2]=c[j>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];c[n+12>>2]=c[j+12>>2];n=i+32|0;c[g>>2]=c[m>>2];c[g+4>>2]=c[m+4>>2];c[g+8>>2]=c[m+8>>2];c[g+12>>2]=c[m+12>>2];oP(k,e,g);c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];jS(b,c[(c[b>>2]|0)+336>>2]|0);fS(b,c[d+8>>2]|0);oS(b,i,3)}l=o;return}function VI(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function WI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0,j=0,k=0;d=c[a+16>>2]|0;e=c[a+152>>2]|0;if(e&4259840|0){f=e&131072;j=f>>>16^2;c[d+264>>2]=j;k=d+268|0;c[k>>2]=j+2;j=d+272|0;l6(c[j>>2]|0);d=HK(c[k>>2]<<4)|0;c[j>>2]=d;i=+h[b>>3];h[d>>3]=i+-3.0;g=+h[b+8>>3];h[d+8>>3]=g+-3.0;h[d+16>>3]=i+3.0;h[d+24>>3]=g+3.0;if(!(e&8192))LR(a,d,d,2)|0;if(!f)hK(d)}return}function XI(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;i=+i;var j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+256|0;C=I+224|0;B=I+208|0;j=I+192|0;E=I+144|0;F=I+96|0;G=I+48|0;D=I;k=I+240|0;e=eI(e,f,k)|0;if((e|0)>1){y=b+48|0;z=uC(c[((c[b>>2]&3|0)==3?b:y)+40>>2]|0)|0;y=HB(c[((c[b>>2]&3|0)==3?b:y)+40>>2]|0)|0;z=(uB(z)|0)!=0;A=HB(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0;c[j>>2]=y;c[j+4>>2]=z?100380:100385;c[j+8>>2]=A;dA(3,100390,j)|0;if((e|0)==2)e=1;else H=4}else if((e|0)==1)e=1;else H=4;if((H|0)==4){A=b+16|0;r=c[k>>2]|0;s=r+8|0;t=G+4|0;u=E+8|0;v=E+12|0;q=(d|0)!=0;w=E+32|0;x=E+4|0;y=E+16|0;z=D+4|0;e=0;p=0;while(1){f=c[(c[A>>2]|0)+8>>2]|0;if((p|0)>=(c[f+4>>2]|0))break;j=E;f=(c[f>>2]|0)+(p*48|0)|0;b=j+48|0;do{c[j>>2]=c[f>>2];j=j+4|0;f=f+4|0}while((j|0)<(b|0));b=1;m=1.0;o=c[s>>2]|0;a:while(1){f=c[o>>2]|0;if(!f)break;k=o+4|0;n=+g[k>>2];do if(n<1.0e-05&n>-1.0e-05)f=b;else{fS(a,f);n=+g[k>>2];m=m-n;e=c[o>>2]|0;if(b|0){fJ(E,n,G,D);k=c[G>>2]|0;nS(a,k,c[t>>2]|0,0,0,0);l6(k);if(m<1.0e-05&m>-1.0e-05){H=11;break a}else{f=0;break}}if(m<1.0e-05&m>-1.0e-05){H=13;break a}j=F;f=D;b=j+48|0;do{c[j>>2]=c[f>>2];j=j+4|0;f=f+4|0}while((j|0)<(b|0));n=+g[k>>2];fJ(F,n/(m+n),G,D);l6(c[F>>2]|0);f=c[G>>2]|0;nS(a,f,c[t>>2]|0,0,0,0);l6(f);f=0}while(0);b=f;o=o+12|0}if((H|0)==11){H=0;l6(c[D>>2]|0)}else if((H|0)==13){H=0;o=c[D>>2]|0;nS(a,o,c[z>>2]|0,0,0,0);l6(o)}if(c[u>>2]|0){fS(a,c[c[s>>2]>>2]|0);hS(a,c[c[s>>2]>>2]|0);k=c[E>>2]|0;o=c[u>>2]|0;c[B>>2]=c[y>>2];c[B+4>>2]=c[y+4>>2];c[B+8>>2]=c[y+8>>2];c[B+12>>2]=c[y+12>>2];c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];c[C+8>>2]=c[k+8>>2];c[C+12>>2]=c[k+12>>2];XH(a,2,B,C,h,i,o)}if(c[v>>2]|0){fS(a,e);hS(a,e);k=(c[E>>2]|0)+((c[x>>2]|0)+-1<<4)|0;o=c[v>>2]|0;c[B>>2]=c[w>>2];c[B+4>>2]=c[w+4>>2];c[B+8>>2]=c[w+8>>2];c[B+12>>2]=c[w+12>>2];c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];c[C+8>>2]=c[k+8>>2];c[C+12>>2]=c[k+12>>2];XH(a,3,B,C,h,i,o)}do if((c[(c[(c[A>>2]|0)+8>>2]|0)+4>>2]|0)>1){if(!(c[u>>2]|0)){if(!(q&(c[v>>2]|0)!=0))break}else if(!q)break;jS(a,d)}while(0);p=p+1|0}fI(r);e=0}l=I;return e|0}function YI(b,d){b=b|0;d=d|0;var e=0,f=0;e=1;a:while(1){switch(a[b>>0]|0){case 0:break a;case 58:{e=e+1|0;break}default:{}}b=b+1|0}f=S((D3(d)|0)+1|0,e)|0;b=f+10|0;if((c[47165]|0)<(f|0)){c[47165]=b;b=n6(c[47166]|0,b)|0;c[47166]=b}else b=c[47166]|0;O3(b,d)|0;while(1){e=e+-1|0;b=c[47166]|0;if(!e)break;f=b+(D3(b)|0)|0;a[f>>0]=58;a[f+1>>0]=0;g6(b,d)|0}return b|0}function ZI(b){b=b|0;var d=0,e=0;d=c[47253]|0;a:do if(!d)e=7;else{d=OA(b,d)|0;switch(a[d>>0]|0){case 110:if(!(f2(d,136010)|0)){d=2;break a}else{e=7;break a}case 102:if(!(f2(d,100367)|0)){d=1;break a}else{e=7;break a}case 98:{if(!(f2(d,100375)|0)){d=3;break a}if(!(f2(d,111522)|0)){d=4;break a}else{e=7;break a}}default:{e=7;break a}}}while(0);if((e|0)==7){d=(uB(uC(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0)|0)!=0;d=d?1:2}return d|0}function _I(a){a=a|0;if(a|0){l6(c[a+8>>2]|0);l6(a)}return}function $I(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;e=+h[b>>3]-+h[c>>3];f=+h[b+8>>3]-+h[c+8>>3];d=2.0/+G(+(e*e+f*f+.0001));h[a>>3]=f*d;h[a+8>>3]=-(e*d);return}function aJ(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0;g=+h[c>>3]-+h[d>>3];i=+h[c+8>>3]-+h[d+8>>3];f=+G(+(g*g+i*i));if(f<.0001){j=+h[b>>3]-+h[e>>3];f=+h[b+8>>3]-+h[e+8>>3];i=f;g=j;f=+G(+(j*j+f*f+.0001))}j=2.0/f;h[a>>3]=j*i;h[a+8>>3]=-(g*j);return}function bJ(a,b,c){a=+a;b=+b;c=+c;return +((1.0-a/b)*c*.5)}function cJ(a,b,c){a=+a;b=+b;c=+c;return +(c*.5)}function dJ(a,b,c){a=+a;b=+b;c=+c;return +(a/b*c*.5)}function eJ(a,b,c){a=+a;b=+b;c=+c;b=a/b;return +((!(b<=.5)?1.0-b:b)*c)}function fJ(a,b,d,e){a=a|0;b=+b;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;r=l;l=l+16|0;q=r;p=c[a+4>>2]|0;j=(p+-1|0)/3|0;k=d+4|0;if((p+-4|0)>>>0<3){c[k>>2]=4;c[d>>2]=HK(64)|0;c[e+4>>2]=4;p=HK(64)|0;c[e>>2]=p;iP(q,c[a>>2]|0,3,b,c[d>>2]|0,p)}else{p=HK(j<<3)|0;f=0;g=c[a>>2]|0;i=0.0;while(1){if((f|0)>=(j|0))break;s=+gJ(g);h[p+(f<<3)>>3]=s;f=f+1|0;g=g+48|0;i=i+s}b=b*i;n=0;i=0.0;while(1){f=n+1|0;o=p+(n<<3)|0;if((j|0)<=(n|0))break;i=i+ +h[o>>3];if(!(i>=b))n=f;else break}f=(f*3|0)+1|0;c[k>>2]=f;c[d>>2]=HK(f<<4)|0;f=((j-n|0)*3|0)+1|0;m=e+4|0;c[m>>2]=f;c[e>>2]=HK(f<<4)|0;f=0;while(1){if((f|0)>=(c[k>>2]|0))break;j=(c[d>>2]|0)+(f<<4)|0;g=(c[a>>2]|0)+(f<<4)|0;c[j>>2]=c[g>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[j+12>>2]=c[g+12>>2];f=f+1|0}f=f+-4|0;g=0;while(1){j=c[a>>2]|0;k=c[e>>2]|0;if((g|0)>=(c[m>>2]|0))break;k=k+(g<<4)|0;j=j+(f<<4)|0;c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];f=f+1|0;g=g+1|0}s=+h[o>>3];e=n*3|0;iP(q,j+(e<<4)|0,3,(b-(i-s))/s,(c[d>>2]|0)+(e<<4)|0,k);l6(p)}l=r;return}function gJ(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0.0;e=+h[a+16>>3];c=+h[a>>3]-e;d=+h[a+24>>3];f=+h[a+8>>3]-d;f=+G(+(c*c+f*f));c=+h[a+32>>3];e=e-c;b=+h[a+40>>3];d=d-b;d=f+ +G(+(e*e+d*d));c=c-+h[a+48>>3];b=b-+h[a+56>>3];return +(d+ +G(+(c*c+b*b)))}function hJ(b,d){b=b|0;d=d|0;d=vC(d)|0;if((a[(c[d+16>>2]|0)+115>>0]|0)==1)d=cQ(b)|0;else d=$P(b,d)|0;return oJ(d)|0}function iJ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=l;l=l+1664|0;m=q+1600|0;n=q+800|0;o=q;p=IK(24)|0;c[p+16>>2]=1;j=((c[e+4>>2]|0)+-1|0)/3|0;h=0;i=p;while(1){if((h|0)>=(j|0))break;k=h*3|0;g=0;while(1){if((g|0)==4)break;r=m+(g<<4)|0;s=(c[e>>2]|0)+(g+k<<4)|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];g=g+1|0}h=h+1|0;i=jJ(m,i)|0}g=0;h=0;i=p;while(1){if(!i){h=p;g=p;break}j=c[i+16>>2]|0;k=n+(g<<4)|0;e=o+(g<<4)|0;kJ(h,i,j,k,e,f);g=g+1|0;if(!((g|0)==50|(j|0)==0)){h=i;i=j;continue}lJ(a,b,d,g,n,o);c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];c[o>>2]=c[e>>2];c[o+4>>2]=c[e+4>>2];c[o+8>>2]=c[e+8>>2];c[o+12>>2]=c[e+12>>2];h=i;g=1;i=j}while(1){if(!h)break;s=c[h+16>>2]|0;l6(g);h=s;g=s}l=q;return}function jJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+144|0;f=g+128|0;d=g+64|0;e=g;if(!(kI(a)|0)){iP(f,a,3,.5,d,e);d=jJ(e,jJ(d,b)|0)|0}else{d=b+16|0;if((c[d>>2]|0)==1){c[d>>2]=0;c[b>>2]=c[a>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[b+12>>2]=c[a+12>>2]}d=a+48|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];d=nJ(f,b)|0}l=g;return d|0}function kJ(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=+g;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0;t=l;l=l+96|0;p=t+80|0;o=t+64|0;n=t+48|0;q=t+32|0;r=t+16|0;s=t;c[q>>2]=c[b>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];m=q+8|0;b=s+8|0;k=r+8|0;do if(a){c[r>>2]=c[a>>2];c[r+4>>2]=c[a+4>>2];c[r+8>>2]=c[a+8>>2];c[r+12>>2]=c[a+12>>2];if(!d){j=+h[q>>3];h[s>>3]=j*2.0-+h[r>>3];i=+h[m>>3];h[b>>3]=i*2.0-+h[k>>3];break}else{c[s>>2]=c[d>>2];c[s+4>>2]=c[d+4>>2];c[s+8>>2]=c[d+8>>2];c[s+12>>2]=c[d+12>>2];j=+h[q>>3];i=+h[m>>3];break}}else{c[s>>2]=c[d>>2];c[s+4>>2]=c[d+4>>2];c[s+8>>2]=c[d+8>>2];c[s+12>>2]=c[d+12>>2];j=+h[q>>3];h[r>>3]=j*2.0-+h[s>>3];i=+h[m>>3];h[k>>3]=i*2.0-+h[b>>3]}while(0);c[n>>2]=c[r>>2];c[n+4>>2]=c[r+4>>2];c[n+8>>2]=c[r+8>>2];c[n+12>>2]=c[r+12>>2];c[o>>2]=c[q>>2];c[o+4>>2]=c[q+4>>2];c[o+8>>2]=c[q+8>>2];c[o+12>>2]=c[q+12>>2];c[p>>2]=c[s>>2];c[p+4>>2]=c[s+4>>2];c[p+8>>2]=c[s+8>>2];c[p+12>>2]=c[s+12>>2];v=+mJ(n,o,p);u=+I(+v)*g;g=+J(+v)*g;h[e>>3]=u+j;h[e+8>>3]=g+i;h[f>>3]=j-u;h[f+8>>3]=i-g;l=t;return}function lJ(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;i=e<<1;j=c[d>>2]|0;k=c[b>>2]|0;h=0;l=0;while(1){if((h|0)>=(j|0))break;m=(c[k+(h<<2)>>2]|0)+l|0;h=h+1|0;l=m}m=j+1|0;c[d>>2]=m;m=KK(k,m<<2)|0;c[b>>2]=m;c[m+(h<<2)>>2]=i;c[a>>2]=KK(c[a>>2]|0,l+i<<4)|0;b=i+-1+l|0;h=0;while(1){if((h|0)>=(e|0))break;m=(c[a>>2]|0)+(h+l<<4)|0;k=f+(h<<4)|0;c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];m=(c[a>>2]|0)+(b-h<<4)|0;k=g+(h<<4)|0;c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];h=h+1|0}return}function mJ(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;f=+h[b+8>>3];e=+h[b>>3];d=+O(+(+h[c+8>>3]-f),+(+h[c>>3]-e));e=+O(+(+h[a+8>>3]-f),+(+h[a>>3]-e));d=d-e;return +(e+(d>0.0?d+-6.283185307179586:d)*.5)}function nJ(a,b){a=a|0;b=b|0;var d=0;d=IK(24)|0;c[d+16>>2]=0;c[d>>2]=c[a>>2];c[d+4>>2]=c[a+4>>2];c[d+8>>2]=c[a+8>>2];c[d+12>>2]=c[a+12>>2];c[b+16>>2]=d;return d|0}function oJ(b){b=b|0;var c=0,d=0,e=0,f=0,g=0;c=b;g=b;a:while(1){d=0;while(1){e=c;c=c+1|0;e=a[e>>0]|0;if(!(e<<24>>24))break a;if(d<<24>>24){f=5;break}if(e<<24>>24!=92){f=10;break}else d=1}b:do if((f|0)==5){d=g+1|0;switch(e<<24>>24|0){case 114:{e=13;break b}case 108:case 110:{e=10;break b}default:break b}}else if((f|0)==10)d=g+1|0;while(0);a[g>>0]=e;g=d}a[g>>0]=0;return b|0}function pJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[b>>2]|0;while(1){j=a[e>>0]|0;f=j<<24>>24;if(!(j<<24>>24)){h=3;break}g=e+1|0;if(j<<24>>24==44|(X1(f)|0)!=0)e=g;else break}if((h|0)==3)g=e+1|0;a:do switch(f|0){case 0:{f=0;break}case 41:case 40:{e=g;break}default:{h=d+4|0;i=d+8|0;g=j;while(1){if((qJ(g<<24>>24)|0)<<24>>24){f=1;break a}f=c[h>>2]|0;if(f>>>0>=(c[i>>2]|0)>>>0){iA(d,1)|0;f=c[h>>2]|0}c[h>>2]=f+1;a[f>>0]=g;j=e+1|0;e=j;g=a[j>>0]|0}}}while(0);c[b>>2]=e;return f|0}function qJ(a){a=a|0;switch(a|0){case 0:case 44:case 41:case 40:{a=1;break}default:a=0}return a|0}function rJ(a,b){a=a|0;b=b|0;return sJ(c[a>>2]|0,c[a+160>>2]|0,c[a+156>>2]|0,b)|0}function sJ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+160|0;k=o+20|0;m=o+16|0;n=o;c[k>>2]=0;c[m>>2]=0;hA(n,128,o+24|0);kA(n,f)|0;g=n+4|0;f=c[g>>2]|0;if(f>>>0>=(c[n+8>>2]|0)>>>0){iA(n,1)|0;f=c[g>>2]|0}a[f>>0]=0;h=c[n>>2]|0;c[g>>2]=h;i=b+300|0;j=b+296|0;f=0;g=h;a:while(1){if(f){f=1;break}f=j6(g,c[i>>2]|0,k)|0;if(!f){f=0;break}g=j6(f,c[j>>2]|0,m)|0;h=(g|0)!=0;if(h)f=j6(0,c[j>>2]|0,m)|0;else f=0;switch(((f|0)!=0&1)+(h&1)&3){case 2:{g=tJ(b,g,0)|0;f=tJ(b,f,e)|0;h=(g|0)>(f|0);f=(f&g|0)>-1&(((h?g:f)|0)>=(d|0)&((h?f:g)|0)<=(d|0));g=0;continue a}case 1:{f=(tJ(b,g,d)|0)==(d|0);g=0;continue a}default:{f=0;g=0;continue a}}}lA(n);l=o;return f|0}function tJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=a[d>>0]|0;if(!(h<<24>>24==97?(f2(d,100697)|0)==0:0))f=3;a:do if((f|0)==3){if((uJ(d)|0)<<24>>24){e=d6(d)|0;break}g=c[b+308>>2]|0;if(!g)e=-1;else{b=c[b+312>>2]|0;e=1;while(1){if((e|0)>(b|0)){e=-1;break a}f=c[g+(e<<2)>>2]|0;if(h<<24>>24==(a[f>>0]|0)?(f2(d,f)|0)==0:0)break a;e=e+1|0}}}while(0);return e|0}function uJ(b){b=b|0;var c=0;while(1){c=a[b>>0]|0;if(!(c<<24>>24)){b=1;break}if(((c&255)+-48|0)>>>0<10)b=b+1|0;else{b=0;break}}return b|0}function vJ(a,b){a=a|0;b=b|0;if((+h[a+16>>3]>=+h[b>>3]?+h[b+16>>3]>=+h[a>>3]:0)?+h[a+24>>3]>=+h[b+8>>3]:0)a=+h[b+24>>3]>=+h[a+8>>3];else a=0;return a&1|0}function wJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;a:do if((c[b+156>>2]|0)>=2?(f=_O(e,c[47229]|0,195341)|0,(rJ(b,f)|0)<<24>>24==0):0)if(!(a[f>>0]|0))if(!(ZA(d,e)|0))f=1;else{f=ZA(d,e)|0;while(1){if(!f){f=0;break a}g=_O(f,c[47259]|0,195341)|0;if(!(a[g>>0]|0)){f=1;break a}if((rJ(b,g)|0)<<24>>24){f=1;break a}f=_A(d,f,e)|0}}else f=0;else f=1;while(0);return f|0}function xJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+64|0;e=d+32|0;f=d;a=(c[a+16>>2]|0)+48|0;c[f>>2]=c[a>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[f+12>>2]=c[a+12>>2];c[f+16>>2]=c[a+16>>2];c[f+20>>2]=c[a+20>>2];c[f+24>>2]=c[a+24>>2];c[f+28>>2]=c[a+28>>2];c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];c[e+16>>2]=c[b+16>>2];c[e+20>>2]=c[b+20>>2];c[e+24>>2]=c[b+24>>2];c[e+28>>2]=c[b+28>>2];b=(vJ(f,e)|0)&255;l=d;return b|0}function yJ(a,d){a=a|0;d=d|0;var f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0;s=c[a+152>>2]|0;t=_H(a)|0;c[t+4>>2]=2;c[t+8>>2]=d;c[t+12>>2]=8;n=d+16|0;if(s&16777216|0){if((e[(c[(uC(d)|0)+16>>2]|0)+178>>1]|0)>2){g=+h[(c[(c[n>>2]|0)+132>>2]|0)+16>>3]*72.0;g=+(~~(g+(g>=0.0?.5:-.5))|0)}else g=0.0;h[t+168>>3]=g}AJ(a,c[(c[n>>2]|0)+104>>2]|0,d);do if(s&4259840|0){if((c[t+208>>2]|0)==0?(b[t+260>>1]&1)==0:0)break;q=UM(d)|0;l=c[n>>2]|0;g=+h[l+16>>3];r=+h[l+24>>3];l=BJ(d)|0;a:do if((q|2|0)==3){m=c[(c[n>>2]|0)+12>>2]|0;if(!((CJ(m)|0)<<24>>24))f=0;else f=(c[m+4>>2]|l|0)!=0;o=t+264|0;if(!((s&524288|0)==0|((m|0)==0|f))){i=m+8|0;p=c[i>>2]|0;p=(p|0)<3?1:p;j=m+4|0;k=c[j>>2]|0;k=(k|0)>1?k:1;q=c[m+44>>2]|0;f=NA(d,103006)|0;if(!f)f=0;else f=d6(f)|0;f=(f+-4|0)>>>0>56?20:f;if(!(c[j>>2]|l)){c[o>>2]=0;i=HK(32)|0;f=c[n>>2]|0;w=+h[f+88>>3];h[i>>3]=g-w;v=+h[f+80>>3]*.5;h[i+8>>3]=r-v;h[i+16>>3]=g+w;h[i+24>>3]=r+v;f=2;break}i=c[i>>2]|0;if(((i|0)<3?+h[m+32>>3]==0.0:0)?+h[m+24>>3]==0.0:0){if(c[m>>2]|0){c[o>>2]=1;i=HK(32)|0;h[i>>3]=g;h[i+8>>3]=r;f=(k<<1)+-1|0;h[i+16>>3]=g+ +h[q+(f<<4)>>3];h[i+24>>3]=r+ +h[q+(f<<4)+8>>3];f=2;break}c[o>>2]=2;i=(k<<1)+-1|0;i=DJ(+h[q+(i<<4)>>3],+h[q+(i<<4)+8>>3],f)|0;j=0;while(1){if((j|0)>=(f|0))break a;q=i+(j<<4)|0;h[q>>3]=g+ +h[q>>3];q=i+(j<<4)+8|0;h[q>>3]=r+ +h[q>>3];j=j+1|0}}m=S(i,k+-1|0)|0;c[o>>2]=2;if((i|0)<(f|0)){i=HK(p<<4)|0;f=0;while(1){if((f|0)>=(p|0)){f=p;break a}o=f+m|0;h[i+(f<<4)>>3]=g+ +h[q+(o<<4)>>3];h[i+(f<<4)+8>>3]=r+ +h[q+(o<<4)+8>>3];f=f+1|0}}else{l=(i|0)/(f|0)|0;i=HK(f<<4)|0;j=0;k=0;while(1){if((j|0)>=(f|0))break a;p=k+m|0;h[i+(j<<4)>>3]=g+ +h[q+(p<<4)>>3];h[i+(j<<4)+8>>3]=r+ +h[q+(p<<4)+8>>3];j=j+1|0;k=k+l|0}}}else{f=o;u=32}}else{f=t+264|0;u=32}while(0);if((u|0)==32){c[f>>2]=0;i=HK(32)|0;f=c[n>>2]|0;h[i>>3]=g-+h[f+88>>3];w=+h[f+80>>3]*.5;h[i+8>>3]=r-w;h[i+16>>3]=g+ +h[f+96>>3];h[i+24>>3]=r+w;f=2}if(!(s&8192))LR(a,i,i,f)|0;c[t+272>>2]=i;c[t+268>>2]=f}while(0);FT(NA(d,100333)|0);YR(a,d);return}function zJ(a){a=a|0;ZR(a);$H(a);return}function AJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+144|0;j=m;f=NA(e,141358)|0;i=NA(e,141404)|0;k=NA(e,141391)|0;hA(j,128,m+16|0);if(!d)h=0;else h=c[d>>2]|0;if(!((f|0)!=0?(a[f>>0]|0)!=0:0))f=NA(e,111778)|0;g=bI(b,e,j)|0;if(!i)d=0;else d=hJ(i,e)|0;aI(b,h,f,d,k,g,e)|0;l6(d);lA(j);l=m;return}function BJ(b){b=b|0;var d=0,e=0;b=$O(b,c[47219]|0,195341)|0;a:do if(!(a[b>>0]|0))b=0;else{NI(b)|0;b=0;d=188404;while(1){e=c[d>>2]|0;if(!e)break a;e=(f2(e,111402)|0)==0;b=e?1:b;d=d+4|0}}while(0);return b|0}function CJ(a){a=a|0;var b=0.0;if(((c[a+8>>2]|0)==4?(b=+h[a+16>>3],((~~(b+(b>=0.0?.5:-.5))|0)%90|0|0)==0):0)?+h[a+24>>3]==0.0:0)a=+h[a+32>>3]==0.0&1;else a=0;return a|0}function DJ(a,b,c){a=+a;b=+b;c=c|0;var d=0.0,e=0,f=0.0,g=0;f=6.283185307179586/+(c|0);g=HK(c<<4)|0;d=0.0;e=0;while(1){if((e|0)>=(c|0))break;h[g+(e<<4)>>3]=+I(+d)*a;h[g+(e<<4)+8>>3]=+J(+d)*b;d=f+d;e=e+1|0}return g|0}function EJ(b,d){b=b|0;d=d|0;var e=0;a:do if((c[b+156>>2]|0)>=2?(e=_O(d,DA(d,0,101811,0)|0,195341)|0,(rJ(b,e)|0)<<24>>24==0):0)if(!(a[e>>0]|0)){e=gC(d)|0;while(1){if(!e){e=0;break a}if((wJ(b,d,e)|0)<<24>>24){e=1;break a}e=hC(d,e)|0}}else e=0;else e=1;while(0);return e|0}function FJ(a,b){a=a|0;b=b|0;var d=0;d=_H(a)|0;c[d+4>>2]=1;c[d+8>>2]=b;c[d+12>>2]=1;AJ(a,c[(c[b+16>>2]|0)+12>>2]|0,b);SR(a,b);return}function GJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;b=NA(b,141385)|0;a:do if((b|0)!=0?(a[b>>0]|0)!=0:0){NI(b)|0;e=188404;b=0;while(1){g=e;while(1){f=c[g>>2]|0;if(!f){e=188404;break a}e=g+4|0;if(!(f2(f,111402)|0)){f=1;break}if(!(f2(f,106635)|0)){e=g;h=9;break}if(!(f2(f,106642)|0)){e=g;h=11;break}if(!(f2(f,106617)|0)){e=g;h=13;break}else g=e}if((h|0)==9)while(1){h=0;i=e;e=e+4|0;f=c[e>>2]|0;c[i>>2]=f;if(!f){e=g;f=3;break}else h=9}else if((h|0)==11)while(1){h=0;f=e;e=e+4|0;i=c[e>>2]|0;c[f>>2]=i;if(!i){e=g;f=64;break}else h=11}else if((h|0)==13)while(1){h=0;f=e;e=e+4|0;i=c[e>>2]|0;c[f>>2]=i;if(!i){e=g;f=4;break}else h=13}b=b|f}}else{e=0;b=0}while(0);c[d>>2]=b;return e|0}function HJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+16|0;i=k;j=k+4|0;c[j>>2]=0;m=(eI(b,0,j)|0)==0;j=c[j>>2]|0;if((m?(f=c[j>>2]|0,(f|0)>=2):0)?(h=j+8|0,(c[c[h>>2]>>2]|0)!=0):0){if((f|0)>2)dA(0,100716,i)|0;m=IK((D3(b)|0)+1|0)|0;c[d>>2]=m;O3(m,c[c[h>>2]>>2]|0)|0;if(!(c[(c[h>>2]|0)+12>>2]|0))c[d+4>>2]=0;else{m=c[d>>2]|0;m=m+((D3(m)|0)+1)|0;c[d+4>>2]=m;O3(m,c[(c[h>>2]|0)+12>>2]|0)|0}b=c[h>>2]|0;do if(!(a[b+8>>0]|0))if(!(a[b+20>>0]|0)){g[e>>2]=0.0;break}else{g[e>>2]=1.0-+g[b+16>>2];break}else c[e>>2]=c[b+4>>2];while(0);fI(j);b=1}else{c[d>>2]=0;fI(j);b=0}l=k;return b|0}function IJ(a,b){a=a|0;b=b|0;TR(a,b);$H(a);return}function JJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,i=0,j=0.0,k=0,m=0,n=0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0;A=l;l=l+96|0;s=A+48|0;v=A+16|0;z=A+8|0;y=A;w=A+80|0;c[w>>2]=1e3;f=IK(16e3)|0;x=a+256|0;e=1;d=1;i=0;t=0;u=c[b+8>>2]|0;while(1){if((t|0)>=(c[b>>2]|0))break;p=c[u>>2]|0;k=u+80|0;m=f+8|0;q=u+8|0;n=q+4|0;a:do switch(p|0){case 1:case 0:{c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];c[v+16>>2]=c[k+16>>2];c[v+20>>2]=c[k+20>>2];c[v+24>>2]=c[k+24>>2];c[v+28>>2]=c[k+28>>2];c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[s+16>>2]=c[x+16>>2];c[s+20>>2]=c[x+20>>2];c[s+24>>2]=c[x+24>>2];c[s+28>>2]=c[x+28>>2];if(vJ(v,s)|0){B=+h[q>>3];j=+h[u+24>>3];h[f>>3]=B-j;o=+h[u+16>>3];r=+h[u+32>>3];h[m>>3]=o-r;h[f+16>>3]=B+j;h[f+24>>3]=o+r;kS(a,f,2,(p|0)==0?d:0)}break}case 3:case 2:{c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];c[v+16>>2]=c[k+16>>2];c[v+20>>2]=c[k+20>>2];c[v+24>>2]=c[k+24>>2];c[v+28>>2]=c[k+28>>2];c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[s+16>>2]=c[x+16>>2];c[s+20>>2]=c[x+20>>2];c[s+24>>2]=c[x+24>>2];c[s+28>>2]=c[x+28>>2];if(vJ(v,s)|0){f=KJ(f,w,c[n>>2]|0,c[q>>2]|0)|0;lS(a,f,c[q>>2]|0,(c[u>>2]|0)==2?d:0)}break}case 5:case 4:{c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];c[v+16>>2]=c[k+16>>2];c[v+20>>2]=c[k+20>>2];c[v+24>>2]=c[k+24>>2];c[v+28>>2]=c[k+28>>2];c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[s+16>>2]=c[x+16>>2];c[s+20>>2]=c[x+20>>2];c[s+24>>2]=c[x+24>>2];c[s+28>>2]=c[x+28>>2];if(vJ(v,s)|0){f=KJ(f,w,c[n>>2]|0,c[q>>2]|0)|0;nS(a,f,c[q>>2]|0,0,0,(c[u>>2]|0)==4?d&255:0)}break}case 6:{c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];c[v+16>>2]=c[k+16>>2];c[v+20>>2]=c[k+20>>2];c[v+24>>2]=c[k+24>>2];c[v+28>>2]=c[k+28>>2];c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[s+16>>2]=c[x+16>>2];c[s+20>>2]=c[x+20>>2];c[s+24>>2]=c[x+24>>2];c[s+28>>2]=c[x+28>>2];if(vJ(v,s)|0){f=KJ(f,w,c[n>>2]|0,c[q>>2]|0)|0;oS(a,f,c[q>>2]|0)}break}case 7:{c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];c[v+16>>2]=c[k+16>>2];c[v+20>>2]=c[k+20>>2];c[v+24>>2]=c[k+24>>2];c[v+28>>2]=c[k+28>>2];c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[s+16>>2]=c[x+16>>2];c[s+20>>2]=c[x+20>>2];c[s+24>>2]=c[x+24>>2];c[s+28>>2]=c[x+28>>2];if(vJ(v,s)|0){h[f>>3]=+h[q>>3];h[m>>3]=+h[u+16>>3];q=c[u+112>>2]|0;c[s>>2]=c[f>>2];c[s+4>>2]=c[f+4>>2];c[s+8>>2]=c[f+8>>2];c[s+12>>2]=c[f+12>>2];eS(a,s,q)}break}case 8:{hS(a,c[q>>2]|0);d=1;break}case 9:{fS(a,c[q>>2]|0);d=1;break}case 13:{d=u+16|0;if((c[q>>2]|0)!=2){p=c[d+36>>2]|0;q=c[p+12>>2]|0;B=+g[p+8>>2];d=~~(+O(+(+h[u+40>>3]-+h[u+24>>3]),+(+h[u+32>>3]-+h[d>>3]))*180.0/3.141592653589793);hS(a,c[p+4>>2]|0);iS(a,q,d,B);d=2;break a}q=c[u+68>>2]|0;k=c[q+4>>2]|0;m=c[q+12>>2]|0;r=+g[q+8>>2];o=+h[u+40>>3];j=+h[d>>3];if(o==j?+h[u+48>>3]==+h[u+24>>3]:0)d=0;else d=~~(+L(+((j-o)/+h[u+32>>3]))*180.0/3.141592653589793);hS(a,k);iS(a,m,d,r);d=3;break}case 14:{dA(0,100782,y)|0;break}case 12:{if(!e)e=0;else{dA(0,100822,z)|0;e=0}break}case 11:{NI(c[q>>2]|0)|0;jS(a,188404);i=188404;break}default:{}}while(0);t=t+1|0;u=u+120|0}if(i|0)jS(a,c[(c[a>>2]|0)+336>>2]|0);l6(f);l=A;return}function KJ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=c[b>>2]|0;f=g<<1;f=(f|0)>(e|0)?f:e;if((g|0)<(e|0)){a=KK(a,f<<4)|0;c[b>>2]=f}b=0;while(1){if((b|0)>=(e|0))break;h[a+(b<<4)>>3]=+h[d+(b*24|0)>>3];h[a+(b<<4)+8>>3]=+h[d+(b*24|0)+8>>3];b=b+1|0}return a|0}function LJ(a,b){a=a|0;b=b|0;var d=0;d=c[b>>2]|0;c[a>>2]=c[b+4>>2];c[a+4>>2]=d;return}function MJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=d+16|0;f=1;while(1){d=c[g>>2]|0;if((f|0)>(c[d+180>>2]|0))break;e=c[(c[d+184>>2]|0)+(f<<2)>>2]|0;MJ(b,e);d=NA(e,141126)|0;if(d|0?a[d>>0]|0:0)fS(b,d);d=NA(e,138032)|0;if(d|0?a[d>>0]|0:0)fS(b,d);d=NA(e,141280)|0;if(d|0?a[d>>0]|0:0)fS(b,d);d=NA(e,101719)|0;if(d|0?a[d>>0]|0:0)hS(b,d);d=NA(e,101747)|0;if(d|0?a[d>>0]|0:0)fS(b,d);f=f+1|0}return}function NJ(a){a=a|0;var b=0,d=0,e=0;b=c[47171]|0;if(!b){b=Sz(20672,c[4591]|0)|0;c[47171]=b}if(!(eb[c[b>>2]&63](b,a,4)|0)){d=c[47171]|0;e=c[d>>2]|0;b=Y3(a)|0;eb[e&63](d,b,1)|0;b=1}else b=0;return b|0}function OJ(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function PJ(a){a=a|0;var b=0;b=c[47172]|0;if(!a){if((b|0)>0?(b=b+-1|0,c[47172]=b,(b|0)==0):0){L3(1,c[47173]|0)|0;l6(c[47173]|0)}}else{c[47172]=b+1;if(!b){c[47173]=Y3(L3(1,0)|0)|0;L3(1,153740)|0}}return}function QJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0;v=l;l=l+96|0;s=v+72|0;r=v+56|0;q=v+48|0;u=v+32|0;t=v+24|0;f=v+8|0;e=v;if(a[195234]|0)RO();do if((RC(d,137786,0,1)|0)!=0?(p=d+16|0,(c[(c[p>>2]|0)+8>>2]|0)!=0):0){RJ(d);SJ(b,d);TJ(b,d);PJ(1);k=b+56|0;m=b+184|0;n=b+192|0;o=b+28|0;j=CF(b)|0;a:while(1){if(!j){i=33;break}e=c[k>>2]|0;f=j+20|0;if(!e){c[f>>2]=0;e=0}else{c[f>>2]=c[e+8>>2];e=c[e+12>>2]|0}c[j+24>>2]=e;c[j+12>>2]=b;c[j+28>>2]=c[m>>2];c[j+620>>2]=25812;c[j+624>>2]=c[6481];if(!(c[(c[p>>2]|0)+8>>2]|0)){i=13;break}f=j+52|0;i=HR(j,c[f>>2]|0)|0;c[j+56>>2]=i;switch(i|0){case 999:{i=16;break a}case 21:{e=1;break}case 24:{e=520;break}default:e=UJ(d)|0}g=j+152|0;c[g>>2]=c[g>>2]|e;e=c[n>>2]|0;do if(!e)i=24;else{if(c[e+152>>2]&32|0?(f2(c[f>>2]|0,c[e+52>>2]|0)|0)==0:0){e=c[47174]|0;if(!e){i=27;break}c[e+8>>2]=j;c[j+36>>2]=c[e+36>>2];i=29;break}JR(e);c[n>>2]=0;c[o>>2]=0;i=24}while(0);if((i|0)==24){c[47174]=0;i=27}if((i|0)==27?(i=0,(IR(j)|0)==0):0){c[n>>2]=j;i=29}if((i|0)==29){c[j+8>>2]=0;c[j+104>>2]=25928;VJ(j);WJ(j);XJ(j,d);YJ(j,d);ZJ(j,d);if(!(c[g>>2]&128))qI(j,d);c[47174]=j}j=DF(b)|0}if((i|0)==13){dA(1,100980,t)|0;PJ(0);if(!(a[195234]|0)){e=-1;break}e=c[15715]|0;t=HB(d)|0;w=+SO();c[u>>2]=t;h[u+8>>3]=w;z4(e,100951,u)|0;e=-1;break}else if((i|0)==16){c[q>>2]=c[f>>2];dA(1,101001,q)|0;PJ(0);if(!(a[195234]|0)){e=-1;break}e=c[15715]|0;u=HB(d)|0;w=+SO();c[r>>2]=u;h[r+8>>3]=w;z4(e,100951,r)|0;e=-1;break}else if((i|0)==33){PJ(0);if(!(a[195234]|0)){e=0;break}e=c[15715]|0;u=HB(d)|0;w=+SO();c[s>>2]=u;h[s+8>>3]=w;z4(e,100951,s)|0;e=0;break}}else i=5;while(0);if((i|0)==5){dA(1,100903,e)|0;if(!(a[195234]|0))e=-1;else{e=c[15715]|0;u=HB(d)|0;w=+SO();c[f>>2]=u;h[f+8>>3]=w;z4(e,100951,f)|0;e=-1}}l=v;return e|0}function RJ(a){a=a|0;var b=0;b=gC(a)|0;while(1){if(!b)break;cK(a,b);b=hC(a,b)|0}return}function SJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0;o=l;l=l+32|0;k=o+24|0;f=o+16|0;j=o+8|0;n=o;c[b+168>>2]=d;g=b+293|0;a[g>>0]=0;e=NA(d,105797)|0;if(e|0?(c[f>>2]=j,c[f+4>>2]=n,i=q4(e,105804,f)|0,(i|0)>0):0){p=+h[j>>3]*72.0;e=b+208|0;h[e>>3]=p;h[b+200>>3]=p;if((i|0)!=1)h[e>>3]=+h[n>>3]*72.0;a[g>>0]=1}f=b+292|0;a[f>>0]=0;e=NA(d,101403)|0;if(e|0?(c[k>>2]=j,c[k+4>>2]=n,m=q4(e,105804,k)|0,(m|0)>0):0){p=+h[j>>3]*72.0;e=b+224|0;h[e>>3]=p;h[b+216>>3]=p;if((m|0)!=1)h[e>>3]=+h[n>>3]*72.0;a[f>>0]=1}e=b+294|0;a[e>>0]=0;f=b+232|0;g=d+16|0;n=(c[(c[g>>2]|0)+8>>2]|0)+48|0;c[f>>2]=c[n>>2];c[f+4>>2]=c[n+4>>2];c[f+8>>2]=c[n+8>>2];c[f+12>>2]=c[n+12>>2];f=c[(c[g>>2]|0)+8>>2]|0;if(+h[f+48>>3]>.001?+h[f+56>>3]>.001:0)a[e>>0]=1;c[b+288>>2]=a[f+81>>0]|0?90:0;e=b+196|0;c[e>>2]=101407;f=NA(d,101410)|0;if(f|0?a[f>>0]|0:0)c[e>>2]=f;n=b+256|0;m=(c[g>>2]|0)+16|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];c[n+16>>2]=c[m+16>>2];c[n+20>>2]=c[m+20>>2];c[n+24>>2]=c[m+24>>2];c[n+28>>2]=c[m+28>>2];c[47195]=DA(d,0,101773,0)|0;c[47196]=DA(d,0,101764,0)|0;c[b+320>>2]=$O(0,c[47213]|0,108295)|0;h[b+328>>3]=+YO(0,c[47212]|0,14.0,1.0);c[b+336>>2]=20708;c[b+188>>2]=HB(d)|0;l=o;return}function TJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=b+304|0;f=c[e>>2]|0;if(f|0){l6(f);c[e>>2]=0}g=b+308|0;e=c[g>>2]|0;if(e|0){l6(e);c[g>>2]=0}h=b+316|0;e=c[h>>2]|0;if(e|0){l6(e);c[h>>2]=0}e=NA(d,101154)|0;f=b+312|0;if(e){c[f>>2]=aK(b,d,e)|0;e=NA(d,101161)|0;if(e|0?a[e>>0]|0:0)c[h>>2]=bK(b,e)|0}else{c[g>>2]=0;c[f>>2]=1}return}function UJ(b){b=b|0;var c=0;b=NA(b,101122)|0;a:do if(!b)b=0;else{c=b+1|0;switch(a[b>>0]|0){case 110:{if(!(f2(c,101134)|0))b=1;else{b=0;break a}break}case 101:{if(!(f2(c,101144)|0))b=16;else{b=0;break a}break}default:{b=0;break a}}}while(0);return b|0}function VJ(b){b=b|0;var d=0,e=0.0,f=0;d=c[b>>2]|0;f=b+240|0;if(!(a[d+292>>0]|0)){if((c[b+56>>2]|0)==300)e=+h[(c[b+68>>2]|0)+8>>3];else e=4.0;h[b+248>>3]=e;h[f>>3]=e}else{b=d+216|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2]}return}function WJ(b){b=b|0;var d=0,e=0;d=c[b>>2]|0;e=b+416|0;a:do if(!(a[d+293>>0]|0))switch(c[b+56>>2]|0){case 300:{d=(c[b+84>>2]|0)+8|0;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];break a}case 30:case 21:case 22:case 4:case 3:case 2:{h[b+424>>3]=36.0;h[e>>3]=36.0;break a}default:{c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;break a}}else{d=d+200|0;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2]}while(0);return}function XJ(b,d){b=b|0;d=d|0;var e=0.0,f=0,g=0;g=c[(c[b>>2]|0)+192>>2]|0;e=+h[(c[(c[d+16>>2]|0)+8>>2]|0)+24>>3];d=b+432|0;f=b+440|0;do if(!(e!=0.0)){if(g|0?a[g+128>>0]|0:0){g=g+112|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];break}if((c[b+56>>2]|0)==300){g=(c[b+84>>2]|0)+40|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];break}else{h[f>>3]=96.0;h[d>>3]=96.0;break}}else{h[f>>3]=e;h[d>>3]=e}while(0);return}function YJ(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;B=l;l=l+112|0;u=B+80|0;v=B+56|0;t=B+40|0;w=B+32|0;x=B+24|0;y=B+16|0;z=B+8|0;A=B;m=c[b>>2]|0;p=+h[m+272>>3];r=+h[m+280>>3];q=+h[m+256>>3];s=+h[m+264>>3];f=+h[b+240>>3];e=q-f;h[b+208>>3]=e;i=+h[b+248>>3];j=s-i;h[b+216>>3]=j;f=p+f;h[b+224>>3]=f;i=r+i;h[b+232>>3]=i;e=f-e;j=i-j;h[y>>3]=1.0;g=c[(c[d+16>>2]|0)+8>>2]|0;i=+h[g+64>>3];do if(i>.001?(k=+h[g+72>>3],k>.001):0){e=e==0.0?i:e;f=j==0.0?k:j;if(!(if&(i>e&(a[g+80>>0]|0)!=0)):0){k=e;j=f;i=1.0;break}o=i/e>3]=i;k=e;j=f}else{k=e;i=1.0}while(0);f=(p+q)*.5;h[z>>3]=f;e=(r+s)*.5;h[A>>3]=e;c[b+360>>2]=c[m+288>>2];k=k*i;h[w>>3]=k;j=j*i;h[x>>3]=j;o=NA(d,101053)|0;if(o){m=k6((D3(o)|0)+1|0)|0;n=k6((D3(o)|0)+1|0)|0;c[t>>2]=w;c[t+4>>2]=x;c[t+8>>2]=y;c[t+12>>2]=m;g=d+60|0;do if((q4(o,101062,t)|0)==4){g=qC(c[g>>2]|0,m,0)|0;if(g|0){v=c[g+16>>2]|0;h[z>>3]=+h[v+16>>3];h[A>>3]=+h[v+24>>3]}}else{c[v>>2]=w;c[v+4>>2]=x;c[v+8>>2]=y;c[v+12>>2]=m;c[v+16>>2]=n;if((q4(o,101082,v)|0)!=4){c[u>>2]=w;c[u+4>>2]=x;c[u+8>>2]=y;c[u+12>>2]=z;c[u+16>>2]=A;q4(o,101102,u)|0;break}g=qC(c[g>>2]|0,m,0)|0;if(g|0){v=c[g+16>>2]|0;h[z>>3]=+h[v+16>>3];h[A>>3]=+h[v+24>>3]}}while(0);l6(m);l6(n);k=+h[w>>3];j=+h[x>>3];i=+h[y>>3];f=+h[z>>3];e=+h[A>>3]}h[b+368>>3]=k;h[b+376>>3]=j;h[b+352>>3]=i;h[b+336>>3]=f;h[b+344>>3]=e;l=B;return}function ZJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0;M=l;l=l+224|0;J=M+200|0;x=M+176|0;C=M+152|0;G=M+120|0;D=M+96|0;F=M+80|0;e=M+184|0;t=M+168|0;u=M+144|0;w=M+136|0;v=M+112|0;y=M+64|0;z=M+48|0;A=M+32|0;B=M+16|0;K=M+8|0;L=M;s=c[b>>2]|0;c[F>>2]=0;c[F+4>>2]=0;c[F+8>>2]=0;c[F+12>>2]=0;H=b+368|0;c[G>>2]=c[H>>2];c[G+4>>2]=c[H+4>>2];c[G+8>>2]=c[H+8>>2];c[G+12>>2]=c[H+12>>2];H=b+360|0;if(c[H>>2]|0){c[J>>2]=c[G>>2];c[J+4>>2]=c[G+4>>2];c[J+8>>2]=c[G+8>>2];c[J+12>>2]=c[G+12>>2];_J(e,J);c[G>>2]=c[e>>2];c[G+4>>2]=c[e+4>>2];c[G+8>>2]=c[e+8>>2];c[G+12>>2]=c[e+12>>2]}E=b+416|0;c[D>>2]=c[E>>2];c[D+4>>2]=c[E+4>>2];c[D+8>>2]=c[E+8>>2];c[D+12>>2]=c[E+12>>2];E=D+8|0;I=G+8|0;q=C+8|0;o=b+204|0;f=b+164|0;i=b+168|0;if((a[s+294>>0]|0)!=0?(c[b+152>>2]&32|0)!=0:0){m=+h[s+232>>3]-+h[D>>3]*2.0;h[C>>3]=m;k=+h[s+240>>3]-+h[E>>3]*2.0;h[q>>3]=k;if(!(m<.0001)){p=+h[G>>3];e=~~(p/m);c[f>>2]=e;if(p-m*+(e|0)>.0001){e=e+1|0;r=8}}else{e=1;r=8}if((r|0)==8)c[f>>2]=e;j=+h[I>>3];if(!(k<.0001)){f=~~(j/k);c[i>>2]=f;if(j-k*+(f|0)>.0001){f=f+1|0;r=12}}else{f=1;r=12}if((r|0)==12)c[i>>2]=f;c[o>>2]=S(f,e)|0;g=+h[(+h[G>>3]>3];h[G>>3]=g;e=G;j=+h[(j>3];r=21}else{if(c[b+68>>2]|0){e=c[b+84>>2]|0;g=+h[e+24>>3]-+h[D>>3]*2.0;g=g<0.0?0.0:g;h[C>>3]=g;p=+h[e+32>>3]-+h[E>>3]*2.0;h[q>>3]=p;if(p<0.0){e=q;r=17}else j=g}else{h[q>>3]=0.0;e=C;r=17}if((r|0)==17){h[e>>3]=0.0;j=+h[C>>3]}c[o>>2]=1;c[i>>2]=1;c[f>>2]=1;g=+h[G>>3];if(j>3]=g;m=g}else m=j;j=+h[q>>3];k=+h[I>>3];if(j>3]=j;p=+h[q>>3]}n=+h[D>>3];q=b+432|0;k=+h[q>>3]*(m+n*2.0)/72.0;c[b+448>>2]=~~(k+(k>=0.0?.5:-.5));k=+h[E>>3];r=b+440|0;j=+h[r>>3]*(p+k*2.0)/72.0;c[b+452>>2]=~~(j+(j>=0.0?.5:-.5));i=b+188|0;o=b+180|0;e=b+172|0;f=s+196|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;$J(t,b,a[c[f>>2]>>0]|0);s=t;t=c[s+4>>2]|0;e=o;c[e>>2]=c[s>>2];c[e+4>>2]=t;$J(u,b,a[(c[f>>2]|0)+1>>0]|0);e=u;u=c[e>>2]|0;e=c[e+4>>2]|0;t=i;c[t>>2]=u;c[t+4>>2]=e;u=u+(c[o>>2]|0)|0;if(!((((u|0)>-1?u:0-u|0)|0)==1?(u=e+(c[b+184>>2]|0)|0,(((u|0)>-1?u:0-u|0)|0)==1):0)){$J(w,b,66);t=w;w=c[t+4>>2]|0;u=o;c[u>>2]=c[t>>2];c[u+4>>2]=w;$J(v,b,76);u=v;v=c[u+4>>2]|0;w=i;c[w>>2]=c[u>>2];c[w+4>>2]=v;c[x>>2]=c[f>>2];dA(0,101033,x)|0}e=F+8|0;if(a[(c[(c[d+16>>2]|0)+8>>2]|0)+82>>0]|0){if(m>g){m=(m-g)*.5;h[F>>3]=m}else m=0.0;j=+h[I>>3];if(p>j){j=(p-j)*.5;h[e>>3]=j}else j=0.0}else{j=0.0;m=0.0}if(!(c[H>>2]|0))i=1;else{c[J>>2]=c[G>>2];c[J+4>>2]=c[G+4>>2];c[J+8>>2]=c[G+8>>2];c[J+12>>2]=c[G+12>>2];_J(y,J);c[G>>2]=c[y>>2];c[G+4>>2]=c[y+4>>2];c[G+8>>2]=c[y+8>>2];c[G+12>>2]=c[y+12>>2];c[J>>2]=c[C>>2];c[J+4>>2]=c[C+4>>2];c[J+8>>2]=c[C+8>>2];c[J+12>>2]=c[C+12>>2];_J(z,J);c[C>>2]=c[z>>2];c[C+4>>2]=c[z+4>>2];c[C+8>>2]=c[z+8>>2];c[C+12>>2]=c[z+12>>2];c[J>>2]=c[D>>2];c[J+4>>2]=c[D+4>>2];c[J+8>>2]=c[D+8>>2];c[J+12>>2]=c[D+12>>2];_J(A,J);c[D>>2]=c[A>>2];c[D+4>>2]=c[A+4>>2];c[D+8>>2]=c[A+8>>2];c[D+12>>2]=c[A+12>>2];c[J>>2]=c[F>>2];c[J+4>>2]=c[F+4>>2];c[J+8>>2]=c[F+8>>2];c[J+12>>2]=c[F+12>>2];_J(B,J);c[F>>2]=c[B>>2];c[F+4>>2]=c[B+4>>2];c[F+8>>2]=c[B+8>>2];c[F+12>>2]=c[B+12>>2];n=+h[D>>3];m=+h[F>>3];k=+h[E>>3];j=+h[e>>3];g=+h[G>>3];i=(c[H>>2]|0)==0}n=n+m;h[b+384>>3]=n;j=k+j;h[b+392>>3]=j;m=n+g;h[b+400>>3]=m;N=+h[I>>3];p=j+N;h[b+408>>3]=p;k=+h[b+352>>3];h[b+320>>3]=g/k;h[b+328>>3]=N/k;k=+h[q>>3];n=n*k/72.0;f=b+456|0;c[f>>2]=~~(n+(n>=0.0?.5:-.5));n=+h[r>>3];j=j*n/72.0;c[b+460>>2]=~~(j+(j>=0.0?.5:-.5));m=k*m/72.0;e=b+464|0;c[e>>2]=~~(m+(m>=0.0?.5:-.5));p=n*p/72.0;c[b+468>>2]=~~(p+(p>=0.0?.5:-.5));if(!i){c[J>>2]=c[f>>2];c[J+4>>2]=c[f+4>>2];LJ(K,J);I=K;K=c[I+4>>2]|0;b=f;c[b>>2]=c[I>>2];c[b+4>>2]=K;c[J>>2]=c[e>>2];c[J+4>>2]=c[e+4>>2];LJ(L,J);b=L;K=c[b+4>>2]|0;L=e;c[L>>2]=c[b>>2];c[L+4>>2]=K}l=M;return}function _J(a,b){a=a|0;b=b|0;var c=0.0;c=+h[b>>3];h[a>>3]=+h[b+8>>3];h[a+8>>3]=c;return}function $J(a,b,d){a=a|0;b=b|0;d=d|0;d=(d<<24>>24)+-66|0;switch(d>>>1|d<<31|0){case 9:{c[b+176>>2]=(c[b+168>>2]|0)+-1;b=0;d=-1;break}case 0:{b=0;d=1;break}case 5:{b=1;d=0;break}case 8:{c[b+172>>2]=(c[b+164>>2]|0)+-1;b=-1;d=0;break}default:{b=0;d=0}}c[a>>2]=b;c[a+4>>2]=d;return}function aK(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;g=j;f=NA(d,101274)|0;i=b+296|0;c[i>>2]=(f|0)==0?101283:f;d=NA(d,101287)|0;f=b+300|0;d=(d|0)==0?101300:d;c[f>>2]=d;d=h6(c[i>>2]|0,d)|0;if(d|0){c[g>>2]=a[d>>0];dA(0,101302,g)|0;c[f>>2]=195341}d=Y3(e)|0;c[b+304>>2]=d;h=b+308|0;f=0;b=0;while(1){e=i6(d,c[i>>2]|0)|0;if(!e)break;g=b+1|0;if((b|0)<(f|0))d=c[h>>2]|0;else{f=f+128|0;d=c[h>>2]|0;b=f<<2;if(!d)d=IK(b)|0;else d=KK(d,b)|0;c[h>>2]=d}c[d+(g<<2)>>2]=e;b=g;d=0}if(b|0){i=KK(c[h>>2]|0,(b<<2)+8|0)|0;c[h>>2]=i;c[i>>2]=0;c[(c[h>>2]|0)+(b+1<<2)>>2]=0}l=j;return b|0}function bK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m;j=a+312|0;d=IK((c[j>>2]<<2)+8|0)|0;e=0;i=1;while(1){g=c[j>>2]|0;h=e+1|0;f=d+(h<<2)|0;if((i|0)>(g|0))break;if((sJ(a,i,g,b)|0)<<24>>24){c[f>>2]=i;e=h}i=i+1|0}if(!e){c[k>>2]=b;dA(0,101173,k)|0;l6(d);d=0}else{c[d>>2]=e;c[f>>2]=(c[j>>2]|0)+1}l=m;return d|0}function cK(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0.0;d=c[b+16>>2]|0;g=+h[d+16>>3];h[d+48>>3]=g-+h[d+88>>3];f=+h[d+24>>3];e=+h[d+80>>3]*.5;h[d+56>>3]=f-e;h[d+64>>3]=g+ +h[d+96>>3];h[d+72>>3]=f+e;b=UA(a,b)|0;while(1){if(!b)break;dK(b);b=WA(a,b)|0}return}function dK(a){a=a|0;a=c[(c[a+16>>2]|0)+8>>2]|0;if(a|0)eK(a);return}function eK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=l;l=l+240|0;v=C+192|0;u=C+176|0;w=C+64|0;x=C+32|0;y=C;z=C+144|0;A=C+112|0;B=a+4|0;if((c[B>>2]|0)<=0)Aa(101441,100207,3994,101455);b=c[a>>2]|0;d=w;e=b;f=d+48|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));d=v;e=b;f=d+48|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));fK(x,v);i=x+8|0;j=y+8|0;k=x+16|0;m=y+16|0;n=x+24|0;o=y+24|0;p=w+8|0;q=w+12|0;r=w+32|0;s=w+4|0;t=w+16|0;g=0;while(1){if((g|0)>=(c[B>>2]|0))break;if((g|0)>0){b=(c[a>>2]|0)+(g*48|0)|0;d=w;e=b;f=d+48|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));d=v;e=b;f=d+48|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));fK(y,v);h[x>>3]=+h[(+h[x>>3]<+h[y>>3]?x:y)>>3];h[i>>3]=+h[(+h[i>>3]<+h[j>>3]?x:y)+8>>3];h[k>>3]=+h[(+h[k>>3]>+h[m>>3]?x:y)+16>>3];h[n>>3]=+h[(+h[n>>3]>+h[o>>3]?x:y)+24>>3]}b=c[p>>2]|0;if(b|0){f=c[w>>2]|0;c[u>>2]=c[t>>2];c[u+4>>2]=c[t+4>>2];c[u+8>>2]=c[t+8>>2];c[u+12>>2]=c[t+12>>2];c[v>>2]=c[f>>2];c[v+4>>2]=c[f+4>>2];c[v+8>>2]=c[f+8>>2];c[v+12>>2]=c[f+12>>2];WH(z,u,v,1.0,b);c[y>>2]=c[z>>2];c[y+4>>2]=c[z+4>>2];c[y+8>>2]=c[z+8>>2];c[y+12>>2]=c[z+12>>2];c[y+16>>2]=c[z+16>>2];c[y+20>>2]=c[z+20>>2];c[y+24>>2]=c[z+24>>2];c[y+28>>2]=c[z+28>>2];h[x>>3]=+h[(+h[x>>3]<+h[y>>3]?x:y)>>3];h[i>>3]=+h[(+h[i>>3]<+h[j>>3]?x:y)+8>>3];h[k>>3]=+h[(+h[k>>3]>+h[m>>3]?x:y)+16>>3];h[n>>3]=+h[(+h[n>>3]>+h[o>>3]?x:y)+24>>3]}b=c[q>>2]|0;if(b|0){f=(c[w>>2]|0)+((c[s>>2]|0)+-1<<4)|0;c[u>>2]=c[r>>2];c[u+4>>2]=c[r+4>>2];c[u+8>>2]=c[r+8>>2];c[u+12>>2]=c[r+12>>2];c[v>>2]=c[f>>2];c[v+4>>2]=c[f+4>>2];c[v+8>>2]=c[f+8>>2];c[v+12>>2]=c[f+12>>2];WH(A,u,v,1.0,b);c[y>>2]=c[A>>2];c[y+4>>2]=c[A+4>>2];c[y+8>>2]=c[A+8>>2];c[y+12>>2]=c[A+12>>2];c[y+16>>2]=c[A+16>>2];c[y+20>>2]=c[A+20>>2];c[y+24>>2]=c[A+24>>2];c[y+28>>2]=c[A+28>>2];h[x>>3]=+h[(+h[x>>3]<+h[y>>3]?x:y)>>3];h[i>>3]=+h[(+h[i>>3]<+h[j>>3]?x:y)+8>>3];h[k>>3]=+h[(+h[k>>3]>+h[m>>3]?x:y)+16>>3];h[n>>3]=+h[(+h[n>>3]>+h[o>>3]?x:y)+24>>3]}g=g+1|0}B=a+8|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];c[B+8>>2]=c[x+8>>2];c[B+12>>2]=c[x+12>>2];c[B+16>>2]=c[x+16>>2];c[B+20>>2]=c[x+20>>2];c[B+24>>2]=c[x+24>>2];c[B+28>>2]=c[x+28>>2];l=C;return}function fK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0;n=l;l=l+48|0;i=n+32|0;j=n;k=c[b+4>>2]|0;if((k|0)<=0)Aa(101471,100207,3968,101483);if(((k>>>0)%3|0|0)!=1)Aa(101493,100207,3969,101483);m=j+16|0;d=c[b>>2]|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];e=i+8|0;f=j+8|0;g=j+24|0;b=1;while(1){if((b|0)>=(k|0))break;o=+h[d+(b<<4)+8>>3];t=b+1|0;p=+h[d+(t<<4)+8>>3];r=(+h[d+(b<<4)>>3]+ +h[d+(t<<4)>>3])*.5;h[i>>3]=r;p=(o+p)*.5;h[e>>3]=p;o=+h[(+h[j>>3]>3];h[j>>3]=o;s=+h[(+h[f>>3]>3];h[f>>3]=s;r=+h[(+h[m>>3]>r?m:i)>>3];h[m>>3]=r;p=+h[(+h[g>>3]>p?m:i)+8>>3];h[g>>3]=p;t=d+(b+2<<4)|0;c[i>>2]=c[t>>2];c[i+4>>2]=c[t+4>>2];c[i+8>>2]=c[t+8>>2];c[i+12>>2]=c[t+12>>2];q=+h[i>>3];h[j>>3]=+h[(o>3];o=+h[e>>3];h[f>>3]=+h[(s>3];h[m>>3]=+h[(r>q?m:i)>>3];h[g>>3]=+h[(p>o?m:i)+8>>3];b=b+3|0}c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];c[a+16>>2]=c[j+16>>2];c[a+20>>2]=c[j+20>>2];c[a+24>>2]=c[j+24>>2];c[a+28>>2]=c[j+28>>2];l=n;return}function gK(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0;t=+h[a>>3];u=+h[c>>3];o=t>=u;q=c+8|0;r=c+16|0;m=a+8|0;s=c+24|0;if((o?t<=+h[r>>3]:0)?(d=+h[m>>3],d>=+h[q>>3]):0)c=d<=+h[s>>3];else c=0;d=+h[b>>3];j=d>=u;a=b+8|0;if((j?d<=+h[r>>3]:0)?(e=+h[a>>3],e>=+h[q>>3]):0){a=e<=+h[s>>3];if(!(c^a))if(c&a)a=1;else{n=e;p=12}else a=0}else if(c)a=0;else{n=+h[a>>3];p=12}a:do if((p|0)==12){l=+h[m>>3];do if(t==d){u=+h[q>>3];if(o&(l>=u^n>=u)?t<=+h[r>>3]:0){a=0;break a}}else{if(l==n){if(!(o^j))break;if(!(l>=+h[q>>3]))break;if(!(l<=+h[s>>3]))break;else{a=0;break a}}k=(n-l)/(d-t);p=t>3];if(!(!(u>=f)|!(u<=d)|!(e>=i))?e<=+h[s>>3]:0){a=0;break a}g=+h[r>>3];e=e+k*(g-u);if(e>=i?!(!(g<=d)|(g>=f?!(e<=+h[s>>3]):1)):0){a=0;break a}r=l=f)|(!(d>=u)|!(d<=g))))){a=0;break a}n=+h[s>>3];t=d+(n-i)/k;if(!(!(n<=e)|(!(n>=f)|(!(t>=u)|!(t<=g))))){a=0;break a}}while(0);a=-1}while(0);return a|0}function hK(a){a=a|0;var b=0,c=0.0;b=a+16|0;c=+h[b>>3];h[a+32>>3]=c;h[a+48>>3]=c;h[a+40>>3]=+h[a+24>>3];h[a+56>>3]=+h[a+8>>3];h[b>>3]=+h[a>>3];return}function iK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0.0;if((c[47175]|0)!=(d|0)){X3(+(d|0)/6.283185307179586,186496,186504);c[47175]=d}f=+h[b>>3];i=+h[23313];g=+h[b+8>>3];e=+h[23312];h[a>>3]=f*i-g*e;h[a+8>>3]=i*g+f*e;return}function jK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0.0,i=0,j=0,k=0;k=l;l=l+16|0;f=k;e=+h[b>>3];i=b+8|0;g=+h[i>>3];a:do switch(d|0){case 0:{j=11;break}case 90:{h[b>>3]=g;e=-e;j=10;break}case 180:{e=-g;j=10;break}case 270:{h[b>>3]=g;j=10;break}default:{if((d|0)<0){c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];kK(a,f,0-d|0);break a}if((d|0)>360){c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];jK(a,f,(d>>>0)%360|0);break a}else{c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];iK(a,f,d);break a}}}while(0);if((j|0)==10){h[i>>3]=e;j=11}if((j|0)==11){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2]}l=k;return}function kK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0.0,j=0,k=0,m=0;m=l;l=l+16|0;g=m;e=+h[b>>3];j=b+8|0;f=+h[j>>3];i=-f;a:do switch(d|0){case 0:{k=10;break}case 90:{f=i;k=8;break}case 180:{e=i;k=9;break}case 270:{k=8;break}default:{if((d|0)<0){c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];jK(a,g,0-d|0);break a}if((d|0)>360){c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];kK(a,g,(d>>>0)%360|0);break a}else{c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];iK(a,g,360-d|0);break a}}}while(0);if((k|0)==8){h[b>>3]=f;k=9}if((k|0)==9){h[j>>3]=e;k=10}if((k|0)==10){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2]}l=m;return}function lK(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0;g=+h[c>>3];d=+h[c+8>>3];f=+h[b>>3]+d;e=+h[b+24>>3]+g;d=+h[b+16>>3]+d;h[a>>3]=+h[b+8>>3]+g;h[a+8>>3]=f;h[a+16>>3]=e;h[a+24>>3]=d;return}function mK(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0;f=+h[a>>3];e=+h[b>>3]-f;g=+h[a+8>>3];d=+h[b+8>>3]-g;f=e*(+h[c+8>>3]-g)-d*(+h[c>>3]-f);f=f*f;return +(f<1.0e-10?0.0:f/(e*e+d*d))}function nK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g+8|0;e=g;a=NA(a,b)|0;if(a|0?(c[f>>2]=e,(q4(a,101510,f)|0)>0):0)h[d>>3]=+h[e>>3];l=g;return}function oK(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;g=n+8|0;i=n;e=HK(96)|0;m=b+16|0;c[(c[m>>2]|0)+8>>2]=e;e=NA(b,101514)|0;if(!e){e=Na(101523)|0;if(e|0)k=3}else k=3;if((k|0)==3)za(101535,e|0,1)|0;e=(pK(b)|0)&255;a[(c[m>>2]|0)+115>>0]=e;if((c[47179]|0)==0?(e=NA(b,101546)|0,c[47178]=e,(e|0)==0):0)c[47178]=c[47177];f=+YO(b,DA(b,0,101556,0)|0,0.0,0.0);h[c[(c[m>>2]|0)+8>>2]>>3]=f;e=NA(b,101564)|0;a:do if(!e)e=0;else{switch(a[e>>0]|0){case 76:{if(!(f2(e,101572)|0)){e=1;break a}break}case 66:{if(!(f2(e,101575)|0)){e=2;break a}break}case 82:{e=(f2(e,101578)|0)==0;e=e?3:0;break a}default:{e=0;break a}}e=0}while(0);c[(c[m>>2]|0)+116>>2]=e<<2|(d<<24>>24==0?0:e);f=+YO(b,DA(b,0,101581,0)|0,.25,.02);h[i>>3]=f;f=f*72.0;c[(c[m>>2]|0)+248>>2]=~~(f+(f>=0.0?.5:-.5));e=_O(b,DA(b,0,101589,0)|0,0)|0;if(e){c[g>>2]=i;if(q4(e,101510,g)|0){f=+h[i>>3];if(f<.02){h[i>>3]=.02;f=.02}}else{h[i>>3]=.5;f=.5}if(C4(e,101597)|0)a[(c[m>>2]|0)+276>>0]=1}else{h[i>>3]=.5;f=.5}f=f*72.0;c[(c[m>>2]|0)+252>>2]=~~(f+(f>=0.0?.5:-.5));i=(XO(b,DA(b,0,101605,0)|0,0,0)|0)&255;a[(c[m>>2]|0)+243>>0]=i;i=nP(_O(b,DA(b,0,101615,0)|0,0)|0,20724,20740)|0;c[(c[m>>2]|0)+244>>2]=i;qK(b);i=rK(b,101625,(c[(c[m>>2]|0)+8>>2]|0)+64|0)|0;e=c[(c[m>>2]|0)+8>>2]|0;a[e+80>>0]=i;rK(b,101630,e+48|0)|0;e=bP(NA(b,101635)|0)|0;a[(c[(c[m>>2]|0)+8>>2]|0)+82>>0]=e;e=NA(b,101642)|0;do if(!e){e=NA(b,101649)|0;if(e|0){e=(a[e>>0]|32)<<24>>24==108&1;k=27;break}e=NA(b,101661)|0;if(e|0){e=bP(e)|0;k=27}}else{e=(d6(e)|0)==90&1;k=27}while(0);if((k|0)==27)a[(c[(c[m>>2]|0)+8>>2]|0)+81>>0]=e;c[47182]=nP(NA(b,101671)|0,20756,20772)|0;a[195236]=bP(NA(b,101683)|0)|0;c[47185]=0;c[47186]=0;h[(c[(c[m>>2]|0)+8>>2]|0)+24>>3]=0.0;e=NA(b,101695)|0;if((e|0)!=0?(a[e>>0]|0)!=0:0)k=32;else k=30;if(((k|0)==30?(j=NA(b,101699)|0,j|0):0)?a[j>>0]|0:0){e=j;k=32}if((k|0)==32){f=+a6(e);h[(c[(c[m>>2]|0)+8>>2]|0)+24>>3]=f}sK(b);h[23316]=1.e+37;c[47194]=DA(b,0,101710,0)|0;c[47197]=DA(b,0,141337,0)|0;c[47198]=DA(b,0,105797,0)|0;c[47199]=DA(b,1,141351,0)|0;c[47200]=DA(b,1,141419,0)|0;c[47201]=DA(b,1,108531,0)|0;c[47202]=DA(b,1,141126,0)|0;c[47203]=DA(b,1,101719,0)|0;c[47219]=DA(b,1,141385,0)|0;c[47212]=DA(b,1,101729,0)|0;c[47213]=DA(b,1,101738,0)|0;c[47214]=DA(b,1,101747,0)|0;k=DA(b,1,108525,0)|0;c[47216]=k;if(!k)c[47216]=DA(b,1,108525,105794)|0;c[47217]=DA(b,1,101757,0)|0;c[47220]=DA(b,1,101605,0)|0;c[47234]=DA(b,1,101764,0)|0;c[47223]=DA(b,1,101710,0)|0;c[47215]=DA(b,1,105797,0)|0;c[47221]=DA(b,1,141379,0)|0;c[47222]=DA(b,1,101773,0)|0;c[47225]=DA(b,1,101785,0)|0;c[47224]=DA(b,1,101649,0)|0;c[47226]=DA(b,1,101790,0)|0;c[47227]=DA(b,1,141327,0)|0;c[47228]=DA(b,1,137598,0)|0;c[47218]=DA(b,1,101801,0)|0;c[47229]=DA(b,1,101811,0)|0;c[47230]=DA(b,1,101817,0)|0;c[47231]=DA(b,1,101823,0)|0;c[47232]=DA(b,1,101831,0)|0;c[47233]=DA(b,1,101840,0)|0;c[47235]=DA(b,1,141337,0)|0;c[47236]=DA(b,2,101842,0)|0;c[47238]=DA(b,2,141126,0)|0;c[47239]=DA(b,2,101719,0)|0;c[47248]=DA(b,2,101729,0)|0;c[47249]=DA(b,2,101738,0)|0;c[47250]=DA(b,2,101747,0)|0;c[47251]=DA(b,2,108525,0)|0;c[47252]=DA(b,2,101757,0)|0;c[47261]=DA(b,2,101849,0)|0;c[47253]=DA(b,2,101860,0)|0;c[47264]=DA(b,2,101864,0)|0;c[47265]=DA(b,2,101874,0)|0;c[47266]=DA(b,2,101884,0)|0;c[47267]=DA(b,2,101894,0)|0;c[47268]=DA(b,2,101904,0)|0;c[47269]=DA(b,2,101918,0)|0;c[47270]=DA(b,2,101932,0)|0;c[47271]=DA(b,2,101947,0)|0;c[47272]=DA(b,2,101961,0)|0;c[47237]=DA(b,2,101972,0)|0;c[47256]=DA(b,2,101605,0)|0;c[47254]=DA(b,2,141385,0)|0;c[47255]=DA(b,2,101979,0)|0;c[47257]=DA(b,2,101988,0)|0;c[47258]=DA(b,2,101998,0)|0;c[47259]=DA(b,2,101811,0)|0;c[47260]=DA(b,2,101823,0)|0;c[47273]=DA(b,2,102009,0)|0;c[47274]=DA(b,2,102018,0)|0;c[47275]=DA(b,2,101764,0)|0;e=ZH(b)|0;c[(c[(c[m>>2]|0)+8>>2]|0)+88>>2]=e;e=NA(b,141363)|0;if(e|0?a[e>>0]|0:0){b=CK(e,b)|0;c[(c[(c[m>>2]|0)+8>>2]|0)+92>>2]=b}l=n;return}function pK(a){a=a|0;var b=0,d=0;d=l;l=l+16|0;b=d;a=$O(a,DA(a,0,102108,0)|0,102116)|0;if(((((((C3(a,102122)|0)!=0?(C3(a,102130)|0)!=0:0)?(C3(a,102137)|0)!=0:0)?(C3(a,102140)|0)!=0:0)?(C3(a,102151)|0)!=0:0)?(C3(a,102162)|0)!=0:0)?(C3(a,102172)|0)!=0:0)if((C3(a,102183)|0)!=0?(C3(a,102189)|0)!=0:0)if((C3(a,102116)|0)!=0?(C3(a,102194)|0)!=0:0){c[b>>2]=a;dA(0,102199,b)|0;a=0}else a=0;else a=2;else a=1;l=d;return a|0}function qK(b){b=b|0;var d=0.0,e=0,f=0;e=NA(b,102066)|0;a:do if(e|0?(f=a[e>>0]|0,f<<24>>24):0){b=b+16|0;switch(f<<24>>24|0){case 97:{if(f<<24>>24!=97)break a;if(f2(e,102072)|0)break a;c[(c[(c[b>>2]|0)+8>>2]|0)+84>>2]=4;break a}case 99:{if(f<<24>>24!=99)break a;if(f2(e,102077)|0)break a;c[(c[(c[b>>2]|0)+8>>2]|0)+84>>2]=3;break a}case 101:{if(f<<24>>24!=101)break a;if(f2(e,102086)|0)break a;c[(c[(c[b>>2]|0)+8>>2]|0)+84>>2]=5;break a}case 102:{if(f<<24>>24!=102)break a;if(f2(e,102093)|0)break a;c[(c[(c[b>>2]|0)+8>>2]|0)+84>>2]=2;break a}default:{d=+a6(e);if(!(d>0.0))break a;f=c[(c[b>>2]|0)+8>>2]|0;c[f+84>>2]=1;h[f+16>>3]=d;break a}}}while(0);return}function rK(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+48|0;m=o+32|0;i=o+16|0;k=o+8|0;j=o;n=o+40|0;a[n>>0]=0;d=NA(b,d)|0;do if(d){c[i>>2]=k;c[i+4>>2]=j;c[i+8>>2]=n;i=(q4(d,102050,i)|0)>1;g=+h[k>>3];f=+h[j>>3];b=e+8|0;if(i&g>0.0&f>0.0){g=g*72.0;h[e>>3]=+(~~(g+(g>=0.0?.5:-.5))|0);g=f*72.0;h[b>>3]=+(~~(g+(g>=0.0?.5:-.5))|0);b=(a[n>>0]|0)==33;break}a[n>>0]=0;c[m>>2]=k;c[m+4>>2]=n;m=(q4(d,102060,m)|0)>0;f=+h[k>>3];if(m&f>0.0){g=f*72.0;g=+(~~(g+(g>=0.0?.5:-.5))|0);h[e>>3]=g;h[b>>3]=g;b=(a[n>>0]|0)==33}else b=0}else b=0;while(0);l=o;return b&1|0}function sK(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0,j=0;d=NA(b,108525)|0;do if(d|0?a[d>>0]|0:0){e=(c[(c[b+60>>2]|0)+16>>2]|0)+113|0;a[e>>0]=a[e>>0]|8;e=(gD(d)|0)!=0;i=+YO(b,DA(b,0,101729,0)|0,14.0,1.0);j=$O(b,DA(b,0,101738,0)|0,108295)|0;d=xK(b,d,e?2:0,i,j,$O(b,DA(b,0,101747,0)|0,137615)|0)|0;j=b+16|0;c[(c[j>>2]|0)+12>>2]=d;d=NA(b,105929)|0;e=(d|0)!=0;do if((vC(b)|0)==(b|0)){if(e?(a[d>>0]|0)==116:0){d=1;break}d=0}else{if(e?(a[d>>0]|0)==98:0){d=0;break}d=1}while(0);e=NA(b,102027)|0;a:do if(e){f=d&255;switch(a[e>>0]|0){case 108:{d=(f|2)&255;break a}case 114:{d=(f|4)&255;break a}default:break a}}while(0);a[(c[j>>2]|0)+275>>0]=d;if((vC(b)|0)!=(b|0)){d=c[(c[j>>2]|0)+12>>2]|0;g=+h[d+24>>3]+16.0;i=+h[d+32>>3]+8.0;b=(c[(c[(vC(b)|0)+16>>2]|0)+116>>2]&1|0)==0;d=c[j>>2]|0;e=a[d+275>>0]<<1&2;if(b){b=e&255;h[d+48+(b<<4)>>3]=g;h[d+48+(b<<4)+8>>3]=i;break}else{b=(e^3)&255;h[d+48+(b<<4)>>3]=i;h[d+48+(b<<4)+8>>3]=g;break}}}while(0);return}function tK(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;d=c[e>>2]|0;b=c[d+8>>2]|0;do if(!b)b=d;else{d=c[b+88>>2]|0;if(d){CH(d);d=c[e>>2]|0;b=c[d+8>>2]|0;if(!b){b=d;break}}l6(c[b+92>>2]|0);b=c[e>>2]|0}while(0);l6(c[b+8>>2]|0);e=c[e>>2]|0;c[e+8>>2]=0;AK(c[e+12>>2]|0);XC(a,0,137786);return}function uK(a){a=a|0;var b=0,d=0;d=l;l=l+16|0;b=d;switch(a|0){case 0:{a=102272;break}case 1:{a=102140;break}case 2:{a=102278;break}default:{c[b>>2]=a;dA(1,102242,b)|0;a=102272}}l=d;return a|0}function vK(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=c[d>>2]|0;m=d+24|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;if(a[f>>0]|0){g=IK((D3(f)|0)+1|0)|0;a[g>>0]=0;k=d+12|0;e=g;a:while(1){b:while(1){i=f+1|0;h=a[f>>0]|0;if(!(h<<24>>24))break a;j=e+1|0;f=f+2|0;if(!(h<<24>>24==-1|((h&255)<161|(c[k>>2]|0)!=2))){a[e>>0]=h;i=a[i>>0]|0;e=e+2|0;a[j>>0]=i;if(!(i<<24>>24))break a;else continue}switch(h<<24>>24){case 92:break b;case 10:{l=12;break b}default:{}}a[e>>0]=h;e=j;f=i}if((l|0)==12){l=0;a[e>>0]=0;wK(b,d,g,110);e=j;g=j;f=i;continue}h=a[i>>0]|0;switch(h<<24>>24|0){case 114:case 108:case 110:{a[e>>0]=0;wK(b,d,g,a[i>>0]|0);g=j;break}default:a[e>>0]=h}e=j;f=(a[i>>0]|0)==0?i:f}if((g|0)!=(e|0)){a[e>>0]=0;wK(b,d,g,110)}d=d+40|0;c[d>>2]=c[m>>2];c[d+4>>2]=c[m+4>>2];c[d+8>>2]=c[m+8>>2];c[d+12>>2]=c[m+12>>2]}return}function wK(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+32|0;r=t+16|0;q=t;s=e+76|0;m=b[s>>1]|0;o=e+72|0;n=c[o>>2]|0;i=m+2|0;if(!n)p=HK(i*56|0)|0;else p=JK(n,i,56,m+1|0)|0;c[o>>2]=p;i=b[s>>1]|0;m=i<<16>>16;n=p+(m*56|0)|0;c[n>>2]=f;a[p+(m*56|0)+48>>0]=g;j=+h[e+16>>3];if((f|0)!=0?(a[f>>0]|0)!=0:0){c[46636]=c[e+4>>2];h[23320]=j;i=c[d+144>>2]|0;c[p+(m*56|0)+4>>2]=eb[c[i>>2]&63](i,186544,1)|0;JO(q,d,n);k=+h[q>>3];h[r>>3]=k;j=+h[q+8>>3];i=b[s>>1]|0}else{h[r>>3]=0.0;j=+(~~(j*1.2)|0);h[p+(m*56|0)+40>>3]=j;k=0.0}b[s>>1]=i+1<<16>>16;s=e+24|0;h[s>>3]=+h[(+h[s>>3]>k?s:r)>>3];s=e+32|0;h[s>>3]=j+ +h[s>>3];l=t;return}function xK(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=+g;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+32|0;r=u+16|0;q=u+8|0;p=u;t=HK(88)|0;switch(FC(b)|0){case 0:{m=0;s=c[b+60>>2]|0;n=b;o=0;break}case 1:{m=0;s=vC(uC(b)|0)|0;n=0;o=b;break}case 2:{m=b;s=vC(uC(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0)|0;n=0;o=0;break}default:{m=0;s=0;n=0;o=0}}c[t+4>>2]=i;c[t+8>>2]=j;h[t+16>>3]=g;k=s+16|0;j=t+12|0;c[j>>2]=d[(c[k>>2]|0)+115>>0];a:do if(f&4){c[t>>2]=Y3(e)|0;if(f&2|0)a[t+82>>0]=1}else switch(f|0){case 2:{c[t>>2]=Y3(e)|0;a[t+82>>0]=1;if(!(zU(b,t)|0))break a;switch(FC(b)|0){case 0:{c[p>>2]=HB(n)|0;dA(3,102284,p)|0;break a}case 1:{c[q>>2]=HB(o)|0;dA(3,102306,q)|0;break a}case 2:{p=HB(c[((c[m>>2]&3|0)==3?m:m+48|0)+40>>2]|0)|0;q=(uB(s)|0)!=0;s=HB(c[((c[m>>2]&3|0)==2?m:m+-48|0)+40>>2]|0)|0;c[r>>2]=p;c[r+4>>2]=q?138041:142050;c[r+8>>2]=s;dA(3,102327,r)|0;break a}default:break a}}case 0:{i=yK(e,b,0)|0;c[t>>2]=i;if((c[j>>2]|0)==1)i=cQ(i)|0;else i=$P(i,s)|0;l6(c[t>>2]|0);c[t>>2]=i;vK(c[(c[k>>2]|0)+144>>2]|0,t);break a}default:Aa(102354,102370,166,102379)}while(0);l=u;return t|0}function yK(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;m=(b|0)!=0;switch(FC(d)|0){case 0:{i=HB(d)|0;g=D3(i)|0;f=c[(c[d+16>>2]|0)+12>>2]|0;if(f){f=c[f>>2]|0;if(m){v=0;t=2;u=2;s=2;h=2;y=102402;n=102399;j=105794;o=195341;r=195341;q=0;p=0;m=D3(f)|0;w=f;x=102396}else{v=0;t=2;u=2;s=2;h=2;y=102402;n=102399;j=105794;o=195341;r=195341;q=0;p=0;m=2;w=f;x=102396}}else{v=0;t=2;u=2;s=2;h=2;y=102402;n=102399;j=105794;o=195341;r=195341;q=0;p=0;m=2;w=102390;x=102396}break}case 1:{i=HB(uC(d)|0)|0;g=D3(i)|0;j=HB(d)|0;h=D3(j)|0;f=c[(c[d+16>>2]|0)+104>>2]|0;if(f){f=c[f>>2]|0;if(m){v=0;t=2;u=2;s=2;y=102402;n=102399;o=195341;r=195341;q=0;p=0;m=D3(f)|0;w=f;x=102396}else{v=0;t=2;u=2;s=2;y=102402;n=102399;o=195341;r=195341;q=0;p=0;m=2;w=f;x=102396}}else{v=0;t=2;u=2;s=2;y=102402;n=102399;o=195341;r=195341;q=0;p=0;m=2;w=102390;x=102396}break}case 2:{h=d+48|0;i=HB(vC(uC(c[((c[d>>2]&3|0)==3?d:h)+40>>2]|0)|0)|0)|0;g=D3(i)|0;l=HB(c[((c[d>>2]&3|0)==3?d:h)+40>>2]|0)|0;k=D3(l)|0;f=d+16|0;r=c[(c[f>>2]|0)+52>>2]|0;if(!r)p=0;else p=D3(r)|0;n=HB(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)|0;f=c[f>>2]|0;o=c[f+92>>2]|0;if(!o)q=0;else q=D3(o)|0;j=D3(n)|0;f=c[f+96>>2]|0;if(f){f=c[f>>2]|0;if(m)m=D3(f)|0;else m=2}else{m=2;f=102390}x=(uB(vC(uC(c[((c[d>>2]&3|0)==3?d:h)+40>>2]|0)|0)|0)|0)==0;v=1;t=k;u=j;s=k+2+(p|0?p+1|0:0)+j+(q|0?q+1|0:0)|0;h=2;y=l;j=105794;w=f;x=x?142050:138041;break}default:{v=0;t=2;u=2;s=2;h=2;g=2;y=102402;n=102399;j=105794;i=102393;o=195341;r=195341;q=0;p=0;m=2;w=102390;x=102396}}e=(e|0)!=0;k=0;f=b;a:while(1){d=f+1|0;l=k+1|0;switch(a[f>>0]|0){case 0:break a;case 92:break;default:{k=l;f=d;continue a}}f=f+2|0;switch(a[d>>0]|0){case 71:{k=k+g|0;continue a}case 78:{k=k+h|0;continue a}case 69:{k=k+s|0;continue a}case 72:{k=k+u|0;continue a}case 84:{k=k+t|0;continue a}case 76:{k=k+m|0;continue a}case 92:{if(e){k=l;continue a}break}default:{}}k=k+2|0}t=IK(l)|0;s=(v|0)==0;p=(p|0)==0;m=(q|0)==0;f=t;g=b;b:while(1){k=g+1|0;h=a[g>>0]|0;if(!(h<<24>>24))break;d=f+1|0;if(h<<24>>24!=92){a[f>>0]=h;f=d;g=k;continue}l=g+2|0;g=a[k>>0]|0;switch(g<<24>>24|0){case 71:{g=i;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=l;continue b}g=g+1|0;f=f+1|0}}case 78:{g=j;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=l;continue b}g=g+1|0;f=f+1|0}}case 69:{if(s){g=l;continue b}else g=y;while(1){b=a[g>>0]|0;a[f>>0]=b;h=f+1|0;if(!(b<<24>>24))break;else{g=g+1|0;f=h}}c:do if(p)g=x;else{a[f>>0]=58;g=r;f=h;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=x;break c}g=g+1|0;f=f+1|0}}while(0);while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=n;break}g=g+1|0;f=f+1|0}while(1){b=a[g>>0]|0;a[f>>0]=b;h=f+1|0;if(!(b<<24>>24))break;else{g=g+1|0;f=h}}if(m){g=l;continue b}a[f>>0]=58;g=o;f=h;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=l;continue b}g=g+1|0;f=f+1|0}}case 84:{g=y;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=l;continue b}g=g+1|0;f=f+1|0}}case 72:{g=n;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=l;continue b}f=f+1|0;g=g+1|0}}case 76:{g=w;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=l;continue b}f=f+1|0;g=g+1|0}}case 92:{if(e){a[f>>0]=92;f=d;g=l;continue b}break}default:{}}a[f>>0]=92;a[d>>0]=g;f=f+2|0;g=l}a[f>>0]=0;return t|0}function zK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(a|0){d=a;e=0;while(1){if((e|0)>=(b|0))break;if(!e)l6(c[d>>2]|0);g=c[d+8>>2]|0;if(g|0?(f=c[d+12>>2]|0,f|0):0)db[f&127](g);d=d+56|0;e=e+1|0}l6(a)}return}function AK(d){d=d|0;var e=0;if(d|0){l6(c[d>>2]|0);e=d+72|0;if(a[d+82>>0]|0){e=c[e>>2]|0;if(e|0)kU(e,1)}else zK(c[e>>2]|0,b[d+76>>1]|0);l6(d)}return}function BK(d,e,f){d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+32|0;q=u+16|0;r=u;m=c[d+16>>2]|0;s=m+12|0;t=c[s>>2]|0;c[s>>2]=e;o=f+72|0;if(!(a[f+82>>0]|0)){p=f+76|0;if((b[p>>1]|0)>=1){cS(d,0);fS(d,c[f+8>>2]|0);e=f+64|0;i=f+48|0;j=f+32|0;switch(a[f+80>>0]|0){case 116:{k=+h[e>>3];g=k+ +h[i>>3]*.5;break}case 98:{k=+h[e>>3];g=+h[j>>3]+(k-+h[i>>3]*.5);break}default:{k=+h[e>>3];g=k+ +h[j>>3]*.5}}g=g-+h[f+16>>3];n=r+8|0;h[n>>3]=g;if(b[m+260>>1]&512)h[n>>3]=g-k;m=f+40|0;i=f+56|0;e=0;while(1){if((e|0)>=(b[p>>1]|0))break;f=c[o>>2]|0;j=f+(e*56|0)|0;switch(a[f+(e*56|0)+48>>0]|0){case 108:{g=+h[i>>3]-+h[m>>3]*.5;break}case 114:{g=+h[i>>3]+ +h[m>>3]*.5;break}default:g=+h[i>>3]}h[r>>3]=g;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];eS(d,q,j);h[n>>3]=+h[n>>3]-+h[(c[o>>2]|0)+(e*56|0)+40>>3];e=e+1|0}dS(d);i=18}}else{RT(d,c[o>>2]|0,f);i=18}if((i|0)==18)c[s>>2]=t;l=u;return}function CK(a,b){a=a|0;b=b|0;return yK(a,b,1)|0}function DK(a){a=a|0;return EK(a,0)|0}function EK(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=c[47276]|0;if(!e){c[47277]=64;e=IK(64)|0;c[47276]=e}j=d<<24>>24!=0;i=0;f=0;h=b;while(1){if(!h)break;d=a[h>>0]|0;if(!(d<<24>>24))break;b=c[47277]|0;if((i|0)>(b+-8|0)){e=b<<1;c[47277]=e;e=KK(c[47276]|0,e)|0;c[47276]=e;e=e+i|0;d=a[h>>0]|0}a:do switch(d<<24>>24){case 38:{if(!j?(FK(h)|0)!=0:0)k=19;else{f=5;d=102431}break}case 60:{f=4;d=102454;break}case 62:{f=4;d=102437;break}case 45:{f=5;d=102448;break}default:{if((f|0)!=0&d<<24>>24==32)if((a[f>>0]|0)==32){f=6;d=102424;break a}else{k=19;break a}switch(d<<24>>24){case 34:{f=6;d=102411;break a}case 39:{f=5;d=102442;break a}case 10:if(j){f=5;d=102418;break a}else{k=19;break a}case 13:if(j){f=5;d=102405;break a}else{k=19;break a}default:{k=19;break a}}}}while(0);if((k|0)==19){k=0;f=1;d=h}g=e+f|0;b=f;while(1){if(!b)break;a[e>>0]=a[d>>0]|0;b=b+-1|0;d=d+1|0;e=e+1|0}b=h;i=f+i|0;e=g;h=h+1|0;f=b}a[e>>0]=0;return c[47276]|0}function FK(b){b=b|0;var c=0,d=0;d=b+1|0;c=a[d>>0]|0;a:do if(c<<24>>24==35){d=b+2|0;c=a[d>>0]|0;switch(c<<24>>24){case 88:case 120:break;default:{b=d;while(1){d=b+1|0;if((c+-48&255)>=10)break a;b=d;c=a[d>>0]|0}}}d=b+3|0;while(1){c=a[d>>0]|0;if((c+-48&255)>=10)switch(c<<24>>24){case 65:case 66:case 67:case 68:case 69:case 70:case 97:case 98:case 99:case 100:case 101:case 102:break;default:break a}d=d+1|0}}else while(1){b=d+1|0;if(((c&-33)+-65&255)>=26)break a;d=b;c=a[b>>0]|0}while(0);return c<<24>>24==59|0}function GK(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[47278]|0;if(!d){c[47279]=64;d=IK(64)|0;c[47278]=d;i=0;h=b}else{i=0;h=b}while(1){if(!h)break;b=a[h>>0]|0;if(!(b<<24>>24))break;e=c[47279]|0;if((i|0)>(e+-8|0)){d=e<<1;c[47279]=d;d=KK(c[47278]|0,d)|0;c[47278]=d;d=d+i|0;b=a[h>>0]|0}switch(b<<24>>24){case 38:{if(!(FK(h)|0)){f=5;b=102431}else j=12;break}case 60:{f=4;b=102454;break}case 62:{f=4;b=102437;break}case 34:{f=6;b=102411;break}case 39:{f=5;b=102442;break}default:j=12}if((j|0)==12){j=0;f=1;b=h}g=d+f|0;e=f;while(1){if(!e)break;a[d>>0]=a[b>>0]|0;e=e+-1|0;b=b+1|0;d=d+1|0}i=f+i|0;d=g;h=h+1|0}a[d>>0]=0;return c[47278]|0}function HK(a){a=a|0;var b=0;if(!a)a=0;else{b=IK(a)|0;u6(b|0,0,a|0)|0;a=b}return a|0}function IK(a){a=a|0;if(a){a=k6(a)|0;if(!a){_3(112041,14,1,c[15715]|0)|0;a=0}}else a=0;return a|0}function JK(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=n6(a,S(d,b)|0)|0;if(!((b|0)!=0&(a|0)==0)){if(b>>>0>e>>>0)u6(a+(S(e,d)|0)|0,0,S(b-e|0,d)|0)|0}else _3(112041,14,1,c[15715]|0)|0;return a|0}function KK(a,b){a=a|0;b=b|0;a=n6(a,b)|0;if((b|0)!=0&(a|0)==0)_3(112041,14,1,c[15715]|0)|0;return a|0}function LK(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0.0,n=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+80|0;s=v+40|0;r=v+32|0;q=v+24|0;n=v;t=4;u=k6(40)|0;c[u>>2]=0;g=v+68|0;i=v+64|0;if(a[195234]|0){o=0;na(62,b|0,g|0,i|0);j=o;o=0;if((j|0)!=0&(p|0)!=0){k=A6(c[j>>2]|0,u|0,t|0)|0;if(!k)Ca(j|0,p|0);D=p}else k=-1;if((k|0)!=1){k=c[15715]|0;j=c[g>>2]|0;g=c[i>>2]|0;o=0;c[n>>2]=102503;c[n+4>>2]=j;c[n+8>>2]=g;c[n+12>>2]=e;c[n+16>>2]=d;aa(35,k|0,102459,n|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)!=1){o=0;oa(1);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)!=1)k=6;else{g=D;k=15}}else{g=D;k=15}}else{g=D;k=15}}else k=6;do if((k|0)==6){o=0;g=la(27,b|0)|0;i=o;o=0;if((i|0)!=0&(p|0)!=0){j=A6(c[i>>2]|0,u|0,t|0)|0;if(!j)Ca(i|0,p|0);D=p}else j=-1;if((j|0)!=1){if(!g){o=0;oa(2);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;break}}if((e|0)<1){o=0;oa(3);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;break}g=0;break}else{c[47280]=(f|0)>-1?f:30;u=x6(189124,1,u|0,t|0)|0;t=D;o=0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;break}g=0;k=15;break}}else{g=D;k=15}}while(0);a:do if((k|0)==15){b:while(1){if(g|0){g=2;break a}o=0;oa(4);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue}b=c[15715]|0;n=0;while(1){o=0;k=ea(2)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}if(!k)break;o=0;g=la(28,k|0)|0;i=o;o=0;if((i|0)!=0&(p|0)!=0){j=A6(c[i>>2]|0,u|0,t|0)|0;if(!j)Ca(i|0,p|0);D=p}else j=-1;if((j|0)==1){g=D;k=15;continue b}o=0;ha(25,k|0,g|0);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}n=n+1|0;do if(((n|0)%100|0|0)==0&(a[195234]|0)!=0){g=(n|0)%1e3|0;if((g|0)==100){o=0;ra(93,102503,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}o=0;c[q>>2]=n;aa(35,b|0,102521,q|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}break}o=0;c[r>>2]=n;aa(35,b|0,102521,r|0)|0;i=o;o=0;if((i|0)!=0&(p|0)!=0){j=A6(c[i>>2]|0,u|0,t|0)|0;if(!j)Ca(i|0,p|0);D=p}else j=-1;if((j|0)==1){g=D;k=15;continue b}if(!g){o=0;ra(94,10,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}}}while(0);if((n|0)>=(e|0))break}switch(d|0){case 1:{o=0;oa(5);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}break}case 2:{o=0;oa(6);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}break}default:{o=0;oa(7);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}o=0;oa(3);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}}}if(!(a[195234]|0)){g=0;break a}if((n|0)>99){o=0;ra(94,10,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue}}g=c[47320]|0;i=c[47321]|0;o=0;m=+ca(1);j=o;o=0;if((j|0)!=0&(p|0)!=0){k=A6(c[j>>2]|0,u|0,t|0)|0;if(!k)Ca(j|0,p|0);D=p}else k=-1;if((k|0)==1){g=D;k=15;continue}o=0;c[s>>2]=102503;c[s+4>>2]=g;c[s+8>>2]=i;c[s+12>>2]=n;h[s+16>>3]=m;aa(35,b|0,102525,s|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15}else break}g=0}while(0);l6(u|0);l=v;return g|0}function MK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a=(c[a+16>>2]|0)+192|0;e=0;h=0;while(1){a=c[a>>2]|0;if(!a)break;g=c[a+16>>2]|0;f=c[g+180>>2]|0;a=0;while(1){if(!(c[f+(a<<2)>>2]|0))break;a=a+1|0;e=e+1|0}a=g+164|0;h=h+1|0}c[b>>2]=h;c[d>>2]=e;return}function NK(b){b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c[47324]=b;c[47331]=0;c[47321]=0;c[47320]=0;i=b+16|0;b=(c[i>>2]|0)+192|0;h=0;f=0;while(1){b=c[b>>2]|0;if(!b)break;g=c[b+16>>2]|0;a[g+157>>0]=0;h=h+1|0;c[47320]=h;d=c[g+180>>2]|0;b=0;while(1){if(!(c[d+(b<<2)>>2]|0))break;k=f+1|0;c[47321]=k;b=b+1|0;f=k}b=g+164|0}b=c[47332]|0;if(!b)b=IK(h<<2)|0;else b=KK(b,h<<2)|0;c[47332]=b;c[47333]=0;b=c[47326]|0;d=c[47320]<<2;if(!b)b=IK(d)|0;else b=KK(b,d)|0;c[47326]=b;c[47325]=0;d=1;b=(c[i>>2]|0)+192|0;while(1){b=c[b>>2]|0;if(!b)break;k=b+16|0;h=c[k>>2]|0;i=h+292|0;c[i>>2]=0;h=c[h+172>>2]|0;j=d;b=0;d=0;while(1){g=c[h+(b<<2)>>2]|0;b=b+1|0;if(!g)break;d=d+1|0;c[i>>2]=d;f=c[g+16>>2]|0;c[f+160>>2]=0;c[f+164>>2]=-1;if(!j){j=0;continue}l=c[g>>2]&3;j=((c[(c[(c[((l|0)==2?g:g+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((l|0)==3?g:g+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0)<(e[f+170>>1]|0|0)?0:j}b=HK(b<<2)|0;d=c[k>>2]|0;c[d+264>>2]=b;c[d+268>>2]=0;d=c[d+180>>2]|0;b=0;do{l=b;b=b+1|0}while((c[d+(l<<2)>>2]|0)!=0);d=HK(b<<2)|0;b=c[k>>2]|0;c[b+272>>2]=d;c[b+276>>2]=0;d=j;b=b+164|0}return d|0}function OK(){var a=0,b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o+8|0;k=o;m=TO(c[47320]|0)|0;a=(c[(c[47324]|0)+16>>2]|0)+192|0;while(1){b=c[a>>2]|0;if(!b){j=0;break}d=b+16|0;a=c[d>>2]|0;if(!(c[a+292>>2]|0)){VO(m,b);a=c[d>>2]|0}a=a+164|0}while(1){a=WO(m)|0;if(!a)break;i=a+16|0;a=c[i>>2]|0;f=a+232|0;c[f>>2]=0;d=c[a+172>>2]|0;b=0;h=0;while(1){g=c[d+(b<<2)>>2]|0;if(!g){f=0;break}g=(e[(c[g+16>>2]|0)+170>>1]|0)+(c[(c[(c[((c[g>>2]&3|0)==3?g:g+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0;g=(h|0)>(g|0)?h:g;c[f>>2]=g;b=b+1|0;h=g}while(1){b=c[(c[a+180>>2]|0)+(f<<2)>>2]|0;if(!b)break;d=b+-48|0;g=(c[(c[((c[b>>2]&3|0)==2?b:d)+40>>2]|0)+16>>2]|0)+292|0;h=c[g>>2]|0;c[g>>2]=h+-1;if((h|0)<2){VO(m,c[((c[b>>2]&3|0)==2?b:d)+40>>2]|0);a=c[i>>2]|0}f=f+1|0}j=j+1|0}a:do if((j|0)!=(c[47320]|0)){dA(1,102857,k)|0;a=(c[(c[47324]|0)+16>>2]|0)+192|0;while(1){b=c[a>>2]|0;if(!b)break a;d=b+16|0;a=c[d>>2]|0;if(c[a+292>>2]|0){k=HB(b)|0;a=c[(c[d>>2]|0)+292>>2]|0;c[n>>2]=k;c[n+4>>2]=a;dA(3,102879,n)|0;a=c[d>>2]|0}a=a+164|0}}while(0);UO(m);l=o;return}function PK(){var b=0,d=0,e=0;b=(c[(c[47324]|0)+16>>2]|0)+192|0;while(1){b=c[b>>2]|0;if(!b)break;e=b+16|0;b=c[e>>2]|0;d=c[b+264>>2]|0;if(d){l6(d);b=c[e>>2]|0}d=c[b+272>>2]|0;if(d){l6(d);b=c[e>>2]|0}a[b+157>>0]=0;b=b+164|0}return}function QK(){var a=0,b=0,d=0,e=0,f=0;a=(c[(c[47324]|0)+16>>2]|0)+192|0;while(1){a=c[a>>2]|0;if(!a)break;a=c[a+16>>2]|0;c[a+280>>2]=0;a=a+164|0}f=HK(c[47320]<<2)|0;e=0;a=(c[(c[47324]|0)+16>>2]|0)+192|0;while(1){b=c[a>>2]|0;if(!b)break;d=b+16|0;a=c[d>>2]|0;if(!(c[a+280>>2]|0)){c[f+(e<<2)>>2]=bL(b)|0;b=e+1|0;a=c[d>>2]|0}else b=e;e=b;a=a+164|0}a=cL(f,e)|0;while(1){if((dL(a)|0)<=1)break;hL(a,c[(gL(fL(eL(a)|0)|0)|0)+8>>2]|0)}l6(a);a=0;while(1){if((a|0)>=(e|0))break;l6(c[f+(a<<2)>>2]|0);a=a+1|0}l6(f);if((c[47325]|0)==((c[47320]|0)+-1|0)){iL();return}else Aa(102602,102632,523,102637)}function RK(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=c[47331]|0;f=c[47325]|0;j=c[47326]|0;k=c[47280]|0;b=0;a=0;g=i;while(1){if((g|0)>=(f|0)){h=8;break}e=c[j+(g<<2)>>2]|0;d=c[(c[e+16>>2]|0)+160>>2]|0;if((d|0)<0){if(!a)a=e;else a=(c[(c[a+16>>2]|0)+160>>2]|0)>(d|0)?e:a;b=b+1|0;if((b|0)>=(k|0))break}e=g+1|0;c[47331]=e;g=e}if((h|0)==8)if((i|0)>0){f=0;while(1){if((f|0)>=(i|0))break;d=c[j+(f<<2)>>2]|0;e=c[(c[d+16>>2]|0)+160>>2]|0;if((e|0)<0){if(!a)a=d;else a=(c[(c[a+16>>2]|0)+160>>2]|0)>(e|0)?d:a;b=b+1|0;if((b|0)>=(k|0))break}f=f+1|0}c[47331]=f}return a|0}function SK(a){a=a|0;var b=0,d=0;b=c[a>>2]&3;d=c[((b|0)==3?a:a+48|0)+40>>2]|0;a=c[((b|0)==2?a:a+-48|0)+40>>2]|0;b=(c[(c[d+16>>2]|0)+288>>2]|0)<(c[(c[a+16>>2]|0)+288>>2]|0);a=b?d:a;c[47327]=0;c[47328]=2147483647;d=c[a+16>>2]|0;c[47329]=c[d+284>>2];c[47330]=c[d+288>>2];if(b)aL(a);else $K(a);return c[47327]|0}function TK(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;o=p;h=c[b>>2]&3;n=b+-48|0;k=b+48|0;m=b+16|0;h=(c[(c[(c[((h|0)==2?b:n)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((h|0)==3?b:k)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[m>>2]|0)+170>>1]|0)|0;do if((h|0)>0){d=c[a>>2]&3;i=c[((d|0)==3?a:a+48|0)+40>>2]|0;j=c[i+16>>2]|0;if(((c[j+276>>2]|0)+(c[j+268>>2]|0)|0)==1){XK(i,h);break}d=c[((d|0)==2?a:a+-48|0)+40>>2]|0;f=c[d+16>>2]|0;g=0-h|0;if(((c[f+276>>2]|0)+(c[f+268>>2]|0)|0)==1){XK(d,g);break}if((c[j+288>>2]|0)<(c[f+288>>2]|0)){XK(i,h);break}else{XK(d,g);break}}while(0);d=a+16|0;f=c[(c[d>>2]|0)+160>>2]|0;g=c[b>>2]&3;g=YK(c[((g|0)==3?b:k)+40>>2]|0,c[((g|0)==2?b:n)+40>>2]|0,f,1)|0;j=c[b>>2]&3;if((YK(c[((j|0)==2?b:n)+40>>2]|0,c[((j|0)==3?b:k)+40>>2]|0,f,0)|0)==(g|0)){c[(c[m>>2]|0)+160>>2]=0-f;c[(c[d>>2]|0)+160>>2]=0;ZK(a,b);o=c[g+16>>2]|0;_K(g,c[o+280>>2]|0,c[o+284>>2]|0)|0;l=p;return}else{dA(1,102563,o)|0;Ca(189124,1)}}function UK(){var b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;WK();n=HK((c[47323]<<2)+4|0)|0;d=c[47323]|0;b=0;while(1){if((b|0)>(d|0))break;c[n+(b<<2)>>2]=0;b=b+1|0}b=c[(c[(c[47324]|0)+16>>2]|0)+192>>2]|0;d=b;while(1){if(!d)break;d=c[d+16>>2]|0;if(!(a[d+156>>0]|0)){m=n+(c[d+232>>2]<<2)|0;c[m>>2]=(c[m>>2]|0)+1}d=c[d+164>>2]|0}while(1){if(!b)break;m=b+16|0;b=c[m>>2]|0;if(!(a[b+156>>0]|0)){h=c[47323]|0;f=c[b+172>>2]|0;k=0;j=0;d=0;while(1){g=c[f+(d<<2)>>2]|0;if(!g)break;i=c[g+16>>2]|0;l=(e[i+170>>1]|0)+(c[(c[(c[((c[g>>2]&3|0)==3?g:g+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0;k=(c[i+156>>2]|0)+k|0;j=(j|0)>(l|0)?j:l;d=d+1|0}g=c[b+180>>2]|0;i=0;l=h;d=0;while(1){f=c[g+(d<<2)>>2]|0;if(!f)break;o=c[f+16>>2]|0;h=(c[(c[(c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[o+170>>1]|0)|0;i=(c[o+156>>2]|0)+i|0;l=(l|0)<(h|0)?l:h;d=d+1|0}d=(j|0)>0?j:0;if((k|0)==(i|0)){h=d;f=d;while(1){d=f+1|0;g=n+(h<<2)|0;if((f|0)>=(l|0))break;h=(c[n+(d<<2)>>2]|0)<(c[g>>2]|0)?d:h;f=d}o=b+232|0;l=n+(c[o>>2]<<2)|0;c[l>>2]=(c[l>>2]|0)+-1;c[g>>2]=(c[g>>2]|0)+1;c[o>>2]=h}d=c[b+264>>2]|0;if(d){l6(d);b=c[m>>2]|0}d=c[b+272>>2]|0;if(d){l6(d);b=c[m>>2]|0}a[b+157>>0]=0}b=c[b+164>>2]|0}l6(n);return}function VK(){var a=0,b=0,d=0,f=0,g=0,h=0;b=0;while(1){if((b|0)>=(c[47325]|0))break;a=c[(c[47326]|0)+(b<<2)>>2]|0;do if(((c[(c[a+16>>2]|0)+160>>2]|0)==0?(d=SK(a)|0,d|0):0)?(f=c[d>>2]&3,f=(c[(c[(c[((f|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((f|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[d+16>>2]|0)+170>>1]|0)|0,(f|0)>=2):0){h=c[a>>2]&3;g=c[((h|0)==3?a:a+48|0)+40>>2]|0;a=c[((h|0)==2?a:a+-48|0)+40>>2]|0;if((c[(c[g+16>>2]|0)+288>>2]|0)<(c[(c[a+16>>2]|0)+288>>2]|0)){XK(g,f>>>1);break}else{XK(a,(f|0)/-2|0);break}}while(0);b=b+1|0}PK();return}function WK(){var b=0,d=0,e=0,f=0,g=0;c[47322]=2147483647;c[47323]=-2147483647;b=c[(c[(c[47324]|0)+16>>2]|0)+192>>2]|0;e=b;d=2147483647;f=-2147483647;while(1){if(!e)break;e=c[e+16>>2]|0;if(!(a[e+156>>0]|0)){g=c[e+232>>2]|0;d=(d|0)<(g|0)?d:g;c[47322]=d;f=(f|0)>(g|0)?f:g;c[47323]=f}e=c[e+164>>2]|0}if(d|0){while(1){if(!b)break;g=c[b+16>>2]|0;e=g+232|0;c[e>>2]=(c[e>>2]|0)-d;b=c[g+164>>2]|0}c[47323]=f-d;c[47322]=0}return}function XK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+16|0;a=c[f>>2]|0;e=a+232|0;c[e>>2]=(c[e>>2]|0)-b;e=0;while(1){d=c[(c[a+272>>2]|0)+(e<<2)>>2]|0;if(!d){e=0;break}if((d|0)!=(c[a+280>>2]|0)){XK(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0,b);a=c[f>>2]|0}e=e+1|0}while(1){d=c[(c[a+264>>2]|0)+(e<<2)>>2]|0;if(!d)break;if((d|0)!=(c[a+280>>2]|0)){XK(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0,b);a=c[f>>2]|0}e=e+1|0}return}function YK(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;g=(e|0)==0&1;h=0-d|0;f=c[(c[b+16>>2]|0)+288>>2]|0;b=a;while(1){a=c[b+16>>2]|0;if((c[a+284>>2]|0)<=(f|0)?(f|0)<=(c[a+288>>2]|0):0)break;a=c[a+280>>2]|0;i=a+48|0;j=(c[a+16>>2]|0)+160|0;c[j>>2]=(((b|0)==(c[((c[a>>2]&3|0)==3?a:i)+40>>2]|0)?e:g)|0?d:h)+(c[j>>2]|0);j=c[a>>2]&3;i=c[((j|0)==3?a:i)+40>>2]|0;a=c[((j|0)==2?a:a+-48|0)+40>>2]|0;b=(c[(c[i+16>>2]|0)+288>>2]|0)>(c[(c[a+16>>2]|0)+288>>2]|0)?i:a}return b|0}function ZK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=a+16|0;h=(c[e>>2]|0)+164|0;c[(c[b+16>>2]|0)+164>>2]=c[h>>2];c[(c[47326]|0)+(c[h>>2]<<2)>>2]=b;c[(c[e>>2]|0)+164>>2]=-1;e=(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16|0;h=c[e>>2]|0;d=h+276|0;f=c[d>>2]|0;g=f+-1|0;c[d>>2]=g;h=c[h+272>>2]|0;d=0;while(1){i=h+(d<<2)|0;if((d|0)>=(f|0))break;if((c[i>>2]|0)==(a|0))break;else d=d+1|0}c[i>>2]=c[h+(g<<2)>>2];c[(c[(c[e>>2]|0)+272>>2]|0)+(g<<2)>>2]=0;e=(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16|0;h=c[e>>2]|0;d=h+268|0;f=c[d>>2]|0;g=f+-1|0;c[d>>2]=g;h=c[h+264>>2]|0;d=0;while(1){i=h+(d<<2)|0;if((d|0)>=(f|0))break;if((c[i>>2]|0)==(a|0))break;else d=d+1|0}c[i>>2]=c[h+(g<<2)>>2];c[(c[(c[e>>2]|0)+264>>2]|0)+(g<<2)>>2]=0;a=(c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)+16|0;i=c[a>>2]|0;h=c[i+272>>2]|0;i=i+276|0;g=c[i>>2]|0;c[i>>2]=g+1;c[h+(g<<2)>>2]=b;a=c[a>>2]|0;c[(c[a+272>>2]|0)+(c[a+276>>2]<<2)>>2]=0;a=(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)+16|0;g=c[a>>2]|0;h=c[g+264>>2]|0;g=g+268|0;i=c[g>>2]|0;c[g>>2]=i+1;c[h+(i<<2)>>2]=b;b=c[a>>2]|0;c[(c[b+264>>2]|0)+(c[b+268>>2]<<2)>>2]=0;return}function _K(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=a+16|0;a=c[g>>2]|0;c[a+280>>2]=b;c[a+284>>2]=d;f=0;while(1){e=c[(c[a+272>>2]|0)+(f<<2)>>2]|0;if(!e){f=0;break}if((e|0)!=(b|0)){d=_K(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,e,d)|0;a=c[g>>2]|0}f=f+1|0}while(1){e=c[(c[a+264>>2]|0)+(f<<2)>>2]|0;if(!e)break;if((e|0)!=(b|0)){d=_K(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0,e,d)|0;a=c[g>>2]|0}f=f+1|0}c[a+288>>2]=d;return d+1|0}function $K(a){a=a|0;var b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;l=a+16|0;b=0;while(1){a=c[l>>2]|0;i=c[(c[a+180>>2]|0)+(b<<2)>>2]|0;if(!i){d=0;break}j=c[i+16>>2]|0;d=c[i>>2]&3;f=c[((d|0)==2?i:i+-48|0)+40>>2]|0;g=c[f+16>>2]|0;h=c[g+288>>2]|0;if((c[j+164>>2]|0)<0){if((c[47329]|0)>(h|0)|(h|0)>(c[47330]|0)?(k=(c[g+232>>2]|0)-(c[(c[(c[((d|0)==3?i:i+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[j+170>>1]|0)|0,(k|0)<(c[47328]|0)|(c[47327]|0)==0):0){c[47327]=i;c[47328]=k}}else if((h|0)<(c[a+288>>2]|0))$K(f);b=b+1|0}while(1){b=c[(c[a+264>>2]|0)+(d<<2)>>2]|0;if(!((b|0)!=0&(c[47328]|0)>0))break;b=c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0;if((c[(c[b+16>>2]|0)+288>>2]|0)<(c[a+288>>2]|0)){$K(b);a=c[l>>2]|0}d=d+1|0}return}function aL(a){a=a|0;var b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;l=a+16|0;b=0;while(1){a=c[l>>2]|0;i=c[(c[a+172>>2]|0)+(b<<2)>>2]|0;if(!i){d=0;break}j=c[i+16>>2]|0;d=c[i>>2]&3;f=c[((d|0)==3?i:i+48|0)+40>>2]|0;g=c[f+16>>2]|0;h=c[g+288>>2]|0;if((c[j+164>>2]|0)<0){if((c[47329]|0)>(h|0)|(h|0)>(c[47330]|0)?(k=(c[(c[(c[((d|0)==2?i:i+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[g+232>>2]|0)-(e[j+170>>1]|0)|0,(k|0)<(c[47328]|0)|(c[47327]|0)==0):0){c[47327]=i;c[47328]=k}}else if((h|0)<(c[a+288>>2]|0))aL(f);b=b+1|0}while(1){b=c[(c[a+272>>2]|0)+(d<<2)>>2]|0;if(!((b|0)!=0&(c[47328]|0)>0))break;b=c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0;if((c[(c[b+16>>2]|0)+288>>2]|0)<(c[a+288>>2]|0)){aL(b);a=c[l>>2]|0}d=d+1|0}return}function bL(a){a=a|0;var b=0;b=HK(16)|0;c[b>>2]=a;c[b+4>>2]=rL(a,b)|0;c[b+12>>2]=b;return b|0}function cL(a,b){a=a|0;b=b|0;var d=0,e=0;e=HK(8)|0;c[e>>2]=a;c[e+4>>2]=b;d=0;while(1){if((d|0)>=(b|0))break;c[(c[a+(d<<2)>>2]|0)+8>>2]=d;d=d+1|0}d=(b|0)/2|0;while(1){if((d|0)<=-1)break;hL(e,d);d=d+-1|0}return e|0}function dL(a){a=a|0;return c[a+4>>2]|0}function eL(a){a=a|0;var b=0,d=0,e=0,f=0;f=c[a>>2]|0;b=c[f>>2]|0;c[b+8>>2]=-1;d=a+4|0;e=(c[d>>2]|0)+-1|0;c[f>>2]=c[f+(e<<2)>>2];f=c[a>>2]|0;c[(c[f>>2]|0)+8>>2]=0;c[f+(e<<2)>>2]=b;c[d>>2]=e;hL(a,0);return b|0}function fL(a){a=a|0;return qL(c[a>>2]|0,0,0)|0}function gL(a){a=a|0;var b=0,d=0,f=0,g=0,h=0,i=0;b=a+16|0;if((c[(c[b>>2]|0)+164>>2]|0)>-1)Aa(102651,102632,463,102665);g=a+48|0;d=mL(c[((c[a>>2]&3|0)==3?a:g)+40>>2]|0)|0;i=a+-48|0;f=mL(c[((c[a>>2]&3|0)==2?a:i)+40>>2]|0)|0;h=c[a>>2]&3;b=(c[(c[(c[((h|0)==2?a:i)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((h|0)==3?a:g)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[b>>2]|0)+170>>1]|0)|0;if((c[d+8>>2]|0)==-1)nL(c[d>>2]|0,0,b);else nL(c[f>>2]|0,0,0-b|0);oL(a);return pL(d,f)|0}function hL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=c[a>>2]|0;h=c[a+4>>2]|0;while(1){a=b<<1;f=a+2|0;a=a|1;g=i+(b<<2)|0;if(!((a|0)<(h|0)?(c[(c[i+(a<<2)>>2]|0)+4>>2]|0)<(c[(c[g>>2]|0)+4>>2]|0):0))a=b;if((f|0)>=(h|0))break;d=i+(f<<2)|0;e=c[d>>2]|0;if((f|0)==(b|0)?1:(c[e+4>>2]|0)>=(c[(c[i+(a<<2)>>2]|0)+4>>2]|0))break;a=c[g>>2]|0;c[g>>2]=e;c[d>>2]=a;c[(c[g>>2]|0)+8>>2]=b;c[a+8>>2]=f;b=f}return}function iL(){_K(c[(c[(c[47324]|0)+16>>2]|0)+192>>2]|0,0,1)|0;jL(c[(c[(c[47324]|0)+16>>2]|0)+192>>2]|0,0);return}function jL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+16|0;d=0;while(1){a=c[f>>2]|0;e=c[(c[a+272>>2]|0)+(d<<2)>>2]|0;if(!e){e=0;break}if((e|0)!=(b|0))jL(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,e);d=d+1|0}while(1){d=c[(c[a+264>>2]|0)+(e<<2)>>2]|0;if(!d)break;if((d|0)!=(b|0)){jL(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0,d);a=c[f>>2]|0}e=e+1|0}if(b|0)kL(b);return}function kL(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=c[a>>2]&3;d=c[((b|0)==3?a:a+48|0)+40>>2]|0;e=c[d+16>>2]|0;if((c[e+280>>2]|0)==(a|0))i=1;else{e=c[((b|0)==2?a:a+-48|0)+40>>2]|0;i=-1;d=e;e=c[e+16>>2]|0}g=c[e+180>>2]|0;b=0;f=0;while(1){h=c[g+(f<<2)>>2]|0;if(!h)break;b=(lL(h,d,i)|0)+b|0;f=f+1|0}g=c[e+172>>2]|0;e=0;while(1){f=c[g+(e<<2)>>2]|0;if(!f)break;b=(lL(f,d,i)|0)+b|0;e=e+1|0}c[(c[a+16>>2]|0)+160>>2]=b;return}function lL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=c[a>>2]&3;f=c[((h|0)==3?a:a+48|0)+40>>2]|0;e=(f|0)==(b|0);h=((h|0)==2?a:a+-48|0)+40|0;if(e)f=c[h>>2]|0;g=c[b+16>>2]|0;i=c[(c[f+16>>2]|0)+288>>2]|0;f=c[a+16>>2]|0;a=c[f+156>>2]|0;if((c[g+284>>2]|0)<=(i|0)?(i|0)<=(c[g+288>>2]|0):0){if((c[f+164>>2]|0)>-1)f=c[f+160>>2]|0;else f=0;g=0;f=f-a|0}else{g=1;f=a}if((d|0)>0)e=(c[h>>2]|0)==(b|0);i=e?1:-1;return ((((g|0)==0?i:0-i|0)|0)<0?0-f|0:f)|0}function mL(a){a=a|0;var b=0,d=0;a=c[(c[a+16>>2]|0)+280>>2]|0;while(1){b=a+12|0;d=c[b>>2]|0;if(!((d|0)!=(a|0)&(d|0)!=0))break;a=c[d+12>>2]|0;if(!a){a=d;continue}c[b>>2]=a}return a|0}function nL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=a+16|0;e=c[h>>2]|0;g=e+232|0;c[g>>2]=(c[g>>2]|0)+d;g=0;while(1){f=c[(c[e+264>>2]|0)+(g<<2)>>2]|0;if(!f){g=0;break}f=c[((c[f>>2]&3|0)==3?f:f+48|0)+40>>2]|0;if((f|0)!=(b|0)){nL(f,a,d);e=c[h>>2]|0}g=g+1|0}while(1){f=c[(c[e+272>>2]|0)+(g<<2)>>2]|0;if(!f)break;f=c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0;if((f|0)!=(b|0)){nL(f,a,d);e=c[h>>2]|0}g=g+1|0}return}function oL(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+32|0;d=(c[b+16>>2]|0)+164|0;if((c[d>>2]|0)>-1){dA(1,102754,h)|0;Ca(189124,1)}g=c[47325]|0;c[d>>2]=g;d=c[47326]|0;c[47325]=g+1;c[d+(g<<2)>>2]=b;d=c[b>>2]|0;g=b+48|0;e=c[((d&3|0)==3?b:g)+40>>2]|0;if(!(a[(c[e+16>>2]|0)+157>>0]|0)){f=c[47332]|0;d=c[47333]|0;c[47333]=d+1;c[f+(d<<2)>>2]=e;d=c[b>>2]|0}f=b+-48|0;e=c[((d&3|0)==2?b:f)+40>>2]|0;if(!(a[(c[e+16>>2]|0)+157>>0]|0)){i=c[47332]|0;d=c[47333]|0;c[47333]=d+1;c[i+(d<<2)>>2]=e;d=c[b>>2]|0}i=(c[((d&3|0)==3?b:g)+40>>2]|0)+16|0;d=c[i>>2]|0;a[d+157>>0]=1;e=c[d+272>>2]|0;d=d+276|0;g=c[d>>2]|0;c[d>>2]=g+1;c[e+(g<<2)>>2]=b;g=c[i>>2]|0;c[(c[g+272>>2]|0)+(c[g+276>>2]<<2)>>2]=0;i=c[i>>2]|0;if(!(c[(c[i+180>>2]|0)+((c[i+276>>2]|0)+-1<<2)>>2]|0)){dA(1,102788,h+8|0)|0;Ca(189124,1)}i=(c[((c[b>>2]&3|0)==2?b:f)+40>>2]|0)+16|0;e=c[i>>2]|0;a[e+157>>0]=1;f=c[e+264>>2]|0;e=e+268|0;g=c[e>>2]|0;c[e>>2]=g+1;c[f+(g<<2)>>2]=b;b=c[i>>2]|0;c[(c[b+264>>2]|0)+(c[b+268>>2]<<2)>>2]=0;i=c[i>>2]|0;if(!(c[(c[i+172>>2]|0)+((c[i+268>>2]|0)+-1<<2)>>2]|0)){dA(1,102823,h+16|0)|0;Ca(189124,1)}else{l=h;return}}function pL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;while(1){i=a+12|0;d=c[i>>2]|0;if((d|0)==0|(d|0)==(a|0))break;else a=d}while(1){h=b+12|0;d=c[h>>2]|0;if((d|0)==0|(d|0)==(b|0))break;else b=d}if((a|0)!=(b|0)){d=c[a+8>>2]|0;e=c[b+8>>2]|0;if((e&d|0)<=-1)Aa(102677,102632,327,102724);f=c[a+4>>2]|0;g=c[b+4>>2]|0;if((e|0)!=-1){d=(d|0)==-1?b:(g|0)<(f|0)?a:b;a=d;d=c[d+8>>2]|0}c[h>>2]=a;c[i>>2]=a;c[a+4>>2]=g+f;if((d|0)>-1)j=a;else Aa(102735,102632,335,102724)}else j=a;return j|0}function qL(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=mL(a)|0;if(d){k=c[d>>2]&3;if(((c[(c[(c[((k|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((k|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0)!=(e[(c[d+16>>2]|0)+170>>1]|0|0))f=3}else{d=0;f=3}a:do if((f|0)==3){k=a+16|0;j=0;while(1){f=c[k>>2]|0;i=c[(c[f+180>>2]|0)+(j<<2)>>2]|0;if(!i){j=0;break}f=i+16|0;g=i+-48|0;h=c[((c[i>>2]&3|0)==2?i:g)+40>>2]|0;do if((c[(c[f>>2]|0)+164>>2]|0)>-1){if((h|0)!=(b|0))d=qL(h,a,d)|0}else if((mL(h)|0)!=(l|0)){if(d|0?(m=c[i>>2]&3,h=c[d>>2]&3,((c[(c[(c[((m|0)==2?i:g)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((m|0)==3?i:i+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[f>>2]|0)+170>>1]|0)|0)>=((c[(c[(c[((h|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((h|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[d+16>>2]|0)+170>>1]|0)|0)):0)break;d=i}while(0);j=j+1|0}while(1){f=c[(c[f+172>>2]|0)+(j<<2)>>2]|0;if(!f)break a;g=f+16|0;h=f+48|0;i=c[((c[f>>2]&3|0)==3?f:h)+40>>2]|0;do if((c[(c[g>>2]|0)+164>>2]|0)>-1){if((i|0)!=(b|0))d=qL(i,a,d)|0}else if((mL(i)|0)!=(l|0)){if(d|0?(i=c[f>>2]&3,m=c[d>>2]&3,((c[(c[(c[((i|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((i|0)==3?f:h)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[g>>2]|0)+170>>1]|0)|0)>=((c[(c[(c[((m|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((m|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[d+16>>2]|0)+170>>1]|0)|0)):0)break;d=f}while(0);j=j+1|0;f=c[k>>2]|0}}while(0);return d|0}function rL(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;l=a+16|0;d=c[l>>2]|0;c[d+280>>2]=b;a=1;h=0;while(1){g=c[(c[d+172>>2]|0)+(h<<2)>>2]|0;if(!g){h=0;break}f=c[g+16>>2]|0;if(((c[f+164>>2]|0)<=-1?(i=c[g>>2]&3,j=g+48|0,k=c[(c[((i|0)==3?g:j)+40>>2]|0)+16>>2]|0,(c[k+280>>2]|0)==0):0)?((c[(c[(c[((i|0)==2?g:g+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[k+232>>2]|0)|0)==(e[f+170>>1]|0|0):0){oL(g);a=(rL(c[((c[g>>2]&3|0)==3?g:j)+40>>2]|0,b)|0)+a|0;d=c[l>>2]|0}h=h+1|0}while(1){f=c[(c[d+180>>2]|0)+(h<<2)>>2]|0;if(!f)break;g=c[f+16>>2]|0;if(((c[g+164>>2]|0)<=-1?(m=c[f>>2]&3,n=f+-48|0,o=c[(c[((m|0)==2?f:n)+40>>2]|0)+16>>2]|0,(c[o+280>>2]|0)==0):0)?((c[o+232>>2]|0)-(c[(c[(c[((m|0)==3?f:f+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0)==(e[g+170>>1]|0|0):0){oL(f);a=(rL(c[((c[f>>2]&3|0)==2?f:n)+40>>2]|0,b)|0)+a|0;d=c[l>>2]|0}h=h+1|0}return a|0}function sL(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=NA(a,102887)|0;if(!d)d=30;else d=d6(d)|0;return LK(a,b,c,d)|0}function tL(a){a=+a;return +((c[47187]|0)==0?a:+h[23322]-a)}function uL(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0;s=l;l=l+16|0;r=s;c[47334]=c[(c[(c[d+64>>2]|0)+8>>2]|0)+4>>2];vL(d);i=c[d+16>>2]|0;u=+h[i+32>>3];t=+h[i+40>>3];wL(e,102898,+h[b+352>>3]);wL(e,102905,u/72.0);wL(e,102905,t/72.0);xL(e);i=gC(d)|0;while(1){if(!i)break;g=i+16|0;if(!(a[(c[g>>2]|0)+118>>0]|0)){yL(e,102907,ZD(HB(i)|0)|0);q=(c[g>>2]|0)+16|0;c[r>>2]=c[q>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[r+12>>2]=c[q+12>>2];zL(e,r);if(!(a[(c[(c[g>>2]|0)+104>>2]|0)+82>>0]|0)){b=uC(i)|0;b=AL(b,c[c[(c[g>>2]|0)+104>>2]>>2]|0)|0}else b=ZD(OA(i,c[47216]|0)|0)|0;wL(e,102905,+h[(c[g>>2]|0)+32>>3]);wL(e,102905,+h[(c[g>>2]|0)+40>>3]);yL(e,102905,b);yL(e,102905,$O(i,c[47219]|0,111368)|0);yL(e,102905,c[c[(c[g>>2]|0)+8>>2]>>2]|0);yL(e,102905,$O(i,c[47202]|0,137615)|0);b=$O(i,c[47203]|0,195341)|0;if(!(a[b>>0]|0))b=$O(i,c[47202]|0,135101)|0;yL(e,102905,b);xL(e)}i=hC(d,i)|0}o=f<<24>>24==0;n=gC(d)|0;while(1){if(!n)break;m=UA(d,n)|0;while(1){if(!m)break;if(o){f=195341;j=195341}else{j=NA(m,111756)|0;f=NA(m,111765)|0;f=f|0?f:195341;j=j|0?j:195341}p=m+16|0;b=c[p>>2]|0;k=c[b+8>>2]|0;q=m+48|0;a:do if(k){i=c[k+4>>2]|0;b=0;g=0;while(1){if((b|0)>=(i|0))break;v=(c[(c[k>>2]|0)+(b*48|0)+4>>2]|0)+g|0;b=b+1|0;g=v}yL(e,0,111751);BL(e,c[((c[m>>2]&3|0)==3?m:q)+40>>2]|0,j);BL(e,c[((c[m>>2]&3|0)==2?m:m+-48|0)+40>>2]|0,f);CL(e,g);f=0;while(1){b=c[p>>2]|0;g=c[b+8>>2]|0;if((f|0)>=(c[g+4>>2]|0))break a;i=c[g>>2]|0;g=c[i+(f*48|0)>>2]|0;i=c[i+(f*48|0)+4>>2]|0;b=0;while(1){if((b|0)>=(i|0))break;v=g+(b<<4)|0;c[r>>2]=c[v>>2];c[r+4>>2]=c[v+4>>2];c[r+8>>2]=c[v+8>>2];c[r+12>>2]=c[v+12>>2];zL(e,r);b=b+1|0}f=f+1|0}}while(0);if(c[b+96>>2]|0){v=uC(c[((c[m>>2]&3|0)==3?m:q)+40>>2]|0)|0;yL(e,102905,AL(v,c[c[(c[p>>2]|0)+96>>2]>>2]|0)|0);v=(c[(c[p>>2]|0)+96>>2]|0)+56|0;c[r>>2]=c[v>>2];c[r+4>>2]=c[v+4>>2];c[r+8>>2]=c[v+8>>2];c[r+12>>2]=c[v+12>>2];zL(e,r)}yL(e,102905,$O(m,c[47254]|0,111368)|0);yL(e,102905,$O(m,c[47238]|0,137615)|0);xL(e);m=WA(d,m)|0}n=hC(d,n)|0}DL(102913,e);l=s;return}function vL(a){a=a|0;var b=0.0;if(c[47187]|0){a=c[a+16>>2]|0;b=+h[a+40>>3]+ +h[a+24>>3];h[23322]=b;h[23323]=b/72.0}return}function wL(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0,f=0;f=l;l=l+1040|0;e=f;d=f+8|0;if(b|0)DL(b,a);h[e>>3]=c;i2(d,102919,e)|0;DL(d,a);l=f;return}function xL(b){b=b|0;a[195237]=10;vb[c[47334]&127](b,195237)|0;return}function yL(a,b,c){a=a|0;b=b|0;c=c|0;if(b|0)DL(b,a);DL(c,a);return}function zL(a,b){a=a|0;b=b|0;var d=0.0;wL(a,102905,+h[b>>3]/72.0);d=+h[b+8>>3];wL(a,102905,((c[47187]|0)==0?d:+h[23322]-d)/72.0);return}function AL(a,b){a=a|0;b=b|0;var c=0;c=dD(a,b)|0;b=ZD(c)|0;fD(a,c)|0;return b|0}function BL(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if(!(a[(c[d+16>>2]|0)+118>>0]|0))d=ZD(HB(d)|0)|0;else{f=uC(d)|0;d=AL(f,(F3(HB(d)|0,58)|0)+1|0)|0}yL(b,102905,d);if(e|0?a[e>>0]|0:0)yL(b,108285,ZD(e)|0);return}function CL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+1040|0;f=d;e=d+8|0;DL(102905,a);c[f>>2]=b;i2(e,137696,f)|0;DL(e,a);l=d;return}function DL(a,b){a=a|0;b=b|0;vb[c[47334]&127](b,a)|0;return}function EL(d,f,g){d=d|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,Z=0;X=l;l=l+2288|0;V=X+208|0;U=X+192|0;T=X+176|0;S=X+160|0;R=X+144|0;Q=X+128|0;O=X+112|0;N=X+96|0;M=X+80|0;L=X+64|0;K=X+56|0;H=X+48|0;W=X+32|0;P=X+24|0;G=X;D=X+1264|0;E=X+224|0;F=d+16|0;B=(e[(c[F>>2]|0)+178>>1]|0)>2;PJ(1);vL(d);hA(E,1024,X+240|0);YP(d,1,102924,195341)|0;YP(d,1,102928,195341)|0;c[47200]=YP(d,1,141419,195341)|0;c[47199]=YP(d,1,141351,195341)|0;YP(d,2,102924,195341)|0;i=a[(c[F>>2]|0)+113>>0]|0;if(i&16){YP(d,1,102934,195341)|0;i=a[(c[F>>2]|0)+113>>0]|0}if(i&1){YP(d,2,102938,195341)|0;i=a[(c[F>>2]|0)+113>>0]|0}if(i&32){YP(d,2,102934,195341)|0;i=a[(c[F>>2]|0)+113>>0]|0}if(i&2){YP(d,2,102941,195341)|0;i=a[(c[F>>2]|0)+113>>0]|0}if(i&4){YP(d,2,102949,195341)|0;i=a[(c[F>>2]|0)+113>>0]|0}if(!(i&8)){u=0;v=0;w=0}else{w=YP(d,0,102938,195341)|0;v=YP(d,0,102957,195341)|0;u=YP(d,0,102964,195341)|0}y=YP(d,0,102972,195341)|0;z=E+4|0;A=E+8|0;t=0;i=0;x=gC(d)|0;while(1){if(!x)break;s=x+16|0;j=c[s>>2]|0;n=+h[j+16>>3];o=+h[j+24>>3];o=(c[47187]|0)==0?o:+h[23322]-o;if(B){Y=+h[(c[j+132>>2]|0)+16>>3]*72.0;h[G>>3]=n;h[G+8>>3]=o;h[G+16>>3]=Y;i2(D,102975,G)|0;kA(E,D)|0;j=3;while(1){if((j|0)>=(e[(c[F>>2]|0)+178>>1]|0))break;h[P>>3]=+h[(c[(c[s>>2]|0)+132>>2]|0)+(j<<3)>>3]*72.0;i2(D,102990,P)|0;kA(E,D)|0;j=j+1|0}j=c[z>>2]|0;if(j>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;j=c[z>>2]|0}a[j>>0]=0;r=c[E>>2]|0;c[z>>2]=r;PA(x,102924,r)|0;r=x}else{h[W>>3]=n;h[W+8>>3]=o;i2(D,102996,W)|0;PA(x,102924,D)|0;r=x}h[H>>3]=+h[(c[s>>2]|0)+80>>3]/72.0;i2(D,102919,H)|0;HA(r,c[47199]|0,D)|0;j=c[s>>2]|0;h[K>>3]=(+h[j+88>>3]+ +h[j+96>>3])/72.0;i2(D,102919,K)|0;HA(r,c[47200]|0,D)|0;j=c[s>>2]|0;k=c[j+108>>2]|0;if((k|0)!=0?(a[k+81>>0]|0)!=0:0){Y=+h[k+64>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[L>>3]=+h[k+56>>3];h[L+8>>3]=Y;i2(D,102996,L)|0;PA(r,102934,D)|0;j=c[s>>2]|0}if(f2(c[c[j+8>>2]>>2]|0,106521)|0){if(c[47232]|0?(fN(x)|0)<<24>>24:0){k=c[(c[s>>2]|0)+12>>2]|0;q=k+8|0;j=c[q>>2]|0;if((j|0)<3){j=NA(r,103006)|0;if(!j)j=8;else j=d6(j)|0;j=(j|0)<3?8:j}p=k+44|0;n=+(j|0);m=0;while(1){if((m|0)>=(j|0))break;if((m|0)>0){k=c[z>>2]|0;if(k>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;k=c[z>>2]|0}c[z>>2]=k+1;a[k>>0]=32}k=(c[47187]|0)!=0;if((c[q>>2]|0)>2){Z=c[p>>2]|0;Y=+h[Z+(m<<4)+8>>3]/72.0;Y=k?+h[23323]-Y:Y;h[M>>3]=+h[Z+(m<<4)>>3]/72.0;h[M+8>>3]=Y;i2(D,103019,M)|0}else{Z=c[s>>2]|0;Y=+(m|0)/n*3.141592653589793*2.0;o=+h[Z+32>>3]*.5*+I(+Y);Y=+h[Z+40>>3]*.5*+J(+Y);Y=k?+h[23323]-Y:Y;h[N>>3]=o;h[N+8>>3]=Y;i2(D,103019,N)|0}kA(E,D)|0;m=m+1|0}k=c[47232]|0;j=c[z>>2]|0;if(j>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;j=c[z>>2]|0}a[j>>0]=0;Z=c[E>>2]|0;c[z>>2]=Z;HA(r,k,Z)|0}}else{FL(x,c[j+12>>2]|0,E);mA(E)|0;j=c[z>>2]|0;if(j>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;j=c[z>>2]|0}a[j>>0]=0;Z=c[E>>2]|0;c[z>>2]=Z;PA(r,102928,Z)|0}a:do if((c[47185]|0)>0){s=UA(d,x)|0;j=t;while(1){if(!s)break a;r=s+16|0;k=c[r>>2]|0;do if((a[k+112>>0]|0)!=6?(C=c[k+8>>2]|0,(C|0)!=0):0){q=0;k=C;while(1){if((q|0)>=(c[k+4>>2]|0))break;if((q|0)>0){k=c[z>>2]|0;if(k>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;k=c[z>>2]|0}c[z>>2]=k+1;a[k>>0]=59;k=c[(c[r>>2]|0)+8>>2]|0}k=c[k>>2]|0;if(c[k+(q*48|0)+8>>2]|0){Y=+h[k+(q*48|0)+24>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[O>>3]=+h[k+(q*48|0)+16>>3];h[O+8>>3]=Y;i2(D,103029,O)|0;kA(E,D)|0;i=1;k=c[c[(c[r>>2]|0)+8>>2]>>2]|0}if(c[k+(q*48|0)+12>>2]|0){Y=+h[k+(q*48|0)+40>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[Q>>3]=+h[k+(q*48|0)+32>>3];h[Q+8>>3]=Y;i2(D,103042,Q)|0;kA(E,D)|0;j=1}p=0;while(1){k=c[(c[r>>2]|0)+8>>2]|0;m=c[k>>2]|0;if((p|0)>=(c[m+(q*48|0)+4>>2]|0))break;if((p|0)>0){k=c[z>>2]|0;if(k>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;k=c[z>>2]|0}c[z>>2]=k+1;a[k>>0]=32;k=c[c[(c[r>>2]|0)+8>>2]>>2]|0}else k=m;Z=c[k+(q*48|0)>>2]|0;Y=+h[Z+(p<<4)+8>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[R>>3]=+h[Z+(p<<4)>>3];h[R+8>>3]=Y;i2(D,102996,R)|0;kA(E,D)|0;p=p+1|0}q=q+1|0}k=c[z>>2]|0;if(k>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;k=c[z>>2]|0}a[k>>0]=0;k=c[E>>2]|0;c[z>>2]=k;PA(s,102924,k)|0;k=c[r>>2]|0;m=c[k+96>>2]|0;if(m){Y=+h[m+64>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[S>>3]=+h[m+56>>3];h[S+8>>3]=Y;i2(D,102996,S)|0;PA(s,102938,D)|0;k=c[r>>2]|0}m=c[k+108>>2]|0;do if(m){if(!(a[m+81>>0]|0))break;Y=+h[m+64>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[T>>3]=+h[m+56>>3];h[T+8>>3]=Y;i2(D,102996,T)|0;PA(s,102934,D)|0;k=c[r>>2]|0}while(0);m=c[k+100>>2]|0;if(m){Y=+h[m+64>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[U>>3]=+h[m+56>>3];h[U+8>>3]=Y;i2(D,102996,U)|0;PA(s,102941,D)|0;k=c[r>>2]|0}k=c[k+104>>2]|0;if(!k)break;Y=+h[k+64>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[V>>3]=+h[k+56>>3];h[V+8>>3]=Y;i2(D,102996,V)|0;PA(s,102949,D)|0}while(0);s=WA(d,s)|0}}else j=t;while(0);t=j;x=hC(d,x)|0}GL(d,y,w,v,u);lA(E);if(b[(c[F>>2]|0)+136>>1]&1)SP(d);c[f>>2]=i;c[g>>2]=t;PJ(0);l=X;return}function FL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0;i=l;l=l+1056|0;f=i;e=i+32|0;g=b+48|0;if(!(c[g>>2]|0)){q=c[a+16>>2]|0;p=+h[q+16>>3];m=(c[47187]|0)!=0;j=+h[q+24>>3];o=j+ +h[b+24>>3];k=+h[23322];n=p+ +h[b+32>>3];j=j+ +h[b+40>>3];h[f>>3]=+h[b+16>>3]+p;h[f+8>>3]=m?k-o:o;h[f+16>>3]=n;h[f+24>>3]=m?k-j:j;i2(e,103080,f)|0;kA(d,e)|0}e=b+56|0;b=0;while(1){if((b|0)>=(c[g>>2]|0))break;FL(a,c[(c[e>>2]|0)+(b<<2)>>2]|0,d);b=b+1|0}l=i;return}function GL(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0;p=l;l=l+1088|0;k=p+56|0;n=p+48|0;m=p+32|0;i=p;j=p+64|0;o=b+16|0;v=c[o>>2]|0;s=(c[47187]|0)!=0;u=+h[v+24>>3];r=+h[23322];t=+h[v+32>>3];q=+h[v+40>>3];h[i>>3]=+h[v+16>>3];h[i+8>>3]=s?r-u:u;h[i+16>>3]=t;h[i+24>>3]=s?r-q:q;i2(j,103055,i)|0;HA(b,d,j)|0;i=c[(c[o>>2]|0)+12>>2]|0;if((i|0)!=0?(a[c[i>>2]>>0]|0)!=0:0){u=+h[i+64>>3];u=(c[47187]|0)==0?u:+h[23322]-u;h[m>>3]=+h[i+56>>3];h[m+8>>3]=u;i2(j,102996,m)|0;HA(b,e,j)|0;v=c[(c[o>>2]|0)+12>>2]|0;u=+h[v+32>>3];h[n>>3]=+h[v+24>>3]/72.0;i2(j,103075,n)|0;HA(b,f,j)|0;h[k>>3]=u/72.0;i2(j,103075,k)|0;HA(b,g,j)|0;b=1}else b=1;while(1){i=c[o>>2]|0;if((b|0)>(c[i+180>>2]|0))break;GL(c[(c[i+184>>2]|0)+(b<<2)>>2]|0,d,e,f,g);b=b+1|0}l=p;return}function HL(a){a=a|0;var b=0;b=l;l=l+16|0;EL(a,b,b+4|0);l=b;return}function IL(){return Sz(20788,c[4591]|0)|0}function JL(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function KL(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;e=c[d>>2]|0;if((a|0)<=(e|0))if((a|0)<(e|0))a=-1;else{b=c[b+4>>2]|0;d=c[d+4>>2]|0;return ((b|0)>(d|0)?1:((b|0)<(d|0))<<31>>31)|0}else a=1;return a|0}function LL(a){a=a|0;Oz(a)|0;return}function ML(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];b=NL(e)|0;if((eb[c[a>>2]&63](a,b,1)|0)!=(b|0))l6(b);l=d;return}function NL(a){a=a|0;var b=0,d=0,e=0;b=HK(16)|0;e=a;d=c[e+4>>2]|0;a=b+8|0;c[a>>2]=c[e>>2];c[a+4>>2]=d;return b|0}function OL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+16|0;f=e+8|0;g=e;c[g>>2]=b;c[g+4>>2]=d;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];b=NL(f)|0;if((eb[c[a>>2]&63](a,b,1)|0)!=(b|0))l6(b);l=e;return}function PL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+16|0;e=d;g=b;f=c[g+4>>2]|0;b=e+8|0;c[b>>2]=c[g>>2];c[b+4>>2]=f;b=(eb[c[a>>2]&63](a,e,4)|0)!=0&1;l=d;return b|0}function QL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f+8>>2]=b;c[f+12>>2]=d;d=(eb[c[a>>2]&63](a,f,4)|0)!=0&1;l=e;return d|0}function RL(a){a=a|0;return Uz(a)|0}function SL(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=HK((Uz(a)|0)<<3)|0;b=d;a=Qz(a)|0;while(1){if(!a)break;g=a+8|0;f=c[g+4>>2]|0;e=b;c[e>>2]=c[g>>2];c[e+4>>2]=f;b=b+8|0;a=c[a>>2]|0}return d|0}function TL(){var a=0,b=0,d=0,e=0;a=IK(40)|0;b=a;d=20824;e=b+36|0;do{c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}while((b|0)<(e|0));c[a+36>>2]=0;return Sz(a,c[4591]|0)|0}function UL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;d=d+36|0;a=c[d>>2]|0;if(!a)a=IK(20)|0;else c[d>>2]=c[a>>2];f=b+8|0;e=c[f+4>>2]|0;d=a+8|0;c[d>>2]=c[f>>2];c[d+4>>2]=e;c[a+16>>2]=c[b+16>>2];return a|0}function VL(a,b,d){a=a|0;b=b|0;d=d|0;d=d+36|0;c[b>>2]=c[d>>2];c[d>>2]=b;return}function WL(a){a=a|0;eb[c[a>>2]&63](a,0,64)|0;return}function XL(a){a=a|0;var b=0,d=0;b=c[a+4>>2]|0;Oz(a)|0;a=c[b+36>>2]|0;while(1){if(!a)break;d=c[a>>2]|0;l6(a);a=d}l6(b);return}function YL(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+32|0;g=f;c[g+8>>2]=b;c[g+12>>2]=d;c[g+16>>2]=e;e=c[(eb[c[a>>2]&63](a,g,1)|0)+16>>2]|0;l=f;return e|0}function ZL(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+160|0;q=t+144|0;d=t+64|0;j=t+128|0;k=t+112|0;m=t+96|0;n=t+48|0;o=t+32|0;p=t+16|0;r=t;s=a+16|0;a=c[s>>2]|0;e=+h[a+16>>3];f=+h[a+24>>3];g=+h[a+32>>3];i=+h[a+40>>3];a=d+16|0;if((b+-1|0)>>>0<2){_L(j,e,i);c[q>>2]=c[j>>2];c[q+4>>2]=c[j+4>>2];c[q+8>>2]=c[j+8>>2];c[q+12>>2]=c[j+12>>2];$L(d,q);_L(k,g,f);c[q>>2]=c[k>>2];c[q+4>>2]=c[k+4>>2];c[q+8>>2]=c[k+8>>2];c[q+12>>2]=c[k+12>>2];$L(m,q);c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2]}else{_L(n,e,f);c[q>>2]=c[n>>2];c[q+4>>2]=c[n+4>>2];c[q+8>>2]=c[n+8>>2];c[q+12>>2]=c[n+12>>2];$L(d,q);_L(o,g,i);c[q>>2]=c[o>>2];c[q+4>>2]=c[o+4>>2];c[q+8>>2]=c[o+8>>2];c[q+12>>2]=c[o+12>>2];$L(p,q);c[a>>2]=c[p>>2];c[a+4>>2]=c[p+4>>2];c[a+8>>2]=c[p+8>>2];c[a+12>>2]=c[p+12>>2]}a=(c[s>>2]|0)+16|0;c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];c[a+16>>2]=c[d+16>>2];c[a+20>>2]=c[d+20>>2];c[a+24>>2]=c[d+24>>2];c[a+28>>2]=c[d+28>>2];a=c[(c[s>>2]|0)+12>>2]|0;if(!a)a=1;else{a=a+56|0;c[q>>2]=c[a>>2];c[q+4>>2]=c[a+4>>2];c[q+8>>2]=c[a+8>>2];c[q+12>>2]=c[a+12>>2];$L(r,q);c[a>>2]=c[r>>2];c[a+4>>2]=c[r+4>>2];c[a+8>>2]=c[r+8>>2];c[a+12>>2]=c[r+12>>2];a=1}while(1){d=c[s>>2]|0;if((a|0)>(c[d+180>>2]|0))break;ZL(c[(c[d+184>>2]|0)+(a<<2)>>2]|0,b);a=a+1|0}l=t;return}function _L(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function $L(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+32|0;g=d+16|0;e=d;f=(c[47335]|0)*90|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];kK(e,g,f);c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];h[b>>3]=+h[b>>3]-+h[23324];e=b+8|0;h[e>>3]=+h[e>>3]-+h[23325];c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];l=d;return}function aM(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0;A=l;l=l+1168|0;x=A+144|0;z=A+96|0;y=A+64|0;w=A+48|0;s=A+32|0;t=A+16|0;u=A;c[w>>2]=0;c[w+4>>2]=0;c[w+8>>2]=0;c[w+12>>2]=0;v=b+16|0;q=c[(c[v>>2]|0)+116>>2]|0;c[47335]=q&3;q=q&1;a[195239]=q;if(!(q<<24>>24))cM(b);else bM(b);dM(b);q=c[v>>2]|0;g=c[q+12>>2]|0;do if(g|0?(a[g+81>>0]|0)==0:0){j=g+24|0;c[w>>2]=c[j>>2];c[w+4>>2]=c[j+4>>2];c[w+8>>2]=c[j+8>>2];c[w+12>>2]=c[j+12>>2];r=+h[w>>3]+16.0;h[w>>3]=r;j=w+8|0;e=+h[j>>3]+8.0;h[j>>3]=e;j=(a[q+275>>0]&1)!=0;m=q+16|0;n=q+40|0;o=q+24|0;p=q+32|0;if(a[195239]|0){if(j)h[p>>3]=e+ +h[p>>3];else h[m>>3]=+h[m>>3]-e;e=+h[n>>3];f=+h[o>>3];B=e-f;i=(r-B)*.5;if(!(r>B))break;h[o>>3]=f-i;h[n>>3]=e+i;break}k=(c[47335]|0)==0;do if(j)if(k){h[n>>3]=e+ +h[n>>3];break}else{h[o>>3]=+h[o>>3]-e;break}else if(k){h[o>>3]=+h[o>>3]-e;break}else{h[n>>3]=e+ +h[n>>3];break}while(0);e=+h[p>>3];f=+h[m>>3];B=e-f;i=(r-B)*.5;if(r>B){h[m>>3]=f-i;h[p>>3]=e+i}}while(0);if(d){switch(c[47335]|0){case 0:{u=q+16|0;c[46648]=c[u>>2];c[46649]=c[u+4>>2];c[46650]=c[u+8>>2];c[46651]=c[u+12>>2];break}case 1:{_L(s,-+h[q+40>>3],+h[q+16>>3]);c[46648]=c[s>>2];c[46649]=c[s+4>>2];c[46650]=c[s+8>>2];c[46651]=c[s+12>>2];break}case 2:{_L(t,+h[q+16>>3],-+h[q+40>>3]);c[46648]=c[t>>2];c[46649]=c[t+4>>2];c[46650]=c[t+8>>2];c[46651]=c[t+12>>2];break}case 3:{_L(u,+h[q+24>>3],+h[q+16>>3]);c[46648]=c[u>>2];c[46649]=c[u+4>>2];c[46650]=c[u+8>>2];c[46651]=c[u+12>>2];break}default:{}}eM(b);g=c[(c[v>>2]|0)+12>>2]|0}if(g|0?(a[g+81>>0]|0)==0:0){c[x>>2]=c[w>>2];c[x+4>>2]=c[w+4>>2];c[x+8>>2]=c[w+8>>2];c[x+12>>2]=c[w+12>>2];fM(b,x)}if(c[47181]|0){e=+h[23324];f=+h[23325];if(!(a[195239]|0)){h[z>>3]=f;h[z+8>>3]=e;h[z+16>>3]=f;h[z+24>>3]=e;h[z+32>>3]=-e;h[z+40>>3]=-f;i2(x,103316,z)|0}else{h[y>>3]=e;h[y+8>>3]=f;h[y+16>>3]=e;h[y+24>>3]=f;i2(x,103101,y)|0}z=Y3(x)|0;c[c[47181]>>2]=z}l=A;return}function bM(b){b=b|0;var d=0,e=0.0,f=0.0,g=0,i=0,j=0.0,k=0,l=0;l=b+16|0;if(((vC(b)|0)!=(b|0)?(i=c[l>>2]|0,k=c[i+12>>2]|0,(k|0)!=0):0)?(a[k+81>>0]|0)==0:0){b=a[i+275>>0]|0;if(!(b&1)){j=+h[i+16>>3]+ +h[i+96>>3]*.5;d=i+104|0}else{j=+h[i+32>>3]-+h[i+64>>3]*.5;d=i+72|0}g=b<<24>>24;f=+h[d>>3]*.5;b=i+24|0;do if(!(g&4)){e=+h[i+40>>3];if(!(g&2)){e=(e+ +h[b>>3])*.5;break}else{e=e-f;break}}else e=f+ +h[b>>3];while(0);h[k+56>>3]=j;h[k+64>>3]=e;a[(c[(c[l>>2]|0)+12>>2]|0)+81>>0]=1;b=1}else b=1;while(1){d=c[l>>2]|0;if((b|0)>(c[d+180>>2]|0))break;bM(c[(c[d+184>>2]|0)+(b<<2)>>2]|0);b=b+1|0}return}function cM(b){b=b|0;var d=0,e=0.0,f=0.0,g=0,i=0,j=0.0,k=0,l=0;l=b+16|0;if(((vC(b)|0)!=(b|0)?(i=c[l>>2]|0,k=c[i+12>>2]|0,(k|0)!=0):0)?(a[k+81>>0]|0)==0:0){b=a[i+275>>0]|0;if(!(b&1)){j=+h[i+24>>3]+ +h[i+56>>3]*.5;d=i+48|0}else{j=+h[i+40>>3]-+h[i+88>>3]*.5;d=i+80|0}g=b<<24>>24;f=+h[d>>3]*.5;b=i+32|0;do if(!(g&4)){e=+h[i+16>>3];if(!(g&2)){e=(e+ +h[b>>3])*.5;break}else{e=f+e;break}}else e=+h[b>>3]-f;while(0);h[k+56>>3]=e;h[k+64>>3]=j;a[(c[(c[l>>2]|0)+12>>2]|0)+81>>0]=1;b=1}else b=1;while(1){d=c[l>>2]|0;if((b|0)>(c[d+180>>2]|0))break;cM(c[(c[d+184>>2]|0)+(b<<2)>>2]|0);b=b+1|0}return}function dM(e){e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;S=l;l=l+544|0;L=S+504|0;R=S+448|0;Q=S+408|0;K=S+352|0;J=S+312|0;I=S+304|0;H=S+248|0;M=S+200|0;B=S+184|0;O=S+96|0;q=S+488|0;C=S+456|0;D=S+416|0;E=S+376|0;F=S+360|0;G=S+320|0;w=S+288|0;x=S+256|0;y=S+232|0;z=S+152|0;A=S+136|0;f=S+56|0;N=S+16|0;P=S;p=e+16|0;u=c[p>>2]|0;g=b[u+136>>1]&14;u=d[u+113>>0]|0;if(!((u&54|0)==0?(u&1|0)==0|(c[47186]|0)!=0:0)){u=g<<16>>16!=0;o=gC(e)|0;h=0;j=0;i=0;while(1){if(!o)break;g=c[(c[o+16>>2]|0)+108>>2]|0;do if(g)if(!(a[g+81>>0]|0)){i=i+1|0;break}else{h=h+1|0;break}while(0);n=UA(e,o)|0;g=j;while(1){if(!n)break;k=c[n+16>>2]|0;j=c[k+108>>2]|0;m=k+8|0;do if(j){if(a[j+81>>0]|0){h=h+1|0;break}if(u)g=((c[m>>2]|0)!=0&1)+g|0}while(0);j=c[k+100>>2]|0;do if(j){if(a[j+81>>0]|0){h=h+1|0;break}if(u)g=((c[m>>2]|0)!=0&1)+g|0}while(0);j=c[k+104>>2]|0;do if(j){if(a[j+81>>0]|0){h=h+1|0;break}if(u)g=((c[m>>2]|0)!=0&1)+g|0}while(0);j=c[k+96>>2]|0;do if(j){if(a[j+81>>0]|0){h=h+1|0;break}if(u)g=((c[m>>2]|0)!=0&1)+g|0}while(0);n=WA(e,n)|0}o=hC(e,o)|0;j=g}if(!(a[(c[p>>2]|0)+113>>0]&8))o=0;else o=hM(e)|0;t=j+i|0;if(t|0){p=h+j+o+(qB(e)|0)|0;r=HK(p*40|0)|0;s=HK(t*40|0)|0;_L(M,2147483647.0,2147483647.0);g=M+16|0;_L(q,-2147483647.0,-2147483647.0);c[g>>2]=c[q>>2];c[g+4>>2]=c[q+4>>2];c[g+8>>2]=c[q+8>>2];c[g+12>>2]=c[q+12>>2];g=s;i=r;n=gC(e)|0;while(1){if(!n)break;c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];c[L+16>>2]=c[M+16>>2];c[L+20>>2]=c[M+20>>2];c[L+24>>2]=c[M+24>>2];c[L+28>>2]=c[M+28>>2];iM(C,n,i,L);c[M>>2]=c[C>>2];c[M+4>>2]=c[C+4>>2];c[M+8>>2]=c[C+8>>2];c[M+12>>2]=c[C+12>>2];c[M+16>>2]=c[C+16>>2];c[M+20>>2]=c[C+20>>2];c[M+24>>2]=c[C+24>>2];c[M+28>>2]=c[C+28>>2];h=c[(c[n+16>>2]|0)+108>>2]|0;do if(h)if(!(a[h+81>>0]|0)){c[L>>2]=c[B>>2];c[L+4>>2]=c[B+4>>2];c[L+8>>2]=c[B+8>>2];c[L+12>>2]=c[B+12>>2];kM(h,i,g,0,L);g=g+40|0;break}else{i=i+40|0;c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];c[L+16>>2]=c[M+16>>2];c[L+20>>2]=c[M+20>>2];c[L+24>>2]=c[M+24>>2];c[L+28>>2]=c[M+28>>2];jM(D,h,i,L);c[M>>2]=c[D>>2];c[M+4>>2]=c[D+4>>2];c[M+8>>2]=c[D+8>>2];c[M+12>>2]=c[D+12>>2];c[M+16>>2]=c[D+16>>2];c[M+20>>2]=c[D+20>>2];c[M+24>>2]=c[D+24>>2];c[M+28>>2]=c[D+28>>2];break}while(0);m=UA(e,n)|0;i=i+40|0;while(1){if(!m)break;k=m+16|0;h=c[k>>2]|0;j=c[h+96>>2]|0;a:do if(!j)v=52;else{do if(!(a[j+81>>0]|0)){if(u?c[h+8>>2]|0:0){tO(F,e,m);c[L>>2]=c[F>>2];c[L+4>>2]=c[F+4>>2];c[L+8>>2]=c[F+8>>2];c[L+12>>2]=c[F+12>>2];kM(j,i,g,1,L);g=g+40|0;break}c[H>>2]=c[j>>2];dA(0,104128,H)|0;break a}else{c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];c[L+16>>2]=c[M+16>>2];c[L+20>>2]=c[M+20>>2];c[L+24>>2]=c[M+24>>2];c[L+28>>2]=c[M+28>>2];jM(E,j,i,L);c[M>>2]=c[E>>2];c[M+4>>2]=c[E+4>>2];c[M+8>>2]=c[E+8>>2];c[M+12>>2]=c[E+12>>2];c[M+16>>2]=c[E+16>>2];c[M+20>>2]=c[E+20>>2];c[M+24>>2]=c[E+24>>2];c[M+28>>2]=c[E+28>>2]}while(0);i=i+40|0;h=c[k>>2]|0;v=52}while(0);b:do if((v|0)==52){v=0;j=c[h+104>>2]|0;if(j){do if(!(a[j+81>>0]|0)){if(u?c[h+8>>2]|0:0){lM(w,m);c[L>>2]=c[w>>2];c[L+4>>2]=c[w+4>>2];c[L+8>>2]=c[w+8>>2];c[L+12>>2]=c[w+12>>2];kM(j,i,g,1,L);g=g+40|0;break}c[I>>2]=c[j>>2];dA(0,104163,I)|0;break b}else{c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];c[L+16>>2]=c[M+16>>2];c[L+20>>2]=c[M+20>>2];c[L+24>>2]=c[M+24>>2];c[L+28>>2]=c[M+28>>2];jM(G,j,i,L);c[M>>2]=c[G>>2];c[M+4>>2]=c[G+4>>2];c[M+8>>2]=c[G+8>>2];c[M+12>>2]=c[G+12>>2];c[M+16>>2]=c[G+16>>2];c[M+20>>2]=c[G+20>>2];c[M+24>>2]=c[G+24>>2];c[M+28>>2]=c[G+28>>2]}while(0);i=i+40|0;h=c[k>>2]|0}j=c[h+100>>2]|0;if(j){do if(!(a[j+81>>0]|0)){if(u?c[h+8>>2]|0:0){mM(y,m);c[L>>2]=c[y>>2];c[L+4>>2]=c[y+4>>2];c[L+8>>2]=c[y+8>>2];c[L+12>>2]=c[y+12>>2];kM(j,i,g,1,L);g=g+40|0;break}c[J>>2]=c[j>>2];dA(0,104203,J)|0;break b}else{c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];c[L+16>>2]=c[M+16>>2];c[L+20>>2]=c[M+20>>2];c[L+24>>2]=c[M+24>>2];c[L+28>>2]=c[M+28>>2];jM(x,j,i,L);c[M>>2]=c[x>>2];c[M+4>>2]=c[x+4>>2];c[M+8>>2]=c[x+8>>2];c[M+12>>2]=c[x+12>>2];c[M+16>>2]=c[x+16>>2];c[M+20>>2]=c[x+20>>2];c[M+24>>2]=c[x+24>>2];c[M+28>>2]=c[x+28>>2]}while(0);i=i+40|0;h=c[k>>2]|0}j=c[h+108>>2]|0;if(j){do if(!(a[j+81>>0]|0)){if(u?c[h+8>>2]|0:0){tO(A,e,m);c[L>>2]=c[A>>2];c[L+4>>2]=c[A+4>>2];c[L+8>>2]=c[A+8>>2];c[L+12>>2]=c[A+12>>2];kM(j,i,g,1,L);g=g+40|0;break}c[K>>2]=c[j>>2];dA(0,104243,K)|0;break b}else{c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];c[L+16>>2]=c[M+16>>2];c[L+20>>2]=c[M+20>>2];c[L+24>>2]=c[M+24>>2];c[L+28>>2]=c[M+28>>2];jM(z,j,i,L);c[M>>2]=c[z>>2];c[M+4>>2]=c[z+4>>2];c[M+8>>2]=c[z+8>>2];c[M+12>>2]=c[z+12>>2];c[M+16>>2]=c[z+16>>2];c[M+20>>2]=c[z+20>>2];c[M+24>>2]=c[z+24>>2];c[M+28>>2]=c[z+28>>2]}while(0);i=i+40|0}}while(0);m=WA(e,m)|0}n=hC(e,n)|0}if(o|0){c[f>>2]=c[M>>2];c[f+4>>2]=c[M+4>>2];c[f+8>>2]=c[M+8>>2];c[f+12>>2]=c[M+12>>2];c[f+16>>2]=c[M+16>>2];c[f+20>>2]=c[M+20>>2];c[f+24>>2]=c[M+24>>2];c[f+28>>2]=c[M+28>>2];c[f+32>>2]=i;h=L;g=h+40|0;do{c[h>>2]=c[f>>2];h=h+4|0;f=f+4|0}while((h|0)<(g|0));nM(N,e,L);c[M>>2]=c[N>>2];c[M+4>>2]=c[N+4>>2];c[M+8>>2]=c[N+8>>2];c[M+12>>2]=c[N+12>>2];c[M+16>>2]=c[N+16>>2];c[M+20>>2]=c[N+20>>2];c[M+24>>2]=c[N+24>>2];c[M+28>>2]=c[N+28>>2]}a[O+32>>0]=aP(e,DA(e,0,104279,0)|0,1)|0;c[O>>2]=c[M>>2];c[O+4>>2]=c[M+4>>2];c[O+8>>2]=c[M+8>>2];c[O+12>>2]=c[M+12>>2];c[O+16>>2]=c[M+16>>2];c[O+20>>2]=c[M+20>>2];c[O+24>>2]=c[M+24>>2];c[O+28>>2]=c[M+28>>2];fT(r,p,s,t,O)|0;if(a[195234]|0)oM(r,p,s,t,O);f=0;g=0;h=s;while(1){if((g|0)>=(t|0))break;if(a[h+36>>0]|0){O=c[h+32>>2]|0;a[O+81>>0]=1;N=O+56|0;pM(P,h);c[N>>2]=c[P>>2];c[N+4>>2]=c[P+4>>2];c[N+8>>2]=c[P+8>>2];c[N+12>>2]=c[P+12>>2];xP(e,O);f=f+1|0}g=g+1|0;h=h+40|0}if(!(a[195234]|0)){if((f|0)!=(t|0)){c[R>>2]=f;c[R+4>>2]=t;dA(0,104324,R)|0}}else{R=c[15715]|0;c[Q>>2]=f;c[Q+4>>2]=t;z4(R,104291,Q)|0}l6(r);l6(s)}}l=S;return}function eM(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0;i=l;l=l+48|0;e=i+32|0;f=i+16|0;g=i;if(+h[23324]!=0.0|+h[23325]!=0.0|(c[47335]|0)!=0){d=gC(a)|0;while(1){if(!d)break;if(c[47335]|0)oQ(d,0);b=d+16|0;j=(c[b>>2]|0)+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];$L(f,e);c[j>>2]=c[f>>2];c[j+4>>2]=c[f+4>>2];c[j+8>>2]=c[f+8>>2];c[j+12>>2]=c[f+12>>2];b=c[(c[b>>2]|0)+108>>2]|0;if(b|0){j=b+56|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];$L(g,e);c[j>>2]=c[g>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[j+12>>2]=c[g+12>>2]}a:do if((c[47185]|0)==1){b=UA(a,d)|0;while(1){if(!b)break a;gM(b);b=WA(a,b)|0}}while(0);d=hC(a,d)|0}ZL(a,c[(c[a+16>>2]|0)+116>>2]&3)}l=i;return}function fM(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0;i=b+16|0;j=c[i>>2]|0;g=a[j+275>>0]|0;b=j+32|0;do if(!(g&4)){e=+h[j+16>>3];if(!(g&2)){f=(e+ +h[b>>3])*.5;break}else{f=e+ +h[d>>3]*.5;break}}else f=+h[b>>3]-+h[d>>3]*.5;while(0);e=+h[d+8>>3]*.5;if(!(g&1))e=e+ +h[j+24>>3];else e=+h[j+40>>3]-e;j=c[j+12>>2]|0;h[j+56>>3]=f;h[j+64>>3]=e;a[(c[(c[i>>2]|0)+12>>2]|0)+81>>0]=1;return}function gM(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;s=l;l=l+144|0;q=s+120|0;e=s+16|0;i=s+104|0;j=s+88|0;k=s+72|0;m=s+56|0;n=s+40|0;o=s+24|0;r=s;p=b+16|0;d=c[p>>2]|0;f=c[d+8>>2]|0;if(!f){if((a[195236]|0)==0?(a[d+112>>0]|0)!=6:0){q=HB(c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0;r=HB(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0;c[e>>2]=q;c[e+4>>2]=r;dA(1,104111,e)|0}}else{h=0;b=f;while(1){if((h|0)>=(c[b+4>>2]|0))break;g=c[b>>2]|0;b=c[g+(h*48|0)>>2]|0;e=c[g+(h*48|0)+4>>2]|0;f=c[g+(h*48|0)+8>>2]|0;g=c[g+(h*48|0)+12>>2]|0;d=0;while(1){if((d|0)>=(e|0))break;t=b+(d<<4)|0;c[q>>2]=c[t>>2];c[q+4>>2]=c[t+4>>2];c[q+8>>2]=c[t+8>>2];c[q+12>>2]=c[t+12>>2];$L(i,q);c[t>>2]=c[i>>2];c[t+4>>2]=c[i+4>>2];c[t+8>>2]=c[i+8>>2];c[t+12>>2]=c[i+12>>2];d=d+1|0}if(f|0){t=(c[c[(c[p>>2]|0)+8>>2]>>2]|0)+(h*48|0)+16|0;c[q>>2]=c[t>>2];c[q+4>>2]=c[t+4>>2];c[q+8>>2]=c[t+8>>2];c[q+12>>2]=c[t+12>>2];$L(j,q);c[t>>2]=c[j>>2];c[t+4>>2]=c[j+4>>2];c[t+8>>2]=c[j+8>>2];c[t+12>>2]=c[j+12>>2]}if(g|0){t=(c[c[(c[p>>2]|0)+8>>2]>>2]|0)+(h*48|0)+32|0;c[q>>2]=c[t>>2];c[q+4>>2]=c[t+4>>2];c[q+8>>2]=c[t+8>>2];c[q+12>>2]=c[t+12>>2];$L(k,q);c[t>>2]=c[k>>2];c[t+4>>2]=c[k+4>>2];c[t+8>>2]=c[k+8>>2];c[t+12>>2]=c[k+12>>2]}d=c[p>>2]|0;h=h+1|0;b=c[d+8>>2]|0}b=c[d+96>>2]|0;if(b){d=b+56|0;c[q>>2]=c[d>>2];c[q+4>>2]=c[d+4>>2];c[q+8>>2]=c[d+8>>2];c[q+12>>2]=c[d+12>>2];$L(m,q);c[d>>2]=c[m>>2];c[d+4>>2]=c[m+4>>2];c[d+8>>2]=c[m+8>>2];c[d+12>>2]=c[m+12>>2];d=c[p>>2]|0}b=c[d+108>>2]|0;if(b){d=b+56|0;c[q>>2]=c[d>>2];c[q+4>>2]=c[d+4>>2];c[q+8>>2]=c[d+8>>2];c[q+12>>2]=c[d+12>>2];$L(n,q);c[d>>2]=c[n>>2];c[d+4>>2]=c[n+4>>2];c[d+8>>2]=c[n+8>>2];c[d+12>>2]=c[n+12>>2];d=c[p>>2]|0}b=c[d+100>>2]|0;if(b){d=b+56|0;c[q>>2]=c[d>>2];c[q+4>>2]=c[d+4>>2];c[q+8>>2]=c[d+8>>2];c[q+12>>2]=c[d+12>>2];$L(o,q);c[d>>2]=c[o>>2];c[d+4>>2]=c[o+4>>2];c[d+8>>2]=c[o+8>>2];c[d+12>>2]=c[o+12>>2];d=c[p>>2]|0}d=c[d+104>>2]|0;if(d|0){t=d+56|0;c[q>>2]=c[t>>2];c[q+4>>2]=c[t+4>>2];c[q+8>>2]=c[t+8>>2];c[q+12>>2]=c[t+12>>2];$L(r,q);c[t>>2]=c[r>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2]}}l=s;return}function hM(b){b=b|0;var d=0,e=0,f=0;f=b+16|0;if((vC(b)|0)!=(b|0)?(d=c[(c[f>>2]|0)+12>>2]|0,(d|0)!=0):0){e=1;b=(a[d+81>>0]|0)!=0&1}else{e=1;b=0}while(1){d=c[f>>2]|0;if((e|0)>(c[d+180>>2]|0))break;d=(hM(c[(c[d+184>>2]|0)+(e<<2)>>2]|0)|0)+b|0;e=e+1|0;b=d}return b|0}function iM(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0.0,k=0.0,m=0.0,n=0;g=l;l=l+32|0;i=g;n=(a[195239]|0)==0;d=c[d+16>>2]|0;m=+h[d+40>>3]*72.0;j=+h[d+32>>3]*72.0;k=n?j:m;j=n?m:j;h[e+16>>3]=k;h[e+24>>3]=j;d=d+16|0;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];h[e>>3]=+h[e>>3]-k*.5;d=e+8|0;h[d>>3]=+h[d>>3]-j*.5;c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];c[i+8>>2]=c[f+8>>2];c[i+12>>2]=c[f+12>>2];c[i+16>>2]=c[f+16>>2];c[i+20>>2]=c[f+20>>2];c[i+24>>2]=c[f+24>>2];c[i+28>>2]=c[f+28>>2];qM(b,e,i);l=g;return}function jM(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0.0,k=0.0,m=0.0,n=0;g=l;l=l+32|0;i=g;n=(a[195239]|0)==0;j=+h[d+24>>3];m=+h[d+32>>3];k=n?j:m;j=n?m:j;h[e+16>>3]=k;h[e+24>>3]=j;d=d+56|0;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];h[e>>3]=+h[e>>3]-k*.5;d=e+8|0;h[d>>3]=+h[d>>3]-j*.5;c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];c[i+8>>2]=c[f+8>>2];c[i+12>>2]=c[f+12>>2];c[i+16>>2]=c[f+16>>2];c[i+20>>2]=c[f+20>>2];c[i+24>>2]=c[f+24>>2];c[i+28>>2]=c[f+28>>2];qM(b,e,i);l=g;return}function kM(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if(f|0){f=d+16|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2]}f=b+24|0;if(!(a[195239]|0)){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2]}else{h[e>>3]=+h[b+32>>3];h[e+8>>3]=+h[f>>3]}c[e+32>>2]=b;a[e+36>>0]=0;c[d+32>>2]=e;return}function lM(a,b){a=a|0;b=b|0;b=sO(b)|0;do if(b){b=c[b>>2]|0;if(!(c[b+8>>2]|0)){b=c[b>>2]|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];break}else{b=b+16|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];break}}else{c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0}while(0);return}function mM(a,b){a=a|0;b=b|0;var d=0;b=sO(b)|0;do if(b){d=c[b>>2]|0;b=(c[b+4>>2]|0)+-1|0;if(!(c[d+(b*48|0)+12>>2]|0)){d=(c[d+(b*48|0)>>2]|0)+((c[d+(b*48|0)+4>>2]|0)+-1<<4)|0;c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];break}else{d=d+(b*48|0)+32|0;c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];break}}else{c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0}while(0);return}function nM(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+112|0;k=q+72|0;n=q+32|0;o=q;p=d+16|0;j=1;while(1){f=c[p>>2]|0;if((j|0)>(c[f+180>>2]|0))break;f=c[(c[f+184>>2]|0)+(j<<2)>>2]|0;g=k;h=e;i=g+40|0;do{c[g>>2]=c[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));nM(n,f,k);g=e;h=n;i=g+40|0;do{c[g>>2]=c[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));j=j+1|0}if(((vC(d)|0)!=(d|0)?(m=c[(c[p>>2]|0)+12>>2]|0,m|0):0)?a[m+81>>0]|0:0){p=e+32|0;n=c[p>>2]|0;c[k>>2]=c[e>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];c[k+16>>2]=c[e+16>>2];c[k+20>>2]=c[e+20>>2];c[k+24>>2]=c[e+24>>2];c[k+28>>2]=c[e+28>>2];jM(o,m,n,k);c[e>>2]=c[o>>2];c[e+4>>2]=c[o+4>>2];c[e+8>>2]=c[o+8>>2];c[e+12>>2]=c[o+12>>2];c[e+16>>2]=c[o+16>>2];c[e+20>>2]=c[o+20>>2];c[e+24>>2]=c[o+24>>2];c[e+28>>2]=c[o+28>>2];c[p>>2]=(c[p>>2]|0)+40}g=b;h=e;i=g+40|0;do{c[g>>2]=c[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));l=q;return}function oM(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+160|0;r=s+96|0;p=s+48|0;o=s;q=c[15715]|0;n=d[g+32>>0]|0;i=+h[g>>3];j=+h[g+8>>3];k=+h[g+16>>3];m=+h[g+24>>3];c[o>>2]=b;c[o+4>>2]=f;c[o+8>>2]=n;h[o+16>>3]=i;h[o+24>>3]=j;h[o+32>>3]=k;h[o+40>>3]=m;z4(q,104366,o)|0;a:do if((d[195234]|0)>=2){_3(104426,8,1,q)|0;o=0;while(1){if((o|0)>=(b|0))break;g=c[a+32>>2]|0;i=+h[a>>3];j=+h[a+8>>3];k=+h[a+16>>3];m=+h[a+24>>3];if(!g)n=195341;else n=c[c[g+32>>2]>>2]|0;c[p>>2]=o;h[p+8>>3]=i;h[p+16>>3]=j;h[p+24>>3]=k;h[p+32>>3]=m;c[p+40>>2]=g;c[p+44>>2]=n;z4(q,104435,p)|0;o=o+1|0;a=a+40|0}_3(104478,8,1,q)|0;g=0;while(1){if((g|0)>=(f|0))break a;b=d[e+36>>0]|0;i=+h[e+16>>3];j=+h[e+24>>3];k=+h[e>>3];m=+h[e+8>>3];p=c[c[e+32>>2]>>2]|0;c[r>>2]=g;c[r+4>>2]=e;c[r+8>>2]=b;h[r+16>>3]=i;h[r+24>>3]=j;h[r+32>>3]=k;h[r+40>>3]=m;c[r+48>>2]=p;z4(q,104487,r)|0;e=e+40|0;g=g+1|0}}while(0);l=s;return}function pM(a,b){a=a|0;b=b|0;var c=0.0;c=+h[b+24>>3]+ +h[b+8>>3]*.5;h[a>>3]=+h[b+16>>3]+ +h[b>>3]*.5;h[a+8>>3]=c;return}function qM(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0.0,j=0.0;e=l;l=l+16|0;f=e;j=+h[b>>3];h[d>>3]=+h[(+h[d>>3]>3];g=d+8|0;i=+h[b+8>>3];h[g>>3]=+h[(+h[g>>3]>3];j=j+ +h[b+16>>3];h[f>>3]=j;i=i+ +h[b+24>>3];h[f+8>>3]=i;g=d+16|0;h[g>>3]=+h[(+h[g>>3]>j?g:f)>>3];b=d+24|0;h[b>>3]=+h[(+h[b>>3]>i?g:f)+8>>3];c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];c[a+16>>2]=c[d+16>>2];c[a+20>>2]=c[d+20>>2];c[a+24>>2]=c[d+24>>2];c[a+28>>2]=c[d+28>>2];l=e;return}function rM(a){a=a|0;aM(a,1);return}function sM(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;e=l;l=l+16|0;d=e;b=kP(NA(a,105827)|0)|0;if(b){b=tM(b)|0;if(b|0){f=c[b+40>>2]|0;d=c[b+44>>2]|0;g=a+16|0;a=c[g>>2]|0;h[a+32>>3]=+(f|0)/72.0;h[a+40>>3]=+(d|0)/72.0;a=HK(12)|0;c[(c[g>>2]|0)+12>>2]=a;c[a>>2]=c[b+12>>2];c[a+4>>2]=((f|0)/-2|0)-(c[b+32>>2]|0);c[a+8>>2]=((d|0)/-2|0)-(c[b+36>>2]|0)}}else{c[d>>2]=HB(a)|0;dA(0,104535,d)|0}l=e;return}function tM(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+1152|0;i=p+24|0;h=p+8|0;e=p;f=p+120|0;j=p+44|0;k=p+40|0;m=p+36|0;n=p+32|0;o=p+28|0;d=c[47336]|0;if(!d){d=Sz(20860,c[4591]|0)|0;c[47336]=d}d=eb[c[d>>2]&63](d,b,512)|0;do if(!d){g=f4(b,139124)|0;if(!g){c[e>>2]=b;dA(0,104584,e)|0;d=0;break}else{d=0;e=0}while(1){if(!(o4(f,1024,g)|0)){f=11;break}c[h>>2]=k;c[h+4>>2]=m;c[h+8>>2]=n;c[h+12>>2]=o;q=(q4(f,104612,h)|0)==4;e=q?1:e;if((a[f>>0]|0)!=37){q=(C4(f,104641)|0)==0;d=q?d:1}if((e|0)!=0&(d|0)!=0){f=12;break}}if((f|0)==11)if(!e){c[i>>2]=b;dA(0,104646,i)|0;d=0}else f=12;if((f|0)==12){q=IK(64)|0;k=c[k>>2]|0;c[q+32>>2]=k;m=c[m>>2]|0;c[q+40>>2]=(c[n>>2]|0)-k;c[q+36>>2]=(c[o>>2]|0)-m;c[q+8>>2]=b;o=c[47337]|0;c[47337]=o+1;c[q+12>>2]=o;i3(V5(g)|0,j)|0;o=c[j+36>>2]|0;n=IK(o+1|0)|0;c[q+52>>2]=n;y4(g,0,0)|0;X5(n,o,1,g)|0;a[n+o>>0]=0;o=c[47336]|0;eb[c[o>>2]&63](o,q,1)|0;a[q+16>>0]=d;d=q}l4(g)|0}while(0);l=p;return d|0}function uM(a,b,d){a=a|0;b=b|0;d=d|0;l6(c[b+52>>2]|0);return}function vM(a){a=a|0;l6(c[(c[a+16>>2]|0)+12>>2]|0);return}function wM(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;m=n+8|0;k=n;j=(d|0)!=0;a:do if(j){h=0;f=0;b:while(1)while(1){if(h)break a;g=c[d+(f<<2)>>2]|0;if(!g){i=6;break a}f=f+1|0;if(!(a[g>>0]|0)){h=1;continue b}}}else i=6;while(0);c:do if((i|0)==6)while(1){f=c[e>>2]|0;if(!f)break c;mF(b,f)|0;mF(b,153748)|0;e=e+4|0;i=6}while(0);d:do if(j){h=0;while(1){f=c[d+(h<<2)>>2]|0;if(!f)break d;do if(a[f>>0]|0){e=kP(f)|0;if(!e){c[k>>2]=f;dA(0,104685,k)|0;break}g=f4(e,139124)|0;if(!g){c[m>>2]=e;dA(0,104713,m)|0;break}while(1){f=jP(g)|0;if(!f)break;mF(b,f)|0}mF(b,153748)|0;l4(g)|0}while(0);h=h+1|0}}while(0);l=n;return}function xM(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;d=c[d+52>>2]|0;a:while(1){e=a[d>>0]|0;b:do switch(e<<24>>24){case 0:break a;case 37:{if((a[d+1>>0]|0)==37){f=d+2|0;if((((N3(f,104741,3)|0)!=0?(N3(f,104745,5)|0)!=0:0)?(N3(f,104751,3)|0)!=0:0)?(N3(f,104755,7)|0)!=0:0)break b;else f=37;while(1){if((f&255)<14){e=d+1|0;if(!(7166>>>(f&255)&1))break}else e=d+1|0;d=e;f=a[e>>0]|0}switch(f<<24>>24){case 0:continue a;case 13:{if((a[e>>0]|0)==10){d=d+2|0;continue a}break}default:{}}d=e;continue a}else e=37;break}default:{}}while(0);c:while(1){switch(e<<24>>24){case 10:case 13:case 0:break c;default:{}}nF(b,e<<24>>24)|0;f=d+1|0;d=f;e=a[f>>0]|0}f=d+1|0;switch(e<<24>>24){case 13:{if((a[f>>0]|0)==10)d=d+2|0;else g=21;break}case 0:break;default:g=21}if((g|0)==21){g=0;d=f}nF(b,10)|0}return}function yM(b){b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+16|0;e=f;d=c[47336]|0;a:do if(d|0){d=eb[c[d>>2]&63](d,0,128)|0;while(1){if(!d)break a;if(!(a[d+16>>0]|0)){c[e>>2]=c[d+12>>2];sF(b,104763,e);mF(b,104781)|0;xM(b,d);mF(b,104799)|0;mF(b,104814)|0}g=c[47336]|0;d=eb[c[g>>2]&63](g,d,8)|0}}while(0);l=f;return}function zM(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;a:do switch(d|0){case 0:{f=b;break}case 1:{f=dQ(b)|0;break}default:{switch(AM(b)|0){case 2:break;case 1:{f=dQ(b)|0;break a}default:{f=b;break a}}if(!(c[47338]|0)){dA(0,104826,e)|0;c[47338]=1;f=b}else f=b}}while(0);if(!(c[47339]|0))hA(189356,0,0);d=c[47340]|0;if(d>>>0>=(c[47341]|0)>>>0){iA(189356,1)|0;d=c[47340]|0}c[47340]=d+1;a[d>>0]=40;e=f;b:while(1){switch(a[e>>0]|0){case 0:break b;case 92:case 41:case 40:{d=c[47340]|0;if(d>>>0>=(c[47341]|0)>>>0){iA(189356,1)|0;d=c[47340]|0}c[47340]=d+1;a[d>>0]=92;break}default:{}}d=c[47340]|0;if(d>>>0>=(c[47341]|0)>>>0){iA(189356,1)|0;d=c[47340]|0}h=a[e>>0]|0;c[47340]=d+1;a[d>>0]=h;e=e+1|0}d=c[47340]|0;if(d>>>0>=(c[47341]|0)>>>0){iA(189356,1)|0;d=c[47340]|0}c[47340]=d+1;a[d>>0]=41;if((f|0)!=(b|0))l6(f);d=c[47340]|0;if(d>>>0>=(c[47341]|0)>>>0){iA(189356,1)|0;d=c[47340]|0}a[d>>0]=0;h=c[47339]|0;c[47340]=h;l=g;return h|0}function AM(b){b=b|0;var c=0,d=0;c=0;a:while(1){while(1){d=a[b>>0]|0;if(!(d<<24>>24))break a;if((d&255)<127)b=b+1|0;else break}if((d&-4)<<24>>24==-64){c=1;b=b+2|0}else{c=2;break}}return c|0}function BM(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;n=l;l=l+96|0;i=n+80|0;j=n+72|0;m=n+64|0;g=n+32|0;k=n;h[g>>3]=+h[a>>3];h[g+8>>3]=+h[a+8>>3];h[g+16>>3]=+h[b>>3];h[g+24>>3]=+h[b+8>>3];do if((gY(d,g,j)|0)>=0){if(!f){b=d+4|0;a=c[b>>2]|0;f=c[47344]|0;if((a|0)>(c[47343]|0)){a=a<<5;if(!f)a=IK(a)|0;else a=KK(f,a)|0;c[47344]=a;g=c[b>>2]|0;c[47343]=g;f=a}else g=a;b=c[d>>2]|0;a=0;while(1){if((a|0)>=(g|0))break;o=f+(a<<5)|0;d=b+(a<<4)|0;c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];o=f+(a<<5)+16|0;d=a+1|0;p=b+(((d|0)%(g|0)|0)<<4)|0;c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];a=d}c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[k+24>>2]=0;c[k+28>>2]=0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];if((MX(f,g,i,k,m)|0)<0){a=0;break}}else{c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];DY(i,m)}a=m+4|0;if(!(CM(c[a>>2]|0)|0)){g=c[a>>2]|0;a=c[47345]|0;f=c[m>>2]|0;b=0;while(1){if((b|0)>=(g|0))break;p=a+(b<<4)|0;o=f+(b<<4)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];b=b+1|0}c[e>>2]=g}else a=0}else a=0;while(0);l=n;return a|0}function CM(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=e;b=c[47346]|0;do if((b|0)<(a|0)){a=a+300-((a|0)%300|0)+b|0;b=KK(c[47345]|0,a<<4)|0;c[47345]=b;if(!b){dA(1,104916,d)|0;a=1;break}else{c[47346]=a;a=0;break}}else a=0;while(0);l=e;return a|0}function DM(){var b=0,d=0,e=0;d=l;l=l+16|0;b=d;e=c[47347]|0;c[47347]=e+1;do if((e|0)<=0){e=IK(4800)|0;c[47345]=e;if(!e){dA(1,104939,b)|0;b=1;break}c[47346]=300;c[47348]=0;c[47349]=0;if(a[195234]|0){RO();b=0}else b=0}else b=0;while(0);l=d;return b|0}function EM(){var b=0,d=0,e=0,f=0.0,g=0,i=0;d=l;l=l+16|0;b=d;e=c[47347]|0;c[47347]=e+-1;if((e|0)<=1?(l6(c[47345]|0),a[195234]|0):0){e=c[15715]|0;i=c[47348]|0;g=c[47349]|0;f=+SO();c[b>>2]=i;c[b+4>>2]=g;h[b+8>>3]=f;z4(e,104977,b)|0}l=d;return}function FM(a,b){a=a|0;b=b|0;return GM(a,b,0)|0}function GM(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0;P=l;l=l+176|0;K=P+168|0;O=P+128|0;B=P+120|0;z=P+112|0;j=P+104|0;w=P+88|0;s=P+72|0;g=P+64|0;x=P+160|0;M=P+152|0;C=P+144|0;y=P+32|0;A=P;N=P+136|0;c[47348]=(c[47348]|0)+1;L=c[b+80>>2]|0;c[47349]=(c[47349]|0)+L;f=b+88|0;while(1){G=c[f>>2]|0;if(!G){H=4;break}f=c[G+16>>2]|0;if(!(a[f+112>>0]|0)){H=5;break}else f=f+116|0}do if((H|0)==4){dA(1,105020,g)|0;f=0}else if((H|0)==5){F=c[b+84>>2]|0;if(!(HM(L,F,b)|0)){i=L<<3;if((i|0)>(c[47350]|0)){f=c[47351]|0;g=L<<7;if(!f)f=IK(g)|0;else f=KK(f,g)|0;c[47351]=f;c[47350]=i}a:do if((L|0)>1?+h[F+8>>3]>+h[F+40>>3]:0){f=0;while(1){if((f|0)==(L|0)){u=1;break a}D=F+(f<<5)+24|0;Q=+h[D>>3];E=F+(f<<5)+8|0;h[D>>3]=-+h[E>>3];h[E>>3]=-Q;f=f+1|0}}else u=0;while(0);v=c[G>>2]&3;D=G+48|0;f=c[((v|0)==3?G:D)+40>>2]|0;E=G+-48|0;if((f|0)==(c[((v|0)==2?G:E)+40>>2]|0)){c[j>>2]=HB(f)|0;dA(1,105127,j)|0;f=0;break}t=L+-1|0;v=c[47351]|0;j=0;f=0;b:while(1){c:while(1){if((f|0)>=(L|0)){s=t;break b}i=F+(f<<5)+8|0;if((f|0)>0)k=+h[i>>3]>+h[F+(f+-1<<5)+8>>3]?-1:1;else k=0;r=f+1|0;if((f|0)<(t|0))m=+h[F+(r<<5)+8>>3]>+h[i>>3]?1:-1;else m=0;if((k|0)!=(m|0)){H=24;break}switch(k|0){case -1:{f=r;break}case 0:{H=28;break c}default:{H=29;break b}}}do if((H|0)==24){H=0;q=j+2|0;n=F+(f<<5)|0;o=F+(f<<5)+24|0;g=v+(j+1<<4)|0;p=v+(j<<4)+8|0;j=v+(j<<4)|0;if((k|0)==1|(m|0)==-1){h[j>>3]=+h[n>>3];h[p>>3]=+h[o>>3];h[g>>3]=+h[n>>3];f=q;break}else{f=F+(f<<5)+16|0;h[j>>3]=+h[f>>3];h[p>>3]=+h[i>>3];h[g>>3]=+h[f>>3];i=o;f=q;break}}else if((H|0)==28){H=0;q=F+(f<<5)|0;h[v+(j<<4)>>3]=+h[q>>3];h[v+(j<<4)+8>>3]=+h[F+(f<<5)+24>>3];g=v+(j+1<<4)|0;h[g>>3]=+h[q>>3];f=j+2|0}while(0);h[g+8>>3]=+h[i>>3];j=f;f=r}if((H|0)==29){c[s>>2]=k;c[s+4>>2]=k;c[s+8>>2]=480;dA(1,105062,s)|0;f=0;break}d:while(1){if((s|0)<=-1)break;g=F+(s<<5)+8|0;if((s|0)<(t|0))k=+h[g>>3]>+h[F+(s+1<<5)+8>>3]?-1:1;else k=0;if((s|0)>0)m=+h[F+(s+-1<<5)+8>>3]>+h[g>>3]?1:-1;else m=0;n=F+(s<<5)|0;f=j+1|0;i=j+2|0;o=F+(s<<5)+16|0;r=F+(s<<5)+24|0;e:do if((k|0)!=(m|0)){p=v+(f<<4)|0;q=v+(j<<4)|0;j=v+(j<<4)+8|0;if((k|0)==1|(m|0)==-1){h[q>>3]=+h[n>>3];h[j>>3]=+h[r>>3];h[p>>3]=+h[n>>3];break}else{h[q>>3]=+h[o>>3];h[j>>3]=+h[g>>3];h[p>>3]=+h[o>>3];g=r;break}}else switch(k|0){case 0:{h[v+(j<<4)>>3]=+h[o>>3];h[v+(j<<4)+8>>3]=+h[g>>3];h[v+(f<<4)>>3]=+h[o>>3];g=r;break e}case -1:{h[v+(j<<4)>>3]=+h[o>>3];h[v+(j<<4)+8>>3]=+h[g>>3];h[v+(f<<4)>>3]=+h[o>>3];h[v+(f<<4)+8>>3]=+h[r>>3];h[v+(i<<4)>>3]=+h[n>>3];f=j+3|0;h[v+(i<<4)+8>>3]=+h[r>>3];h[v+(f<<4)>>3]=+h[n>>3];i=j+4|0;break e}default:{H=42;break d}}while(0);h[v+(f<<4)+8>>3]=+h[g>>3];s=s+-1|0;j=i}if((H|0)==42){c[w>>2]=k;c[w+4>>2]=k;c[w+8>>2]=513;dA(1,105062,w)|0;f=0;break}f:do if(!u)f=0;else{f=0;while(1){if((f|0)>=(L|0)){f=0;break}u=F+(f<<5)+24|0;Q=+h[u>>3];w=F+(f<<5)+8|0;h[u>>3]=-+h[w>>3];h[w>>3]=-Q;f=f+1|0}while(1){if((f|0)>=(j|0)){f=0;break f}w=v+(f<<4)+8|0;h[w>>3]=-+h[w>>3];f=f+1|0}}while(0);while(1){if((f|0)>=(L|0))break;h[F+(f<<5)>>3]=2147483647.0;h[F+(f<<5)+16>>3]=-2147483648.0;f=f+1|0}c[x>>2]=v;i=x+4|0;c[i>>2]=j;h[y>>3]=+h[b>>3];h[y+8>>3]=+h[b+8>>3];h[y+16>>3]=+h[b+40>>3];h[y+24>>3]=+h[b+48>>3];if((gY(x,y,M)|0)<0){dA(1,105166,z)|0;f=0;break}if(!e){g=c[i>>2]|0;f=c[47344]|0;if((g|0)>(c[47343]|0)){g=g<<5;if(!f)f=IK(g)|0;else f=KK(f,g)|0;c[47344]=f;g=c[i>>2]|0;c[47343]=g}j=c[47351]|0;i=0;while(1){if((i|0)>=(g|0))break;y=f+(i<<5)|0;z=j+(i<<4)|0;c[y>>2]=c[z>>2];c[y+4>>2]=c[z+4>>2];c[y+8>>2]=c[z+8>>2];c[y+12>>2]=c[z+12>>2];y=f+(i<<5)+16|0;z=i+1|0;x=j+(((z|0)%(g|0)|0)<<4)|0;c[y>>2]=c[x>>2];c[y+4>>2]=c[x+4>>2];c[y+8>>2]=c[x+8>>2];c[y+12>>2]=c[x+12>>2];i=z}if(!(a[b+29>>0]|0)){c[A>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;c[A+12>>2]=0}else{Q=+h[b+16>>3];h[A>>3]=+I(+Q);h[A+8>>3]=+J(+Q)}i=A+16|0;if(!(a[b+69>>0]|0)){c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0}else{Q=+h[b+56>>3];h[i>>3]=-+I(+Q);h[A+24>>3]=-+J(+Q)};c[K>>2]=c[M>>2];c[K+4>>2]=c[M+4>>2];if((MX(f,g,K,A,C)|0)<0){dA(1,105205,B)|0;f=0;break}}else{c[K>>2]=c[M>>2];c[K+4>>2]=c[M+4>>2];DY(K,C)}k=C+4|0;if(!(CM(c[k>>2]|0)|0)){f=0;while(1){if((f|0)>=(L|0))break;h[F+(f<<5)>>3]=2147483647.0;h[F+(f<<5)+16>>3]=-2147483648.0;f=f+1|0}i=c[k>>2]|0;j=c[47345]|0;g=c[C>>2]|0;f=0;while(1){if((f|0)>=(i|0)){i=1;f=10;g=0;break}C=j+(f<<4)|0;B=g+(f<<4)|0;c[C>>2]=c[B>>2];c[C+4>>2]=c[B+4>>2];c[C+8>>2]=c[B+8>>2];c[C+12>>2]=c[B+12>>2];f=f+1|0}while(1){if(!((g|0)<15&i<<24>>24!=0))break;IM(F,L,c[47345]|0,c[k>>2]|0,f);j=0;while(1){if((j|0)>=(L|0))break;if(+h[F+(j<<5)>>3]==2147483647.0){H=84;break}if(+h[F+(j<<5)+16>>3]==-2147483648.0){H=84;break}j=j+1|0}if((H|0)==84){H=0;C=f<<1;f=C;g=(C|0)>(2147483647/(L|0)|0|0)?15:g}i=(j|0)==(L|0)?0:i;g=g+1|0}if(i<<24>>24){D=HB(c[((c[G>>2]&3|0)==3?G:D)+40>>2]|0)|0;H=HB(c[((c[G>>2]&3|0)==2?G:E)+40>>2]|0)|0;c[O>>2]=D;c[O+4>>2]=H;dA(0,105243,O)|0;c[K>>2]=c[M>>2];c[K+4>>2]=c[M+4>>2];DY(K,N);IM(F,L,c[N>>2]|0,c[N+4>>2]|0,10);l6(c[N>>2]|0)}c[d>>2]=c[k>>2];f=c[47345]|0}else f=0}else f=0}while(0);l=P;return f|0}function HM(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0,N=0,O=0,P=0,Q=0.0,R=0,S=0;S=l;l=l+32|0;J=S+16|0;I=S+8|0;m=S;f=0;k=0;while(1){if((k|0)>=(b|0))break;j=d+(k<<5)|0;t=+h[d+(k<<5)+8>>3]-+h[d+(k<<5)+24>>3];if(!((t>=0.0?t:-t)<.01)?(t=+h[j>>3]-+h[d+(k<<5)+16>>3],!((t>=0.0?t:-t)<.01)):0){if((f|0)!=(k|0)){P=d+(f<<5)|0;c[P>>2]=c[j>>2];c[P+4>>2]=c[j+4>>2];c[P+8>>2]=c[j+8>>2];c[P+12>>2]=c[j+12>>2];c[P+16>>2]=c[j+16>>2];c[P+20>>2]=c[j+20>>2];c[P+24>>2]=c[j+24>>2];c[P+28>>2]=c[j+28>>2]}f=f+1|0}k=k+1|0}K=d+16|0;do if(!(+h[d>>3]>+h[K>>3])?(M=d+8|0,N=d+24|0,!(+h[M>>3]>+h[N>>3])):0){O=f+-1|0;P=c[15715]|0;x=0;while(1){if((x|0)>=(O|0))break;E=x+1|0;F=d+(E<<5)|0;g=+h[F>>3];G=d+(E<<5)+16|0;i=+h[G>>3];if(g>i){R=16;break}B=d+(E<<5)+8|0;o=+h[B>>3];C=d+(E<<5)+24|0;p=+h[C>>3];if(o>p){R=16;break}H=d+(x<<5)+16|0;w=+h[H>>3]>3]>i;b=v&1;A=d+(x<<5)+24|0;u=+h[A>>3]>3]>p;j=m&1;y=b+f+k+j|0;n=(y|0)!=0;if(!((a[195234]|0)==0|n^1)){c[J>>2]=x;c[J+4>>2]=E;z4(P,105443,J)|0;JM(e)}a:do if(n){if(!w)if(!v)if(!u){if(m){m=0;n=f;f=C;j=z;R=24}}else{m=j;k=0;n=f;f=B;j=A;R=24}else{m=j;b=0;n=f;f=G;j=D;R=24}else{m=j;n=0;f=F;j=H;R=24}if((R|0)==24){R=0;x=~~+h[j>>3];h[j>>3]=+h[f>>3];h[f>>3]=+(x|0);j=m;f=n}n=y+-1|0;m=0;while(1){if((m|0)>=(n|0))break a;do if((f|0)!=1){if((b|0)==1){t=+(~~((+h[D>>3]+ +h[G>>3])*.5+.5)|0);h[G>>3]=t;h[D>>3]=t;b=0;break}if((k|0)==1){t=+(~~((+h[A>>3]+ +h[B>>3])*.5+.5)|0);h[B>>3]=t;h[A>>3]=t;k=0;break}if((j|0)==1){t=+(~~((+h[z>>3]+ +h[C>>3])*.5+.5)|0);h[C>>3]=t;h[z>>3]=t;j=0}}else{t=+(~~((+h[H>>3]+ +h[F>>3])*.5+.5)|0);h[F>>3]=t;h[H>>3]=t;f=0}while(0);m=m+1|0}}while(0);q=+h[D>>3];r=+h[H>>3];s=+h[F>>3];t=+h[G>>3];j=KM(~~q,~~r,~~s,~~t)|0;p=+h[z>>3];o=+h[A>>3];i=+h[B>>3];g=+h[C>>3];f=KM(~~p,~~o,~~i,~~g)|0;if(!((j|0)!=0&(f|0)!=0)){x=E;continue}if((j|0)<(f|0)){C=r-q>t-s;x=r>3]=C?(x?s:t):x?r:q;x=E;continue}else{C=o-p>g-i;x=o>3]=C?(x?i:g):x?o:p;x=E;continue}}if((R|0)==16){c[I>>2]=E;dA(1,105397,I)|0;JM(e);f=1;break}i=+h[e>>3];g=+h[d>>3];f=e+8|0;if(!(((!(i+h[K>>3]):0)?(L=+h[f>>3],!(L<+h[M>>3])):0)?!(L>+h[N>>3]):0)){if(a[195234]|0){_3(105486,42,1,P)|0;JM(e);i=+h[e>>3];g=+h[d>>3]}if(i>3]=g;i=g}g=+h[K>>3];if(i>g)h[e>>3]=g;i=+h[f>>3];g=+h[M>>3];if(i>3]=g;i=g}g=+h[N>>3];if(i>g)h[f>>3]=g}k=e+40|0;i=+h[k>>3];f=d+(O<<5)|0;g=+h[f>>3];n=e+48|0;b=d+(O<<5)+8|0;m=d+(O<<5)+24|0;j=d+(O<<5)+16|0;if(((!(i+h[j>>3]):0)?(Q=+h[n>>3],!(Q<+h[b>>3])):0)?!(Q>+h[m>>3]):0){f=0;break}if(a[195234]|0){_3(105529,39,1,P)|0;JM(e);i=+h[k>>3];g=+h[f>>3]}if(i>3]=g;i=g}g=+h[j>>3];if(i>g)h[k>>3]=g;i=+h[n>>3];g=+h[b>>3];if(i>3]=g;i=g}g=+h[m>>3];if(i>g){h[n>>3]=g;f=0}else f=0}else R=12;while(0);if((R|0)==12){dA(1,105352,m)|0;JM(e);f=1}l=S;return f|0}function IM(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0;s=S(e,b)|0;t=+(s|0);e=0;a:while(1){u=e+3|0;if((u|0)>=(d|0))break;o=c+(e<<4)|0;p=c+(e<<4)+8|0;r=e+1|0;q=c+(r<<4)|0;r=c+(r<<4)+8|0;j=e+2|0;i=c+(j<<4)|0;j=c+(j<<4)+8|0;k=c+(u<<4)|0;l=c+(u<<4)+8|0;g=0;while(1){if((g|0)>(s|0)){e=u;continue a}x=+(g|0)/t;m=+h[o>>3];n=+h[p>>3];y=+h[q>>3];v=+h[r>>3];z=+h[i>>3];w=+h[j>>3];m=m+x*(y-m);n=n+x*(v-n);y=y+x*(z-y);v=v+x*(w-v);m=m+x*(y-m);n=n+x*(v-n);m=m+x*(y+x*(z+x*(+h[k>>3]-z)-y)-m);n=n+x*(v+x*(w+x*(+h[l>>3]-w)-v)-n);f=0;while(1){if((f|0)>=(b|0))break;if(n<=+h[a+(f<<5)+24>>3]+.0001?n>=+h[a+(f<<5)+8>>3]+-.0001:0){e=a+(f<<5)|0;if(+h[e>>3]>m)h[e>>3]=m;e=a+(f<<5)+16|0;if(+h[e>>3]>3]=m}f=f+1|0}g=g+1|0}}return}function JM(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0;m=l;l=l+112|0;j=m+80|0;k=m+48|0;i=m+8|0;g=m;e=c[15715]|0;f=b+80|0;c[g>>2]=c[f>>2];z4(e,105569,g)|0;g=b+84|0;d=0;while(1){if((d|0)>=(c[f>>2]|0))break;r=c[g>>2]|0;q=+h[r+(d<<5)>>3];p=+h[r+(d<<5)+8>>3];o=+h[r+(d<<5)+16>>3];n=+h[r+(d<<5)+24>>3];c[i>>2]=d;h[i+8>>3]=q;h[i+16>>3]=p;h[i+24>>3]=o;h[i+32>>3]=n;z4(e,105580,i)|0;d=d+1|0}q=+h[b+8>>3];p=+h[b+16>>3];r=a[b+29>>0]|0?105611:105623;h[k>>3]=+h[b>>3];h[k+8>>3]=q;h[k+16>>3]=p;c[k+24>>2]=r;z4(e,105639,k)|0;p=+h[b+48>>3];q=+h[b+56>>3];r=a[b+69>>0]|0?105611:105623;h[j>>3]=+h[b+40>>3];h[j+8>>3]=p;h[j+16>>3]=q;c[j+24>>2]=r;z4(e,105690,j)|0;l=m;return}function KM(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;do if((b|0)>(c|0)&(d|0)>(a|0)){if(!((c|0)>(a|0)|(d|0)<(a|0))){a=d-a|0;break}if((b|0)<(c|0)|(b|0)>(d|0)){b=b-a|0;a=d-c|0;a=(b|0)<(a|0)?b:a;break}else{a=b-c|0;break}}else a=0;while(0);return a|0}function LM(a,b){a=a|0;b=b|0;return GM(a,b,1)|0}function MM(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=l;l=l+80|0;g=j;i=1;f=b;while(1){h=f;f=c[(c[f+16>>2]|0)+172>>2]|0;if(!((f|0)!=0&(h|0)!=(f|0)))break;else i=i+1|0}if((i|0)>=21)g=HK(i<<2)|0;h=0;f=b;while(1){if((h|0)>=(i|0))break;c[g+(h<<2)>>2]=f;h=h+1|0;f=c[(c[f+16>>2]|0)+172>>2]|0}NM(a,g,i,d,e);if((i|0)>20)l6(g);l=j;return} -function aQ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=l;l=l+16|0;g=j;a[g>>0]=b;a[g+1>>0]=0;g=cQ(g)|0;h=d+4|0;i=d+8|0;e=D3(g)|0;f=g;while(1){if((e|0)<=1)break;b=c[h>>2]|0;if(b>>>0>=(c[i>>2]|0)>>>0){iA(d,1)|0;b=c[h>>2]|0}k=a[f>>0]|0;c[h>>2]=b+1;a[b>>0]=k;e=e+-1|0;f=f+1|0}k=a[f>>0]|0;l6(g);l=j;return k|0}function bQ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+32|0;h=i;d=i+8|0;e=c[b>>2]|0;a:do if((a[e>>0]|0)!=35){c[h>>2]=d;f=0;while(1){if((f|0)>=8){d=0;break a}g=a[e+f>>0]|0;if(!(g<<24>>24)){d=0;break a}f=f+1|0;if(g<<24>>24==59)break;a[d>>0]=g;d=d+1|0}a[d>>0]=0;d=e6(h,23712,252,8,96)|0;if(!d)d=0;else{e=e+f|0;d=c[d+4>>2]|0}}else{h=a[e+1>>0]|0;d=h&255;b:do if((h|32)<<24>>24==120){h=0;g=2;while(1){if((g|0)>=8){f=h;break b}f=a[e+g>>0]|0;d=f&255;if((f+-65&255)>=6)if((f+-97&255)>=6)if((f+-48&255)<10)f=-48;else{f=h;break b}else f=-87;else f=-55;d=f+d|0;h=d+(h<<4)|0;g=g+1|0}}else{f=0;g=1;while(1){if((g|0)>=8)break b;h=a[e+g>>0]|0;d=h&255;if((h+-48&255)>=10)break b;f=(f*10|0)+-48+d|0;g=g+1|0}}while(0);d=(d|0)==59;e=d?e+(g+1)|0:e;d=d?f:0}while(0);c[b>>2]=e;l=i;return d|0}function cQ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+1056|0;i=n;k=n+8|0;c[i>>2]=b;hA(k,1024,n+24|0);j=k+8|0;m=k+4|0;while(1){c[i>>2]=b+1;d=a[b>>0]|0;if(!(d<<24>>24))break;b=d&255;if(d<<24>>24==38){b=bQ(i)|0;if(!b){b=38;e=c[j>>2]|0;h=7}else h=6}else h=6;do if((h|0)==6){h=0;e=c[j>>2]|0;if(b>>>0<127)h=7;else{d=c[m>>2]|0;e=d>>>0>=e>>>0;f=b>>>6;g=(b&63|128)&255;if(b>>>0<2047){if(e){iA(k,1)|0;b=c[m>>2]|0}else b=d;c[m>>2]=b+1;a[b>>0]=f|192;b=c[m>>2]|0;if(b>>>0>=(c[j>>2]|0)>>>0){iA(k,1)|0;b=c[m>>2]|0}c[m>>2]=b+1;a[b>>0]=g;break}if(e){iA(k,1)|0;d=c[m>>2]|0}c[m>>2]=d+1;a[d>>0]=b>>>12|224;b=c[m>>2]|0;if(b>>>0>=(c[j>>2]|0)>>>0){iA(k,1)|0;b=c[m>>2]|0}c[m>>2]=b+1;a[b>>0]=f&63|128;b=c[m>>2]|0;if(b>>>0>=(c[j>>2]|0)>>>0){iA(k,1)|0;b=c[m>>2]|0}c[m>>2]=b+1;a[b>>0]=g}}while(0);if((h|0)==7){d=c[m>>2]|0;if(d>>>0>=e>>>0){iA(k,1)|0;d=c[m>>2]|0}c[m>>2]=d+1;a[d>>0]=b}b=c[i>>2]|0}b=c[m>>2]|0;if(b>>>0>=(c[j>>2]|0)>>>0){iA(k,1)|0;b=c[m>>2]|0}a[b>>0]=0;j=c[k>>2]|0;c[m>>2]=j;m=Y3(j)|0;lA(k);l=n;return m|0}function dQ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+1040|0;h=j;hA(h,1024,j+16|0);i=h+4|0;g=h+8|0;while(1){d=b+1|0;e=a[b>>0]|0;f=c[g>>2]|0;if(!(e<<24>>24))break;if((e&255)<127){b=c[i>>2]|0;if(b>>>0>=f>>>0){iA(h,1)|0;b=c[i>>2]|0}c[i>>2]=b+1;a[b>>0]=e;b=d;continue}else{e=a[d>>0]&63|e<<6&255;d=c[i>>2]|0;if(d>>>0>=f>>>0){iA(h,1)|0;d=c[i>>2]|0}c[i>>2]=d+1;a[d>>0]=e;b=b+2|0;continue}}b=c[i>>2]|0;if(b>>>0>=f>>>0){iA(h,1)|0;b=c[i>>2]|0}a[b>>0]=0;g=c[h>>2]|0;c[i>>2]=g;i=Y3(g)|0;lA(h);l=j;return i|0}function eQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+80|0;e=n+48|0;d=n+32|0;f=n+64|0;g=n+16|0;i=n;j=b+16|0;k=a+16|0;m=c[k>>2]|0;if(((+h[j>>3]>=+h[m+48>>3]?+h[m+64>>3]>=+h[b>>3]:0)?+h[b+24>>3]>=+h[m+56>>3]:0)?+h[m+72>>3]>=+h[b+8>>3]:0){m=m+16|0;c[d>>2]=c[j>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];c[d+12>>2]=c[j+12>>2];c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];fQ(g,d,e);c[d>>2]=c[m>>2];c[d+4>>2]=c[m+4>>2];c[d+8>>2]=c[m+8>>2];c[d+12>>2]=c[m+12>>2];c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];BP(i,d,e);c[f>>2]=a;c[f+4>>2]=0;d=c[(c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]|0)+12>>2]|0;c[e>>2]=c[i>>2];c[e+4>>2]=c[i+4>>2];c[e+8>>2]=c[i+8>>2];c[e+12>>2]=c[i+12>>2];d=vb[d&127](f,e)|0}else d=0;l=n;return d|0}function fQ(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=(+h[b+8>>3]+ +h[c+8>>3])*.5;h[a>>3]=(+h[b>>3]+ +h[c>>3])*.5;h[a+8>>3]=d;return}function gQ(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,g=0,i=0.0,j=0,k=0,m=0,n=0;e=l;l=l+80|0;j=e+64|0;k=e+48|0;m=e;n=e+32|0;g=e+16|0;h[m>>3]=+h[a+24>>3]*.5;h[m+8>>3]=+h[a+32>>3]*.5;a=a+56|0;c[k>>2]=c[a>>2];c[k+4>>2]=c[a+4>>2];c[k+8>>2]=c[a+8>>2];c[k+12>>2]=c[a+12>>2];c[j>>2]=c[m>>2];c[j+4>>2]=c[m+4>>2];c[j+8>>2]=c[m+8>>2];c[j+12>>2]=c[m+12>>2];BP(n,k,j);i=+h[n>>3];f=+h[n+8>>3];c[k>>2]=c[a>>2];c[k+4>>2]=c[a+4>>2];c[k+8>>2]=c[a+8>>2];c[k+12>>2]=c[a+12>>2];c[j>>2]=c[m>>2];c[j+4>>2]=c[m+4>>2];c[j+8>>2]=c[m+8>>2];c[j+12>>2]=c[m+12>>2];CP(g,k,j);d=+h[g+8>>3];if((+h[b+16>>3]>=i?+h[g>>3]>=+h[b>>3]:0)?+h[b+24>>3]>=f:0)a=d>=+h[b+8>>3]&1;else a=0;l=e;return a|0}function hQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+80|0;k=n+48|0;j=n;h=a+16|0;a=c[h>>2]|0;i=c[a+8>>2]|0;a:do if((i|0)!=0?(g=i+8|0,c[j>>2]=c[g>>2],c[j+4>>2]=c[g+4>>2],c[j+8>>2]=c[g+8>>2],c[j+12>>2]=c[g+12>>2],c[j+16>>2]=c[g+16>>2],c[j+20>>2]=c[g+20>>2],c[j+24>>2]=c[g+24>>2],c[j+28>>2]=c[g+28>>2],c[k>>2]=c[b>>2],c[k+4>>2]=c[b+4>>2],c[k+8>>2]=c[b+8>>2],c[k+12>>2]=c[b+12>>2],c[k+16>>2]=c[b+16>>2],c[k+20>>2]=c[b+20>>2],c[k+24>>2]=c[b+24>>2],c[k+28>>2]=c[b+28>>2],(iQ(j,k)|0)!=0):0){d=i+4|0;a=0;while(1){if((a|0)>=(c[d>>2]|0))break;e=j;f=(c[i>>2]|0)+(a*48|0)|0;g=e+48|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(g|0));c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];c[k+16>>2]=c[b+16>>2];c[k+20>>2]=c[b+20>>2];c[k+24>>2]=c[b+24>>2];c[k+28>>2]=c[b+28>>2];if(!((jQ(j,k)|0)<<24>>24))a=a+1|0;else{a=1;break a}}a=c[h>>2]|0;m=7}else m=7;while(0);do if((m|0)==7){a=c[a+96>>2]|0;if(a|0?(c[k>>2]=c[b>>2],c[k+4>>2]=c[b+4>>2],c[k+8>>2]=c[b+8>>2],c[k+12>>2]=c[b+12>>2],c[k+16>>2]=c[b+16>>2],c[k+20>>2]=c[b+20>>2],c[k+24>>2]=c[b+24>>2],c[k+28>>2]=c[b+28>>2],(gQ(a,k)|0)<<24>>24):0){a=1;break}a=0}while(0);l=n;return a|0}function iQ(a,b){a=a|0;b=b|0;if((+h[a+16>>3]>=+h[b>>3]?+h[b+16>>3]>=+h[a>>3]:0)?+h[a+24>>3]>=+h[b+8>>3]:0)a=+h[b+24>>3]>=+h[a+8>>3];else a=0;return a&1|0}function jQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+96|0;k=n+64|0;j=n+48|0;i=n+32|0;f=n+16|0;g=n;m=a+4|0;d=c[m>>2]|0;if(!d)Aa(110238,107962,1637,110246);e=c[a>>2]|0;c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];e=1;while(1){if((e|0)>=(d|0)){h=7;break}d=(c[a>>2]|0)+(e<<4)|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];c[i>>2]=c[d>>2];c[i+4>>2]=c[d+4>>2];c[i+8>>2]=c[d+8>>2];c[i+12>>2]=c[d+12>>2];c[j>>2]=c[g>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[j+12>>2]=c[g+12>>2];c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];c[k+16>>2]=c[b+16>>2];c[k+20>>2]=c[b+20>>2];c[k+24>>2]=c[b+24>>2];c[k+28>>2]=c[b+28>>2];if((gK(i,j,k)|0)!=-1){d=1;break};c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];e=e+1|0;d=c[m>>2]|0}do if((h|0)==7){d=c[a+8>>2]|0;if(d|0?(g=a+16|0,h=c[a>>2]|0,c[i>>2]=c[g>>2],c[i+4>>2]=c[g+4>>2],c[i+8>>2]=c[g+8>>2],c[i+12>>2]=c[g+12>>2],c[j>>2]=c[h>>2],c[j+4>>2]=c[h+4>>2],c[j+8>>2]=c[h+8>>2],c[j+12>>2]=c[h+12>>2],c[k>>2]=c[b>>2],c[k+4>>2]=c[b+4>>2],c[k+8>>2]=c[b+8>>2],c[k+12>>2]=c[b+12>>2],c[k+16>>2]=c[b+16>>2],c[k+20>>2]=c[b+20>>2],c[k+24>>2]=c[b+24>>2],c[k+28>>2]=c[b+28>>2],(kQ(i,j,d,k)|0)<<24>>24):0){d=1;break}d=c[a+12>>2]|0;if(d|0?(h=a+32|0,m=(c[a>>2]|0)+((c[m>>2]|0)+-1<<4)|0,c[i>>2]=c[h>>2],c[i+4>>2]=c[h+4>>2],c[i+8>>2]=c[h+8>>2],c[i+12>>2]=c[h+12>>2],c[j>>2]=c[m>>2],c[j+4>>2]=c[m+4>>2],c[j+8>>2]=c[m+8>>2],c[j+12>>2]=c[m+12>>2],c[k>>2]=c[b>>2],c[k+4>>2]=c[b+4>>2],c[k+8>>2]=c[b+8>>2],c[k+12>>2]=c[b+12>>2],c[k+16>>2]=c[b+16>>2],c[k+20>>2]=c[b+20>>2],c[k+24>>2]=c[b+24>>2],c[k+28>>2]=c[b+28>>2],(kQ(i,j,d,k)|0)<<24>>24):0){d=1;break}d=0}while(0);l=n;return d|0}function kQ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0.0;m=l;l=l+160|0;g=m+144|0;f=m+128|0;n=m+96|0;i=m+64|0;j=m+32|0;k=m;o=+h[e+16>>3];c[f>>2]=c[a>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[f+12>>2]=c[a+12>>2];c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];WH(n,f,g,1.0,d);if(((o>=+h[n>>3]?(c[f>>2]=c[a>>2],c[f+4>>2]=c[a+4>>2],c[f+8>>2]=c[a+8>>2],c[f+12>>2]=c[a+12>>2],c[g>>2]=c[b>>2],c[g+4>>2]=c[b+4>>2],c[g+8>>2]=c[b+8>>2],c[g+12>>2]=c[b+12>>2],WH(i,f,g,1.0,d),+h[i+16>>3]>=+h[e>>3]):0)?(o=+h[e+24>>3],c[f>>2]=c[a>>2],c[f+4>>2]=c[a+4>>2],c[f+8>>2]=c[a+8>>2],c[f+12>>2]=c[a+12>>2],c[g>>2]=c[b>>2],c[g+4>>2]=c[b+4>>2],c[g+8>>2]=c[b+8>>2],c[g+12>>2]=c[b+12>>2],WH(j,f,g,1.0,d),o>=+h[j+8>>3]):0)?(c[f>>2]=c[a>>2],c[f+4>>2]=c[a+4>>2],c[f+8>>2]=c[a+8>>2],c[f+12>>2]=c[a+12>>2],c[g>>2]=c[b>>2],c[g+4>>2]=c[b+4>>2],c[g+8>>2]=c[b+8>>2],c[g+12>>2]=c[b+12>>2],WH(k,f,g,1.0,d),+h[k+24>>3]>=+h[e+8>>3]):0)f=1;else f=0;l=m;return f|0}function lQ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;a:do if((b|0)!=0?(e=a[b>>0]|0,e<<24>>24!=0):0){f=b+1|0;do switch(e<<24>>24|0){case 48:{d=2;break a}case 57:case 56:case 55:case 54:case 53:case 52:case 51:case 50:case 49:{d=10;break a}case 67:case 99:{if(!(C3(f,110261)|0)){d=4;break a}if(!(C3(f,110267)|0)){d=12;break a}break}case 70:case 102:{if(!(C3(f,110275)|0)){d=2;break a}break}case 76:case 108:{if(!(C3(f,110280)|0)){d=2;break a}break}case 78:case 110:{if(!(C3(f,110284)|0)){d=0;break a}if(!(C3(f,110288)|0)){d=2;break a}break}case 79:case 111:{if(!(C3(f,110290)|0)){d=8;break a}break}case 80:case 112:{if(!(C3(f,110295)|0)){d=6;break a}break}case 83:case 115:{if(!(C3(f,110303)|0)){d=10;break a}break}case 84:case 116:{if(!(C3(f,110309)|0)){d=10;break a}break}case 89:case 121:{if(!(C3(f,110313)|0)){d=10;break a}break}default:{}}while(0);c[g>>2]=b;dA(0,110316,g)|0}while(0);l=h;return d|0}function mQ(d,f){d=d|0;f=f|0;var g=0;g=NA(d,110357)|0;if(g)if(!(a[g>>0]|0))f=0;else f=lQ(g,f)|0;d=(c[d+16>>2]|0)+136|0;b[d>>1]=e[d>>1]|f;return}function nQ(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;var f=0.0,g=0.0,i=0.0,j=0,k=0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0;w=l;l=l+32|0;n=w+16|0;p=w;v=e&1;u=e&2;j=n+8|0;k=p+8|0;g=+h[a>>3];i=+h[a+8>>3];a:do if((c|0)==2){t=+h[a+16>>3]-g;q=+h[a+24>>3]-i;s=g-t;h[n>>3]=s;t=g+t;h[p>>3]=t;f=i-q;h[j>>3]=f;q=i+q;h[k>>3]=q;g=s}else{h[p>>3]=g;h[n>>3]=g;h[k>>3]=i;h[j>>3]=i;e=0;m=g;f=i;while(1){if((e|0)>=(c|0)){t=g;g=m;q=i;break a}x=a+(e<<4)|0;s=+h[x>>3];q=+h[(s>3];h[n>>3]=q;t=+h[a+(e<<4)+8>>3];r=+h[(t>3];h[j>>3]=r;s=+h[(s>g?x:p)>>3];h[p>>3]=s;t=+h[(t>i?x:p)+8>>3];h[k>>3]=t;e=e+1|0;m=q;f=r;g=s;i=t}}while(0);s=g+(t-g)*.5;r=f+(q-f)*.5;e=(u|0)!=0;o=-r;j=b+8|0;a=b+24|0;m=r-f;k=b+16|0;if(!v){i=d;g=+J(+i);i=+I(+i);f=(q-r)*g;if(e){h[j>>3]=r-f;f=r+f}else{h[j>>3]=f-r;f=o-m*g}h[a>>3]=f;d=(t-s)*i;h[b>>3]=s-d;h[k>>3]=s+d}else{d=s-g;d=+G(+(d*d+m*m));h[j>>3]=e?r:o;h[b>>3]=s;h[k>>3]=d*.25;h[a>>3]=d}l=w;return}function oQ(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0.0;f=b<<24>>24==0;b=c[a+16>>2]|0;d=+h[b+32>>3]*72.0;e=+h[b+40>>3]*72.0;g=(f?d:e)*.5;h[b+96>>3]=g;h[b+88>>3]=g;h[b+80>>3]=f?e:d;return}function pQ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;y=l;l=l+16|0;j=y+8|0;x=4;w=k6(40)|0;c[w>>2]=0;s=y;o=0;e=la(29,b|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;a:do if((g|0)!=1){o=0;v=la(23,e<<3|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){e=A6(c[f>>2]|0,w|0,x|0)|0;if(!e)Ca(f|0,p|0);D=p}else e=-1;if((e|0)!=1){if(!(a[195236]|0))t=0;else{o=0;e=ea(3)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){n=0;k=0;m=0;j=0;i=0;d=v;h=v;e=D;g=0;u=74;break}t=e}o=0;e=ra(97,b|0,110365)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)!=1){c[47394]=0;b:do if(e|0?(i=a[e>>0]|0,i<<24>>24):0){h=e;f=i;g=0;while(1){i=h+1|0;if(!(f<<24>>24))break b;switch(f<<24>>24|0){case 99:{e=8;u=15;break}case 105:{e=18;u=15;break}case 109:{e=1;u=15;break}case 114:{e=4;u=15;break}case 115:{e=2;u=15;break}default:e=g}if((u|0)==15){u=0;e=g|e;c[47394]=e}h=i;f=a[i>>0]|0;g=e}}while(0);if(d|0){o=0;aa(23,0,110369,j|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){n=0;k=t;m=0;j=0;i=0;d=v;h=v;e=D;g=0;u=74;break}}o=0;r=ra(98,b|0,0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){m=c[r+16>>2]|0;if(c[47394]&2|0){o=0;ha(26,c[15715]|0,m|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){n=0;k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break}}o=0;g=la(25,b|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){n=0;while(1){if(!g)break;o=0;e=ra(99,b|0,g|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){h=A6(c[f>>2]|0,w|0,x|0)|0;if(!h)Ca(f|0,p|0);D=p}else h=-1;if((h|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}i=n;while(1){if(!e)break;if(!((c[47180]|0)==2?(c[(c[e+16>>2]|0)+8>>2]|0)!=0:0))u=32;c:do if((u|0)==32){u=0;do if(a[195236]|0){k=c[e>>2]&3;j=(c[c[((k|0)==3?e:e+48|0)+40>>2]>>2]|0)>>>4;k=(c[c[((k|0)==2?e:e+-48|0)+40>>2]>>2]|0)>>>4;if(j>>>0>k>>>0){o=0;f=aa(37,t|0,k|0,j|0)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){d=A6(c[h>>2]|0,w|0,x|0)|0;if(!d)Ca(h|0,p|0);D=p}else d=-1;if((d|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}if(f|0)break c;o=0;na(64,t|0,k|0,j|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){h=A6(c[f>>2]|0,w|0,x|0)|0;if(!h)Ca(f|0,p|0);D=p}else h=-1;if((h|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}break}else{o=0;f=aa(37,t|0,j|0,k|0)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){d=A6(c[h>>2]|0,w|0,x|0)|0;if(!d)Ca(h|0,p|0);D=p}else d=-1;if((d|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}if(f|0)break c;o=0;na(64,t|0,j|0,k|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){h=A6(c[f>>2]|0,w|0,x|0)|0;if(!h)Ca(f|0,p|0);D=p}else h=-1;if((h|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}break}}while(0);c[v+(i<<3)+4>>2]=e;o=0;d=la(30,e|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){h=A6(c[f>>2]|0,w|0,x|0)|0;if(!h)Ca(f|0,p|0);D=p}else h=-1;if((h|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}c[v+(i<<3)>>2]=d;i=i+1|0}while(0);o=0;e=ra(100,b|0,e|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){h=A6(c[f>>2]|0,w|0,x|0)|0;if(!h)Ca(f|0,p|0);D=p}else h=-1;if((h|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}}o=0;g=ra(86,b|0,g|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}n=i}o=0;j=la(31,n<<3|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){o=0;ta(28,v|0,n|0,8,101);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){g=c[m>>2]|0;o=0;$(110,g+2|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){i=c[m+16>>2]|0;d=i+(g*40|0)|0;i=i+((g+1|0)*40|0)|0;q=c[15715]|0;h=0;while(1){if((h|0)>=(n|0))break;if((h|0)>0?c[47394]&16|0:0){o=0;ha(26,q|0,m|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}}e=c[v+(h<<3)+4>>2]|0;k=c[e>>2]&3;g=c[(c[(c[((k|0)==3?e:e+48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0;e=c[(c[(c[((k|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0;if((g|0)==(e|0)){o=0;ta(29,m|0,g|0,i|0,d|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}}else{o=0;na(65,m|0,e|0,i|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}o=0;na(65,m|0,g|0,d|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}}o=0;e=aa(38,m|0,i|0,d|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}if(e|0){k=t;m=j;i=r;d=v;h=v;break a}e=j+(h<<3)|0;o=0;ta(30,s|0,m|0,d|0,i|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}g=s;k=c[g+4>>2]|0;c[e>>2]=c[g>>2];c[e+4>>2]=k;o=0;$(111,m|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}h=h+1|0}o=0;oa(8);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){o=0;e=la(32,r|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)!=1){c[r+20>>2]=e;o=0;e=la(33,r|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)!=1){c[r+24>>2]=e;o=0;na(66,n|0,j|0,r|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){w=x6(189580,1,w|0,x|0)|0;x=D;o=0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){k=t;m=j;i=r;d=v;h=v;e=0;g=q;u=74}else{k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74}}else{k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74}}else{k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74}}else{k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74}}else{k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74}}else{k=t;m=j;i=r;d=v;h=v;e=D;g=0;u=74}}else{k=t;m=j;i=r;d=v;h=v;e=D;g=0;u=74}}else{k=t;m=0;i=r;d=v;h=v;e=D;g=0;u=74}}else{n=0;k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74}}else{n=0;k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74}}else{n=0;k=t;m=0;j=0;i=0;d=v;h=v;e=D;g=0;u=74}}else{n=0;k=0;m=0;j=0;i=0;d=0;h=v;e=D;g=0;u=74}}else{n=0;k=0;m=0;j=0;i=0;d=0;h=0;e=D;g=0;u=74}while(0);d:while(1){if((u|0)==74){u=0;if(e|0){q=g;continue}o=0;$(112,i|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){z=g;f=h;q=d;r=i;s=j;t=m;v=k;u=n;e=D;g=z;h=f;d=q;i=r;j=s;m=t;k=v;n=u;u=74;continue}if(c[47394]&4|0){o=0;ba(17,g|0,i|0,n|0,m|0,d|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){f=g;q=h;r=d;s=i;t=j;v=m;z=k;u=n;e=D;g=f;h=q;d=r;i=s;j=t;m=v;k=z;n=u;u=74;continue}}o=0;qa(10,b|0,i|0,n|0,m|0,d|0,0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){f=g;q=h;r=d;s=i;t=j;v=m;z=k;u=n;e=D;g=f;h=q;d=r;i=s;j=t;m=v;k=z;n=u;u=74;continue}q=g}if(!(a[195236]|0))e=0;else{o=0;$(113,k|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;g=q;u=74;continue}e=0}while(1){if((e|0)>=(n|0))break;o=0;$(105,c[m+(e<<3)+4>>2]|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;g=q;u=74;continue d}e=e+1|0}o=0;$(105,j|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;g=q;u=74;continue}o=0;$(114,i|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;g=q;u=74;continue}o=0;$(105,h|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;g=q;u=74}else break}l6(w|0);l=y;return}function qQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0;q=l;l=l+64|0;p=q+32|0;o=q+16|0;j=q;k=q+48|0;Z3(111236,a)|0;Z3(111247,a)|0;m=b+16|0;n=j+8|0;i=k+4|0;g=0;while(1){if((g|0)>=(c[b>>2]|0))break;d=c[m>>2]|0;e=c[d+(g*40|0)+20>>2]|0;f=c[d+(g*40|0)+24>>2]|0;if((e|0)==(f|0)){jR(j,e);d=~~+h[j>>3];e=~~+h[n>>3]}else{lR(k,(c[e>>2]&1|0)==0?e:f,d+(g*40|0)|0);d=c[k>>2]|0;e=c[i>>2]|0}c[o>>2]=g;c[o+4>>2]=d;c[o+8>>2]=e;z4(a,111267,o)|0;g=g+1|0}f=b+4|0;e=b+20|0;d=0;while(1){if((d|0)>=(c[f>>2]|0))break;o=c[e>>2]|0;b=c[o+(d*24|0)+16>>2]|0;r=+h[o+(d*24|0)>>3];c[p>>2]=c[o+(d*24|0)+12>>2];c[p+4>>2]=b;h[p+8>>3]=r;z4(a,111287,p)|0;d=d+1|0}Z3(111309,a)|0;l=q;return}function rQ(a){a=a|0;var b=0.0,d=0.0,e=0,f=0;f=c[a>>2]&3;e=c[(c[((f|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0;a=c[(c[((f|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0;d=+h[e+16>>3]-+h[a+16>>3];b=+h[e+24>>3]-+h[a+24>>3];return ~~(d*d+b*b)|0}function sQ(a,b){a=a|0;b=b|0;return (c[a>>2]|0)-(c[b>>2]|0)|0}function tQ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;j=n;jR(n+16|0,d);k=d+32|0;m=d+36|0;g=0;while(1){if((g|0)>=(c[k>>2]|0))break;h=c[(c[m>>2]|0)+(g<<2)>>2]|0;do if(!(a[h+36>>0]|0)){i=c[h+20>>2]|0;if((i|0)==(d|0)){hR(j,h,c[h+24>>2]|0);CR(b,f,h,0.0)|0;break}else{hR(j,h,i);CR(b,e,h,0.0)|0;break}}while(0);g=g+1|0}c[b>>2]=(c[b>>2]|0)+2;l=n;return}function uQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+32|0;h=k;jR(k+16|0,b);i=b+32|0;j=b+36|0;f=0;while(1){if((f|0)>=(c[i>>2]|0))break;g=c[(c[j>>2]|0)+(f<<2)>>2]|0;e=c[g+20>>2]|0;if((e|0)==(b|0))e=c[g+24>>2]|0;hR(h,g,e);CR(a,d,g,0.0)|0;f=f+1|0}c[a>>2]=(c[a>>2]|0)+1;c[d+24>>2]=b;c[d+20>>2]=b;l=k;return}function vQ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;K=l;l=l+128|0;F=K+64|0;n=K+48|0;G=K+32|0;H=K+16|0;I=K;g=0;i=e;while(1){if(!i)break;g=g+1|0;i=c[i+8>>2]|0}E=HK((g*56|0)+-112|0)|0;c[F+52>>2]=0;c[F+48>>2]=0;D=e+8|0;e=c[D>>2]|0;i=c[e+8>>2]|0;g=c[e+20>>2]|0;if(c[g>>2]&1)g=c[e+24>>2]|0;hR(n,e,g);j=e;o=e;q=0.0;p=+h[n>>3];C=0;m=0.0;A=+h[n+8>>3];while(1){B=i+8|0;if(!(c[B>>2]|0))break;y=iR(j,i)|0;aV(d,y,c[o+12>>2]|0);w=o+36|0;x=i+36|0;if((a[w>>0]|0)==(a[x>>0]|0))if((c[B>>2]|0)==(f|0)){hR(H,i,y);e=H;J=12}else{n=o;e=C;k=A}else{jR(G,y);e=G;J=12}if((J|0)==12){J=0;z=+h[e>>3];k=+h[e+8>>3];n=a[w>>0]|0;t=n<<24>>24!=0;e=(o|0)==(c[D>>2]|0);j=g+40|0;v=y+48|0;s=i+20|0;r=g+48|0;u=y+40|0;if(t){g=e?0:m>A?1:3;if(n<<24>>24==(a[x>>0]|0)){n=u;o=j;j=r;e=0}else{n=u;o=j;j=r;e=(c[s>>2]|0)==(y|0)?1:3}}else{g=e?0:q>p?4:2;if(!(a[x>>0]|0)){n=v;o=r;e=0}else{n=v;o=r;e=(c[s>>2]|0)==(y|0)?4:2}}kR(F,(t^1)&1,+h[j>>3],+h[o>>3],+h[n>>3],g,e);e=C+1|0;g=E+(C*56|0)|0;n=F;o=g+56|0;do{c[g>>2]=c[n>>2];g=g+4|0;n=n+4|0}while((g|0)<(o|0));if((a[w>>0]|0)!=(a[x>>0]|0)?(c[B>>2]|0)==(f|0):0){hR(I,i,y);j=(a[x>>0]|0)!=0;q=+h[(j?u:v)>>3];kR(F,(j^1)&1,+h[(j?v:u)>>3],q,q,j?(A>k?1:3):p>z?4:2,0);j=C+2|0;g=E+(e*56|0)|0;n=F;o=g+56|0;do{c[g>>2]=c[n>>2];g=g+4|0;n=n+4|0}while((g|0)<(o|0));g=y;n=i;q=p;p=z;e=j;m=A}else{g=y;n=i;q=p;p=z;m=A}}j=i;i=c[B>>2]|0;o=n;C=e;A=k}i=n6(E,C*56|0)|0;e=C+-1|0;g=0;while(1){if((g|0)>=(C|0))break;if((g|0)>0)c[i+(g*56|0)+48>>2]=i+((g+-1|0)*56|0);j=g+1|0;if((g|0)>=(e|0)){g=j;continue}c[i+(g*56|0)+52>>2]=i+(j*56|0);g=j}c[b>>2]=C;c[b+4>>2]=i;l=K;return}function wQ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0;j=Sz(25740,c[4591]|0)|0;k=a+8|0;i=0;while(1){if((i|0)>=(c[a>>2]|0))break;b=(c[k>>2]|0)+(i*72|0)|0;if(!(c[b>>2]&4)){while(1){d=c[(c[b+36>>2]|0)+8>>2]|0;if(!d)break;d=c[d+20>>2]|0;if(!d)break;if(!(c[d>>2]&1))b=d;else break}g=HK(40)|0;c[g+36>>2]=b;h[g+8>>3]=+h[b+40>>3];f=b;d=c[b>>2]|0;while(1){c[f>>2]=d|4;d=c[c[f+36>>2]>>2]|0;if(!d)break;e=c[d+24>>2]|0;if(!e)break;d=c[e>>2]|0;if(d&1|0)break;else f=e}h[g+16>>3]=+h[f+56>>3];cR(j,g,+h[b+48>>3])}i=i+1|0}return j|0}function xQ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0;j=Sz(25740,c[4591]|0)|0;k=a+8|0;i=0;while(1){if((i|0)>=(c[a>>2]|0))break;b=(c[k>>2]|0)+(i*72|0)|0;if(!(c[b>>2]&2)){while(1){d=c[(c[b+36>>2]|0)+12>>2]|0;if(!d)break;d=c[d+20>>2]|0;if(!d)break;if(!(c[d>>2]&1))b=d;else break}g=HK(40)|0;c[g+36>>2]=b;h[g+8>>3]=+h[b+48>>3];f=b;d=c[b>>2]|0;while(1){c[f>>2]=d|2;d=c[(c[f+36>>2]|0)+4>>2]|0;if(!d)break;e=c[d+24>>2]|0;if(!e)break;d=c[e>>2]|0;if(d&1|0)break;else f=e}h[g+16>>3]=+h[f+64>>3];cR(j,g,+h[b+40>>3])}i=i+1|0}return j|0}function yQ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=e+20|0;i=e+24|0;e=0;while(1){if((e|0)>=(b|0))break;g=c[d+(e<<3)>>2]|0;h=c[d+(e<<3)+4>>2]|0;f=0;while(1){if((f|0)>=(g|0))break;k=h+(f*56|0)|0;bR(HQ(c[((a[k>>0]|0)==0?j:i)>>2]|0,k)|0,k);f=f+1|0}e=e+1|0}return}function zQ(a){a=a|0;var b=0,d=0;d=a+20|0;JQ(c[d>>2]|0);b=a+24|0;JQ(c[b>>2]|0);KQ(c[d>>2]|0);KQ(c[b>>2]|0);LQ(c[d>>2]|0,a);LQ(c[b>>2]|0,a);MQ(c[d>>2]|0);MQ(c[b>>2]|0);return}function AQ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0,E=0.0;z=l;l=l+224|0;n=z+176|0;m=z+208|0;x=z+160|0;y=z+128|0;k=z+96|0;t=z+64|0;u=z+32|0;o=z;v=u+8|0;h[v>>3]=1797693134862315708145274.0e284;h[u>>3]=1797693134862315708145274.0e284;w=u+24|0;h[w>>3]=-1797693134862315708145274.0e284;p=u+16|0;h[p>>3]=-1797693134862315708145274.0e284;Z3(110484,a)|0;c[n>>2]=10;c[n+4>>2]=10;z4(a,110890,n)|0;Z3(138568,a)|0;i=b+4|0;q=t+16|0;r=t+8|0;s=t+24|0;j=b+12|0;g=0;while(1){if((g|0)>=(c[i>>2]|0))break;D=(c[j>>2]|0)+(g*72|0)+40|0;c[t>>2]=c[D>>2];c[t+4>>2]=c[D+4>>2];c[t+8>>2]=c[D+8>>2];c[t+12>>2]=c[D+12>>2];c[t+16>>2]=c[D+16>>2];c[t+20>>2]=c[D+20>>2];c[t+24>>2]=c[D+24>>2];c[t+28>>2]=c[D+28>>2];C=+h[r>>3];B=+h[q>>3];A=+h[s>>3];h[k>>3]=+h[t>>3];h[k+8>>3]=C;h[k+16>>3]=B;h[k+24>>3]=A;z4(a,138587,k)|0;g=g+1|0}g=0;while(1){if((g|0)>=(d|0))break;D=c[f+(g<<3)+4>>2]|0;k=e+(g<<3)|0;c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[n>>2]=c[u>>2];c[n+4>>2]=c[u+4>>2];c[n+8>>2]=c[u+8>>2];c[n+12>>2]=c[u+12>>2];c[n+16>>2]=c[u+16>>2];c[n+20>>2]=c[u+20>>2];c[n+24>>2]=c[u+24>>2];c[n+28>>2]=c[u+28>>2];IQ(o,a,D,m,b,n);c[u>>2]=c[o>>2];c[u+4>>2]=c[o+4>>2];c[u+8>>2]=c[o+8>>2];c[u+12>>2]=c[o+12>>2];c[u+16>>2]=c[o+16>>2];c[u+20>>2]=c[o+20>>2];c[u+24>>2]=c[o+24>>2];c[u+28>>2]=c[o+28>>2];g=g+1|0}Z3(110907,a)|0;i=b+8|0;g=0;while(1){if((g|0)>=(c[b>>2]|0))break;D=(c[i>>2]|0)+(g*72|0)+40|0;c[t>>2]=c[D>>2];c[t+4>>2]=c[D+4>>2];c[t+8>>2]=c[D+8>>2];c[t+12>>2]=c[D+12>>2];c[t+16>>2]=c[D+16>>2];c[t+20>>2]=c[D+20>>2];c[t+24>>2]=c[D+24>>2];c[t+28>>2]=c[D+28>>2];E=+h[t>>3];A=+h[r>>3];B=+h[q>>3];C=+h[s>>3];h[y>>3]=E;h[y+8>>3]=A;h[y+16>>3]=B;h[y+24>>3]=C;z4(a,138624,y)|0;h[u>>3]=+h[(+h[u>>3]>3];h[v>>3]=+h[(+h[v>>3]>3];h[p>>3]=+h[(+h[p>>3]>B?u:t)+16>>3];h[w>>3]=+h[(+h[w>>3]>C?u:t)+24>>3];g=g+1|0}v=~~(+h[v>>3]+10.0);y=~~(+h[p>>3]+10.0);D=~~(+h[w>>3]+10.0);c[x>>2]=~~(+h[u>>3]+10.0);c[x+4>>2]=v;c[x+8>>2]=y;c[x+12>>2]=D;z4(a,110932,x)|0;l=z;return}function BQ(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;Q=l;l=l+112|0;I=Q+88|0;H=Q+72|0;P=Q+32|0;L=Q+16|0;M=Q;N=Q+56|0;O=Q+40|0;J=c[15715]|0;z=(j|0)==0;A=M+8|0;B=L+8|0;y=0;k=0;m=0;p=0;j=0;while(1){if((y|0)>=(f|0))break;C=c[i+(y<<3)+4>>2]|0;D=C+48|0;x=(c[(c[((c[C>>2]&3|0)==3?C:D)+40>>2]|0)+16>>2]|0)+16|0;E=C+16|0;F=(c[E>>2]|0)+16|0;c[H>>2]=c[x>>2];c[H+4>>2]=c[x+4>>2];c[H+8>>2]=c[x+8>>2];c[H+12>>2]=c[x+12>>2];c[I>>2]=c[F>>2];c[I+4>>2]=c[F+4>>2];c[I+8>>2]=c[F+8>>2];c[I+12>>2]=c[F+12>>2];CQ(N,H,I);c[L>>2]=c[N>>2];c[L+4>>2]=c[N+4>>2];c[L+8>>2]=c[N+8>>2];c[L+12>>2]=c[N+12>>2];F=C+-48|0;x=(c[(c[((c[C>>2]&3|0)==2?C:F)+40>>2]|0)+16>>2]|0)+16|0;w=(c[E>>2]|0)+56|0;c[H>>2]=c[x>>2];c[H+4>>2]=c[x+4>>2];c[H+8>>2]=c[x+8>>2];c[H+12>>2]=c[x+12>>2];c[I>>2]=c[w>>2];c[I+4>>2]=c[w+4>>2];c[I+8>>2]=c[w+8>>2];c[I+12>>2]=c[w+12>>2];CQ(O,H,I);c[M>>2]=c[O>>2];c[M+4>>2]=c[O+4>>2];c[M+8>>2]=c[O+8>>2];c[M+12>>2]=c[O+12>>2];w=c[g+(y<<3)>>2]|0;x=c[g+(y<<3)+4>>2]|0;v=w*3|0;G=v+1|0;if((v|0)>=(m|0)){if(k|0)l6(j);p=IK(G<<4)|0;k=p;m=G;j=p}if(!(a[x>>0]|0)){o=+(EQ(x,e)|0);n=+h[L>>3]}else{n=+DQ(x,e);o=+h[B>>3]}s=k+16|0;h[k+16>>3]=n;h[k+24>>3]=o;c[p>>2]=c[s>>2];c[p+4>>2]=c[s+4>>2];c[p+8>>2]=c[s+8>>2];c[p+12>>2]=c[s+12>>2];s=1;q=x;t=2;while(1){r=t+1|0;u=k+(r<<4)|0;v=k+(t<<4)|0;if((s|0)>=(w|0))break;q=x+(s*56|0)|0;if(!(a[q>>0]|0))o=+(EQ(q,e)|0);else n=+DQ(q,e);r=k+(t+2<<4)|0;h[v>>3]=n;h[k+(t<<4)+8>>3]=o;c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];c[r>>2]=c[v>>2];c[r+4>>2]=c[v+4>>2];c[r+8>>2]=c[v+8>>2];c[r+12>>2]=c[v+12>>2];s=s+1|0;t=t+3|0}if(!(a[q>>0]|0)){o=+(EQ(q,e)|0);n=+h[M>>3]}else{n=+DQ(q,e);o=+h[A>>3]}h[u>>3]=n;h[k+(r<<4)+8>>3]=o;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];if((d[195234]|0)>1){x=HB(c[((c[C>>2]&3|0)==3?C:D)+40>>2]|0)|0;D=HB(c[((c[C>>2]&3|0)==2?C:F)+40>>2]|0)|0;c[P>>2]=x;c[P+4>>2]=D;z4(J,110443,P)|0}bO(C,c[((c[C>>2]&3|0)==2?C:F)+40>>2]|0,k,G,25728);if((!z?(K=c[(c[E>>2]|0)+96>>2]|0,K|0):0)?(a[K+81>>0]|0)==0:0){c[H>>2]=c[L>>2];c[H+4>>2]=c[L+4>>2];c[H+8>>2]=c[L+8>>2];c[H+12>>2]=c[L+12>>2];c[I>>2]=c[M>>2];c[I+4>>2]=c[M+4>>2];c[I+8>>2]=c[M+8>>2];c[I+12>>2]=c[M+12>>2];wO(b,C,H,I)}y=y+1|0}l6(j);l=Q;return}function CQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;h[b>>3]=+h[d>>3]+ +h[b>>3];e=b+8|0;h[e>>3]=+h[d+8>>3]+ +h[e>>3];c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function DQ(a,b){a=a|0;b=b|0;var d=0.0,e=0;e=HQ(c[b+24>>2]|0,a)|0;b=c[e+36>>2]|0;d=+h[b+40>>3];return +(d+ +(c[a+44>>2]|0)/+((c[e+24>>2]|0)+1|0)*(+h[b+56>>3]-d))}function EQ(a,b){a=a|0;b=b|0;var d=0.0,e=0;e=HQ(c[b+20>>2]|0,a)|0;b=c[e+36>>2]|0;d=+h[b+48>>3];return ~~(d+(1.0-+(c[a+44>>2]|0)/+((c[e+24>>2]|0)+1|0))*(+h[b+64>>3]-d))|0}function FQ(a){a=a|0;return 0}function GQ(a){a=a|0;return 0}function HQ(a,b){a=a|0;b=b|0;a=eb[c[a>>2]&63](a,b+8|0,512)|0;if(!a)Aa(110456,110462,423,110470);a=c[a+16>>2]|0;a=eb[c[a>>2]&63](a,b+16|0,512)|0;if(!a)Aa(110481,110462,425,110470);else return a|0;return 0}function IQ(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0.0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0;z=l;l=l+32|0;y=z+16|0;u=z+8|0;m=z;j=c[(c[(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0;t=c[f+4>>2]|0;if(!(a[t>>0]|0)){s=+h[j+56>>3];k=+h[j+40>>3];j=EQ(t,g)|0;k=(s+k)*.5}else{s=+h[j+64>>3];k=+h[j+48>>3];j=~~((s+k)*.5);k=+DQ(t,g)}A=~~k;p=+h[i>>3];r=+(A|0);p=p>3]=p;v=i+8|0;q=+h[v>>3];s=+(j|0);q=q>3]=q;w=i+16|0;k=+h[w>>3];r=k>r?k:r;h[w>>3]=r;x=i+24|0;k=+h[x>>3];s=k>s?k:s;h[x>>3]=s;c[m>>2]=A;c[m+4>>2]=j;z4(d,110983,m)|0;o=c[f>>2]|0;m=t;n=1;f=A;while(1){if((n|0)>=(o|0))break;m=t+(n*56|0)|0;if(!(a[m>>0]|0))j=EQ(m,g)|0;else f=~~+DQ(m,g);B=+(f|0);D=p>3]=D;k=+(j|0);C=q>3]=C;B=r>B?r:B;h[w>>3]=B;k=s>k?s:k;h[x>>3]=k;c[u>>2]=f;c[u+4>>2]=j;z4(d,111005,u)|0;n=n+1|0;p=D;q=C;r=B;s=k}j=c[(c[(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0;if(!(a[m>>0]|0)){D=+h[j+56>>3];k=+h[j+40>>3];j=EQ(m,g)|0;k=(D+k)*.5}else{D=+h[j+64>>3];k=+h[j+48>>3];j=~~((D+k)*.5);k=+DQ(m,g)}A=~~k;C=+(A|0);h[i>>3]=p>3]=q>3]=r>C?r:C;h[x>>3]=s>D?s:D;c[y>>2]=A;c[y+4>>2]=j;z4(d,111019,y)|0;c[b>>2]=c[i>>2];c[b+4>>2]=c[i+4>>2];c[b+8>>2]=c[i+8>>2];c[b+12>>2]=c[i+12>>2];c[b+16>>2]=c[i+16>>2];c[b+20>>2]=c[i+20>>2];c[b+24>>2]=c[i+24>>2];c[b+28>>2]=c[i+28>>2];l=z;return}function JQ(a){a=a|0;var b=0;a=Qz(a)|0;while(1){if(!a)break;b=Qz(c[a+16>>2]|0)|0;while(1){if(!b)break;c[b+32>>2]=mR(c[b+24>>2]|0)|0;b=c[b>>2]|0}a=c[a>>2]|0}return}function KQ(a){a=a|0;var b=0;a=Qz(a)|0;while(1){if(!a)break;b=Qz(c[a+16>>2]|0)|0;while(1){if(!b)break;if(c[b+24>>2]|0)aR(b);b=c[b>>2]|0}a=c[a>>2]|0}return}function LQ(a,b){a=a|0;b=b|0;var d=0;d=Qz(a)|0;while(1){if(!d)break;a=Qz(c[d+16>>2]|0)|0;while(1){if(!a)break;QQ(a,b);a=c[a>>2]|0}d=c[d>>2]|0}return}function MQ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0;e=Qz(a)|0;while(1){if(!e)break;i=e+8|0;f=Qz(c[e+16>>2]|0)|0;while(1){if(!f)break;a=f+24|0;a:do if(c[a>>2]|0){if(c[47394]&8|0)NQ(f,~~+h[i>>3]);g=f+32|0;rR(c[g>>2]|0);b=c[a>>2]|0;d=f+28|0;a=0;while(1){if((a|0)>=(b|0))break a;c[(c[(c[d>>2]|0)+(a<<2)>>2]|0)+44>>2]=(c[(c[(c[g>>2]|0)+4>>2]|0)+(a*12|0)+4>>2]|0)+1;a=a+1|0}}while(0);f=c[f>>2]|0}e=c[e>>2]|0}return}function NQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0.0,m=0.0;j=l;l=l+32|0;d=j;g=a+24|0;a:do if((c[g>>2]|0)>=2){i=c[15715]|0;m=+h[a+8>>3];k=+h[a+16>>3];c[d>>2]=b;h[d+8>>3]=m;h[d+16>>3]=k;z4(i,111040,d)|0;f=a+32|0;a=a+28|0;b=0;while(1){if((b|0)>=(c[g>>2]|0))break a;e=c[(c[(c[f>>2]|0)+4>>2]|0)+(b*12|0)+8>>2]|0;b:do if(Uz(e)|0){OQ(i,c[(c[a>>2]|0)+(b<<2)>>2]|0);Z3(111060,i)|0;d=eb[c[e>>2]&63](e,0,128)|0;while(1){if(!d)break b;Z3(111065,i)|0;OQ(i,c[(c[a>>2]|0)+(c[d>>2]<<2)>>2]|0);Z3(153748,i)|0;d=eb[c[e>>2]&63](e,d,8)|0}}while(0);b=b+1|0}}while(0);l=j;return}function OQ(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0.0,j=0,k=0,m=0,n=0;m=l;l=l+80|0;k=m+40|0;j=m;n=(a[d>>0]|0)==0;i=+h[d+8>>3];e=+h[d+24>>3];f=+h[d+16>>3];g=PQ(c[d+32>>2]|0)|0;d=PQ(c[d+36>>2]|0)|0;if(n){h[k>>3]=f;h[k+8>>3]=i;h[k+16>>3]=e;h[k+24>>3]=i;c[k+32>>2]=g;c[k+36>>2]=d;z4(b,111071,k)|0}else{h[j>>3]=i;h[j+8>>3]=f;h[j+16>>3]=i;h[j+24>>3]=e;c[j+32>>2]=g;c[j+36>>2]=d;z4(b,111071,j)|0}l=m;return}function PQ(a){a=a|0;switch(a|0){case 0:{a=111122;break}case 1:{a=111117;break}case 2:{a=111110;break}case 3:{a=111103;break}case 4:{a=111095;break}default:a=0}return a|0}function QQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+16|0;r=w+8|0;t=w;u=c[a+32>>2]|0;v=c[a+28>>2]|0;p=a+24|0;m=r+4|0;n=t+4|0;j=0;a=c[p>>2]|0;a:while(1){q=j+1|0;if((q|0)>=(a|0))break;o=v+(j<<2)|0;k=q;while(1){if((k|0)>=(a|0)){j=q;continue a}b:do if(((qR(u,j,k)|0)==0?(qR(u,k,j)|0)==0:0)?(s=v+(k<<2)|0,RQ(c[o>>2]|0,c[s>>2]|0)|0):0){f=c[o>>2]|0;a=c[f+48>>2]|0;i=c[s>>2]|0;d=c[i+48>>2]|0;e=(d|0)==0;if(a)if(e)a=1;else a=+h[a+8>>3]!=+h[d+8>>3];else a=e^1;g=a&1;SQ(r,f,i,0,g);a=c[r>>2]|0;i=c[m>>2]|0;f=g^1;SQ(t,c[o>>2]|0,c[s>>2]|0,1,f);d=c[t>>2]|0;e=c[n>>2]|0;switch(i|0){case -1:{TQ(c[s>>2]|0,c[o>>2]|0,g,0,a,b);TQ(c[s>>2]|0,c[o>>2]|0,f,1,d,b);if((e|0)!=1)break b;UQ(c[o>>2]|0,c[s>>2]|0,f,b);break b}case 0:switch(e|0){case -1:{TQ(c[s>>2]|0,c[o>>2]|0,g,0,a,b);TQ(c[s>>2]|0,c[o>>2]|0,f,1,d,b);break b}case 0:{TQ(c[o>>2]|0,c[s>>2]|0,0,g,a,b);TQ(c[o>>2]|0,c[s>>2]|0,1,f,d,b);break b}case 1:{TQ(c[o>>2]|0,c[s>>2]|0,0,g,a,b);TQ(c[o>>2]|0,c[s>>2]|0,1,f,d,b);break b}default:break b}case 1:{TQ(c[o>>2]|0,c[s>>2]|0,0,g,a,b);TQ(c[o>>2]|0,c[s>>2]|0,1,f,d,b);if((e|0)!=-1)break b;UQ(c[o>>2]|0,c[s>>2]|0,f,b);break b}default:break b}}while(0);k=k+1|0;a=c[p>>2]|0}}l=w;return}function RQ(a,b){a=a|0;b=b|0;if(!(+h[a+8>>3]==+h[b+8>>3]))Aa(111193,110462,843,111224);if((+h[a+16>>3]==+h[b+16>>3]?+h[a+24>>3]==+h[b+24>>3]:0)?(c[a+32>>2]|0)==(c[b+32>>2]|0):0)a=(c[a+36>>2]|0)==(c[b+36>>2]|0);else a=0;return a&1|0}function SQ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=0;while(1){b=VQ(b,e)|0;h=g+1|0;if(!b){i=0;break}d=VQ(d,f)|0;if(!d){j=5;break}if(!(RQ(b,d)|0)){j=6;break}else g=h}if((j|0)==5)Aa(138697,110462,871,111142);else if((j|0)==6)i=XQ(b,WQ(b,d)|0,h,1-e|0)|0;c[a>>2]=g;c[a+4>>2]=i;return}function TQ(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=i+24|0;v=i+20|0;i=HQ(c[((a[b>>0]|0)==0?v:w)>>2]|0,b)|0;oR(c[i+32>>2]|0,c[b+40>>2]|0,c[d+40>>2]|0);s=1;while(1){if((s|0)>(g|0))break;t=VQ(b,e)|0;u=VQ(d,f)|0;j=i+32|0;k=b+40|0;l=d+40|0;m=t+8|0;n=b+36|0;o=b+32|0;p=b+16|0;q=u+40|0;r=t+40|0;do if(!(a[b>>0]|0)){i=HQ(c[w>>2]|0,t)|0;j=c[j>>2]|0;d=c[k>>2]|0;b=c[l>>2]|0;if(+h[m>>3]==+h[p>>3]){p=(c[o>>2]|0)==1;j=(qR(j,d,b)|0)!=0;k=c[i+32>>2]|0;d=c[q>>2]|0;b=c[r>>2]|0;if(p)if(j){oR(k,d,b);break}else{oR(k,b,d);break}else if(j){oR(k,b,d);break}else{oR(k,d,b);break}}else{p=(c[n>>2]|0)==1;j=(qR(j,d,b)|0)!=0;k=c[i+32>>2]|0;d=c[q>>2]|0;b=c[r>>2]|0;if(p)if(j){oR(k,b,d);break}else{oR(k,d,b);break}else if(j){oR(k,d,b);break}else{oR(k,b,d);break}}}else{i=HQ(c[v>>2]|0,t)|0;j=c[j>>2]|0;d=c[k>>2]|0;b=c[l>>2]|0;if(+h[m>>3]==+h[p>>3]){p=(c[o>>2]|0)==2;j=(qR(j,d,b)|0)!=0;k=c[i+32>>2]|0;d=c[q>>2]|0;b=c[r>>2]|0;if(p)if(j){oR(k,b,d);break}else{oR(k,d,b);break}else if(j){oR(k,d,b);break}else{oR(k,b,d);break}}else{p=(c[n>>2]|0)==2;j=(qR(j,d,b)|0)!=0;k=c[i+32>>2]|0;d=c[q>>2]|0;b=c[r>>2]|0;if(p)if(j){oR(k,d,b);break}else{oR(k,b,d);break}else if(j){oR(k,b,d);break}else{oR(k,d,b);break}}}while(0);b=t;d=u;s=s+1|0}return}function UQ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0;while(1){if(!(RQ(b,d)|0))break;g=VQ(b,1)|0;d=VQ(d,e)|0;b=g}g=c[(HQ(c[((a[b>>0]|0)==0?f+20|0:f+24|0)>>2]|0,b)|0)+32>>2]|0;pR(g,c[b+40>>2]|0,c[d+40>>2]|0);return}function VQ(a,b){a=a|0;b=b|0;if(!a)Aa(111129,110462,798,111133);else return c[((b|0)==0?a+48|0:a+52|0)>>2]|0;return 0}function WQ(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;d=a[b>>0]|0;if(d<<24>>24==(a[c>>0]|0)?!(+h[b+8>>3]!=+h[c+8>>3]):0){if(!(d<<24>>24))b=YQ(b,c,3,1)|0;else b=YQ(b,c,4,2)|0;l=f;return b|0}dA(1,111155,e)|0;Ca(189580,1);return 0}function XQ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0;m=1;while(1){if((m|0)>(e|0))break;l=VQ(b,f)|0;g=+h[l+8>>3]==+h[b+16>>3];k=0-d|0;i=b+36|0;j=b+32|0;do if(!(a[b>>0]|0))if(g){g=(c[j>>2]|0)==1;break}else{g=(c[i>>2]|0)==3;break}else if(g){g=(c[j>>2]|0)==4;break}else{g=(c[i>>2]|0)==2;break}while(0);b=l;m=m+1|0;d=g?k:d}return d|0}function YQ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0.0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0,r=0,s=0;p=+h[a+24>>3];i=+h[b+16>>3];do if(!(p>3],m=+h[b+24>>3],!(f>m)):0){if(i>2]|0;return ((d|0)==(c[b>>2]|0)?0:(d|0)==(e|0)?1:-1)|0}else{b=c[a>>2]|0;b=(b|0)==(c[g>>2]|0)?0:(b|0)==(e|0)?1:-1;break}q=c[b>>2]|0;r=c[a>>2]|0;if(!(p==m))if(p>2]|0)==(d|0);b=$Q(q,r,d,e)|0;b=s?b:0-b|0;break}else{s=(c[g>>2]|0)==(e|0);b=$Q(r,q,d,e)|0;b=s?b:0-b|0;break}n=c[g>>2]|0;if((r|0)==(q|0)?(c[s>>2]|0)==(n|0):0){b=0;break}o=(q|0)==(d|0);j=(r|0)!=(e|0);b=(r|0)!=(d|0);k=(q|0)==(e|0);if((q|0)==(n|0)){if(o|k){b=o?1:-1;break}if(b?(c[s>>2]|0)!=(d|0):0){b=1;break}if(j?(c[s>>2]|0)!=(e|0):0){b=-1;break}b=0;break}l=(n|0)!=(e|0);if(!(l|o^1)){if(b?(c[s>>2]|0)==(e|0):0){b=1;break}if((r|0)==(d|0)?(c[s>>2]|0)!=(e|0):0){b=-1;break}b=0;break}g=c[s>>2]|0;a=(n|0)!=(d|0);if(!(a|k^1)){if((r|0)==(e|0)&(g|0)!=(d|0)){b=1;break}return (j&(g|0)==(d|0))<<31>>31|0}b=(q|0)!=0;if(!(b|a)){b=_Q(r,g,d)|0;break}if(!(b|l)){b=0-(_Q(r,g,e)|0)|0;break}if(o&(n|0)==0){b=_Q(g,r,d)|0;break}else{b=0-(_Q(g,r,e)|0)|0;break}}else b=0;while(0);return b|0}function ZQ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0;i=+h[a+24>>3];j=+h[b+24>>3];k=a+36|0;f=b+32|0;do if(i>2]|0;if((a|0)==(d|0)?(c[f>>2]|0)==(e|0):0){a=-1;break}if((a|0)==(e|0)?(c[f>>2]|0)==(d|0):0){a=1;break}a=0}else{f=c[f>>2]|0;g=(f|0)==(e|0);a=b+36|0;if(i==j){f=c[a>>2]|0;a=c[k>>2]|0;if(g){a=$Q(a,f,d,e)|0;break}else{a=0-($Q(f,a,d,e)|0)|0;break}}if(g?(c[a>>2]|0)==(e|0):0){a=-1;break}if((f|0)==(d|0)?(c[a>>2]|0)==(d|0):0){a=1;break}a=0}while(0);return a|0}function _Q(a,b,c){a=a|0;b=b|0;c=c|0;return ((a|0)==(c|0)?((b|0)==(c|0))<<31>>31:1)|0}function $Q(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(d|0)){b=(a|0)==0;if(b)return 0;else b=b&1}return ((a|0)!=0|(b|0)!=(c|0))<<31>>31|0}function aR(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;g=c[a+28>>2]|0;h=c[a+24>>2]|0;d=c[a+32>>2]|0;a=0;a:while(1){e=a+1|0;if((e|0)>=(h|0))break;f=g+(a<<2)|0;b=e;while(1){if((b|0)==(h|0)){a=e;continue a}switch(WQ(c[f>>2]|0,c[g+(b<<2)>>2]|0)|0){case 1:{oR(d,a,b);break}case -1:{oR(d,b,a);break}default:{}}b=b+1|0}}return}function bR(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+24|0;e=c[f>>2]|0;d=e+1|0;c[f>>2]=d;c[b+40>>2]=e;e=a+28|0;a=c[e>>2]|0;if(!a)a=IK(d<<2)|0;else a=KK(a,d<<2)|0;c[e>>2]=a;c[a+((c[f>>2]|0)+-1<<2)>>2]=b;return}function cR(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;h[f>>3]=d;e=eb[c[a>>2]&63](a,f,512)|0;if(!e){e=HK(24)|0;h[e+8>>3]=+h[f>>3];c[e+16>>2]=Sz(25776,c[4591]|0)|0;eb[c[a>>2]&63](a,e,1)|0}f=c[e+16>>2]|0;eb[c[f>>2]&63](f,b,1)|0;l=g;return}function dR(a,b,d){a=a|0;b=b|0;d=d|0;nR(c[b+32>>2]|0);l6(c[b+28>>2]|0);l6(b);return}function eR(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0;e=+h[b>>3];f=+h[c>>3];d=c+8|0;a=b+8|0;if(!(e>f))if(e>3]>=+h[d>>3])<<31>>31;else a=0;else a=!(+h[a>>3]<=+h[d>>3])&1;return a|0}function fR(a,b,d){a=a|0;b=b|0;d=d|0;Oz(c[b+16>>2]|0)|0;l6(b);return}function gR(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0;f=+h[b>>3];e=+h[c>>3];return (f>e?1:(f>31)|0}function hR(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0,l=0,m=0;m=(a[d+36>>0]|0)!=0;k=e+40|0;j=e+48|0;i=e+64|0;l=e+56|0;do if((c[d+24>>2]|0)==(e|0)){f=+h[k>>3];g=+h[j>>3];if(m){g=(g+ +h[i>>3])*.5;break}else{f=(f+ +h[l>>3])*.5;break}}else{g=+h[i>>3];f=+h[l>>3];if(m){g=(g+ +h[j>>3])*.5;break}else{f=(f+ +h[k>>3])*.5;break}}while(0);h[b>>3]=f;h[b+8>>3]=g;return}function iR(a,b){a=a|0;b=b|0;var d=0;d=c[a+20>>2]|0;if((d|0)!=(c[b+20>>2]|0)?(d|0)!=(c[b+24>>2]|0):0)d=c[a+24>>2]|0;return d|0}function jR(a,b){a=a|0;b=b|0;var c=0.0;c=(+h[b+48>>3]+ +h[b+64>>3])*.5;h[a>>3]=(+h[b+40>>3]+ +h[b+56>>3])*.5;h[a+8>>3]=c;return}function kR(b,d,e,f,g,i,j){b=b|0;d=d|0;e=+e;f=+f;g=+g;i=i|0;j=j|0;var k=0,l=0,m=0;a[b>>0]=d;h[b+8>>3]=e;d=b+16|0;k=b+32|0;l=b+36|0;m=b+24|0;if(f>3]=f;h[m>>3]=g;c[k>>2]=i;c[l>>2]=j;d=0}else{h[m>>3]=f;h[d>>3]=g;c[l>>2]=i;c[k>>2]=j;d=1}a[b+1>>0]=d;return}function lR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0;f=c[b+36>>2]|0;i=b+64|0;g=b+56|0;e=b+40|0;do if((c[f+4>>2]|0)!=(d|0)){b=b+48|0;if((c[f+12>>2]|0)==(d|0)){e=~~((+h[e>>3]+ +h[g>>3])*.5);b=~~+h[b>>3];break}if((c[f+8>>2]|0)==(d|0)){e=~~+h[e>>3];b=~~((+h[b>>3]+ +h[i>>3])*.5);break}if((c[f>>2]|0)==(d|0)){e=~~+h[g>>3];b=~~((+h[b>>3]+ +h[i>>3])*.5)}else{e=0;b=0}}else{e=~~((+h[e>>3]+ +h[g>>3])*.5);b=~~+h[i>>3]}while(0);c[a>>2]=e;c[a+4>>2]=b;return}function mR(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=HK(8)|0;c[d>>2]=a;e=d+4|0;c[e>>2]=HK(a*12|0)|0;b=0;while(1){if((b|0)>=(a|0))break;g=NU()|0;f=c[e>>2]|0;c[f+(b*12|0)+8>>2]=g;c[f+(b*12|0)>>2]=0;b=b+1|0}return d|0}function nR(a){a=a|0;var b=0,d=0,e=0;d=a+4|0;b=0;while(1){e=c[d>>2]|0;if((b|0)>=(c[a>>2]|0))break;Oz(c[e+(b*12|0)+8>>2]|0)|0;b=b+1|0}l6(e);l6(a);return}function oR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=c[(c[a+4>>2]|0)+(b*12|0)+8>>2]|0;eb[c[d>>2]&63](d,f,1)|0;l=e;return}function pR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+16|0;f=e;c[f>>2]=d;a=a+4|0;g=c[(c[a>>2]|0)+(b*12|0)+8>>2]|0;eb[c[g>>2]&63](g,f,2)|0;c[f>>2]=b;d=c[(c[a>>2]|0)+(d*12|0)+8>>2]|0;eb[c[d>>2]&63](d,f,2)|0;l=e;return}function qR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=c[(c[a+4>>2]|0)+(b*12|0)+8>>2]|0;d=(eb[c[d>>2]&63](d,f,512)|0)!=0&1;l=e;return d|0}function rR(a){a=a|0;var b=0,d=0,e=0,f=0;b=c[a>>2]|0;do if(b|0){f=a+4|0;if((b|0)==1){c[(c[f>>2]|0)+4>>2]=0;break}e=sR(b)|0;d=0;b=0;while(1){if((d|0)>=(c[a>>2]|0)){b=0;break}if(!(c[(c[f>>2]|0)+(d*12|0)>>2]|0))b=tR(a,d,b,e)|0;d=d+1|0}while(1){d=uR(e)|0;if((d|0)<=-1)break;c[(c[f>>2]|0)+(d*12|0)+4>>2]=b;b=b+1|0}vR(e)}while(0);return}function sR(a){a=a|0;var b=0;b=HK(8)|0;c[b+4>>2]=HK(a<<2)|0;c[b>>2]=-1;return b|0}function tR(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;i=a+4|0;g=c[i>>2]|0;j=g+(b*12|0)|0;c[j>>2]=1;g=c[g+(b*12|0)+8>>2]|0;h=g+4|0;d=d+1|0;g=Qz(g)|0;while(1){if(!g)break;f=c[(c[h>>2]|0)+8>>2]|0;if((f|0)<0)f=c[g+8>>2]|0;else f=g+(0-f)|0;f=c[f>>2]|0;if(!(c[(c[i>>2]|0)+(f*12|0)>>2]|0))d=tR(a,f,d,e)|0;g=c[g>>2]|0}c[j>>2]=2;wR(e,b);return d+1|0}function uR(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;if((b|0)==-1)a=-1;else{d=c[(c[a+4>>2]|0)+(b<<2)>>2]|0;c[a>>2]=b+-1;a=d}return a|0}function vR(a){a=a|0;l6(c[a+4>>2]|0);l6(a);return}function wR(a,b){a=a|0;b=b|0;var d=0;d=(c[a>>2]|0)+1|0;c[a>>2]=d;c[(c[a+4>>2]|0)+(d<<2)>>2]=b;return}function xR(a){a=a|0;var d=0,e=0,f=0;e=c[a>>2]|0;c[a+8>>2]=e;c[a+12>>2]=c[a+4>>2];d=a+16|0;a=0;while(1){if((a|0)>=(e|0))break;f=c[d>>2]|0;b[f+(a*40|0)+18>>1]=b[f+(a*40|0)+16>>1]|0;a=a+1|0}return}function yR(a){a=a|0;var d=0,e=0,f=0;d=c[a+8>>2]|0;c[a>>2]=d;c[a+4>>2]=c[a+12>>2];e=a+16|0;a=0;while(1){if((a|0)>=(d|0))break;f=c[e>>2]|0;b[f+(a*40|0)+16>>1]=b[f+(a*40|0)+18>>1]|0;a=a+1|0}d=d+2|0;while(1){if((a|0)>=(d|0))break;b[(c[e>>2]|0)+(a*40|0)+16>>1]=0;a=a+1|0}return}function zR(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=HK(((c[a>>2]|0)*6|0)+(b<<1)<<2)|0;c[a+20>>2]=HK((((c[a>>2]|0)*3|0)+b|0)*24|0)|0;e=c[a>>2]|0;f=a+16|0;a=0;while(1){if((a|0)>=(e|0))break;c[(c[f>>2]|0)+(a*40|0)+28>>2]=d;d=d+24|0;a=a+1|0}e=e+2|0;while(1){if((a|0)>=(e|0))break;c[(c[f>>2]|0)+(a*40|0)+28>>2]=d;d=d+(b<<2)|0;a=a+1|0}return}function AR(a){a=a|0;var b=0;b=HK(24)|0;c[b>>2]=0;c[b+16>>2]=HK(a*40|0)|0;return b|0}function BR(a){a=a|0;var b=0,d=0;d=c[a+16>>2]|0;b=c[a>>2]|0;c[d+(b*40|0)+32>>2]=b;c[a>>2]=b+1;return d+(b*40|0)|0}function CR(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,g=0;g=a+4|0;f=c[g>>2]|0;c[g>>2]=f+1;g=c[a+20>>2]|0;a=g+(f*24|0)|0;c[g+(f*24|0)+12>>2]=c[b+32>>2];c[g+(f*24|0)+16>>2]=c[d+32>>2];h[a>>3]=e;c[g+(f*24|0)+8>>2]=0;DR(b,f);DR(d,f);return a|0}function DR(a,d){a=a|0;d=d|0;var e=0,f=0;e=a+16|0;f=b[e>>1]|0;c[(c[a+28>>2]|0)+(f<<16>>16<<2)>>2]=d;b[e>>1]=f+1<<16>>16;return}function ER(a){a=a|0;var b=0;b=a+16|0;l6(c[(c[b>>2]|0)+28>>2]|0);l6(c[b>>2]|0);l6(c[a+20>>2]|0);l6(a);return}function FR(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;g=c[a>>2]|0;i=a+16|0;f=0;while(1){if((f|0)>=(g|0))break;c[(c[i>>2]|0)+(f*40|0)>>2]=-2147483648;f=f+1|0}VU();a:do if(!(YU(d)|0)){c[d+8>>2]=0;c[d>>2]=0;d=a+20|0;b:while(1){g=_U()|0;if(!g){f=0;break a}c[g>>2]=0-(c[g>>2]|0);if((g|0)==(e|0)){f=0;break a}i=g+16|0;j=g+28|0;f=0;while(1){if((f|0)>=(b[i>>1]|0))continue b;k=(c[d>>2]|0)+((c[(c[j>>2]|0)+(f<<2)>>2]|0)*24|0)|0;l=GR(a,k,g)|0;m=c[l>>2]|0;do if((m|0)<0){n=~~-(+(c[g>>2]|0)+ +h[k>>3]);if((m|0)==-2147483648){c[l>>2]=n;if(YU(l)|0){f=1;break a}c[l+8>>2]=g;c[l+12>>2]=k;break}else{if((m|0)>=(n|0))break;$U(l,n);c[l+8>>2]=g;c[l+12>>2]=k;break}}while(0);f=f+1|0}}}else f=1;while(0);return f|0}function GR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[b+12>>2]|0;if((e|0)==(c[d+32>>2]|0))e=c[b+16>>2]|0;return (c[a+16>>2]|0)+(e*40|0)|0}function HR(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=c[a>>2]|0;JF(d,3,b)|0;b=c[d+92>>2]|0;do if(b){e=c[b+16>>2]|0;h=c[e+12>>2]|0;c[a+76>>2]=h;f=c[e+16>>2]|0;c[a+84>>2]=f;g=a+80|0;c[g>>2]=c[e>>2];c[a+88>>2]=c[b+4>>2];e=a+152|0;f=c[e>>2]|c[f>>2];c[e>>2]=f;b=c[d+80>>2]|0;d=a+60|0;if(!b){c[d>>2]=0;b=999;break}else{i=c[b+16>>2]|0;c[d>>2]=c[i+12>>2];d=c[i+16>>2]|0;c[a+68>>2]=d;c[a+72>>2]=c[b+4>>2];c[e>>2]=f|c[d>>2];c[a+64>>2]=c[((h|0)==0?g:i)>>2];b=300;break}}else b=999;while(0);return b|0}function IR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(!(iF(a)|0))if((b|0)!=0?(d=c[b>>2]|0,(d|0)!=0):0){db[d&127](a);a=0}else a=0;else a=1;return a|0}function JR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+4>>2]|0,d|0):0)db[d&127](a);c[(c[a>>2]|0)+24>>2]=0;qF(a);return}function KR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0.0,j=0.0,k=0,l=0.0;j=+h[b+504>>3];g=+h[b+512>>3];l=+h[b+352>>3];k=(c[b+360>>2]|0)==0;i=+h[d>>3];f=+h[d+8>>3];e=l*+h[b+528>>3]*((k?g:j)+(k?f:i));h[a>>3]=l*+h[b+520>>3]*(k?j+i:-(g+f));h[a+8>>3]=e;return}function LR(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0;f=+h[a+504>>3];g=+h[a+512>>3];i=+h[a+352>>3];j=i*+h[a+520>>3];i=i*+h[a+528>>3];a:do if(!(c[a+360>>2]|0)){a=0;while(1){if((a|0)>=(e|0))break a;h[d+(a<<4)>>3]=j*(f+ +h[b+(a<<4)>>3]);h[d+(a<<4)+8>>3]=i*(g+ +h[b+(a<<4)+8>>3]);a=a+1|0}}else{a=0;while(1){if((a|0)>=(e|0))break a;k=-(j*(g+ +h[b+(a<<4)+8>>3]));h[d+(a<<4)+8>>3]=i*(f+ +h[b+(a<<4)>>3]);h[d+(a<<4)>>3]=k;a=a+1|0}}while(0);return d|0}function MR(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+8>>2]|0,d|0):0)db[d&127](a);return}function NR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+12>>2]|0,d|0):0)db[d&127](a);pF(a);return}function OR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+24>>2]|0,d|0):0)db[d&127](a);return}function PR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+28>>2]|0,d|0):0)db[d&127](a);return}function QR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+16>>2]|0,d|0):0){b=c[a+160>>2]|0;xb[d&31](a,c[(c[(c[a>>2]|0)+308>>2]|0)+(b<<2)>>2]|0,b,c[a+156>>2]|0)}return}function RR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+20>>2]|0,d|0):0)db[d&127](a);return}function SR(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+32>>2]|0,d|0):0)db[d&127](a);return}function TR(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+36>>2]|0,d|0):0)db[d&127](a);return}function UR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+40>>2]|0,d|0):0)db[d&127](a);return}function VR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+44>>2]|0,d|0):0)db[d&127](a);return}function WR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+48>>2]|0,d|0):0)db[d&127](a);return}function XR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+52>>2]|0,d|0):0)db[d&127](a);return}function YR(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+56>>2]|0,d|0):0)db[d&127](a);return}function ZR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+60>>2]|0,d|0):0)db[d&127](a);return}function _R(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+64>>2]|0,d|0):0)db[d&127](a);return}function $R(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+68>>2]|0,d|0):0)db[d&127](a);return}function aS(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=c[a+60>>2]|0;if(g|0?(h=c[g+72>>2]|0,h|0):0)fb[h&31](a,b,d,e,f);return}function bS(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+76>>2]|0,d|0):0)db[d&127](a);return}function cS(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+60>>2]|0;if(d|0?(e=c[d+80>>2]|0,e|0):0)lb[e&63](a,b);return}function dS(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+84>>2]|0,d|0):0)db[d&127](a);return}function eS(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+48|0;f=k+32|0;h=k;i=k+16|0;j=c[b+60>>2]|0;m=c[e>>2]|0;do if(m|0?a[m>>0]|0:0){m=c[b+16>>2]|0;if(m|0?(c[m+144>>2]|0)==0:0)break;if(!(c[b+152>>2]&8192)){c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];KR(i,b,f);c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2]}else{c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2]}if(j|0?(g=c[j+88>>2]|0,g|0):0){c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];rb[g&127](b,f,e)}}while(0);l=k;return}function fS(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=c[b+60>>2]|0;g=(c[b+16>>2]|0)+16|0;i=F3(d,58)|0;h=(i|0)!=0;if(h)a[i>>0]=0;if(f|0?(gS(c[b+68>>2]|0,d,g),e=c[f+92>>2]|0,e|0):0)lb[e&63](b,g);if(h)a[i>>0]=58;return}function gS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+32|0;g=k+16|0;j=k+8|0;i=k;c[d>>2]=b;c[d+32>>2]=5;e=xT(b)|0;f=c[a+16>>2]|0;if(!((f|0)!=0?(e6(e,f,c[a+20>>2]|0,4,102)|0)!=0:0))h=3;a:do if((h|0)==3){switch(yT(b,d,c[a+24>>2]|0)|0){case 0:break a;case 1:break;default:{dA(1,111347,g)|0;break a}}a=IK((D3(b)|0)+16|0)|0;c[i>>2]=b;i2(a,111312,i)|0;if(NJ(a)|0){c[j>>2]=b;dA(0,111321,j)|0}l6(a)}while(0);l=k;return}function hS(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=c[b+60>>2]|0;g=(c[b+16>>2]|0)+56|0;i=F3(d,58)|0;h=(i|0)!=0;if(h)a[i>>0]=0;if(f|0?(gS(c[b+68>>2]|0,d,g),e=c[f+92>>2]|0,e|0):0)lb[e&63](b,g);if(h)a[i>>0]=58;return}function iS(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0,i=0,j=0;h=c[a+60>>2]|0;i=a+16|0;j=(c[i>>2]|0)+96|0;if(h|0?(gS(c[a+68>>2]|0,b,j),f=c[h+92>>2]|0,f|0):0)lb[f&63](a,j);j=c[i>>2]|0;c[j+136>>2]=d;g[j+140>>2]=e;return}function jS(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m;j=c[b+60>>2]|0;b=c[b+16>>2]|0;c[b+160>>2]=d;a:do if((d|0)!=0&(j|0)!=0){j=b+144|0;i=b+152|0;g=b+148|0;b=d;b:while(1){f=b+4|0;b=c[b>>2]|0;if(!b)break a;c:do switch(a[b>>0]|0){case 115:{if(!(f2(b,111368)|0)){c[j>>2]=3;b=f;continue b}if(!(f2(b,111389)|0)){d=115;while(1){e=b+1|0;if(!(d<<24>>24))break;b=e;d=a[e>>0]|0}h[i>>3]=+a6(e);b=f;continue b}break}case 100:{if(!(f2(b,137628)|0)){c[j>>2]=1;b=f;continue b}if(!(f2(b,137621)|0)){c[j>>2]=2;b=f;continue b}break}case 105:{if(f2(b,134636)|0?f2(b,111374)|0:0)break c;c[j>>2]=0;b=f;continue b}case 98:{if(!(f2(b,111384)|0)){h[i>>3]=2.0;b=f;continue b}break}case 102:{if(!(f2(b,111402)|0)){c[g>>2]=1;b=f;continue b}break}case 117:{if(!(f2(b,111409)|0)){c[g>>2]=0;b=f;continue b}break}case 116:{if(!(f2(b,111418)|0)){b=f;continue b}break}default:{}}while(0);c[k>>2]=b;dA(0,111426,k)|0;b=f}}while(0);l=m;return}function kS(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0;j=l;l=l+32|0;g=j;d=c[a+60>>2]|0;if((d|0?(i=d+96|0,f=c[i>>2]|0,f|0):0)?c[(c[a+16>>2]|0)+144>>2]|0:0){d=b+16|0;h[g>>3]=(+h[b>>3]+ +h[d>>3])*.5;h[g+8>>3]=(+h[b+8>>3]+ +h[b+24>>3])*.5;b=g+16|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];if(!(c[a+152>>2]&8192)){LR(a,g,g,2)|0;f=c[i>>2]|0}rb[f&127](a,g,e)}l=j;return}function lS(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+48|0;m=o;f=c[a+60>>2]|0;if((f|0?(n=f+100|0,c[n>>2]|0):0)?(k=a+16|0,g=c[k>>2]|0,c[g+144>>2]|0):0){j=g+16|0;if(!(e&4))g=0;else{i=g+56|0;e=e&-5;f=m;g=j;h=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));f=j;g=i;h=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));g=1}if(!(c[a+152>>2]&8192)){f=d+10|0;if((c[47434]|0)<(d|0)){c[47434]=f;f=KK(c[47435]|0,f<<4)|0;c[47435]=f}else f=c[47435]|0;LR(a,b,f,d)|0;xb[c[n>>2]&31](a,f,d,e)}else xb[c[n>>2]&31](a,b,d,e);if(g|0){f=(c[k>>2]|0)+16|0;g=m;h=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0))}}l=o;return}function mS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+64|0;f=e;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];g=f+32|0;b=b+16|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];h[f+16>>3]=+h[f>>3];h[f+24>>3]=+h[f+40>>3];h[f+48>>3]=+h[g>>3];h[f+56>>3]=+h[f+8>>3];lS(a,f,4,d);l=e;return}function nS(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=c[a+60>>2]|0;do if((h|0?(j=h+104|0,i=c[j>>2]|0,i|0):0)?c[(c[a+16>>2]|0)+144>>2]|0:0){h=g&255;if(c[a+152>>2]&8192|0){ub[i&15](a,b,d,e,f,h);break}g=d+10|0;if((c[47434]|0)<(d|0)){c[47434]=g;g=KK(c[47435]|0,g<<4)|0;c[47435]=g}else g=c[47435]|0;LR(a,b,g,d)|0;ub[c[j>>2]&15](a,g,d,e,f,h)}while(0);return}function oS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=c[a+60>>2]|0;do if((e|0?(g=e+108|0,f=c[g>>2]|0,f|0):0)?c[(c[a+16>>2]|0)+144>>2]|0:0){if(c[a+152>>2]&8192|0){rb[f&127](a,b,d);break}e=d+10|0;if((c[47434]|0)<(d|0)){c[47434]=e;e=KK(c[47435]|0,e<<4)|0;c[47435]=e}else e=c[47435]|0;LR(a,b,e,d)|0;rb[c[g>>2]&127](a,e,d)}while(0);return}function pS(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[b+60>>2]|0;if((d|0?!((e|0)==0|(a[d>>0]|0)==0):0)?(f=c[e+112>>2]|0,f|0):0)lb[f&63](b,d);return}function qS(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;H=l;l=l+112|0;D=H+64|0;G=H;n=H+96|0;z=H+48|0;A=H+32|0;E=c[b+60>>2]|0;if(!b)Aa(111583,111479,691,111490);if(!d)Aa(111509,111479,692,111490);if(!(a[d>>0]|0))Aa(111514,111479,693,111490);F=LF(d)|0;if(!F){if((E|0)!=0&(gN(d)|0)!=0?(m=c[E+116>>2]|0,m|0):0)fb[m&31](b,d,e,f,g&255)}else{s=b+432|0;c[D>>2]=c[s>>2];c[D+4>>2]=c[s+4>>2];c[D+8>>2]=c[s+8>>2];c[D+12>>2]=c[s+12>>2];OF(n,F,D);s=c[n>>2]|0;m=c[n+4>>2]|0;if(!((s|0)<1&(m|0)<1)){n=G+16|0;c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2];c[G>>2]=c[e>>2];c[G+4>>2]=c[e+4>>2];c[G+8>>2]=c[e+8>>2];c[G+12>>2]=c[e+12>>2];B=G+24|0;C=G+8|0;d=1;k=+h[G>>3];x=+h[C>>3];j=+h[n>>3];y=+h[B>>3];while(1){if((d|0)>=(f|0))break;I=e+(d<<4)|0;v=+h[I>>3];t=+h[(k>3];h[G>>3]=t;w=+h[e+(d<<4)+8>>3];u=+h[(x>3];h[C>>3]=u;v=+h[(j>v?n:I)>>3];h[n>>3]=v;w=+h[(y>w?n:I)+8>>3];h[B>>3]=w;d=d+1|0;k=t;x=u;j=v;y=w}v=j-k;w=y-x;o=+(m|0);p=+(s|0);t=v/p;q=w/o;u=o*q;r=p*t;a:do switch(rS(i)|0){case 1:if(t>3]=k;j=j-v;h[n>>3]=j}if(o>3]=w+x;h[B>>3]=y-w}if(!(c[b+152>>2]&8192)){c[D>>2]=c[G>>2];c[D+4>>2]=c[G+4>>2];c[D+8>>2]=c[G+8>>2];c[D+12>>2]=c[G+12>>2];KR(z,b,D);c[G>>2]=c[z>>2];c[G+4>>2]=c[z+4>>2];c[G+8>>2]=c[z+8>>2];c[G+12>>2]=c[z+12>>2];c[D>>2]=c[n>>2];c[D+4>>2]=c[n+4>>2];c[D+8>>2]=c[n+8>>2];c[D+12>>2]=c[n+12>>2];KR(A,b,D);c[n>>2]=c[A>>2];c[n+4>>2]=c[A+4>>2];c[n+8>>2]=c[A+8>>2];c[n+12>>2]=c[A+12>>2];k=+h[G>>3];j=+h[n>>3]}if(k>j){h[G>>3]=j;h[n>>3]=k}j=+h[C>>3];k=+h[B>>3];if(j>k){h[C>>3]=k;h[B>>3]=j}if(E|0){I=c[b+72>>2]|0;c[D>>2]=c[G>>2];c[D+4>>2]=c[G+4>>2];c[D+8>>2]=c[G+8>>2];c[D+12>>2]=c[G+12>>2];c[D+16>>2]=c[G+16>>2];c[D+20>>2]=c[G+20>>2];c[D+24>>2]=c[G+24>>2];c[D+28>>2]=c[G+28>>2];vS(b,F,D,g,I)}}}l=H;return}function rS(b){b=b|0;if(a[b>>0]|0)if(C3(b,141419)|0)if(C3(b,141351)|0)if(!(C3(b,111522)|0))b=4;else b=(bP(b)|0)<<24>>24!=0&1;else b=3;else b=2;else b=0;return b|0}function sS(a,b){a=a|0;b=+b;if(c[a+60>>2]|0)h[(c[a+16>>2]|0)+152>>3]=b;return}function tS(a,b){a=a|0;b=b|0;b=JF(a,1,b)|0;if(!b)b=999;else{b=c[b+16>>2]|0;c[a+184>>2]=c[b+4>>2];c[a+172>>2]=c[b+12>>2];c[a+176>>2]=c[b>>2];c[a+180>>2]=c[b+16>>2];b=300}return b|0}function uS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=i;RC(b,137786,280,1)|0;g=b+16|0;c[(c[g>>2]|0)+144>>2]=a;if((vC(b)|0)!=(b|0))c[(c[(vC(b)|0)+16>>2]|0)+144>>2]=a;d=NA(b,111527)|0;e=a+172|0;if((d|0)!=0?(c[e>>2]=0,(tS(a,d)|0)==999):0){h=KF(a,1,d)|0;c[f>>2]=d;c[f+4>>2]=h;dA(1,111534,f)|0;d=-1}else{e=c[e>>2]|0;if(!e)d=-1;else{PJ(1);oK(b,c[c[a+180>>2]>>2]&1);d=c[(c[g>>2]|0)+8>>2]|0;c[(c[(vC(b)|0)+16>>2]|0)+8>>2]=d;YN();d=c[e>>2]|0;if(d|0?(db[d&127](b),h=c[e+4>>2]|0,h|0):0)c[(c[g>>2]|0)+148>>2]=h;PJ(0);d=0}}l=i;return d|0}function vS(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+176|0;k=n+8|0;j=n;h=n+40|0;if(!b)Aa(111583,111587,52,111601);if(!d)Aa(111613,111587,53,111601);i=c[d+8>>2]|0;if(!i)Aa(111616,111587,54,111601);if(!(a[i>>0]|0))Aa(111625,111587,55,111601);O3(h,c[d+28>>2]|0)|0;i=h+(D3(h)|0)|0;a[i>>0]=58;a[i+1>>0]=0;g6(h,g)|0;if((wS(b,h)|0)==999){c[j>>2]=h;dA(0,111637,j)|0}g=c[b+92>>2]|0;if(g|0?(m=c[g>>2]|0,m|0):0){c[k>>2]=c[e>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];c[k+16>>2]=c[e+16>>2];c[k+20>>2]=c[e+20>>2];c[k+24>>2]=c[e+24>>2];c[k+28>>2]=c[e+28>>2];xb[m&31](b,d,k,f)}l=n;return}function wS(a,b){a=a|0;b=b|0;b=JF(c[a>>2]|0,4,b)|0;if(!b)b=999;else{b=c[b+16>>2]|0;c[a+92>>2]=c[b+12>>2];c[a+96>>2]=c[b>>2];b=300}return b|0}function xS(a){a=a|0;return 1}function yS(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+336|0;h[c>>3]=+h[c>>3]+10.0/+h[b+352>>3];a[b+537>>0]=1;return 0}function zS(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+336|0;h[c>>3]=+h[c>>3]-10.0/+h[b+352>>3];a[b+537>>0]=1;return 0}function AS(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+344|0;h[c>>3]=+h[c>>3]-10.0/+h[b+352>>3];a[b+537>>0]=1;return 0}function BS(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+344|0;h[c>>3]=+h[c>>3]+10.0/+h[b+352>>3];a[b+537>>0]=1;return 0}function CS(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+352|0;h[c>>3]=+h[c>>3]*1.1;a[b+537>>0]=1;return 0}function DS(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+352|0;h[c>>3]=+h[c>>3]/1.1;a[b+537>>0]=1;return 0}function ES(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0;e=b+536|0;d=(a[e>>0]|0)==0;a[e>>0]=d&1;if(d){d=c[b+448>>2]|0;e=c[b+452>>2]|0;i=+(d>>>0);g=+(e>>>0);f=i/+(d|0)>3]=(f?i:g)/+((f?d:e)|0);e=b+336|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;a[b+537>>0]=1}return 0}function FS(b){b=b|0;var d=0,e=0;d=c[(c[b>>2]|0)+168>>2]|0;e=b+580|0;if(!(c[e>>2]|0)){c[e>>2]=d;e=(c[d+16>>2]|0)+112|0;a[e>>0]=a[e>>0]|2;VS(b,d)}qI(b,d);a[b+540>>0]=1;return}function GS(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=l;l=l+16|0;m=C;x=b+452|0;t=b+448|0;y=e+8|0;o=b+536|0;A=b+360|0;p=b+541|0;q=b+538|0;z=b+336|0;n=d&255;B=b+344|0;u=b+352|0;v=b+528|0;w=b+520|0;switch(d|0){case 1:{c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];OS(b,m);US(b);a[q>>0]=1;a[p>>0]=n;r=13;break}case 2:{a[q>>0]=1;a[p>>0]=n;r=13;break}case 3:{c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];OS(b,m);a[q>>0]=1;a[p>>0]=n;r=13;break}case 4:{a[o>>0]=0;j=+h[z>>3];k=+h[u>>3];i=+((c[t>>2]|0)>>>0)*.5;g=k*+h[w>>3];f=(+h[y>>3]-+((c[x>>2]|0)>>>0)*.5)*.10000000000000009/(k*+h[v>>3]);if(!(c[A>>2]|0))h[z>>3]=j+(+h[e>>3]-i)*.10000000000000009/g;else{h[z>>3]=j-f;f=(+h[e>>3]-i)*.10000000000000009/g}h[B>>3]=f+ +h[B>>3];h[u>>3]=k*1.1;r=13;break}case 5:{a[o>>0]=0;s=+h[u>>3]/1.1;h[u>>3]=s;k=+h[z>>3];j=+((c[t>>2]|0)>>>0)*.5;f=+h[v>>3];i=+h[w>>3];g=(+h[y>>3]-+((c[x>>2]|0)>>>0)*.5)*.10000000000000009;if(!(c[A>>2]|0))h[z>>3]=k-(+h[e>>3]-j)*.10000000000000009/(s*i);else{h[z>>3]=k+g/(s*f);g=(+h[e>>3]-j)*.10000000000000009;f=i}h[B>>3]=+h[B>>3]-g/(s*f);r=13;break}default:{}}if((r|0)==13)a[b+537>>0]=1;B=b+560|0;c[B>>2]=c[e>>2];c[B+4>>2]=c[e+4>>2];c[B+8>>2]=c[e+8>>2];c[B+12>>2]=c[e+12>>2];l=C;return}function HS(b,c,d){b=b|0;c=c|0;d=d|0;a[b+538>>0]=0;a[b+541>>0]=0;return}function IS(b,d){b=b|0;d=d|0;var e=0.0,f=0,g=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0.0;n=l;l=l+16|0;f=n;m=b+560|0;e=(+h[d>>3]-+h[m>>3])/+h[b+520>>3];g=(+h[d+8>>3]-+h[b+568>>3])/+h[b+528>>3];if(!(+F(+e)<.0001?+F(+g)<.0001:0)){switch(a[b+541>>0]|0){case 0:{c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];OS(b,f);break}case 2:{f=b+336|0;o=+h[b+352>>3];j=+h[f>>3];i=e/o;k=b+344|0;e=g/o;g=+h[k>>3];if(!(c[b+360>>2]|0)){h[f>>3]=j-i;e=g-e}else{h[f>>3]=j-e;e=i+g}h[k>>3]=e;a[b+537>>0]=1;break}default:{}}c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2]}l=n;return}function JS(a,b,c){a=a|0;b=b|0;c=c|0;return}function KS(a){a=a|0;return}function LS(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=c[b>>2]|0;if(d){d=f4(d,139124)|0;if(d|0){i=hF(d,0)|0;l4(d)|0;f=5}}else{i=hF(c[15808]|0,0)|0;f=5}if((f|0)==5?i|0:0){g=j+168|0;d=c[g>>2]|0;if(d|0){f=c[j+172>>2]|0;if((f|0)!=0?(h=c[f+4>>2]|0,(h|0)!=0):0){db[h&127](d);d=c[g>>2]|0}tK(d);pB(c[g>>2]|0)|0}WC(i,0,137786,280,1);WC(i,1,137750,304,1);WC(i,2,137763,176,1);c[g>>2]=i;c[(c[i+16>>2]|0)+144>>2]=j;if((lG(j,i,e)|0)!=-1){c[b+580>>2]=0;c[b+576>>2]=0;a[b+537>>0]=1}}return}function MS(a,b){a=a|0;b=b|0;a=c[a>>2]|0;lG(a,c[a+168>>2]|0,b)|0;return}function NS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=c[a>>2]|0;f=g+160|0;e=c[f>>2]|0;if((e|0)!=0?(c[g+164>>2]|0)==0:0){i=g+192|0;h=c[i>>2]|0;c[f>>2]=0;c[i>>2]=0;f=h}else{f=0;e=0}nG(g,c[g+168>>2]|0,b,d)|0;if(e|0){i=c[a>>2]|0;c[i+160>>2]=e;c[i+192>>2]=f}return}function OS(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0.0,j=0.0,k=0.0,m=0;f=l;l=l+80|0;e=f+48|0;g=f;m=f+32|0;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];PS(m,b,e);k=+h[m>>3];j=+h[m+8>>3];i=1.0/+h[b+352>>3];h[g+16>>3]=k+i;h[g+24>>3]=j+i;h[g>>3]=k-i;h[g+8>>3]=j-i;d=c[(c[b>>2]|0)+168>>2]|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];c[e+16>>2]=c[g+16>>2];c[e+20>>2]=c[g+20>>2];c[e+24>>2]=c[g+24>>2];c[e+28>>2]=c[g+28>>2];d=QS(d,e)|0;e=b+576|0;if((d|0)!=(c[e>>2]|0)){RS(b);c[e>>2]=d;SS(b);a[b+537>>0]=1}l=f;return}function PS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0.0;e=+h[b+352>>3];g=+h[d>>3];i=e*+h[b+520>>3];e=+h[d+8>>3]/(e*+h[b+528>>3]);if(!(c[b+360>>2]|0))f=g/i;else{f=e;e=-g/i}i=e-+h[b+512>>3];h[a>>3]=f-+h[b+504>>3];h[a+8>>3]=i;return}function QS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g;e=gC(a)|0;a:while(1){if(!e){e=9;break}d=UA(a,e)|0;while(1){if(!d)break;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[b+16>>2];c[f+20>>2]=c[b+20>>2];c[f+24>>2]=c[b+24>>2];c[f+28>>2]=c[b+28>>2];if((hQ(d,f)|0)<<24>>24){e=6;break a}d=WA(a,d)|0}e=hC(a,e)|0}do if((e|0)!=6)if((e|0)==9){d=iC(a)|0;while(1){if(!d)break;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[b+16>>2];c[f+20>>2]=c[b+20>>2];c[f+24>>2]=c[b+24>>2];c[f+28>>2]=c[b+28>>2];if((eQ(d,f)|0)<<24>>24){e=12;break}d=jC(a,d)|0}if((e|0)==12)break;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[b+16>>2];c[f+20>>2]=c[b+20>>2];c[f+24>>2]=c[b+24>>2];c[f+28>>2]=c[b+28>>2];d=TS(a,f)|0;if(!d){d=a;break}else break}while(0);l=g;return d|0}function RS(b){b=b|0;var d=0;d=c[b+576>>2]|0;a:do if(d|0)switch(FC(d)|0){case 0:{d=(c[d+16>>2]|0)+112|0;a[d>>0]=a[d>>0]&-2;break a}case 1:{d=(c[d+16>>2]|0)+117|0;a[d>>0]=a[d>>0]&-2;break a}case 2:{d=(c[d+16>>2]|0)+115|0;a[d>>0]=a[d>>0]&-2;break a}default:break a}while(0);c[b+584>>2]=0;return}function SS(b){b=b|0;var d=0,e=0;e=b+584|0;d=c[e>>2]|0;if(d|0){l6(d);c[e>>2]=0}d=c[b+576>>2]|0;a:do if(d|0)switch(FC(d)|0){case 0:{b=(c[d+16>>2]|0)+112|0;a[b>>0]=a[b>>0]|1;b=DA(d,0,141404,0)|0;if(!b)break a;c[e>>2]=CK(OA(d,b)|0,d)|0;break a}case 1:{b=(c[d+16>>2]|0)+117|0;a[b>>0]=a[b>>0]|1;b=DA(uC(d)|0,1,141404,0)|0;if(!b)break a;c[e>>2]=CK(OA(d,b)|0,d)|0;break a}case 2:{b=(c[d+16>>2]|0)+115|0;a[b>>0]=a[b>>0]|1;b=DA(uC(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)|0,2,141404,0)|0;if(!b)break a;c[e>>2]=CK(OA(d,b)|0,d)|0;break a}default:break a}while(0);return}function TS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0;m=l;l=l+32|0;e=m;g=c[a+16>>2]|0;i=c[g+180>>2]|0;j=g+184|0;d=1;while(1){if((d|0)>(i|0)){k=4;break}f=c[(c[j>>2]|0)+(d<<2)>>2]|0;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];c[e+16>>2]=c[b+16>>2];c[e+20>>2]=c[b+20>>2];c[e+24>>2]=c[b+24>>2];c[e+28>>2]=c[b+28>>2];f=TS(f,e)|0;if(!f)d=d+1|0;else{a=f;break}}do if((k|0)==4){o=+h[g+24>>3];n=+h[g+40>>3];if(((+h[b+16>>3]>=+h[g+16>>3]?+h[g+32>>3]>=+h[b>>3]:0)?+h[b+24>>3]>=o:0)?n>=+h[b+8>>3]:0)break;a=0}while(0);l=m;return a|0}function US(b){b=b|0;var d=0,e=0,f=0;f=b+580|0;d=c[f>>2]|0;a:do if(d|0)switch(FC(d)|0){case 0:{e=(c[d+16>>2]|0)+112|0;a[e>>0]=a[e>>0]&-7|4;break a}case 1:{e=(c[d+16>>2]|0)+117|0;a[e>>0]=a[e>>0]&-7|4;break a}case 2:{e=(c[d+16>>2]|0)+115|0;a[e>>0]=a[e>>0]&-7|4;break a}default:break a}while(0);d=b+588|0;e=c[d>>2]|0;if(e|0){l6(e);c[d>>2]=0}d=c[b+576>>2]|0;c[f>>2]=d;b:do if(d|0)switch(FC(d)|0){case 0:{f=(c[d+16>>2]|0)+112|0;a[f>>0]=a[f>>0]|2;VS(b,d);break b}case 1:{f=(c[d+16>>2]|0)+117|0;a[f>>0]=a[f>>0]|2;WS(b,d);break b}case 2:{f=(c[d+16>>2]|0)+115|0;a[f>>0]=a[f>>0]|2;XS(b,d);break b}default:break b}while(0);return}function VS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=a+592|0;do if((vC(b)|0)==(b|0))if(!(uB(b)|0)){EF(d,0,111795);break}else{EF(d,0,111787);break}else EF(d,0,111801);while(0);EF(d,1,HB(b)|0);c[a+596>>2]=2;f=a+604|0;d=0;e=2;while(1){d=IA(b,0,d)|0;if(!d)break;EF(f,e,c[d+8>>2]|0);EF(f,e+1|0,OA(b,d)|0);EF(f,e+2|0,0);e=e+3|0}c[a+608>>2]=e;d=DA(b,0,141358,0)|0;if(!d){d=DA(b,0,111778,0)|0;if(d|0)g=11}else g=11;if((g|0)==11)c[a+588>>2]=CK(OA(b,d)|0,b)|0;return}function WS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;f=a+592|0;EF(f,0,111782);EF(f,1,HB(b)|0);c[a+596>>2]=2;f=a+604|0;g=vC(uC(b)|0)|0;e=2;d=0;while(1){d=IA(g,1,d)|0;if(!d)break;EF(f,e,c[d+8>>2]|0);EF(f,e|1,OA(b,d)|0);e=e+2|0}c[a+608>>2]=e;d=DA(uC(b)|0,1,141358,0)|0;if(!d){d=DA(uC(b)|0,1,111778,0)|0;if(d|0)h=6}else h=6;if((h|0)==6)c[a+588>>2]=CK(OA(b,d)|0,b)|0;return}function XS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=a+592|0;EF(h,0,111751);k=b+48|0;EF(h,1,HB(c[((c[b>>2]&3|0)==3?b:k)+40>>2]|0)|0);k=(uB(uC(c[((c[b>>2]&3|0)==3?b:k)+40>>2]|0)|0)|0)!=0;EF(h,3,k?138041:142050);k=b+-48|0;EF(h,4,HB(c[((c[b>>2]&3|0)==2?b:k)+40>>2]|0)|0);c[a+596>>2]=7;i=a+604|0;j=vC(uC(c[((c[b>>2]&3|0)==2?b:k)+40>>2]|0)|0)|0;g=7;d=0;a:while(1){while(1){d=IA(j,2,d)|0;if(!d)break a;e=d+8|0;f=c[e>>2]|0;if(!(f2(f,111756)|0)){l=5;break}if(!(f2(f,111765)|0)){l=7;break}if(f2(f,111774)|0)break;EF(h,6,OA(b,d)|0)}if((l|0)==5){l=0;EF(h,2,OA(b,d)|0)}else if((l|0)==7){l=0;EF(h,5,OA(b,d)|0)}EF(i,g,c[e>>2]|0);EF(i,g+1|0,OA(b,d)|0);g=g+2|0}c[a+608>>2]=g;d=DA(uC(c[((c[b>>2]&3|0)==2?b:k)+40>>2]|0)|0,2,141358,0)|0;if(!d){d=DA(uC(c[((c[b>>2]&3|0)==2?b:k)+40>>2]|0)|0,2,111778,0)|0;if(d|0)l=13}else l=13;if((l|0)==13)c[a+588>>2]=CK(OA(b,d)|0,b)|0;return}function YS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=ZS(a,b,c[d>>2]|0)|0;d=c[d+4>>2]|0;while(1){f=c[d+4>>2]|0;if(!f)break;b=0;while(1){e=c[f+(b*20|0)+4>>2]|0;if(!e)break;HF(a,c[d>>2]|0,e,c[f+(b*20|0)+8>>2]|0,g,f+(b*20|0)|0)|0;b=b+1|0}d=d+8|0}return}function ZS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=IK(12)|0;if(!b)b=0;else b=Y3(b)|0;c[e+4>>2]=b;c[e+8>>2]=Y3(d)|0;d=a+100|0;c[e>>2]=c[d>>2];c[d>>2]=e;return e|0}function _S(b,c){b=b|0;c=c|0;$S(b);a[b+44>>0]=0;aT(b)|0;NO(b)|0;return}function $S(b){b=b|0;var d=0,e=0;d=c[b+32>>2]|0;a:do if(d|0)while(1){e=c[d>>2]|0;if(!e)break a;if((a[e>>0]|0)==103?C4(e,111810)|0:0)YS(b,0,c[d+4>>2]|0);d=d+8|0}while(0);return}function aT(a){a=a|0;var b=0;b=JF(a,2,111823)|0;if(!b)a=999;else{c[a+148>>2]=c[(c[b+16>>2]|0)+12>>2];a=300}return a|0}function bT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;a=c[a+148>>2]|0;if((a|0)!=0?(e=c[a>>2]|0,(e|0)!=0):0)a=vb[e&127](b,d)|0;else a=0;return a|0}function cT(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return (c[b>>2]|0)-(c[d>>2]|0)|0}function dT(a){a=a|0;var b=0.0,d=0.0;a=c[a+16>>2]|0;d=+h[a+16>>3];b=+h[a+24>>3];return (eT(~~(d>b?d:b)>>>0)|0)+1|0}function eT(a){a=a|0;var b=0,c=0;if(!a)a=-1;else{b=a>>>0>65535;c=b?a>>>16:a;a=b?16:0;b=c>>>0>255;c=b?c>>>8:c;a=b?a|8:a;b=c>>>0>15;c=b?c>>>4:c;a=b?a|4:a;b=c>>>0>3;a=((b?c>>>2:c)>>>0>1&1)+(b?a|2:a)|0}return a|0}function fT(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+32|0;q=r;p=gT(b,d,e,f,g)|0;e=hT(p)|0;if((e|0)>=0){n=q+16|0;o=q+24|0;m=q+8|0;k=g+32|0;e=0;g=0;while(1){if((g|0)>=(d|0))break;f=b+(g*40|0)+32|0;do if(c[f>>2]|0){iT(q,p,b+(g*40|0)|0);i=+h[n>>3];j=+h[o>>3];if(!(c[q>>2]|0)){a[(c[f>>2]|0)+36>>0]=1;break}if(+h[m>>3]==0.0){f=c[f>>2]|0;h[f+16>>3]=i;h[f+24>>3]=j;a[f+36>>0]=1;break}if((a[k>>0]|0)==1){f=c[f>>2]|0;h[f+16>>3]=i;h[f+24>>3]=j;a[f+36>>0]=1}else e=1}while(0);g=g+1|0}jT(p)}l=r;return e|0}function gT(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=HK(28)|0;j=Sz(25964,c[4594]|0)|0;h=g+20|0;c[h>>2]=j;do if(j){j=RV()|0;c[g+24>>2]=j;if(!j){_3(112041,14,1,c[15715]|0)|0;i=6;break}else{c[g>>2]=a;c[g+4>>2]=b;c[g+8>>2]=d;c[g+12>>2]=e;c[g+16>>2]=f;break}}else{_3(112041,14,1,c[15715]|0)|0;i=6}while(0);if((i|0)==6){a=c[h>>2]|0;if(a|0)Oz(a)|0;a=c[g+24>>2]|0;if(a|0)TV(a)|0;l6(g);g=0}return g|0}function hT(a){a=a|0;var b=0;b=sT(a)|0;if((b|0)>=0){tT(a);uT(a);b=Oz(c[a+20>>2]|0)|0}return b|0}function iT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0.0,j=0,k=0.0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0,O=0;O=l;l=l+464|0;L=O+416|0;N=O+400|0;I=O+384|0;j=O+352|0;n=O+320|0;o=O+288|0;p=O+256|0;r=O+224|0;s=O+192|0;t=O+160|0;u=O+128|0;v=O+96|0;w=O+64|0;x=O+32|0;J=O;y=c[d+32>>2]|0;e=+h[y>>3];B=d+16|0;z=(e*2.0+ +h[B>>3])*.125;C=y+8|0;K=d+24|0;i=+h[K>>3];M=(+h[C>>3]*2.0+i)*.5;if(!y)Aa(111834,111844,445,111854);f=L;g=f+36|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));A=y+16|0;h[A>>3]=+h[d>>3]-e;D=d+8|0;E=y+24|0;h[E>>3]=i+ +h[D>>3];kT(j,b,d,L);m=c[j>>2]|0;f=c[j+4>>2]|0;e=+h[j+8>>3];H=j+16|0;c[N>>2]=c[H>>2];c[N+4>>2]=c[H+4>>2];c[N+8>>2]=c[H+8>>2];c[N+12>>2]=c[H+12>>2];H=a+16|0;G=a+8|0;F=a+4|0;a:do if(!m){c[a>>2]=0;c[F>>2]=f;h[G>>3]=e;c[H>>2]=c[N>>2];c[H+4>>2]=c[N+4>>2];c[H+8>>2]=c[N+8>>2];c[H+12>>2]=c[N+12>>2]}else{h[E>>3]=+h[D>>3];kT(n,b,d,L);g=c[n>>2]|0;j=c[n+4>>2]|0;i=+h[n+8>>3];n=n+16|0;c[I>>2]=c[n>>2];c[I+4>>2]=c[n+4>>2];c[I+8>>2]=c[n+8>>2];c[I+12>>2]=c[n+12>>2];if(!g){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];f=j;e=i}else g=m;h[E>>3]=+h[D>>3]-+h[C>>3];kT(o,b,d,L);m=c[o>>2]|0;j=c[o+4>>2]|0;i=+h[o+8>>3];o=o+16|0;c[I>>2]=c[o>>2];c[I+4>>2]=c[o+4>>2];c[I+8>>2]=c[o+8>>2];c[I+12>>2]=c[o+12>>2];if(!m){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];f=j;e=i}else m=g;h[A>>3]=+h[d>>3];h[E>>3]=+h[D>>3]+ +h[K>>3];kT(p,b,d,L);g=c[p>>2]|0;j=c[p+4>>2]|0;i=+h[p+8>>3];p=p+16|0;c[I>>2]=c[p>>2];c[I+4>>2]=c[p+4>>2];c[I+8>>2]=c[p+8>>2];c[I+12>>2]=c[p+12>>2];if(!g){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];m=g;f=j;e=i}h[E>>3]=+h[D>>3]-+h[C>>3];kT(r,b,d,L);g=c[r>>2]|0;j=c[r+4>>2]|0;i=+h[r+8>>3];r=r+16|0;c[I>>2]=c[r>>2];c[I+4>>2]=c[r+4>>2];c[I+8>>2]=c[r+8>>2];c[I+12>>2]=c[r+12>>2];if(!g){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];m=g;f=j;e=i}h[A>>3]=+h[d>>3]+ +h[B>>3];h[E>>3]=+h[D>>3]+ +h[K>>3];kT(s,b,d,L);g=c[s>>2]|0;j=c[s+4>>2]|0;i=+h[s+8>>3];s=s+16|0;c[I>>2]=c[s>>2];c[I+4>>2]=c[s+4>>2];c[I+8>>2]=c[s+8>>2];c[I+12>>2]=c[s+12>>2];if(!g){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];m=g;f=j;e=i}h[E>>3]=+h[D>>3];kT(t,b,d,L);g=c[t>>2]|0;j=c[t+4>>2]|0;i=+h[t+8>>3];t=t+16|0;c[I>>2]=c[t>>2];c[I+4>>2]=c[t+4>>2];c[I+8>>2]=c[t+8>>2];c[I+12>>2]=c[t+12>>2];if(!g){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];m=g;f=j;e=i}h[E>>3]=+h[D>>3]-+h[C>>3];kT(u,b,d,L);g=c[u>>2]|0;j=c[u+4>>2]|0;i=+h[u+8>>3];u=u+16|0;c[I>>2]=c[u>>2];c[I+4>>2]=c[u+4>>2];c[I+8>>2]=c[u+8>>2];c[I+12>>2]=c[u+12>>2];if(!g){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];f=j;e=i}else g=m;t=L+12|0;u=L+32|0;n=(c[L+28>>2]|0)!=0;o=(c[u>>2]|0)==0;j=c[t>>2]|0;m=c[L>>2]|0;do if(!(o&(((c[L+24>>2]|0)!=0|n)^1)&(j|0)==0&(m|0)==0)){do if(o&(n^1)){h[A>>3]=+h[d>>3]-+h[y>>3];p=v+4|0;r=v+8|0;s=v+16|0;m=E;j=D;i=+h[K>>3];b:while(1){while(1){h[m>>3]=i+ +h[j>>3];if(!(+h[A>>3]<=+h[d>>3]+ +h[B>>3])){n=42;break b}kT(v,b,d,L);n=c[v>>2]|0;o=c[p>>2]|0;k=+h[r>>3];c[I>>2]=c[s>>2];c[I+4>>2]=c[s+4>>2];c[I+8>>2]=c[s+8>>2];c[I+12>>2]=c[s+12>>2];if(!n){n=39;break b}if(k>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];m=A;j=A;i=z;g=n;f=o;e=k}if((n|0)==39){c[a>>2]=0;c[F>>2]=o;h[G>>3]=k;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break a}else if((n|0)==42){j=c[t>>2]|0;m=c[L>>2]|0;break}}while(0);if(!((j|0)==0&(m|0)==0))break;h[A>>3]=+h[d>>3]-+h[y>>3];k=+h[D>>3];n=w+4|0;o=w+8|0;p=w+16|0;i=k;k=k+ +h[K>>3];while(1){h[E>>3]=k;if(!(k>=i-+h[C>>3])){n=51;break}kT(w,b,d,L);j=c[w>>2]|0;m=c[n>>2]|0;i=+h[o>>3];c[I>>2]=c[p>>2];c[I+4>>2]=c[p+4>>2];c[I+8>>2]=c[p+8>>2];c[I+12>>2]=c[p+12>>2];if(!j){n=47;break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];g=j;f=m;e=i}i=+h[D>>3];k=+h[E>>3]-M}if((n|0)==47){c[a>>2]=0;c[F>>2]=m;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break a}else if((n|0)==51){m=c[L>>2]|0;break}}else m=0;while(0);i=+h[d>>3];k=i+ +h[B>>3];h[A>>3]=k;q=+h[C>>3];h[E>>3]=+h[D>>3]-q;t=L+20|0;o=(c[L+4>>2]|0)!=0;n=(m|0)==0;m=c[t>>2]|0;j=c[u>>2]|0;c:do if(!(n&(((c[L+8>>2]|0)!=0|o)^1)&(m|0)==0&(j|0)==0)){do if(n&(o^1)){h[A>>3]=k;p=x+4|0;r=x+8|0;s=x+16|0;m=E;j=D;i=q;d:while(1){while(1){h[m>>3]=+h[j>>3]-i;i=+h[d>>3];if(!(+h[A>>3]>=i-+h[y>>3])){n=61;break d}kT(x,b,d,L);n=c[x>>2]|0;o=c[p>>2]|0;k=+h[r>>3];c[I>>2]=c[s>>2];c[I+4>>2]=c[s+4>>2];c[I+8>>2]=c[s+8>>2];c[I+12>>2]=c[s+12>>2];if(!n){n=58;break d}if(k>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];m=A;j=A;i=z;g=n;f=o;e=k}if((n|0)==58){c[a>>2]=0;c[F>>2]=o;h[G>>3]=k;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break a}else if((n|0)==61){m=c[t>>2]|0;j=c[u>>2]|0;break}}while(0);if(!((m|0)==0&(j|0)==0))break;h[A>>3]=i+ +h[B>>3];i=+h[D>>3];n=J+4|0;o=J+8|0;p=J+16|0;k=i;i=i-+h[C>>3];while(1){h[E>>3]=i;if(!(i<=k+ +h[K>>3]))break c;kT(J,b,d,L);j=c[J>>2]|0;m=c[n>>2]|0;i=+h[o>>3];c[I>>2]=c[p>>2];c[I+4>>2]=c[p+4>>2];c[I+8>>2]=c[p+8>>2];c[I+12>>2]=c[p+12>>2];if(!j)break;if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];g=j;f=m;e=i}k=+h[D>>3];i=M+ +h[E>>3]}c[a>>2]=0;c[F>>2]=m;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break a}while(0);c[a>>2]=g;c[F>>2]=f;h[G>>3]=e;c[H>>2]=c[N>>2];c[H+4>>2]=c[N+4>>2];c[H+8>>2]=c[N+8>>2];c[H+12>>2]=c[N+12>>2]}while(0);l=O;return}function jT(a){a=a|0;TV(c[a+24>>2]|0)|0;l6(a);return}function kT(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0.0,j=0,k=0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0;t=l;l=l+48|0;q=t+32|0;s=t+16|0;p=t;g=c[e+32>>2]|0;if(!g)Aa(111834,111844,382,111863);o=g+16|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];o=d+4|0;m=0;g=0;while(1){if((m|0)>=(c[o>>2]|0))break;j=c[d>>2]|0;k=j+(m*40|0)|0;do if((k|0)!=(e|0)){if(+h[j+(m*40|0)+16>>3]>0.0?+h[j+(m*40|0)+24>>3]>0.0:0)break;g=((lT(e,k)|0)!=0&1)+g|0}while(0);m=m+1|0}mT(e,q);m=c[d+24>>2]|0;m=VV(m,c[m>>2]|0,q)|0;if(!m){c[b>>2]=g;h[b+8>>3]=0.0;s=b+16|0;c[s>>2]=c[p>>2];c[s+4>>2]=c[p+4>>2];c[s+8>>2]=c[p+8>>2];c[s+12>>2]=c[p+12>>2]}else{k=m;i=0.0;while(1){if(!k)break;j=c[(c[k+4>>2]|0)+16>>2]|0;if((j|0)!=(e|0)){nT(j,s);n=+oT(q,s);if(n>0.0){g=g+1|0;i=i+ +pT(e,j,q,n,f)}d=c[j+32>>2]|0;if(((d|0)!=0?(a[d+36>>0]|0)!=0:0)?(mT(j,s),r=+oT(q,s),r>0.0):0){g=g+1|0;i=i+ +qT(e,j,q,r,f)}}k=c[k>>2]|0}QV(m);c[b>>2]=g;h[b+8>>3]=i;s=b+16|0;c[s>>2]=c[p>>2];c[s+4>>2]=c[p+4>>2];c[s+8>>2]=c[p+8>>2];c[s+12>>2]=c[p+12>>2]}l=t;return}function lT(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,g=0.0;a=c[a+32>>2]|0;if(+h[b+16>>3]==0.0?+h[b+24>>3]==0.0:0){if(!a)a=0;else{g=+h[b>>3];f=+h[a+16>>3];if((g>f?g>3]:0)?(d=+h[b+8>>3],e=+h[a+24>>3],d>e):0)a=d>3];else a=0;a=a&1}return a|0}Aa(111900,111844,219,111937);return 0}function mT(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;a=c[a+32>>2]|0;e=+h[a+16>>3];c[b>>2]=~~e;d=+h[a+24>>3];c[b+4>>2]=~~d;c[b+8>>2]=~~(e+ +h[a>>3]);c[b+12>>2]=~~(d+ +h[a+8>>3]);return}function nT(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;e=+h[a>>3];c[b>>2]=~~e;d=+h[a+8>>3];c[b+4>>2]=~~d;c[b+8>>2]=~~(e+ +h[a+16>>3]);c[b+12>>2]=~~(d+ +h[a+24>>3]);return}function oT(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=c[a+8>>2]|0;j=c[b>>2]|0;if((((i|0)>=(j|0)?(k=c[a>>2]|0,l=c[b+8>>2]|0,(k|0)<=(l|0)):0)?(e=c[a+12>>2]|0,f=c[b+4>>2]|0,(e|0)>=(f|0)):0)?(g=c[a+4>>2]|0,h=c[b+12>>2]|0,(g|0)<=(h|0)):0)d=(+(c[((i|0)<(l|0)?a:b)+8>>2]|0)-+(c[((k|0)>(j|0)?a:b)>>2]|0))*(+(c[((e|0)<(h|0)?a:b)+12>>2]|0)-+(c[((g|0)>(f|0)?a:b)+4>>2]|0));else d=0.0;return +d}function pT(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;var g=0.0,h=0.0,i=0,j=0;j=l;l=l+16|0;i=j;a=rT(a,b)|0;f=f+(((a|0)<0?5:a)<<2)|0;a=c[f>>2]|0;if(!a){c[f>>2]=b;g=e}else{nT(a,i);g=+oT(d,i);g=g>e?g:0.0;a=c[f>>2]|0;if((c[a+32>>2]|0)!=0?(mT(a,i),h=+oT(d,i),h>e):0)g=h>g?h:g;if(!(g>0.0)){c[f>>2]=b;g=e}}l=j;return +g}function qT(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;var g=0.0,h=0.0,i=0,j=0;j=l;l=l+16|0;i=j;a=rT(a,b)|0;f=f+(((a|0)<0?5:a)<<2)|0;a=c[f>>2]|0;if(!a){c[f>>2]=b;g=e}else{nT(a,i);g=+oT(d,i);g=g>e?g:0.0;a=c[f>>2]|0;if((c[a+32>>2]|0)!=0?(mT(a,i),h=+oT(d,i),h>e):0)g=h>g?h:g;if(!(g>0.0)){c[f>>2]=b;g=e}}l=j;return +g}function rT(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0;e=c[b+32>>2]|0;f=c[d+32>>2]|0;if((e|0)==(f|0))Aa(111879,111844,276,111889);do if((a[e+36>>0]|0)!=0?(a[f+36>>0]|0)!=0:0){k=+h[b>>3];e=b+8|0;if(k==0.0?+h[e>>3]==0.0:0){e=-1;break}i=+h[d>>3];j=+h[d+8>>3];if(!(i==0.0&j==0.0)){g=+h[e>>3];f=ik;if(jg))return (f|e^1?(f?3:-1):5)|0;if(f)e=6;else e=e?8:7}else e=-1}else e=-1;while(0);return e|0}function sT(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;k=l;l=l+32|0;d=k+24|0;e=k+16|0;f=k;g=dT(a)|0;h=a+4|0;i=e+4|0;j=a+20|0;b=0;while(1){if((b|0)>=(c[h>>2]|0)){b=0;break}m=HK(32)|0;o=(c[a>>2]|0)+(b*40|0)|0;n=m+12|0;c[m+28>>2]=o;vT(f,o);c[n>>2]=c[f>>2];c[n+4>>2]=c[f+4>>2];c[n+8>>2]=c[f+8>>2];c[n+12>>2]=c[f+12>>2];n=c[n>>2]|0;c[e>>2]=(((c[m+20>>2]|0)-n|0)/2|0)+n;n=c[m+16>>2]|0;c[i>>2]=(((c[m+24>>2]|0)-n|0)/2|0)+n;c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[m+8>>2]=wT(d,g)|0;n=c[j>>2]|0;if(!(eb[c[n>>2]&63](n,m,1)|0)){b=-1;break}else b=b+1|0}l=k;return b|0}function tT(a){a=a|0;var b=0,d=0,e=0;d=a+20|0;e=c[d>>2]|0;b=a+24|0;a=eb[c[e>>2]&63](e,0,128)|0;while(1){if(!a)break;e=c[b>>2]|0;WV(e,a+12|0,c[a+28>>2]|0,e,0)|0;e=c[d>>2]|0;a=eb[c[e>>2]&63](e,a,8)|0}return}function uT(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;e=a+20|0;f=Uz(c[e>>2]|0)|0;d=0;while(1){if(!(Uz(c[e>>2]|0)|0))break;g=c[e>>2]|0;a=c[(c[g+8>>2]|0)+4>>2]|0;if(!a){h=8;break}b=c[(c[g+4>>2]|0)+8>>2]|0;if((b|0)<0)a=c[a+8>>2]|0;else a=a+(0-b)|0;if(!a){h=8;break}eb[c[g>>2]&63](g,a,4096)|0;l6(a);d=d+1|0}if((h|0)==8)Aa(111950,111844,616,111953);if((f|0)==(d|0))return;else Aa(111965,111844,623,111953)}function vT(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0.0,i=0,j=0,k=0,l=0.0;d=c[b+32>>2]|0;if(!d){e=0.0;f=0.0}else{e=+h[d>>3];f=+h[d+8>>3]}l=+h[b>>3];k=~~+E(+(l-e));g=+h[b+8>>3];j=~~+E(+(g-f));i=~~+R(+(e+(l+ +h[b+16>>3])));if((i|0)==2147483647)Aa(111977,111844,264,112004);d=~~+R(+(f+(g+ +h[b+24>>3])));if((d|0)==2147483647)Aa(112014,111844,266,112004);else{c[a>>2]=k;c[a+4>>2]=j;c[a+8>>2]=i;c[a+12>>2]=d;return}}function wT(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;f=0;e=c[a>>2]|0;d=c[a+4>>2]|0;while(1){a=b+-1|0;if((b|0)<=0)break;i=e>>>a&1;b=d>>>a&1;g=b+-1|0;h=g&(e^d);g=g&0-i;f=i<<1|f<<2|i^b;b=a;e=h^e^g;d=h^d^g}return f|0}function xT(b){b=b|0;var d=0,e=0,f=0,g=0;d=D3(b)|0;if(d>>>0>=(c[47436]|0)>>>0){d=d+11|0;c[47436]=d;d=KK(c[47437]|0,d)|0;c[47437]=d;if(!d)d=0;else e=4}else{d=c[47437]|0;e=4}if((e|0)==4){g=d;while(1){e=a[b>>0]|0;if(!(e<<24>>24))break;f=e&255;if(S1(f)|0)e=(R1(f)|0)&255;a[g>>0]=e;g=g+1|0;b=b+1|0}a[g>>0]=0}return d|0}function yT(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,i=0.0,j=0.0,k=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0;N=l;l=l+144|0;s=N+96|0;q=N+80|0;v=N+124|0;t=N+72|0;w=N+64|0;x=N+56|0;K=N+48|0;L=N+40|0;M=N+32|0;G=N+24|0;H=N+16|0;I=N+8|0;J=N;k=N+120|0;n=N+116|0;o=N+112|0;p=N+108|0;c[e+32>>2]=f;while(1)if((a[b>>0]|0)==32)b=b+1|0;else break;c[p>>2]=255;g=a[b>>0]|0;y=e+12|0;z=e+8|0;A=e+4|0;B=e+24|0;C=e+16|0;D=e+1|0;E=e+2|0;F=e+3|0;a:do if(g<<24>>24==35){c[q>>2]=k;c[q+4>>2]=n;c[q+8>>2]=o;c[q+12>>2]=p;if((q4(b,112056,q)|0)<=2){g=a[b>>0]|0;r=12;break}switch(f|0){case 0:{O=+((c[k>>2]|0)>>>0)/255.0;h[K>>3]=O;i=+((c[n>>2]|0)>>>0)/255.0;h[L>>3]=i;j=+((c[o>>2]|0)>>>0)/255.0;h[M>>3]=j;m=+((c[p>>2]|0)>>>0)/255.0;zT(O,i,j,t,w,x);h[e>>3]=+h[t>>3];h[z>>3]=+h[w>>3];h[C>>3]=+h[x>>3];h[B>>3]=m;b=0;break a}case 1:{a[e>>0]=c[k>>2];a[D>>0]=c[n>>2];a[E>>0]=c[o>>2];a[F>>0]=c[p>>2];b=0;break a}case 3:{j=+((c[k>>2]|0)>>>0)/255.0;h[K>>3]=j;m=+((c[n>>2]|0)>>>0)/255.0;h[L>>3]=m;O=+((c[o>>2]|0)>>>0)/255.0;h[M>>3]=O;AT(j,m,O,G,H,I,J);a[e>>0]=~~+h[G>>3]*255;a[D>>0]=~~+h[H>>3]*255;a[E>>0]=~~+h[I>>3]*255;a[F>>0]=~~+h[J>>3]*255;b=0;break a}case 2:{c[e>>2]=(((c[k>>2]|0)*65535|0)>>>0)/255|0;c[A>>2]=(((c[n>>2]|0)*65535|0)>>>0)/255|0;c[z>>2]=(((c[o>>2]|0)*65535|0)>>>0)/255|0;c[y>>2]=(((c[p>>2]|0)*65535|0)>>>0)/255|0;b=0;break a}case 4:{h[e>>3]=+((c[k>>2]|0)>>>0)/255.0;h[z>>3]=+((c[n>>2]|0)>>>0)/255.0;h[C>>3]=+((c[o>>2]|0)>>>0)/255.0;h[B>>3]=+((c[p>>2]|0)>>>0)/255.0;b=0;break a}default:{b=0;break a}}}else r=12;while(0);b:do if((r|0)==12){if(!(g<<24>>24!=46?((g&255)+-48|0)>>>0>=10:0)){g=D3(b)|0;if(g>>>0>=(c[47438]|0)>>>0){g=g+11|0;c[47438]=g;g=KK(c[47439]|0,g)|0;c[47439]=g;if(!g){b=-1;break}}else g=c[47439]|0;n=g;k=b;c:while(1){o=k+1|0;k=a[k>>0]|0;switch(k<<24>>24){case 0:break c;case 44:{k=32;break}default:{}}a[n>>0]=k;n=n+1|0;k=o}a[n>>0]=0;c[s>>2]=t;c[s+4>>2]=w;c[s+8>>2]=x;if((q4(g,112070,s)|0)==3){m=+h[t>>3];m=m<1.0?m:1.0;m=m>0.0?m:0.0;h[t>>3]=m;j=+h[w>>3];j=j<1.0?j:1.0;j=j>0.0?j:0.0;h[w>>3]=j;i=+h[x>>3];i=i<1.0?i:1.0;i=i>0.0?i:0.0;h[x>>3]=i;switch(f|0){case 0:{h[e>>3]=m;h[z>>3]=j;h[C>>3]=i;h[B>>3]=1.0;b=0;break b}case 1:{BT(m,j,i,K,L,M);a[e>>0]=~~(+h[K>>3]*255.0);a[D>>0]=~~(+h[L>>3]*255.0);a[E>>0]=~~(+h[M>>3]*255.0);a[F>>0]=-1;b=0;break b}case 3:{BT(m,j,i,K,L,M);AT(+h[K>>3],+h[L>>3],+h[M>>3],G,H,I,J);a[e>>0]=~~+h[G>>3]*255;a[D>>0]=~~+h[H>>3]*255;a[E>>0]=~~+h[I>>3]*255;a[F>>0]=~~+h[J>>3]*255;b=0;break b}case 2:{BT(m,j,i,K,L,M);c[e>>2]=~~(+h[K>>3]*65535.0);c[A>>2]=~~(+h[L>>3]*65535.0);c[z>>2]=~~(+h[M>>3]*65535.0);c[y>>2]=65535;b=0;break b}case 4:{BT(m,j,i,K,L,M);h[e>>3]=+h[K>>3];h[z>>3]=+h[L>>3];h[C>>3]=+h[M>>3];h[B>>3]=1.0;b=0;break b}default:{b=0;break b}}}}b=CT(b)|0;c[v>>2]=b;if(!b)b=-1;else{g=c[47440]|0;if(((g|0)!=0?(u=c[g>>2]|0,(a[u>>0]|0)==(a[b>>0]|0)):0)?(f2(u,b)|0)==0:0)k=g;else{b=e6(v,26e3,2491,12,103)|0;c[47440]=b;if(!b)switch(f|0){case 0:{c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;h[B>>3]=1.0;b=1;break b}case 1:{a[E>>0]=0;a[D>>0]=0;a[e>>0]=0;a[F>>0]=-1;b=1;break b}case 3:{c[e>>2]=0;b=1;break b}case 2:{c[z>>2]=0;c[A>>2]=0;c[e>>2]=0;c[y>>2]=65535;b=1;break b}case 4:{c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;h[B>>3]=1.0;b=1;break b}default:{b=1;break b}}else{k=b;g=b}}b=k+7|0;switch(f|0){case 0:{h[e>>3]=+(d[k+4>>0]|0)/255.0;h[z>>3]=+(d[k+5>>0]|0)/255.0;h[C>>3]=+(d[k+6>>0]|0)/255.0;h[B>>3]=+(d[k+10>>0]|0)/255.0;b=0;break b}case 1:{a[e>>0]=a[b>>0]|0;a[D>>0]=a[g+8>>0]|0;a[E>>0]=a[g+9>>0]|0;a[F>>0]=a[g+10>>0]|0;b=0;break b}case 3:{j=+(d[b>>0]|0)/255.0;h[K>>3]=j;m=+(d[g+8>>0]|0)/255.0;h[L>>3]=m;O=+(d[g+9>>0]|0)/255.0;h[M>>3]=O;AT(j,m,O,G,H,I,J);a[e>>0]=~~+h[G>>3]*255;a[D>>0]=~~+h[H>>3]*255;a[E>>0]=~~+h[I>>3]*255;a[F>>0]=~~+h[J>>3]*255;b=0;break b}case 2:{c[e>>2]=(d[b>>0]|0)*257;c[A>>2]=(d[g+8>>0]|0)*257;c[z>>2]=(d[g+9>>0]|0)*257;c[y>>2]=(d[g+10>>0]|0)*257;b=0;break b}case 4:{h[e>>3]=+(d[b>>0]|0)/255.0;h[z>>3]=+(d[g+8>>0]|0)/255.0;h[C>>3]=+(d[g+9>>0]|0)/255.0;h[B>>3]=+(d[g+10>>0]|0)/255.0;b=0;break b}default:{b=0;break b}}}}while(0);l=N;return b|0}function zT(a,b,c,d,e,f){a=+a;b=+b;c=+c;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0.0,k=0.0,l=0.0;g=bc?b:c;l=la?a:g);k=l>0.0?g/l:0.0;if(k>0.0){i=(l-a)/g;j=(l-b)/g;g=(l-c)/g;do if(!(l==a)){if(l==b){g=i+2.0-g;break}if(l==c)g=j+4.0-i;else g=0.0}else g=g-j;while(0);g=g*60.0;if(g<0.0)g=g+360.0}else g=0.0;h[d>>3]=g/360.0;h[f>>3]=l;h[e>>3]=k;return}function AT(a,b,c,d,e,f,g){a=+a;b=+b;c=+c;d=d|0;e=e|0;f=f|0;g=g|0;h[d>>3]=1.0-a;h[e>>3]=1.0-b;h[f>>3]=1.0-c;b=+h[d>>3];c=+h[e>>3];c=b>3]=c;b=+h[f>>3];c=b>3]=c;h[d>>3]=+h[d>>3]-c;h[e>>3]=+h[e>>3]-+h[g>>3];h[f>>3]=+h[f>>3]-+h[g>>3];return}function BT(a,b,c,d,e,f){a=+a;b=+b;c=+c;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0.0,k=0,l=0;a:do if(!(b<=0.0)){i=!(a>=1.0)?a*6.0:0.0;l=~~i;i=i-+(l|0);a=(1.0-b)*c;j=(1.0-i*b)*c;b=(1.0-(1.0-i)*b)*c;switch(l|0){case 0:{g=a;i=b;a=c;k=8;break a}case 1:{g=a;i=c;a=j;k=8;break a}case 2:{g=b;i=c;k=8;break a}case 3:{g=c;i=j;k=8;break a}case 4:{g=c;i=a;a=b;k=8;break a}case 5:{g=j;i=a;a=c;k=8;break a}default:break a}}else{g=c;i=c;a=c;k=8}while(0);if((k|0)==8){h[d>>3]=a;h[e>>3]=i;h[f>>3]=g}return}function CT(b){b=b|0;var d=0,e=0;d=a[b>>0]|0;if(((d<<24>>24!=98?(e=b+1|0,!(d<<24>>24==119|(h2(e,137567,4)|0)==0)):0)?!(d<<24>>24==108|(h2(e,137572,4)|0)==0):0)?(h2(e,137577,8)|0)!=0:0){do if(d<<24>>24==47){d=F3(e,47)|0;if(d){if((a[e>>0]|0)!=47){e=(N3(137586,e,4)|0)==0;b=e?d+1|0:b;break}d=c[47441]|0;b=b+2|0;if(((d|0)!=0?(a[d>>0]|0)!=0:0)?(N3(137586,d,3)|0)!=0:0)b=ET(d,b)|0}else b=e}else{d=c[47441]|0;if(((d|0)!=0?(a[d>>0]|0)!=0:0)?(N3(137586,d,3)|0)!=0:0)b=ET(d,b)|0}while(0);b=xT(b)|0}return b|0}function DT(a,b){a=a|0;b=b|0;return C3(c[a>>2]|0,c[b>>2]|0)|0}function ET(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+16|0;e=f;g=D3(a)|0;g=(D3(b)|0)+g|0;d=g+13|0;if((g+3|0)>>>0<(c[47442]|0)>>>0)d=c[47443]|0;else{c[47442]=d;d=KK(c[47443]|0,d)|0;c[47443]=d}c[e>>2]=a;c[e+4>>2]=b;i2(d,137591,e)|0;l=f;return c[47443]|0}function FT(a){a=a|0;c[47441]=a;return}function GT(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0,g=0;f=l;l=l+208|0;g=f;HT(g,+h[a>>3],+h[a+8>>3],b,c,d,e);a=IT(g)|0;l=f;return a|0}function HT(a,b,c,d,e,f,g){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;g=+g;var i=0,j=0;h[a>>3]=b;h[a+8>>3]=c;j=a+16|0;h[j>>3]=d;i=a+24|0;h[i>>3]=e;h[a+32>>3]=0.0;c=+O(+(+J(+f)/e),+(+I(+f)/d));h[a+56>>3]=c;e=+O(+(+J(+g)/e),+(+I(+g)/d));h[a+40>>3]=1.0;h[a+48>>3]=0.0;e=e-+E(+((e-c)/6.283185307179586))*6.283185307179586;h[a+64>>3]=g-f>3.141592653589793&e-c<3.141592653589793?e+6.283185307179586:e;OT(a);PT(a);QT(a);g=+h[j>>3];g=(g-+h[i>>3])/g;h[a+168>>3]=g;h[a+176>>3]=g*(2.0-g);g=1.0-g;h[a+184>>3]=g;h[a+192>>3]=g*g;return}function IT(a){a=a|0;var b=0,c=0.0,d=0,e=0.0,f=0.0,g=0.0,i=0.0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0;q=HK(8)|0;f=+h[a+56>>3];e=+h[a+64>>3]-f;p=1;b=0;while(1){o=e/+(p|0);if(!(b<<24>>24==0&(p|0)<1024))break;a:do if(!(o<=1.5707963267948966))b=0;else{c=f;d=0;b=1;while(1){if(!(b<<24>>24!=0&(d|0)<(p|0)))break a;n=o+c;b=+JT(a,c,n)<=1.0e-05&1;c=n;d=d+1|0}}while(0);p=p<<1}c=+I(+f);u=+J(+f);d=a+16|0;s=+h[d>>3];g=c*s;j=a+24|0;r=+h[j>>3];v=u*r;r=c*r;c=+h[a>>3];k=a+40|0;t=+h[k>>3];l=a+48|0;i=+h[l>>3];e=c+g*t-v*i;m=a+8|0;n=+h[m>>3];g=v*t+(n+g*i);s=-(u*s);KT(q,c,n);LT(q,e,g);n=+K(+(o*.5));n=+J(+o)*(+G(+(n*(n*3.0)+4.0))+-1.0)/3.0;c=f;f=g;g=r*t+i*s;i=t*s-r*i;b=0;while(1){if((b|0)>=(p|0))break;r=o+c;x=+I(+r);v=+J(+r);u=+h[d>>3];t=x*u;y=+h[j>>3];z=v*y;y=x*y;x=+h[k>>3];w=+h[l>>3];s=+h[a>>3]+t*x-z*w;t=z*x+(+h[m>>3]+t*w);u=-(v*u);v=x*u-y*w;u=y*x+w*u;MT(q,n*i+e,f+n*g,s-n*v,t-n*u,s,t);c=r;e=s;f=t;g=u;i=v;b=b+1|0}NT(q);return q|0}function JT(a,b,c){a=a|0;b=+b;c=+c;var d=0.0,e=0.0,f=0.0,g=0.0,i=0.0;e=(b+c)*.5;i=+h[a+16>>3];d=+h[a+24>>3]/i;g=+I(+(e*2.0));f=+I(+(e*4.0));e=+I(+(e*6.0));a=d<.25?10440:10696;return +(i*((d*(d*.001+4.98)+.207)/(d+.0067))*+P(+((+h[a+16>>3]+d*(d*+h[a>>3]+ +h[a+8>>3]))/(d+ +h[a+24>>3])+g*((+h[a+48>>3]+d*(d*+h[a+32>>3]+ +h[a+40>>3]))/(d+ +h[a+56>>3]))+f*((+h[a+80>>3]+d*(d*+h[a+64>>3]+ +h[a+72>>3]))/(d+ +h[a+88>>3]))+e*((+h[a+112>>3]+d*(d*+h[a+96>>3]+ +h[a+104>>3]))/(d+ +h[a+120>>3]))+(c-b)*((+h[a+144>>3]+d*(d*+h[a+128>>3]+ +h[a+136>>3]))/(d+ +h[a+152>>3])+g*((+h[a+176>>3]+d*(d*+h[a+160>>3]+ +h[a+168>>3]))/(d+ +h[a+184>>3]))+f*((+h[a+208>>3]+d*(d*+h[a+192>>3]+ +h[a+200>>3]))/(d+ +h[a+216>>3]))+e*((+h[a+240>>3]+d*(d*+h[a+224>>3]+ +h[a+232>>3]))/(d+ +h[a+248>>3]))))))}function KT(a,b,d){a=a|0;b=+b;d=+d;var e=0;c[47444]=100;e=HK(1600)|0;c[a>>2]=e;h[e>>3]=b;h[e+8>>3]=d;c[a+4>>2]=1;return}function LT(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0;f=c[a>>2]|0;e=(c[a+4>>2]|0)+-1|0;MT(a,+h[f+(e<<4)>>3],+h[f+(e<<4)+8>>3],b,d,b,d);return}function MT(a,b,d,e,f,g,i){a=a|0;b=+b;d=+d;e=+e;f=+f;g=+g;i=+i;var j=0,k=0,l=0,m=0;l=a+4|0;j=c[l>>2]|0;k=c[47444]|0;if((j+3|0)<(k|0))a=c[a>>2]|0;else{c[47444]=k<<1;j=n6(c[a>>2]|0,k<<5)|0;c[a>>2]=j;a=j;j=c[l>>2]|0}h[a+(j<<4)>>3]=b;m=j+1|0;h[a+(j<<4)+8>>3]=d;h[a+(m<<4)>>3]=e;k=j+2|0;h[a+(m<<4)+8>>3]=f;h[a+(k<<4)>>3]=g;c[l>>2]=j+3;h[a+(k<<4)+8>>3]=i;return}function NT(a){a=a|0;var b=0;b=c[a>>2]|0;LT(a,+h[b>>3],+h[b+8>>3]);c[a>>2]=n6(c[a>>2]|0,c[a+4>>2]<<4)|0;c[47444]=0;return}function OT(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0;e=+h[a+16>>3];c=+h[a+24>>3];c=+G(+(e*e-c*c));e=c*+h[a+40>>3];c=c*+h[a+48>>3];d=+h[a>>3];h[a+104>>3]=d-e;b=+h[a+8>>3];h[a+112>>3]=b-c;h[a+120>>3]=e+d;h[a+128>>3]=c+b;return}function PT(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0.0;d=+h[a+16>>3];j=+h[a+56>>3];i=d*+I(+j);g=+h[a+24>>3];j=g*+J(+j);f=+h[a+64>>3];d=d*+I(+f);f=g*+J(+f);g=+h[a>>3];e=+h[a+40>>3];c=+h[a+48>>3];h[a+72>>3]=g+i*e-j*c;b=+h[a+8>>3];h[a+80>>3]=j*e+(i*c+b);h[a+88>>3]=g+d*e-f*c;h[a+96>>3]=f*e+(d*c+b);return}function QT(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;p=+h[a+24>>3];q=+h[a+16>>3];c=p/q;r=+h[a+48>>3];k=+F(+r)<.1;o=+h[a+40>>3];do if(k){n=r/o;d=+N(+(c*n));b=-d;c=1.5707963267948966-+N(+(n/c));if(o<0.0){e=b;b=3.141592653589793-d;d=c+3.141592653589793;break}else{e=-3.141592653589793-d;d=c;c=c+-3.141592653589793;break}}else{n=o/r;b=+N(+(n/c))+1.5707963267948966;c=+N(+(c*n));if(r<0.0){e=b+-3.141592653589793;d=c+3.141592653589793;break}else{e=b;b=b+3.141592653589793;d=c;c=c+-3.141592653589793;break}}while(0);m=+h[a+56>>3];e=e-+E(+((e-m)/6.283185307179586))*6.283185307179586;l=c-+E(+((c-m)/6.283185307179586))*6.283185307179586;b=b-+E(+((b-m)/6.283185307179586))*6.283185307179586;m=d-+E(+((d-m)/6.283185307179586))*6.283185307179586;n=+h[a+64>>3];f=a+88|0;g=a+72|0;if(!(e<=n)){e=+h[g>>3];c=+h[f>>3];c=e>3]+q*+I(+e)*o-r*(p*+J(+e));h[a+136>>3]=c;i=a+96|0;j=a+80|0;k=a+8|0;if(!(l<=n)){l=+h[j>>3];d=+h[i>>3];d=l>3]+r*(q*+I(+l))+p*+J(+l)*o;h[a+144>>3]=d;if(!(b<=n)){l=+h[g>>3];b=+h[f>>3];b=l>b?l:b}else b=+h[a>>3]+q*+I(+b)*o-r*(p*+J(+b));h[a+152>>3]=b-c;if(!(m<=n)){r=+h[j>>3];b=+h[i>>3];b=r>b?r:b}else b=+h[k>>3]+r*(q*+I(+m))+p*+J(+m)*o;h[a+160>>3]=b-d;return}function RT(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0.0,m=0,n=0;n=l;l=l+80|0;m=n;ST(b);k=+h[e+56>>3];g=+h[e+64>>3];f=e+48|0;switch(a[e+80>>0]|0){case 116:{g=g+(+h[f>>3]-+TT(d))*.5;i=4;break}case 98:{g=g-(+h[f>>3]-+TT(d))*.5;i=4;break}default:{}}if((i|0)==4)g=g+-1.0;h[m>>3]=k;h[m+8>>3]=g;c[m+20>>2]=c[e+8>>2];c[m+16>>2]=c[e+4>>2];h[m+32>>3]=+h[e+16>>3];j=b+16|0;e=NA(c[(c[j>>2]|0)+8>>2]|0,137598)|0;f=m+56|0;c[f>>2]=e;i=m+60|0;c[i>>2]=c[(c[j>>2]|0)+212>>2];j=m+64|0;a[j>>0]=0;if(!((e|0)!=0?(a[e>>0]|0)!=0:0))c[f>>2]=137609;if((a[d+4>>0]|0)==1){f=c[d>>2]|0;jS(b,c[(c[b>>2]|0)+336>>2]|0);e=c[f+24>>2]|0;if(!e)fS(b,137615);else fS(b,e);VT(b,f,m);if(a[j>>0]|0)l6(c[i>>2]|0)}else UT(b,c[d>>2]|0,m);WT(b);l=n;return}function ST(a){a=a|0;var d=0,e=0;a=_H(a)|0;d=c[a>>2]|0;e=c[d+4>>2]|0;c[a+4>>2]=e;c[a+12>>2]=c[d+12>>2];if(e>>>0<4)c[a+8>>2]=c[d+8>>2];c[a+208>>2]=c[d+208>>2];c[a+228>>2]=c[d+228>>2];c[a+244>>2]=c[d+244>>2];e=a+260|0;b[e>>1]=b[e>>1]&-2|b[d+260>>1]&1;return}function TT(b){b=b|0;var d=0.0,e=0,f=0;switch(a[b+4>>0]|0){case 1:{e=c[b>>2]|0;b=e+72|0;e=e+56|0;f=5;break}case 3:{e=c[b>>2]|0;b=e+24|0;e=e+8|0;f=5;break}case 2:{e=c[b>>2]|0;b=e+32|0;e=e+16|0;f=5;break}default:d=0.0}if((f|0)==5)d=+h[b>>3]-+h[e>>3];return +d}function UT(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0;n=l;l=l+96|0;j=n+64|0;i=n+32|0;g=n+16|0;k=n;m=b[e+4>>1]|0;if(m<<16>>16>=1){r=e+8|0;p=+h[e+24>>3];o=+h[r>>3];h[k>>3]=+h[f>>3]+(p+o)*.5;h[k+8>>3]=+h[f+8>>3]+(+h[e+32>>3]+ +h[e+16>>3])*.5;q=c[e>>2]|0;s=f+16|0;f=a[e+6>>0]|0;c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];c[i>>2]=c[s>>2];c[i+4>>2]=c[s+4>>2];c[i+8>>2]=c[s+8>>2];c[i+12>>2]=c[s+12>>2];c[i+16>>2]=c[s+16>>2];c[i+20>>2]=c[s+20>>2];c[i+24>>2]=c[s+24>>2];c[i+28>>2]=c[s+28>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];c[j+16>>2]=c[r+16>>2];c[j+20>>2]=c[r+20>>2];c[j+24>>2]=c[r+24>>2];c[j+28>>2]=c[r+28>>2];gU(d,m<<16>>16,q,g,(p-o)*.5,i,j,f)}l=n;return}function VT(f,g,i){f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;B=l;l=l+176|0;w=B+96|0;y=B+64|0;z=B+136|0;q=B;r=B+128|0;s=g+48|0;c[y>>2]=c[s>>2];c[y+4>>2]=c[s+4>>2];c[y+8>>2]=c[s+8>>2];c[y+12>>2]=c[s+12>>2];c[y+16>>2]=c[s+16>>2];c[y+20>>2]=c[s+20>>2];c[y+24>>2]=c[s+24>>2];c[y+28>>2]=c[s+28>>2];m=+h[i>>3];n=+h[i+8>>3];s=g+84|0;j=c[s>>2]|0;if(!(c[g>>2]|0))A=(c[g+8>>2]|0)!=0;else A=1;x=g+108|0;k=c[x>>2]|0;if(k|0)XT(i,k,186712);h[y>>3]=m+ +h[y>>3];u=y+16|0;h[u>>3]=m+ +h[u>>3];u=y+8|0;h[u>>3]=n+ +h[u>>3];u=y+24|0;h[u>>3]=n+ +h[u>>3];u=f+152|0;if(A?(c[u>>2]&4|0)==0:0){c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[w+16>>2]=c[y+16>>2];c[w+20>>2]=c[y+20>>2];c[w+24>>2]=c[y+24>>2];c[w+28>>2]=c[y+28>>2];t=YT(f,i,g,w,z)|0}else t=0;p=g+42|0;k=e[p>>1]|0;if(!(k&32)){o=c[g+20>>2]|0;v=g+33|0;if(o){k=ZT(f,o,c[g+28>>2]|0,k,r)|0;if(!(b[p>>1]&4)){c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[w+16>>2]=c[y+16>>2];c[w+20>>2]=c[y+20>>2];c[w+24>>2]=c[y+24>>2];c[w+28>>2]=c[y+28>>2];mS(f,w,k)}else{p=d[v>>0]|0;c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[w+16>>2]=c[y+16>>2];c[w+20>>2]=c[y+20>>2];c[w+24>>2]=c[y+24>>2];c[w+28>>2]=c[y+28>>2];RM(f,_T(q,w,p)|0,4,4,k)}l6(c[r>>2]|0)}while(1){k=c[j>>2]|0;if(!k)break;$T(f,k,i);j=j+4|0}j=c[s>>2]|0;sS(f,1.0);k=g+24|0;while(1){o=j+4|0;j=c[j>>2]|0;if(!j)break;if(!(a[j+100>>0]|0)){j=o;continue}aU(f,j,i,c[k>>2]|0,c[o>>2]|0);j=o}if(a[v>>0]|0){c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[w+16>>2]=c[y+16>>2];c[w+20>>2]=c[y+20>>2];c[w+24>>2]=c[y+24>>2];c[w+28>>2]=c[y+28>>2];bU(f,g,w)}}if(t|0)cU(f,z);if((A?c[u>>2]&4|0:0)?(c[w>>2]=c[y>>2],c[w+4>>2]=c[y+4>>2],c[w+8>>2]=c[y+8>>2],c[w+12>>2]=c[y+12>>2],c[w+16>>2]=c[y+16>>2],c[w+20>>2]=c[y+20>>2],c[w+24>>2]=c[y+24>>2],c[w+28>>2]=c[y+28>>2],YT(f,i,g,w,z)|0):0)cU(f,z);if(c[x>>2]|0)dU(i,186712);l=B;return}function WT(a){a=a|0;var b=0;b=c[a+16>>2]|0;c[b+208>>2]=0;c[b+228>>2]=0;c[b+244>>2]=0;c[b+212>>2]=0;$H(a);return}function XT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0;i=a+16|0;f=c[i>>2]|0;if(f|0){if(!(c[b>>2]|0)){f=0;g=d}else{c[d>>2]=f;f=c[b>>2]|0;g=i}c[g>>2]=f}f=c[a+20>>2]|0;if(f|0){g=b+4|0;if(!(c[g>>2]|0)){f=0;g=d}else{c[d+4>>2]=f;f=c[g>>2]|0;g=i}c[g+4>>2]=f}e=+h[a+32>>3];if(e>=0.0){f=b+16|0;if(!(+h[f>>3]>=0.0))e=-1.0;else{h[d+16>>3]=e;e=+h[f>>3];d=i}h[d+16>>3]=e}return}function YT(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+224|0;n=u+8|0;k=u;t=u+40|0;j=u+184|0;i=u+56|0;m=c[d+16>>2]|0;o=m+208|0;c[h>>2]=c[o>>2];p=m+228|0;c[h+4>>2]=c[p>>2];q=m+244|0;c[h+8>>2]=c[q>>2];r=m+212|0;c[h+12>>2]=c[r>>2];s=m+260|0;a[h+16>>0]=(b[s>>1]<<15&65535)<<16>>16>>15;h=c[f+16>>2]|0;m=m+8|0;if((h|0)!=0?(a[h>>0]|0)!=0:0)i=0;else{hA(t,128,i);i=e+60|0;h=c[i>>2]|0;if(!h){h=Y3(bI(d,c[m>>2]|0,t)|0)|0;c[i>>2]=h;a[e+64>>0]=1}kA(t,h)|0;i=c[47445]|0;c[47445]=i+1;c[k>>2]=i;i2(j,137692,k)|0;kA(t,j)|0;i=t+4|0;h=c[i>>2]|0;if(h>>>0>=(c[t+8>>2]|0)>>>0){iA(t,1)|0;h=c[i>>2]|0}a[h>>0]=0;h=c[t>>2]|0;c[i>>2]=h;i=1}h=aI(d,0,c[f>>2]|0,c[f+12>>2]|0,c[f+8>>2]|0,h,c[m>>2]|0)|0;if(i)lA(t);do if(h|0){if((c[o>>2]|0)==0?(b[s>>1]&1)==0:0)break;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];c[n+12>>2]=c[g+12>>2];c[n+16>>2]=c[g+16>>2];c[n+20>>2]=c[g+20>>2];c[n+24>>2]=c[g+24>>2];c[n+28>>2]=c[g+28>>2];iI(d,n);aS(d,c[o>>2]|0,c[p>>2]|0,c[q>>2]|0,c[r>>2]|0)}while(0);l=u;return h|0}function ZT(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0,j=0;j=l;l=l+16|0;i=j;if(!((HJ(b,f,i)|0)<<24>>24)){hS(a,b);b=1}else{hS(a,c[f>>2]|0);b=c[f+4>>2]|0;h=+g[i>>2];if(!b)iS(a,137615,d,h);else iS(a,b,d,h);b=e>>>1&1|2}fS(a,137680);l=j;return b|0}function _T(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0,j=0.0,k=0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];i=a+32|0;k=b+16|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];k=a+40|0;b=a+8|0;if((d|0)>1){e=+(d|0)*.5;g=e+ +h[a>>3];h[a>>3]=g;f=e+ +h[b>>3];h[b>>3]=f;j=+h[i>>3]-e;h[i>>3]=j;e=+h[k>>3]-e;h[k>>3]=e}else{j=+h[i>>3];f=+h[b>>3];g=+h[a>>3];e=+h[k>>3]}h[a+16>>3]=j;h[a+24>>3]=f;h[a+48>>3]=g;h[a+56>>3]=e;return a|0}function $T(f,g,i){f=f|0;g=g|0;i=i|0;var j=0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=l;l=l+176|0;u=y+96|0;v=y+136|0;w=y+64|0;s=y;t=y+128|0;x=g+48|0;c[w>>2]=c[x>>2];c[w+4>>2]=c[x+4>>2];c[w+8>>2]=c[x+8>>2];c[w+12>>2]=c[x+12>>2];c[w+16>>2]=c[x+16>>2];c[w+20>>2]=c[x+20>>2];c[w+24>>2]=c[x+24>>2];c[w+28>>2]=c[x+28>>2];k=+h[i>>3];m=+h[i+8>>3];if(!(c[g>>2]|0))x=(c[g+8>>2]|0)!=0;else x=1;h[w>>3]=k+ +h[w>>3];r=w+16|0;h[r>>3]=k+ +h[r>>3];r=w+8|0;h[r>>3]=m+ +h[r>>3];r=w+24|0;h[r>>3]=m+ +h[r>>3];r=f+152|0;if(x?(c[r>>2]&4|0)==0:0){c[u>>2]=c[w>>2];c[u+4>>2]=c[w+4>>2];c[u+8>>2]=c[w+8>>2];c[u+12>>2]=c[w+12>>2];c[u+16>>2]=c[w+16>>2];c[u+20>>2]=c[w+20>>2];c[u+24>>2]=c[w+24>>2];c[u+28>>2]=c[w+28>>2];q=YT(f,i,g,u,v)|0}else q=0;o=g+42|0;j=e[o>>1]|0;a:do if(!(j&32)){n=c[g+20>>2]|0;p=g+33|0;if(n|0){j=ZT(f,n,c[g+28>>2]|0,j,t)|0;if(!(b[o>>1]&4)){c[u>>2]=c[w>>2];c[u+4>>2]=c[w+4>>2];c[u+8>>2]=c[w+8>>2];c[u+12>>2]=c[w+12>>2];c[u+16>>2]=c[w+16>>2];c[u+20>>2]=c[w+20>>2];c[u+24>>2]=c[w+24>>2];c[u+28>>2]=c[w+28>>2];mS(f,u,j)}else{o=d[p>>0]|0;c[u>>2]=c[w>>2];c[u+4>>2]=c[w+4>>2];c[u+8>>2]=c[w+8>>2];c[u+12>>2]=c[w+12>>2];c[u+16>>2]=c[w+16>>2];c[u+20>>2]=c[w+20>>2];c[u+24>>2]=c[w+24>>2];c[u+28>>2]=c[w+28>>2];RM(f,_T(s,u,o)|0,4,4,j)}l6(c[t>>2]|0)}if(a[p>>0]|0){c[u>>2]=c[w>>2];c[u+4>>2]=c[w+4>>2];c[u+8>>2]=c[w+8>>2];c[u+12>>2]=c[w+12>>2];c[u+16>>2]=c[w+16>>2];c[u+20>>2]=c[w+20>>2];c[u+24>>2]=c[w+24>>2];c[u+28>>2]=c[w+28>>2];bU(f,g,u)}j=g+88|0;switch(a[g+92>>0]|0){case 1:{VT(f,c[j>>2]|0,i);break a}case 3:{fU(f,c[j>>2]|0,i);break a}default:{UT(f,c[j>>2]|0,i);break a}}}while(0);if(q|0)cU(f,v);if((x?c[r>>2]&4|0:0)?(c[u>>2]=c[w>>2],c[u+4>>2]=c[w+4>>2],c[u+8>>2]=c[w+8>>2],c[u+12>>2]=c[w+12>>2],c[u+16>>2]=c[w+16>>2],c[u+20>>2]=c[w+20>>2],c[u+24>>2]=c[w+24>>2],c[u+28>>2]=c[w+28>>2],YT(f,i,g,u,v)|0):0)cU(f,v);l=y;return}function aU(f,g,i,j,k){f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;var m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0,F=0,G=0,H=0;G=l;l=l+32|0;E=G+16|0;F=G;y=+h[i>>3];s=+h[i+8>>3];p=(j|0)==0?137615:j;hS(f,p);fS(f,p);B=y+ +h[g+48>>3];C=y+ +h[g+64>>3];D=s+ +h[g+56>>3];s=s+ +h[g+72>>3];p=g+100|0;i=a[p>>0]|0;q=g+86|0;z=F+8|0;t=g+84|0;u=g+82|0;v=g+96|0;w=g+80|0;if((i&1)!=0?(o=c[v>>2]|0,((e[w>>1]|0)+(e[t>>1]|0)|0)<(c[o+104>>2]|0)):0){j=b[q>>1]|0;g=o+33|0;n=a[o+32>>0]|0;H=(n<<24>>24)/2|0;i=H<<24>>24;r=+(H<<24>>24);if(j<<16>>16)if(((e[u>>1]|0)+(j&65535)|0)==(c[o+100>>2]|0)){i=(d[g>>0]|0)+i|0;j=i;i=i&255;m=D-r}else{j=0;m=D}else{j=(d[g>>0]|0)+i|0;m=D}h[z>>3]=m-+(i|0);h[F>>3]=C+r;c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];eU(f,E,0.0,+(n<<24>>24)+(s+ +(j&255|0)-D));i=a[p>>0]|0}if(i&2?(A=b[q>>1]|0,x=c[v>>2]|0,((e[u>>1]|0)+(A&65535)|0)<(c[x+100>>2]|0)):0){H=b[t>>1]|0;q=(k|0)!=0;o=k+86|0;g=x+33|0;i=x+32|0;p=x+64|0;n=((e[w>>1]|0)+(H&65535)|0)==(c[x+104>>2]|0);do if(!(H<<16>>16)){i=a[i>>0]|0;H=(i<<24>>24)/2|0;g=(H<<24>>24)+(d[g>>0]|0)|0;j=g&255;g=g&255;m=+(H<<24>>24);h[F>>3]=B-+(g|0)-m;if(n){j=g<<1&255;break}if(q?(b[o>>1]|0)!=A<<16>>16:0)j=~~(+(j&255)+(y+ +h[p>>3]-(C+m)))&255}else{i=a[i>>0]|0;j=(i<<24>>24)/2|0;m=+(j<<24>>24);h[F>>3]=B-m;if(n){j=(d[g>>0]|0)+(j&255)&255;break}if(q?(b[o>>1]|0)!=A<<16>>16:0)j=~~(y+ +h[p>>3]-(C+m)+0.0)&255;else j=0}while(0);h[z>>3]=D-+(((i<<24>>24)/2|0)<<24>>24);c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];eU(f,E,+(i<<24>>24)+(C+ +(j&255)-B),0.0)}l=G;return}function bU(e,f,g){e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0;q=l;l=l+160|0;o=q+112|0;p=q;j=q+144|0;m=c[f+24>>2]|0;fS(e,(m|0)==0?137615:m);m=f+42|0;i=b[m>>1]|0;if(!(i&384))jS(e,c[(c[e>>2]|0)+336>>2]|0);else{c[j+4>>2]=0;c[j>>2]=0;i=i&65535;if(!(i&256)){if(i&128|0){i=137621;k=4}}else{i=137628;k=4}if((k|0)==4)c[j>>2]=i;jS(e,j)}i=f+33|0;sS(e,+(d[i>>0]|0));i=a[i>>0]|0;j=i&255;a:do if(!(b[m>>1]&4)){n=b[f+36>>1]&15360;if(!(n<<16>>16)){if((i&255)>1){r=+(i&255)*.5;h[g>>3]=r+ +h[g>>3];p=g+8|0;h[p>>3]=r+ +h[p>>3];p=g+16|0;h[p>>3]=+h[p>>3]-r;p=g+24|0;h[p>>3]=+h[p>>3]-r};c[o>>2]=c[g>>2];c[o+4>>2]=c[g+4>>2];c[o+8>>2]=c[g+8>>2];c[o+12>>2]=c[g+12>>2];c[o+16>>2]=c[g+16>>2];c[o+20>>2]=c[g+20>>2];c[o+24>>2]=c[g+24>>2];c[o+28>>2]=c[g+28>>2];mS(e,o,0);break}m=p+16|0;c[o>>2]=c[g>>2];c[o+4>>2]=c[g+4>>2];c[o+8>>2]=c[g+8>>2];c[o+12>>2]=c[g+12>>2];c[o+16>>2]=c[g+16>>2];c[o+20>>2]=c[g+20>>2];c[o+24>>2]=c[g+24>>2];c[o+28>>2]=c[g+28>>2];_T(m,o,j)|0;i=p+32|0;j=p+64|0;k=p+48|0;f=p+80|0;do switch(((n&65535)+-1024|0)>>>10&4194303|0){case 7:{oS(e,m,2);break a}case 3:{oS(e,i,2);break a}case 1:{oS(e,k,2);break a}case 0:{c[p>>2]=c[j>>2];c[p+4>>2]=c[j+4>>2];c[p+8>>2]=c[j+8>>2];c[p+12>>2]=c[j+12>>2];oS(e,p,2);break a}case 11:{oS(e,m,3);break a}case 5:{oS(e,i,3);break a}case 2:{c[f>>2]=c[m>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2];c[f+12>>2]=c[m+12>>2];oS(e,k,3);break a}case 8:{c[p>>2]=c[j>>2];c[p+4>>2]=c[j+4>>2];c[p+8>>2]=c[j+8>>2];c[p+12>>2]=c[j+12>>2];oS(e,p,3);break a}case 13:{oS(e,m,4);break a}case 6:{c[f>>2]=c[m>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2];c[f+12>>2]=c[m+12>>2];oS(e,i,4);break a}case 10:{c[f>>2]=c[m>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2];c[f+12>>2]=c[m+12>>2];p=p+96|0;c[p>>2]=c[i>>2];c[p+4>>2]=c[i+4>>2];c[p+8>>2]=c[i+8>>2];c[p+12>>2]=c[i+12>>2];oS(e,k,4);break a}case 12:{c[p>>2]=c[j>>2];c[p+4>>2]=c[j+4>>2];c[p+8>>2]=c[j+8>>2];c[p+12>>2]=c[j+12>>2];oS(e,p,4);break a}case 9:{oS(e,m,2);oS(e,k,2);break a}case 4:{c[p>>2]=c[j>>2];c[p+4>>2]=c[j+4>>2];c[p+8>>2]=c[j+8>>2];c[p+12>>2]=c[j+12>>2];oS(e,p,2);oS(e,i,2);break a}default:break a}while(0)}else{c[o>>2]=c[g>>2];c[o+4>>2]=c[g+4>>2];c[o+8>>2]=c[g+8>>2];c[o+12>>2]=c[g+12>>2];c[o+16>>2]=c[g+16>>2];c[o+20>>2]=c[g+20>>2];c[o+24>>2]=c[g+24>>2];c[o+28>>2]=c[g+28>>2];RM(e,_T(p,o,j)|0,4,4,0)}while(0);l=q;return}function cU(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=c[d+16>>2]|0;f=h+208|0;i=h+260|0;if((c[f>>2]|0)==0?(b[i>>1]&1)==0:0)d=0;else{bS(d);d=c[f>>2]|0}if((d|0)!=(c[e>>2]|0)){l6(d);c[f>>2]=c[e>>2]}d=h+228|0;f=c[d>>2]|0;g=e+4|0;if((f|0)!=(c[g>>2]|0)){l6(f);c[d>>2]=c[g>>2]}d=h+244|0;f=c[d>>2]|0;g=e+8|0;if((f|0)!=(c[g>>2]|0)){l6(f);c[d>>2]=c[g>>2]}d=h+212|0;f=c[d>>2]|0;g=e+12|0;if((f|0)!=(c[g>>2]|0)){l6(f);c[d>>2]=c[g>>2]}b[i>>1]=b[i>>1]&-2|a[e+16>>0]&1;return}function dU(a,b){a=a|0;b=b|0;var d=0.0,e=0;e=c[b>>2]|0;if(e|0)c[a+16>>2]=e;e=c[b+4>>2]|0;if(e|0)c[a+20>>2]=e;d=+h[b+16>>3];if(d>=0.0)h[a+32>>3]=d;return}function eU(a,b,d,e){a=a|0;b=b|0;d=+d;e=+e;var f=0,g=0,i=0;f=l;l=l+64|0;g=f+32|0;i=f;c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];h[i+16>>3]=+h[b>>3]+d;h[i+24>>3]=+h[b+8>>3]+e;c[g>>2]=c[i>>2];c[g+4>>2]=c[i+4>>2];c[g+8>>2]=c[i+8>>2];c[g+12>>2]=c[i+12>>2];c[g+16>>2]=c[i+16>>2];c[g+20>>2]=c[i+20>>2];c[g+24>>2]=c[i+24>>2];c[g+28>>2]=c[i+28>>2];mS(a,g,1);l=f;return}function fU(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0;i=l;l=l+64|0;g=i;k=+h[e>>3];n=+h[d>>3]+k;m=+h[e+8>>3];j=+h[d+8>>3]+m;k=+h[d+16>>3]+k;m=+h[d+24>>3]+m;h[g>>3]=k;h[g+8>>3]=m;h[g+32>>3]=n;h[g+40>>3]=j;h[g+16>>3]=n;h[g+24>>3]=m;h[g+48>>3]=k;h[g+56>>3]=j;f=c[d+36>>2]|0;if(!f)f=c[e+56>>2]|0;e=c[d+32>>2]|0;if(!e)Aa(137635,137643,623,137655);if(!(a[e>>0]|0))Aa(137669,137643,624,137655);else{qS(b,e,g,4,1,f);l=i;return}}function gU(d,e,f,g,i,j,k,m){d=d|0;e=e|0;f=f|0;g=g|0;i=+i;j=j|0;k=k|0;m=m|0;var n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0,K=0,L=0,M=0.0,N=0.0,O=0,P=0,Q=0;Q=l;l=l+128|0;K=Q+104|0;O=Q+48|0;P=Q+16|0;L=Q;J=L;c[J>>2]=0;c[J+4>>2]=0;M=+h[g>>3];N=M-i;I=M+i;J=L+8|0;h[J>>3]=+h[g+8>>3]+(+h[k+24>>3]-+h[k+8>>3])*.5;cS(d,1);D=P+16|0;E=P+4|0;F=P+24|0;G=O+4|0;H=O+16|0;u=(m|0)==0;v=O+24|0;w=O+8|0;x=O+32|0;y=O+40|0;z=O+48|0;A=j+16|0;B=P+8|0;C=j+4|0;t=0;while(1){if((t|0)>=(e|0))break;k=f+(t*24|0)+8|0;switch(a[f+(t*24|0)+6>>0]|0){case 108:{i=N;break}case 114:{i=I-+h[k>>3];break}default:i=M-+h[k>>3]*.5}h[g>>3]=i;r=f+(t*24|0)+16|0;h[J>>3]=+h[J>>3]-+h[r>>3];s=f+(t*24|0)+4|0;p=c[f+(t*24|0)>>2]|0;q=0;while(1){if((q|0)>=(b[s>>1]|0))break;o=p+4|0;k=c[o>>2]|0;if(!k){h[D>>3]=+h[A>>3];c[P>>2]=c[j>>2];m=c[C>>2]|0;c[E>>2]=m;k=c[F>>2]&-128}else{h[D>>3]=+h[(+h[k+16>>3]>0.0?k:j)+16>>3];c[P>>2]=c[((c[k>>2]|0)==0?j:k)>>2];m=c[((c[k+4>>2]|0)==0?j:k)+4>>2]|0;c[E>>2]=m;k=c[k+24>>2]&127|c[F>>2]&-128}c[F>>2]=k;fS(d,m);c[O>>2]=c[p>>2];c[G>>2]=P;h[H>>3]=+h[p+16>>3];if(u)n=1.0;else n=+h[p+24>>3];h[v>>3]=n;c[B>>2]=c[(c[o>>2]|0)+8>>2];c[w>>2]=c[p+8>>2];o=p+32|0;h[x>>3]=+h[o>>3];h[y>>3]=+h[r>>3];a[z>>0]=108;h[L>>3]=i;c[K>>2]=c[L>>2];c[K+4>>2]=c[L+4>>2];c[K+8>>2]=c[L+8>>2];c[K+12>>2]=c[L+12>>2];eS(d,K,O);n=i+ +h[o>>3];h[g>>3]=n;p=p+56|0;q=q+1|0;i=n}t=t+1|0}dS(d);l=Q;return}function hU(a){a=a|0;l6(c[a>>2]|0);l6(c[a+4>>2]|0);l6(c[a+8>>2]|0);l6(c[a+16>>2]|0);l6(c[a+12>>2]|0);l6(c[a+20>>2]|0);l6(c[a+24>>2]|0);return}function iU(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(a|0){j=a+4|0;e=0;g=c[a>>2]|0;while(1){if((e|0)>=(b[j>>1]|0))break;k=g+4|0;d=0;f=c[g>>2]|0;while(1){if((d|0)>=(b[k>>1]|0))break;l6(c[f>>2]|0);h=c[f+8>>2]|0;if(h|0?(i=c[f+12>>2]|0,i|0):0)db[i&127](h);d=d+1|0;f=f+56|0}e=e+1|0;g=g+24|0}d=c[a>>2]|0;if(d|0)l6(d);l6(a)}return}function jU(a){a=a|0;l6(c[a+32>>2]|0);l6(a);return}function kU(b,d){b=b|0;d=d|0;switch(a[b+4>>0]|0){case 1:{lU(c[b>>2]|0);break}case 3:{jU(c[b>>2]|0);break}default:iU(c[b>>2]|0)}if(d|0)l6(b);return}function lU(a){a=a|0;var b=0,d=0,e=0;e=a+84|0;if((c[a+100>>2]|0)==-1)Oz(c[e>>2]|0)|0;else{b=c[e>>2]|0;l6(c[a+92>>2]|0);l6(c[a+96>>2]|0);while(1){d=c[b>>2]|0;if(!d)break;mU(d);b=b+4|0}l6(c[e>>2]|0)}hU(a);l6(a);return}function mU(a){a=a|0;kU(a+88|0,0);hU(a);l6(a);return}function nU(b,e,f){b=b|0;e=e|0;f=f|0;var g=0;b=c[(c[(c[b+16>>2]|0)+104>>2]|0)+72>>2]|0;if((a[b+4>>0]|0)!=2?(g=oU(c[b>>2]|0,e)|0,(g|0)!=0):0){c[f>>2]=d[g+35>>0];b=g+48|0}else b=0;return b|0}function oU(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+4>>2]|0;if(!((d|0)!=0?(C3(d,b)|0)==0:0))e=3;a:do if((e|0)==3){d=c[a+84>>2]|0;while(1){a=c[d>>2]|0;if(!a){a=0;break a}a=pU(a,b)|0;if(!a)d=d+4|0;else break}}while(0);return a|0}function pU(b,d){b=b|0;d=d|0;var e=0;e=c[b+4>>2]|0;if(!((e|0)!=0?(C3(e,d)|0)==0:0))if((a[b+92>>0]|0)==1)b=oU(c[b+88>>2]|0,d)|0;else b=0;return b|0}function qU(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0}function rU(d){d=d|0;var f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;p=d+92|0;c[p>>2]=HK((c[d+100>>2]<<2)+4|0)|0;n=HK((c[d+104>>2]<<2)+4|0)|0;c[d+96>>2]=n;o=d+32|0;m=c[d+84>>2]|0;while(1){l=c[m>>2]|0;if(!l)break;d=b[l+82>>1]|0;f=d&65535;g=+h[l+72>>3];if(d<<16>>16==1)j=~~g;else{j=~~((g-+(S((a[o>>0]|0)+-1|0,f+-1|0)|0))/+(d&65535));j=(j|0)>1?j:1}d=b[l+80>>1]|0;k=d&65535;g=+h[l+64>>3];if(d<<16>>16==1)i=~~g;else{i=~~((g-+(S((a[o>>0]|0)+-1|0,k+-1|0)|0))/+(d&65535));i=(i|0)>1?i:1}d=e[l+86>>1]|0;f=d+f|0;while(1){if((d|0)>=(f|0))break;q=(c[p>>2]|0)+(d<<2)|0;r=c[q>>2]|0;c[q>>2]=(r|0)>(j|0)?r:j;d=d+1|0}d=e[l+84>>1]|0;f=d+k|0;while(1){if((d|0)>=(f|0))break;r=n+(d<<2)|0;q=c[r>>2]|0;c[r>>2]=(q|0)>(i|0)?q:i;d=d+1|0}m=m+4|0}return}function sU(a){a=a|0;var b=0,d=0;d=l;l=l+16|0;b=d;if(a>>>0<21)a=c[55892+(a<<2)>>2]|0;else{c[b>>2]=a;i2(195241,137696,b)|0;a=195241}l=d;return a|0}function tU(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=a+104|0;l=a+100|0;j=d+16|0;f=0;g=0;while(1){if((f|0)>(c[k>>2]|0))break;i=qC(d,sU(f)|0,1)|0;RC(i,137750,304,1)|0;m=i+16|0;c[(c[m>>2]|0)+176>>2]=0;o=HK((c[l>>2]<<2)+4|0)|0;n=c[m>>2]|0;c[n+172>>2]=o;c[n+184>>2]=0;n=HK((c[l>>2]<<2)+4|0)|0;c[(c[m>>2]|0)+180>>2]=n;if(!g)c[(c[j>>2]|0)+192>>2]=i;else c[(c[g+16>>2]|0)+164>>2]=i;f=f+1|0;g=i}j=b+16|0;f=0;g=0;while(1){if((f|0)>(c[l>>2]|0))break;i=qC(b,sU(f)|0,1)|0;RC(i,137750,304,1)|0;o=i+16|0;c[(c[o>>2]|0)+176>>2]=0;m=HK((c[k>>2]<<2)+4|0)|0;n=c[o>>2]|0;c[n+172>>2]=m;c[n+184>>2]=0;n=HK((c[k>>2]<<2)+4|0)|0;c[(c[o>>2]|0)+180>>2]=n;if(!g)c[(c[j>>2]|0)+192>>2]=i;else c[(c[g+16>>2]|0)+164>>2]=i;f=f+1|0;g=i}f=c[a+84>>2]|0;while(1){g=c[f>>2]|0;if(!g)break;o=g+84|0;n=qC(d,sU(e[o>>1]|0)|0,0)|0;o=qC(d,sU((e[g+80>>1]|0)+(e[o>>1]|0)|0)|0,0)|0;uU(d,n,o,~~+h[g+64>>3]);o=g+86|0;n=qC(b,sU(e[o>>1]|0)|0,0)|0;o=qC(b,sU((e[g+82>>1]|0)+(e[o>>1]|0)|0)|0,0)|0;uU(b,n,o,~~+h[g+72>>3]);f=f+4|0}vU(d);vU(b);return}function uU(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0;h=fB(a,d,f,0,0)|0;if(!h){i=fB(a,d,f,0,1)|0;RC(i,137763,176,1)|0;b[(c[i+16>>2]|0)+170>>1]=g;d=d+16|0;h=c[d>>2]|0;a=c[h+180>>2]|0;h=(c[h+184>>2]<<2)+8|0;if(!a)a=IK(h)|0;else a=KK(a,h)|0;g=c[d>>2]|0;c[g+180>>2]=a;g=g+184|0;h=c[g>>2]|0;c[g>>2]=h+1;c[a+(h<<2)>>2]=i;d=c[d>>2]|0;c[(c[d+180>>2]|0)+(c[d+184>>2]<<2)>>2]=0;d=f+16|0;h=c[d>>2]|0;a=c[h+172>>2]|0;h=(c[h+176>>2]<<2)+8|0;if(!a)a=IK(h)|0;else a=KK(a,h)|0;g=c[d>>2]|0;c[g+172>>2]=a;g=g+176|0;f=c[g>>2]|0;c[g>>2]=f+1;c[a+(f<<2)>>2]=i;i=c[d>>2]|0;c[(c[i+172>>2]|0)+(c[i+176>>2]<<2)>>2]=0}else{i=(c[h+16>>2]|0)+170|0;f=e[i>>1]|0;b[i>>1]=(f|0)>(g|0)?f:g}return}function vU(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[(c[a+16>>2]|0)+192>>2]|0;e=d;d=d+16|0;while(1){h=c[(c[d>>2]|0)+164>>2]|0;if(!h)break;d=h+16|0;if(fB(a,e,h,0,0)|0){e=h;continue}i=fB(a,e,h,0,1)|0;RC(i,137763,176,1)|0;b[(c[i+16>>2]|0)+170>>1]=0;g=e+16|0;f=c[g>>2]|0;e=c[f+180>>2]|0;f=(c[f+184>>2]<<2)+8|0;if(!e)e=IK(f)|0;else e=KK(e,f)|0;j=c[g>>2]|0;c[j+180>>2]=e;j=j+184|0;f=c[j>>2]|0;c[j>>2]=f+1;c[e+(f<<2)>>2]=i;f=c[g>>2]|0;c[(c[f+180>>2]|0)+(c[f+184>>2]<<2)>>2]=0;f=c[d>>2]|0;e=c[f+172>>2]|0;f=(c[f+176>>2]<<2)+8|0;if(!e)e=IK(f)|0;else e=KK(e,f)|0;g=c[d>>2]|0;c[g+172>>2]=e;g=g+176|0;j=c[g>>2]|0;c[g>>2]=j+1;c[e+(j<<2)>>2]=i;e=c[d>>2]|0;c[(c[e+172>>2]|0)+(c[e+176>>2]<<2)>>2]=0;e=h}return}function wU(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=a+92|0;e=0;f=0;b=c[(c[(c[b+16>>2]|0)+192>>2]|0)+16>>2]|0;while(1){b=c[b+164>>2]|0;if(!b)break;b=c[b+16>>2]|0;h=b+232|0;c[(c[g>>2]|0)+(f<<2)>>2]=(c[h>>2]|0)-e;e=c[h>>2]|0;f=f+1|0}a=a+96|0;e=0;f=0;b=c[(c[(c[d+16>>2]|0)+192>>2]|0)+16>>2]|0;while(1){b=c[b+164>>2]|0;if(!b)break;b=c[b+16>>2]|0;h=b+232|0;c[(c[a>>2]|0)+(f<<2)>>2]=(c[h>>2]|0)-e;e=c[h>>2]|0;f=f+1|0}return}function xU(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+16|0;f=g+4|0;b=g;c[b>>2]=c[4658];d=c[a+100>>2]|0;if((d|0)!=1?(e=a+104|0,(c[e>>2]|0)!=1):0){c[a+92>>2]=HK((d<<2)+4|0)|0;c[a+96>>2]=HK((c[e>>2]<<2)+4|0)|0;c[f>>2]=c[b>>2];e=lB(137776,f,0)|0;c[f>>2]=c[b>>2];f=lB(137781,f,0)|0;RC(e,137786,280,1)|0;RC(f,137786,280,1)|0;tU(a,e,f);sL(e,2,2147483647)|0;sL(f,2,2147483647)|0;wU(a,e,f);yU(e,f)}else rU(a);l=g;return}function yU(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b+16>>2]|0)+192|0;while(1){d=c[d>>2]|0;if(!d)break;f=d+16|0;d=c[f>>2]|0;e=c[d+172>>2]|0;if(e){l6(e);d=c[f>>2]|0}e=c[d+180>>2]|0;if(e){l6(e);d=c[f>>2]|0}d=d+164|0}pB(a)|0;pB(b)|0;return}function zU(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0;r=l;l=l+272|0;p=r+104|0;q=r+136|0;n=r+72|0;o=r;g=r+144|0;c[o+48>>2]=b;i=o+52|0;switch(FC(b)|0){case 0:{e=c[b+60>>2]|0;f=5;break}case 1:{e=uC(b)|0;f=5;break}case 2:{e=uC(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0;f=5;break}default:e=0}if((f|0)==5)c[i>>2]=e;m=c[e+60>>2]|0;h[o+32>>3]=+h[d+16>>3];c[o+16>>2]=c[d+4>>2];c[o+20>>2]=c[d+8>>2];c[o+40>>2]=0;k=JW(c[d>>2]|0,q,o)|0;if(!k){hA(p,128,g);a[d+82>>0]=0;e=Y3(AU(b,p)|0)|0;c[d>>2]=e;if((c[d+12>>2]|0)==1)e=cQ(e)|0;else e=$P(e,c[i>>2]|0)|0;l6(c[d>>2]|0);c[d>>2]=e;vK(c[(c[m+16>>2]|0)+144>>2]|0,d);lA(p);e=c[q>>2]|0}else{e=k+4|0;f=d+24|0;g=n+8|0;i=n+24|0;j=n+16|0;if((a[e>>0]|0)==1){if((c[(c[k>>2]|0)+24>>2]|0)==0?BU(b)|0:0){b=Y3(BU(b)|0)|0;c[(c[k>>2]|0)+24>>2]=b}o=CU(m,c[k>>2]|0,0,o)|0;c[q>>2]=c[q>>2]|o;o=c[k>>2]|0;t=+h[o+64>>3]*.5;s=+h[o+72>>3]*.5;DU(n,-t,-s,t,s);o=c[k>>2]|0;c[p>>2]=c[n>>2];c[p+4>>2]=c[n+4>>2];c[p+8>>2]=c[n+8>>2];c[p+12>>2]=c[n+12>>2];c[p+16>>2]=c[n+16>>2];c[p+20>>2]=c[n+20>>2];c[p+24>>2]=c[n+24>>2];c[p+28>>2]=c[n+28>>2];EU(o,p,15)}else{FU(c[(c[m+16>>2]|0)+144>>2]|0,c[k>>2]|0,o);p=c[k>>2]|0;s=+h[p+24>>3]*.5;t=+h[p+32>>3]*.5;DU(n,-s,-t,s,t);p=(c[k>>2]|0)+8|0;c[p>>2]=c[n>>2];c[p+4>>2]=c[n+4>>2];c[p+8>>2]=c[n+8>>2];c[p+12>>2]=c[n+12>>2];c[p+16>>2]=c[n+16>>2];c[p+20>>2]=c[n+20>>2];c[p+24>>2]=c[n+24>>2];c[p+28>>2]=c[n+28>>2]}h[f>>3]=+h[j>>3]-+h[n>>3];h[d+32>>3]=+h[i>>3]-+h[g>>3];c[d+72>>2]=k;if((a[e>>0]|0)==1){l6(c[d>>2]|0);c[d>>2]=Y3(141914)|0}e=c[q>>2]|0}l=r;return e|0}function AU(b,d){b=b|0;d=d|0;var e=0;a:do switch(FC(b)|0){case 0:{kA(d,HB(b)|0)|0;break}case 1:{kA(d,HB(b)|0)|0;break}case 2:{kA(d,HB(c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0)|0;e=b+-48|0;kA(d,HB(c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0)|0)|0;if(!(uB(uC(c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0)|0)|0)){kA(d,142050)|0;break a}else{kA(d,138041)|0;break a}}default:{}}while(0);e=d+4|0;b=c[e>>2]|0;if(b>>>0>=(c[d+8>>2]|0)>>>0){iA(d,1)|0;b=c[e>>2]|0}a[b>>0]=0;d=c[d>>2]|0;c[e>>2]=d;return d|0}function BU(b){b=b|0;var c=0,d=0;c=NA(b,138032)|0;if(!((c|0)!=0?(a[c>>0]|0)!=0:0))d=3;do if((d|0)==3){c=NA(b,141126)|0;if(c|0?a[c>>0]|0:0)break;c=0}while(0);return c|0}function CU(f,g,i,j){f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+16|0;u=w+8|0;t=w;v=g+108|0;k=c[v>>2]|0;if(k|0)XT(j,k,186744);c[g+80>>2]=i;k=JU(f,g,j)|0;r=g+36|0;f=e[r>>1]|0;i=g+32|0;if(!(f&128))a[i>>0]=2;m=g+33|0;if(!(f&32))a[m>>0]=1;xU(g);n=c[g+104>>2]|0;p=a[i>>0]|0;f=S(p,n+1|0)|0;o=d[m>>0]<<1;q=c[g+100>>2]|0;p=S(q+1|0,p)|0;m=g+96|0;f=o+f|0;i=0;while(1){if((i|0)>=(n|0))break;f=(c[(c[m>>2]|0)+(i<<2)>>2]|0)+f|0;i=i+1|0}n=g+92|0;i=p+o|0;m=0;while(1){if((m|0)>=(q|0))break;i=(c[(c[n>>2]|0)+(m<<2)>>2]|0)+i|0;m=m+1|0}n=g+38|0;o=g+40|0;do if(b[r>>1]&1){r=b[n>>1]|0;m=r&65535;if(r<<16>>16?(s=b[o>>1]|0,s<<16>>16):0){if(!((m|0)<(f|0)|(s&65535|0)<(i|0))){i=0;f=0;break}dA(0,137832,t)|0;k=1;i=0;f=0;break}dA(0,137866,u)|0;k=1}while(0);u=e[n>>1]|0;h[g+64>>3]=+(((f|0)>(u|0)?f:u)|0);u=e[o>>1]|0;h[g+72>>3]=+(((i|0)>(u|0)?i:u)|0);if(c[v>>2]|0)dU(j,186744);l=w;return k|0}function DU(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;h[a>>3]=b;h[a+8>>3]=c;h[a+16>>3]=d;h[a+24>>3]=e;return}function EU(f,g,i){f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0;J=l;l=l+64|0;H=J+32|0;I=J;w=c[f+84>>2]|0;m=c[f+80>>2]|0;if((m|0?(j=c[m+24>>2]|0,j|0):0)?(k=f+24|0,(c[k>>2]|0)==0):0)c[k>>2]=Y3(j)|0;G=f+48|0;j=g+16|0;o=+h[j>>3];n=+h[g>>3];k=~~(o-n-+(~~+h[f+64>>3]|0));if((k|0)<=-1)Aa(137799,137643,1761,137809);m=g+24|0;u=+h[m>>3];p=g+8|0;q=+h[p>>3];r=+(~~+h[f+72>>3]|0);s=~~(u-q-r);if((s|0)<=-1)Aa(137822,137643,1764,137809);t=e[f+36>>1]|0;a:do if(t&1){b:do if((k|0)>0)switch(t&6){case 4:{h[j>>3]=n+r;break b}case 2:{K=+(k|0);h[j>>3]=o+K;n=K+n;h[g>>3]=n;break b}default:{K=+(k>>>1|0);n=n+K;h[g>>3]=n;h[j>>3]=o-K;break b}}while(0);if((s|0)>0)switch(t&24){case 16:{u=q+r;h[m>>3]=u;s=0;j=0;break a}case 8:{K=+(s|0);u=K+u;h[m>>3]=u;h[p>>3]=q+K;s=0;j=0;break a}default:{K=+(s>>>1|0);h[p>>3]=q+K;u=u-K;h[m>>3]=u;s=0;j=0;break a}}else{s=0;j=0}}else j=k;while(0);o=+(d[f+33>>0]|0);E=f+32|0;F=a[E>>0]|0;v=F<<24>>24;q=+(F<<24>>24);F=f+104|0;m=c[F>>2]|0;t=(j|0)/(m|0)|0;p=j-(S(t,m)|0)|0;p=~~(+(p|0)+((p|0)>-1?.5:-.5));D=f+96|0;t=t+v|0;j=~~(n+o+q);k=0;while(1){if((k|0)>(m|0))break;C=(c[D>>2]|0)+(k<<2)|0;m=c[C>>2]|0;c[C>>2]=j;j=t+j+((k|0)<(p|0)&1)+m|0;k=k+1|0;m=c[F>>2]|0}C=f+100|0;m=c[C>>2]|0;p=(s|0)/(m|0)|0;s=s-(S(p,m)|0)|0;s=~~(+(s|0)+((s|0)>-1?.5:-.5));B=f+92|0;p=p+v|0;j=~~(u-o-q);k=0;while(1){if((k|0)>(m|0))break;A=(c[B>>2]|0)+(k<<2)|0;m=c[A>>2]|0;c[A>>2]=j;j=j-p+(((k|0)<(s|0))<<31>>31)-m|0;k=k+1|0;m=c[C>>2]|0}x=(i|0)==0;y=I+16|0;z=I+24|0;A=I+8|0;m=w;while(1){p=c[m>>2]|0;if(!p)break;j=b[p+84>>1]|0;k=b[p+86>>1]|0;s=k&65535;t=j&65535;v=(e[p+80>>1]|0)+t|0;w=(e[p+82>>1]|0)+s|0;if(x)j=0;else{j=j<<16>>16==0?8:0;j=k<<16>>16==0?j|4:j;j=(w|0)==(c[C>>2]|0)|((v|0)==(c[F>>2]|0)?j|2:j)}k=c[D>>2]|0;h[I>>3]=+(c[k+(t<<2)>>2]|0);t=a[E>>0]|0;h[y>>3]=+((c[k+(v<<2)>>2]|0)-t|0);v=c[B>>2]|0;h[z>>3]=+(c[v+(s<<2)>>2]|0);h[A>>3]=+((c[v+(w<<2)>>2]|0)+t|0);c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];c[H+16>>2]=c[I+16>>2];c[H+20>>2]=c[I+20>>2];c[H+24>>2]=c[I+24>>2];c[H+28>>2]=c[I+28>>2];GU(p,H,j&i);m=m+4|0}a[f+35>>0]=i;c[G>>2]=c[g>>2];c[G+4>>2]=c[g+4>>2];c[G+8>>2]=c[g+8>>2];c[G+12>>2]=c[g+12>>2];c[G+16>>2]=c[g+16>>2];c[G+20>>2]=c[g+20>>2];c[G+24>>2]=c[g+24>>2];c[G+28>>2]=c[g+28>>2];l=J;return}function FU(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0.0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0.0,S=0.0;P=l;l=l+112|0;I=P+48|0;J=P+16|0;K=P;c[J>>2]=0;c[J+4>>2]=0;c[J+8>>2]=0;c[J+12>>2]=0;c[J+16>>2]=0;c[J+20>>2]=0;c[J+24>>2]=0;c[J+28>>2]=0;L=e+4|0;M=J+16|0;N=f+16|0;O=f+32|0;r=b[L>>1]|0;n=r<<16>>16;g=0;j=-1.0;m=0;while(1){if((m|0)>=(n|0)){g=1;break}i=c[e>>2]|0;if((b[i+(m*24|0)+4>>1]|0)>1){g=0;break}i=c[(c[i+(m*24|0)>>2]|0)+4>>2]|0;if(!i){k=+h[O>>3];h[M>>3]=k;i=N}else{if(c[i+24>>2]&127|0){g=0;break}k=+h[(+h[i+16>>3]>0.0?i:N)+16>>3];h[M>>3]=k;i=(c[i>>2]|0)==0?N:i}i=c[i>>2]|0;c[J>>2]=i;if(!(j==-1.0)){if(k!=j){g=0;break}}else j=k;if(g){if(f2(i,g)|0){g=0;break}}else g=i;m=m+1|0}a[e+6>>0]=g;E=f+48|0;F=J+4|0;G=J+24|0;H=f+40|0;x=f+20|0;y=d+144|0;z=I+4|0;w=K+8|0;A=I+16|0;B=I+24|0;C=I+8|0;D=I+12|0;v=(g|0)==0;j=0.0;s=0.0;t=0.0;u=0.0;f=0;g=r;while(1){if((f|0)>=(g<<16>>16|0))break;k=0.0;q=0.0;n=0;p=0.0;j=0.0;i=c[e>>2]|0;while(1){if((n|0)>=(b[i+(f*24|0)+4>>1]|0))break;c[I>>2]=CK(c[(c[i+(f*24|0)>>2]|0)+(n*56|0)>>2]|0,c[E>>2]|0)|0;i=(c[e>>2]|0)+(f*24|0)|0;g=c[(c[i>>2]|0)+(n*56|0)+4>>2]|0;m=c[G>>2]&-128;if(!g){h[M>>3]=+h[O>>3];c[J>>2]=c[N>>2];c[F>>2]=c[x>>2];c[G>>2]=c[H>>2]&127|m}else{g=c[g+24>>2]&127;if(!g)g=c[H>>2]&127;c[G>>2]=g|m;r=c[(c[i>>2]|0)+(n*56|0)+4>>2]|0;h[M>>3]=+h[(+h[r+16>>3]>0.0?r:N)+16>>3];c[J>>2]=c[((c[r>>2]|0)==0?N:r)>>2];c[F>>2]=c[((c[r+4>>2]|0)==0?N:r)+4>>2]}i=c[y>>2]|0;c[z>>2]=eb[c[i>>2]&63](i,J,1)|0;JO(K,d,I);R=+h[K>>3];o=+h[w>>3];l6(c[(c[(c[e>>2]|0)+(f*24|0)>>2]|0)+(n*56|0)>>2]|0);i=c[e>>2]|0;r=c[i+(f*24|0)>>2]|0;c[r+(n*56|0)>>2]=c[I>>2];h[r+(n*56|0)+32>>3]=R;h[r+(n*56|0)+16>>3]=+h[A>>3];h[r+(n*56|0)+24>>3]=+h[B>>3];c[r+(n*56|0)+4>>2]=c[z>>2];c[r+(n*56|0)+8>>2]=c[C>>2];c[r+(n*56|0)+12>>2]=c[D>>2];Q=+h[M>>3];S=+h[B>>3];k=S>k?S:k;q=q+R;n=n+1|0;p=Q>p?Q:p;j=o>j?o:j}h[i+(f*24|0)+8>>3]=q;g=(f|0)==0;do if(v)if(g){o=p;k=p-k;break}else{o=p;k=t+p-u-k;break}else{o=j;k=g?p:j}while(0);h[i+(f*24|0)+16>>3]=k;s=q>s?q:s;t=t+o;u=u+k;f=f+1|0;g=b[L>>1]|0}h[e+24>>3]=s;h[e+32>>3]=g<<16>>16==1?j:t;l=P;return}function GU(f,g,i){f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0;z=l;l=l+64|0;v=z+32|0;y=z;k=f+24|0;if((c[k>>2]|0)==0?(j=c[(c[f+96>>2]|0)+24>>2]|0,j|0):0)c[k>>2]=Y3(j)|0;u=f+36|0;t=e[u>>1]|0;k=g+8|0;j=g+16|0;w=t&6;s=g+24|0;x=t&24;a:do if(t&1){m=+h[f+64>>3];r=+h[f+72>>3];n=+h[j>>3];p=+h[g>>3];o=n-p-m;b:do if(o>0.0)switch(w&7){case 4:{n=m+p;h[j>>3]=n;m=p;break b}case 2:{n=n+o;h[j>>3]=n;m=o+p;h[g>>3]=m;break b}default:{q=o*.5;m=p+q;h[g>>3]=m;n=n-q;h[j>>3]=n;break b}}else m=p;while(0);q=+h[s>>3];p=+h[k>>3];o=q-p-r;if(o>0.0)switch(x&31){case 16:{o=r+p;h[s>>3]=o;break a}case 8:{r=q+o;h[s>>3]=r;p=o+p;h[k>>3]=p;o=r;break a}default:{o=o*.5;p=p+o;h[k>>3]=p;o=q-o;h[s>>3]=o;break a}}else o=q}else{m=+h[g>>3];p=+h[k>>3];n=+h[j>>3];o=+h[s>>3]}while(0);t=f+48|0;c[t>>2]=c[g>>2];c[t+4>>2]=c[g+4>>2];c[t+8>>2]=c[g+8>>2];c[t+12>>2]=c[g+12>>2];c[t+16>>2]=c[g+16>>2];c[t+20>>2]=c[g+20>>2];c[t+24>>2]=c[g+24>>2];c[t+28>>2]=c[g+28>>2];a[f+35>>0]=i;B=+(d[f+33>>0]|0);A=+(d[f+34>>0]|0);q=m+B+A;h[y>>3]=q;r=A+(B+p);t=y+8|0;h[t>>3]=r;p=n-B-A;s=y+16|0;h[s>>3]=p;o=o-B-A;g=y+24|0;h[g>>3]=o;j=a[f+92>>0]|0;k=f+88|0;do if(j<<24>>24==1){x=c[k>>2]|0;c[v>>2]=c[y>>2];c[v+4>>2]=c[y+4>>2];c[v+8>>2]=c[y+8>>2];c[v+12>>2]=c[y+12>>2];c[v+16>>2]=c[y+16>>2];c[v+20>>2]=c[y+20>>2];c[v+24>>2]=c[y+24>>2];c[v+28>>2]=c[y+28>>2];EU(x,v,i)}else{m=p-q;if(j<<24>>24==3){j=c[k>>2]|0;n=+h[j+24>>3];m=m-+h[j+16>>3];c:do if(m>0.0)switch(w&7){case 4:{h[s>>3]=p-m;break c}case 2:{h[y>>3]=q+m;break c}default:break c}while(0);m=o-r-n;d:do if(m>0.0)switch(x&31){case 16:{h[g>>3]=o-m;break d}case 8:{h[t>>3]=r+m;break d}default:break d}while(0);c[v>>2]=c[y>>2];c[v+4>>2]=c[y+4>>2];c[v+8>>2]=c[y+8>>2];c[v+12>>2]=c[y+12>>2];c[v+16>>2]=c[y+16>>2];c[v+20>>2]=c[y+20>>2];c[v+24>>2]=c[y+24>>2];c[v+28>>2]=c[y+28>>2];HU(j,v);break}j=c[k>>2]|0;n=+h[j+32>>3];m=m-+h[j+24>>3];e:do if(!((w|0)==6|!(m>0.0)))switch(w&7){case 4:{h[s>>3]=p-m;break e}case 2:{h[y>>3]=q+m;break e}default:{B=m*.5;h[y>>3]=q+B;h[s>>3]=p-B;break e}}while(0);m=o-r-n;f:do if(m>0.0)switch(x&31){case 16:{h[g>>3]=o-m;break f}case 8:{h[t>>3]=r+m;break f}default:{B=m*.5;h[t>>3]=r+B;h[g>>3]=o-B;break f}}while(0);x=j+8|0;c[x>>2]=c[y>>2];c[x+4>>2]=c[y+4>>2];c[x+8>>2]=c[y+8>>2];c[x+12>>2]=c[y+12>>2];c[x+16>>2]=c[y+16>>2];c[x+20>>2]=c[y+20>>2];c[x+24>>2]=c[y+24>>2];c[x+28>>2]=c[y+28>>2];y=b[u>>1]&768;IU(c[k>>2]|0,(y&1023)==512?108:(y&1023)==256?114:110)}while(0);l=z;return}function HU(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+20>>2]=c[b+20>>2];c[a+24>>2]=c[b+24>>2];c[a+28>>2]=c[b+28>>2];return}function IU(d,e){d=d|0;e=e|0;var f=0,g=0,h=0;g=b[d+4>>1]|0;f=0;while(1){if((f|0)>=(g|0))break;h=(c[d>>2]|0)+(f*24|0)+6|0;if(!(a[h>>0]|0))a[h>>0]=e;f=f+1|0}return}function JU(d,f,g){d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;l=f+84|0;t=c[l>>2]|0;u=IL()|0;v=NU()|0;i=0;h=0;k=Qz(t)|0;while(1){if(!k)break;j=Qz(c[k+8>>2]|0)|0;while(1){if(!j)break;j=c[j>>2]|0;i=i+1|0}h=h+1|0;if(a[k+12>>0]|0)RU(v,h);k=c[k>>2]|0}h=HK((i<<2)+4|0)|0;c[l>>2]=h;i=0;j=0;k=0;q=0;r=Qz(t)|0;while(1){if(!r)break;s=q&65535;p=0;o=Qz(c[r+8>>2]|0)|0;while(1){if(!o)break;n=c[o+8>>2]|0;c[h>>2]=n;k=KU(d,n,f,g)|0|k;l=LU(u,q,p,n)|0;b[n+86>>1]=s;b[n+84>>1]=l;l=(e[n+80>>1]|0)+l|0;m=(e[n+82>>1]|0)+q|0;if(SU(v,m)|0){p=n+100|0;a[p>>0]=a[p>>0]|2}p=l;h=h+4|0;o=c[o>>2]|0;i=(l|0)>(i|0)?l:i;j=(m|0)>(j|0)?m:j}q=q+1|0;r=c[r>>2]|0}c[f+100>>2]=j;c[f+104>>2]=i;Oz(t)|0;Oz(v)|0;LL(u);return k|0}function KU(f,g,i,j){f=f|0;g=g|0;i=i|0;j=j|0;var k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0;x=l;l=l+16|0;w=x+8|0;v=x;c[g+96>>2]=i;t=g+36|0;o=e[t>>1]|0;s=g+34|0;p=i+36|0;if(!(o&64)){if(!(b[p>>1]&64))n=2;else n=a[i+34>>0]|0;a[s>>0]=n}q=g+33|0;if(!(o&32)){n=a[i+88>>0]|0;if(n<<24>>24<=-1)if(!(b[p>>1]&32))n=1;else n=a[i+33>>0]|0;a[q>>0]=n}r=g+92|0;n=g+88|0;switch(a[r>>0]|0){case 1:{o=CU(f,c[n>>2]|0,g,j)|0;p=c[n>>2]|0;n=o;o=p+64|0;p=p+72|0;break}case 3:{o=MU(c[n>>2]|0,j)|0;p=c[n>>2]|0;n=o;o=p+16|0;p=p+24|0;break}default:{FU(c[(c[f+16>>2]|0)+144>>2]|0,c[n>>2]|0,j);p=c[n>>2]|0;n=0;o=p+24|0;p=p+32|0}}k=+((d[q>>0]|0)+(d[s>>0]|0)<<1|0);m=+h[o>>3]+k;k=+h[p>>3]+k;p=g+38|0;i=g+40|0;do if(b[t>>1]&1){o=b[p>>1]|0;if(o<<16>>16?(u=b[i>>1]|0,u<<16>>16):0){if(!(+(o&65535)>0]|0)==3){m=0.0;k=0.0;break}dA(0,137917,v)|0;n=1;m=0.0;k=0.0;break}dA(0,137950,w)|0;n=1}while(0);y=+(e[p>>1]|0);h[g+64>>3]=m>y?m:y;m=+(e[i>>1]|0);h[g+72>>3]=k>m?k:m;l=x;return n|0}function LU(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var f=0,g=0,h=0,i=0,j=0;j=d+80|0;i=(e[j>>1]|0)+-1|0;h=0;a:while(1){f=c;while(1){if(h)break a;g=i+f|0;while(1){if((g|0)<(f|0)){c=f;h=1;continue a}if(QL(a,g,b)|0)break;g=g+-1|0}f=g+1|0}}h=d+82|0;f=c;while(1){if((f|0)<((e[j>>1]|0)+c|0))g=b;else break;while(1){if((g|0)>=((e[h>>1]|0)+b|0))break;OL(a,f,g);g=g+1|0}f=f+1|0}return c|0}function MU(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;j=m;i=m+8|0;d=d+52|0;g=b+32|0;PF(i,c[d>>2]|0,c[g>>2]|0);k=c[i>>2]|0;i=c[i+4>>2]|0;if((i&k|0)==-1){c[j>>2]=c[g>>2];dA(1,138e3,j)|0;d=1;f=0.0;e=0.0}else{a[(c[(c[d>>2]|0)+16>>2]|0)+114>>0]=1;d=0;f=+(i|0);e=+(k|0)}c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;h[b+16>>3]=e;h[b+24>>3]=f;l=m;return d|0}function NU(){return Sz(55976,c[4591]|0)|0}function OU(a,b,d){a=a|0;b=b|0;d=d|0;d=HK(12)|0;c[d>>2]=c[b>>2];return d|0}function PU(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function QU(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=c[b>>2]|0;e=c[d>>2]|0;return ((b|0)>(e|0)?1:((b|0)<(e|0))<<31>>31)|0}function RU(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;eb[c[a>>2]&63](a,e,1)|0;l=d;return}function SU(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=(eb[c[a>>2]&63](a,e,512)|0)!=0&1;l=d;return b|0}function TU(a){a=a|0;var b=0;if(!(c[47446]|0)){b=HK((a<<2)+4|0)|0;c[47446]=b;c[b>>2]=189788;c[47457]=a}c[47458]=0;return}function UU(){l6(c[47446]|0);c[47446]=0;c[47458]=0;return}function VU(){c[47458]=0;return}function WU(){var a=0,b=0,d=0;b=c[47458]|0;d=c[47446]|0;a=1;while(1){if((a|0)>(b|0)){a=5;break}if((c[(c[d+(a<<2)>>2]|0)+4>>2]|0)==(a|0))a=a+1|0;else{a=4;break}}if((a|0)==4)Aa(138697,138044,59,138050);else if((a|0)==5)return}function XU(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;f=c[47446]|0;g=c[f+(a<<2)>>2]|0;h=c[g>>2]|0;while(1){b=(a|0)/2|0;d=c[f+(b<<2)>>2]|0;e=f+(a<<2)|0;if((c[d>>2]|0)>=(h|0))break;c[e>>2]=d;c[d+4>>2]=a;a=b}c[e>>2]=g;c[g+4>>2]=a;return}function YU(a){a=a|0;var b=0,d=0;d=l;l=l+16|0;b=c[47458]|0;if((b|0)==(c[47457]|0)){dA(1,138058,d)|0;a=1}else{b=b+1|0;c[47458]=b;c[(c[47446]|0)+(b<<2)>>2]=a;XU(b);WU();a=0}l=d;return a|0}function ZU(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=c[47446]|0;g=c[f+(a<<2)>>2]|0;h=c[g>>2]|0;i=c[47458]|0;j=(i|0)/2|0;while(1){e=f+(a<<2)|0;if((a|0)>(j|0))break;d=a<<1;b=c[f+(d<<2)>>2]|0;if((d|0)<(i|0)){m=d|1;k=c[f+(m<<2)>>2]|0;l=(c[b>>2]|0)<(c[k>>2]|0);d=l?m:d;b=l?k:b}if((h|0)>=(c[b>>2]|0))break;c[e>>2]=b;c[b+4>>2]=a;a=d}c[e>>2]=g;c[g+4>>2]=a;return}function _U(){var a=0,b=0,d=0,e=0;b=c[47458]|0;if(!b)a=0;else{e=c[47446]|0;d=e+4|0;a=c[d>>2]|0;c[d>>2]=c[e+(b<<2)>>2];b=b+-1|0;c[47458]=b;if(b|0)ZU(1);WU()}return a|0}function $U(a,b){a=a|0;b=b|0;c[a>>2]=b;XU(c[a+4>>2]|0);WU();return}function aV(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=b+16|0;j=c[m>>2]|0;j=(a[j+((c[e+12>>2]|0)*40|0)+36>>0]|0)!=(a[j+((c[e+16>>2]|0)*40|0)+36>>0]|0);k=~~((+h[d+64>>3]-+h[d+48>>3]+-3.0)*.5);l=~~((+h[d+56>>3]-+h[d+40>>3]+-3.0)*.5);g=(k|0)<(l|0)?k:l;n=d+4|0;f=0;while(1){b=c[n>>2]|0;if((f|0)>=(b|0)){g=f;break}i=c[d+8+(f<<2)>>2]|0;o=c[m>>2]|0;if((a[o+((c[i+12>>2]|0)*40|0)+36>>0]|0)==(a[o+((c[i+16>>2]|0)*40|0)+36>>0]|0)){g=f;break}bV(i,g);f=f+1|0}while(1){if((g|0)>=(b|0))break;f=c[d+8+(g<<2)>>2]|0;if(j|(f|0)==(e|0)){bV(f,a[(c[m>>2]|0)+((c[f+12>>2]|0)*40|0)+36>>0]|0?k:l);b=c[n>>2]|0}g=g+1|0}return}function bV(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+8|0;e=c[d>>2]|0;c[d>>2]=e+1;if((e|0)>=(b|0)){c[d>>2]=0;h[a>>3]=+h[a>>3]+16384.0}return}function cV(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0,E=0.0;x=l;l=l+112|0;u=x+64|0;t=x+96|0;m=x+32|0;v=x;w=HK(28)|0;b=qB(a)|0;s=w+4|0;c[s>>2]=b;b=HK(b*72|0)|0;r=w+12|0;c[r>>2]=b;e=v+8|0;h[e>>3]=1797693134862315708145274.0e284;h[v>>3]=1797693134862315708145274.0e284;f=v+24|0;h[f>>3]=-1797693134862315708145274.0e284;g=v+16|0;h[g>>3]=-1797693134862315708145274.0e284;i=m+16|0;j=m+8|0;k=m+24|0;d=gC(a)|0;n=1797693134862315708145274.0e284;o=1797693134862315708145274.0e284;p=-1797693134862315708145274.0e284;q=-1797693134862315708145274.0e284;while(1){if(!d)break;C=d+16|0;D=c[C>>2]|0;z=(+h[D+88>>3]+ +h[D+96>>3])*.5;z=z<1.0?1.0:z;E=+h[D+80>>3]*.5;E=E<1.0?1.0:E;y=+h[D+16>>3];B=y-z;h[m>>3]=B;z=y+z;h[i>>3]=z;y=+h[D+24>>3];A=y-E;h[j>>3]=A;y=E+y;h[k>>3]=y;B=+h[(n>3];h[v>>3]=B;A=+h[(o>3];h[e>>3]=A;z=+h[(p>z?v:m)+16>>3];h[g>>3]=z;y=+h[(q>y?v:m)+24>>3];h[f>>3]=y;D=b+40|0;c[D>>2]=c[m>>2];c[D+4>>2]=c[m+4>>2];c[D+8>>2]=c[m+8>>2];c[D+12>>2]=c[m+12>>2];c[D+16>>2]=c[m+16>>2];c[D+20>>2]=c[m+20>>2];c[D+24>>2]=c[m+24>>2];c[D+28>>2]=c[m+28>>2];c[b>>2]=c[b>>2]|1;c[(c[C>>2]|0)+112>>2]=b;b=b+72|0;d=hC(a,d)|0;n=B;o=A;p=z;q=y}h[v>>3]=n+-36.0;h[e>>3]=o+-36.0;h[g>>3]=p+36.0;h[f>>3]=q+36.0;D=c[r>>2]|0;f=c[s>>2]|0;c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];c[u+16>>2]=c[v+16>>2];c[u+20>>2]=c[v+20>>2];c[u+24>>2]=c[v+24>>2];c[u+28>>2]=c[v+28>>2];f=mV(D,f,t,u)|0;if(c[47394]&1|0){r=c[r>>2]|0;C=c[s>>2]|0;D=c[t>>2]|0;c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];c[u+16>>2]=c[v+16>>2];c[u+20>>2]=c[v+20>>2];c[u+24>>2]=c[v+24>>2];c[u+28>>2]=c[v+28>>2];dV(r,C,u,f,D)}e=w+8|0;c[e>>2]=HK((c[t>>2]|0)*72|0)|0;c[w>>2]=c[t>>2];d=c[t>>2]|0;b=0;while(1){if((b|0)>=(d|0))break;D=(c[e>>2]|0)+(b*72|0)+40|0;C=f+(b<<5)|0;c[D>>2]=c[C>>2];c[D+4>>2]=c[C+4>>2];c[D+8>>2]=c[C+8>>2];c[D+12>>2]=c[C+12>>2];c[D+16>>2]=c[C+16>>2];c[D+20>>2]=c[C+20>>2];c[D+24>>2]=c[C+24>>2];c[D+28>>2]=c[C+28>>2];b=b+1|0}l6(f);c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];c[u+16>>2]=c[v+16>>2];c[u+20>>2]=c[v+20>>2];c[u+24>>2]=c[v+24>>2];c[u+28>>2]=c[v+28>>2];c[w+16>>2]=eV(w,u)|0;l=x;return w|0}function dV(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0;q=l;l=l+128|0;p=q+96|0;o=q+64|0;j=q+32|0;r=q+16|0;s=q;m=+h[d+16>>3];n=+h[d>>3];k=+h[d+24>>3];g=+h[d+8>>3];i=c[15715]|0;Z3(c[14003]|0,i)|0;c[s>>2]=10;c[s+4>>2]=10;c[s+8>>2]=~~(m+10.0-n);c[s+12>>2]=~~(k+10.0-g);z4(i,138503,s)|0;h[r>>3]=10.0-n;h[r+8>>3]=10.0-g;z4(i,138551,r)|0;Z3(138568,i)|0;d=0;while(1){if((d|0)>=(b|0))break;v=+h[a+(d*72|0)+48>>3];u=+h[a+(d*72|0)+56>>3];t=+h[a+(d*72|0)+64>>3];h[j>>3]=+h[a+(d*72|0)+40>>3];h[j+8>>3]=v;h[j+16>>3]=u;h[j+24>>3]=t;z4(i,138587,j)|0;d=d+1|0}Z3(138605,i)|0;d=0;while(1){if((d|0)>=(f|0))break;t=+h[e+(d<<5)+8>>3];u=+h[e+(d<<5)+16>>3];v=+h[e+(d<<5)+24>>3];h[o>>3]=+h[e+(d<<5)>>3];h[o+8>>3]=t;h[o+16>>3]=u;h[o+24>>3]=v;z4(i,138624,o)|0;d=d+1|0}Z3(138642,i)|0;h[p>>3]=n;h[p+8>>3]=g;h[p+16>>3]=m;h[p+24>>3]=k;z4(i,138624,p)|0;Z3(c[14004]|0,i)|0;l=q;return}function eV(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;z=l;l=l+32|0;t=z+16|0;m=z;v=c[a>>2]|0;x=AR(v<<2|2)|0;y=Sz(56020,c[4591]|0)|0;u=Sz(56056,c[4591]|0)|0;v=HK(v<<7)|0;g=HK(c[a>>2]<<4)|0;w=a+8|0;i=b+16|0;j=m+8|0;k=b+24|0;n=b+8|0;e=0;while(1){if((e|0)>=(c[a>>2]|0))break;d=c[w>>2]|0;o=d+(e*72|0)|0;c[d+(e*72|0)+32>>2]=4;p=d+(e*72|0)+36|0;c[p>>2]=g+(e<<2<<2);f=+h[d+(e*72|0)+56>>3];q=d+(e*72|0)+40|0;r=d+(e*72|0)+48|0;if(f<+h[i>>3]){h[m>>3]=f;h[j>>3]=+h[r>>3];c[t>>2]=c[m>>2];c[t+4>>2]=c[m+4>>2];c[t+8>>2]=c[m+8>>2];c[t+12>>2]=c[m+12>>2];s=fV(x,y,t,v,1)|0;c[s+20>>2]=o;c[c[p>>2]>>2]=s}f=+h[d+(e*72|0)+64>>3];if(f<+h[k>>3]){h[m>>3]=+h[q>>3];h[j>>3]=f;c[t>>2]=c[m>>2];c[t+4>>2]=c[m+4>>2];c[t+8>>2]=c[m+8>>2];c[t+12>>2]=c[m+12>>2];s=fV(x,u,t,v,0)|0;c[s+20>>2]=o;c[(c[p>>2]|0)+4>>2]=s}if(+h[q>>3]>+h[b>>3]){c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];s=fV(x,y,t,v,1)|0;c[s+24>>2]=o;c[(c[p>>2]|0)+8>>2]=s}if(+h[r>>3]>+h[n>>3]){c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];s=fV(x,u,t,v,0)|0;c[s+24>>2]=o;c[(c[p>>2]|0)+12>>2]=s}e=e+1|0}o=HK(c[x>>2]<<2)|0;r=a+4|0;s=a+12|0;p=t+8|0;m=0;q=0;n=0;while(1){d=c[r>>2]|0;if((n|0)>=(d|0)){e=0;break}e=c[s>>2]|0;i=e+(n*72|0)|0;j=e+(n*72|0)+36|0;c[j>>2]=o+(m<<2);b=e+(n*72|0)+40|0;c[t>>2]=c[b>>2];c[t+4>>2]=c[b+4>>2];c[t+8>>2]=c[b+8>>2];c[t+12>>2]=c[b+12>>2];b=e+(n*72|0)+56|0;k=e+(n*72|0)+32|0;d=eb[c[u>>2]&63](u,t,512)|0;while(1){if(!d)break;if(!(+h[d+8>>3]<+h[b>>3]))break;B=c[d>>2]|0;A=c[j>>2]|0;g=c[k>>2]|0;c[k>>2]=g+1;c[A+(g<<2)>>2]=B;c[(c[d>>2]|0)+24>>2]=i;d=eb[c[u>>2]&63](u,d,8)|0}g=e+(n*72|0)+64|0;d=eb[c[y>>2]&63](y,t,512)|0;while(1){f=+h[g>>3];if(!d)break;if(!(+h[d+16>>3]>2]|0;A=c[j>>2]|0;B=c[k>>2]|0;c[k>>2]=B+1;c[A+(B<<2)>>2]=C;c[(c[d>>2]|0)+24>>2]=i;d=eb[c[y>>2]&63](y,d,8)|0}h[p>>3]=f;d=eb[c[u>>2]&63](u,t,512)|0;while(1){f=+h[b>>3];if(!d)break;if(!(+h[d+8>>3]>2]|0;B=c[j>>2]|0;C=c[k>>2]|0;c[k>>2]=C+1;c[B+(C<<2)>>2]=A;c[(c[d>>2]|0)+20>>2]=i;d=eb[c[u>>2]&63](u,d,8)|0}h[t>>3]=f;h[p>>3]=+h[e+(n*72|0)+48>>3];d=eb[c[y>>2]&63](y,t,512)|0;while(1){e=c[k>>2]|0;if(!d)break;if(!(+h[d+16>>3]<+h[g>>3]))break;B=c[d>>2]|0;C=c[j>>2]|0;c[k>>2]=e+1;c[C+(e<<2)>>2]=B;c[(c[d>>2]|0)+20>>2]=i;d=eb[c[y>>2]&63](y,d,8)|0}m=e+m|0;q=(e|0)>(q|0)?e:q;n=n+1|0}while(1){if((e|0)>=(d|0))break;gV((c[s>>2]|0)+(e*72|0)|0);e=e+1|0;d=c[r>>2]|0}d=c[x>>2]|0;C=c[x+16>>2]|0;c[C+(d*40|0)+32>>2]=d;d=d+1|0;c[C+(d*40|0)+32>>2]=d;zR(x,q);d=0;while(1){if((d|0)>=(c[a>>2]|0))break;hV((c[w>>2]|0)+(d*72|0)|0,x);d=d+1|0}Oz(y)|0;Oz(u)|0;l6(v);iV(x);xR(x);l=z;return x|0}function fV(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=eb[c[d>>2]&63](d,e,512)|0;do if(!h){b=BR(b)|0;if(!f)Aa(138486,138434,291,138493);else{h=c[b+32>>2]|0;i=f+(h<<5)|0;f=f+(h<<5)+8|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];c[i>>2]=b;a[b+36>>0]=g;eb[c[d>>2]&63](d,i,1)|0;break}}else i=h;while(0);return c[i>>2]|0}function gV(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0;j=b+32|0;k=b+36|0;a:do if((+h[b+64>>3]-+h[b+48>>3]+-3.0)*.5<2.0){i=c[j>>2]|0;g=0;while(1){if((g|0)>=(i|0))break a;d=c[(c[k>>2]|0)+(g<<2)>>2]|0;b:do if(a[d+36>>0]|0){f=c[d+20>>2]|0;if((f|0)==(b|0)){e=c[d+24>>2]|0;d=e;e=c[e>>2]|0;do{c[d>>2]=e|8;d=c[c[d+36>>2]>>2]|0;if(!d)break b;d=c[d+24>>2]|0;e=c[d>>2]|0}while(!(e&1|0))}else{e=f;d=c[f>>2]|0;do{c[e>>2]=d|8;d=c[(c[e+36>>2]|0)+8>>2]|0;if(!d)break b;e=c[d+20>>2]|0;d=c[e>>2]|0}while(!(d&1|0))}}while(0);g=g+1|0}}while(0);c:do if((+h[b+56>>3]-+h[b+40>>3]+-3.0)*.5<2.0){i=c[j>>2]|0;g=0;while(1){if((g|0)>=(i|0))break c;d=c[(c[k>>2]|0)+(g<<2)>>2]|0;d:do if(!(a[d+36>>0]|0)){f=c[d+20>>2]|0;if((f|0)==(b|0)){e=c[d+24>>2]|0;d=e;e=c[e>>2]|0;do{c[d>>2]=e|16;d=c[(c[d+36>>2]|0)+4>>2]|0;if(!d)break d;d=c[d+24>>2]|0;e=c[d>>2]|0}while(!(e&1|0))}else{e=f;d=c[f>>2]|0;do{c[e>>2]=d|16;d=c[(c[e+36>>2]|0)+12>>2]|0;if(!d)break d;e=c[d+20>>2]|0;d=c[e>>2]|0}while(!(d&1|0))}}while(0);g=g+1|0}}while(0);return}function hV(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0;g=+h[a+56>>3]-+h[a+40>>3];i=+h[a+64>>3]-+h[a+48>>3];f=(g+i)*.5+500.0;if((i+-3.0)*.5<2.0){l=(c[a>>2]&8|0)==0;f=l?16384.0:f;p=l?16384.0:g}else p=g;if((g+-3.0)*.5<2.0){l=(c[a>>2]&16|0)==0;i=l?16384.0:i;f=l?16384.0:f}l=a+36|0;d=c[l>>2]|0;e=c[d+8>>2]|0;if((e|0)!=0?(j=c[d+4>>2]|0,(j|0)!=0):0){j=CR(b,e,j,f)|0;e=a+4|0;d=c[e>>2]|0;c[e>>2]=d+1;c[a+8+(d<<2)>>2]=j;d=c[l>>2]|0}e=c[d+4>>2]|0;if((e|0)!=0?(k=c[d>>2]|0,(k|0)!=0):0){k=CR(b,e,k,f)|0;j=a+4|0;d=c[j>>2]|0;c[j>>2]=d+1;c[a+8+(d<<2)>>2]=k;d=c[l>>2]|0}e=c[d+8>>2]|0;if((e|0)!=0?(m=c[d+12>>2]|0,(m|0)!=0):0){m=CR(b,e,m,f)|0;k=a+4|0;d=c[k>>2]|0;c[k>>2]=d+1;c[a+8+(d<<2)>>2]=m;d=c[l>>2]|0}e=c[d+12>>2]|0;if((e|0)!=0?(n=c[d>>2]|0,(n|0)!=0):0){n=CR(b,e,n,f)|0;m=a+4|0;d=c[m>>2]|0;c[m>>2]=d+1;c[a+8+(d<<2)>>2]=n;d=c[l>>2]|0}e=c[d+4>>2]|0;if((e|0)!=0?(o=c[d+12>>2]|0,(o|0)!=0):0){o=CR(b,e,o,i)|0;n=a+4|0;d=c[n>>2]|0;c[n>>2]=d+1;c[a+8+(d<<2)>>2]=o;d=c[l>>2]|0}e=c[d+8>>2]|0;if(e|0?(q=c[d>>2]|0,q|0):0){b=CR(b,e,q,p)|0;o=a+4|0;q=c[o>>2]|0;c[o>>2]=q+1;c[a+8+(q<<2)>>2]=b}return}function iV(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j+8|0;h=j;f=a+16|0;g=c[15715]|0;e=0;while(1){if((e|0)>=(c[a>>2]|0)){b=10;break}b=c[f>>2]|0;d=b+(e*40|0)+20|0;if((c[d>>2]|0)==0?(c[h>>2]=e,z4(g,138399,h)|0,(c[d>>2]|0)==0):0){b=5;break}b=b+(e*40|0)+24|0;if((c[b>>2]|0)==0?(c[i>>2]=e,z4(g,138451,i)|0,(c[b>>2]|0)==0):0){b=8;break}e=e+1|0}if((b|0)==5)Aa(138421,138434,311,138441);else if((b|0)==8)Aa(138473,138434,313,138441);else if((b|0)==10){l=j;return}}function jV(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0;e=+h[b+8>>3];f=+h[c+8>>3];if(!(e>f))if(!(e>3];e=+h[c>>3];if(f>e)a=1;else a=(f>31}else a=-1;else a=1;return a|0}function kV(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0;e=+h[b>>3];f=+h[c>>3];if(!(e>f))if(!(e>3];e=+h[c+8>>3];if(f>e)a=1;else a=(f>31}else a=-1;else a=1;return a|0}function lV(a){a=a|0;var b=0,d=0;d=a+8|0;l6(c[(c[d>>2]|0)+36>>2]|0);b=a+12|0;l6(c[(c[b>>2]|0)+36>>2]|0);l6(c[d>>2]|0);l6(c[b>>2]|0);ER(c[a+16>>2]|0);Oz(c[a+20>>2]|0)|0;Oz(c[a+24>>2]|0)|0;l6(a);return}function mV(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+32|0;h=p;i=b<<2;f=i+4|0;i=i+5|0;o=IK(i*56|0)|0;i=HK(i<<2)|0;g=f*5|1;j=IK(g*72|0)|0;m=g<<5;k=HK(m)|0;m=HK(m)|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];c[h+16>>2]=c[e+16>>2];c[h+20>>2]=c[e+20>>2];c[h+24>>2]=c[e+24>>2];c[h+28>>2]=c[e+28>>2];nV(a,b,h,o,0);W4(173);oV(f,i);yV(f,o,i,g,j)|0;n=pV(f,o,j,0,k)|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];c[h+16>>2]=c[e+16>>2];c[h+20>>2]=c[e+20>>2];c[h+24>>2]=c[e+24>>2];c[h+28>>2]=c[e+28>>2];nV(a,b,h,o,1);oV(f,i);yV(f,o,i,g,j)|0;f=pV(f,o,j,1,m)|0;g=HK(S(n<<5,f)|0)|0;b=0;a=0;while(1){if((b|0)>=(f|0))break;h=m+(b<<5)|0;e=0;while(1){if((e|0)>=(n|0))break;q=((qV(g+(a<<5)|0,h,k+(e<<5)|0)|0)!=0&1)+a|0;e=e+1|0;a=q}b=b+1|0}q=KK(g,a<<5)|0;l6(o);l6(i);l6(j);l6(k);l6(m);c[d>>2]=a;l=p;return q|0}function nV(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;j=l;l=l+96|0;h=j+64|0;i=j;c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];c[h+16>>2]=c[d+16>>2];c[h+20>>2]=c[d+20>>2];c[h+24>>2]=c[d+24>>2];c[h+28>>2]=c[d+28>>2];wV(h,f,1,i);d=xV(e,1,i)|0;g=0;while(1){if((g|0)>=(b|0))break;k=a+(g*72|0)+40|0;c[h>>2]=c[k>>2];c[h+4>>2]=c[k+4>>2];c[h+8>>2]=c[k+8>>2];c[h+12>>2]=c[k+12>>2];c[h+16>>2]=c[k+16>>2];c[h+20>>2]=c[k+20>>2];c[h+24>>2]=c[k+24>>2];c[h+28>>2]=c[k+28>>2];wV(h,f,0,i);d=xV(e,d,i)|0;g=g+1|0}l=j;return}function oV(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=0;while(1){if((d|0)>(a|0))break;c[b+(d<<2)>>2]=d;d=d+1|0}g=a+1|0;d=1;while(1){if((d|0)>(a|0))break;h=~~(+(d|0)+ +(g-d|0)*+S4());e=b+(d<<2)|0;f=b+(h<<2)|0;if((h|0)!=(d|0)){h=c[e>>2]|0;c[e>>2]=c[f>>2];c[f>>2]=h}d=d+1|0}return}function pV(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=a*5|0;j=g+1|0;l=HK(j<<2)|0;c[47459]=HK(j<<4)|0;c[47460]=HK((a*56|0)+56|0)|0;j=HK(a<<2)|0;c[47461]=j;k=0;while(1){if((k|0)>(g|0))break;if(rV(d+(k*72|0)|0,b)|0)break;k=k+1|0}h=c[47459]|0;i=c[47460]|0;g=1;while(1){if((g|0)>(a|0))break;c[h+(g<<4)+8>>2]=c[b+(g*56|0)+48>>2];m=b+(g*56|0)+44|0;c[h+(g<<4)+4>>2]=c[m>>2];c[h+(g<<4)>>2]=g;n=i+(g*56|0)|0;o=b+(g*56|0)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[i+(g*56|0)+16>>2]=c[m>>2];c[i+(g*56|0)+32>>2]=g;c[i+(g*56|0)+48>>2]=1;g=g+1|0}c[47462]=a;c[47463]=0;c[j>>2]=1;g=c[d+(k*72|0)+40>>2]|0;if((g|0)<=0){g=c[d+(k*72|0)+48>>2]|0;if((g|0)>0)g=sV(l,f,0,b,d,0,k,g,e,2)|0;else g=0}else g=sV(l,f,0,b,d,0,k,g,e,1)|0;l6(l);l6(c[47459]|0);l6(c[47460]|0);l6(c[47461]|0);return g|0}function qV(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0;g=+h[(+h[b>>3]>+h[c>>3]?b:c)>>3];f=+h[(+h[b+16>>3]<+h[c+16>>3]?b:c)+16>>3];h[a+16>>3]=f;h[a>>3]=g;e=+h[(+h[b+8>>3]>+h[c+8>>3]?b:c)+8>>3];d=+h[(+h[b+24>>3]<+h[c+24>>3]?b:c)+24>>3];h[a+24>>3]=d;h[a+8>>3]=e;return !(g>=f)&!(e>=d)&1|0}function rV(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0;f=c[a+4>>2]|0;do if((c[a+68>>2]|0)!=2?!((f|0)<1|(c[a>>2]|0)<1):0){if(!((c[a+40>>2]|0)<1?(c[a+44>>2]|0)<1:0)){if((c[a+48>>2]|0)>=1){a=0;break}if((c[a+52>>2]|0)>=1){a=0;break}}d=+h[b+(f*56|0)+24>>3];e=+h[b+(f*56|0)+8>>3];if(!(d>e+1.0e-07))if(d>3]>+h[b+(f*56|0)>>3]&1;else a=1}else a=0;while(0);return a|0}function sV(a,b,d,e,f,g,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0.0,I=0.0,J=0,K=0,L=0,M=0;E=(k|0)==0;D=g;a:while(1){if((i|0)<1)break;g=a+(i<<2)|0;if(c[g>>2]|0)break;c[g>>2]=1;r=f+(i*72|0)+16|0;n=+h[r>>3];x=f+(i*72|0)+32|0;o=+h[x>>3];v=f+(i*72|0)|0;y=f+(i*72|0)+4|0;if((n>o?(C=c[v>>2]|0,H=+h[e+(C*56|0)>>3],H==+h[e+(C*56|0)+16>>3]):0)?(C=c[y>>2]|0,I=+h[e+(C*56|0)>>3],I==+h[e+(C*56|0)+16>>3]):0){g=b+(d<<5)+16|0;m=b+(d<<5)+8|0;p=b+(d<<5)|0;if(E){h[p>>3]=H;h[m>>3]=o;h[g>>3]=I}else{h[p>>3]=o;h[m>>3]=-I;h[g>>3]=n;n=-H}h[b+(d<<5)+24>>3]=n;d=d+1|0}g=f+(i*72|0)+40|0;w=c[g>>2]|0;A=f+(i*72|0)+48|0;B=f+(i*72|0)+52|0;C=f+(i*72|0)+44|0;do if((w|0)<1?(c[C>>2]|0)<1:0){if((c[A>>2]|0)>0?(J=c[B>>2]|0,(J|0)>0):0){l=c[f+(J*72|0)>>2]|0;g=c[v>>2]|0;if((J|0)==(j|0)){j=tV(D,g,l)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;g=A;l=1;break}else{j=tV(D,l,g)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;g=B;l=1;break}}d=sV(a,b,d,e,f,D,w,i,k,2)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;j=D;g=B;l=1}else M=19;while(0);do if((M|0)==19){M=0;s=c[A>>2]|0;if((s|0)<1?(c[B>>2]|0)<1:0){if((w|0)>0?(K=c[C>>2]|0,(K|0)>0):0){m=c[y>>2]|0;l=c[f+(w*72|0)+4>>2]|0;if((K|0)==(j|0)){j=tV(D,l,m)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;l=2;break}else{j=tV(D,m,l)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;g=C;l=2;break}}d=sV(a,b,d,e,f,D,w,i,k,2)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;j=D;g=B;l=1;break}z=(l|0)==1;u=(l|0)==2;t=f+(i*72|0)+24|0;p=c[C>>2]|0;l=(p|0)>0;if((w|0)>0){if(l){if((s|0)>0?(L=c[B>>2]|0,(L|0)>0):0){m=c[f+(L*72|0)>>2]|0;l=c[f+(w*72|0)+4>>2]|0;if(z&(p|0)==(j|0)|u&(L|0)==(j|0)){j=tV(D,l,m)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[g>>2]|0,i,k,2)|0;g=A;l=1;break}else{j=tV(D,m,l)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[C>>2]|0,i,k,2)|0;g=B;l=1;break}}l=c[v>>2]|0;if(+F(+(+h[x>>3]-+h[e+(l*56|0)+24>>3]))<=1.0e-07?+F(+(+h[t>>3]-+h[e+(l*56|0)+16>>3]))<=1.0e-07:0){m=c[f+(w*72|0)+4>>2]|0;l=c[e+(l*56|0)+44>>2]|0;if(z&(w|0)==(j|0)){j=tV(D,l,m)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,j,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[C>>2]|0,i,k,2)|0;g=B;l=1;break}else{j=tV(D,m,l)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;l=2;break}}m=c[y>>2]|0;l=c[f+(w*72|0)+4>>2]|0;if(z&(p|0)==(j|0)){j=tV(D,l,m)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,j,c[B>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[A>>2]|0,i,k,1)|0;l=2;break}else{j=tV(D,m,l)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;g=C;l=2;break}}}else if(!l)break a;q=f+(i*72|0)+8|0;n=+h[r>>3];r=c[v>>2]|0;m=e+(r*56|0)|0;p=+F(+(n-+h[e+(r*56|0)+8>>3]))<=1.0e-07;if((s|0)>0?(G=c[B>>2]|0,(G|0)>0):0){if(p?+F(+(+h[q>>3]-+h[m>>3]))<=1.0e-07:0){l=c[f+(G*72|0)>>2]|0;if(u&(s|0)==(j|0)){j=tV(D,l,r)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,j,c[C>>2]|0,i,k,2)|0;g=B;l=1;break}else{j=tV(D,r,l)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;g=A;l=1;break}}m=c[f+(G*72|0)>>2]|0;l=c[e+((c[y>>2]|0)*56|0)+44>>2]|0;if(u&(G|0)==(j|0)){j=tV(D,l,m)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,j,c[g>>2]|0,i,k,2)|0;g=A;l=1;break}else{j=tV(D,m,l)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;g=B;l=1;break}}l=c[y>>2]|0;if(((p?+F(+(+h[q>>3]-+h[m>>3]))<=1.0e-07:0)?+F(+(+h[x>>3]-+h[e+(l*56|0)+8>>3]))<=1.0e-07:0)?+F(+(+h[t>>3]-+h[e+(l*56|0)>>3]))<=1.0e-07:0)if(z){j=tV(D,r,l)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,j,c[B>>2]|0,i,k,1)|0;g=A;l=1;break}else{j=tV(D,l,r)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[g>>2]|0,i,k,2)|0;g=C;l=2;break}if(((+F(+(n-+h[e+(l*56|0)+24>>3]))<=1.0e-07?+F(+(+h[q>>3]-+h[e+(l*56|0)+16>>3]))<=1.0e-07:0)?+F(+(+h[x>>3]-+h[e+(r*56|0)+24>>3]))<=1.0e-07:0)?+F(+(+h[t>>3]-+h[e+(r*56|0)+16>>3]))<=1.0e-07:0){j=c[e+(l*56|0)+44>>2]|0;l=c[e+(r*56|0)+44>>2]|0;if(z){j=tV(D,l,j)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,j,c[B>>2]|0,i,k,1)|0;g=A;l=1;break}else{j=tV(D,j,l)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[g>>2]|0,i,k,2)|0;g=C;l=2;break}}d=sV(a,b,d,e,f,D,w,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;j=D;g=B;l=1}while(0);C=i;D=j;i=c[g>>2]|0;j=C}return d|0}function tV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;f=l;l=l+16|0;r=f+4|0;i=f;e=(c[47463]|0)+1|0;c[47463]=e;m=c[47460]|0;uV(b,d,r,i);r=c[r>>2]|0;h=c[m+(b*56|0)+32+(r<<2)>>2]|0;i=c[m+(d*56|0)+32+(c[i>>2]<<2)>>2]|0;n=c[47462]|0;g=n+1|0;n=n+2|0;c[47462]=n;q=c[47459]|0;c[q+(g<<4)>>2]=b;c[q+(n<<4)>>2]=d;o=q+(h<<4)+4|0;p=q+(g<<4)+4|0;c[p>>2]=c[o>>2];c[q+(c[o>>2]<<4)+8>>2]=g;c[q+(g<<4)+8>>2]=n;c[q+(n<<4)+4>>2]=g;j=q+(i<<4)+8|0;c[q+(n<<4)+8>>2]=c[j>>2];c[q+(c[j>>2]<<4)+4>>2]=n;c[o>>2]=i;c[j>>2]=h;j=m+(b*56|0)+48|0;o=c[j>>2]|0;i=m+(d*56|0)+48|0;k=c[i>>2]|0;c[m+(b*56|0)+16+(r<<2)>>2]=d;c[m+(b*56|0)+32+(o<<2)>>2]=g;c[m+(b*56|0)+16+(o<<2)>>2]=c[q+(c[p>>2]<<4)>>2];c[m+(d*56|0)+32+(k<<2)>>2]=n;c[m+(d*56|0)+16+(k<<2)>>2]=b;c[j>>2]=(c[j>>2]|0)+1;c[i>>2]=(c[i>>2]|0)+1;d=c[47461]|0;c[d+(a<<2)>>2]=h;c[d+(e<<2)>>2]=g;l=f;return e|0}function uV(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,h=0,i=0,j=0.0,k=0.0,l=0,m=0,n=0;l=c[47460]|0;m=l+(b*56|0)|0;n=l+(a*56|0)|0;f=0;g=-4.0;i=0;while(1){if((i|0)==4)break;h=c[l+(a*56|0)+16+(i<<2)>>2]|0;if((h|0)>=1?(j=+vV(n,l+(h*56|0)|0,m),j>g):0){f=i;g=j}i=i+1|0}c[d>>2]=f;f=0;i=0;g=-4.0;while(1){if((i|0)==4)break;h=c[l+(b*56|0)+16+(i<<2)>>2]|0;if((h|0)>=1?(k=+vV(m,l+(h*56|0)|0,n),k>g):0){f=i;g=k}i=i+1|0}c[e>>2]=f;return}function vV(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0;g=+h[a>>3];k=+h[b>>3]-g;j=+h[a+8>>3];i=+h[b+8>>3]-j;g=+h[c>>3]-g;j=+h[c+8>>3]-j;d=k*g+i*j;e=+G(+(k*k+i*i));f=+G(+(g*g+j*j));if(!(k*j-i*g>=0.0))d=-d/e/f+-2.0;else d=d/e/f;return +d}function wV(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0,l=0;c[e>>2]=c[a>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[e+12>>2]=c[a+12>>2];l=e+32|0;k=a+16|0;c[l>>2]=c[k>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];c[l+12>>2]=c[k+12>>2];d=(d|0)==0;g=+h[a+8>>3];j=+h[k>>3];i=+h[a>>3];f=+h[a+24>>3];h[e+16>>3]=d?i:j;h[e+24>>3]=d?f:g;h[e+48>>3]=d?j:i;h[e+56>>3]=d?g:f;a:do if(b|0){a=0;while(1){if((a|0)==4)break a;k=e+(a<<4)+8|0;j=+h[k>>3];l=e+(a<<4)|0;h[k>>3]=+h[l>>3];h[l>>3]=-j;a=a+1|0}}while(0);return}function xV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=b+3|0;i=b+1|0;j=b+2|0;f=0;g=b;while(1){if((g|0)>(h|0))break;k=g+1|0;e=a+(g*56|0)+44|0;do if((g|0)!=(b|0))if((g|0)==(h|0)){c[e>>2]=b;e=j;break}else{c[e>>2]=k;e=g+-1|0;break}else{c[e>>2]=i;e=h}while(0);c[a+(g*56|0)+48>>2]=e;c[a+(g*56|0)+32>>2]=0;m=a+(g*56|0)|0;l=d+(f<<4)|0;c[m>>2]=c[l>>2];c[m+4>>2]=c[l+4>>2];c[m+8>>2]=c[l+8>>2];c[m+12>>2]=c[l+12>>2];I6(a+(e*56|0)+16|0,l|0,16)|0;f=f+1|0;g=k}return b+4|0}function yV(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;c[47464]=e<<1;c[47465]=e;k=HK(e*80|0)|0;c[47466]=1;c[47467]=1;u6(f|0,0,e*72|0)|0;g=zV(c[d+4>>2]|0,b,f,k)|0;e=1;while(1){if((e|0)>(a|0))break;c[b+(e*56|0)+40>>2]=g;c[b+(e*56|0)+36>>2]=g;e=e+1|0}j=AV(a)|0;g=2;i=1;while(1){if((i|0)>(j|0))break;e=BV(a,i+-1|0)|0;h=BV(a,i)|0;while(1){if((e|0)>=(h|0)){e=1;break}CV(c[d+(g<<2)>>2]|0,b,f,k);e=e+1|0;g=g+1|0}while(1){if((e|0)>(a|0))break;DV(e,b,f,k);e=e+1|0}i=i+1|0}e=BV(a,j)|0;while(1){if((e|0)>=(a|0))break;CV(c[d+(g<<2)>>2]|0,b,f,k);g=g+1|0;e=e+1|0}l6(k);return c[47466]|0}function zV(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=IV()|0;c[e+(f*40|0)>>2]=2;s=e+(f*40|0)+8|0;k=b+(a*56|0)|0;l=b+(a*56|0)+16|0;MV(s,k,l);n=IV()|0;c[e+(f*40|0)+36>>2]=n;c[e+(n*40|0)>>2]=3;c[e+(n*40|0)+28>>2]=f;j=IV()|0;c[e+(f*40|0)+32>>2]=j;c[e+(j*40|0)>>2]=2;r=e+(j*40|0)+8|0;NV(r,k,l);c[e+(j*40|0)+28>>2]=f;l=IV()|0;c[e+(j*40|0)+32>>2]=l;c[e+(l*40|0)>>2]=3;c[e+(l*40|0)+28>>2]=j;k=IV()|0;c[e+(j*40|0)+36>>2]=k;c[e+(k*40|0)>>2]=1;c[e+(k*40|0)+4>>2]=a;c[e+(k*40|0)+28>>2]=j;j=IV()|0;c[e+(k*40|0)+32>>2]=j;c[e+(j*40|0)>>2]=3;c[e+(j*40|0)+28>>2]=k;g=IV()|0;c[e+(k*40|0)+36>>2]=g;c[e+(g*40|0)>>2]=3;c[e+(g*40|0)+28>>2]=k;k=HV(d)|0;i=HV(d)|0;m=HV(d)|0;o=HV(d)|0;p=d+(k*72|0)+8|0;q=d+(i*72|0)+8|0;t=d+(o*72|0)+24|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];I6(q|0,s|0,16)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];p=d+(k*72|0)+24|0;q=d+(i*72|0)+24|0;s=d+(m*72|0)+8|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];I6(q|0,r|0,16)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];h[d+(o*72|0)+16>>3]=1073741824.0;h[d+(o*72|0)+8>>3]=1073741824.0;h[d+(m*72|0)+32>>3]=-1073741824.0;h[d+(m*72|0)+24>>3]=-1073741824.0;c[d+(i*72|0)>>2]=a;c[d+(k*72|0)+4>>2]=a;c[d+(i*72|0)+40>>2]=o;c[d+(k*72|0)+40>>2]=o;c[d+(i*72|0)+48>>2]=m;c[d+(k*72|0)+48>>2]=m;c[d+(m*72|0)+40>>2]=k;c[d+(o*72|0)+48>>2]=k;c[d+(m*72|0)+44>>2]=i;c[d+(o*72|0)+52>>2]=i;c[d+(k*72|0)+56>>2]=j;c[d+(i*72|0)+56>>2]=g;c[d+(m*72|0)+56>>2]=l;c[d+(o*72|0)+56>>2]=n;c[d+(i*72|0)+68>>2]=1;c[d+(k*72|0)+68>>2]=1;c[d+(o*72|0)+68>>2]=1;c[d+(m*72|0)+68>>2]=1;c[e+(n*40|0)+24>>2]=o;c[e+(l*40|0)+24>>2]=m;c[e+(j*40|0)+24>>2]=k;c[e+(g*40|0)+24>>2]=i;c[b+(a*56|0)+32>>2]=1;return f|0}function AV(a){a=a|0;var b=0.0;b=+(a|0);a=0;while(1){if(!(b>=1.0))break;b=+W3(b);a=a+1|0}return a+-1|0}function BV(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+(a|0);c=d;a=0;while(1){if((a|0)>=(b|0))break;c=+W3(c);a=a+1|0}return ~~+R(+(d/c))|0} -function pq(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0.0,C=0,D=0,E=0,F=0,I=0,J=0.0,K=0.0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,Z=0,_=0.0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;ha=l;l=l+32|0;ba=ha+24|0;ca=ha+20|0;da=ha+16|0;fa=ha+12|0;ga=ha+8|0;X=ha;q=+h[e>>3];p=e+24|0;o=+h[p>>3];r=e+32|0;n=+h[r>>3];Y=+h[e+72>>3];Z=c[e+80>>2]|0;_=+h[e+88>>3];t=+h[e+96>>3];$=c[e+104>>2]|0;c[ba>>2]=0;c[ca>>2]=10;c[da>>2]=0;c[fa>>2]=0;c[ga>>2]=0;h[X>>3]=0.0;if(!((b|0)==0|(Z|0)<1)?(aa=c[b>>2]|0,m=c[b+4>>2]|0,!((a|0)<1|(m|0)<1)):0){if((m|0)<(c[e+52>>2]|0)){s=0;j=0;k=0}else{k=IK(a*80|0)|0;c[da>>2]=k;c[fa>>2]=IK(80)|0;c[ga>>2]=IK(80)|0;s=1;j=k}c[i>>2]=0;if((aa|0)==(m|0)){R=sw(b,1)|0;T=c[R+20>>2]|0;U=c[R+24>>2]|0;V=c[d+20>>2]|0;W=c[d+24>>2]|0;Q=c[d+28>>2]|0;a:do if(c[e+16>>2]|0){T4(c[e+108>>2]|0);k=S(aa,a)|0;j=0;while(1){if((j|0)>=(k|0))break a;h[g+(j<<3)>>3]=+Pw();j=j+1|0}}while(0);if(o<0.0){o=+aq(R,a,g);h[p>>3]=o}if(n<0.0){h[r>>3]=.2;n=.2}if(q>=0.0){h[e>>3]=-1.0;q=-1.0}O=1.0-q;P=+H(+o,+O);K=+H(+n,+((2.0-q)/3.0))/o;M=a<<3;L=IK(M)|0;M=S(aa,M)|0;N=IK(M)|0;F=(s|0)!=0;I=e+116|0;J=K*.2;C=q==-1.0;D=e+64|0;E=(f|0)!=0;j=0;A=0;B=0.0;z=t;b:while(1){A=A+1|0;B6(N|0,g|0,M|0)|0;if(F)j=ew(a,aa,10,g,(c[I>>2]|0)==0?0:f)|0;s=0;o=0.0;c:while(1){if((s|0)<(aa|0))k=0;else break;while(1){if((k|0)>=(a|0))break;h[L+(k<<3)>>3]=0.0;k=k+1|0}x=s+1|0;d=T+(x<<2)|0;y=S(s,a)|0;m=c[T+(s<<2)>>2]|0;while(1){if((m|0)>=(c[d>>2]|0))break;p=U+(m<<2)|0;k=c[p>>2]|0;d:do if((k|0)!=(s|0)){n=+Xw(g,a,s,k);k=0;while(1){if((k|0)>=(a|0))break d;t=n*(K*(+h[g+(k+y<<3)>>3]-+h[g+((S(c[p>>2]|0,a)|0)+k<<3)>>3]));w=L+(k<<3)|0;h[w>>3]=+h[w>>3]-t;k=k+1|0}}while(0);m=m+1|0}p=V+(x<<2)|0;d=c[V+(s<<2)>>2]|0;while(1){if((d|0)>=(c[p>>2]|0))break;r=W+(d<<2)|0;k=c[r>>2]|0;e:do if((k|0)!=(s|0)){n=+Ww(g,a,s,k);m=Q+(d<<3)|0;k=0;while(1){if((k|0)>=(a|0))break e;q=+h[m>>3];t=n-q;t=t*(t*(J*(+h[g+(k+y<<3)>>3]-+h[g+((S(c[r>>2]|0,a)|0)+k<<3)>>3])))/n;w=L+(k<<3)|0;h[w>>3]=+h[w>>3]+(n>2]|0)!=0){k=0;while(1){if((k|0)==(aa|0)){n=0.0;k=0;break f}g:do if((k|0)!=(s|0)){q=+Ww(g,a,s,k);d=f+(k<<3)|0;p=S(k,a)|0;t=q*q;m=0;while(1){if((m|0)>=(a|0))break g;r=L+(m<<3)|0;if(C)n=t;else n=+H(+q,+O);h[r>>3]=+h[r>>3]+P*+h[d>>3]*(+h[g+(m+y<<3)>>3]-+h[g+(m+p<<3)>>3])/n;m=m+1|0}}while(0);k=k+1|0}}else{k=0;while(1){if((k|0)==(aa|0)){n=0.0;k=0;break f}h:do if((k|0)!=(s|0)){q=+Ww(g,a,s,k);d=S(k,a)|0;t=q*q;m=0;while(1){if((m|0)>=(a|0))break h;p=L+(m<<3)|0;if(C)n=t;else n=+H(+q,+O);h[p>>3]=+h[p>>3]+P*(+h[g+(m+y<<3)>>3]-+h[g+(m+d<<3)>>3])/n;m=m+1|0}}while(0);k=k+1|0}}else{_v(j,+h[D>>3],g+(y<<3)|0,s,ba,ca,da,fa,ga,X,i);d=c[ba>>2]|0;if(c[i>>2]|0)break b;p=c[ga>>2]|0;r=c[fa>>2]|0;s=c[da>>2]|0;k=0;while(1){if((k|0)>=(d|0)){n=0.0;k=0;break f}q=+h[p+(k<<3)>>3];q=q>1.0e-15?q:1.0e-15;u=r+(k<<3)|0;v=S(k,a)|0;t=q*q;m=0;while(1){if((m|0)>=(a|0))break;w=L+(m<<3)|0;if(C)n=t;else n=+H(+q,+O);h[w>>3]=+h[w>>3]+P*+h[u>>3]*(+h[g+(m+y<<3)>>3]-+h[s+(m+v<<3)>>3])/n;m=m+1|0}k=k+1|0}}while(0);while(1){if((k|0)>=(a|0))break;t=+h[L+(k<<3)>>3];n=n+t*t;k=k+1|0}n=+G(+n);o=o+n;i:do if(n>0.0){k=0;while(1){if((k|0)>=(a|0)){k=0;break i}w=L+(k<<3)|0;h[w>>3]=+h[w>>3]/n;k=k+1|0}}else k=0;while(0);while(1){if((k|0)>=(a|0)){s=x;continue c}w=g+(k+y<<3)|0;h[w>>3]=+h[w>>3]+z*+h[L+(k<<3)>>3];k=k+1|0}}if(j|0)lw(j);z=+gq($,z,o,B,_);if(!((A|0)<(Z|0)&z>Y)){ea=75;break}else B=o}if((ea|0)==75?c[e+112>>2]|0:0)hq(a,R,g);l6(N);if((R|0)!=(b|0))nw(R);l6(L);j=c[da>>2]|0;k=j}else c[i>>2]=-100;if(k|0)l6(j);j=c[fa>>2]|0;if(j|0)l6(j);j=c[ga>>2]|0;if(j|0)l6(j)}l=ha;return}function qq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;n=c[b+20>>2]|0;o=c[b+24>>2]|0;p=IK(a<<3)|0;m=c[b>>2]|0;k=0;a:while(1){if((k|0)<(m|0))b=0;else break;while(1){if((b|0)>=(a|0))break;h[p+(b<<3)>>3]=0.0;b=b+1|0}l=k+1|0;j=c[n+(l<<2)>>2]|0;i=c[n+(k<<2)>>2]|0;b=0;while(1){if((i|0)>=(j|0))break;e=c[o+(i<<2)>>2]|0;if((e|0)!=(k|0)){g=S(e,a)|0;e=0;while(1){if((e|0)>=(a|0))break;q=p+(e<<3)|0;h[q>>3]=+h[d+(e+g<<3)>>3]+ +h[q>>3];e=e+1|0}b=b+1|0}i=i+1|0}if((b|0)<=0){k=l;continue}f=.5/+(b|0);e=S(k,a)|0;b=0;while(1){if((b|0)>=(a|0)){k=l;continue a}q=d+(b+e<<3)|0;h[q>>3]=+h[q>>3]*.5+f*+h[p+(b<<3)>>3];b=b+1|0}}l6(p);return}function rq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0.0;i=c[a+20>>2]|0;j=c[a+24>>2]|0;h=c[a>>2]|0;k=IK((h<<2)+4|0)|0;a=0;while(1){if((a|0)>(h|0)){d=0;e=0;break}c[k+(a<<2)>>2]=0;a=a+1|0}while(1){if((e|0)>=(h|0))break;f=e+1|0;g=c[i+(f<<2)>>2]|0;a=0;b=c[i+(e<<2)>>2]|0;while(1){if((b|0)>=(g|0))break;a=((e|0)!=(c[j+(b<<2)>>2]|0)&1)+a|0;b=b+1|0}g=k+(a<<2)|0;e=(c[g>>2]|0)+1|0;c[g>>2]=e;d=(d|0)>(e|0)?d:e;e=f}l=+(c[k+4>>2]|0);if(l>+(d|0)*.8?l>+(h|0)*.3:0)a=1;else a=0;l6(k);return a|0}function sq(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0;o=l;l=l+48|0;n=o+16|0;j=o;g=S(b,b)|0;e=0;while(1){if((e|0)>=(g|0)){e=0;break}h[n+(e<<3)>>3]=0.0;e=e+1|0}while(1){if((e|0)>=(b|0)){g=0;break}h[j+(e<<3)>>3]=0.0;e=e+1|0}while(1){if((g|0)>=(a|0))break;i=S(g,b)|0;e=0;while(1){if((e|0)>=(b|0))break;m=j+(e<<3)|0;h[m>>3]=+h[c+(e+i<<3)>>3]+ +h[m>>3];e=e+1|0}g=g+1|0}d=+(a|0);e=0;while(1){if((e|0)>=(b|0)){g=0;break}m=j+(e<<3)|0;h[m>>3]=+h[m>>3]/d;e=e+1|0}while(1){if((g|0)>=(a|0)){i=0;break}i=S(g,b)|0;e=0;while(1){if((e|0)>=(b|0))break;m=c+(e+i<<3)|0;h[m>>3]=+h[m>>3]-+h[j+(e<<3)>>3];e=e+1|0}g=g+1|0}while(1){if((i|0)>=(a|0))break;j=S(i,b)|0;g=0;while(1){if((g|0)>=(b|0))break;k=c+(g+j<<3)|0;m=S(g,b)|0;e=0;while(1){if((e|0)==(b|0))break;p=n+(e+m<<3)|0;h[p>>3]=+h[p>>3]+ +h[k>>3]*+h[c+(e+j<<3)>>3];e=e+1|0}g=g+1|0}i=i+1|0}d=+h[n+8>>3];if(d==0.0)d=0.0;else{q=+h[n>>3];f=+h[n+24>>3];d=-(f-q-+G(+(f*f+(d*(d*4.0)+q*q-q*2.0*f))))/(d*2.0)}f=+G(+(d*d+1.0));d=d/f;f=1.0/f;e=0;while(1){if((e|0)>=(a|0))break;p=S(e,b)|0;n=c+(p<<3)|0;q=+h[n>>3];p=c+(p+1<<3)|0;r=+h[p>>3];h[n>>3]=d*q+f*r;h[p>>3]=d*r-f*q;e=e+1|0}l=o;return}function tq(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;uq(a,b,c,d,e,f,g,h,i,j);return}function uq(b,d,e,f,g,i,j,k,m,n){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;H=l;l=l+192|0;D=H+176|0;B=H+168|0;F=H;B6(F|0,f|0,168)|0;c[n>>2]=0;do if(d|0?(G=c[d+4>>2]|0,!((b|0)<1|(G|0)<1)):0){A=f+136|0;if((tw(d,0)|0)!=0?(c[d+16>>2]|0)==1:0){if((c[A>>2]|0)==1)p=yw(e)|0;else p=e;E=yw(d)|0}else t=5;do if((t|0)==5)if((c[A>>2]|0)==1){E=xw(d,0)|0;p=xw(e,0)|0;break}else{E=Nw(d)|0;p=e;break}while(0);C=f+160|0;r=c[C>>2]|0;q=(k|0)>0;if((r|0)==3){if(q)t=14}else if(q&(r|0)==4)t=14;if((t|0)==14){e=IK(S(b<<3,c[E>>2]|0)|0)|0;G=vq(E,k,m)|0;tq(b,G,0,f,0,0,e,0,0,n);wq(b,E,k,m,j,e);iu(b,E,j,i,c[f+124>>2]|0,+h[f+144>>3],c[C>>2]|0,k,m);nw(G);l6(e);if((E|0)==(d|0))break;nw(E);break}y=cx(c[f+44>>2]|0,c[f+48>>2]|0)|0;c[y+16>>2]=c[f+40>>2];z=qx(E,p,g,y)|0;r=tx(z)|0;if(!(c[r+32>>2]|0))s=j;else s=IK(S(b<<3,c[r+4>>2]|0)|0)|0;q=rq(E)|0;if(+h[f>>3]==-1.0001234){h[f>>3]=-1.0;o=(q|0)==0?-1.0:-1.8;q=f;t=20}while(1){if((t|0)==20){t=0;h[q>>3]=o}v=r+24|0;q=f+96|0;w=r+32|0;x=r+8|0;a:do switch(c[A>>2]|0){case 0:{u=c[f+132>>2]|0;switch(u|0){case 0:{kq(b,c[x>>2]|0,f,c[v>>2]|0,s,n);break a}case 2:break;default:t=24}do if((t|0)==24){t=c[x>>2]|0;if((u|0)==3?(c[t>>2]|0)>1e4:0){if(!(a[195234]|0))break;u=c[15715]|0;c[B>>2]=1e4;z4(u,92600,B)|0;break}lq(b,t,f,c[v>>2]|0,s,n);break a}while(0);fq(b,c[x>>2]|0,f,c[v>>2]|0,s,n);break}case 1:{h[q>>3]=1.0;t=f+104|0;c[t>>2]=1;I=(c[r+28>>2]|0)==0;o=I?.5:.05;c[f+80>>2]=I?500:100;I=(c[w>>2]|0)==0;u=r+12|0;mq(b,c[x>>2]|0,c[u>>2]|0,f,c[v>>2]|0,s,o,n);if(I){c[f+16>>2]=0;h[q>>3]=.05;c[t>>2]=0;mq(b,c[x>>2]|0,c[u>>2]|0,f,c[v>>2]|0,s,o*.5,n);mq(b,c[x>>2]|0,c[u>>2]|0,f,c[v>>2]|0,s,o*.125,n);mq(b,c[x>>2]|0,c[u>>2]|0,f,c[v>>2]|0,s,o*.03125,n)}break}default:{}}while(0);v=c[w>>2]|0;if(!v){t=38;break}if(c[n>>2]|0){t=34;break}t=c[r+16>>2]|0;r=c[r+40>>2]|0;if(!(c[v+32>>2]|0))u=j;else u=IK(S(b<<3,c[v+4>>2]|0)|0)|0;I=f+24|0;xq(b,c[v+8>>2]|0,t,c[v+20>>2]|0,s,u,r,+h[I>>3]*.001);l6(s);c[f+16>>2]=0;h[I>>3]=+h[I>>3]*.75;c[f+104>>2]=0;o=((c[(c[v+28>>2]|0)+40>>2]|0)+-9|0)>>>0<2?1.0:.1;r=v;s=u;t=20}if((t|0)==34)l6(s);else if((t|0)==38){Rx(b,E,f,g,j,n);q=f+124|0;if(a[195234]|0){I=c[15715]|0;c[D>>2]=c[q>>2];z4(I,92663,D)|0}if((b|0)==2)sq(G,2,j);o=+h[f+152>>3];if(o!=0.0)yq(G,b,j,o);iu(b,E,j,i,c[q>>2]|0,+h[f+144>>3],c[C>>2]|0,k,m)}B6(f|0,F|0,168)|0;if((E|0)!=(d|0))nw(E);if(!((p|0)==0|(p|0)==(e|0)))nw(p);dx(y);ex(z)}while(0);l=H;return}function vq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=l;l=l+16|0;x=y;u=c[a+20>>2]|0;v=c[a+24>>2]|0;w=IK(c[a>>2]<<2)|0;e=0;while(1){if((e|0)>=(c[a>>2]|0)){e=0;break}c[w+(e<<2)>>2]=1;e=e+1|0}while(1){if((e|0)>=(b|0)){e=0;d=0;break}c[w+(c[d+(e<<2)>>2]<<2)>>2]=-1;e=e+1|0}while(1){m=c[a>>2]|0;if((d|0)>=(m|0)){d=0;b=0;break}b=w+(d<<2)|0;if((c[b>>2]|0)>0){c[b>>2]=e;e=e+1|0}d=d+1|0}a:while(1){while(1){if((b|0)>=(m|0))break a;j=b+1|0;if((c[w+(b<<2)>>2]|0)<0)b=j;else break}k=c[u+(j<<2)>>2]|0;i=c[u+(b<<2)>>2]|0;while(1){if((i|0)>=(k|0)){b=j;continue a}f=c[v+(i<<2)>>2]|0;b:do if((c[w+(f<<2)>>2]|0)>-1)d=d+1|0;else{h=c[u+(f+1<<2)>>2]|0;g=c[u+(f<<2)>>2]|0;while(1){if((g|0)>=(h|0))break b;f=c[v+(g<<2)>>2]|0;if((f|0)!=(b|0))d=((c[w+(f<<2)>>2]|0)>>>31^1)+d|0;g=g+1|0}}while(0);i=i+1|0}}b=d<<2;if((d|0)>0){r=IK(b)|0;s=IK(b)|0;p=s;q=r}else{p=0;q=0;r=0;s=0}t=c[15715]|0;b=0;d=0;c:while(1){f=c[a>>2]|0;while(1){if((b|0)>=(f|0))break c;n=w+(b<<2)|0;o=b+1|0;if((c[n>>2]|0)<0)b=o;else break}m=u+(o<<2)|0;k=c[u+(b<<2)>>2]|0;while(1){if((k|0)>=(c[m>>2]|0)){b=o;continue c}f=v+(k<<2)|0;g=c[f>>2]|0;d:do if((c[w+(g<<2)>>2]|0)>-1){c[q+(d<<2)>>2]=c[n>>2];c[p+(d<<2)>>2]=c[w+(c[f>>2]<<2)>>2];d=d+1|0}else{j=u+(g+1<<2)|0;i=c[u+(g<<2)>>2]|0;while(1){if((i|0)>=(c[j>>2]|0))break d;g=v+(i<<2)|0;h=c[g>>2]|0;if((h|0)!=(b|0)?(c[w+(h<<2)>>2]|0)>-1:0){c[q+(d<<2)>>2]=c[n>>2];h=d+1|0;c[p+(d<<2)>>2]=c[w+(c[g>>2]<<2)>>2];f=c[n>>2]|0;d=c[w+(c[g>>2]<<2)>>2]|0;if((f|0)==68|(d|0)==68){c[x>>2]=f;c[x+4>>2]=d;z4(t,92681,x)|0;d=h}else d=h}i=i+1|0}}while(0);k=k+1|0}}x=Aw(d,e,e,q,p,0,8,8)|0;l6(r);l6(s);l6(w);l=y;return x|0}function wq(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0;p=IK(c[b>>2]<<2)|0;i=0;while(1){if((i|0)>=(c[b>>2]|0)){i=0;break}c[p+(i<<2)>>2]=1;i=i+1|0}while(1){if((i|0)>=(d|0)){i=0;l=0;break}j=c[e+(i<<2)>>2]|0;if((j|0)>-1?(j|0)<(c[b>>2]|0):0)c[p+(j<<2)>>2]=-1;i=i+1|0}while(1){n=c[b>>2]|0;if((l|0)>=(n|0)){m=0;break}j=p+(l<<2)|0;if((c[j>>2]|0)>-1){c[j>>2]=i;i=i+1|0}l=l+1|0}while(1){if((m|0)>=(n|0))break;i=c[p+(m<<2)>>2]|0;a:do if((i|0)>-1){j=S(i,a)|0;l=S(m,a)|0;i=0;while(1){if((i|0)>=(a|0))break a;h[f+(i+l<<3)>>3]=+h[g+(i+j<<3)>>3];i=i+1|0}}while(0);m=m+1|0}o=b+20|0;g=b+24|0;n=0;while(1){if((n|0)>=(d|0))break;b=c[e+(n<<2)>>2]|0;i=c[o>>2]|0;l=c[i+(b+1<<2)>>2]|0;i=c[i+(b<<2)>>2]|0;m=l-i|0;b=S(b,a)|0;j=0;while(1){if((j|0)>=(a|0))break;h[f+(j+b<<3)>>3]=0.0;j=j+1|0}while(1){if((i|0)<(l|0))j=0;else break;while(1){if((j|0)>=(a|0))break;k=+h[f+((S(c[(c[g>>2]|0)+(i<<2)>>2]|0,a)|0)+j<<3)>>3];q=f+(j+b<<3)|0;h[q>>3]=k+ +h[q>>3];j=j+1|0}i=i+1|0}k=+(m|0);i=0;while(1){if((i|0)>=(a|0))break;q=f+(i+b<<3)|0;h[q>>3]=+h[q>>3]/k;i=i+1|0}n=n+1|0}l6(p);return}function xq(a,b,d,e,f,g,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=+j;var k=0,m=0,n=0,o=0,p=0,q=0.0;o=l;l=l+16|0;n=o;c[n>>2]=g;Dw(d,0,f,0,n,0,a);a:do if((i+-1|0)>>>0<6){qq(a,b,c[n>>2]|0);k=c[e>>2]|0;m=c[e+20>>2]|0;g=c[e+24>>2]|0;b=0;b:while(1){if((b|0)>=(k|0))break a;i=b+1|0;e=m+(i<<2)|0;b=c[m+(b<<2)>>2]|0;c:while(1){b=b+1|0;if((b|0)>=(c[e>>2]|0)){b=i;continue b}f=g+(b<<2)|0;d=0;while(1){if((d|0)>=(a|0))continue c;q=(+Pw()+-.5)*j;p=(c[n>>2]|0)+((S(c[f>>2]|0,a)|0)+d<<3)|0;h[p>>3]=q+ +h[p>>3];d=d+1|0}}}}while(0);l=o;return}function yq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0;k=l;l=l+16|0;j=k;e=0;while(1){if((e|0)>=(b|0)){g=0;break}h[j+(e<<3)>>3]=0.0;e=e+1|0}while(1){if((g|0)>=(a|0))break;i=S(g,b)|0;e=0;while(1){if((e|0)>=(b|0))break;m=j+(e<<3)|0;h[m>>3]=+h[c+(e+i<<3)>>3]+ +h[m>>3];e=e+1|0}g=g+1|0}f=+(a|0);e=0;while(1){if((e|0)>=(b|0)){g=0;break}m=j+(e<<3)|0;h[m>>3]=+h[m>>3]/f;e=e+1|0}while(1){if((g|0)>=(a|0))break;i=S(g,b)|0;e=0;while(1){if((e|0)>=(b|0))break;m=c+(e+i<<3)|0;h[m>>3]=+h[m>>3]-+h[j+(e<<3)>>3];e=e+1|0}g=g+1|0}d=d*-.017453277777777776;f=+I(+d);d=+J(+d);e=0;while(1){if((e|0)>=(a|0))break;m=S(e,b)|0;j=c+(m<<3)|0;n=+h[j>>3];m=c+(m+1<<3)|0;o=+h[m>>3];h[j>>3]=f*n+d*o;h[m>>3]=f*o-d*n;e=e+1|0}l=k;return}function zq(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=+g;i=i|0;var j=0,k=0,l=0,m=0;m=(tw(b,0)|0)!=0;j=(c[b+16>>2]|0)==1;do if(!(m&j))if(j){j=yw(sw(b,0)|0)|0;break}else{j=Nw(b)|0;break}else j=b;while(0);l=yw(j)|0;c[i>>2]=0;j=c[l>>2]|0;m=S(j,a)|0;if(!d){IK(S(a<<3,j)|0)|0;_a()}k=Dx(l,a,0.0,c[d>>2]|0,(e|0)==0?0:2,1)|0;if(!k)c[i>>2]=-1;else{h[k+40>>3]=.1;c[k+24>>2]=5;+Fx(k,a,c[d>>2]|0,f,g);e=k+32|0;j=0;while(1){if((j|0)>=(m|0))break;i=(c[d>>2]|0)+(j<<3)|0;h[i>>3]=+h[i>>3]/+h[e>>3];j=j+1|0}Ex(k)}if((l|0)!=(b|0))nw(l);return}function Aq(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=+g;h=h|0;zq(a,c,d,e,f,g,h);return}function Bq(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0;A=c[b>>2]|0;B=c[b+20>>2]|0;y=c[b+24>>2]|0;z=c[b+28>>2]|0;if(!(tw(b,0)|0))Aa(96096,92688,37,92705);a=IK(56)|0;p=a+20|0;c[p>>2]=0;c[a+24>>2]=2;c[a+12>>2]=0;o=IK(16)|0;c[p>>2]=o;h[o>>3]=e;h[o+8>>3]=f;c[a+16>>2]=105;h[a+40>>3]=.01;c[a+48>>2]=~~+G(+(+(c[b>>2]|0)));o=b+8|0;p=a+4|0;c[p>>2]=ow(A,A,(c[o>>2]|0)+A|0,1,1)|0;o=ow(A,A,(c[o>>2]|0)+A|0,1,1)|0;c[a+8>>2]=o;p=c[p>>2]|0;q=c[p+28>>2]|0;r=c[o+28>>2]|0;if((o|0)==0|(p|0)==0){Cx(a);a=0}else{s=c[p+20>>2]|0;t=c[p+24>>2]|0;u=c[o+20>>2]|0;v=c[o+24>>2]|0;c[u>>2]=0;c[s>>2]=0;m=0;d=0;while(1){if((m|0)>=(A|0))break;w=m+1|0;x=B+(w<<2)|0;e=0.0;f=0.0;n=c[B+(m<<2)>>2]|0;while(1){l=d+1|0;g=t+(d<<2)|0;b=q+(d<<3)|0;i=v+(d<<2)|0;j=r+(d<<3)|0;if((n|0)>=(c[x>>2]|0))break;k=c[y+(n<<2)>>2]|0;if((k|0)!=(m|0)){C=+h[z+(n<<3)>>3];C=C>=0.0?C:-C;C=C>.01?C:.01;c[g>>2]=k;c[i>>2]=k;h[b>>3]=-1.0;h[j>>3]=-C;e=e+ +h[b>>3];f=f-C;d=l}n=n+1|0}c[g>>2]=m;c[i>>2]=m;h[b>>3]=-e;h[j>>3]=-f;c[s+(w<<2)>>2]=l;c[u+(w<<2)>>2]=l;m=w;d=l}c[p+8>>2]=d;c[o+8>>2]=d}return a|0}function Cq(a){a=a|0;Cx(a);return}function Dq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return +(+Gx(a,b,c,d,.001))}function Eq(a,b){a=a|0;b=+b;var d=0,e=0,f=0,g=0;if((c[a+16>>2]|0)==1)d=sw(a,0)|0;else d=Nw(a)|0;f=c[d+28>>2]|0;a:do if(b!=1.0){e=c[d+8>>2]|0;a=0;while(1){if((a|0)>=(e|0))break a;g=f+(a<<3)|0;h[g>>3]=+h[g>>3]*b;a=a+1|0}}while(0);return d|0}function Fq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0.0;j=c[b>>2]|0;c[e>>2]=0;k=S(j,a)|0;e=0;while(1){if((e|0)>=(k|0)){e=1;f=1;break}h[d+(e<<3)>>3]=+Pw()*100.0;e=e+1|0}while(1){if((f|0)>=(j|0))break;i=S(f,a)|0;g=0;while(1){if((g|0)>=(a|0))break;l=+h[d+(g<<3)>>3]-+h[d+(g+i<<3)>>3];if((l>=0.0?l:-l)>1.0e-16){e=0;f=j;break}else g=g+1|0}f=f+1|0}a:do if(e|0){T4(1);e=0;while(1){if((e|0)>=(k|0))break a;h[d+(e<<3)>>3]=+Pw()*100.0;e=e+1|0}}while(0);e=Eq(b,1.0)|0;if(!(tw(e,0)|0))Aa(92731,92688,164,92767);else{k=Bq(0,e,0,101.0e5,100.0,0)|0;+Dq(k,a,d,300);Cq(k);k=Bq(0,e,0,101.0e3,100.0,0)|0;+Dq(k,a,d,300);Cq(k);k=Bq(0,e,0,1010.0,100.0,0)|0;+Dq(k,a,d,300);Cq(k);k=Bq(0,e,0,10.1,100.0,0)|0;+Dq(k,a,d,300);Cq(k);Zw(0.0,0.0,490.0,700.0,c[b>>2]|0,a,d);nw(e);return}}function Gq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0;k=IK((qB(a)|0)<<4)|0;i=(e|0)!=0;j=b+8|0;g=gC(a)|0;f=0;while(1){if(!g)break;if(i)f=((h2(HB(g)|0,92782,11)|0)==0&1)+f|0;m=c[g+16>>2]|0;l=c[m+120>>2]<<1;h[k+(l<<3)>>3]=+h[m+32>>3]*.5+ +h[b>>3];h[k+((l|1)<<3)>>3]=+h[m+40>>3]*.5+ +h[j>>3];g=hC(a,g)|0}if(i&(f|0)!=0){b=IK(f<<2)|0;g=gC(a)|0;f=0;while(1){if(!g)break;if(!(h2(HB(g)|0,92782,11)|0)){c[b+(f<<2)>>2]=c[(c[g+16>>2]|0)+120>>2];f=f+1|0}g=hC(a,g)|0}c[e>>2]=b;c[d>>2]=f}return k|0}function Hq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;z=l;l=l+32|0;w=z+16|0;v=z+8|0;u=z;if(a){x=qB(a)|0;y=rB(a)|0;b=gC(a)|0;e=0;while(1){if(!b)break;c[(c[b+16>>2]|0)+120>>2]=e;b=hC(a,b)|0;e=e+1|0}r=y<<2;q=IK(r)|0;r=IK(r)|0;b=y<<3;s=IK(b)|0;o=DA(a,2,101842,0)|0;t=(d|0)!=0;if(t){e=DA(a,2,92794,0)|0;p=HK(b)|0;n=p}else{n=0;e=0;p=0}j=(o|0)==0;k=(e|0)==0;i=gC(a)|0;b=0;while(1){if(!i)break;m=c[(c[i+16>>2]|0)+120>>2]|0;g=UA(a,i)|0;while(1){if(!g)break;c[q+(b<<2)>>2]=m;c[r+(b<<2)>>2]=c[(c[(c[((c[g>>2]&3|0)==2?g:g+-48|0)+40>>2]|0)+16>>2]|0)+120>>2];if(!j?(A=OA(g,o)|0,c[v>>2]=u,(q4(A,101510,v)|0)==1):0)f=+h[u>>3];else{h[u>>3]=1.0;f=1.0}h[s+(b<<3)>>3]=f;if(!k){A=OA(g,e)|0;c[w>>2]=u;if((q4(A,101510,w)|0)==1)f=+h[u>>3];else{h[u>>3]=1.0;f=1.0}h[n+(b<<3)>>3]=f}g=WA(a,g)|0;b=b+1|0}i=hC(a,i)|0}b=Aw(y,x,x,q,r,s,1,8)|0;if(t)c[d>>2]=Aw(y,x,x,q,r,p,1,8)|0;l6(q);l6(r);l6(s);if(n)l6(p)}else b=0;l=z;return b|0}function Iq(a){a=a|0;var b=0,d=0,e=0.0,f=0,g=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0.0,p=0.0;m=l;l=l+16|0;k=m;a:do if(Jq(a,k)|0){b=c[(c[(gC(a)|0)+16>>2]|0)+132>>2]|0;g=+h[b>>3];e=+h[b+8>>3];b=gC(a)|0;while(1){if(!b)break;f=c[(c[b+16>>2]|0)+132>>2]|0;h[f>>3]=+h[f>>3]-g;f=f+8|0;h[f>>3]=+h[f>>3]-e;b=hC(a,b)|0}b=(g!=0.0|e!=0.0)&1;d=gC(a)|0;while(1){if(!d)break a;f=UA(a,d)|0;if(f|0)break;d=hC(a,d)|0}n=c[f>>2]&3;d=c[(c[(c[((n|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+132>>2]|0;f=c[(c[(c[((n|0)==3?f:f+48|0)+40>>2]|0)+16>>2]|0)+132>>2]|0;i=+h[f+8>>3];j=+h[f>>3];e=+O(+(+h[d+8>>3]-i),+(+h[d>>3]-j));e=+h[k>>3]-e;h[k>>3]=e;if(e!=0.0){g=+I(+e);e=+J(+e);b=gC(a)|0;while(1){if(!b){b=1;break a}k=c[(c[b+16>>2]|0)+132>>2]|0;p=+h[k>>3]-j;n=k+8|0;o=+h[n>>3]-i;h[k>>3]=j+(g*p-e*o);h[n>>3]=i+(e*p+g*o);b=hC(a,b)|0}}}else b=0;while(0);l=m;return b|0}function Jq(b,d){b=b|0;d=d|0;var e=0.0,f=0,g=0;g=l;l=l+16|0;f=g;b=NA(b,92798)|0;do if((b|0)!=0?(a[b>>0]|0)!=0:0){e=+b6(b,f);if((c[f>>2]|0)==(b|0))if(!((bP(b)|0)<<24>>24)){b=0;break}else e=0.0;while(1){if(!(e>180.0))break;e=e+-360.0}while(1){if(!(e<=-180.0))break;e=e+360.0}h[d>>3]=e/180.0*3.141592653589793;b=1}else b=0;while(0);l=g;return b|0}function Kq(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=NA(a,92808)|0;return Lq(a,(d|0)==0?(c|0?c:195341):d,b)|0}function Lq(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0;o=l;l=l+32|0;n=o+16|0;j=o+8|0;i=o;m=e+4|0;if((d|0)!=0?(a[d>>0]|0)!=0:0){f=17936;while(1){g=c[f+4>>2]|0;if(!g)break;if(!(N3(d,g,c[f+8>>2]|0)|0)){k=5;break}f=f+16|0}if((k|0)==5){if(!(c[f+12>>2]|0)){c[i>>2]=g;dA(0,92816,i)|0;f=17936}i=c[f>>2]|0;c[e>>2]=i;c[m>>2]=c[f+12>>2];if((i|0)==18)Mq(b,d+(c[f+8>>2]|0)|0,e)}if(!(c[f+4>>2]|0)){f=cP(d,63)|0;if(f<<24>>24==63){c[j>>2]=d;dA(0,92858,j)|0;f=0}else f=f&255;g=(f|0)==0;f=g&1;g=g?92905:136010;k=14}}else{f=0;g=136010;k=14}if((k|0)==14){c[e>>2]=f;c[m>>2]=g}if(a[195234]|0){k=c[15715]|0;j=c[e+8>>2]|0;p=+h[e+16>>3];c[n>>2]=c[m>>2];c[n+4>>2]=j;h[n+8>>3]=p;z4(k,92913,n)|0}l=o;return e|0}function Mq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+16|0;f=e;g=e+4|0;c[f>>2]=g;f=(q4(b,137696,f)|0)>0;b=c[g>>2]|0;c[d+8>>2]=f&(b|0)>-1?b:1e3;h[d+16>>3]=+YO(a,DA(a,0,92949,0)|0,-4.0,-1.0e10);l=e;return}function Nq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=l;l=l+16|0;h=i+8|0;g=i;do if((qB(b)|0)>=2){e=Iq(b)|0;e=(Oq(b)|0)+e|0;f=c[d>>2]|0;if(f){if(a[195234]|0){f=c[15715]|0;k=HB(b)|0;j=c[d+4>>2]|0;c[g>>2]=k;c[g+4>>2]=j;z4(f,93278,g)|0;f=c[d>>2]|0}if(f>>>0>2){switch(f|0){case 3:{f=Pr(b,1)|0;break}case 4:{f=Pr(b,0)|0;break}case 6:case 5:{f=0;break}case 10:case 9:case 7:case 8:case 14:case 13:case 11:case 12:{zr(b,f)|0;f=0;break}case 15:{f=Pr(b,-1)|0;break}default:{c[h>>2]=c[d+4>>2];dA(0,93301,h)|0;f=0}}e=f+e|0;break}if(Pq(b)|0){Qq();l6(c[46887]|0);c[46887]=0;break}Rq(b);if((c[d>>2]|0)==2)f=Sq()|0;else f=Tq()|0;if(f|0)Uq();Qq();l6(c[46887]|0);c[46887]=0;e=f+e|0}}else e=0;while(0);l=i;return e|0}function Oq(b){b=b|0;var d=0,e=0.0,f=0,g=0,i=0.0,j=0,k=0,m=0,n=0;n=l;l=l+48|0;j=n+24|0;g=n+16|0;k=n;d=NA(b,141045)|0;a:do if(((d|0)!=0?(m=k+8|0,c[g>>2]=k,c[g+4>>2]=m,f=q4(d,105804,g)|0,(f|0)!=0):0)?(i=+h[k>>3],!(+F(+i)<1.0e-09)):0){if((f|0)!=1){e=+h[m>>3];if(+F(+e)<1.0e-09){d=0;break}}else{h[m>>3]=i;e=i}if(!(i==1.0&e==1.0)){if(a[195234]|0){g=c[15715]|0;h[j>>3]=i;h[j+8>>3]=e;z4(g,93461,j)|0}d=gC(b)|0;while(1){if(!d){d=1;break a}j=c[(c[d+16>>2]|0)+132>>2]|0;h[j>>3]=+h[k>>3]*+h[j>>3];j=j+8|0;h[j>>3]=+h[m>>3]*+h[j>>3];d=hC(b,d)|0}}else d=0}else d=0;while(0);l=n;return d|0}function Pq(b){b=b|0;var d=0,e=0.0,f=0.0,i=0,j=0,k=0,m=0,n=0,o=0;n=l;l=l+16|0;k=n;c[46896]=qB(b)|0;qs();c[46911]=IK((c[46896]|0)*96|0)|0;d=gC(b)|0;i=c[46911]|0;ir(k,b);e=+g[k>>2];f=+g[k+4>>2];if(!(a[k+8>>0]|0))k=1;else{k=2;e=e/72.0;f=f/72.0}j=0;while(1){if((j|0)>=(c[46896]|0)){d=0;break}o=c[(c[d+16>>2]|0)+132>>2]|0;h[i+8>>3]=+h[o>>3];h[i+16>>3]=+h[o+8>>3];if(kb[k&3](i+40|0,d,e,f)|0){m=6;break}c[i+24>>2]=j;c[i+28>>2]=1;c[i>>2]=d;c[i+88>>2]=0;i=i+96|0;j=j+1|0;d=hC(b,d)|0}if((m|0)==6){l6(c[46911]|0);c[46911]=0;d=1}l=n;return d|0}function Qq(){var a=0,b=0;a=c[46911]|0;b=0;while(1){if((b|0)>=(c[46896]|0))break;mu(a+40|0);a=a+96|0;b=b+1|0}lu();Ss();l6(c[46911]|0);return}function Rq(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0;o=l;l=l+32|0;m=o+16|0;n=o;p=c[46911]|0;i=+h[p+8>>3];k=+h[p+16>>3];f=c[46896]|0;d=p;e=1;g=i+ +h[p+40>>3];i=i+ +h[p+56>>3];j=k+ +h[p+48>>3];k=k+ +h[p+64>>3];while(1){if((e|0)>=(f|0))break;s=+h[d+104>>3];q=+h[d+112>>3];t=s+ +h[d+136>>3];r=q+ +h[d+144>>3];s=s+ +h[d+152>>3];q=q+ +h[d+160>>3];d=d+96|0;e=e+1|0;g=ti?s:i;j=rk?q:k}d=NA(b,93401)|0;if(d|0?a[d>>0]|0:0)h[173]=+a6(d);s=+h[173];t=(k-j)*s;s=(i-g)*s;h[m>>3]=g-s;h[m+8>>3]=j-t;h[n>>3]=i+s;h[n+8>>3]=k+t;ar(m,n);l=o;return}function Sq(){var b=0,d=0,e=0,f=0;e=l;l=l+16|0;d=e;if(Vq(0)|0){Wq();b=0;do{hr();b=b+1|0}while((Vq(b)|0)!=0);if(!(a[195234]|0))b=1;else{f=c[15715]|0;c[d>>2]=b;z4(f,93329,d)|0;b=1}}else b=0;l=e;return b|0}function Tq(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j+8|0;h=j;d=Vq(0)|0;if(!d)b=0;else{Wq();Xq(0);Vu(0,1);b=0;f=0;e=0;while(1){Zq();e=e+1|0;g=Vq(e)|0;if(!g)break;d=(g|0)<(d|0)?0:f+1|0;c[46888]=1;if(d){_q();b=b+1|0}Xq(1);Vu(0,1);f=d;d=g}if(a[195234]|0){g=c[15715]|0;c[h>>2]=e;z4(g,93329,h)|0;c[i>>2]=b;z4(g,93356,i)|0}$q();b=1}l=j;return b|0}function Uq(){var a=0,b=0,d=0,e=0;d=c[46896]|0;a=c[46911]|0;b=0;while(1){if((b|0)>=(d|0))break;e=c[(c[(c[a>>2]|0)+16>>2]|0)+132>>2]|0;h[e>>3]=+h[a+8>>3];h[e+8>>3]=+h[a+16>>3];a=a+96|0;b=b+1|0}return}function Vq(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+48|0;p=r+24|0;o=r+8|0;q=r;e=c[46911]|0;f=c[46896]|0;b=0;while(1){if((b|0)>=(f|0)){g=0;b=0;break}c[e+(b*96|0)+32>>2]=0;b=b+1|0}a:while(1){if((b|0)>=(f+-1|0))break;n=e+96|0;b=b+1|0;k=e+8|0;m=e+40|0;j=e+32|0;h=n;i=b;while(1){if((i|0)>=(f|0)){e=n;continue a}f=h+8|0;c[o>>2]=c[k>>2];c[o+4>>2]=c[k+4>>2];c[o+8>>2]=c[k+8>>2];c[o+12>>2]=c[k+12>>2];c[p>>2]=c[f>>2];c[p+4>>2]=c[f+4>>2];c[p+8>>2]=c[f+8>>2];c[p+12>>2]=c[f+12>>2];if(!(vu(o,m,p,h+40|0)|0))e=g;else{c[j>>2]=1;c[h+32>>2]=1;e=g+1|0}h=h+96|0;i=i+1|0;g=e;f=c[46896]|0}}if((d[195234]|0)>1){p=c[15715]|0;c[q>>2]=a;c[q+4>>2]=g;z4(p,93382,q)|0}l=r;return g|0}function Wq(){var a=0,b=0,d=0,e=0.0,f=0,g=0.0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0;fr();l=c[46890]|0;m=c[46911]|0;a=c[46887]|0;a:while(1){k=a;if(a>>>0>=l>>>0)break;b=a+4|0;if(b>>>0>=l>>>0){a=b;continue}f=c[b>>2]|0;d=c[a>>2]|0;j=+h[d>>3];if(+h[f>>3]!=j){a=b;continue}i=+h[d+8>>3];if(+h[f+8>>3]!=i){a=b;continue}f=a+8|0;d=2;while(1){if(f>>>0>=l>>>0)break;o=c[f>>2]|0;e=+h[o>>3];g=+h[o+8>>3];if(!(e==j&g==i)){n=10;break}f=f+4|0;d=d+1|0}if((n|0)==10){n=0;if(g==i){e=(e-j)/+(d|0);d=(((f>>>0>b>>>0?f:b)+-1+(0-k)|0)>>>2)+1|0;a=1;while(1){if((a|0)==(d|0)){a=f;continue a}o=c[b>>2]|0;h[o>>3]=e*+(a|0)+ +h[o>>3];a=a+1|0;b=b+4|0}}}while(1){if(b>>>0>=f>>>0){a=f;continue a}p=c[a>>2]|0;d=c[p+16>>2]|0;o=c[b>>2]|0;k=c[o+16>>2]|0;h[o>>3]=+h[p>>3]+(+h[m+(d*96|0)+56>>3]-+h[m+(d*96|0)+40>>3]+(+h[m+(k*96|0)+56>>3]-+h[m+(k*96|0)+40>>3]))*.5;b=b+4|0;a=a+4|0}}return}function Xq(a){a=a|0;var b=0.0,d=0.0,e=0.0,f=0.0,g=0,i=0,j=0,k=0;if(a|0)fr();i=c[46887]|0;j=c[i>>2]|0;e=+h[j>>3];h[23291]=e;f=+h[j>>3];h[23292]=f;k=c[46896]|0;g=1;while(1){if((g|0)>=(k|0))break;a=c[i+(g<<2)>>2]|0;d=+h[a>>3];if(d>3]}else{b=d;d=e}if(b>f)h[23292]=b;else b=f;g=g+1|0;e=d;f=b}d=+h[j+8>>3];h[23293]=d;b=+h[(c[i+(k+-1<<2)>>2]|0)+8>>3];h[23294]=b;h[23296]=b-d;h[23295]=f-e;return}function Yq(){var a=0;a=c[46889]|0;if(a>>>0<(c[46890]|0)>>>0){c[46889]=a+4;a=c[a>>2]|0}else a=0;return a|0}function Zq(){var a=0,b=0,d=0;a=c[46911]|0;br();d=(c[46888]|0)==0;b=0;while(1){if((b|0)>=(c[46896]|0))break;if(!(d?!(c[a+32>>2]|0):0))cr(a);a=a+96|0;b=b+1|0}return}function _q(){var a=0,b=0,c=0,d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0.0;a=l;l=l+32|0;c=a+16|0;b=a;j=+h[23287];i=+h[23285];g=+h[23288];e=+h[23286];d=(i-e)*.05;f=(j-g)*.05;h[b>>3]=j+f;h[b+8>>3]=i+d;h[c>>3]=g-f;h[c+8>>3]=e-d;ar(c,b);l=a;return}function $q(){Ds();Fs();Hu();js();return}function ar(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0;f=+h[a>>3];h[23288]=f;e=+h[b>>3];h[23287]=e;c=+h[a+8>>3];h[23286]=c;d=+h[b+8>>3];h[23285]=d;h[23277]=f;h[23279]=f;h[23281]=e;h[23283]=e;h[23284]=d;h[23280]=d;h[23282]=c;h[23278]=c;return}function br(){var a=0,b=0.0,d=0.0,e=0.0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0;m=c[46911]|0;g=m+8|0;f=+rs(g,186216);e=+rs(g,186232);d=+rs(g,186248);a=1;b=+rs(g,186264);g=m;i=m;j=m;k=m;while(1){l=m+96|0;if((a|0)>=(c[46896]|0))break;q=m+104|0;r=+rs(q,186216);n=r>2]|0;o=k+8|0;b=0.0;d=0.0;e=0.0;k=c[k>>2]|0;while(1){f=c[k>>2]|0;if(!f)break;s=k+8|0;r=f+8|0;c[g>>2]=c[o>>2];c[g+4>>2]=c[o+4>>2];c[g+8>>2]=c[o+8>>2];c[g+12>>2]=c[o+12>>2];c[i>>2]=c[s>>2];c[i+4>>2]=c[s+4>>2];c[i+8>>2]=c[s+8>>2];c[i+12>>2]=c[s+12>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];q=+dr(g,i,j);c[g>>2]=c[o>>2];c[g+4>>2]=c[o+4>>2];c[g+8>>2]=c[o+8>>2];c[g+12>>2]=c[o+12>>2];c[i>>2]=c[s>>2];c[i+4>>2]=c[s+4>>2];c[i+8>>2]=c[s+8>>2];c[i+12>>2]=c[s+12>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];er(g,i,j,m,n);b=b+q*+h[n>>3];d=d+q*+h[m>>3];e=e+q;k=f}h[a+8>>3]=d/e;h[a+16>>3]=b/e;l=p;return}function dr(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;f=+h[b+8>>3];e=+h[c+8>>3];d=+h[a+8>>3];return +(+F(+(+h[c>>3]*(d-f)+(+h[a>>3]*(f-e)+ +h[b>>3]*(e-d))))*.5)}function er(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;h[d>>3]=(+h[a>>3]+ +h[b>>3]+ +h[c>>3])/3.0;h[e>>3]=(+h[a+8>>3]+ +h[b+8>>3]+ +h[c+8>>3])/3.0;return}function fr(){var a=0,b=0,d=0,e=0;a=c[46887]|0;if(!a){a=IK(c[46896]<<2)|0;c[46887]=a;c[46890]=a+(c[46896]<<2)}d=c[46911]|0;Ss();e=c[46896]|0;b=0;while(1){if((b|0)>=(e|0))break;c[a>>2]=d+8;c[d+88>>2]=0;c[d+28>>2]=1;d=d+96|0;a=a+4|0;b=b+1|0}k3(c[46887]|0,e,4,69);c[46889]=c[46887];return}function gr(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;a=c[a>>2]|0;b=c[b>>2]|0;d=+h[a+8>>3];e=+h[b+8>>3];if(!(de)){e=+h[a>>3];d=+h[b>>3];if(ed&1}else a=1;else a=-1;return a|0}function hr(){var a=0,b=0,d=0,e=0;d=c[46896]|0;a=0;b=c[46911]|0;while(1){if((a|0)>=(d|0))break;e=b+8|0;h[e>>3]=+h[e>>3]*1.05;e=b+16|0;h[e>>3]=+h[e>>3]*1.05;a=a+1|0;b=b+96|0}return}function ir(b,e){b=b|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0.0;o=l;l=l+48|0;n=o;j=o+24|0;f=NA(e,93413)|0;k=j+8|0;m=j+4|0;if(!((f|0)!=0?(jr(f,j,1.0,0.0)|0)!=0:0))i=3;do if((i|0)==3){e=NA(e,93417)|0;if(e|0?jr(e,j,.800000011920929,4.0)|0:0)break;g[m>>2]=4.0;g[j>>2]=4.0;a[k>>0]=1}while(0);if(a[195234]|0){i=c[15715]|0;q=+g[j>>2];p=+g[m>>2];c[n>>2]=d[k>>0];h[n+8>>3]=q;h[n+16>>3]=p;z4(i,93422,n)|0};c[b>>2]=c[j>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];l=o;return}function jr(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+16|0;o=r;p=r+12|0;q=r+8|0;while(1){k=a[b>>0]|0;m=b+1|0;if(!(X1(k<<24>>24)|0))break;else b=m}s=k<<24>>24==43;k=d+8|0;a[k>>0]=s&1;c[o>>2]=p;c[o+4>>2]=q;b=q4(s?m:b,93455,o)|0;if(!b)b=0;else{n=+g[p>>2];if((b|0)==1){g[q>>2]=n;h=n}else h=+g[q>>2];i=n/e;j=h/e;do if(a[k>>0]|0){if(e>1.0){g[d>>2]=i>f?f:i;h=j>f?f:j;break}if(e<1.0){g[d>>2]=i>2]=n;break}}else{g[d>>2]=i+1.0;h=j+1.0}while(0);g[d+4>>2]=h;b=1}l=r;return b|0}function kr(a,b){a=a|0;b=b|0;var c=0,d=0;d=l;l=l+32|0;c=d;if((qB(a)|0)<2)a=0;else{Lq(a,b,c)|0;a=Nq(a,c)|0}l=d;return a|0}function lr(a){a=a|0;return kr(a,NA(a,92808)|0)|0}function mr(b,e){b=b|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0.0;o=l;l=l+48|0;n=o;j=o+24|0;f=NA(e,93417)|0;k=j+8|0;m=j+4|0;if(!((f|0)!=0?(jr(f,j,1.0,0.0)|0)!=0:0))i=3;do if((i|0)==3){e=NA(e,93413)|0;if(e|0?jr(e,j,1.25,3.200000047683716)|0:0)break;g[m>>2]=3.200000047683716;g[j>>2]=3.200000047683716;a[k>>0]=1}while(0);if(a[195234]|0){i=c[15715]|0;q=+g[j>>2];p=+g[m>>2];c[n>>2]=d[k>>0];h[n+8>>3]=q;h[n+16>>3]=p;z4(i,93484,n)|0};c[b>>2]=c[j>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];l=o;return}function nr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;o=p;h=0;while(1){if((h|0)>=(d|0))break;c[e+(h<<2)>>2]=-1;h=h+1|0}c[e+(a<<2)>>2]=0;or(f,a);a:do if(!(c[b+8>>2]|0)){h=2147483647;b:while(1){if(!((pr(f,o)|0)<<24>>24))break a;j=c[o>>2]|0;h=c[e+(j<<2)>>2]|0;i=b+(j*20|0)|0;j=b+(j*20|0)+4|0;k=h+1|0;a=1;while(1){if((a|0)>=(c[i>>2]|0))continue b;m=c[(c[j>>2]|0)+(a<<2)>>2]|0;n=e+(m<<2)|0;if((c[n>>2]|0)<0){c[n>>2]=k;qr(f,m)|0}a=a+1|0}}}else{h=2147483647;c:while(1){if(!((pr(f,o)|0)<<24>>24))break a;k=c[o>>2]|0;h=c[e+(k<<2)>>2]|0;i=b+(k*20|0)|0;j=b+(k*20|0)+4|0;k=b+(k*20|0)+8|0;a=1;while(1){if((a|0)>=(c[i>>2]|0))continue c;m=c[(c[j>>2]|0)+(a<<2)>>2]|0;n=e+(m<<2)|0;if((c[n>>2]|0)<0){c[n>>2]=~~+g[(c[k>>2]|0)+(a<<2)>>2]+h;qr(f,m)|0}a=a+1|0}}}while(0);a=h+10|0;h=0;while(1){if((h|0)>=(d|0))break;i=e+(h<<2)|0;if((c[i>>2]|0)<0)c[i>>2]=a;h=h+1|0}l=p;return}function or(a,b){a=a|0;b=b|0;c[c[a>>2]>>2]=b;c[a+12>>2]=0;c[a+8>>2]=1;return}function pr(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+12|0;e=c[d>>2]|0;if((e|0)<(c[a+8>>2]|0)){a=c[a>>2]|0;c[d>>2]=e+1;c[b>>2]=c[a+(e<<2)>>2];a=1}else a=0;return a|0}function qr(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+8|0;e=c[d>>2]|0;if((e|0)<(c[a+4>>2]|0)){a=c[a>>2]|0;c[d>>2]=e+1;c[a+(e<<2)>>2]=b;a=1}else a=0;return a|0}function rr(a,b){a=a|0;b=b|0;c[a>>2]=IK(b<<2)|0;c[a+4>>2]=b;c[a+8>>2]=0;c[a+12>>2]=0;return}function sr(a){a=a|0;l6(c[a>>2]|0);return}function tr(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0,j=0;if(!(a[195234]|0))i=0;else{_3(93517,25,1,c[15715]|0)|0;i=0}while(1){if((i|0)>=(b|0))break;j=d+(i<<2)|0;g=0;f=0.0;while(1){if((g|0)==(b|0))break;if((i|0)!=(g|0))f=f+ +h[(c[j>>2]|0)+(g<<3)>>3];g=g+1|0}h[(c[j>>2]|0)+(i<<3)>>3]=-f;i=i+1|0}return tt(d,e,b+-1|0)|0}function ur(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0.0;j=rn(b,b,0.0)|0;k=rn(b,b,0.0)|0;e=gC(a)|0;while(1){if(!e)break;d=ZA(a,e)|0;while(1){if(!d)break;g=c[d>>2]&3;f=(c[c[((g|0)==3?d:d+48|0)+40>>2]>>2]|0)>>>4;g=(c[c[((g|0)==2?d:d+-48|0)+40>>2]>>2]|0)>>>4;if((f|0)!=(g|0)){l=-1.0/+h[(c[d+16>>2]|0)+136>>3];h[(c[j+(g<<2)>>2]|0)+(f<<3)>>3]=l;h[(c[j+(f<<2)>>2]|0)+(g<<3)>>3]=l}d=_A(a,d,e)|0}e=hC(a,e)|0}i=tr(b,j,k)|0;a:do if(i|0){f=a+16|0;e=0;while(1){if((e|0)>=(b|0))break a;g=k+(e<<2)|0;d=0;while(1){if((d|0)==(b|0))break;a=c[g>>2]|0;h[(c[(c[(c[f>>2]|0)+160>>2]|0)+(e<<2)>>2]|0)+(d<<3)>>3]=+h[a+(e<<3)>>3]+ +h[(c[k+(d<<2)>>2]|0)+(d<<3)>>3]-+h[a+(d<<3)>>3]*2.0;d=d+1|0}e=e+1|0}}while(0);sn(j);sn(k);return i|0}function vr(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;var g=0.0,h=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+16|0;j=s;n=d<<3;o=IK(n)|0;p=IK(n)|0;q=IK(n)|0;k=IK(n)|0;m=IK(n)|0;n=IK(n)|0;Lt(d,c,n);Et(d,n);Et(d,b);Gt(a,d,b,k);It(d,n,k,o);Lt(d,o,p);i=f+-1|0;c=0;g=+Mt(d,o,o);while(1){if((c|0)>=(f|0)){c=0;break}if(!(+Nt(d,o)>e)){c=0;break}Gt(a,d,p,q);h=+Mt(d,p,q);if(h==0.0){c=0;break}h=g/h;Kt(d,p,h,m);Jt(d,b,m,b);if((c|0)<(i|0)){Kt(d,q,h,q);It(d,o,q,o);h=+Mt(d,o,o);if(g==0.0){r=7;break}Kt(d,p,h/g,p);Jt(d,o,p,p);g=h}c=c+1|0}if((r|0)==7){dA(1,93543,j)|0;c=1}l6(o);l6(p);l6(q);l6(k);l6(m);l6(n);l=s;return c|0}function wr(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;g=g|0;var h=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+16|0;j=s;o=d<<3;p=IK(o)|0;q=IK(o)|0;k=IK(o)|0;m=IK(o)|0;n=IK(o)|0;o=IK(o)|0;Lt(d,c,o);if(g<<24>>24){Et(d,o);Et(d,b)}Ht(a,d,b,m);It(d,o,m,p);Lt(d,p,q);g=f+-1|0;c=0;h=+Mt(d,p,p);while(1){if((c|0)>=(f|0)){c=0;break}if(!(+Nt(d,p)>e)){c=0;break}Ht(a,d,q,k);i=+Mt(d,q,k);if(i==0.0){c=0;break}i=h/i;Kt(d,q,i,n);Jt(d,b,n,b);if((c|0)<(g|0)){Kt(d,k,i,k);It(d,p,k,p);i=+Mt(d,p,p);if(h==0.0){r=9;break}Kt(d,q,i/h,q);Jt(d,p,q,q);h=i}c=c+1|0}if((r|0)==9){dA(1,93543,j)|0;c=1}l6(p);l6(q);l6(k);l6(m);l6(n);l6(o);l=s;return c|0}function xr(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;var g=0.0,h=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;j=q;k=d<<2;m=HK(k)|0;n=HK(k)|0;o=HK(k)|0;k=HK(k)|0;Pt(d,b);Pt(d,c);Qt(a,d,b,k);Pt(d,k);Rt(d,c,k,m);Vt(d,m,n);i=f+-1|0;c=0;g=+Wt(d,m,m);while(1){if((c|0)>=(f|0)){c=0;break}if(!(+Zt(d,m)>e)){c=0;break}Pt(d,n);Pt(d,b);Pt(d,m);Qt(a,d,n,o);Pt(d,o);h=+Wt(d,n,o);if(h==0.0){c=0;break}h=g/h;Tt(d,b,h,n);if((c|0)<(i|0)){Tt(d,m,-h,o);h=+Wt(d,m,m);if(g==0.0){p=7;break}Ut(d,n,h/g,n);St(d,m,n,n);g=h}c=c+1|0}if((p|0)==7){dA(1,93543,j)|0;c=1}l6(m);l6(n);l6(o);l6(k);l=q;return c|0}function yr(b,d,e,f,i,j,k,m,n,o){b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=+o;var p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,G=0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0;P=l;l=l+48|0;I=P+24|0;D=P+16|0;C=P+8|0;B=P;M=P+40|0;N=P+36|0;K=P+32|0;t=k&4;c[M>>2]=0;c[N>>2]=0;a:do if(c[b+16>>2]|0){q=0;p=0;while(1){if((q|0)>=(d|0))break;u=c[b+(q*20|0)>>2]|0;v=b+(q*20|0)+16|0;s=1;while(1){if((s|0)>=(u|0))break;if(!(p<<24>>24))p=+g[(c[v>>2]|0)+(s<<2)>>2]!=0.0;else p=1;s=s+1|0;p=p&1}q=q+1|0}if(p<<24>>24){A=(t|0)!=0;G=f+4|0;E=o>0.0;if(A){b:do if((j|0)>2){p=j+-1|0;if((ln(b,d,e,G,i,p,k,m,15)|0)<0){p=-1;break a}q=f+(p<<2)|0;p=0;while(1){if((p|0)>=(d|0))break b;h[(c[q>>2]|0)+(p<<3)>>3]=+h[(c[G>>2]|0)+(p<<3)>>3];p=p+1|0}}while(0);w=c[f>>2]|0;x=c[G>>2]|0;if((gu(b,d,x,d)|0)==0?(qy(b,d,.01,.1,x,M,N,K)|0)==0:0){y=c[K>>2]|0;if((y|0)<1){p=ln(b,d,e,f,i,j,k,m,n)|0;break}c:do if(E){s=c[M>>2]|0;t=c[N>>2]|0;u=y+-1|0;r=0.0;q=0;d:while(1){if((q|0)==(y|0))break c;p=c[t+(q<<2)>>2]|0;H=o-(r+ +h[x+(c[s+(p<<2)>>2]<<3)>>3]-+h[x+(c[s+(p+-1<<2)>>2]<<3)>>3]);r=r+(H<0.0?0.0:H);v=q+1|0;if((q|0)<(u|0))q=c[t+(v<<2)>>2]|0;else q=d;while(1){if((p|0)>=(q|0)){q=v;continue d}L=x+(c[s+(p<<2)>>2]<<3)|0;h[L>>3]=r+ +h[L>>3];p=p+1|0}}}while(0);if((j|0)==2?(Nu(b,d,x,w,+h[23315])|0)!=0:0){q=0;p=-1}else O=32}else{q=0;p=-1}}else{en(b,d,j,f,i)|0;if(!(qy(b,d,.01,.1,0,M,N,K)|0))O=32;else{q=0;p=-1}}e:do if((O|0)==32){if((d|0)==1){p=0;break a}L=IK(c[K>>2]<<2)|0;if(!n){p=0;break a}if(a[195234]|0)RO();switch(m|0){case 2:{if(a[195234]|0)_3(93591,24,1,c[15715]|0)|0;p=kn(b,d)|0;O=45;break}case 1:{p=fn(b,d)|0;if(!p){dA(0,93616,B)|0;dA(3,93665,C)|0;O=46}else J=p;break}case 3:{if(a[195234]|0)_3(93718,21,1,c[15715]|0)|0;p=gn(b,d)|0;O=45;break}default:O=46}if((O|0)==45)if(!p)O=46;else J=p;if((O|0)==46){if(a[195234]|0)_3(93740,26,1,c[15715]|0)|0;J=jn(b,d)|0}if(a[195234]|0){b=c[15715]|0;h[D>>3]=+SO();z4(b,93767,D)|0;_3(93779,25,1,b)|0;RO()}C=d+-1|0;t=(S(C,d)|0)/2|0;b=t+d|0;f:do if(!A){r=1.0;q=0;while(1){if((q|0)>=(j|0))break;s=f+(q<<2)|0;p=0;while(1){if((p|0)>=(d|0))break;H=+F(+(+h[(c[s>>2]|0)+(p<<3)>>3]));r=H>r?H:r;p=p+1|0}q=q+1|0}r=10.0/r;q=0;while(1){if((q|0)>=(j|0))break f;s=f+(q<<2)|0;p=0;while(1){if((p|0)>=(d|0))break;D=(c[s>>2]|0)+(p<<3)|0;h[D>>3]=r*+h[D>>3];p=p+1|0}q=q+1|0}}while(0);H=+(t|0);g:do if(E){p=0;r=0.0;t=0;h:while(1){if((t|0)>=(C|0))break;u=t+1|0;s=p;q=u;while(1){p=s+1|0;if((q|0)>=(d|0)){t=u;continue h}z=+ct(f,j,t,q);s=p;r=r+z/+g[J+(p<<2)>>2];q=q+1|0}}r=r/H;p=0;while(1){if((p|0)>=(b|0)){p=0;break g}E=J+(p<<2)|0;g[E>>2]=r*+g[E>>2];p=p+1|0}}else p=0;while(0);while(1){if((p|0)>=(j|0))break;Et(d,c[f+(p<<2)>>2]|0);p=p+1|0}q=c[G>>2]|0;r=+h[q>>3];p=0;while(1){if((p|0)>=(d|0))break;G=q+(p<<3)|0;h[G>>3]=+h[G>>3]-r;p=p+1|0}v=j<<2;B=IK(v)|0;x=d<<2;w=S(x,j)|0;s=IK(w)|0;p=0;while(1){if((p|0)>=(j|0))break;t=s+((S(p,d)|0)<<2)|0;c[B+(p<<2)>>2]=t;u=f+(p<<2)|0;q=0;while(1){if((q|0)>=(d|0))break;g[t+(q<<2)>>2]=+h[(c[u>>2]|0)+(q<<3)>>3];q=q+1|0}p=p+1|0}if(a[195234]|0){G=c[15715]|0;h[I>>3]=+SO();z4(G,93805,I)|0}_t(b,J);$t(b,J);m=IK(d<<3)|0;Xt(d,0.0,m);p=0;s=0;while(1){if((s|0)>=(C|0)){p=d;q=0;s=0;break}t=d-s|0;r=0.0;q=1;while(1){p=p+1|0;if((q|0)>=(t|0))break;z=+g[J+(p<<2)>>2];I=m+(q+s<<3)|0;h[I>>3]=+h[I>>3]-z;r=r+z;q=q+1|0}I=m+(s<<3)|0;h[I>>3]=+h[I>>3]-r;s=s+1|0}while(1){if((q|0)>=(d|0))break;g[J+(s<<2)>>2]=+h[m+(q<<3)>>3];I=p+s|0;p=p+-1|0;q=q+1|0;s=I}A=IK(v)|0;c[A>>2]=IK(w)|0;p=1;while(1){if((p|0)>=(j|0))break;c[A+(p<<2)>>2]=(c[A>>2]|0)+((S(p,d)|0)<<2);p=p+1|0}k=IK(x)|0;e=IK(x)|0;i=IK(b<<2)|0;q=Bu(J,d)|0;y=Gu(J,d,c[M>>2]|0,c[N>>2]|0,c[K>>2]|0)|0;s=0;z=1797693134862315708145274.0e284;p=0;while(1){if(!(s<<24>>24==0&(p|0)<(n|0)))break;Xt(d,0.0,m);au(b,J,i);w=0;u=0;while(1){if((w|0)>=(C|0)){s=0;t=d;u=0;break}x=d-w+-1|0;Yt(d,0.0,e);s=0;while(1){if((s|0)>=(j|0))break;K=B+(s<<2)|0;Yt(x,+g[(c[K>>2]|0)+(w<<2)>>2],k);Tt(x,k,-1.0,(c[K>>2]|0)+(w<<2)+4|0);_t(x,k);St(x,k,e,e);s=s+1|0}bu(x,e);s=0;while(1){if((s|0)>=(x|0))break;t=e+(s<<2)|0;r=+g[t>>2];if(r>=3402823466385288598117041.0e14|r<0.0)g[t>>2]=0.0;s=s+1|0}v=w+1|0;r=0.0;s=u;t=0;while(1){s=s+1|0;if((t|0)>=(x|0))break;K=i+(s<<2)|0;Q=+g[e+(t<<2)>>2]*+g[K>>2];g[K>>2]=Q;K=m+(v+t<<3)|0;h[K>>3]=+h[K>>3]-Q;r=r+Q;t=t+1|0}u=m+(w<<3)|0;h[u>>3]=+h[u>>3]-r;w=v;u=s}while(1){if((s|0)>=(d|0)){s=0;break}g[i+(u<<2)>>2]=+h[m+(s<<3)>>3];K=t+u|0;s=s+1|0;t=t+-1|0;u=K}while(1){if((s|0)>=(j|0)){r=0.0;s=0;break}Qt(i,d,c[B+(s<<2)>>2]|0,c[A+(s<<2)>>2]|0);s=s+1|0}while(1){if((s|0)>=(j|0))break;r=r+ +Wt(d,c[B+(s<<2)>>2]|0,c[A+(s<<2)>>2]|0);s=s+1|0}r=H+r*2.0;s=0;while(1){if((s|0)>=(j|0))break;K=B+(s<<2)|0;Qt(J,d,c[K>>2]|0,k);r=r-+Wt(d,c[K>>2]|0,k);s=s+1|0}Q=+F(+(r-z))/+F(+(z+1.0e-10));s=((p|0)>1&r>z|Q<+h[23315])&1;t=0;while(1){if((t|0)>=(j|0))break;u=c[A+(t<<2)>>2]|0;if((t|0)!=1){if(xr(J,c[B+(t<<2)>>2]|0,u,d,.001,d)|0){p=-1;break e}}else Cu(y,u,B,j,1,15,L,o)|0;t=t+1|0}z=r;p=p+1|0}l6(L);Fu(y);if(B|0){s=0;while(1){if((s|0)>=(j|0))break;u=B+(s<<2)|0;v=f+(s<<2)|0;t=0;while(1){if((t|0)>=(d|0))break;h[(c[v>>2]|0)+(t<<3)>>3]=+g[(c[u>>2]|0)+(t<<2)>>2];t=t+1|0}s=s+1|0}l6(c[B>>2]|0);l6(B)}if(A|0){l6(c[A>>2]|0);l6(A)}l6(k);l6(e);l6(m);l6(J);l6(i)}while(0);l6(c[M>>2]|0);l6(c[N>>2]|0);if(q){l6(c[q>>2]|0);l6(q)}}else O=10}else O=10;while(0);if((O|0)==10)p=ln(b,d,e,f,i,j,k,m,n)|0;l=P;return p|0}function zr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+48|0;f=m+24|0;g=m+12|0;d=m;i=qB(a)|0;k=IK(i*48|0)|0;ir(d,a);c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];d=gC(a)|0;e=k;while(1){if(!d)break;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];Ar(d,e,f);d=hC(a,d)|0;e=e+48|0}a:do if(!(Br(k,i)|0))d=0;else{switch(b|0){case 9:{Dr(a,k,i,70,1);Fr(a,k,i,71,1);d=0;e=k;break}case 10:{Fr(a,k,i,71,1);Dr(a,k,i,70,1);d=0;e=k;break}case 7:{Dr(a,k,i,72,1);Fr(a,k,i,71,1);j=9;break}case 8:{j=9;break}case 13:{j=10;break}case 14:{Fr(a,k,i,71,0);Dr(a,k,i,70,0);d=0;e=k;break}case 12:{Fr(a,k,i,73,0);Dr(a,k,i,70,0);d=0;e=k;break}default:{Dr(a,k,i,72,0);Fr(a,k,i,71,0);d=0;e=k}}if((j|0)==9){Fr(a,k,i,73,1);Dr(a,k,i,70,1);j=10}if((j|0)==10){Dr(a,k,i,70,0);Fr(a,k,i,71,0);d=0;e=k}while(1){if((d|0)>=(i|0)){d=1;break a}g=c[e+16>>2]|0;j=c[(c[(c[e+20>>2]|0)+16>>2]|0)+132>>2]|0;h[j>>3]=+(c[e+12>>2]|0)/72.0/10.0;h[j+8>>3]=+(g|0)/72.0/10.0;d=d+1|0;e=e+48|0}}while(0);l6(k);l=m;return d|0}function Ar(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0,n=0;f=c[b+16>>2]|0;n=c[f+132>>2]|0;l=+h[n>>3]*10.0*72.0;m=~~(l+(l>=0.0?.5:-.5));l=+h[n+8>>3]*10.0*72.0;n=~~(l+(l>=0.0?.5:-.5));l=+g[e+4>>2];i=+g[e>>2];j=+h[f+32>>3];k=+h[f+40>>3];if(!(a[e+8>>0]|0)){j=j*(i*5.0)*72.0;l=l*5.0*k*72.0;f=~~(j+(j>=0.0?.5:-.5));e=~~(l+(l>=0.0?.5:-.5))}else{j=j*.5*72.0;k=k*.5*72.0;f=~~((i+ +(~~(j+(j>=0.0?.5:-.5))|0))*10.0);e=~~((l+ +(~~(k+(k>=0.0?.5:-.5))|0))*10.0)}c[d+12>>2]=m;c[d+16>>2]=n;c[d+20>>2]=b;c[d+32>>2]=m-f;c[d+36>>2]=n-e;c[d+40>>2]=f+m;c[d+44>>2]=e+n;return}function Br(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=b+-1|0;d=0;a:while(1){if((d|0)>=(k|0)){a=0;break}j=a+48|0;d=d+1|0;g=a+32|0;h=a+40|0;i=a+36|0;f=a+44|0;a=j;e=d;while(1){if((e|0)>=(b|0)){a=j;continue a}if((((c[g>>2]|0)<=(c[a+40>>2]|0)?(c[a+32>>2]|0)<=(c[h>>2]|0):0)?(c[i>>2]|0)<=(c[a+44>>2]|0):0)?(c[a+36>>2]|0)<=(c[f>>2]|0):0){a=1;break a}a=a+48|0;e=e+1|0}}return a|0}function Cr(a,b){a=a|0;b=b|0;if((c[a+36>>2]|0)>(c[b+44>>2]|0))a=0;else a=(c[b+36>>2]|0)<=(c[a+44>>2]|0);return a&1|0}function Dr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;i=Sz(18208,c[4594]|0)|0;g=b;h=0;while(1){if((h|0)>=(d|0))break;c[g+8>>2]=c[g+12>>2];eb[c[i>>2]&63](i,g,1)|0;g=g+48|0;h=h+1|0}if(!f)h=Lr(a,i,e,74)|0;else h=Kr(i,e,74)|0;sL(h,2,2147483647)|0;g=0;while(1){if((g|0)>=(d|0))break;f=b+12|0;a=c[(c[(c[b+24>>2]|0)+16>>2]|0)+232>>2]|0;e=a-(c[f>>2]|0)|0;c[f>>2]=a;f=b+32|0;c[f>>2]=(c[f>>2]|0)+e;f=b+40|0;c[f>>2]=(c[f>>2]|0)+e;b=b+48|0;g=g+1|0}Mr(h);Oz(i)|0;return}function Er(a,b){a=a|0;b=b|0;if((c[a+32>>2]|0)>(c[b+40>>2]|0))a=0;else a=(c[b+32>>2]|0)<=(c[a+40>>2]|0);return a&1|0}function Fr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;i=Sz(18208,c[4594]|0)|0;g=b;h=0;while(1){if((h|0)>=(d|0))break;c[g+8>>2]=c[g+16>>2];eb[c[i>>2]&63](i,g,1)|0;g=g+48|0;h=h+1|0}if(!f)h=Lr(a,i,e,75)|0;else h=Kr(i,e,75)|0;sL(h,2,2147483647)|0;g=0;while(1){if((g|0)>=(d|0))break;f=b+16|0;a=c[(c[(c[b+24>>2]|0)+16>>2]|0)+232>>2]|0;e=a-(c[f>>2]|0)|0;c[f>>2]=a;f=b+36|0;c[f>>2]=(c[f>>2]|0)+e;f=b+44|0;c[f>>2]=(c[f>>2]|0)+e;b=b+48|0;g=g+1|0}Mr(h);Oz(i)|0;return}function Gr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=a+32|0;e=b+32|0;if((c[a+36>>2]|0)<=(c[b+44>>2]|0)?(c[b+36>>2]|0)<=(c[a+44>>2]|0):0)if((c[a+40>>2]|0)<(c[e>>2]|0))a=1;else{g=Jr(d,e)|0;g=g-(c[b+12>>2]|0)+(c[a+12>>2]|0)|0;b=c[b+16>>2]|0;f=c[a+16>>2]|0;a=Ir(d,e)|0;a=(g|0)<=(((b|0)<(f|0)?b-f|0:f-b|0)+a|0)&1}else a=0;return a|0}function Hr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=a+32|0;e=b+32|0;if((c[d>>2]|0)<=(c[b+40>>2]|0)?(c[e>>2]|0)<=(c[a+40>>2]|0):0)if((c[a+44>>2]|0)<(c[b+36>>2]|0))a=1;else{g=Ir(d,e)|0;g=g-(c[b+16>>2]|0)+(c[a+16>>2]|0)|0;b=c[b+12>>2]|0;f=c[a+12>>2]|0;a=Jr(d,e)|0;a=(g|0)<=(((b|0)<(f|0)?b-f|0:f-b|0)+a|0)&1}else a=0;return a|0}function Ir(a,b){a=a|0;b=b|0;return ((c[a+12>>2]|0)-(c[a+4>>2]|0)+(c[b+12>>2]|0)-(c[b+4>>2]|0)|0)/2|0|0}function Jr(a,b){a=a|0;b=b|0;return ((c[a+8>>2]|0)-(c[a>>2]|0)+(c[b+8>>2]|0)-(c[b>>2]|0)|0)/2|0|0}function Kr(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+16|0;v=x;c[v>>2]=c[4658];w=lB(93816,v,0)|0;RC(w,137786,280,1)|0;f=Qz(a)|0;g=-2147483647;u=0;while(1){if(!f)break;s=c[f+8>>2]|0;t=((g|0)!=(s|0)&1)+u|0;f=c[f>>2]|0;g=s;u=t}s=w+16|0;t=(u<<3)+-4|0;f=0;j=0;i=0;m=0;k=0;r=Qz(a)|0;h=-2147483647;while(1){n=k+16|0;if(!r)break;q=c[r+8>>2]|0;if((h|0)!=(q|0)){p=qC(w,HB(c[r+20>>2]|0)|0,1)|0;RC(p,137750,304,1)|0;o=p+16|0;g=c[o>>2]|0;c[g+112>>2]=r;if(!m){c[(c[s>>2]|0)+192>>2]=p;m=p}else c[(c[f+16>>2]|0)+164>>2]=p;c[g+176>>2]=0;i=j+1|0;h=HK(i<<2)|0;c[(c[o>>2]|0)+172>>2]=h;if(!k){j=i;i=p;k=p;f=p;g=m;h=q}else{c[(c[n>>2]|0)+184>>2]=0;h=HK((k|0)==(m|0)?t:u-j<<2)|0;c[(c[n>>2]|0)+180>>2]=h;h=fB(w,k,p,0,1)|0;RC(h,137763,176,1)|0;g=c[h+16>>2]|0;b[g+170>>1]=10;c[g+156>>2]=1;g=c[n>>2]|0;f=c[g+180>>2]|0;g=(c[g+184>>2]<<2)+8|0;if(!f)f=IK(g)|0;else f=KK(f,g)|0;k=c[n>>2]|0;c[k+180>>2]=f;k=k+184|0;g=c[k>>2]|0;c[k>>2]=g+1;c[f+(g<<2)>>2]=h;g=c[n>>2]|0;c[(c[g+180>>2]|0)+(c[g+184>>2]<<2)>>2]=0;g=c[o>>2]|0;f=c[g+172>>2]|0;g=(c[g+176>>2]<<2)+8|0;if(!f)f=IK(g)|0;else f=KK(f,g)|0;k=c[o>>2]|0;c[k+172>>2]=f;k=k+176|0;j=c[k>>2]|0;c[k>>2]=j+1;c[f+(j<<2)>>2]=h;j=c[o>>2]|0;c[(c[j+172>>2]|0)+(c[j+176>>2]<<2)>>2]=0;j=i;i=p;k=p;f=p;g=m;h=q}}else g=m;c[r+24>>2]=i;m=g;r=c[r>>2]|0}c[(c[n>>2]|0)+184>>2]=0;k=HK(4)|0;c[(c[n>>2]|0)+180>>2]=k;c[v>>2]=c[4658];k=lB(93863,v,0)|0;f=Qz(a)|0;while(1){if(!f)break;v=qC(k,HB(c[f+20>>2]|0)|0,1)|0;RC(v,137750,304,1)|0;c[f+28>>2]=v;c[(c[v+16>>2]|0)+112>>2]=f;f=c[f>>2]|0}f=0;j=Qz(a)|0;g=-2147483647;a:while(1){if(!j)break;i=c[j+8>>2]|0;b:do if((g|0)==(i|0))i=g;else{f=j;while(1){f=c[f>>2]|0;if(!f)break a;if((c[f+8>>2]|0)!=(i|0))break b}}while(0);h=j+28|0;g=f;while(1){if(!g)break;if(vb[d&127](j,g)|0)fB(k,c[h>>2]|0,c[g+28>>2]|0,0,1)|0;g=c[g>>2]|0}j=c[j>>2]|0;g=i}Nr(k,w,e);pB(k)|0;l=x;return w|0}function Lr(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+16|0;q=r;c[q>>2]=c[4658];q=lB(93816,q,0)|0;RC(q,137786,280,1)|0;j=q+16|0;g=Qz(d)|0;h=0;while(1){if(!g)break;i=qC(q,HB(c[g+20>>2]|0)|0,1)|0;RC(i,137750,304,1)|0;o=i+16|0;m=c[o>>2]|0;c[m+112>>2]=g;c[g+24>>2]=i;c[m+176>>2]=0;m=HK(4)|0;n=c[o>>2]|0;c[n+172>>2]=m;c[n+184>>2]=0;n=HK(4)|0;c[(c[o>>2]|0)+180>>2]=n;if(!h)c[(c[j>>2]|0)+192>>2]=i;else c[(c[h+16>>2]|0)+164>>2]=i;g=c[g>>2]|0;h=i}k=Qz(d)|0;a:while(1){if(!k)break;m=k+32|0;n=k+24|0;o=k+20|0;g=k;while(1){g=c[g>>2]|0;if(!g)break;if(vb[e&127](k,g)|0){h=vb[f&127](m,g+32|0)|0;i=fB(q,c[n>>2]|0,c[g+24>>2]|0,0,1)|0;RC(i,137763,176,1)|0;if((h|0)>=65536){p=13;break a}j=i+16|0;s=c[j>>2]|0;b[s+170>>1]=h;c[s+156>>2]=1;if(i|0?fB(a,c[o>>2]|0,c[g+20>>2]|0,0,0)|0:0)c[(c[j>>2]|0)+156>>2]=100}}k=c[k>>2]|0}if((p|0)==13)Aa(93819,93835,254,93848);k=Qz(d)|0;while(1){if(!k)break;j=c[k+24>>2]|0;m=j+16|0;j=UA(q,j)|0;while(1){if(!j)break;h=c[m>>2]|0;g=c[h+180>>2]|0;h=(c[h+184>>2]<<2)+8|0;if(!g)g=IK(h)|0;else g=KK(g,h)|0;h=c[m>>2]|0;c[h+180>>2]=g;h=h+184|0;i=c[h>>2]|0;c[h>>2]=i+1;c[g+(i<<2)>>2]=j;i=c[m>>2]|0;c[(c[i+180>>2]|0)+(c[i+184>>2]<<2)>>2]=0;i=j+-48|0;g=c[(c[((c[j>>2]&3|0)==2?j:i)+40>>2]|0)+16>>2]|0;h=c[g+172>>2]|0;g=(c[g+176>>2]<<2)+8|0;if(!h)g=IK(g)|0;else g=KK(h,g)|0;c[(c[(c[((c[j>>2]&3|0)==2?j:i)+40>>2]|0)+16>>2]|0)+172>>2]=g;f=c[(c[((c[j>>2]&3|0)==2?j:i)+40>>2]|0)+16>>2]|0;p=c[f+172>>2]|0;f=f+176|0;s=c[f>>2]|0;c[f>>2]=s+1;c[p+(s<<2)>>2]=j;s=c[(c[((c[j>>2]&3|0)==2?j:i)+40>>2]|0)+16>>2]|0;c[(c[s+172>>2]|0)+(c[s+176>>2]<<2)>>2]=0;j=WA(q,j)|0}k=c[k>>2]|0}l=r;return q|0}function Mr(a){a=a|0;var b=0,d=0,e=0,f=0;f=gC(a)|0;while(1){if(!f)break;d=f+16|0;b=c[d>>2]|0;e=c[b+172>>2]|0;if(e){l6(e);b=c[d>>2]|0}b=c[b+180>>2]|0;if(b|0)l6(b);f=hC(a,f)|0}pB(a)|0;return}function Nr(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;k=gC(a)|0;while(1){if(!k)break;n=c[(c[k+16>>2]|0)+112>>2]|0;m=c[n+24>>2]|0;n=n+32|0;o=m+16|0;l=UA(a,k)|0;while(1){if(!l)break;h=c[(c[(c[((c[l>>2]&3|0)==2?l:l+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0;p=vb[e&127](n,h+32|0)|0;h=c[h+24>>2]|0;i=fB(d,m,h,0,1)|0;RC(i,137763,176,1)|0;j=i+16|0;f=c[j>>2]|0;c[f+156>>2]=1;g=b[f+170>>1]|0;if((g&65535|0)<(p|0)){if(!(g<<16>>16)){g=c[o>>2]|0;f=c[g+180>>2]|0;g=(c[g+184>>2]<<2)+8|0;if(!f)f=IK(g)|0;else f=KK(f,g)|0;q=c[o>>2]|0;c[q+180>>2]=f;q=q+184|0;g=c[q>>2]|0;c[q>>2]=g+1;c[f+(g<<2)>>2]=i;g=c[o>>2]|0;c[(c[g+180>>2]|0)+(c[g+184>>2]<<2)>>2]=0;h=h+16|0;g=c[h>>2]|0;f=c[g+172>>2]|0;g=(c[g+176>>2]<<2)+8|0;if(!f)f=IK(g)|0;else f=KK(f,g)|0;g=c[h>>2]|0;c[g+172>>2]=f;g=g+176|0;q=c[g>>2]|0;c[g>>2]=q+1;c[f+(q<<2)>>2]=i;f=c[h>>2]|0;c[(c[f+172>>2]|0)+(c[f+176>>2]<<2)>>2]=0;f=c[j>>2]|0}b[f+170>>1]=p}l=WA(a,l)|0}k=hC(a,k)|0}return}function Or(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return (c[b>>2]|0)-(c[d>>2]|0)|0}function Pr(b,d){b=b|0;d=d|0;var e=0,f=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0;x=l;l=l+64|0;t=x+24|0;r=x+16|0;q=x+52|0;p=x+40|0;s=x;v=qB(b)|0;w=IK(v*72|0)|0;ir(p,b);i=+g[p>>2];j=+g[p+4>>2];p=(a[p+8>>0]|0)!=0;if(p){i=i/72.0;j=j/72.0}e=w;f=gC(b)|0;while(1){if(!f)break;o=c[f+16>>2]|0;k=+h[o+40>>3];n=+h[o+32>>3];if(p){m=j+k*.5;k=i+n*.5}else{m=j*k*.5;k=i*n*.5}o=c[o+132>>2]|0;y=+h[o>>3];h[e>>3]=y;n=+h[o+8>>3];h[e+8>>3]=n;h[e+16>>3]=y-k;h[e+24>>3]=n-m;h[e+32>>3]=k+y;h[e+40>>3]=m+n;h[e+48>>3]=k;h[e+56>>3]=m;c[e+64>>2]=f;e=e+72|0;f=hC(b,f)|0}do if((d|0)<0){i=+Qr(w,v);if(i==0.0){l6(w);e=0;break}if(!(a[195234]|0)){k=i;j=i;u=21}else{u=c[15715]|0;h[r>>3]=i;z4(u,93866,r)|0;k=i;j=i;u=21}}else{f=Rr(w,v,q)|0;e=c[q>>2]|0;if(!e){l6(f);l6(w);e=0;break}if(!d){Tr(s,f,e);i=+h[s>>3];j=+h[s+8>>3]}else{j=+Sr(f,e);i=j}l6(f);if(!(a[195234]|0)){k=i;u=21}else{u=c[15715]|0;h[t>>3]=i;h[t+8>>3]=j;z4(u,93880,t)|0;k=i;u=21}}while(0);if((u|0)==21){e=0;f=w;while(1){if((e|0)>=(v|0))break;u=c[(c[(c[f+64>>2]|0)+16>>2]|0)+132>>2]|0;h[u>>3]=k*+h[f>>3];h[u+8>>3]=j*+h[f+8>>3];e=e+1|0;f=f+72|0}l6(w);e=1}l=x;return e|0}function Qr(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0.0,f=0.0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=0.0;d=0;a:while(1){if((d|0)>=(b|0))break;r=a+72|0;d=d+1|0;m=a+16|0;n=a+8|0;o=a+56|0;p=a+48|0;q=a+32|0;k=a+24|0;l=a+40|0;i=d;j=r;while(1){if((i|0)>=(b|0)){a=r;continue a}if(((+h[m>>3]<=+h[j+32>>3]?+h[j+16>>3]<=+h[q>>3]:0)?+h[k>>3]<=+h[j+40>>3]:0)?+h[j+24>>3]<=+h[l>>3]:0){c=0.0;break a}e=+h[a>>3];f=+h[j>>3];if(e==f)g=t;else g=(+h[p>>3]+ +h[j+48>>3])/+F(+(e-f));e=+h[n>>3];f=+h[j+8>>3];if(e==f)e=t;else e=(+h[o>>3]+ +h[j+56>>3])/+F(+(e-f));g=ec?g:c}}return +c}function Rr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;k=IK((b<<4)+16|0)|0;m=0;e=0;n=k;o=b;i=k;a:while(1){if((e|0)>=(b|0))break;z=a+72|0;e=e+1|0;y=a+16|0;r=a+32|0;s=a+24|0;u=a+40|0;v=a+8|0;w=a+56|0;x=a+48|0;p=e;q=z;l=i;while(1){if((p|0)==(b|0)){a=z;i=l;continue a}if(((+h[y>>3]<=+h[q+32>>3]?+h[q+16>>3]<=+h[r>>3]:0)?+h[s>>3]<=+h[q+40>>3]:0)?+h[q+24>>3]<=+h[u>>3]:0){i=o+b|0;if((m|0)==(o|0)){k=KK(k,(i<<4)+16|0)|0;n=k;l=k}else i=o;f=+h[a>>3];g=+h[q>>3];if(!(f==g)){f=(+h[x>>3]+ +h[q+48>>3])/+F(+(f-g));if(f<1.0){f=1.0;A=13}}else{f=t;A=13}if((A|0)==13)A=0;g=+h[v>>3];j=+h[q+8>>3];if(!(g==j)){g=(+h[w>>3]+ +h[q+56>>3])/+F(+(g-j));if(g<1.0){g=1.0;A=16}}else{g=t;A=16}if((A|0)==16)A=0;m=m+1|0;h[n+(m<<4)>>3]=f;h[n+(m<<4)+8>>3]=g}else i=o;p=p+1|0;q=q+72|0;o=i}}A=KK(i,(m<<4)+16|0)|0;c[d>>2]=m;return A|0}function Sr(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0,f=0.0,g=0.0;d=1;e=0.0;while(1){c=a+16|0;if((d|0)>(b|0))break;g=+h[c>>3];f=+h[a+24>>3];f=ge?f:e;a=c}return +e}function Tr(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0,f=0,g=0,i=0.0;h[b>>3]=1.0;h[b+8>>3]=t;k3(b+16|0,c,16,76);g=IK((c<<4)+16|0)|0;h[g+(c<<4)>>3]=+h[b+(c<<4)>>3];f=c;d=1.0;while(1){h[g+(f<<4)+8>>3]=d;e=f+-1|0;if((f|0)<=0){d=t;e=0;f=0;break}h[g+(e<<4)>>3]=+h[b+(e<<4)>>3];i=+h[(+h[b+(f<<4)+8>>3]>d?b:g)+(f<<4)+8>>3];f=e;d=i}while(1){if((f|0)>(c|0))break;i=+h[g+(f<<4)>>3]*+h[g+(f<<4)+8>>3];b=i>3];h[a>>3]=+h[g+(e<<4)>>3];h[a+8>>3]=i;return}else Aa(93897,93835,832,93917)}function Ur(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a>>3];d=+h[b>>3];if(!(cd)){d=+h[a+8>>3];c=+h[b+8>>3];if(dc&1}else a=1;else a=-1;return a|0}function Vr(a,b,d){a=a|0;b=b|0;d=d|0;d=l;l=l+16|0;b=d;c[b>>2]=93932;dA(1,93982,b)|0;l=d;return 0}function Wr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=l;l=l+16|0;d=e;c[d>>2]=93932;dA(1,94010,d)|0;l=e;return 0}function Xr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;a:do switch(d|0){case 2:{e=IK(16)|0;f=IK(24)|0;c[f+8>>2]=0;c[f+4>>2]=e;c[f>>2]=2;c[e>>2]=0;c[e+4>>2]=1;d=e+8|0;c[f+16>>2]=d;c[f+20>>2]=0;c[f+12>>2]=2;c[d>>2]=1;c[e+12>>2]=0;break}case 1:{e=IK(4)|0;f=IK(12)|0;c[f+8>>2]=0;c[f+4>>2]=e;c[f>>2]=1;c[e>>2]=0;break}default:{Vr(0,0,0)|0;a=(d|0)>0;if(!e){if(!a){f=0;break a}_a()}else{if(!a){f=0;break a}_a()}}}while(0);return f|0}function Yr(a){a=a|0;var b=0;if(a|0){b=c[a+4>>2]|0;if(b|0)l6(b);b=c[a+8>>2]|0;if(b|0)l6(b);l6(a)}return}function Zr(a){a=a|0;var b=0;if(a|0){b=c[a+4>>2]|0;if(b|0)l6(b);b=c[a+8>>2]|0;if(b|0)l6(b);b=c[a+16>>2]|0;if(b|0)l6(b);l6(a)}return}function _r(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o+8|0;m=o;k=n6(c[46891]|0,d<<2)|0;c[46891]=k;f=0;while(1){if((f|0)>=(d|0))break;c[e+(f<<2)>>2]=2147483647;f=f+1|0}c[e+(a<<2)>>2]=0;h=b+(a*20|0)|0;i=b+(a*20|0)+8|0;j=b+(a*20|0)+4|0;f=1;while(1){if((f|0)>=(c[h>>2]|0))break;c[e+(c[(c[j>>2]|0)+(f<<2)>>2]<<2)>>2]=~~+g[(c[i>>2]|0)+(f<<2)>>2];f=f+1|0}$r(n,a,k,e,d);i=-2147483639;while(1){if(!((as(n,m,c[46891]|0,e)|0)<<24>>24)){f=0;break}f=c[m>>2]|0;a=c[e+(f<<2)>>2]|0;if((a|0)==2147483647){f=0;break}i=b+(f*20|0)|0;j=b+(f*20|0)+4|0;h=b+(f*20|0)+8|0;f=1;while(1){if((f|0)>=(c[i>>2]|0))break;bs(n,c[(c[j>>2]|0)+(f<<2)>>2]|0,~~+g[(c[h>>2]|0)+(f<<2)>>2]+a|0,c[46891]|0,e);f=f+1|0}i=a+10|0}while(1){if((f|0)>=(d|0))break;h=e+(f<<2)|0;if((c[h>>2]|0)==2147483647)c[h>>2]=i;f=f+1|0}cs(n);l=o;return}function $r(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=f+-1|0;if((f|0)==1)i=0;else i=IK(j<<2)|0;c[a>>2]=i;c[a+4>>2]=j;g=0;h=0;while(1){if((h|0)>=(f|0))break;if((h|0)!=(b|0)){c[i+(g<<2)>>2]=h;c[d+(h<<2)>>2]=g;g=g+1|0}h=h+1|0}g=(j|0)/2|0;while(1){if((g|0)<=-1)break;ds(a,g,d,e);g=g+-1|0}return}function as(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=a+4|0;if(!(c[f>>2]|0))a=0;else{g=c[a>>2]|0;c[b>>2]=c[g>>2];b=c[g+((c[f>>2]|0)+-1<<2)>>2]|0;c[g>>2]=b;c[d+(b<<2)>>2]=0;c[f>>2]=(c[f>>2]|0)+-1;ds(a,0,d,e);a=1}return a|0}function bs(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;g=f+(b<<2)|0;if((c[g>>2]|0)>(d|0)){k=e+(b<<2)|0;j=c[k>>2]|0;c[g>>2]=d;g=c[a>>2]|0;a=j;while(1){h=g+(a<<2)|0;if((a|0)<=0)break;i=a>>>1;j=c[g+(i<<2)>>2]|0;if((c[f+(j<<2)>>2]|0)<=(d|0))break;c[h>>2]=j;c[e+(j<<2)>>2]=a;a=i}c[h>>2]=b;c[k>>2]=a}return}function cs(a){a=a|0;a=c[a>>2]|0;if(a|0)l6(a);return}function ds(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;i=a+4|0;while(1){f=b<<1;g=f|1;h=c[i>>2]|0;if(!((f|0)<(h|0)?(j=c[a>>2]|0,(c[e+(c[j+(f<<2)>>2]<<2)>>2]|0)<(c[e+(c[j+(b<<2)>>2]<<2)>>2]|0)):0))f=b;if((g|0)<(h|0)){j=c[a>>2]|0;f=(c[e+(c[j+(g<<2)>>2]<<2)>>2]|0)<(c[e+(c[j+(f<<2)>>2]<<2)>>2]|0)?g:f}if((f|0)==(b|0))break;j=c[a>>2]|0;h=j+(f<<2)|0;g=c[h>>2]|0;j=j+(b<<2)|0;c[h>>2]=c[j>>2];c[j>>2]=g;c[d+(c[h>>2]<<2)>>2]=f;c[d+(c[j>>2]<<2)>>2]=b;b=f}return}function es(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0.0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;m=p+8|0;n=p;c[n>>2]=0;o=IK(d<<2)|0;f=0;while(1){if((f|0)>=(d|0))break;g[e+(f<<2)>>2]=3402823466385288598117041.0e14;f=f+1|0}g[e+(a<<2)>>2]=0.0;h=c[b+(a*20|0)>>2]|0;i=b+(a*20|0)+8|0;j=b+(a*20|0)+4|0;f=1;while(1){if((f|0)>=(h|0))break;c[e+(c[(c[j>>2]|0)+(f<<2)>>2]<<2)>>2]=c[(c[i>>2]|0)+(f<<2)>>2];f=f+1|0}fs(m,a,o,e,d);a:while(1){if(!((gs(m,n,o,e)|0)<<24>>24))break;f=c[n>>2]|0;k=+g[e+(f<<2)>>2];if(k==3402823466385288598117041.0e14)break;i=b+(f*20|0)|0;j=b+(f*20|0)+4|0;h=b+(f*20|0)+8|0;f=1;while(1){if((f|0)>=(c[i>>2]|0))continue a;hs(m,c[(c[j>>2]|0)+(f<<2)>>2]|0,k+ +g[(c[h>>2]|0)+(f<<2)>>2],o,e);f=f+1|0}}cs(m);l6(o);l=p;return}function fs(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=f+-1|0;j=IK(i<<2)|0;c[a>>2]=j;c[a+4>>2]=i;g=0;h=0;while(1){if((h|0)>=(f|0))break;if((h|0)!=(b|0)){c[j+(g<<2)>>2]=h;c[d+(h<<2)>>2]=g;g=g+1|0}h=h+1|0}g=(i|0)/2|0;while(1){if((g|0)<=-1)break;is(a,g,d,e);g=g+-1|0}return}function gs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=a+4|0;if(!(c[f>>2]|0))a=0;else{g=c[a>>2]|0;c[b>>2]=c[g>>2];b=c[g+((c[f>>2]|0)+-1<<2)>>2]|0;c[g>>2]=b;c[d+(b<<2)>>2]=0;c[f>>2]=(c[f>>2]|0)+-1;is(a,0,d,e);a=1}return a|0}function hs(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0;h=f+(b<<2)|0;if(!(+g[h>>2]<=d)){l=e+(b<<2)|0;k=c[l>>2]|0;g[h>>2]=d;h=c[a>>2]|0;a=k;while(1){i=h+(a<<2)|0;if((a|0)<=0)break;j=a>>>1;k=c[h+(j<<2)>>2]|0;if(!(+g[f+(k<<2)>>2]>d))break;c[i>>2]=k;c[e+(k<<2)>>2]=a;a=j}c[i>>2]=b;c[l>>2]=a}return}function is(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0;j=a+4|0;while(1){f=b<<1;h=f|1;i=c[j>>2]|0;if(!((f|0)<(i|0)?(k=c[a>>2]|0,+g[e+(c[k+(f<<2)>>2]<<2)>>2]<+g[e+(c[k+(b<<2)>>2]<<2)>>2]):0))f=b;if((h|0)<(i|0)?(k=c[a>>2]|0,+g[e+(c[k+(h<<2)>>2]<<2)>>2]<+g[e+(c[k+(f<<2)>>2]<<2)>>2]):0)f=h;if((f|0)==(b|0))break;k=c[a>>2]|0;i=k+(f<<2)|0;h=c[i>>2]|0;k=k+(b<<2)|0;c[i>>2]=c[k>>2];c[k>>2]=h;c[d+(c[i>>2]<<2)>>2]=f;c[d+(c[k>>2]<<2)>>2]=b;b=f}return}function js(){cu(187568,48);c[46895]=0;return}function ks(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,g=0,i=0.0;g=eu(187568)|0;c[g+32>>2]=a;c[g+36>>2]=b;Mu(a);Mu(b);c[g+24>>2]=0;c[g+28>>2]=0;i=+h[a>>3];f=+h[b>>3]-i;e=+h[a+8>>3];d=+h[b+8>>3]-e;b=g+16|0;h[b>>3]=i*f+e*d+(f*f+d*d)*.5;a=g+8|0;if((f>0.0?f:-f)>(d>0.0?d:-d)){h[g>>3]=1.0;e=d/f;d=f}else{h[a>>3]=1.0;e=f/d;a=g}h[a>>3]=e;h[b>>3]=+h[b>>3]/d;b=c[46895]|0;c[g+40>>2]=b;c[46895]=b+1;return g|0}function ls(a){a=a|0;var b=0.0,d=0.0,e=0,f=0,g=0.0,i=0.0,j=0.0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0;r=+h[a>>3];l=r==1.0;q=a+8|0;e=c[a+28>>2]|0;f=c[a+24>>2]|0;if(l?+h[q>>3]>=0.0:0)p=f;else{p=e;e=f}f=(e|0)!=0;n=(p|0)!=0;t=a+16|0;o=p+8|0;k=e+8|0;a:do if(l){do if(f){d=+h[k>>3];if(d>+h[23285])break a;g=+h[23286];if(!(d>=g)){d=g;b=+h[t>>3]-g*+h[q>>3];break}else{b=+h[e>>3];break}}else{g=+h[23286];d=g;b=+h[t>>3]-g*+h[q>>3]}while(0);do if(n){i=+h[o>>3];if(i>3]-g*+h[q>>3];break}else{g=+h[p>>3];break}}else{g=+h[23285];i=g;g=+h[t>>3]-g*+h[q>>3]}while(0);j=+h[23287];e=b>j;f=g>j;m=+h[23288];if(!(e&f|b>3]-j)/+h[q>>3];b=j}if(b>3]-m)/+h[q>>3];b=m}if(f){i=(+h[t>>3]-j)/+h[q>>3];g=j}if(g>3]-m)/+h[q>>3];g=m;s=47}else s=47}}else{do if(f){b=+h[e>>3];if(b>+h[23287])break a;i=+h[23288];if(!(b>=i)){d=+h[t>>3]-r*i;b=i;break}else{d=+h[k>>3];break}}else{i=+h[23288];d=+h[t>>3]-r*i;b=i}while(0);do if(n){g=+h[p>>3];if(g>3]-r*j;g=j;break}else{i=+h[o>>3];break}}else{g=+h[23287];i=+h[t>>3]-r*g}while(0);j=+h[23285];e=d>j;f=i>j;m=+h[23286];if(!(e&f|d>3]-j)/r}if(d>3]-m)/r}if(f){i=j;g=(+h[t>>3]-j)/r}if(i>3]-m)/r;s=47}else s=47}}while(0);if((s|0)==47)ms(a,b,d,g,i);return}function ms(a,b,d,e,f){a=a|0;b=+b;d=+d;e=+e;f=+f;var g=0;g=a+32|0;Ts(c[g>>2]|0,b,d);Ts(c[g>>2]|0,e,f);a=a+36|0;Ts(c[a>>2]|0,b,d);Ts(c[a>>2]|0,e,f);return}function ns(a,b,d){a=a|0;b=b|0;d=d|0;c[a+24+(b<<2)>>2]=d;Mu(d);if(c[a+24+(1-b<<2)>>2]|0){ls(a);Lu(c[a+32>>2]|0);Lu(c[a+36>>2]|0);fu(a,187568)}return}function os(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;p=l;l=l+16|0;o=p;m=b<<2;h=IK(S(m,d)|0)|0;g=c[e>>2]|0;m=IK(m)|0;n=c[a+8>>2]|0;if(g|0){l6(c[g>>2]|0);l6(g)}k=IK(d<<2)|0;c[e>>2]=k;g=0;while(1){if((g|0)>=(d|0))break;c[k+(g<<2)>>2]=h+((S(g,b)|0)<<2);g=g+1|0}j=(f|0)!=0;if(j)at(a,b);e=(U4()|0)%(b|0)|0;rr(o,b);g=c[k>>2]|0;if(j){_r(e,a,b,g);f=0;g=0}else{nr(e,a,b,g,o);f=0;g=0}while(1){if((g|0)>=(b|0)){i=1;break}h=c[(c[k>>2]|0)+(g<<2)>>2]|0;c[m+(g<<2)>>2]=h;i=(h|0)>(f|0);f=i?h:f;e=i?g:e;g=g+1|0}while(1){if((i|0)>=(d|0))break;h=k+(i<<2)|0;g=c[h>>2]|0;if(j){_r(e,a,b,g);g=0;f=0}else{nr(e,a,b,g,o);g=0;f=0}while(1){if((g|0)>=(b|0))break;s=m+(g<<2)|0;q=c[s>>2]|0;r=c[(c[h>>2]|0)+(g<<2)>>2]|0;r=(q|0)<(r|0)?q:r;c[s>>2]=r;s=(r|0)>(f|0);q=s?g:e;g=g+1|0;f=s?r:f;e=q}i=i+1|0}l6(m);if(j)bt(a,b,n);l=p;return}function ps(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,h=0,i=0.0,j=0,k=0;i=+(b|0);h=0;while(1){if((h|0)>=(d|0))break;j=a+(h<<2)|0;e=0.0;f=0;while(1){if((f|0)>=(b|0))break;e=e+ +(c[(c[j>>2]|0)+(f<<2)>>2]|0);f=f+1|0}g=~~(e/i);f=0;while(1){if((f|0)>=(b|0))break;k=(c[j>>2]|0)+(f<<2)|0;c[k>>2]=(c[k>>2]|0)-g;f=f+1|0}h=h+1|0}return}function qs(){c[46897]=~~+G(+(+((c[46896]|0)+4|0)));return}function rs(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a>>3]-+h[b>>3];c=+h[a+8>>3]-+h[b+8>>3];return +(d*d+c*c)}function ss(a,b,c){a=a|0;b=b|0;c=c|0;h[a>>3]=+h[b>>3]-+h[c>>3];h[a+8>>3]=+h[b+8>>3]-+h[c+8>>3];return}function ts(a,b,c){a=a|0;b=b|0;c=c|0;h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=+h[b+8>>3]+ +h[c+8>>3];return}function us(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0;e=+h[b+8>>3];d=+h[b>>3];return +((+h[a+8>>3]-e)*(+h[c>>3]-d)-(+h[c+8>>3]-e)*(+h[a>>3]-d))}function vs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+48|0;f=e+32|0;g=e+16|0;h=e;c[h>>2]=c[a>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[h+12>>2]=c[a+12>>2];c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];d=+us(h,g,f)>0.0&1;l=e;return d|0}function ws(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;o=+h[a>>3];p=+h[d+8>>3];q=+h[c+8>>3];m=o*(p-q);n=+h[b>>3];l=+h[d>>3];k=+h[b+8>>3];i=+h[a+8>>3];j=k-i;f=+h[c>>3];g=f*(i-k)+(m+n*(q-p)+l*j);if(g==0.0)d=0;else{p=(l*(q-i)+(m+f*(i-p)))/g;q=-(f*j+(o*(q-k)+n*(i-q)))/g;h[e>>3]=o+(n-o)*p;h[e+8>>3]=i+j*p;d=q<=1.0&(q>=0.0&(p>=0.0&p<=1.0))&1}return d|0}function xs(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,g=0,i=0;c[a+20>>2]=b;Mu(b);i=a+24|0;h[i>>3]=+h[b+8>>3]+d;e=c[46898]|0;e=e+((ys(a)|0)*40|0)|0;while(1){g=e+32|0;e=c[g>>2]|0;if(!e){e=0;break}d=+h[i>>3];f=+h[e+24>>3];if(d>f)continue;if(!(d==f))break;if(!(+h[b>>3]>+h[c[e+20>>2]>>3]))break}c[a+32>>2]=e;c[g>>2]=a;c[46899]=(c[46899]|0)+1;return}function ys(a){a=a|0;var b=0.0,d=0,e=0.0;d=c[46900]|0;e=+(d|0);b=(+h[a+24>>3]-+h[23293])/+h[23296]*e;do if(!(b<0.0))if(!(b>=e)){a=~~b;break}else{a=d+-1|0;break}else a=0;while(0);if((a|0)<(c[46901]|0))c[46901]=a;return a|0}function zs(a){a=a|0;var b=0,d=0,e=0;d=a+20|0;if(c[d>>2]|0){b=c[46898]|0;b=b+((ys(a)|0)*40|0)|0;do{e=b+32|0;b=c[e>>2]|0}while((b|0)!=(a|0));c[e>>2]=c[a+32>>2];c[46899]=(c[46899]|0)+-1;Lu(c[d>>2]|0);c[d>>2]=0}return}function As(){return (c[46899]|0)==0|0}function Bs(a){a=a|0;var b=0,d=0,e=0,f=0.0;b=c[46898]|0;d=c[46901]|0;while(1){e=c[b+(d*40|0)+32>>2]|0;if(e|0)break;e=d+1|0;c[46901]=e;d=e}f=+h[e+24>>3];h[a>>3]=+h[c[e+20>>2]>>3];h[a+8>>3]=f;return}function Cs(){var a=0,b=0;b=(c[46898]|0)+((c[46901]|0)*40|0)+32|0;a=c[b>>2]|0;c[b>>2]=c[a+32>>2];c[46899]=(c[46899]|0)+-1;return a|0}function Ds(){l6(c[46898]|0);c[46898]=0;return}function Es(){var a=0,b=0,d=0;c[46899]=0;c[46901]=0;a=c[46897]|0;b=a<<2;c[46900]=b;d=c[46898]|0;if(!d){d=IK(a*160|0)|0;c[46898]=d;b=c[46900]|0}a=0;while(1){if((a|0)>=(b|0))break;c[d+(a*40|0)+32>>2]=0;a=a+1|0}return}function Fs(){cu(187616,40);l6(c[46907]|0);c[46907]=0;return}function Gs(){var a=0,b=0,d=0;cu(187616,40);a=c[46897]|0;b=a<<1;c[46908]=b;d=c[46907]|0;if(!d){d=IK(a<<3)|0;c[46907]=d;b=c[46908]|0}a=0;while(1){if((a|0)>=(b|0))break;c[d+(a<<2)>>2]=0;a=a+1|0}c[46902]=Hs(0,0)|0;c[46903]=Hs(0,0)|0;c[c[46902]>>2]=0;d=c[46903]|0;b=c[46902]|0;c[b+4>>2]=d;c[d>>2]=b;c[(c[46903]|0)+4>>2]=0;d=c[46907]|0;c[d>>2]=c[46902];c[d+((c[46908]|0)+-1<<2)>>2]=c[46903];return}function Hs(b,d){b=b|0;d=d|0;var e=0;e=eu(187616)|0;c[e+8>>2]=b;a[e+16>>0]=d;c[e+32>>2]=0;c[e+20>>2]=0;c[e+12>>2]=0;return e|0}function Is(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0;i=c[b+8>>2]|0;k=c[d+8>>2]|0;do if((!((i|0)==0|(k|0)==0)?(o=c[i+36>>2]|0,e=c[k+36>>2]|0,(o|0)!=(e|0)):0)?(j=+h[i>>3],f=+h[k+8>>3],g=+h[i+8>>3],l=+h[k>>3],m=j*f-g*l,!(m>-1.0e-10&m<1.0e-10)):0){p=+h[i+16>>3];q=+h[k+16>>3];n=(f*p-g*q)/m;j=(j*q-l*p)/m;f=+h[o+8>>3];g=+h[e+8>>3];do if(f>3]<+h[e>>3]:0){e=o;break}b=d}while(0);b=a[b+16>>0]|0;if(!(n>=+h[e>>3])){if(b<<24>>24==1){b=0;break}}else if(!(b<<24>>24)){b=0;break}b=Iu()|0;c[b+20>>2]=0;h[b>>3]=n;h[b+8>>3]=j}else b=0;while(0);return b|0}function Js(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0.0,q=0;o=c[b+8>>2]|0;i=c[o+36>>2]|0;m=+h[d>>3];p=+h[i>>3];n=m>p;e=a[b+16>>0]|0;b=n^1;q=e<<24>>24!=0;if(q|b)if(e<<24>>24==1&b)b=0;else{g=+h[o>>3];b=o+16|0;j=+h[d+8>>3];f=+h[i+8>>3];k=m-p;l=k*k;do if(g==1.0){f=j-f;g=+h[o+8>>3];e=g<0.0;if(n?g>=0.0:e){b=f>=k*g;if(b){b=b&1;break}}else{b=e^m+j*g>+h[b>>3];if(!b){b=b&1;break}}p=p-+h[c[o+32>>2]>>3];b=(l-f*f)*g>3]-m*g;m=j-p;p=p-f;b=m*m>l+p*p&1}while(0);b=b^q&1}else b=1;return b|0}function Ks(a,b){a=a|0;b=b|0;c[b>>2]=a;a=a+4|0;c[b+4>>2]=c[a>>2];c[c[a>>2]>>2]=b;c[a>>2]=b;return}function Ls(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=c[46908]|0;b=~~((+h[a>>3]-+h[23291])/+h[23295]*+(f|0));b=(b|0)>0?b:0;f=(b|0)<(f|0)?b:f+-1|0;b=Ms(f)|0;if(!b){d=1;while(1){b=Ms(f-d|0)|0;if(b|0)break;b=Ms(d+f|0)|0;if(b|0)break;d=d+1|0}c[46909]=(c[46909]|0)+d}c[46910]=(c[46910]|0)+1;e=c[46902]|0;d=c[46903]|0;a:do if((b|0)==(e|0))g=9;else{if((b|0)!=(d|0)?(Js(b,a)|0)!=0:0){g=9;break}while(1){b=c[b>>2]|0;if((b|0)==(e|0))break a;if(Js(b,a)|0){e=b;break}}}while(0);if((g|0)==9){while(1){b=c[b+4>>2]|0;if((b|0)==(d|0))break;if(!(Js(b,a)|0))break;else g=9}e=c[b>>2]|0}if((f|0)>0?(f|0)<((c[46908]|0)+-1|0):0){b=(c[46907]|0)+(f<<2)|0;d=c[b>>2]|0;if(d|0){g=d+12|0;c[g>>2]=(c[g>>2]|0)+-1}c[b>>2]=e;g=e+12|0;c[g>>2]=(c[g>>2]|0)+1}return e|0}function Ms(a){a=a|0;var b=0,d=0;if((a|0)>-1&(c[46908]|0)>(a|0)?(d=(c[46907]|0)+(a<<2)|0,b=c[d>>2]|0,(b|0)!=0):0){if((c[b+8>>2]|0)==(-2|0)){c[d>>2]=0;a=b+12|0;d=(c[a>>2]|0)+-1|0;c[a>>2]=d;if(!d){fu(b,187616);b=0}else b=0}}else b=0;return b|0}function Ns(a){a=a|0;var b=0,d=0;b=a+4|0;d=c[a>>2]|0;c[d+4>>2]=c[b>>2];c[c[b>>2]>>2]=d;c[a+8>>2]=-2;return}function Os(a){a=a|0;return c[a+4>>2]|0}function Ps(a){a=a|0;return c[a>>2]|0}function Qs(b){b=b|0;var d=0;d=c[b+8>>2]|0;if(!d)b=187840;else b=d+32+(((a[b+16>>0]|0)!=0&1)<<2)|0;return c[b>>2]|0}function Rs(b){b=b|0;var d=0;d=c[b+8>>2]|0;if(!d)b=187840;else b=d+32+(((a[b+16>>0]|0)==0&1)<<2)|0;return c[b>>2]|0}function Ss(){cu(187648,24);return}function Ts(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,g=0,i=0,j=0;j=l;l=l+32|0;i=j;g=(c[46911]|0)+((c[a+16>>2]|0)*96|0)+88|0;f=c[g>>2]|0;h[i+8>>3]=b;h[i+16>>3]=d;e=Us(a,i,f)|0;do if(e|0){if((e|0)<0){i=eu(187648)|0;h[i+8>>3]=b;h[i+16>>3]=d;c[i>>2]=f;c[g>>2]=i;break}while(1){e=c[f>>2]|0;g=Us(a,i,e)|0;if((g|0)>0)f=e;else break}if(g|0){i=eu(187648)|0;h[i+8>>3]=b;h[i+16>>3]=d;c[f>>2]=i;c[i>>2]=e}}while(0);l=j;return}function Us(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0;do if(c){e=+h[b+8>>3];g=+h[c+8>>3];d=+h[b+16>>3];f=+h[c+16>>3];if(!(e==g&d==f)){k=+h[a>>3];j=e-k;e=+h[a+8>>3];i=d-e;g=g-k;f=f-e;d=f/g;e=i/j;b=e=0.0)){a=g>=0.0;b=a|b;b=e>d|b?(b?(a?1:-1):1):j>g?-1:1;break}if(!(g<0.0)){c=g>0.0;if(j>0.0)if(c)return (e==e&d==d&e!=d?(b?-1:1):j0.0?-1:1;break}b=i<=0.0;if(c){b=b?-1:1;break}if(i>2]|0;d=a+(d*20|0)+4|0;b=1;a=0;while(1){if((b|0)>=(f|0))break;g=((c[e+(c[(c[d>>2]|0)+(b<<2)>>2]<<2)>>2]|0)>0&1)+a|0;b=b+1|0;a=g}return a|0}function Ws(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=a+(b*20|0)|0;b=a+(b*20|0)+4|0;a=1;while(1){if((a|0)>=(c[e>>2]|0))break;c[d+(c[(c[b>>2]|0)+(a<<2)>>2]<<2)>>2]=1;a=a+1|0}return}function Xs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=a+(b*20|0)|0;b=a+(b*20|0)+4|0;a=1;while(1){if((a|0)>=(c[e>>2]|0))break;c[d+(c[(c[b>>2]|0)+(a<<2)>>2]<<2)>>2]=0;a=a+1|0}return}function Ys(a,b){a=a|0;b=b|0;if(!(c[a+8>>2]|0))a=_s(a,b)|0;else a=Zs(a,b)|0;return a|0}function Zs(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=b<<2;e=IK(S(f,b)|0)|0;f=IK(f)|0;d=0;while(1){if((d|0)>=(b|0)){d=0;break}c[f+(d<<2)>>2]=e+((S(d,b)|0)<<2);d=d+1|0}while(1){if((d|0)>=(b|0))break;_r(d,a,b,c[f+(d<<2)>>2]|0);d=d+1|0}return f|0}function _s(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;g=b<<2;e=IK(S(g,b)|0)|0;g=IK(g)|0;d=0;while(1){if((d|0)>=(b|0))break;c[g+(d<<2)>>2]=e+((S(d,b)|0)<<2);d=d+1|0}rr(f,b);d=0;while(1){if((d|0)>=(b|0))break;nr(d,a,b,c[g+(d<<2)>>2]|0,f);d=d+1|0}sr(f);l=h;return g|0}function $s(a,b){a=a|0;b=b|0;var d=0,e=0;e=c[a+8>>2]|0;at(a,b);d=Zs(a,b)|0;bt(a,b,e);return d|0}function at(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=IK(b<<2)|0;d=0;e=0;while(1){if((d|0)>=(b|0))break;k=(c[a+(d*20|0)>>2]|0)+e|0;d=d+1|0;e=k}e=IK(e<<2)|0;d=0;while(1){if((d|0)>=(b|0))break;c[l+(d<<2)>>2]=0;d=d+1|0}f=0;while(1){if((f|0)>=(b|0))break;c[a+(f*20|0)+8>>2]=e;Ws(a,f,l);h=a+(f*20|0)|0;i=c[h>>2]|0;j=a+(f*20|0)+4|0;k=i+-2|0;d=1;while(1){if((d|0)>=(i|0))break;m=c[(c[j>>2]|0)+(d<<2)>>2]|0;n=c[a+(m*20|0)>>2]|0;g[e+(d<<2)>>2]=+(k+n-((Vs(a,0,m,l)|0)<<1)|0);d=d+1|0}Xs(a,f,l);e=e+(c[h>>2]<<2)|0;f=f+1|0}l6(l);return}function bt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+8|0;l6(c[e>>2]|0);c[e>>2]=0;a:do if(d|0){e=0;while(1){if((e|0)>=(b|0))break a;c[a+(e*20|0)+8>>2]=d;f=d+(c[a+(e*20|0)>>2]<<2)|0;e=e+1|0;d=f}}while(0);return}function ct(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0;f=0;g=0.0;while(1){if((f|0)>=(b|0))break;j=c[a+(f<<2)>>2]|0;i=+h[j+(d<<3)>>3]-+h[j+(e<<3)>>3];f=f+1|0;g=g+i*i}return +(+G(+g))}function dt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((e|0)>(d|0)){c[46915]=a;k3(b+(d<<2)|0,1-d+e|0,4,77)}return}function et(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0;f=c[46915]|0;e=+g[f+(c[a>>2]<<2)>>2];d=+g[f+(c[b>>2]<<2)>>2];return (ed&1)|0}function ft(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;if((d|0)<(e|0)){gt(a,b,d,e,f);g=c[f>>2]|0;f=g+-1|0;ft(a,b,d,f);g=g+1|0;ft(a,b,g,e);if(!(ht(a,b,d,f)|0))ft(a,b,d,f);if(!(ht(a,b,g,e)|0))ft(a,b,g,e)}l=h;return}function gt(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0.0;k=U4()|0;k=b+(((((U4()|0)<<16|k)>>>0)%((1-d+e|0)>>>0)|0)+d<<2)|0;l=c[k>>2]|0;m=b+(d<<2)|0;c[k>>2]=c[m>>2];c[m>>2]=l;n=+h[a+(l<<3)>>3];d=d+1|0;a:while(1){if((d|0)>=(e|0))break;while(1){j=d+1|0;k=b+(d<<2)|0;if((d|0)>=(e|0))break;if(!(+h[a+(c[k>>2]<<3)>>3]<=n))break;else d=j}while(1){i=b+(e<<2)|0;g=e;e=e+-1|0;if((d|0)>=(g|0)){e=g;continue a}g=c[i>>2]|0;if(!(+h[a+(g<<3)>>3]>n))break}d=c[k>>2]|0;c[k>>2]=g;c[i>>2]=d;d=j}a=((+h[a+(c[b+(d<<2)>>2]<<3)>>3]>n)<<31>>31)+d|0;c[f>>2]=a;f=b+(a<<2)|0;c[m>>2]=c[f>>2];c[f>>2]=l;return}function ht(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=1;while(1){f=d+1|0;if(!((d|0)<(e|0)&(g|0)!=0))break;g=+h[a+(c[b+(d<<2)>>2]<<3)>>3]>+h[a+(c[b+(f<<2)>>2]<<3)>>3]?0:g;d=f}return g|0}function it(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0;x=l;l=l+16|0;v=4;w=k6(40)|0;c[w>>2]=0;t=x;o=0;u=la(23,b*40|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,w|0,v|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)!=1){d=0;r=0;while(1){if((d|0)>=(b|0))break;s=(c[(c[a+(d<<2)>>2]|0)+4>>2]|0)+r|0;d=d+1|0;r=s}o=0;s=la(23,r*24|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,w|0,v|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)!=1){d=0;m=0;while(1){if((m|0)>=(b|0))break;n=u+(m*40|0)|0;c[n>>2]=s+(d*24|0);q=a+(m<<2)|0;f=0;g=1797693134862315708145274.0e284;i=-1797693134862315708145274.0e284;j=-1797693134862315708145274.0e284;k=1797693134862315708145274.0e284;while(1){e=c[q>>2]|0;if((f|0)>=(c[e+4>>2]|0))break;e=c[e>>2]|0;z=+h[e+(f<<4)>>3];y=+h[e+(f<<4)+8>>3];h[s+(d*24|0)>>3]=z;h[s+(d*24|0)+8>>3]=y;c[s+(d*24|0)+16>>2]=n;c[s+(d*24|0)+20>>2]=0;f=f+1|0;d=d+1|0;g=gz?i:z;j=j>y?j:y;k=k>2]=s+((d+-1|0)*24|0);h[u+(m*40|0)+8>>3]=g;h[u+(m*40|0)+16>>3]=k;h[u+(m*40|0)+24>>3]=i;h[u+(m*40|0)+32>>3]=j;m=m+1|0}c[t>>2]=r;c[t+4>>2]=b;w=x6(187664,1,w|0,v|0)|0;v=D;o=0;d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,w|0,v|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;q=s;m=s;n=u}else{d=0;q=s;m=s;n=u}}else{d=D;q=0;m=s;n=u}}else{d=D;q=0;m=0;n=0}while(1){if(d|0){o=0;$(105,u|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,w|0,v|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){f=n;r=m;s=q;d=D;n=f;m=r;q=s;continue}o=0;$(105,m|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,w|0,v|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){f=n;r=m;s=q;d=D;n=f;m=r;q=s;continue}else{e=17;break}}o=0;d=ra(78,q|0,t|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,v|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){f=n;r=m;s=q;d=D;n=f;m=r;q=s;continue}if(!d){o=0;d=aa(27,a|0,b|0,n|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,v|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){f=n;r=m;s=q;d=D;n=f;m=r;q=s;continue}}o=0;$(105,u|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,v|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){f=n;r=m;s=q;d=D;n=f;m=r;q=s;continue}o=0;$(105,m|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,v|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){f=n;r=m;s=q;d=D;n=f;m=r;q=s}else{e=24;break}}if((e|0)==17)d=0;else if((e|0)==24)d=(d|0)==0&1;l6(w|0);l=x;return d|0}function jt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+16|0;r=w;p=w+8|0;q=w+4|0;c[b+8>>2]=0;v=IK(c[b>>2]<<2)|0;f=c[b>>2]|0;e=0;while(1){if((e|0)>=(f|0))break;c[v+(e<<2)>>2]=a+(e*24|0);e=e+1|0}k3(v,f,4,79);n=0;g=0;f=0;h=0;a:while(1){if((n|0)>=(c[b>>2]|0)){t=0;d=g;u=h;break}o=v+(n<<2)|0;e=c[o>>2]|0;c[p>>2]=e;a=c[e+16>>2]|0;if((e|0)==(c[a>>2]|0))e=c[a+4>>2]|0;else e=e+-24|0;c[q>>2]=e;m=0;a=g;k=h;while(1){if((m|0)>=2)break;j=e+20|0;switch(lt(p,q)|0){case -1:{g=0;h=a;while(1){if((g|0)>=(k|0))break;i=mt(c[h>>2]|0,e)|0;if(i|0){t=i;d=a;u=k;break a}g=g+1|0;h=c[h+4>>2]|0}g=IK(12)|0;if(!k){f=0;a=g}else c[f+4>>2]=g;c[g+8>>2]=f;c[g>>2]=e;c[g+4>>2]=0;c[j>>2]=g;h=a;f=g;g=k+1|0;break}case 1:{g=c[j>>2]|0;if(!g){s=19;break a}do if((k|0)!=1){if((g|0)==(a|0)){a=c[a+4>>2]|0;c[a+8>>2]=0;e=f;break}if((g|0)==(f|0)){e=c[f+8>>2]|0;c[e+4>>2]=0;break}else{e=g+4|0;i=c[g+8>>2]|0;c[i+4>>2]=c[e>>2];c[(c[e>>2]|0)+8>>2]=i;e=f;break}}else{a=0;e=0}while(0);l6(g);c[j>>2]=0;h=a;f=e;g=k+-1|0;break}default:{h=a;g=k}}e=c[o>>2]|0;a=c[e+16>>2]|0;if((e|0)==(c[a+4>>2]|0))a=c[a>>2]|0;else a=e+24|0;c[q>>2]=a;m=m+1|0;a=h;k=g}n=n+1|0;g=a;h=k}if((s|0)==19){dA(1,94028,r)|0;Ca(187664,1)}e=0;while(1){if((e|0)>=(u|0))break;s=c[d+4>>2]|0;l6(d);e=e+1|0;d=s}l6(v);l=w;return t|0}function kt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0,D=0,E=0,F=0,G=0,H=0.0;G=l;l=l+48|0;s=G+16|0;r=G+32|0;y=G;e=0;a:while(1){if((e|0)>=(b|0)){e=0;break}C=c[a+(e<<2)>>2]|0;D=c[C>>2]|0;c[y>>2]=c[D>>2];c[y+4>>2]=c[D+4>>2];c[y+8>>2]=c[D+8>>2];c[y+12>>2]=c[D+12>>2];D=e+1|0;E=d+(e*40|0)+8|0;t=d+(e*40|0)+16|0;u=d+(e*40|0)+32|0;g=d+(e*40|0)+24|0;e=D;while(1){if((e|0)>=(b|0)){e=D;continue a}i=c[a+(e<<2)>>2]|0;j=+h[E>>3];k=+h[d+(e*40|0)+24>>3];m=d+(e*40|0)+32|0;n=d+(e*40|0)+16|0;o=+h[d+(e*40|0)+8>>3];p=+h[g>>3];q=p>=o;f=!(j<=k);if(((!(f|!(j>=o))?(v=+h[t>>3],w=+h[m>>3],v<=w):0)?(x=+h[n>>3],!(!(p<=k)|!(v>=x)|q^1)):0)?(H=+h[u>>3],!(!(H<=w)|!(H>=x))):0){c[r>>2]=c[i>>2];c[r+4>>2]=c[i+4>>2];c[s>>2]=c[y>>2];c[s+4>>2]=c[y+4>>2];c[s+8>>2]=c[y+8>>2];c[s+12>>2]=c[y+12>>2];if(LX(r,s)|0){e=1;break a}}else F=10;if((((((F|0)==10?(F=0,!(!(o>=j)|q^1)):0)?(z=+h[n>>3],A=+h[u>>3],z<=A):0)?(B=+h[t>>3],!(f|(!(k<=p)|!(z>=B)))):0)?(H=+h[m>>3],!(!(H<=A)|!(H>=B))):0)?(q=c[i>>2]|0,c[r>>2]=c[C>>2],c[r+4>>2]=c[C+4>>2],c[s>>2]=c[q>>2],c[s+4>>2]=c[q+4>>2],c[s+8>>2]=c[q+8>>2],c[s+12>>2]=c[q+12>>2],LX(r,s)|0):0){e=1;break a}e=e+1|0}}l=G;return e|0}function lt(a,b){a=a|0;b=b|0;var d=0.0,e=0;e=c[a>>2]|0;a=c[b>>2]|0;d=+h[e>>3]-+h[a>>3];if(!(d!=0.0)){d=+h[e+8>>3]-+h[a+8>>3];if(d==0.0)a=0;else a=d>0.0?1:-1}else a=d>0.0?1:-1;return a|0}function mt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+64|0;g=m+32|0;i=m+24|0;j=m+16|0;k=m;f=m+48|0;nt(a,b,f);d=f+8|0;e=c[d>>2]|0;do if((e|0)>0)d=0;else{if((e|0)<0){nt(b,a,f);d=c[d>>2]|0;if((d|0)>0){d=0;break}if((d|0)<0)d=3;else{d=c[f>>2]|0;d=ot(b,a,(d|0)>-1?d:0-d|0)|0}if(!(pt(a,b,i,j,d)|0)){d=0;break}}else{d=c[f>>2]|0;if((d|0)==(c[f+4>>2]|0)){d=ot(a,b,0)|0;d=(ot(a,b,(d|0)<=(ot(a,b,1)|0)&1)|0)<<1}else d=ot(a,b,(d|0)>-1?d:0-d|0)|0;if(!(pt(a,b,i,j,d)|0)){d=0;break}}h[k>>3]=+h[i>>3];h[k+8>>3]=+h[j>>3];c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];d=qt(a,b,g)|0}while(0);l=m;return d|0}function nt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0;i=+h[a>>3];j=+h[a+8>>3];e=c[a+16>>2]|0;if((c[e+4>>2]|0)==(a|0))a=c[e>>2]|0;else a=a+24|0;g=+h[a>>3]-i;f=+h[a+8>>3]-j;a=c[b+16>>2]|0;if((c[a+4>>2]|0)==(b|0))a=c[a>>2]|0;else a=b+24|0;k=+h[a>>3]-i;l=+h[a+8>>3]-j;j=g*(+h[b+8>>3]-j)-f*(+h[b>>3]-i);b=j==0.0?0:j>0.0?1:-1;c[d>>2]=b;j=g*l-f*k;e=j==0.0?0:j>0.0?1:-1;c[d+4>>2]=e;c[d+8>>2]=S(e,b)|0;return}function ot(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0;k=+h[a>>3];l=+h[a+8>>3];f=c[a+16>>2]|0;if((c[f+4>>2]|0)==(a|0))a=c[f>>2]|0;else a=a+24|0;j=+h[a>>3];i=+h[a+8>>3];do if(d){a=c[b+16>>2]|0;if((c[a+4>>2]|0)==(b|0)){b=c[a>>2]|0;break}else{b=b+24|0;break}}while(0);g=+h[b>>3];e=+h[b+8>>3];if(k==j){if(k==g)b=(st(l,e,i)|0)!=-1;else b=0;b=b&1}else b=st(k,g,j)|0;return b|0}function pt(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;a:do if((f|0)<1)g=0;else{q=+h[a>>3];s=+h[a+8>>3];g=c[a+16>>2]|0;if((c[g+4>>2]|0)==(a|0))g=c[g>>2]|0;else g=a+24|0;l=+h[g>>3];j=+h[g+8>>3];p=+h[b>>3];r=+h[b+8>>3];g=c[b+16>>2]|0;if((c[g+4>>2]|0)==(b|0))g=c[g>>2]|0;else g=b+24|0;k=+h[g>>3];i=+h[g+8>>3];n=s-j;o=q-l;b:do switch(f|0){case 3:{m=(r-i)/(p-k);if(q==l){h[d>>3]=q;i=i+(q-k)*m;break b}i=n/o;if(p==k){h[d>>3]=p;i=j+i*(p-l);break b}else{r=r-p*m;q=s-q*i;s=m-i;h[d>>3]=(q-r)/s;i=(q*m-i*r)/s;break b}}case 2:{if((ot(a,b,0)|0)==-1)if((ot(b,a,1)|0)==-1){f=(ot(b,a,0)|0)==-1;l=f?l:q;k=p;j=f?j:s;i=r}else{l=k;k=p;j=i;i=r}else if((ot(a,b,1)|0)!=-1)if((ot(b,a,0)|0)==-1){k=q;i=s}else{g=0;break a}else{l=p;j=r}h[d>>3]=(l+k)*.5;i=(j+i)*.5;break}case 1:if(o*(r-s)==n*(p-q)){h[d>>3]=p;i=r;break b}else{h[d>>3]=k;break b}default:{g=1;break a}}while(0);h[e>>3]=i;g=1}while(0);return g|0}function qt(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0;t=l;l=l+16|0;r=t;p=+h[a>>3];q=+h[a+8>>3];f=c[a+16>>2]|0;if((c[f+4>>2]|0)==(a|0))f=c[f>>2]|0;else f=a+24|0;n=+h[f>>3];k=+h[f+8>>3];m=+h[b>>3];o=+h[b+8>>3];f=c[b+16>>2]|0;if((c[f+4>>2]|0)==(b|0))f=c[f>>2]|0;else f=b+24|0;j=+h[f>>3];i=+h[f+8>>3];f=e+8|0;a:do if(!(p!=n&m!=j)){do if(p==n){g=+h[e>>3];if(p==g?q==+h[f>>3]:0)break;if(!(n==g)){s=18;break a}if(!(k==+h[f>>3])){s=18;break a}}while(0);if(m==j){g=+h[e>>3];if(m==g?o==+h[f>>3]:0){f=0;break}if(j==g?i==+h[f>>3]:0)f=0;else s=18}else f=0}else s=18;while(0);if((s|0)==18)if((d[195234]|0)>1){s=c[15715]|0;q=+h[f>>3];h[r>>3]=+h[e>>3];h[r+8>>3]=q;z4(s,94057,r)|0;rt(1,a);rt(2,b);f=1}else f=1;l=t;return f|0}function rt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0,j=0,k=0.0,m=0.0;j=l;l=l+48|0;i=j;e=c[15715]|0;f=+h[b>>3];g=+h[b+8>>3];d=c[b+16>>2]|0;if((c[d+4>>2]|0)==(b|0))b=c[d>>2]|0;else b=b+24|0;m=+h[b>>3];k=+h[b+8>>3];c[i>>2]=a;h[i+8>>3]=f;h[i+16>>3]=g;h[i+24>>3]=m;h[i+32>>3]=k;z4(e,94085,i)|0;l=j;return}function st(a,b,c){a=+a;b=+b;c=+c;return (a==b|b==c?0:(a>3]=0.0;e=e+1|0}h[f+(a<<3)>>3]=1.0;sy(c[b+(a<<2)>>2]|0,f,d);a=a+1|0}l6(f);f=0;while(1){if((f|0)>=(d|0)){a=1;break a}e=b+(f<<2)|0;a=0;while(1){if((a|0)==(f|0))break;j=(c[e>>2]|0)+(a<<3)|0;i=+h[j>>3];g=(c[b+(a<<2)>>2]|0)+(f<<3)|0;h[j>>3]=+h[g>>3];h[g>>3]=i;a=a+1|0}f=f+1|0}}while(0);return a|0}function ut(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=b<<3;p=IK(q)|0;q=IK(q)|0;r=b*30|0;n=(d|0)<(b|0)?d:b;o=b+-1|0;m=(g|0)==0;d=0;i=0;a:while(1){if((i|0)>=(n|0))break;k=c[e+(i<<2)>>2]|0;do{b:do if(m)d=0;else{d=0;while(1){if((d|0)==(b|0)){d=0;break b}h[k+(d<<3)>>3]=+((U4()|0)%100|0|0);d=d+1|0}}while(0);while(1){if((d|0)==(i|0))break;g=c[e+(d<<2)>>2]|0;wt(k,0,o,-+vt(g,0,o,k),g);d=d+1|0}j=+xt(k,0,o)}while(j<1.0e-10);yt(k,0,o,1.0/j,k);d=0;do{zt(q,0,o,k);At(a,b,b,k,p);zt(k,0,o,p);g=0;while(1){if((g|0)==(i|0))break;s=c[e+(g<<2)>>2]|0;wt(k,0,o,-+vt(s,0,o,k),s);g=g+1|0}s=d;d=d+1|0;j=+xt(k,0,o);if(!((s|0)<(r|0)&!(j<1.0e-10)))break a;yt(k,0,o,1.0/j,k);l=+vt(k,0,o,q)}while(+F(+l)<.999);h[f+(i<<3)>>3]=j*l;i=i+1|0}while(1){if((i|0)>=(n|0))break;k=c[e+(i<<2)>>2]|0;g=0;while(1){if((g|0)>=(b|0)){g=0;break}h[k+(g<<3)>>3]=+((U4()|0)%100|0|0);g=g+1|0}while(1){if((g|0)>=(i|0))break;s=c[e+(g<<2)>>2]|0;wt(k,0,o,-+vt(s,0,o,k),s);g=g+1|0}yt(k,0,o,1.0/+xt(k,0,o),k);h[f+(i<<3)>>3]=0.0;i=i+1|0}m=n+-1|0;i=0;while(1){if((i|0)>=(m|0))break;a=f+(i<<3)|0;b=i+1|0;j=+h[a>>3];g=i;k=b;while(1){if((k|0)>=(n|0))break;l=+h[f+(k<<3)>>3];s=j>2]|0);s=e+(g<<2)|0;zt(c[k>>2]|0,0,o,c[s>>2]|0);zt(c[s>>2]|0,0,o,p);h[f+(g<<3)>>3]=+h[a>>3];h[a>>3]=j;i=b}l6(p);l6(q);return (d|0)<=(r|0)|0}function vt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0.0;f=0.0;e=1-b+c|0;d=d+(b<<3)|0;c=a+(b<<3)|0;while(1){if(!e)break;f=f+ +h[c>>3]*+h[d>>3];e=e+-1|0;d=d+8|0;c=c+8|0}return +f}function wt(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;var f=0;f=1-b+c|0;e=e+(b<<3)|0;c=a+(b<<3)|0;while(1){if(!f)break;h[c>>3]=+h[c>>3]+ +h[e>>3]*d;f=f+-1|0;e=e+8|0;c=c+8|0}return}function xt(a,b,c){a=a|0;b=b|0;c=c|0;return +(+G(+(+vt(a,b,c,a))))}function yt(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;var f=0;f=1-b+c|0;e=e+(b<<3)|0;c=a+(b<<3)|0;while(1){if(!f)break;h[c>>3]=+h[e>>3]*d;f=f+-1|0;e=e+8|0;c=c+8|0}return}function zt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=1-b+c|0;d=d+(b<<3)|0;c=a+(b<<3)|0;while(1){if(!e)break;h[c>>3]=+h[d>>3];e=e+-1|0;d=d+8|0;c=c+8|0}return}function At(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0,k=0;j=0;while(1){if((j|0)>=(b|0))break;k=a+(j<<2)|0;g=0.0;i=0;while(1){if((i|0)>=(d|0))break;g=g+ +h[(c[k>>2]|0)+(i<<3)>>3]*+h[e+(i<<3)>>3];i=i+1|0}h[f+(j<<3)>>3]=g;j=j+1|0}return}function Bt(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0;k=c[i>>2]|0;l=d<<2;j=S(l,f)|0;if(!k){j=k6(j)|0;o=k6(l)|0}else{j=n6(c[k>>2]|0,j)|0;o=n6(k,l)|0}c[i>>2]=o;k=0;while(1){if((k|0)>=(d|0)){l=0;break}c[o+(k<<2)>>2]=j;k=k+1|0;j=j+(f<<2)|0}while(1){if((l|0)>=(d|0))break;i=a+(l<<2)|0;n=o+(l<<2)|0;k=0;while(1){if((k|0)<(f|0)){j=0;m=0.0}else break;while(1){if((j|0)>=(e|0))break;p=m+ +h[(c[i>>2]|0)+(j<<3)>>3]*+g[(c[b+(j<<2)>>2]|0)+(k<<2)>>2];j=j+1|0;m=p}g[(c[n>>2]|0)+(k<<2)>>2]=m;k=k+1|0}l=l+1|0}return}function Ct(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0.0,m=0,n=0,o=0;k=c[i>>2]|0;j=S(d<<3,f)|0;if(!k){j=k6(j)|0;o=k6(d<<2)|0}else{j=n6(c[k>>2]|0,j)|0;o=n6(k,d<<2)|0}c[i>>2]=o;k=0;while(1){if((k|0)>=(d|0)){i=0;break}c[o+(k<<2)>>2]=j;k=k+1|0;j=j+(f<<3)|0}while(1){if((i|0)>=(d|0))break;m=a+(i<<2)|0;n=o+(i<<2)|0;k=0;while(1){if((k|0)<(f|0)){l=0.0;j=0}else break;while(1){if((j|0)>=(e|0))break;l=l+ +h[(c[m>>2]|0)+(j<<3)>>3]*+g[(c[b+(j<<2)>>2]|0)+(k<<2)>>2];j=j+1|0}h[(c[n>>2]|0)+(k<<3)>>3]=l;k=k+1|0}i=i+1|0}return}function Dt(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0;j=c[f>>2]|0;i=S(d*20|0,e)|0;if(!j){i=k6(i)|0;q=k6(d<<2)|0}else{i=n6(c[j>>2]|0,i)|0;q=n6(j,d<<2)|0}c[f>>2]=q;j=0;while(1){if((j|0)>=(d|0)){f=0;break}c[q+(j<<2)>>2]=i;j=j+1|0;i=i+(e<<2)|0}while(1){if((f|0)>=(d|0))break;l=c[a+(f*20|0)+4>>2]|0;m=c[a+(f*20|0)+8>>2]|0;n=c[a+(f*20|0)>>2]|0;o=q+(f<<2)|0;i=0;while(1){if((i|0)>=(e|0))break;p=b+(i<<2)|0;k=0.0;j=0;while(1){if((j|0)>=(n|0))break;k=k+ +g[m+(j<<2)>>2]*+h[(c[p>>2]|0)+(c[l+(j<<2)>>2]<<3)>>3];j=j+1|0}g[(c[o>>2]|0)+(i<<2)>>2]=k;i=i+1|0}f=f+1|0}return}function Et(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0;c=0.0;d=b;e=a;while(1){if(!e)break;c=c+ +h[d>>3];d=d+8|0;e=e+-1|0}c=c/+(a|0);while(1){if(!a)break;h[b>>3]=+h[b>>3]-c;b=b+8|0;a=a+-1|0}return}function Ft(a,b){a=a|0;b=b|0;var c=0;c=0;while(1){if((c|0)>=(a|0))break;h[b+(c<<3)>>3]=+((U4()|0)%500|0|0);c=c+1|0}Et(a,b);return}function Gt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,i=0,j=0,k=0,l=0,m=0;j=0;while(1){if((j|0)>=(b|0))break;k=c[a+(j*20|0)>>2]|0;l=a+(j*20|0)+8|0;m=a+(j*20|0)+4|0;f=0.0;i=0;while(1){if((i|0)>=(k|0))break;f=f+ +g[(c[l>>2]|0)+(i<<2)>>2]*+h[d+(c[(c[m>>2]|0)+(i<<2)>>2]<<3)>>3];i=i+1|0}h[e+(j<<3)>>3]=f;j=j+1|0}return}function Ht(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,i=0,j=0,k=0;j=0;while(1){if((j|0)>=(b|0))break;k=a+(j<<2)|0;f=0.0;i=0;while(1){if((i|0)==(b|0))break;f=f+ +g[(c[k>>2]|0)+(i<<2)>>2]*+h[d+(i<<3)>>3];i=i+1|0}h[e+(j<<3)>>3]=f;j=j+1|0}return}function It(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;h[d+(e<<3)>>3]=+h[b+(e<<3)>>3]-+h[c+(e<<3)>>3];e=e+1|0}return}function Jt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;h[d+(e<<3)>>3]=+h[b+(e<<3)>>3]+ +h[c+(e<<3)>>3];e=e+1|0}return}function Kt(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;h[d+(e<<3)>>3]=+h[b+(e<<3)>>3]*c;e=e+1|0}return}function Lt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=0;while(1){if((d|0)>=(a|0))break;h[c+(d<<3)>>3]=+h[b+(d<<3)>>3];d=d+1|0}return}function Mt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0;d=0.0;e=0;while(1){if((e|0)>=(a|0))break;d=d+ +h[b+(e<<3)>>3]*+h[c+(e<<3)>>3];e=e+1|0}return +d}function Nt(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0;c=0;d=-1.e+50;while(1){if((c|0)>=(a|0))break;e=+F(+(+h[b+(c<<3)>>3]));c=c+1|0;d=e>d?e:d}return +d}function Ot(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0;j=0;while(1){if((j|0)<(b|0)){g=0.0;i=0}else break;while(1){if((i|0)>=(d|0))break;g=g+ +h[(c[a+(i<<2)>>2]|0)+(j<<3)>>3]*+h[e+(i<<3)>>3];i=i+1|0}h[f+(j<<3)>>3]=g;j=j+1|0}return}function Pt(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0;c=0.0;d=b;e=a;while(1){if(!e)break;c=c+ +g[d>>2];d=d+4|0;e=e+-1|0}c=c/+(a|0);while(1){if(!a)break;g[b>>2]=+g[b>>2]-c;b=b+4|0;a=a+-1|0}return}function Qt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0,p=0.0;e=0;while(1){if((e|0)>=(b|0)){h=0;j=0;m=b;break}g[d+(e<<2)>>2]=0.0;e=e+1|0}while(1){if((j|0)>=(b|0))break;l=+g[c+(j<<2)>>2];k=j+1|0;f=l*+g[a+(h<<2)>>2]+0.0;i=k;e=h;while(1){e=e+1|0;if((i|0)==(b|0))break;p=+g[a+(e<<2)>>2];n=f+p*+g[c+(i<<2)>>2];o=d+(i<<2)|0;g[o>>2]=l*p+ +g[o>>2];f=n;i=i+1|0}o=d+(j<<2)|0;g[o>>2]=f+ +g[o>>2];h=h+m|0;j=k;m=m+-1|0}return}function Rt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;g[d+(e<<2)>>2]=+g[b+(e<<2)>>2]-+g[c+(e<<2)>>2];e=e+1|0}return}function St(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;g[d+(e<<2)>>2]=+g[b+(e<<2)>>2]+ +g[c+(e<<2)>>2];e=e+1|0}return}function Tt(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0,f=0;e=0;while(1){if((e|0)>=(a|0))break;f=b+(e<<2)|0;g[f>>2]=+g[f>>2]+ +g[d+(e<<2)>>2]*c;e=e+1|0}return}function Ut(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;g[d+(e<<2)>>2]=+g[b+(e<<2)>>2]*c;e=e+1|0}return}function Vt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;c[d+(e<<2)>>2]=c[b+(e<<2)>>2];e=e+1|0}return}function Wt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0;d=0.0;e=0;while(1){if((e|0)>=(a|0))break;d=d+ +g[b+(e<<2)>>2]*+g[c+(e<<2)>>2];e=e+1|0}return +d}function Xt(a,b,c){a=a|0;b=+b;c=c|0;var d=0;d=0;while(1){if((d|0)>=(a|0))break;h[c+(d<<3)>>3]=b;d=d+1|0}return}function Yt(a,b,c){a=a|0;b=+b;c=c|0;var d=0;d=0;while(1){if((d|0)>=(a|0))break;g[c+(d<<2)>>2]=b;d=d+1|0}return}function Zt(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0.0;c=-1000000015047466219876688.0e6;d=0;while(1){if((d|0)>=(a|0))break;e=+F(+(+g[b+(d<<2)>>2]));c=e>c?e:c;d=d+1|0}return +c}function _t(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;c=0;while(1){if((c|0)>=(a|0))break;d=b+(c<<2)|0;e=+g[d>>2];g[d>>2]=e*e;c=c+1|0}return}function $t(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;c=0;while(1){if((c|0)>=(a|0))break;d=b+(c<<2)|0;e=+g[d>>2];if(e!=0.0)g[d>>2]=1.0/e;c=c+1|0}return}function au(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0;d=0;while(1){if((d|0)>=(a|0))break;e=+g[b+(d<<2)>>2];if(e>=0.0)g[c+(d<<2)>>2]=+G(+e);d=d+1|0}return}function bu(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;c=0;while(1){if((c|0)>=(a|0))break;d=b+(c<<2)|0;e=+g[d>>2];if(e>0.0)g[d>>2]=1.0/+G(+e);c=c+1|0}return}function cu(a,b){a=a|0;b=b|0;var d=0;c[a>>2]=0;if(b&3)if(!(4%(b>>>0)|0))b=4;else b=S(4/((du(b)|0)>>>0)|0,b)|0;c[a+8>>2]=b;a=a+4|0;b=c[a>>2]|0;a:do if(b|0)while(1){if(!b)break a;d=c[b>>2]|0;l6(c[b+4>>2]|0);l6(b);b=d}while(0);c[a>>2]=0;return}function du(a){a=a|0;var b=0,c=0;c=4;a:while(1){b=c;while(1){if((b|0)==(a|0))break a;if((b|0)<=(a|0))break;b=b-a|0}c=b;a=a-b|0}return a|0}function eu(a){a=a|0;var b=0,d=0,e=0,f=0;b=c[a>>2]|0;if(!b){d=c[a+8>>2]|0;e=IK(8)|0;f=IK(S(c[46897]|0,d)|0)|0;c[e+4>>2]=f;b=0;while(1){if((b|0)>=(c[46897]|0))break;fu(f+(S(b,d)|0)|0,a);b=b+1|0}b=a+4|0;c[e>>2]=c[b>>2];c[b>>2]=e;b=c[a>>2]|0}c[a>>2]=c[b>>2];return b|0}function fu(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[b>>2]=a;return}function gu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0;m=HK(b<<3)|0;l=a+8|0;f=c[l>>2]|0;hu(a,b,m);Ft(b,d);h=0;i=0;while(1){if((i|0)>=(b|0))break;h=(c[a+(i*20|0)>>2]|0)+h|0;i=i+1|0}h=IK(h<<2)|0;j=0;while(1){if((j|0)>=(b|0))break;c[a+(j*20|0)+8>>2]=h;k=c[a+(j*20|0)>>2]|0;g[h>>2]=+(1-k|0);i=1;while(1){if((i|0)>=(k|0))break;g[h+(i<<2)>>2]=1.0;i=i+1|0}h=h+(k<<2)|0;j=j+1|0}i=vr(a,d,m,b,.001,e)|0;l6(c[l>>2]|0);h=0;while(1){if((h|0)>=(b|0))break;c[a+(h*20|0)+8>>2]=f;f=f+(c[a+(h*20|0)>>2]<<2)|0;h=h+1|0}l6(m);return i>>>31|0}function hu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,i=0,j=0,k=0,l=0,m=0;k=a+16|0;i=0;while(1){if((i|0)>=(b|0))break;if(c[k>>2]|0){l=c[a+(i*20|0)>>2]|0;m=a+(i*20|0)+8|0;j=a+(i*20|0)+16|0;e=0.0;f=1;while(1){if((f|0)>=(l|0))break;e=e+ +g[(c[m>>2]|0)+(f<<2)>>2]*+g[(c[j>>2]|0)+(f<<2)>>2];f=f+1|0}h[d+(i<<3)>>3]=e}i=i+1|0}return}function iu(a,b,d,e,f,g,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=i|0;j=j|0;a=l;l=l+16|0;if(!(c[46955]|0)){c[46955]=1;dA(1,94121,a)|0}l=a;return}function ju(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;r=IK(f<<2)|0;i=b<<3;g=0;while(1){if((g|0)>=(f|0))break;c[r+(g<<2)>>2]=IK(i)|0;g=g+1|0}p=IK(f<<3)|0;q=IK(b<<2)|0;g=IK(S(i,b)|0)|0;i=0;while(1){if((i|0)>=(b|0))break;c[q+(i<<2)>>2]=g;g=g+(b<<3)|0;i=i+1|0}k=0;o=1;while(1){if((k|0)>=(b|0))break;l=a+(k<<2)|0;m=q+(k<<2)|0;i=0;while(1){if((i|0)==(o|0))break;n=a+(i<<2)|0;g=0;j=0.0;while(1){if((g|0)>=(d|0))break;s=j+ +(S(c[(c[n>>2]|0)+(g<<2)>>2]|0,c[(c[l>>2]|0)+(g<<2)>>2]|0)|0);g=g+1|0;j=s}h[(c[q+(i<<2)>>2]|0)+(k<<3)>>3]=j;h[(c[m>>2]|0)+(i<<3)>>3]=j;i=i+1|0}k=k+1|0;o=o+1|0}ut(q,b,f,r,p,1)|0;i=0;while(1){if((i|0)>=(f|0)){g=0;break}l=r+(i<<2)|0;m=e+(i<<2)|0;k=0;while(1){if((k|0)<(d|0)){g=0;j=0.0}else break;while(1){if((g|0)>=(b|0))break;s=j+ +(c[(c[a+(g<<2)>>2]|0)+(k<<2)>>2]|0)*+h[(c[l>>2]|0)+(g<<3)>>3];g=g+1|0;j=s}h[(c[m>>2]|0)+(k<<3)>>3]=j;k=k+1|0}i=i+1|0}while(1){if((g|0)>=(f|0))break;l6(c[r+(g<<2)>>2]|0);g=g+1|0}l6(r);l6(p);l6(c[q>>2]|0);l6(q);return}function ku(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=l;l=l+32|0;g=f+16|0;j=f+20|0;i=f+12|0;h=f+8|0;c[g>>2]=e;c[i>>2]=0;c[h>>2]=0;fy(c[a>>2]|0,d,d<<2,j);Dt(c[j>>2]|0,a,d,b,i);Ct(a,c[i>>2]|0,b,d,b,h);l6(c[c[i>>2]>>2]|0);l6(c[i>>2]|0);e=(ut(c[h>>2]|0,b,1,g,f,1)|0)&255;l=f;return e|0}function lu(){c[46956]=0;l6(c[46957]|0);l6(c[46958]|0);l6(c[46959]|0);c[46957]=0;c[46958]=0;c[46959]=0;return}function mu(a){a=a|0;l6(c[a+36>>2]|0);return}function nu(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0.0;u=l;l=l+80|0;o=u+64|0;t=u+68|0;i=u+48|0;j=u+32|0;k=u+16|0;m=u;n=d+16|0;g=c[n>>2]|0;p=b+40|0;r=f;s=e;a:do if(!(c[g+212>>2]|0))switch(UM(d)|0){case 1:{g=c[n>>2]|0;i=c[g+12>>2]|0;j=c[i+8>>2]|0;c[t>>2]=j;g=c[c[g+8>>2]>>2]|0;k=i+44|0;switch(a[g>>0]|0){case 98:{if(!(f2(g,108537)|0))q=11;else q=8;break}case 112:{if((f2(g,106022)|0)==0?(ou(c[k>>2]|0,j)|0)!=0:0)q=11;else q=8;break}default:q=8}do if((q|0)==8)if((j|0)<3){c[p>>2]=(c[i>>2]|0)==0?0:2;q=16;break}else{c[p>>2]=0;break}else if((q|0)==11?(c[p>>2]=1,(j|0)<=2):0)q=16;while(0);if((q|0)==16){i=pu(d,t,e,f)|0;q=20;break a}i=IK(j<<4)|0;if((c[p>>2]|0)==1){q=c[k>>2]|0;h[i>>3]=s+ +h[q>>3]/72.0;h[i+8>>3]=r+ +h[q+8>>3]/72.0;h[i+16>>3]=+h[q+16>>3]/72.0-s;h[i+24>>3]=r+ +h[q+24>>3]/72.0;h[i+32>>3]=+h[q+32>>3]/72.0-s;h[i+40>>3]=+h[q+40>>3]/72.0-r;h[i+48>>3]=s+ +h[q+48>>3]/72.0;h[i+56>>3]=+h[q+56>>3]/72.0-r;q=20;break a}else g=0;while(1){if((g|0)>=(j|0)){q=20;break a}q=c[k>>2]|0;v=+h[q+(g<<4)>>3];e=+h[q+(g<<4)+8>>3];f=+G(+(v*v+e*e));h[i+(g<<4)>>3]=v*(s/f+1.0)/72.0;h[i+(g<<4)+8>>3]=e*(r/f+1.0)/72.0;g=g+1|0}}case 2:{c[t>>2]=4;q=IK(64)|0;d=c[(c[n>>2]|0)+12>>2]|0;w=+h[d+32>>3];s=+h[d+40>>3];o=~~+h[d+16>>3];d=~~+h[d+24>>3];v=-e;r=-f;qu(i,o,d,v,r);c[q>>2]=c[i>>2];c[q+4>>2]=c[i+4>>2];c[q+8>>2]=c[i+8>>2];c[q+12>>2]=c[i+12>>2];i=q+16|0;n=~~w;qu(j,n,d,e,r);c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];i=q+32|0;d=~~s;qu(k,n,d,e,f);c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=q+48|0;qu(m,o,d,v,f);c[i>>2]=c[m>>2];c[i+4>>2]=c[m+4>>2];c[i+8>>2]=c[m+8>>2];c[i+12>>2]=c[m+12>>2];c[p>>2]=1;i=q;q=20;break a}case 3:{c[p>>2]=2;i=pu(d,t,e,f)|0;q=20;break a}default:{c[o>>2]=c[c[(c[n>>2]|0)+8>>2]>>2];dA(1,94184,o)|0;g=1;break a}}else{c[t>>2]=4;v=s+ +h[g+32>>3]*.5;w=r+ +h[g+40>>3]*.5;c[p>>2]=1;i=IK(64)|0;h[i>>3]=v;h[i+8>>3]=w;s=-v;h[i+16>>3]=s;h[i+24>>3]=w;h[i+32>>3]=s;w=-w;h[i+40>>3]=w;h[i+48>>3]=v;h[i+56>>3]=w;q=20}while(0);if((q|0)==20){c[b+36>>2]=i;g=c[t>>2]|0;c[b+32>>2]=g;ru(i,g,b,b+16|0);if((g|0)>(c[46956]|0)){c[46956]=g;g=0}else g=0}l=u;return g|0}function ou(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0,f=0.0,g=0,i=0;do if((b|0)==4){e=+h[a+8>>3];f=+h[a+24>>3];g=a+56|0;i=a+48|0;b=a+16|0;c=a+32|0;d=a+40|0;if(e==f){if(!(+h[d>>3]==+h[g>>3])){b=0;break}if(!(+h[a>>3]==+h[i>>3])){b=0;break}b=+h[b>>3]==+h[c>>3];break}if((+h[a>>3]==+h[b>>3]?+h[c>>3]==+h[i>>3]:0)?e==+h[g>>3]:0)b=f==+h[d>>3];else b=0}else b=0;while(0);return b&1|0}function pu(a,b,d,e){a=a|0;b=b|0;d=+d;e=+e;var f=0,g=0.0,i=0,j=0,k=0,l=0.0;f=NA(a,103006)|0;if(!f)f=0;else f=d6(f)|0;i=(f|0)<3?20:f;j=IK(i<<4)|0;a=a+16|0;g=+(i|0);f=0;while(1){if((f|0)>=(i|0))break;k=c[a>>2]|0;l=+(f|0)/g*3.141592653589793*2.0;h[j+(f<<4)>>3]=+I(+l)*(d+ +h[k+32>>3]*.5);h[j+(f<<4)+8>>3]=+J(+l)*(e+ +h[k+40>>3]*.5);f=f+1|0}c[b>>2]=i;return j|0}function qu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=+e;h[a>>3]=+(b|0)/72.0+d;h[a+8>>3]=+(c|0)/72.0+e;return}function ru(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0,l=0.0,m=0.0;j=+h[a>>3];i=+h[a+8>>3];e=1;f=i;g=j;while(1){if((e|0)>=(b|0))break;k=a+16|0;l=+h[k>>3];m=+h[a+24>>3];e=e+1|0;f=m>f?m:f;g=l>g?l:g;i=m>3]=j;h[c+8>>3]=i;h[d>>3]=g;h[d+8>>3]=f;return}function su(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;s=l;l=l+80|0;n=s+64|0;q=s+68|0;i=s+48|0;j=s+32|0;k=s+16|0;m=s;o=d+16|0;g=c[o>>2]|0;p=b+40|0;a:do if(!(c[g+212>>2]|0))switch(UM(d)|0){case 1:{m=c[(c[o>>2]|0)+12>>2]|0;n=m+8|0;k=c[n>>2]|0;c[q>>2]=k;b:do if((k|0)>2){i=IK(k<<4)|0;j=m+44|0;g=0;while(1){if((g|0)>=(k|0))break b;d=c[j>>2]|0;h[i+(g<<4)>>3]=+h[d+(g<<4)>>3]/72.0;h[i+(g<<4)+8>>3]=+h[d+(g<<4)+8>>3]/72.0;g=g+1|0}}else i=pu(d,q,0.0,0.0)|0;while(0);g=c[c[(c[o>>2]|0)+8>>2]>>2]|0;switch(a[g>>0]|0){case 98:{if(!(f2(g,108537)|0))g=1;else r=13;break}case 112:{if((f2(g,106022)|0)==0?(ou(i,c[q>>2]|0)|0)!=0:0)g=1;else r=13;break}default:r=13}do if((r|0)==13){if((c[n>>2]|0)<3?c[m>>2]|0:0){g=2;break}g=0}while(0);c[p>>2]=g;r=20;break a}case 2:{c[q>>2]=4;r=IK(64)|0;o=c[(c[o>>2]|0)+12>>2]|0;u=+h[o+16>>3];w=+h[o+24>>3];v=+h[o+32>>3];t=+h[o+40>>3];tu(i,u,w);c[r>>2]=c[i>>2];c[r+4>>2]=c[i+4>>2];c[r+8>>2]=c[i+8>>2];c[r+12>>2]=c[i+12>>2];i=r+16|0;tu(j,v,w);c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];i=r+32|0;tu(k,v,t);c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=r+48|0;tu(m,u,t);c[i>>2]=c[m>>2];c[i+4>>2]=c[m+4>>2];c[i+8>>2]=c[m+8>>2];c[i+12>>2]=c[m+12>>2];c[p>>2]=1;i=r;r=20;break a}case 3:{c[p>>2]=2;i=pu(d,q,0.0,0.0)|0;r=20;break a}default:{c[n>>2]=c[c[(c[o>>2]|0)+8>>2]>>2];dA(1,94220,n)|0;g=1;break a}}else{c[q>>2]=4;v=+h[g+32>>3]*.5;w=+h[g+40>>3]*.5;c[p>>2]=1;i=IK(64)|0;h[i>>3]=v;h[i+8>>3]=w;u=-v;h[i+16>>3]=u;h[i+24>>3]=w;h[i+32>>3]=u;w=-w;h[i+40>>3]=w;h[i+48>>3]=v;h[i+56>>3]=w;r=20}while(0);if((r|0)==20){g=c[q>>2]|0;if(e!=1.0|f!=1.0)uu(i,g,e,f);c[b+36>>2]=i;c[b+32>>2]=g;ru(i,g,b,b+16|0);if((g|0)>(c[46956]|0)){c[46956]=g;g=0}else g=0}l=s;return g|0}function tu(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b/72.0;h[a+8>>3]=c/72.0;return}function uu(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;var e=0,f=0;e=0;while(1){if((e|0)>=(b|0))break;h[a>>3]=c*+h[a>>3];f=a+8|0;h[f>>3]=d*+h[f>>3];a=a+16|0;e=e+1|0}return}function vu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0;s=l;l=l+128|0;p=s+112|0;o=s+96|0;n=s+80|0;g=s+64|0;q=s+48|0;r=s+32|0;k=s+16|0;m=s;c[o>>2]=c[a>>2];c[o+4>>2]=c[a+4>>2];c[o+8>>2]=c[a+8>>2];c[o+12>>2]=c[a+12>>2];c[p>>2]=c[b>>2];c[p+4>>2]=c[b+4>>2];c[p+8>>2]=c[b+8>>2];c[p+12>>2]=c[b+12>>2];ts(q,o,p);i=b+16|0;c[o>>2]=c[a>>2];c[o+4>>2]=c[a+4>>2];c[o+8>>2]=c[a+8>>2];c[o+12>>2]=c[a+12>>2];c[p>>2]=c[i>>2];c[p+4>>2]=c[i+4>>2];c[p+8>>2]=c[i+8>>2];c[p+12>>2]=c[i+12>>2];ts(r,o,p);c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];c[p>>2]=c[e>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];c[p+12>>2]=c[e+12>>2];ts(k,o,p);j=e+16|0;c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];c[p>>2]=c[j>>2];c[p+4>>2]=c[j+4>>2];c[p+8>>2]=c[j+8>>2];c[p+12>>2]=c[j+12>>2];ts(m,o,p);c[g>>2]=c[q>>2];c[g+4>>2]=c[q+4>>2];c[g+8>>2]=c[q+8>>2];c[g+12>>2]=c[q+12>>2];c[n>>2]=c[r>>2];c[n+4>>2]=c[r+4>>2];c[n+8>>2]=c[r+8>>2];c[n+12>>2]=c[r+12>>2];c[o>>2]=c[k>>2];c[o+4>>2]=c[k+4>>2];c[o+8>>2]=c[k+8>>2];c[o+12>>2]=c[k+12>>2];c[p>>2]=c[m>>2];c[p+4>>2]=c[m+4>>2];c[p+8>>2]=c[m+8>>2];c[p+12>>2]=c[m+12>>2];do if(wu(g,n,o,p)|0){f=c[b+40>>2]|0;g=e+40|0;if(f&1|0?c[g>>2]&1|0:0){f=1;break}if(f&2|0?c[g>>2]&2|0:0){t=+h[i>>3]-+h[b>>3]+ +h[j>>3]-+h[e>>3];v=+h[a>>3]-+h[d>>3];u=+h[a+8>>3]-+h[d+8>>3];f=!(v*v+u*u>t*t*.25);break}f=c[46957]|0;if(!f){c[46957]=IK(c[46956]<<4)|0;i=IK(c[46956]<<4)|0;c[46958]=i;f=c[46957]|0}else i=c[46958]|0;w=c[b+36>>2]|0;j=b+32|0;g=c[j>>2]|0;c[p>>2]=c[a>>2];c[p+4>>2]=c[a+4>>2];c[p+8>>2]=c[a+8>>2];c[p+12>>2]=c[a+12>>2];xu(w,g,p,f);a=c[e+36>>2]|0;g=e+32|0;e=c[g>>2]|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];xu(a,e,p,i);if(!(yu(c[46957]|0,i,c[j>>2]|0,c[g>>2]|0)|0)){f=c[46957]|0;c[n>>2]=c[f>>2];c[n+4>>2]=c[f+4>>2];c[n+8>>2]=c[f+8>>2];c[n+12>>2]=c[f+12>>2];c[o>>2]=c[k>>2];c[o+4>>2]=c[k+4>>2];c[o+8>>2]=c[k+8>>2];c[o+12>>2]=c[k+12>>2];c[p>>2]=c[m>>2];c[p+4>>2]=c[m+4>>2];c[p+8>>2]=c[m+8>>2];c[p+12>>2]=c[m+12>>2];if(zu(n,o,p)|0?(m=c[46958]|0,w=c[g>>2]|0,c[p>>2]=c[f>>2],c[p+4>>2]=c[f+4>>2],c[p+8>>2]=c[f+8>>2],c[p+12>>2]=c[f+12>>2],Au(m,w,p)|0):0){f=1;break}f=c[46958]|0;c[n>>2]=c[f>>2];c[n+4>>2]=c[f+4>>2];c[n+8>>2]=c[f+8>>2];c[n+12>>2]=c[f+12>>2];c[o>>2]=c[q>>2];c[o+4>>2]=c[q+4>>2];c[o+8>>2]=c[q+8>>2];c[o+12>>2]=c[q+12>>2];c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];if(!(zu(n,o,p)|0))f=0;else{r=c[46957]|0;w=c[j>>2]|0;c[p>>2]=c[f>>2];c[p+4>>2]=c[f+4>>2];c[p+8>>2]=c[f+8>>2];c[p+12>>2]=c[f+12>>2];f=(Au(r,w,p)|0)!=0}}else f=1}else f=0;while(0);l=s;return f&1|0}function wu(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((+h[a>>3]<=+h[d>>3]?+h[c>>3]<=+h[b>>3]:0)?+h[a+8>>3]<=+h[d+8>>3]:0)a=+h[c+8>>3]<=+h[b+8>>3];else a=0;return a&1|0}function xu(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=c+8|0;e=0;while(1){if((e|0)>=(b|0))break;h[d>>3]=+h[a>>3]+ +h[c>>3];h[d+8>>3]=+h[a+8>>3]+ +h[f>>3];e=e+1|0;a=a+16|0;d=d+16|0}return}function yu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=l;l=l+112|0;w=E+96|0;v=E+80|0;u=E+64|0;t=E+48|0;y=E+32|0;z=E+16|0;A=E;B=d+-1|0;C=e+-1|0;D=d<<1;x=e<<1;i=0;h=0;g=0;f=0;while(1){q=a+(i<<4)|0;p=a+(((B+i|0)%(d|0)|0)<<4)|0;c[v>>2]=c[q>>2];c[v+4>>2]=c[q+4>>2];c[v+8>>2]=c[q+8>>2];c[v+12>>2]=c[q+12>>2];c[w>>2]=c[p>>2];c[w+4>>2]=c[p+4>>2];c[w+8>>2]=c[p+8>>2];c[w+12>>2]=c[p+12>>2];ss(y,v,w);s=b+(h<<4)|0;r=b+(((C+h|0)%(e|0)|0)<<4)|0;c[v>>2]=c[s>>2];c[v+4>>2]=c[s+4>>2];c[v+8>>2]=c[s+8>>2];c[v+12>>2]=c[s+12>>2];c[w>>2]=c[r>>2];c[w+4>>2]=c[r+4>>2];c[w+8>>2]=c[r+8>>2];c[w+12>>2]=c[r+12>>2];ss(z,v,w);c[u>>2]=c[46578];c[u+4>>2]=c[46579];c[u+8>>2]=c[46580];c[u+12>>2]=c[46581];c[v>>2]=c[y>>2];c[v+4>>2]=c[y+4>>2];c[v+8>>2]=c[y+8>>2];c[v+12>>2]=c[y+12>>2];c[w>>2]=c[z>>2];c[w+4>>2]=c[z+4>>2];c[w+8>>2]=c[z+8>>2];c[w+12>>2]=c[z+12>>2];j=+us(u,v,w);c[u>>2]=c[p>>2];c[u+4>>2]=c[p+4>>2];c[u+8>>2]=c[p+8>>2];c[u+12>>2]=c[p+12>>2];c[v>>2]=c[q>>2];c[v+4>>2]=c[q+4>>2];c[v+8>>2]=c[q+8>>2];c[v+12>>2]=c[q+12>>2];c[w>>2]=c[s>>2];c[w+4>>2]=c[s+4>>2];c[w+8>>2]=c[s+8>>2];c[w+12>>2]=c[s+12>>2];k=vs(u,v,w)|0;c[u>>2]=c[r>>2];c[u+4>>2]=c[r+4>>2];c[u+8>>2]=c[r+8>>2];c[u+12>>2]=c[r+12>>2];c[v>>2]=c[s>>2];c[v+4>>2]=c[s+4>>2];c[v+8>>2]=c[s+8>>2];c[v+12>>2]=c[s+12>>2];c[w>>2]=c[q>>2];c[w+4>>2]=c[q+4>>2];c[w+8>>2]=c[q+8>>2];c[w+12>>2]=c[q+12>>2];m=vs(u,v,w)|0;c[t>>2]=c[p>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[t+12>>2]=c[p+12>>2];c[u>>2]=c[q>>2];c[u+4>>2]=c[q+4>>2];c[u+8>>2]=c[q+8>>2];c[u+12>>2]=c[q+12>>2];c[v>>2]=c[r>>2];c[v+4>>2]=c[r+4>>2];c[v+8>>2]=c[r+8>>2];c[v+12>>2]=c[r+12>>2];c[w>>2]=c[s>>2];c[w+4>>2]=c[s+4>>2];c[w+8>>2]=c[s+8>>2];c[w+12>>2]=c[s+12>>2];if(ws(t,u,v,w,A)|0){f=1;break}q=(k|0)==0;r=(m|0)==0;n=(i+1|0)%(d|0)|0;s=f+1|0;o=(h+1|0)%(e|0)|0;p=g+1|0;do if(j!=0.0|(m|k|0)!=0)if(!(j>=0.0)){i=r?n:i;h=r?h:o;g=r?p:g;f=r?f:s;break}else{i=q?i:n;h=q?o:h;g=q?g:p;f=q?s:f;break}else{i=n;g=p}while(0);if(!((f|0)<(x|0)&((g|0)<(D|0)&((f|0)<(e|0)|(g|0)<(d|0))))){f=0;break}}l=E;return f|0}function zu(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0;e=+h[a>>3];if((e<=+h[c>>3]?e>=+h[b>>3]:0)?(d=+h[a+8>>3],d<=+h[c+8>>3]):0)a=d>=+h[b+8>>3];else a=0;return a&1|0}function Au(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0.0,k=0.0,l=0,m=0,n=0;e=c[46959]|0;if(!e){e=IK(c[46956]<<4)|0;c[46959]=e}i=d+8|0;g=0;while(1){if((g|0)>=(b|0))break;h[e+(g<<4)>>3]=+h[a+(g<<4)>>3]-+h[d>>3];h[e+(g<<4)+8>>3]=+h[a+(g<<4)+8>>3]-+h[i>>3];g=g+1|0}m=b+-1|0;f=0.0;l=0;a:while(1){if((l|0)>=(b|0)){n=18;break}d=(m+l|0)%(b|0)|0;j=+h[e+(l<<4)+8>>3];a=j==0.0;g=e+(l<<4)|0;i=e+(d<<4)|0;k=+h[e+(d<<4)+8>>3];d=k==0.0;do if(a&d){if(+h[g>>3]*+h[i>>3]<0.0){e=1;break a}}else{if(!(j>=0.0)|!(k<=0.0)?!(j<=0.0)|!(k>=0.0):0)break;j=(k*+h[g>>3]-j*+h[i>>3])/(k-j);if(j==0.0){e=1;break a}if(j>0.0)if(a|d){f=f+.5;break}else{f=f+1.0;break}}while(0);l=l+1|0}if((n|0)==18)e=((~~f|0)%2|0|0)==1&1;return e|0}function Bu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=IK(b<<2)|0;i=S(b,b)|0;d=IK(i<<2)|0;c[j>>2]=d;Yt(i,0.0,d);d=1;while(1){if((d|0)>=(b|0)){d=0;g=0;i=b;break}c[j+(d<<2)>>2]=(c[j>>2]|0)+((S(d,b)|0)<<2);d=d+1|0}while(1){if((g|0)>=(b|0))break;h=j+(g<<2)|0;e=g;f=d;while(1){if((e|0)==(b|0))break;k=c[a+(f<<2)>>2]|0;c[(c[h>>2]|0)+(e<<2)>>2]=k;c[(c[j+(e<<2)>>2]|0)+(g<<2)>>2]=k;e=e+1|0;f=f+1|0}d=d+i|0;g=g+1|0;i=i+-1|0}return j|0}function Cu(a,b,d,e,f,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=+j;var k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;N=c[d+(f<<2)>>2]|0;C=c[a+4>>2]|0;D=c[a>>2]|0;E=c[a+48>>2]|0;G=c[a+52>>2]|0;H=c[a+56>>2]|0;a:do if((h|0)<1)d=0;else{Eu(N,C,E,G,H,j);I=c[a+28>>2]|0;J=c[a+32>>2]|0;K=c[a+36>>2]|0;L=c[a+12>>2]|0;M=c[a+16>>2]|0;f=0;e=0;d=-1;while(1){if((f|0)>=(C|0))break;if((f|0)>=(e|0)){d=d+1|0;if((d|0)==(H|0)){e=C;d=H}else e=c[G+(d<<2)>>2]|0}c[M+(c[E+(f<<2)>>2]<<2)>>2]=d;f=f+1|0}A=c[a+40>>2]|0;B=J+(C+-1<<2)|0;d=0;e=0;while(1){if(e<<24>>24==0&(d|0)<(h|0)){k=-1.0e9;f=0;e=1}else break a;b:while(1){y=f;while(1){if((y|0)>=(C|0))break b;f=c[E+(y<<2)>>2]|0;z=+g[N+(f<<2)>>2];o=z;x=y;l=0.0;while(1){g[A+(f<<2)>>2]=l;f=x+1|0;w=E+(f<<2)|0;if((f|0)>=(C|0)){v=0;break}l=(c[M+(f<<2)>>2]|0)>(c[M+(x<<2)>>2]|0)?o+j:o;a=c[w>>2]|0;m=+g[N+(a<<2)>>2];if(+F(+(m-l))>1.0e-09){v=1;break}o=l;x=f;l=m-z;f=a}n=y;while(1){if((n|0)>(x|0)){a=0;p=y;break}p=c[E+(n<<2)>>2]|0;q=c[D+(p<<2)>>2]|0;a=0;l=-+g[b+(p<<2)>>2];while(1){if((a|0)>=(C|0))break;if((a|0)!=(p|0))l=l+ +g[q+(a<<2)>>2]*+g[N+(a<<2)>>2];a=a+1|0}g[I+(p<<2)>>2]=l/-+g[q+(p<<2)>>2]-+g[A+(p<<2)>>2];n=n+1|0}c:while(1){if((p|0)>(x|0)){m=0.0;o=0.0;r=0;break}n=c[M+(c[E+(p<<2)>>2]<<2)>>2]|0;if((n|0)==(H|0))r=f;else{r=c[G+(n<<2)>>2]|0;r=(f|0)<(r|0)?f:r}q=p;while(1){if((q|0)>=(r|0)){q=p;break}n=c[E+(q<<2)>>2]|0;if(+g[I+(n<<2)>>2]>2]=n;a=a+1|0}q=q+1|0}while(1){if((q|0)>=(r|0))break;n=c[E+(q<<2)>>2]|0;if(+g[I+(n<<2)>>2]==z){c[L+(a<<2)>>2]=n;a=a+1|0}q=q+1|0}while(1){if((p|0)>=(r|0)){p=r;continue c}n=c[E+(p<<2)>>2]|0;if(+g[I+(n<<2)>>2]>z){c[L+(a<<2)>>2]=n;a=a+1|0}p=p+1|0}}while(1){if((r|0)>=(a|0))break;p=c[L+(r<<2)>>2]|0;q=c[D+(p<<2)>>2]|0;l=0.0;n=0;while(1){if((n|0)==(r|0))break;l=l-+g[q+(c[L+(n<<2)>>2]<<2)>>2];n=n+1|0}l=l*2.0;u=q+(p<<2)|0;s=+g[u>>2];s=(z*l+(o*m-s*+g[I+(p<<2)>>2]))/(l+(m-s));g[J+(r<<2)>>2]=s;m=m+(l-+g[u>>2]);o=s;r=r+1|0}q=(a|0)==(C|0);if(q)g[B>>2]=z;u=a+-1|0;m=0.0;o=0.0;p=u;while(1){if((p|0)<=-1)break;r=c[L+(p<<2)>>2]|0;t=c[D+(r<<2)>>2]|0;l=0.0;n=p;while(1){n=n+1|0;if((n|0)>=(a|0))break;l=l-+g[t+(c[L+(n<<2)>>2]<<2)>>2]}l=l*2.0;t=t+(r<<2)|0;s=+g[t>>2];s=(z*l+(o*m-s*+g[I+(r<<2)>>2]))/(l+(m-s));g[K+(p<<2)>>2]=s;m=m+(l-+g[t>>2]);o=s;p=p+-1|0}if(q){g[K>>2]=z;s=0.0;n=-1;q=0}else{s=0.0;n=-1;q=0}while(1){if((a|0)<=(q|0))break;o=+g[K+(q<<2)>>2];if((q|0)>0)l=+g[J+(q+-1<<2)>>2];else l=o;do if(oz;if(os;s=t?o:s;n=t?q:n;q=q+1|0}r=E+(x<<2)|0;p=c[L+(u<<2)>>2]|0;q=N+(p<<2)|0;if((n|0)>-1)break;k=+g[q>>2];if(!v){y=f;continue}k=(c[M+(c[w>>2]<<2)>>2]|0)>(c[M+(c[r>>2]<<2)>>2]|0)?k+j:k;y=f}o=+g[K+(n<<2)>>2];if(!n)s=o;else s=+g[J+(n+-1<<2)>>2];do if(v){u=c[w>>2]|0;m=+g[N+(u<<2)>>2];l=+g[A+(p<<2)>>2];if((c[M+(u<<2)>>2]|0)>(c[M+(c[r>>2]<<2)>>2]|0)){l=m-j-l;break}else{l=m-l;break}}else l=1.0e9;while(0);l=ok?s:k;do if(lz;if(l=(n|0))break;u=c[L+(p<<2)>>2]|0;g[N+(u<<2)>>2]=l+ +g[A+(u<<2)>>2];p=p+1|0}while(1){if((n|0)>=(a|0))break;u=c[L+(n<<2)>>2]|0;g[N+(u<<2)>>2]=m+ +g[A+(u<<2)>>2];n=n+1|0}k=+g[q>>2];if(v)k=(c[M+(c[w>>2]<<2)>>2]|0)>(c[M+(c[r>>2]<<2)>>2]|0)?k+j:k;a=y;while(1){if((a|0)>(x|0))break;c[E+(a<<2)>>2]=c[L+(a-y<<2)>>2];a=a+1|0}if(e<<24>>24!=0?+F(+(l-z))<.01:0)e=+F(+(m-z))<.01;else e=0;e=e&1}Pt(C,N);Du(N,E,G,H,i);d=d+1|0}}while(0);return d|0}function Du(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=0;while(1){if((g|0)>=(e|0))break;c[f+(g<<2)>>2]=c[a+(c[b+((c[d+(g<<2)>>2]|0)+-1<<2)>>2]<<2)>>2];g=g+1|0}return}function Eu(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0.0,j=0,k=0,l=0,m=0;i=-1.0e9;k=0;j=-1;m=0;while(1){if((m|0)>=(b|0))break;if((m|0)<(k|0))l=k;else{j=j+1|0;if((j|0)==(f|0))k=b;else k=c[e+(j<<2)>>2]|0;if((m|0)>0)i=+g[a+(c[d+(m+-1<<2)>>2]<<2)>>2]+h;else i=-1.0e9;dt(a,d,m,k+-1|0);l=k}k=a+(c[d+(m<<2)>>2]<<2)|0;if(+g[k>>2]>2]=i;k=l;m=m+1|0}return}function Fu(a){a=a|0;l6(c[c[a>>2]>>2]|0);l6(c[a>>2]|0);l6(c[a+8>>2]|0);l6(c[a+28>>2]|0);l6(c[a+32>>2]|0);l6(c[a+36>>2]|0);l6(c[a+40>>2]|0);l6(c[a+12>>2]|0);l6(c[a+16>>2]|0);l6(c[a+20>>2]|0);l6(c[a+24>>2]|0);l6(a);return}function Gu(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;k=IK(60)|0;c[k>>2]=0;l=k+4|0;c[l>>2]=b;c[k+48>>2]=d;c[k+52>>2]=e;c[k+56>>2]=f;c[k>>2]=Bu(a,b)|0;i=b<<2;j=IK(i)|0;c[k+8>>2]=j;h=0;b=0;a=-1;while(1){if((h|0)>=(c[l>>2]|0))break;g=a+1|0;if((h|0)>=(b|0)){b=c[((g|0)==(f|0)?l:e+(g<<2)|0)>>2]|0;a=g}c[j+(c[d+(h<<2)>>2]<<2)>>2]=a;h=h+1|0}c[k+28>>2]=IK(i)|0;c[k+32>>2]=IK(i)|0;c[k+36>>2]=IK(i)|0;c[k+40>>2]=IK(i)|0;c[k+12>>2]=IK(i)|0;c[k+16>>2]=IK(i)|0;c[k+20>>2]=IK(i)|0;c[k+24>>2]=IK(i)|0;return k|0}function Hu(){cu(187844,24);c[46964]=0;return}function Iu(){return eu(187844)|0}function Ju(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a>>3]-+h[b>>3];c=+h[a+8>>3]-+h[b+8>>3];return +(+G(+(d*d+c*c)))}function Ku(a){a=a|0;var b=0;b=c[46964]|0;c[a+16>>2]=b;c[46964]=b+1;return}function Lu(a){a=a|0;var b=0,d=0;d=a+20|0;b=(c[d>>2]|0)+-1|0;c[d>>2]=b;if(!b)fu(a,187844);return}function Mu(a){a=a|0;a=a+20|0;c[a>>2]=(c[a>>2]|0)+1;return}function Nu(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;x=l;l=l+16|0;o=x;c[o>>2]=e;q=b<<2;u=IK(q)|0;k=b<<3;v=IK(k)|0;t=Ys(a,b)|0;a=0;while(1){if((a|0)>=(b|0))break;j=t+(a<<2)|0;i=0;while(1){if((i|0)==(b|0))break;s=(c[j>>2]|0)+(i<<2)|0;c[s>>2]=c[s>>2]<<8;i=i+1|0}a=a+1|0}if(!d)Aa(94253,94261,283,94275);s=IK(k)|0;a=0;while(1){if((a|0)>=(b|0))break;h[s+(a<<3)>>3]=+h[d+(a<<3)>>3];a=a+1|0}Ou(s,b);m=0.0;n=0.0;k=1;while(1){if((k|0)>=(b|0))break;i=t+(k<<2)|0;j=d+(k<<3)|0;a=0;while(1){if((a|0)==(k|0))break;y=c[(c[i>>2]|0)+(a<<2)>>2]|0;r=+F(+(+h[j>>3]-+h[d+(a<<3)>>3]));m=m+r*(1.0/+(S(y,y)|0)*r);n=n+1.0/+(y|0)*r;a=a+1|0}k=k+1|0}r=n/m;a=0;while(1){if((a|0)>=(b|0))break;y=d+(a<<3)|0;h[y>>3]=r*+h[y>>3];a=a+1|0}Pu(b,o,f,d,t);j=IK(S(q,b)|0)|0;i=0;while(1){if((i|0)>=(b|0)){o=1;break}k=j+((S(i,b)|0)<<2)|0;c[u+(i<<2)>>2]=k;o=t+(i<<2)|0;m=0.0;a=0;while(1){if((a|0)==(b|0))break;if((a|0)!=(i|0)){p=+(c[(c[o>>2]|0)+(a<<2)>>2]|0);p=-1.0/(p*p);g[k+(a<<2)>>2]=p;m=m-p}a=a+1|0}g[k+(i<<2)>>2]=m;i=i+1|0}while(1){if((o|0)>=(b|0)){i=0;break}n=+h[d+(o<<3)>>3];j=t+(o<<2)|0;i=0;while(1){if((i|0)==(o|0))break;k=(c[j>>2]|0)+(i<<2)|0;p=+(c[k>>2]|0);m=n-+h[d+(i<<3)>>3];m=p*p-m*m;if(m>0.0)a=~~+G(+m);else a=0;c[(c[t+(i<<2)>>2]|0)+(o<<2)>>2]=a;c[k>>2]=a;i=i+1|0}o=o+1|0}while(1){if((i|0)>=(b|0)){q=0;a=0;break}n=+h[e+(i<<3)>>3];k=v+(i<<3)|0;h[k>>3]=0.0;o=t+(i<<2)|0;j=u+(i<<2)|0;a=0;m=0.0;while(1){if((a|0)==(b|0))break;if((a|0)!=(i|0)){p=+(c[(c[o>>2]|0)+(a<<2)>>2]|0)*+g[(c[j>>2]|0)+(a<<2)>>2];m=m+(n>=+h[e+(a<<3)>>3]?-p:p);h[k>>3]=m}a=a+1|0}i=i+1|0}while(1){if(!(a<<24>>24==0&(q|0)<200)){a=0;w=58;break}if((wr(u,e,v,b,f,b,1)|0)<0){a=1;break}else{a=1;o=0}while(1){if((o|0)>=(b|0))break;p=+h[e+(o<<3)>>3];j=t+(o<<2)|0;k=u+(o<<2)|0;m=0.0;i=0;while(1){if((i|0)==(b|0))break;do if((i|0)!=(o|0)){n=+(c[(c[j>>2]|0)+(i<<2)>>2]|0)*+g[(c[k>>2]|0)+(i<<2)>>2];if(!(p>=+h[e+(i<<3)>>3])){m=m+n;break}else{m=m+-n;break}}while(0);i=i+1|0}i=v+(o<<3)|0;p=+h[i>>3];if(m!=p?+F(+(1.0-m/p))>1.0e-05:0){h[i>>3]=m;a=0}o=o+1|0}q=q+1|0}a:do if((w|0)==58)while(1){if((a|0)>=(b|0)){a=0;break a}w=d+(a<<3)|0;h[w>>3]=+h[w>>3]/r;w=e+(a<<3)|0;h[w>>3]=+h[w>>3]/r;a=a+1|0;w=58}while(0);l6(c[t>>2]|0);l6(t);l6(c[u>>2]|0);l6(u);l6(s);l6(v);l=x;return a|0}function Ou(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0;c=0;d=0.0;while(1){if((c|0)>=(b|0))break;e=d+ +h[a+(c<<3)>>3];c=c+1|0;d=e}d=d/+(b|0);c=0;while(1){if((c|0)>=(b|0))break;f=a+(c<<3)|0;h[f>>3]=+h[f>>3]-d;c=c+1|0}f=b+-1|0;yt(a,0,f,1.0/+xt(a,0,f),a);return}function Pu(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0;k=Qu(f,a)|0;l=IK(8)|0;if(!e){f=0;j=0}else{g=IK(a<<3)|0;f=0;while(1){if((f|0)>=(a|0))break;h[g+(f<<3)>>3]=+h[e+(f<<3)>>3];f=f+1|0}Ou(g,a);f=g;j=g}Ru(k,a,b,l,f,d);e=0;while(1){if((e|0)==1)break;g=l+(e<<3)|0;i=b+(e<<2)|0;f=0;while(1){if((f|0)>=(a|0))break;d=+G(+(+F(+(+h[g>>3]))));m=(c[i>>2]|0)+(f<<3)|0;h[m>>3]=d*+h[m>>3];f=f+1|0}e=e+1|0}l6(c[k>>2]|0);l6(k);l6(l);l6(j);return}function Qu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0;o=l;l=l+16|0;f=o;n=b<<2;e=IK(S(n,b)|0)|0;n=IK(n)|0;d=0;while(1){if((d|0)>=(b|0))break;c[n+(d<<2)>>2]=e+((S(d,b)|0)<<2);d=d+1|0}m=Tu(a,b,f)|0;h=+g[f>>2];e=0;k=1;while(1){if((e|0)>=(b|0))break;f=a+(e<<2)|0;i=m+(e<<2)|0;j=n+(e<<2)|0;d=0;while(1){if((d|0)==(k|0))break;p=+(c[(c[f>>2]|0)+(d<<2)>>2]|0);p=+g[m+(d<<2)>>2]+(+g[i>>2]-p*p)-h;g[(c[j>>2]|0)+(d<<2)>>2]=p;g[(c[n+(d<<2)>>2]|0)+(e<<2)>>2]=p;d=d+1|0}e=e+1|0;k=k+1|0}l6(m);l=o;return n|0}function Ru(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=+g;var i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0;r=b<<3;q=IK(r)|0;r=IK(r)|0;n=1.0-g;o=(b|0)<1?b:1;p=b+-1|0;k=(f|0)==0;j=0;a:while(1){if((j|0)>=(o|0))break;l=c[d+(j<<2)>>2]|0;do{i=0;while(1){if((i|0)==(b|0))break;h[l+(i<<3)>>3]=+((U4()|0)%100|0|0);i=i+1|0}if(k)i=0;else{wt(l,0,p,-+vt(f,0,p,l),f);i=0}while(1){if((i|0)==(j|0))break;s=d+(i<<2)|0;m=-+vt(c[s>>2]|0,0,p,l);wt(l,0,p,m,c[s>>2]|0);i=i+1|0}g=+xt(l,0,p)}while(g<1.0e-10);yt(l,0,p,1.0/g,l);do{zt(r,0,p,l);Su(a,b,b,l,q,f);zt(l,0,p,q);i=0;while(1){if((i|0)==(j|0))break;s=d+(i<<2)|0;m=-+vt(c[s>>2]|0,0,p,l);wt(l,0,p,m,c[s>>2]|0);i=i+1|0}g=+xt(l,0,p);if(g<1.0e-10)break a;yt(l,0,p,1.0/g,l);m=+vt(l,0,p,r)}while(+F(+m)>3]=g*m;j=j+1|0}while(1){if((j|0)>=(o|0))break;k=c[d+(j<<2)>>2]|0;i=0;while(1){if((i|0)>=(b|0)){i=0;break}h[k+(i<<3)>>3]=+((U4()|0)%100|0|0);i=i+1|0}while(1){if((i|0)>=(j|0))break;s=d+(i<<2)|0;n=-+vt(c[s>>2]|0,0,p,k);wt(k,0,p,n,c[s>>2]|0);i=i+1|0}yt(k,0,p,1.0/+xt(k,0,p),k);h[e+(j<<3)>>3]=0.0;j=j+1|0}l=o+-1|0;j=0;while(1){if((j|0)>=(l|0))break;a=e+(j<<3)|0;f=j+1|0;g=+h[a>>3];i=j;k=f;while(1){if((k|0)>=(o|0))break;n=+h[e+(k<<3)>>3];s=g>2]|0);s=d+(i<<2)|0;zt(c[b>>2]|0,0,p,c[s>>2]|0);zt(c[s>>2]|0,0,p,q);h[e+(i<<3)>>3]=+h[a>>3];h[a>>3]=g;j=f}l6(q);l6(r);return}function Su(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0.0,l=0,m=0;j=0;while(1){if((j|0)>=(b|0))break;m=a+(j<<2)|0;k=0.0;l=0;while(1){if((l|0)>=(d|0))break;k=k+ +g[(c[m>>2]|0)+(l<<2)>>2]*+h[e+(l<<3)>>3];l=l+1|0}h[f+(j<<3)>>3]=k;j=j+1|0}j=b+-1|0;if(i|0)wt(f,0,j,-+vt(f,0,j,i),i);return}function Tu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,j=0,k=0.0,l=0,m=0.0;j=IK(b<<2)|0;k=+(b|0);e=0.0;i=0;while(1){if((i|0)>=(b|0))break;l=a+(i<<2)|0;f=0.0;h=0;while(1){if((h|0)==(b|0))break;m=+(c[(c[l>>2]|0)+(h<<2)>>2]|0);m=m*m;f=f+m;h=h+1|0;e=e+m}g[j+(i<<2)>>2]=f/k;i=i+1|0}g[d>>2]=e/+(S(b,b)|0);return j|0}function Uu(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0;q=S(d,d)|0;r=IK(q<<3)|0;s=IK(d<<3)|0;e=0;while(1){if((e|0)>=(d|0))break;h[s+(e<<3)>>3]=+h[c+(e<<3)>>3];e=e+1|0}e=0;while(1){if((e|0)>=(q|0))break;h[r+(e<<3)>>3]=+h[a+(e<<3)>>3];e=e+1|0}p=d+-1|0;g=0;o=0;a:while(1){if((o|0)<(p|0)){f=0.0;e=o}else{l=21;break}while(1){if((e|0)>=(d|0))break;t=+F(+(+h[a+((S(e,d)|0)+o<<3)>>3]));m=t=(d|0))break;l=a+(e+i<<3)|0;t=+h[l>>3];m=a+(e+n<<3)|0;h[l>>3]=+h[m>>3];h[m>>3]=t;e=e+1|0}m=c+(g<<3)|0;t=+h[m>>3];j=c+(o<<3)|0;h[m>>3]=+h[j>>3];h[j>>3]=t;m=o+1|0;k=a+(n+o<<3)|0;e=m;while(1){if((e|0)>=(d|0)){o=m;continue a}l=S(e,d)|0;f=+h[a+(l+o<<3)>>3]/+h[k>>3];i=c+(e<<3)|0;h[i>>3]=+h[i>>3]-f*+h[j>>3];i=0;while(1){if((i|0)>=(d|0))break;u=a+(i+l<<3)|0;h[u>>3]=+h[u>>3]-f*+h[a+(i+n<<3)>>3];i=i+1|0}e=e+1|0}}if((l|0)==21){f=+h[a+(q+-1<<3)>>3];if(+F(+f)<1.0e-10)l=33;else{h[b+(p<<3)>>3]=+h[c+(p<<3)>>3]/f;e=0;while(1){if((e|0)>=(p|0)){e=0;break}g=d-e|0;i=g+-2|0;f=+h[c+(i<<3)>>3];j=b+(i<<3)|0;h[j>>3]=f;k=S(i,d)|0;g=g+-1|0;while(1){if((g|0)>=(d|0))break;t=f-+h[a+(g+k<<3)>>3]*+h[b+(g<<3)>>3];h[j>>3]=t;g=g+1|0;f=t}h[j>>3]=f/+h[a+(k+i<<3)>>3];e=e+1|0}while(1){if((e|0)>=(d|0)){e=0;break}h[c+(e<<3)>>3]=+h[s+(e<<3)>>3];e=e+1|0}while(1){if((e|0)>=(q|0))break;h[a+(e<<3)>>3]=+h[r+(e<<3)>>3];e=e+1|0}l6(r);l6(s)}}if((l|0)==33){Z5(94290)|0;l6(r);l6(s)}return}function Vu(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;s=l;l=l+16|0;r=s;js();Hu();Es();c[46960]=ib[d&3]()|0;Gs();q=r+8|0;p=ib[d&3]()|0;e=0.0;f=0.0;a:while(1){n=(p|0)==0;o=p+8|0;while(1){if(!(As()|0)){Bs(r);e=+h[r>>3];f=+h[q>>3]}if(!n){if(As()|0)break;g=+h[o>>3];if(g>3]>2]|0;Ku(j);ns(c[t+8>>2]|0,a[t+16>>0]|0,j);ns(c[v+8>>2]|0,a[v+16>>0]|0,j);Ns(t);zs(v);Ns(v);v=+h[m+8>>3]>+h[u+8>>3];t=v&1;k=v?u:m;u=ks(k,v?m:u)|0;m=Hs(u,t)|0;Ks(b,m);ns(u,(t^1)&255,j);Lu(j);j=Is(b,m)|0;if(j|0){zs(b);xs(b,j,+Ju(j,k))}b=Is(m,i)|0;if(!b)continue;xs(m,b,+Ju(b,k))}b=Ls(p)|0;k=Os(b)|0;i=ks(Rs(b)|0,p)|0;m=Hs(i,0)|0;Ks(b,m);j=Is(b,m)|0;if(j|0){zs(b);xs(b,j,+Ju(j,p))}i=Hs(i,1)|0;Ks(m,i);b=Is(i,k)|0;if(b|0)xs(i,b,+Ju(b,p));p=ib[d&3]()|0}b=c[46902]|0;while(1){b=Os(b)|0;if((b|0)==(c[46903]|0))break;ls(c[b+8>>2]|0)}l=s;return}function Wu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=l;l=l+16|0;g=h+8|0;f=h;do if((qB(b)|0)!=1){Xu(b);if(!d)d=Yu(b)|0;e=Zu(b,d)|0;if(a[195234]|0){i=c[15715]|0;c[f>>2]=HB(d)|0;c[f+4>>2]=e;z4(i,94306,f)|0}if((e|0)<0){dA(1,94340,g)|0;break}else{_u(b);$u(b,d);av(b,d);bv(b,e);break}}else{i=c[(c[(gC(b)|0)+16>>2]|0)+132>>2]|0;c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0}while(0);l=h;return d|0}function Xu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=qB(a)|0;d=S(d,d)|0;b=gC(a)|0;while(1){if(!b)break;e=b+16|0;f=c[(c[e>>2]|0)+112>>2]|0;g=f+24|0;c[g>>2]=d;c[g+4>>2]=0;h[f+48>>3]=10.0;f=(jv(a,b)|0)==0;e=c[(c[e>>2]|0)+112>>2]|0;c[e>>2]=f?d:0;c[e+4>>2]=f?0:0;b=hC(a,b)|0}return}function Yu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;e=(qB(a)|0)<3;b=gC(a)|0;a:do if(!e){while(1){if(!b)break;e=c[(c[b+16>>2]|0)+112>>2]|0;if((c[e>>2]|0)==0&(c[e+4>>2]|0)==0)iv(a,b,0);b=hC(a,b)|0}d=0;b=0;e=gC(a)|0;while(1){if(!e)break a;h=c[(c[e+16>>2]|0)+112>>2]|0;g=c[h>>2]|0;h=c[h+4>>2]|0;f=((d|0)<0)<<31>>31;f=h>>>0>f>>>0|(h|0)==(f|0)&g>>>0>d>>>0;d=f?g:d;b=f?e:b;e=hC(a,e)|0}}while(0);return b|0}function Zu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=c[(c[b+16>>2]|0)+112>>2]|0;f=d+24|0;e=c[f>>2]|0;c[f>>2]=0;c[f+4>>2]=0;c[d+32>>2]=0;fv(a,b);d=gC(a)|0;e=y6(0,e|0,32)|0;f=D;b=0;while(1){if(!d)break;h=(c[(c[d+16>>2]|0)+112>>2]|0)+24|0;g=c[h>>2]|0;h=c[h+4>>2]|0;if((g|0)==(e|0)&(h|0)==(f|0)){b=-1;break}i=((b|0)<0)<<31>>31;b=h>>>0>i>>>0|(h|0)==(i|0)&g>>>0>b>>>0?g:b;d=hC(a,d)|0}return b|0}function _u(a){a=a|0;var b=0,d=0,e=0,f=0;d=gC(a)|0;while(1){if(!d)break;b=c[(c[d+16>>2]|0)+112>>2]|0;e=b+16|0;a:do if((c[e>>2]|0)==0&(c[e+4>>2]|0)==0)while(1){e=b+8|0;f=e;f=w6(c[f>>2]|0,c[f+4>>2]|0,1,0)|0;c[e>>2]=f;c[e+4>>2]=D;b=c[b+32>>2]|0;if(!b)break a;b=c[(c[b+16>>2]|0)+112>>2]|0}while(0);d=hC(a,d)|0}return}function $u(a,b){a=a|0;b=b|0;h[(c[(c[b+16>>2]|0)+112>>2]|0)+40>>3]=6.283185307179586;ev(a,b);return}function av(a,b){a=a|0;b=b|0;h[(c[(c[b+16>>2]|0)+112>>2]|0)+48>>3]=0.0;dv(a,b);return}function bv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0.0,m=0.0;j=l;l=l+16|0;g=j;i=cv(b,d)|0;if(a[195234]|0){f=c[15715]|0;Z3(94396,f)|0;e=0;while(1){if((e|0)>(d|0))break;h[g>>3]=+h[i+(e<<3)>>3];z4(f,94415,g)|0;e=e+1|0}Z3(153748,f)|0}e=gC(b)|0;while(1){if(!e)break;g=c[e+16>>2]|0;f=c[g+112>>2]|0;k=+h[i+(c[f+24>>2]<<3)>>3];f=f+48|0;m=k*+I(+(+h[f>>3]));g=c[g+132>>2]|0;h[g>>3]=m;h[g+8>>3]=k*+J(+(+h[f>>3]));e=hC(b,e)|0}l6(i);l=j;return}function cv(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0.0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;k=n;m=HK((d<<3)+8|0)|0;b=_O(b,DA(c[b+60>>2]|0,0,101589,0)|0,0)|0;a:do if(!b){f=1.0;e=0.0;b=1}else{i=0.0;e=0.0;g=1;b:while(1){if((g|0)>(d|0)){f=i;b=g;break a}f=+b6(b,k);if(!(f>0.0)){f=i;b=g;break a}i=f>.02?f:.02;e=e+i;j=g+1|0;h[m+(g<<3)>>3]=e;b=c[k>>2]|0;while(1){g=a[b>>0]|0;if(!(g<<24>>24)){g=j;continue b}if(!(g<<24>>24==58|(X1(g<<24>>24)|0)!=0)){g=j;continue b}b=b+1|0}}}while(0);while(1){if((b|0)>(d|0))break;i=f+e;h[m+(b<<3)>>3]=i;b=b+1|0;e=i}l=n;return m|0}function dv(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,g=0,i=0,j=0.0;d=c[(c[b+16>>2]|0)+112>>2]|0;if(!(c[d+32>>2]|0))e=0.0;else e=+h[d+48>>3]-+h[d+40>>3]*.5;g=ZA(a,b)|0;while(1){if(!g)break;d=c[g>>2]&3;f=c[((d|0)==3?g:g+48|0)+40>>2]|0;if((f|0)==(b|0))f=c[((d|0)==2?g:g+-48|0)+40>>2]|0;d=c[(c[f+16>>2]|0)+112>>2]|0;if((c[d+32>>2]|0)==(b|0)?(i=d+48|0,!(+h[i>>3]!=10.0)):0){j=+h[d+40>>3];h[i>>3]=e+j*.5;e=e+j;d=d+16|0;if(!((c[d>>2]|0)==0&(c[d+4>>2]|0)==0))dv(a,f)}g=_A(a,g,b)|0}return}function ev(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0,j=0;e=c[(c[b+16>>2]|0)+112>>2]|0;f=e+8|0;g=+h[e+40>>3]/(+((c[f>>2]|0)>>>0)+4294967296.0*+((c[f+4>>2]|0)>>>0));f=ZA(a,b)|0;while(1){if(!f)break;e=c[f>>2]&3;d=c[((e|0)==3?f:f+48|0)+40>>2]|0;if((d|0)==(b|0))d=c[((e|0)==2?f:f+-48|0)+40>>2]|0;e=c[(c[d+16>>2]|0)+112>>2]|0;if(((c[e+32>>2]|0)==(b|0)?(i=e+40|0,!(+h[i>>3]!=0.0)):0)?(j=e+8|0,h[i>>3]=g*(+((c[j>>2]|0)>>>0)+4294967296.0*+((c[j+4>>2]|0)>>>0)),e=e+16|0,!((c[e>>2]|0)==0&(c[e+4>>2]|0)==0)):0)ev(a,d);f=_A(a,f,b)|0}return}function fv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;p=l;l=l+16|0;n=p;o=DA(b,2,101842,0)|0;c[n+4>>2]=0;c[n>>2]=0;gv(n,d);j=(o|0)==0;a:while(1){k=hv(n)|0;if(!k)break;m=k+16|0;h=c[(c[(c[m>>2]|0)+112>>2]|0)+24>>2]|0;g=ZA(b,k)|0;h=w6(0,h|0,0,1)|0;h=y6(h|0,D|0,32)|0;i=D;while(1){if(!g)continue a;if(!((!j?(a[(OA(g,o)|0)>>0]|0)==48:0)?!(f2(OA(g,o)|0,138697)|0):0)){d=c[g>>2]&3;e=c[((d|0)==3?g:g+48|0)+40>>2]|0;if((e|0)==(k|0))e=c[((d|0)==2?g:g+-48|0)+40>>2]|0;d=c[(c[e+16>>2]|0)+112>>2]|0;f=d+24|0;q=f;r=c[q+4>>2]|0;if(i>>>0>>0|((i|0)==(r|0)?h>>>0<(c[q>>2]|0)>>>0:0)){r=f;c[r>>2]=h;c[r+4>>2]=i;c[d+32>>2]=k;r=(c[(c[m>>2]|0)+112>>2]|0)+16|0;q=r;q=w6(c[q>>2]|0,c[q+4>>2]|0,1,0)|0;c[r>>2]=q;c[r+4>>2]=D;gv(n,e)}}g=_A(b,g,k)|0}}l=p;return}function gv(a,b){a=a|0;b=b|0;var d=0,e=0;d=HK(8)|0;c[d>>2]=b;b=a+4|0;e=c[b>>2]|0;c[((e|0)==0?a:e+4|0)>>2]=d;c[b>>2]=d;return}function hv(a){a=a|0;var b=0,d=0;d=c[a>>2]|0;if(d){b=c[d>>2]|0;c[a>>2]=c[d+4>>2];l6(d);if(!(c[a>>2]|0))c[a+4>>2]=0}else b=0;return b|0}function iv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=c[c[(c[b+16>>2]|0)+112>>2]>>2]|0;g=ZA(a,b)|0;h=w6(0,h|0,0,1)|0;h=y6(h|0,D|0,32)|0;i=D;while(1){if(!g)break;f=c[g>>2]&3;e=c[((f|0)==3?g:g+48|0)+40>>2]|0;if((e|0)==(b|0))e=c[((f|0)==2?g:g+-48|0)+40>>2]|0;if((e|0)!=(d|0)?(j=c[(c[e+16>>2]|0)+112>>2]|0,f=j,k=c[f+4>>2]|0,i>>>0>>0|((i|0)==(k|0)?h>>>0<(c[f>>2]|0)>>>0:0)):0){k=j;c[k>>2]=h;c[k+4>>2]=i;iv(a,e,b)}g=_A(a,g,b)|0}return}function jv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=0;g=ZA(a,b)|0;while(1){if(!g){d=1;break}e=c[g>>2]&3;d=c[((e|0)==3?g:g+48|0)+40>>2]|0;if((d|0)==(b|0))d=c[((e|0)==2?g:g+-48|0)+40>>2]|0;if((d|0)!=(b|0)){if(f)if((f|0)==(d|0))d=f;else{d=0;break}}else d=f;f=d;g=_A(a,g,b)|0}return d|0}function kv(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0;b=l;l=l+32|0;e=b;d=DA(a,1,94423,0)|0;g=DA(a,0,94423,0)|0;a=lv(a,g,d,DA(a,0,94428,0)|0)|0;d=a+16|0;f=+G(+(+h[a>>3]+.1));wv(e,0.0,0.0,f,f);c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];c[d+16>>2]=c[e+16>>2];c[d+20>>2]=c[e+20>>2];c[d+24>>2]=c[e+24>>2];c[d+28>>2]=c[e+28>>2];mv(a);nv(a);ov(a);l=b;return}function lv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=HK(72)|0;c[o+60>>2]=0;c[o+56>>2]=a;k=a+16|0;f=0.0;l=0;i=1;j=0;m=0;while(1){g=c[k>>2]|0;if((i|0)>(c[g+180>>2]|0))break;g=lv(c[(c[g+184>>2]|0)+(i<<2)>>2]|0,b,d,e)|0;f=f+ +h[g>>3];if(j|0)c[j+52>>2]=g;l=l+1|0;i=i+1|0;j=g;m=(m|0)==0?g:m}n=gC(a)|0;g=m;while(1){if(!n)break;i=n+16|0;if(!(c[c[(c[i>>2]|0)+112>>2]>>2]|0)){k=rv(n,d)|0;f=f+ +h[k>>3];if(j|0)c[j+52>>2]=k;c[c[(c[i>>2]|0)+112>>2]>>2]=a;i=l+1|0;j=k;g=(g|0)==0?k:g}else i=l;n=hC(a,n)|0;l=i}c[o+64>>2]=l;if(!l)f=+tv(a,b);else{h[o+8>>3]=f;f=+sv(o,e)}h[o>>3]=f;c[o+48>>2]=g;return o|0}function mv(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;s=l;l=l+176|0;i=s+144|0;q=s+64|0;o=s+32|0;m=s;r=c[b+64>>2]|0;a:do if(r|0){p=HK(r<<2)|0;d=b+48|0;f=0;e=d;while(1){e=c[e>>2]|0;if((f|0)>=(r|0))break;c[p+(f<<2)>>2]=e;f=f+1|0;e=e+52|0}k3(p,r,4,80);n=HK(r<<3)|0;e=0;while(1){if((e|0)>=(r|0))break;h[n+(e<<3)>>3]=+h[c[p+(e<<2)>>2]>>3];e=e+1|0}j=+h[b+8>>3];e=b+16|0;f=b+32|0;g=b+40|0;k=b+24|0;if(+h[b>>3]==j){c[i>>2]=c[e>>2];c[i+4>>2]=c[e+4>>2];c[i+8>>2]=c[e+8>>2];c[i+12>>2]=c[e+12>>2];c[i+16>>2]=c[e+16>>2];c[i+20>>2]=c[e+20>>2];c[i+24>>2]=c[e+24>>2];c[i+28>>2]=c[e+28>>2];i=uv(r,n,i)|0}else{t=+h[g>>3];u=+h[f>>3];h[m>>3]=+h[e>>3];h[m+8>>3]=+h[k>>3];v=t-u;j=(t+u-+G(+(j*4.0+v*v)))*.5;h[m+16>>3]=u-j;h[m+24>>3]=t-j;c[i>>2]=c[m>>2];c[i+4>>2]=c[m+4>>2];c[i+8>>2]=c[m+8>>2];c[i+12>>2]=c[m+12>>2];c[i+16>>2]=c[m+16>>2];c[i+20>>2]=c[m+20>>2];c[i+24>>2]=c[m+24>>2];c[i+28>>2]=c[m+28>>2];i=uv(r,n,i)|0}if(a[195234]|0){m=c[15715]|0;t=+h[k>>3];u=+h[f>>3];v=+h[g>>3];h[o>>3]=+h[e>>3];h[o+8>>3]=t;h[o+16>>3]=u;h[o+24>>3]=v;z4(m,94475,o)|0}f=c[15715]|0;e=0;while(1){if((e|0)>=(r|0))break;o=(c[p+(e<<2)>>2]|0)+16|0;g=i+(e<<5)|0;c[o>>2]=c[g>>2];c[o+4>>2]=c[g+4>>2];c[o+8>>2]=c[g+8>>2];c[o+12>>2]=c[g+12>>2];c[o+16>>2]=c[g+16>>2];c[o+20>>2]=c[g+20>>2];c[o+24>>2]=c[g+24>>2];c[o+28>>2]=c[g+28>>2];if(a[195234]|0){j=+h[g>>3];u=+h[i+(e<<5)+16>>3];x=u*.5;t=+h[i+(e<<5)+8>>3];v=+h[i+(e<<5)+24>>3];w=v*.5;h[q>>3]=+h[n+(e<<3)>>3];h[q+8>>3]=j-x;h[q+16>>3]=t-w;h[q+24>>3]=j+x;h[q+32>>3]=t+w;h[q+40>>3]=u*v;h[q+48>>3]=j;h[q+56>>3]=t;h[q+64>>3]=u;h[q+72>>3]=v;z4(f,94492,q)|0}e=e+1|0}l6(p);l6(n);l6(i);e=0;while(1){d=c[d>>2]|0;if((e|0)>=(r|0))break a;if(!(c[d+60>>2]|0))mv(d);d=d+52|0;e=e+1|0}}while(0);l=s;return}function nv(b){b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0.0,k=0,m=0.0,n=0.0;g=l;l=l+48|0;f=g;e=b+56|0;if(c[b+60>>2]|0){m=+h[b+24>>3];j=+h[b+32>>3];i=+h[b+40>>3];d=c[e>>2]|0;e=d+16|0;k=c[e>>2]|0;h[k+16>>3]=+h[b+16>>3];h[k+24>>3]=m;b=c[e>>2]|0;h[b+32>>3]=j/72.0;h[b+40>>3]=i/72.0;oQ(d,c[(c[(uC(d)|0)+16>>2]|0)+116>>2]&1);pv(d);if(a[195234]|0){k=c[15715]|0;b=HB(d)|0;e=c[e>>2]|0;n=+h[e+16>>3];i=+h[e+24>>3];j=+h[e+80>>3];m=+h[e+88>>3]+ +h[e+96>>3];c[f>>2]=b;h[f+8>>3]=n;h[f+16>>3]=i;h[f+24>>3]=j;h[f+32>>3]=m;z4(k,94434,f)|0}}else{d=b+48|0;while(1){d=c[d>>2]|0;if(!d)break;nv(d);d=d+52|0}i=+h[b+32>>3];m=+h[b+40>>3];j=+h[b+16>>3]-i*.5;n=+h[b+24>>3]-m*.5;k=c[(c[e>>2]|0)+16>>2]|0;h[k+16>>3]=j;h[k+24>>3]=n;h[k+32>>3]=i+j;h[k+40>>3]=m+n}l=g;return}function ov(a){a=a|0;var b=0,d=0,e=0;e=c[a+64>>2]|0;b=a+48|0;d=0;while(1){b=c[b>>2]|0;if((d|0)>=(e|0))break;ov(b);b=b+52|0;d=d+1|0}l6(a);return}function pv(b){b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+48|0;f=g;d=g+8|0;e=c[47212]|0;if(e|0?(a[(OA(b,e)|0)>>0]|0)==0:0){h[f>>3]=+h[(c[b+16>>2]|0)+80>>3]*.7;i2(d,94469,f)|0;HA(b,c[47212]|0,d)|0}qP(b);l=g;return}function qv(a,b){a=a|0;b=b|0;var d=0.0;d=+h[c[a>>2]>>3]-+h[c[b>>2]>>3];return (d<0.0?1:(d>0.0)<<31>>31)|0}function rv(a,b){a=a|0;b=b|0;var d=0;d=HK(72)|0;h[d>>3]=+tv(a,b);c[d+60>>2]=1;c[d+56>>2]=a;return d|0}function sv(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;e=+YO(c[a+56>>2]|0,b,0.0,0.0);d=+h[a+8>>3];if(!(e==0.0)){d=e*2.0+ +G(+d);d=d*d}return +d}function tv(a,b){a=a|0;b=b|0;var c=0.0;c=+YO(a,b,1.0,0.0);return +(c==0.0?1.0e3:c*1.0e3)}function uv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0.0;i=l;l=l+32|0;g=i;e=0;f=0.0;while(1){if((e|0)>=(a|0))break;j=f+ +h[b+(e<<3)>>3];e=e+1|0;f=j}if(f>+h[d+16>>3]*+h[d+24>>3]+.001)e=0;else{e=HK(a<<5)|0;c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];c[g+16>>2]=c[d+16>>2];c[g+20>>2]=c[d+20>>2];c[g+24>>2]=c[d+24>>2];c[g+28>>2]=c[d+28>>2];vv(a,b,e,0,0.0,1.0,0.0,1.0,g)}l=i;return e|0}function vv(b,d,e,f,g,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;g=+g;i=+i;j=+j;k=+k;m=m|0;var n=0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0;B=l;l=l+112|0;A=B+72|0;v=B+40|0;r=B+32|0;n=B;z=m+16|0;o=+h[z>>3];x=m+24|0;p=+h[x>>3];w=+h[m+16+((!(o>3];do if((b|0)>=1){y=m+8|0;if(a[195234]|0){C=c[15715]|0;D=+h[y>>3];h[n>>3]=+h[m>>3];h[n+8>>3]=o;h[n+16>>3]=D;h[n+24>>3]=p;z4(C,94529,n)|0;c[r>>2]=f;z4(C,94575,r)|0}if(!f){j=+h[d>>3];D=w*w;w=j/D;D=D/j;c[A>>2]=c[m>>2];c[A+4>>2]=c[m+4>>2];c[A+8>>2]=c[m+8>>2];c[A+12>>2]=c[m+12>>2];c[A+16>>2]=c[m+16>>2];c[A+20>>2]=c[m+20>>2];c[A+24>>2]=c[m+24>>2];c[A+28>>2]=c[m+28>>2];vv(b,d,e,1,j,j,j,w>D?w:D,A);break}r=d+(f<<3)|0;if((b|0)>(f|0)?(u=+h[r>>3],q=ui?i:u,u=u+j,s=u/w,D=s/(t/s),s=q/s/s,s=D>s?D:s,s<=k):0){c[A>>2]=c[m>>2];c[A+4>>2]=c[m+4>>2];c[A+8>>2]=c[m+8>>2];c[A+12>>2]=c[m+12>>2];c[A+16>>2]=c[m+16>>2];c[A+20>>2]=c[m+20>>2];c[A+24>>2]=c[m+24>>2];c[A+28>>2]=c[m+28>>2];vv(b,d,e,f+1|0,q,t,u,s,A);break}q=j/w;if(a[195234]|0){C=c[15715]|0;c[v>>2]=f;h[v+8>>3]=j;h[v+16>>3]=w;h[v+24>>3]=q;z4(C,94600,v)|0}o=+h[z>>3];p=q*.5;if(w==o){o=+h[m>>3]-o*.5;n=0;while(1){if((n|0)>=(f|0))break;h[e+(n<<5)+24>>3]=q;D=+h[d+(n<<3)>>3]/q;h[e+(n<<5)+16>>3]=D;h[e+(n<<5)+8>>3]=+h[y>>3]+ +h[x>>3]*.5-p;h[e+(n<<5)>>3]=o+D*.5;o=o+D;n=n+1|0}h[y>>3]=+h[y>>3]-p;n=1}else{o=+h[y>>3]+ +h[x>>3]*.5;n=0;while(1){if((n|0)>=(f|0))break;h[e+(n<<5)+16>>3]=q;D=+h[d+(n<<3)>>3]/q;h[e+(n<<5)+24>>3]=D;h[e+(n<<5)>>3]=p+(+h[m>>3]-+h[z>>3]*.5);h[e+(n<<5)+8>>3]=o-D*.5;o=o-D;n=n+1|0}h[m>>3]=p+ +h[m>>3];n=0}C=m+16+(n<<3)|0;h[C>>3]=+h[C>>3]-q;c[A>>2]=c[m>>2];c[A+4>>2]=c[m+4>>2];c[A+8>>2]=c[m+8>>2];c[A+12>>2]=c[m+12>>2];c[A+16>>2]=c[m+16>>2];c[A+20>>2]=c[m+20>>2];c[A+24>>2]=c[m+24>>2];c[A+28>>2]=c[m+28>>2];vv(b-f|0,r,e+(f<<5)|0,0,0.0,0.0,0.0,1.0,A)}while(0);l=B;return}function wv(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;h[a>>3]=b;h[a+8>>3]=c;h[a+16>>3]=d;h[a+24>>3]=e;return}function xv(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;E=l;l=l+96|0;D=E+48|0;C=E+24|0;B=E+16|0;A=E+8|0;v=E+80|0;w=E;x=d+4|0;y=v+4|0;z=a+16|0;t=gC(a)|0;e=0;f=0;i=0;j=0;while(1){if(!t)break;u=UA(a,t)|0;r=e;s=j;while(1){if(!u)break;e=(b[(c[u+16>>2]|0)+168>>1]|0)==0;do if((t|0)!=(c[((c[u>>2]&3|0)==2?u:u+-48|0)+40>>2]|0)|e)if(!e){i=yv(u,d)|0;j=i+8|0;if(it(c[j>>2]|0,c[i>>2]|0)|0){k=HX(c[j>>2]|0,c[i>>2]|0)|0;if(!k){dA(0,94653,A)|0;j=1;e=s;break}else e=u;while(1){if(!e)break;F=e+16|0;G=(c[F>>2]|0)+144|0;Nm(w,e,k,0,c[j>>2]|0,c[i>>2]|0);I=w;H=c[I+4>>2]|0;c[G>>2]=c[I>>2];c[G+4>>2]=H;Pm(a,e,c[j>>2]|0,c[i>>2]|0,0);e=c[(c[F>>2]|0)+172>>2]|0}zv(i);j=r;e=s;break}if(!r){ir(v,a);e=jH(a,8,8)|0;dA(0,94737,B)|0;n=+(e|0);o=+g[d>>2];p=+g[x>>2];q=p;if(!(n<=o)&!(n<=p)){m=+g[v>>2];n=+g[y>>2];if(!(!(m<=o)&!(n<=p))){h[D>>3]=m;h[D+8>>3]=n;h[D+16>>3]=o;h[D+24>>3]=q;dA(3,94853,D)|0}}else{c[C>>2]=e;h[C+8>>3]=o;h[C+16>>3]=q;dA(3,94803,C)|0}j=1;e=s}else{j=r;e=s}}else{j=r;e=s}else{if(!f){e=HK(96)|0;c[e+84>>2]=HK(((qB(a)|0)<<5)+11520|0)|0;f=e}else e=s;Hm(f,u,c[(c[z>>2]|0)+248>>2]|0);j=r}while(0);u=WA(a,u)|0;r=j;s=e}t=hC(a,t)|0;e=r;j=s}Av(i);if(f|0){l6(c[f+84>>2]|0);l6(j)}l=E;return e|0}function yv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+16|0;m=p+4|0;n=p;e=c[b>>2]&3;f=c[((e|0)==2?b:b+-48|0)+40>>2]|0;e=c[((e|0)==3?b:b+48|0)+40>>2]|0;q=f+16|0;h=c[(c[q>>2]|0)+212>>2]|0;c[m>>2]=h;i=e+16|0;g=c[(c[i>>2]|0)+212>>2]|0;c[n>>2]=g;k=HK(12)|0;b=h;j=g;if(a[(c[q>>2]|0)+118>>0]|0){b=c[(c[(c[b+16>>2]|0)+140>>2]|0)+48>>2]|0;c[m>>2]=b;f=h;h=b}if(!(a[(c[i>>2]|0)+118>>0]|0))i=j;else{i=c[(c[(c[j+16>>2]|0)+140>>2]|0)+48>>2]|0;c[n>>2]=i;e=g;g=i}h=c[(c[(c[h+16>>2]|0)+140>>2]|0)+44>>2]|0;g=c[(c[(c[g+16>>2]|0)+140>>2]|0)+44>>2]|0;if((h|0)<=(g|0))if((g|0)>(h|0)){Bv(k,g,e,h,n,d);b=c[n>>2]|0;g=b;e=n;o=11}else h=i;else{Bv(k,h,f,g,m,d);b=c[m>>2]|0;f=b;g=e;e=m;o=11}while(1){if((o|0)==11){c[e>>2]=c[(c[(c[b+16>>2]|0)+140>>2]|0)+48>>2];e=g;b=c[m>>2]|0;h=c[n>>2]|0}if((b|0)==(h|0))break;Cv(k,b,0,f,d);Cv(k,h,e,0,d);c[m>>2]=c[(c[(c[b+16>>2]|0)+140>>2]|0)+48>>2];f=b;g=h;e=n;b=h;o=11}Cv(k,h,e,f,d);l=p;return k|0}function zv(a){a=a|0;c[a>>2]=0;return}function Av(a){a=a|0;if(a|0){l6(c[a+8>>2]|0);l6(a)}return}function Bv(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;i=f;while(1){h=c[i>>2]|0;if((b|0)<=(e|0))break;Cv(a,h,d,0,g);b=b+-1|0;i=(c[(c[h+16>>2]|0)+140>>2]|0)+48|0;d=h}c[f>>2]=d;return}function Cv(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=gC(d)|0;while(1){if(!h)break;i=c[h+16>>2]|0;if(!((h|0)==(f|0)|((h|0)==(e|0)?1:(c[i+212>>2]|0)!=(d|0)))?(a[i+118>>0]|0)==0:0)Dv(b,Km(h,g,0)|0);h=hC(d,h)|0}i=d+16|0;d=1;while(1){h=c[i>>2]|0;if((d|0)>(c[h+180>>2]|0))break;h=c[(c[h+184>>2]|0)+(d<<2)>>2]|0;if(!((h|0)==(e|0)|(h|0)==(f|0)))Dv(b,Ev(h,g)|0);d=d+1|0}return}function Dv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;e=a+4|0;f=c[e>>2]|0;g=a+8|0;d=c[g>>2]|0;do if((f|0)==(c[a>>2]|0))if(!d){d=IK(400)|0;c[g>>2]=d;c[e>>2]=100;break}else{c[e>>2]=f<<1;d=KK(d,f<<3)|0;c[g>>2]=d;break}while(0);g=c[a>>2]|0;c[a>>2]=g+1;c[d+(g<<2)>>2]=b;return}function Ev(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0;n=HK(8)|0;b=c[b+16>>2]|0;e=+h[b+16>>3];l=+h[b+24>>3];f=+h[b+32>>3];k=+h[b+40>>3];c[n+4>>2]=4;b=HK(64)|0;c[n>>2]=b;i=+g[d>>2];m=+g[d+4>>2];if(!(a[d+8>>0]|0)){p=(e+f)*.5*(i+-1.0);o=(l+k)*.5*(m+-1.0);j=e*i-p;i=f*i-p;f=k*m-o;e=l*m-o}else{j=e-i;i=f+i;f=k+m;e=l-m}h[b>>3]=j;h[b+8>>3]=e;h[b+16>>3]=j;h[b+24>>3]=f;h[b+32>>3]=i;h[b+40>>3]=f;h[b+48>>3]=i;h[b+56>>3]=e;return n|0}function Fv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+160|0;o=p+16|0;k=p+8|0;g=p;m=p+24|0;n=HK(qB(b)|0)|0;h=b+16|0;f=c[c[(c[h>>2]|0)+140>>2]>>2]|0;a:do if(!f){g=0;f=0}else{j=HB(b)|0;i=c[46965]|0;c[g>>2]=j;c[g+4>>2]=i;i2(m,94913,g)|0;i=LD(b,m,1)|0;RC(i,137786,280,1)|0;j=HK(56)|0;c[(c[i+16>>2]|0)+140>>2]=j;c[j>>2]=f;c[j+4>>2]=c[(c[(c[h>>2]|0)+140>>2]|0)+4>>2];while(1){g=c[f+4>>2]|0;if(!g){g=i;f=1;break a}if(!(a[n+(c[(c[g+16>>2]|0)+120>>2]|0)>>0]|0))Gv(b,g,i,n);f=f+16|0}}while(0);i=0;j=gC(b)|0;while(1){h=(g|0)!=0;if(!j)break;q=c[j+16>>2]|0;if((a[n+(c[q+120>>2]|0)>>0]|0)==0?(a[q+119>>0]|0)==3:0){if(!h){q=HB(b)|0;g=(c[46965]|0)+f|0;c[k>>2]=q;c[k+4>>2]=g;i2(m,94913,k)|0;g=LD(b,m,1)|0;RC(g,137786,280,1)|0;q=HK(56)|0;c[(c[g+16>>2]|0)+140>>2]=q;f=f+1|0}Gv(b,j,g,n);h=1}else h=i;i=h;j=hC(b,j)|0}if(h)IG(g)|0;g=gC(b)|0;while(1){if(!g)break;if(!(a[n+(c[(c[g+16>>2]|0)+120>>2]|0)>>0]|0)){k=HB(b)|0;q=(c[46965]|0)+f|0;c[o>>2]=k;c[o+4>>2]=q;i2(m,94921,o)|0;q=LD(b,m,1)|0;RC(q,137786,280,1)|0;k=HK(56)|0;c[(c[q+16>>2]|0)+140>>2]=k;Gv(b,g,q,n);IG(q)|0;f=f+1|0}g=hC(b,g)|0}l6(n);c[46965]=(c[46965]|0)+f;if(d|0)c[d>>2]=f;if(e|0)c[e>>2]=i;i=HK((f<<2)+4|0)|0;h=i;g=MD(b)|0;while(1){if(!g)break;c[h>>2]=g;h=h+4|0;g=ND(g)|0;f=f+-1|0}if(!f){c[h>>2]=0;l=p;return i|0}else Aa(94929,94940,134,94947);return 0}function Gv(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;a[f+(c[(c[d+16>>2]|0)+120>>2]|0)>>0]=1;lC(e,d,1)|0;i=ZA(b,d)|0;while(1){if(!i)break;h=c[i>>2]&3;g=c[((h|0)==3?i:i+48|0)+40>>2]|0;if((g|0)==(d|0))g=c[((h|0)==2?i:i+-48|0)+40>>2]|0;if(!(a[f+(c[(c[g+16>>2]|0)+120>>2]|0)>>0]|0))Gv(b,g,e,f);i=_A(b,i,d)|0}return}function Hv(a){a=a|0;var b=0;b=IK(24)|0;c[46966]=b;c[b>>2]=Sz(18244,c[4591]|0)|0;c[b+16>>2]=0;c[b+12>>2]=0;c[b+4>>2]=Iv(a)|0;return b|0}function Iv(a){a=a|0;var b=0,d=0;b=IK(16)|0;c[b+12>>2]=0;d=IK(a*20|0)|0;c[b>>2]=d;c[b+8>>2]=d+(a*20|0);c[b+4>>2]=d;return b|0}function Jv(a,b,d){a=a|0;b=b|0;d=d|0;d=Lv(c[46966]|0)|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=0;return d|0}function Kv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=(c[b>>2]|0)-(c[d>>2]|0)|0;if(!a)a=(c[b+4>>2]|0)-(c[d+4>>2]|0)|0;return a|0}function Lv(a){a=a|0;var b=0,d=0,e=0,f=0;f=a+8|0;a=c[f>>2]|0;b=c[a+4>>2]|0;if((b|0)==(c[a+8>>2]|0)){d=a+12|0;e=c[d>>2]|0;if(!e){a=Iv(((b-(c[a>>2]|0)|0)/20|0)<<1)|0;c[d>>2]=a}else a=e;c[f>>2]=a;b=c[a>>2]|0;c[a+4>>2]=b}c[a+4>>2]=b+20;return b|0}function Mv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+12|0;d=c[f>>2]|0;if((d|0)<(b|0)){e=d<<1;e=(e|0)<(b|0)?b:e;b=a+16|0;d=c[b>>2]|0;if(d|0)l6(d);c[b>>2]=IK(e<<3)|0;c[f>>2]=e}return}function Nv(a){a=a|0;var b=0;b=c[a>>2]|0;eb[c[b>>2]&63](b,0,64)|0;c[a+20>>2]=c[a+16>>2];b=c[a+4>>2]|0;c[a+8>>2]=b;c[b+4>>2]=c[b>>2];return}function Ov(a){a=a|0;Oz(c[a>>2]|0)|0;Pv(c[a+4>>2]|0);l6(c[a+16>>2]|0);l6(a);return}function Pv(a){a=a|0;var b=0;while(1){if(!a)break;b=c[a+12>>2]|0;l6(c[a>>2]|0);l6(a);a=b}return}function Qv(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;h=l;l=l+32|0;g=h;i=h+12|0;c[i>>2]=b;c[i+4>>2]=e;j=c[a>>2]|0;i=(eb[c[j>>2]&63](j,i,1)|0)+8|0;c[i>>2]=Rv(a,f,c[i>>2]|0)|0;if((d[195234]|0)>2){j=c[15715]|0;i=HB(f)|0;c[g>>2]=b;c[g+4>>2]=e;c[g+8>>2]=i;z4(j,94957,g)|0}l=h;return}function Rv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=a+20|0;a=c[e>>2]|0;c[e>>2]=a+8;c[a>>2]=b;c[a+4>>2]=d;return a|0}function Sv(a,b){a=a|0;b=b|0;Zz(c[a>>2]|0,b,a)|0;return}function Tv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+32|0;f=e;c[f>>2]=b;c[f+4>>2]=d;d=c[a>>2]|0;d=eb[c[d>>2]&63](d,f,4)|0;l=e;return d|0}function Uv(a){a=a|0;l6(c[a+8>>2]|0);l6(a);return}function Vv(a){a=a|0;return +(+h[a>>3])}function Wv(a){a=a|0;return c[a+8>>2]|0}function Xv(a){a=a|0;return ~~+h[a+16>>3]|0}function Yv(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;b=c[b>>2]|0;if((b|0)>=(c[d>>2]|0)){b=b+10|0;c[d>>2]=b;c[e>>2]=KK(c[e>>2]|0,S(a<<3,b)|0)|0;c[f>>2]=KK(c[f>>2]|0,c[d>>2]<<3)|0;c[g>>2]=KK(c[g>>2]|0,c[d>>2]<<3)|0}return}function Zv(a,b,d,e,f,g,i,j,k,l,m){a=a|0;b=+b;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0.0;h[l>>3]=+h[l>>3]+1.0;a:do if(a|0){q=c[a+16>>2]|0;n=c[a+40>>2]|0;if(n|0)do{Yv(q,f,g,i,j,k);if((Xv(wy(n)|0)|0)!=(e|0)){p=Wv(wy(n)|0)|0;o=0;while(1){if((o|0)>=(q|0))break;h[(c[i>>2]|0)+((S(c[f>>2]|0,q)|0)+o<<3)>>3]=+h[p+(o<<3)>>3];o=o+1|0}r=+Vv(wy(n)|0);h[(c[j>>2]|0)+(c[f>>2]<<3)>>3]=r;r=+Yw(d,p,q);p=c[f>>2]|0;h[(c[k>>2]|0)+(p<<3)>>3]=r;c[f>>2]=p+1}n=xy(n)|0}while((n|0)!=0);p=a+36|0;if(c[p>>2]|0){r=+Yw(c[a+20>>2]|0,d,q);if(!(+h[a+24>>3]=(o|0))break a;Zv(c[(c[p>>2]|0)+(n<<2)>>2]|0,b,d,e,f,g,i,j,k,l,m);n=n+1|0}}Yv(q,f,g,i,j,k);o=c[a+32>>2]|0;p=c[f>>2]|0;m=S(p,q)|0;n=0;while(1){if((n|0)>=(q|0))break;h[(c[i>>2]|0)+(m+n<<3)>>3]=+h[o+(n<<3)>>3];n=n+1|0}h[(c[j>>2]|0)+(p<<3)>>3]=+h[a+8>>3];r=+Yw(o,d,q);j=c[f>>2]|0;h[(c[k>>2]|0)+(j<<3)>>3]=r;c[f>>2]=j+1}}while(0);return}function _v(a,b,d,e,f,g,i,j,k,l,m){a=a|0;b=+b;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0;n=c[a+16>>2]|0;h[l>>3]=0.0;c[f>>2]=0;c[m>>2]=0;c[g>>2]=10;if(!(c[i>>2]|0))c[i>>2]=IK(n*80|0)|0;if(!(c[j>>2]|0))c[j>>2]=IK(c[g>>2]<<3)|0;if(!(c[k>>2]|0))c[k>>2]=IK(c[g>>2]<<3)|0;Zv(a,b,d,e,f,g,i,j,k,l,m);return}function $v(a,b,d,e,f,g,i,j){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=+g;i=i|0;j=j|0;var k=0,l=0,m=0;m=c[a>>2]|0;l=c[a+16>>2]|0;k=0;while(1){if((k|0)==4)break;h[i+(k<<3)>>3]=0.0;k=k+1|0}c[j>>2]=0;l=S(l,m)|0;k=0;while(1){if((k|0)>=(l|0))break;h[b+(k<<3)>>3]=0.0;k=k+1|0}aw(a,a,d,b,e,f,g,i);bw(a,b,i);e=+(m|0);k=0;while(1){if((k|0)==4)break;m=i+(k<<3)|0;h[m>>3]=+h[m>>3]/e;k=k+1|0}return}function aw(a,b,d,e,f,g,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=+g;i=+i;j=j|0;var k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0;a:do if((a|0)!=0&(b|0)!=0){if((c[a>>2]|0)>0?(c[b>>2]|0)>0:0){v=c[a+16>>2]|0;p=c[a+40>>2]|0;u=b+40|0;l=c[u>>2]|0;k=a+32|0;m=b+32|0;r=+Yw(c[k>>2]|0,c[m>>2]|0,v);n=+h[a+24>>3];o=+h[b+24>>3];w=g==-1.0;x=1.0-g;if(n+o>3]=+h[j>>3]+1.0;q=c[k>>2]|0;o=+h[a+8>>3];p=cw(a,v)|0;m=c[m>>2]|0;n=+h[b+8>>3];l=cw(b,v)|0;if(!(r>0.0))Aa(95099,94982,191,95065);o=o*n*i;f=r*r;k=0;while(1){if((k|0)>=(v|0))break a;if(w)n=f;else n=+H(+r,+x);i=o*(+h[q+(k<<3)>>3]-+h[m+(k<<3)>>3])/n;e=p+(k<<3)|0;h[e>>3]=+h[e>>3]+i;e=l+(k<<3)|0;h[e>>3]=+h[e>>3]-i;k=k+1|0}}m=(p|0)!=0;k=(l|0)!=0;t=(a|0)==(b|0);if(m&k){b=j+8|0;l=p;while(1){if(!l)break a;p=Wv(wy(l)|0)|0;g=+Vv(wy(l)|0);q=Xv(wy(l)|0)|0;s=dw(e,q,l,v)|0;m=c[u>>2]|0;while(1){if(!m)break;a=Wv(wy(m)|0)|0;n=+Vv(wy(m)|0);k=Xv(wy(m)|0)|0;j=dw(e,k,m,v)|0;b:do if(!((q|0)==(k|0)|t&(k|0)<(q|0))){h[b>>3]=+h[b>>3]+1.0;r=+Ww(d,v,q,k);o=g*n*i;f=r*r;k=0;while(1){if((k|0)>=(v|0))break b;if(w)n=f;else n=+H(+r,+x);n=o*(+h[p+(k<<3)>>3]-+h[a+(k<<3)>>3])/n;y=s+(k<<3)|0;h[y>>3]=+h[y>>3]+n;y=j+(k<<3)|0;h[y>>3]=+h[y>>3]-n;k=k+1|0}}while(0);m=xy(m)|0}l=xy(l)|0}}q=1<=(q|0))break a;m=c[(c[p>>2]|0)+(l<<2)>>2]|0;k=l;while(1){if((k|0)==(q|0))break;aw(m,c[(c[p>>2]|0)+(k<<2)>>2]|0,d,e,f,g,i,j);k=k+1|0}l=l+1|0}}if(!(m|!(n>o))){k=0;while(1){if((k|0)>=(q|0))break a;aw(c[(c[p>>2]|0)+(k<<2)>>2]|0,b,d,e,f,g,i,j);k=k+1|0}}l=b+36|0;if(!(k|!(o>n))){k=0;while(1){if((k|0)>=(q|0))break a;aw(c[(c[l>>2]|0)+(k<<2)>>2]|0,a,d,e,f,g,i,j);k=k+1|0}}if(!m){k=0;while(1){if((k|0)>=(q|0))break a;aw(c[(c[p>>2]|0)+(k<<2)>>2]|0,b,d,e,f,g,i,j);k=k+1|0}}if(k)Aa(138697,94982,273,95065);else s=0;while(1){if((s|0)>=(q|0))break a;aw(c[(c[l>>2]|0)+(s<<2)>>2]|0,a,d,e,f,g,i,j);s=s+1|0}}Aa(95040,94982,175,95065)}while(0);return}function bw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,l=0,m=0.0,n=0,o=0;e=c[a+40>>2]|0;l=c[a+16>>2]|0;m=+h[a+8>>3];n=cw(a,l)|0;if(!(m>0.0))Aa(94974,94982,289,94993);k=d+16|0;h[k>>3]=+h[k>>3]+1.0;a:do if(!e){k=1<=(k|0))break a;i=c[(c[f>>2]|0)+(e<<2)>>2]|0;if(i|0){if((c[i>>2]|0)<=0)break;j=cw(i,l)|0;g=+h[i+8>>3]/m;a=0;while(1){if((a|0)>=(l|0))break;o=j+(a<<3)|0;h[o>>3]=+h[o>>3]+g*+h[n+(a<<3)>>3];a=a+1|0}bw(i,b,d)}e=e+1|0}Aa(95029,94982,307,94993)}else while(1){if(!e)break a;f=dw(b,Xv(wy(e)|0)|0,e,l)|0;g=+Vv(wy(e)|0)/m;a=0;while(1){if((a|0)>=(l|0))break;o=f+(a<<3)|0;h[o>>3]=+h[o>>3]+g*+h[n+(a<<3)>>3];a=a+1|0}e=xy(e)|0}while(0);return}function cw(a,b){a=a|0;b=b|0;var d=0;d=a+48|0;a=c[d>>2]|0;a:do if(!a){a=IK(b<<3)|0;c[d>>2]=a;d=0;while(1){if((d|0)>=(b|0))break a;h[a+(d<<3)>>3]=0.0;d=d+1|0}}while(0);return a|0}function dw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[(wy(d)|0)+24>>2]|0;if(!f){f=a+((S(e,b)|0)<<3)|0;c[(wy(d)|0)+24>>2]=f;f=c[(wy(d)|0)+24>>2]|0}return f|0}function ew(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0;m=a<<3;k=IK(m)|0;l=IK(m)|0;m=IK(m)|0;if((k|0)!=0&(l|0)!=0&(m|0)!=0){f=0;while(1){if((f|0)>=(a|0)){f=0;break}h[k+(f<<3)>>3]=+h[d+(f<<3)>>3];f=f+1|0}while(1){if((f|0)>=(a|0)){g=1;break}h[l+(f<<3)>>3]=+h[d+(f<<3)>>3];f=f+1|0}while(1){if((g|0)>=(b|0))break;j=S(g,a)|0;f=0;while(1){if((f|0)>=(a|0))break;n=k+(f<<3)|0;i=+h[n>>3];p=d+(f+j<<3)|0;o=+h[p>>3];h[n>>3]=i>3];i=+h[p>>3];h[n>>3]=o>i?o:i;f=f+1|0}g=g+1|0}i=+h[l>>3]-+h[k>>3];f=0;while(1){if((f|0)>=(a|0))break;p=k+(f<<3)|0;n=l+(f<<3)|0;h[m+(f<<3)>>3]=(+h[p>>3]+ +h[n>>3])*.5;o=+h[n>>3]-+h[p>>3];i=i>o?i:o;f=f+1|0}f=fw(a,m,i==0.0?5.2e-06:i*.52,c)|0;a:do if(!e){g=0;while(1){if((g|0)>=(b|0))break a;f=gw(f,d+((S(g,a)|0)<<3)|0,1.0,g)|0;g=g+1|0}}else{g=0;while(1){if((g|0)>=(b|0))break a;p=d+((S(g,a)|0)<<3)|0;f=gw(f,p,+h[e+(g<<3)>>3],g)|0;g=g+1|0}}while(0);l6(k);l6(l);l6(m)}else{l6(k);l6(l);l6(m);f=0}return f|0}function fw(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,g=0,i=0;g=IK(56)|0;c[g+16>>2]=a;c[g>>2]=0;i=IK(a<<3)|0;c[g+20>>2]=i;f=0;while(1){if((f|0)>=(a|0))break;h[i+(f<<3)>>3]=+h[b+(f<<3)>>3];f=f+1|0}if(d>0.0){h[g+24>>3]=d;h[g+8>>3]=0.0;c[g+32>>2]=0;c[g+36>>2]=0;c[g+40>>2]=0;c[g+44>>2]=e;c[g+48>>2]=0;return g|0}else Aa(95197,94982,410,95207);return 0}function gw(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;if(!a)a=0;else hw(a,b,c,d,0)|0;return a|0}function hw(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var g=0,i=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;w=a+16|0;s=c[w>>2]|0;u=c[a+44>>2]|0;r=a+20|0;t=a+24|0;j=c[a>>2]|0;m=a+8|0;x=a+40|0;do if(!j){c[a>>2]=1;h[m>>3]=d;j=IK(s<<3)|0;c[a+32>>2]=j;i=c[w>>2]|0;g=0;while(1){if((g|0)>=(i|0))break;h[j+(g<<3)>>3]=+h[b+(g<<3)>>3];g=g+1|0}g=iw(i,d,b,e)|0;if(!(c[x>>2]|0)){c[x>>2]=ty(g)|0;break}else Aa(95108,94982,502,95116)}else{v=a+36|0;p=a+32|0;o=+h[m>>3]+d;n=j+1|0;if((u|0)<=(f|0)){if(c[v>>2]|0)Aa(95182,94982,541,95116);c[a>>2]=n;h[m>>3]=o;k=+(n|0);l=+(j+2|0);g=0;while(1){if((g|0)>=(s|0))break;q=(c[p>>2]|0)+(g<<3)|0;h[q>>3]=(+h[b+(g<<3)>>3]+ +h[q>>3]*k)/l;g=g+1|0}g=iw(s,d,b,e)|0;i=c[x>>2]|0;if(!i)Aa(95192,94982,547,95116);else{c[x>>2]=vy(i,g)|0;break}}h[m>>3]=o;l=+(j|0);k=+(n|0);g=0;while(1){if((g|0)>=(s|0))break;q=(c[p>>2]|0)+(g<<3)|0;h[q>>3]=(l*+h[q>>3]+ +h[b+(g<<3)>>3])/k;g=g+1|0}q=1<>2]|0)){c[v>>2]=IK(q<<2)|0;g=0;while(1){if((g|0)>=(q|0))break a;c[(c[v>>2]|0)+(g<<2)>>2]=0;g=g+1|0}}while(0);g=c[r>>2]|0;j=jw(s,g,b)|0;if(!((j|0)<(q|0)&(j|0)>-1))Aa(95138,94982,515,95116);i=c[(c[v>>2]|0)+(j<<2)>>2]|0;if(!i){i=kw(c[w>>2]|0,g,+h[t>>3]*.5,u,j)|0;c[(c[v>>2]|0)+(j<<2)>>2]=i;i=c[(c[v>>2]|0)+(j<<2)>>2]|0}p=f+1|0;e=hw(i,b,d,e,p)|0;c[(c[v>>2]|0)+(j<<2)>>2]=e;if(!(c[(c[v>>2]|0)+(j<<2)>>2]|0))Aa(95161,94982,519,95116);g=c[x>>2]|0;do if(g|0){m=Xv(wy(g)|0)|0;if((c[a>>2]|0)!=1)Aa(95172,94982,523,95116);n=Wv(wy(c[x>>2]|0)|0)|0;k=+Vv(wy(c[x>>2]|0)|0);i=c[r>>2]|0;j=jw(s,i,n)|0;if(!((j|0)<(q|0)&(j|0)>-1))Aa(95138,94982,527,95116);g=c[(c[v>>2]|0)+(j<<2)>>2]|0;if(!g){g=kw(c[w>>2]|0,i,+h[t>>3]*.5,u,j)|0;c[(c[v>>2]|0)+(j<<2)>>2]=g;g=c[(c[v>>2]|0)+(j<<2)>>2]|0}w=hw(g,n,k,m,p)|0;c[(c[v>>2]|0)+(j<<2)>>2]=w;if(!(c[(c[v>>2]|0)+(j<<2)>>2]|0))Aa(95161,94982,532,95116);else{uy(c[x>>2]|0,106);c[x>>2]=0;break}}while(0);c[a>>2]=(c[a>>2]|0)+1}while(0);return a|0}function iw(a,b,d,e){a=a|0;b=+b;d=d|0;e=e|0;var f=0,g=0;g=IK(32)|0;h[g>>3]=b;f=IK(a<<3)|0;c[g+8>>2]=f;h[g+16>>3]=+(e|0);e=0;while(1){if((e|0)>=(a|0))break;h[f+(e<<3)>>3]=+h[d+(e<<3)>>3];e=e+1|0}c[g+24>>2]=0;return g|0}function jw(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=0;while(1){d=a+-1|0;if((a|0)<=0)break;a=d;e=!(+h[c+(d<<3)>>3]-+h[b+(d<<3)>>3]<0.0)&1|e<<1}return e|0}function kw(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var g=0,i=0,j=0.0;g=fw(a,b,d,e)|0;i=c[g+20>>2]|0;j=-d;e=0;b=f;while(1){if((e|0)>=(a|0))break;f=i+(e<<3)|0;h[f>>3]=((b&1|0)==0?j:d)+ +h[f>>3];e=e+1|0;b=(b|0)/2|0}return g|0}function lw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if(a|0){b=c[a+16>>2]|0;l6(c[a+20>>2]|0);l6(c[a+32>>2]|0);l6(c[a+48>>2]|0);g=a+36|0;e=c[g>>2]|0;if(e|0){f=1<=(f|0))break;lw(c[b+(d<<2)>>2]|0);d=d+1|0;b=c[g>>2]|0}l6(b)}uy(c[a+40>>2]|0,106);l6(a)}return}function mw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0;a:do if(!a)b=0;else{l=c[a+20>>2]|0;m=c[a+24>>2]|0;d=c[a+8>>2]|0;n=c[a>>2]|0;e=c[a+4>>2]|0;i=a+16|0;if((c[a+32>>2]|0)!=1)Aa(95220,95244,76,95259);b=ow(e,n,d,c[i>>2]|0,1)|0;c[b+8>>2]=d;o=c[b+20>>2]|0;k=c[b+24>>2]|0;d=0;while(1){if((d|0)>(e|0)){d=0;break}c[o+(d<<2)>>2]=0;d=d+1|0}b:while(1){if((d|0)>=(n|0)){d=0;break}f=d+1|0;g=l+(f<<2)|0;d=c[l+(d<<2)>>2]|0;while(1){if((d|0)>=(c[g>>2]|0)){d=f;continue b}j=o+((c[m+(d<<2)>>2]|0)+1<<2)|0;c[j>>2]=(c[j>>2]|0)+1;d=d+1|0}}while(1){if((d|0)>=(e|0))break;j=d+1|0;g=o+(j<<2)|0;c[g>>2]=(c[g>>2]|0)+(c[o+(d<<2)>>2]|0);d=j}d=a+28|0;f=b+28|0;c:do switch(c[i>>2]|0){case 1:{j=c[d>>2]|0;g=c[f>>2]|0;f=0;d:while(1){if((f|0)>=(n|0))break c;a=f+1|0;i=l+(a<<2)|0;d=c[l+(f<<2)>>2]|0;while(1){if((d|0)>=(c[i>>2]|0)){f=a;continue d}r=m+(d<<2)|0;c[k+(c[o+(c[r>>2]<<2)>>2]<<2)>>2]=f;q=+h[j+(d<<3)>>3];r=o+(c[r>>2]<<2)|0;p=c[r>>2]|0;c[r>>2]=p+1;h[g+(p<<3)>>3]=q;d=d+1|0}}}case 2:{j=c[d>>2]|0;g=c[f>>2]|0;f=0;e:while(1){if((f|0)>=(n|0))break c;a=f+1|0;i=l+(a<<2)|0;d=c[l+(f<<2)>>2]|0;while(1){if((d|0)>=(c[i>>2]|0)){f=a;continue e}r=m+(d<<2)|0;c[k+(c[o+(c[r>>2]<<2)>>2]<<2)>>2]=f;t=d<<1;r=o+(c[r>>2]<<2)|0;p=c[r>>2]|0;s=p<<1;h[g+(s<<3)>>3]=+h[j+(t<<3)>>3];h[g+((s|1)<<3)>>3]=+h[j+((t|1)<<3)>>3];c[r>>2]=p+1;d=d+1|0}}}case 4:{j=c[d>>2]|0;g=c[f>>2]|0;f=0;f:while(1){if((f|0)>=(n|0))break c;a=f+1|0;i=l+(a<<2)|0;d=c[l+(f<<2)>>2]|0;while(1){if((d|0)>=(c[i>>2]|0)){f=a;continue f}r=m+(d<<2)|0;c[k+(c[o+(c[r>>2]<<2)>>2]<<2)>>2]=f;s=c[j+(d<<2)>>2]|0;r=o+(c[r>>2]<<2)|0;t=c[r>>2]|0;c[r>>2]=t+1;c[g+(t<<2)>>2]=s;d=d+1|0}}}case 8:{f=0;g:while(1){if((f|0)>=(n|0))break c;g=f+1|0;a=l+(g<<2)|0;d=c[l+(f<<2)>>2]|0;while(1){if((d|0)>=(c[a>>2]|0)){f=g;continue g}s=o+(c[m+(d<<2)>>2]<<2)|0;t=c[s>>2]|0;c[s>>2]=t+1;c[k+(t<<2)>>2]=f;d=d+1|0}}}case 16:{nw(b);b=0;break a}default:{nw(b);b=0;break a}}while(0);while(1){d=e+-1|0;if((e|0)<=0)break;c[o+(e<<2)>>2]=c[o+(d<<2)>>2];e=d}c[o>>2]=0}while(0);return b|0}function nw(a){a=a|0;var b=0;if(a|0){b=c[a+20>>2]|0;if(b|0)l6(b);b=c[a+24>>2]|0;if(b|0)l6(b);l6(c[a+28>>2]|0);l6(a)}return}function ow(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;a=qw(a,b,d,pw(d)|0,e)|0;if((c|0)>0)rw(a,c)|0;return a|0}function pw(a){a=a|0;switch(a|0){case 1:{a=8;break}case 2:{a=16;break}case 4:{a=4;break}case 8:{a=0;break}case 16:{a=0;break}default:a=0}return a|0}function qw(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=IK(44)|0;c[g>>2]=a;c[g+4>>2]=b;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=d;c[g+40>>2]=e;if((f|0)==2)a=0;else a=IK((a<<2)+4|0)|0;c[g+20>>2]=a;c[g+24>>2]=0;c[g+28>>2]=0;c[g+32>>2]=f;c[g+36>>2]=0;return g|0}function rw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=c[a+32>>2]|0;f=a+28|0;c[f>>2]=0;d=b<<2;e=IK(d)|0;if((h|0)!=2){c[a+24>>2]=e;d=c[a+40>>2]|0;if((b|0)!=0&(d|0)>0)g=4}else{c[a+20>>2]=e;c[a+24>>2]=IK(d)|0;d=c[a+40>>2]|0;g=4}if((g|0)==4)c[f>>2]=IK(S(d,b)|0)|0;c[a+12>>2]=b;return a|0}function sw(a,b){a=a|0;b=b|0;if(!(tw(a,b)|0)){b=mw(a)|0;if(!b)b=0;else{a=vw(a,b)|0;nw(b);b=a+36|0;c[b>>2]=c[b>>2]|3;b=a}}else b=uw(a)|0;return b|0} -function NM(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0,P=0;K=l;l=l+304|0;A=K+272|0;z=K+208|0;F=K+96|0;H=K+32|0;I=K+16|0;J=K;r=K+192|0;y=K+176|0;i=K+160|0;B=K+296|0;C=K+288|0;j=c[d>>2]|0;w=c[j>>2]&3;k=j+-48|0;D=c[((w|0)==2?j:k)+40>>2]|0;t=F+16|0;w=(c[(c[((w|0)==3?j:j+48|0)+40>>2]|0)+16>>2]|0)+16|0;x=j+16|0;E=(c[x>>2]|0)+16|0;c[z>>2]=c[w>>2];c[z+4>>2]=c[w+4>>2];c[z+8>>2]=c[w+8>>2];c[z+12>>2]=c[w+12>>2];c[A>>2]=c[E>>2];c[A+4>>2]=c[E+4>>2];c[A+8>>2]=c[E+8>>2];c[A+12>>2]=c[E+12>>2];OM(r,z,A);c[F>>2]=c[r>>2];c[F+4>>2]=c[r+4>>2];c[F+8>>2]=c[r+8>>2];c[F+12>>2]=c[r+12>>2];c[t>>2]=c[r>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2];c[I>>2]=c[r>>2];c[I+4>>2]=c[r+4>>2];c[I+8>>2]=c[r+8>>2];c[I+12>>2]=c[r+12>>2];r=F+32|0;E=F+48|0;w=(c[D+16>>2]|0)+16|0;x=(c[x>>2]|0)+56|0;c[z>>2]=c[w>>2];c[z+4>>2]=c[w+4>>2];c[z+8>>2]=c[w+8>>2];c[z+12>>2]=c[w+12>>2];c[A>>2]=c[x>>2];c[A+4>>2]=c[x+4>>2];c[A+8>>2]=c[x+8>>2];c[A+12>>2]=c[x+12>>2];OM(y,z,A);c[E>>2]=c[y>>2];c[E+4>>2]=c[y+4>>2];c[E+8>>2]=c[y+8>>2];c[E+12>>2]=c[y+12>>2];c[r>>2]=c[y>>2];c[r+4>>2]=c[y+4>>2];c[r+8>>2]=c[y+8>>2];c[r+12>>2]=c[y+12>>2];c[J>>2]=c[y>>2];c[J+4>>2]=c[y+4>>2];c[J+8>>2]=c[y+8>>2];c[J+12>>2]=c[y+12>>2];a:do if((e|0)!=1&(a[195236]|0)==0){m=+h[F>>3];n=+h[E>>3];L=m-n;o=+h[F+8>>3];p=+h[F+56>>3];s=o-p;q=s*s;if(L*L+q<1.0e-06){c[t>>2]=c[F>>2];c[t+4>>2]=c[F+4>>2];c[t+8>>2]=c[F+8>>2];c[t+12>>2]=c[F+12>>2];c[r>>2]=c[E>>2];c[r+4>>2]=c[E+4>>2];c[r+8>>2]=c[E+8>>2];c[r+12>>2]=c[E+12>>2];y=F+24|0;x=F+40|0;n=0.0;m=0.0}else{M=n-m;L=+G(+(M*M+q));w=c[(c[(c[b+60>>2]|0)+16>>2]|0)+248>>2]|0;N=+((S(w,e+-1|0)|0)/2|0|0);q=s*N/L;h[t>>3]=m+q;m=M*N/L;y=F+24|0;h[y>>3]=o+m;h[r>>3]=n+q;x=F+40|0;h[x>>3]=p+m;m=+(0-w|0);n=M*m/L;m=s*m/L}f=(f|0)==6;u=C+4|0;v=B+4|0;j=0;while(1){if((j|0)>=(e|0))break a;w=c[d+(j<<2)>>2]|0;k=w+-48|0;b:do if((c[((c[w>>2]&3|0)==2?w:k)+40>>2]|0)==(D|0)){c[I>>2]=c[F>>2];c[I+4>>2]=c[F+4>>2];c[I+8>>2]=c[F+8>>2];c[I+12>>2]=c[F+12>>2];c[J>>2]=c[E>>2];c[J+4>>2]=c[E+4>>2];c[J+8>>2]=c[E+8>>2];c[J+12>>2]=c[E+12>>2];i=0;while(1){if((i|0)==4)break b;O=H+(i<<4)|0;P=F+(i<<4)|0;c[O>>2]=c[P>>2];c[O+4>>2]=c[P+4>>2];c[O+8>>2]=c[P+8>>2];c[O+12>>2]=c[P+12>>2];i=i+1|0}}else{c[I>>2]=c[E>>2];c[I+4>>2]=c[E+4>>2];c[I+8>>2]=c[E+8>>2];c[I+12>>2]=c[E+12>>2];c[J>>2]=c[F>>2];c[J+4>>2]=c[F+4>>2];c[J+8>>2]=c[F+8>>2];c[J+12>>2]=c[F+12>>2];i=0;while(1){if((i|0)==4)break b;P=H+(3-i<<4)|0;O=F+(i<<4)|0;c[P>>2]=c[O>>2];c[P+4>>2]=c[O+4>>2];c[P+8>>2]=c[O+8>>2];c[P+12>>2]=c[O+12>>2];i=i+1|0}}while(0);if(f){c[u>>2]=4;c[C>>2]=z;i=0;while(1){if((i|0)==4)break;P=z+(i<<4)|0;O=H+(i<<4)|0;c[P>>2]=c[O>>2];c[P+4>>2]=c[O+4>>2];c[P+8>>2]=c[O+8>>2];c[P+12>>2]=c[O+12>>2];i=i+1|0}c[A>>2]=c[C>>2];c[A+4>>2]=c[C+4>>2];DY(A,B);bO(w,c[((c[w>>2]&3|0)==2?w:k)+40>>2]|0,c[B>>2]|0,c[v>>2]|0,g)}else bO(w,c[((c[w>>2]&3|0)==2?w:k)+40>>2]|0,H,4,g);c[z>>2]=c[I>>2];c[z+4>>2]=c[I+4>>2];c[z+8>>2]=c[I+8>>2];c[z+12>>2]=c[I+12>>2];c[A>>2]=c[J>>2];c[A+4>>2]=c[J+4>>2];c[A+8>>2]=c[J+8>>2];c[A+12>>2]=c[J+12>>2];wO(b,w,z,A);h[t>>3]=m+ +h[t>>3];h[y>>3]=n+ +h[y>>3];h[r>>3]=m+ +h[r>>3];h[x>>3]=n+ +h[x>>3];j=j+1|0}}else{if((f|0)==4){PM(i,b);c[A>>2]=c[i>>2];c[A+4>>2]=c[i+4>>2];c[A+8>>2]=c[i+8>>2];c[A+12>>2]=c[i+12>>2];QM(F,A)}bO(j,c[((c[j>>2]&3|0)==2?j:k)+40>>2]|0,F,4,g);c[z>>2]=c[I>>2];c[z+4>>2]=c[I+4>>2];c[z+8>>2]=c[I+8>>2];c[z+12>>2]=c[I+12>>2];c[A>>2]=c[J>>2];c[A+4>>2]=c[J+4>>2];c[A+8>>2]=c[J+8>>2];c[A+12>>2]=c[J+12>>2];wO(b,j,z,A)}while(0);l=K;return}function OM(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=d;return}function PM(a,b){a=a|0;b=b|0;b=c[b+16>>2]|0;h[23326]=(+h[b+16>>3]+ +h[b+32>>3])*.5;h[23327]=(+h[b+24>>3]+ +h[b+40>>3])*.5;c[a>>2]=c[46652];c[a+4>>2]=c[46653];c[a+8>>2]=c[46654];c[a+12>>2]=c[46655];return}function QM(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0,g=0.0,i=0.0;g=+h[a>>3];d=+h[a+48>>3];i=(g+d)*.5;f=+h[a+8>>3];c=+h[a+56>>3];e=(f+c)*.5;g=d-g;f=c-f;f=+G(+(g*g+f*f))/5.0;g=+h[b>>3]-i;c=+h[b+8>>3]-e;d=+G(+(g*g+c*c));if(!(d==0.0)){g=i-f*(g/d);i=e-f*(c/d);h[a+32>>3]=g;h[a+16>>3]=g;h[a+40>>3]=i;h[a+24>>3]=i}return}function RM(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0.0,K=0.0,L=0.0;I=l;l=l+208|0;t=I+192|0;s=I+176|0;F=I+48|0;w=I+16|0;x=I;B=I+160|0;C=I+144|0;u=I+128|0;v=I+32|0;i=e&2130706432;D=(e&8|0)==0?((i|0)==0?4:i):8;if((D|0)==436207616)SM(a,b,d,f);else{H=HK((d<<6)+64|0)|0;E=d+-1|0;q=w+8|0;r=x+8|0;A=12.0;e=0;while(1){if((e|0)>=(d|0))break;g=b+(e<<4)|0;c[w>>2]=c[g>>2];c[w+4>>2]=c[g+4>>2];c[w+8>>2]=c[g+8>>2];c[w+12>>2]=c[g+12>>2];g=e+1|0;if((e|0)<(E|0)){p=b+(g<<4)|0;c[x>>2]=c[p>>2];c[x+4>>2]=c[p+4>>2];c[x+8>>2]=c[p+8>>2];c[x+12>>2]=c[p+12>>2]}else{c[x>>2]=c[b>>2];c[x+4>>2]=c[b+4>>2];c[x+8>>2]=c[b+8>>2];c[x+12>>2]=c[b+12>>2]}y=+h[x>>3]-+h[w>>3];z=+h[r>>3]-+h[q>>3];z=+G(+(y*y+z*z))/3.0;A=A=(d|0))break;m=b+(e<<4)|0;c[w>>2]=c[m>>2];c[w+4>>2]=c[m+4>>2];c[w+8>>2]=c[m+8>>2];c[w+12>>2]=c[m+12>>2];m=e+1|0;if((e|0)<(E|0)){e=b+(m<<4)|0;c[x>>2]=c[e>>2];c[x+4>>2]=c[e+4>>2];c[x+8>>2]=c[e+8>>2];c[x+12>>2]=c[e+12>>2]}else{c[x>>2]=c[b>>2];c[x+4>>2]=c[b+4>>2];c[x+8>>2]=c[b+8>>2];c[x+12>>2]=c[b+12>>2]}z=+h[x>>3]-+h[w>>3];y=+h[r>>3]-+h[q>>3];y=A/+G(+(z*z+y*y));y=n?y/3.0:j?y*.5:y;z=y*.5;if(o){c[s>>2]=c[w>>2];c[s+4>>2]=c[w+4>>2];c[s+8>>2]=c[w+8>>2];c[s+12>>2]=c[w+12>>2];c[t>>2]=c[x>>2];c[t+4>>2]=c[x+4>>2];c[t+8>>2]=c[x+8>>2];c[t+12>>2]=c[x+12>>2];TM(B,z,s,t);c[g>>2]=c[B>>2];c[g+4>>2]=c[B+4>>2];c[g+8>>2]=c[B+8>>2];c[g+12>>2]=c[B+12>>2]}else{c[g>>2]=c[w>>2];c[g+4>>2]=c[w+4>>2];c[g+8>>2]=c[w+8>>2];c[g+12>>2]=c[w+12>>2]};c[s>>2]=c[w>>2];c[s+4>>2]=c[w+4>>2];c[s+8>>2]=c[w+8>>2];c[s+12>>2]=c[w+12>>2];c[t>>2]=c[x>>2];c[t+4>>2]=c[x+4>>2];c[t+8>>2]=c[x+8>>2];c[t+12>>2]=c[x+12>>2];TM(C,y,s,t);c[k>>2]=c[C>>2];c[k+4>>2]=c[C+4>>2];c[k+8>>2]=c[C+8>>2];c[k+12>>2]=c[C+12>>2];e=i+3|0;c[s>>2]=c[w>>2];c[s+4>>2]=c[w+4>>2];c[s+8>>2]=c[w+8>>2];c[s+12>>2]=c[w+12>>2];c[t>>2]=c[x>>2];c[t+4>>2]=c[x+4>>2];c[t+8>>2]=c[x+8>>2];c[t+12>>2]=c[x+12>>2];TM(u,1.0-y,s,t);c[p>>2]=c[u>>2];c[p+4>>2]=c[u+4>>2];c[p+8>>2]=c[u+8>>2];c[p+12>>2]=c[u+12>>2];if(!o){i=e;e=m;continue}e=H+(e<<4)|0;c[s>>2]=c[w>>2];c[s+4>>2]=c[w+4>>2];c[s+8>>2]=c[w+8>>2];c[s+12>>2]=c[w+12>>2];c[t>>2]=c[x>>2];c[t+4>>2]=c[x+4>>2];c[t+8>>2]=c[x+8>>2];c[t+12>>2]=c[x+12>>2];TM(v,1.0-z,s,t);c[e>>2]=c[v>>2];c[e+4>>2]=c[v+4>>2];c[e+8>>2]=c[v+8>>2];c[e+12>>2]=c[v+12>>2];i=i+4|0;e=m}c[g>>2]=c[H>>2];c[g+4>>2]=c[H+4>>2];c[g+8>>2]=c[H+8>>2];c[g+12>>2]=c[H+12>>2];v=H+16|0;c[k>>2]=c[v>>2];c[k+4>>2]=c[v+4>>2];c[k+8>>2]=c[v+8>>2];c[k+12>>2]=c[v+12>>2];x=H+32|0;c[p>>2]=c[x>>2];c[p+4>>2]=c[x+4>>2];c[p+8>>2]=c[x+8>>2];c[p+12>>2]=c[x+12>>2];g=d+4|0;t=d+3|0;i=d<<4;u=d+1|0;j=g<<4;k=(d|0)==4;w=d+2|0;m=d+12|0;n=w<<4;o=d+5|0;p=u<<4;q=t<<4;r=m<<4;s=o<<4;e=D&2147483647;a:do if((e|0)<201326592){if((e|0)>=83886080){if((e|0)<134217728){if((e|0)<100663296){switch(e|0){case 83886080:break;default:break a}if(k){d=HK(192)|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];p=d+16|0;t=b+16|0;c[p>>2]=c[t>>2];c[p+4>>2]=c[t+4>>2];c[p+8>>2]=c[t+8>>2];c[p+12>>2]=c[t+12>>2];p=H+48|0;L=+h[p>>3];t=H+64|0;L=L+(+h[t>>3]-L);o=d+32|0;h[o>>3]=L;q=H+56|0;z=+h[q>>3];r=H+72|0;z=z+(+h[r>>3]-z);C=d+40|0;h[C>>3]=z;A=L+(+h[p>>3]-+h[x>>3]);u=d+48|0;h[u>>3]=A;K=z+(+h[q>>3]-+h[H+40>>3]);x=d+56|0;h[x>>3]=K;y=A+(+h[t>>3]-+h[p>>3]);p=d+64|0;h[p>>3]=y;J=K+(+h[r>>3]-+h[q>>3]);q=d+72|0;h[q>>3]=J;r=d+80|0;h[r>>3]=y+(L-A);h[d+88>>3]=J+(z-K);t=H+96|0;K=+h[t>>3];v=H+80|0;K=K+(+h[v>>3]-K);E=d+144|0;h[E>>3]=K;w=H+104|0;z=+h[w>>3];s=H+88|0;z=z+(+h[s>>3]-z);h[d+152>>3]=z;J=K+(+h[t>>3]-+h[H+112>>3]);B=d+128|0;h[B>>3]=J;A=z+(+h[w>>3]-+h[H+120>>3]);D=d+136|0;h[D>>3]=A;L=J+(+h[v>>3]-+h[t>>3]);t=d+112|0;h[t>>3]=L;y=A+(+h[s>>3]-+h[w>>3]);w=d+120|0;h[w>>3]=y;s=d+96|0;h[s>>3]=L+(K-J);v=d+104|0;h[v>>3]=y+(z-A);n=d+160|0;m=b+32|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];n=d+176|0;b=b+48|0;c[n>>2]=c[b>>2];c[n+4>>2]=c[b+4>>2];c[n+8>>2]=c[b+8>>2];c[n+12>>2]=c[b+12>>2];lS(a,d,12,f);c[F>>2]=c[o>>2];c[F+4>>2]=c[o+4>>2];c[F+8>>2]=c[o+8>>2];c[F+12>>2]=c[o+12>>2];A=+h[o>>3];z=+h[u>>3];A=A-(z-A);u=F+16|0;h[u>>3]=A;y=+h[C>>3];J=+h[x>>3];y=y-(J-y);x=F+24|0;h[x>>3]=y;C=F+32|0;h[C>>3]=A+(+h[p>>3]-z);b=F+40|0;h[b>>3]=y+(+h[q>>3]-J);f=F+48|0;c[f>>2]=c[r>>2];c[f+4>>2]=c[r+4>>2];c[f+8>>2]=c[r+8>>2];c[f+12>>2]=c[r+12>>2];oS(a,F,4);c[F>>2]=c[s>>2];c[F+4>>2]=c[s+4>>2];c[F+8>>2]=c[s+8>>2];c[F+12>>2]=c[s+12>>2];J=+h[s>>3];y=+h[t>>3];J=J-(y-J);h[u>>3]=J;z=+h[v>>3];A=+h[w>>3];z=z-(A-z);h[x>>3]=z;h[C>>3]=J+(+h[B>>3]-y);h[b>>3]=z+(+h[D>>3]-A);c[f>>2]=c[E>>2];c[f+4>>2]=c[E+4>>2];c[f+8>>2]=c[E+8>>2];c[f+12>>2]=c[E+12>>2];oS(a,F,4);l6(d);break}else Aa(105739,105750,737,105759)}if((e|0)<117440512){switch(e|0){case 100663296:break;default:break a}d=HK(s)|0;C=b+16|0;L=+h[C>>3];J=+h[b>>3]-L;J=J*.125+(L+J*.5);h[d>>3]=J;D=b+40|0;L=+h[D>>3];E=b+24|0;v=H+48|0;w=H+56|0;B=H+72|0;L=L+(+h[E>>3]-L)*.5+(+h[w>>3]-+h[B>>3])*3.0*.5;h[d+8>>3]=L;A=+h[C>>3];K=+h[b>>3]-A;K=A+K*.5-K*.25;h[d+16>>3]=K;h[d+24>>3]=L;h[d+32>>3]=K;A=+h[D>>3];h[d+40>>3]=A+(+h[E>>3]-A)*.5;K=K+(+h[x>>3]-+h[v>>3])*.5;h[d+48>>3]=K;A=+h[D>>3];h[d+56>>3]=A+(+h[E>>3]-A)*.5;h[d+64>>3]=K;K=+h[D>>3];K=K+(+h[E>>3]-K)*.5+(+h[w>>3]-+h[B>>3]);h[d+72>>3]=K;h[d+80>>3]=J;h[d+88>>3]=K;h[d+96>>3]=J;K=K-(+h[w>>3]-+h[B>>3])*.25;h[d+104>>3]=K;h[d+112>>3]=J+(+h[x>>3]-+h[v>>3]);h[d+120>>3]=K+(+h[w>>3]-+h[B>>3])*.5;h[d+128>>3]=+h[d>>3];h[d+136>>3]=L+(+h[w>>3]-+h[B>>3])*.25;lS(a,d,o,f);h[F>>3]=+h[C>>3];L=+h[D>>3];h[F+8>>3]=L+(+h[E>>3]-L)*.5;h[F+16>>3]=+h[b>>3];h[F+24>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}else{switch(e|0){case 117440512:break;default:break a}d=HK(p)|0;h[d>>3]=+h[v>>3];E=H+56|0;F=H+72|0;h[d+8>>3]=+h[H+24>>3]-(+h[E>>3]-+h[F>>3])*.5;h[d+16>>3]=+h[H+48>>3];L=+h[E>>3];h[d+24>>3]=L-(L-+h[F>>3])*.5;h[d+32>>3]=+h[b+32>>3];D=b+40|0;h[d+40>>3]=+h[D>>3]+(+h[E>>3]-+h[F>>3])*.5;h[d+48>>3]=+h[v>>3];h[d+56>>3]=+h[D>>3]+(+h[E>>3]-+h[F>>3])*.5;L=+h[b+8>>3];h[d+72>>3]=L-(L-+h[b+56>>3])*.5;h[d+64>>3]=+h[b>>3];lS(a,d,u,f);l6(d);break}}if((e|0)<167772160)if((e|0)<150994944){switch(e|0){case 134217728:break;default:break a}d=HK(j)|0;C=b+16|0;A=+h[C>>3];B=H+48|0;A=A+(+h[b>>3]-A)*.5+(+h[x>>3]-+h[B>>3])*.25;h[d>>3]=A;D=b+40|0;L=+h[D>>3];E=b+24|0;L=L+(+h[E>>3]-L)*.5;h[d+8>>3]=L;h[d+16>>3]=A;v=H+56|0;w=H+72|0;J=L+(+h[v>>3]-+h[w>>3])*.5;h[d+24>>3]=J;A=A+(+h[x>>3]-+h[B>>3])*.5;h[d+32>>3]=A;h[d+40>>3]=J;h[d+48>>3]=A;A=J+(+h[v>>3]-+h[w>>3])*.5;h[d+56>>3]=A;K=+h[C>>3];K=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[B>>3])*3.0*.25;h[d+64>>3]=K;h[d+72>>3]=A;h[d+80>>3]=K;h[d+88>>3]=J;K=+h[C>>3];K=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[B>>3])*.25;h[d+96>>3]=K;h[d+104>>3]=J;h[d+112>>3]=K;h[d+120>>3]=L;lS(a,d,g,f);h[F>>3]=+h[C>>3];L=+h[D>>3];h[F+8>>3]=L+(+h[E>>3]-L)*.5;h[F+16>>3]=+h[b>>3];h[F+24>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}else{switch(e|0){case 150994944:break;default:break a}d=HK(n)|0;C=b+16|0;J=+h[C>>3];B=H+48|0;J=J+(+h[b>>3]-J)*.5+(+h[x>>3]-+h[B>>3])*3.0*.25;h[d>>3]=J;D=b+40|0;L=+h[D>>3];E=b+24|0;L=L+(+h[E>>3]-L)*.5;h[d+8>>3]=L;h[d+16>>3]=J;u=H+56|0;v=H+72|0;J=L+(+h[u>>3]-+h[v>>3])*.25;h[d+24>>3]=J;K=+h[C>>3];h[d+32>>3]=K+(+h[b>>3]-K)*.5+(+h[x>>3]-+h[B>>3])*.25;K=J+(+h[u>>3]-+h[v>>3])*.5;h[d+40>>3]=K;A=+h[C>>3];h[d+48>>3]=A+(+h[b>>3]-A)*.5-(+h[x>>3]-+h[B>>3])*.25;h[d+56>>3]=K;K=+h[C>>3];K=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[B>>3])*3.0*.25;h[d+64>>3]=K;h[d+72>>3]=J;h[d+80>>3]=K;h[d+88>>3]=L;lS(a,d,w,f);h[F>>3]=+h[C>>3];L=+h[D>>3];h[F+8>>3]=L+(+h[E>>3]-L)*.5;h[F+16>>3]=+h[b>>3];h[F+24>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}else if((e|0)<184549376){switch(e|0){case 167772160:break;default:break a}d=HK(p)|0;C=b+16|0;J=+h[C>>3];v=H+48|0;J=J+(+h[b>>3]-J)*.5+(+h[x>>3]-+h[v>>3]);h[d>>3]=J;D=b+40|0;L=+h[D>>3];E=b+24|0;w=H+56|0;B=H+72|0;L=L+(+h[E>>3]-L)*.5+(+h[w>>3]-+h[B>>3])*.25;h[d+8>>3]=L;J=J-(+h[x>>3]-+h[v>>3]);h[d+16>>3]=J;h[d+24>>3]=L+(+h[w>>3]-+h[B>>3]);h[d+32>>3]=J;J=L+(+h[w>>3]-+h[B>>3])*.5;h[d+40>>3]=J;A=+h[C>>3];K=+h[b>>3]-A;K=A+K*.5-K*.25;h[d+48>>3]=K;h[d+56>>3]=J;h[d+64>>3]=K;h[d+72>>3]=L;lS(a,d,u,f);h[F>>3]=+h[C>>3];L=+h[D>>3];h[F+8>>3]=L+(+h[E>>3]-L)*.5;h[F+16>>3]=+h[b>>3];h[F+24>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}else{switch(e|0){case 184549376:break;default:break a}d=HK(j)|0;B=b+16|0;J=+h[B>>3];K=+h[b>>3]-J;u=H+48|0;K=K*.125+(J+K*.5)+(+h[x>>3]-+h[u>>3])*.5;h[d>>3]=K;v=b+40|0;J=+h[v>>3];w=b+24|0;E=H+56|0;C=H+72|0;J=J+(+h[w>>3]-J)*.5+(+h[E>>3]-+h[C>>3])*.25;h[d+8>>3]=J;A=+h[B>>3];L=+h[b>>3]-A;L=A+L*.5-L*.125;h[d+16>>3]=L;h[d+24>>3]=J;h[d+32>>3]=L;J=J+(+h[E>>3]-+h[C>>3])*.5;h[d+40>>3]=J;L=L-(+h[x>>3]-+h[u>>3])*.5;h[d+48>>3]=L;h[d+56>>3]=J;D=d+64|0;h[D>>3]=L;L=+h[v>>3];L=L+(+h[w>>3]-L)*.5-(+h[E>>3]-+h[C>>3])*.25;h[d+72>>3]=L;J=K-(+h[x>>3]-+h[u>>3])*.5;h[d+80>>3]=J;h[d+88>>3]=L;h[d+96>>3]=J;L=L-(+h[E>>3]-+h[C>>3])*.5;h[d+104>>3]=L;x=d+112|0;h[x>>3]=K;h[d+120>>3]=L;lS(a,d,g,f);h[F>>3]=+h[B>>3];L=+h[v>>3];B=F+8|0;h[B>>3]=L+(+h[w>>3]-L)*.5;C=F+16|0;h[C>>3]=+h[D>>3];D=b+8|0;E=b+56|0;f=F+24|0;h[f>>3]=L+(+h[D>>3]-+h[E>>3])*.5;oS(a,F,2);h[F>>3]=+h[x>>3];L=+h[v>>3];h[B>>3]=L+(+h[w>>3]-L)*.5;h[C>>3]=+h[b>>3];h[f>>3]=L+(+h[D>>3]-+h[E>>3])*.5;oS(a,F,2);l6(d);break}}if((e|0)<33554432){if((e|0)<8){switch(e|0){case 4:break;default:break a}i=IK((d*96|0)+32|0)|0;e=0;g=0;while(1){j=g|1;k=i+(g<<4)|0;m=i+(j<<4)|0;if((e|0)>=(d|0))break;b=e<<2;E=H+(b<<4)|0;c[k>>2]=c[E>>2];c[k+4>>2]=c[E+4>>2];c[k+8>>2]=c[E+8>>2];c[k+12>>2]=c[E+12>>2];E=H+((b|1)<<4)|0;c[m>>2]=c[E>>2];c[m+4>>2]=c[E+4>>2];c[m+8>>2]=c[E+8>>2];c[m+12>>2]=c[E+12>>2];F=i+(g+2<<4)|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];F=i+(g+3<<4)|0;E=H+((b|2)<<4)|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];F=i+(g+4<<4)|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];F=i+(g+5<<4)|0;b=H+((b|3)<<4)|0;c[F>>2]=c[b>>2];c[F+4>>2]=c[b+4>>2];c[F+8>>2]=c[b+8>>2];c[F+12>>2]=c[b+12>>2];e=e+1|0;g=g+6|0}c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];d=i+16|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];nS(a,d,j,0,0,f&255);l6(i);break}if((e|0)<16777216){switch(e|0){case 8:break;default:break a}lS(a,b,d,f);g=F+16|0;e=0;while(1){if((e|0)>=(d|0))break a;f=e*3|0;b=H+(f+2<<4)|0;c[F>>2]=c[b>>2];c[F+4>>2]=c[b+4>>2];c[F+8>>2]=c[b+8>>2];c[F+12>>2]=c[b+12>>2];f=H+(f+4<<4)|0;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];oS(a,F,2);e=e+1|0}}switch(e|0){case 16777216:break;default:break a}g=HK(p)|0;e=1;while(1){if((e|0)>=(d|0))break;D=g+(e<<4)|0;C=b+(e<<4)|0;c[D>>2]=c[C>>2];c[D+4>>2]=c[C+4>>2];c[D+8>>2]=c[C+8>>2];c[D+12>>2]=c[C+12>>2];e=e+1|0}b=E*3|0;E=H+(b+4<<4)|0;c[g>>2]=c[E>>2];c[g+4>>2]=c[E+4>>2];c[g+8>>2]=c[E+8>>2];c[g+12>>2]=c[E+12>>2];D=g+(d<<4)|0;d=H+(b+2<<4)|0;c[D>>2]=c[d>>2];c[D+4>>2]=c[d+4>>2];c[D+8>>2]=c[d+8>>2];c[D+12>>2]=c[d+12>>2];lS(a,g,u,f);l6(g);c[F>>2]=c[d>>2];c[F+4>>2]=c[d+4>>2];c[F+8>>2]=c[d+8>>2];c[F+12>>2]=c[d+12>>2];f=F+16|0;c[f>>2]=c[E>>2];c[f+4>>2]=c[E+4>>2];c[f+8>>2]=c[E+8>>2];c[f+12>>2]=c[E+12>>2];b=b+3|0;d=F+32|0;h[d>>3]=+h[f>>3]+(+h[F>>3]-+h[H+(b<<4)>>3]);h[F+40>>3]=+h[F+24>>3]+(+h[F+8>>3]-+h[H+(b<<4)+8>>3]);oS(a,f,2);c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];oS(a,F,2);break}else{if((e|0)<50331648){switch(e|0){case 33554432:break;default:break a}g=HK(n)|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];i=g+16|0;c[i>>2]=c[x>>2];c[i+4>>2]=c[x+4>>2];c[i+8>>2]=c[x+8>>2];c[i+12>>2]=c[x+12>>2];i=H+48|0;E=H+64|0;h[g+32>>3]=+h[x>>3]+(+h[i>>3]-+h[E>>3])/3.0;d=H+56|0;e=H+72|0;h[g+40>>3]=+h[H+40>>3]+(+h[d>>3]-+h[e>>3])/3.0;L=+h[i>>3];h[g+48>>3]=L+(L-+h[E>>3])/3.0;L=+h[d>>3];h[g+56>>3]=L+(L-+h[e>>3])/3.0;e=4;while(1){if((e|0)>=(w|0))break;d=g+(e<<4)|0;E=b+(e+-2<<4)|0;c[d>>2]=c[E>>2];c[d+4>>2]=c[E+4>>2];c[d+8>>2]=c[E+8>>2];c[d+12>>2]=c[E+12>>2];e=e+1|0}lS(a,g,w,f);l6(g);c[F>>2]=c[i>>2];c[F+4>>2]=c[i+4>>2];c[F+8>>2]=c[i+8>>2];c[F+12>>2]=c[i+12>>2];f=F+16|0;c[f>>2]=c[x>>2];c[f+4>>2]=c[x+4>>2];c[f+8>>2]=c[x+8>>2];c[f+12>>2]=c[x+12>>2];oS(a,F,2);break}if((e|0)>=67108864){switch(e|0){case 67108864:break;default:break a}if(k){D=HK(n)|0;c[D>>2]=c[b>>2];c[D+4>>2]=c[b+4>>2];c[D+8>>2]=c[b+8>>2];c[D+12>>2]=c[b+12>>2];d=D+16|0;c[d>>2]=c[x>>2];c[d+4>>2]=c[x+4>>2];c[d+8>>2]=c[x+8>>2];c[d+12>>2]=c[x+12>>2];d=D+32|0;E=H+64|0;c[d>>2]=c[E>>2];c[d+4>>2]=c[E+4>>2];c[d+8>>2]=c[E+8>>2];c[d+12>>2]=c[E+12>>2];d=D+48|0;b=b+32|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];b=D+64|0;d=H+128|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];b=D+80|0;C=H+160|0;c[b>>2]=c[C>>2];c[b+4>>2]=c[C+4>>2];c[b+8>>2]=c[C+8>>2];c[b+12>>2]=c[C+12>>2];lS(a,D,w,f);l6(D);h[F>>3]=+h[v>>3]+(+h[H+176>>3]-+h[H>>3]);h[F+8>>3]=+h[H+24>>3]+(+h[H+184>>3]-+h[H+8>>3]);f=F+16|0;c[f>>2]=c[E>>2];c[f+4>>2]=c[E+4>>2];c[f+8>>2]=c[E+8>>2];c[f+12>>2]=c[E+12>>2];oS(a,F,2);c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];oS(a,F,2);c[f>>2]=c[H>>2];c[f+4>>2]=c[H+4>>2];c[f+8>>2]=c[H+8>>2];c[f+12>>2]=c[H+12>>2];oS(a,F,2);break}else Aa(105739,105750,714,105759)}switch(e|0){case 50331648:break;default:break a}g=HK(q)|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];L=+h[b>>3];h[g+16>>3]=L-(L-+h[v>>3])*.25;e=H+56|0;L=+h[b+8>>3]+(+h[e>>3]-+h[H+72>>3])/3.0;h[g+24>>3]=L;K=+h[b>>3];h[g+32>>3]=K-(K-+h[v>>3])*2.0;h[g+40>>3]=L;L=+h[b>>3];h[g+48>>3]=L-(L-+h[v>>3])*2.25;h[g+56>>3]=+h[e>>3];h[g+64>>3]=+h[H+48>>3];h[g+72>>3]=+h[e>>3];e=4;while(1){if((e|0)>=(t|0))break;d=g+(e<<4)|0;F=b+(e+-3<<4)|0;c[d>>2]=c[F>>2];c[d+4>>2]=c[F+4>>2];c[d+8>>2]=c[F+8>>2];c[d+12>>2]=c[F+12>>2];e=e+1|0}lS(a,g,t,f);l6(g);break}}else if((e|0)<318767104){if((e|0)<251658240){if((e|0)<218103808){switch(e|0){case 201326592:break;default:break a}E=HK(i)|0;u=b+16|0;L=+h[u>>3];h[E>>3]=L;C=b+40|0;K=+h[C>>3];D=b+24|0;B=H+48|0;v=H+56|0;w=H+72|0;K=K+(+h[D>>3]-K)*.5+(+h[v>>3]-+h[w>>3])*.125;h[E+8>>3]=K;J=L+(+h[x>>3]-+h[B>>3])*2.0;h[E+16>>3]=J;h[E+24>>3]=K;h[E+32>>3]=J;K=K+(+h[v>>3]-+h[w>>3])*.5;h[E+40>>3]=K;h[E+48>>3]=L;h[E+56>>3]=K;lS(a,E,d,f);l6(E);E=HK(i)|0;K=+h[u>>3]+(+h[x>>3]-+h[B>>3]);h[E>>3]=K;L=+h[C>>3];L=L+(+h[D>>3]-L)*.5-(+h[v>>3]-+h[w>>3])*5.0*.125;h[E+8>>3]=L;J=K+(+h[x>>3]-+h[B>>3]);B=E+16|0;h[B>>3]=J;h[E+24>>3]=L;h[E+32>>3]=J;L=L+(+h[v>>3]-+h[w>>3])*.5;h[E+40>>3]=L;h[E+48>>3]=K;h[E+56>>3]=L;lS(a,E,d,f);h[F>>3]=+h[B>>3];L=+h[C>>3];h[F+8>>3]=L+(+h[D>>3]-L)*.5;h[F+16>>3]=+h[b>>3];h[F+24>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(E);break}if((e|0)<234881024){switch(e|0){case 218103808:break;default:break a}E=HK(i)|0;L=+h[b>>3];h[E>>3]=L;B=b+40|0;K=+h[B>>3];C=b+24|0;w=H+56|0;D=H+72|0;K=K+(+h[C>>3]-K)*.5+(+h[w>>3]-+h[D>>3])*.125;h[E+8>>3]=K;h[E+16>>3]=L;J=K+(+h[w>>3]-+h[D>>3])*.5;h[E+24>>3]=J;L=L-(+h[w>>3]-+h[D>>3])*2.0;h[E+32>>3]=L;h[E+40>>3]=J;h[E+48>>3]=L;h[E+56>>3]=K;lS(a,E,d,f);l6(E);E=HK(i)|0;K=+h[b>>3]-(+h[x>>3]-+h[H+48>>3]);h[E>>3]=K;L=+h[B>>3];L=L+(+h[C>>3]-L)*.5-(+h[w>>3]-+h[D>>3])*5.0*.125;h[E+8>>3]=L;h[E+16>>3]=K;J=L+(+h[w>>3]-+h[D>>3])*.5;h[E+24>>3]=J;K=K-(+h[w>>3]-+h[D>>3]);h[E+32>>3]=K;h[E+40>>3]=J;D=E+48|0;h[D>>3]=K;h[E+56>>3]=L;lS(a,E,d,f);h[F>>3]=+h[b+16>>3];L=+h[B>>3];h[F+8>>3]=L+(+h[C>>3]-L)*.5;h[F+16>>3]=+h[D>>3];h[F+24>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(E);break}else{switch(e|0){case 234881024:break;default:break a}E=HK(i)|0;t=b+16|0;K=+h[t>>3];u=H+48|0;K=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[u>>3])*9.0*.125;h[E>>3]=K;v=b+40|0;L=+h[v>>3];w=b+24|0;D=H+56|0;C=H+72|0;L=L+(+h[w>>3]-L)*.5+(+h[D>>3]-+h[C>>3])*.125;h[E+8>>3]=L;J=K+(+h[x>>3]-+h[u>>3]);h[E+16>>3]=J;h[E+24>>3]=L;h[E+32>>3]=J;L=L+(+h[D>>3]-+h[C>>3])*.5;h[E+40>>3]=L;h[E+48>>3]=K;h[E+56>>3]=L;lS(a,E,d,f);l6(E);E=HK(i)|0;L=+h[t>>3];L=L+(+h[b>>3]-L)*.5-(+h[x>>3]-+h[u>>3])*9.0*.125;h[E>>3]=L;K=+h[v>>3];K=K+(+h[w>>3]-K)*.5-(+h[D>>3]-+h[C>>3])*5.0*.125;h[E+8>>3]=K;J=L+(+h[x>>3]-+h[u>>3]);h[E+16>>3]=J;h[E+24>>3]=K;h[E+32>>3]=J;K=K+(+h[D>>3]-+h[C>>3])*.5;h[E+40>>3]=K;h[E+48>>3]=L;h[E+56>>3]=K;lS(a,E,d,f);l6(E);E=HK(i)|0;K=+h[t>>3];K=K+(+h[b>>3]-K)*.5+(+h[x>>3]-+h[u>>3])*.125;h[E>>3]=K;L=+h[v>>3];L=L+(+h[w>>3]-L)*.5-(+h[D>>3]-+h[C>>3])*5.0*.125;h[E+8>>3]=L;J=K+(+h[x>>3]-+h[u>>3]);h[E+16>>3]=J;h[E+24>>3]=L;h[E+32>>3]=J;L=L+(+h[D>>3]-+h[C>>3])*.5;h[E+40>>3]=L;h[E+48>>3]=K;h[E+56>>3]=L;lS(a,E,d,f);l6(E);E=HK(i)|0;L=+h[t>>3];L=L+(+h[b>>3]-L)*.5+(+h[x>>3]-+h[u>>3])*.125;h[E>>3]=L;K=+h[v>>3];K=K+(+h[w>>3]-K)*.5+(+h[D>>3]-+h[C>>3])*.125;h[E+8>>3]=K;J=L+(+h[x>>3]-+h[u>>3]);B=E+16|0;h[B>>3]=J;h[E+24>>3]=K;h[E+32>>3]=J;K=K+(+h[D>>3]-+h[C>>3])*.5;h[E+40>>3]=K;h[E+48>>3]=L;h[E+56>>3]=K;lS(a,E,d,f);h[F>>3]=+h[B>>3];K=+h[v>>3];B=F+8|0;h[B>>3]=K+(+h[w>>3]-K)*.5;C=F+16|0;h[C>>3]=+h[b>>3];D=b+8|0;d=b+56|0;f=F+24|0;h[f>>3]=K+(+h[D>>3]-+h[d>>3])*.5;oS(a,F,2);K=+h[t>>3];h[F>>3]=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[u>>3])*9.0*.125;L=+h[v>>3];h[B>>3]=L+(+h[w>>3]-L)*.5;h[C>>3]=K;h[f>>3]=L+(+h[D>>3]-+h[d>>3])*.5;oS(a,F,2);l6(E);break}}if((e|0)<285212672)if((e|0)<268435456){switch(e|0){case 251658240:break;default:break a}E=HK(i)|0;u=b+16|0;L=+h[u>>3];B=H+48|0;L=L+(+h[b>>3]-L)*.5-(+h[x>>3]-+h[B>>3]);h[E>>3]=L;v=b+40|0;K=+h[v>>3];w=b+24|0;D=H+56|0;C=H+72|0;K=K+(+h[w>>3]-K)*.5+(+h[D>>3]-+h[C>>3])*.125;h[E+8>>3]=K;J=L+(+h[x>>3]-+h[B>>3])*2.0;h[E+16>>3]=J;h[E+24>>3]=K;h[E+32>>3]=J;K=K+(+h[D>>3]-+h[C>>3])*.5;h[E+40>>3]=K;h[E+48>>3]=L;h[E+56>>3]=K;lS(a,E,d,f);l6(E);E=HK(i)|0;K=+h[u>>3];K=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[B>>3]);h[E>>3]=K;L=+h[v>>3];L=L+(+h[w>>3]-L)*.5-(+h[D>>3]-+h[C>>3])*5.0*.125;h[E+8>>3]=L;J=K+(+h[x>>3]-+h[B>>3])*2.0;B=E+16|0;h[B>>3]=J;h[E+24>>3]=L;h[E+32>>3]=J;L=L+(+h[D>>3]-+h[C>>3])*.5;h[E+40>>3]=L;h[E+48>>3]=K;h[E+56>>3]=L;lS(a,E,d,f);h[F>>3]=+h[B>>3];L=+h[v>>3];B=F+8|0;h[B>>3]=L+(+h[w>>3]-L)*.5;C=F+16|0;h[C>>3]=+h[b>>3];D=b+8|0;d=b+56|0;f=F+24|0;h[f>>3]=L+(+h[D>>3]-+h[d>>3])*.5;oS(a,F,2);h[F>>3]=+h[u>>3];L=+h[v>>3];h[B>>3]=L+(+h[w>>3]-L)*.5;h[C>>3]=+h[E>>3];h[f>>3]=L+(+h[D>>3]-+h[d>>3])*.5;oS(a,F,2);l6(E);break}else{switch(e|0){case 268435456:break;default:break a}E=HK(i)|0;h[E>>3]=+h[b>>3];u=H+48|0;B=H+56|0;C=H+72|0;h[E+8>>3]=+h[H+24>>3]-(+h[B>>3]-+h[C>>3])*.5;h[E+16>>3]=+h[u>>3];L=+h[B>>3];h[E+24>>3]=L-(L-+h[C>>3])*.5;h[E+32>>3]=+h[b+32>>3];w=b+40|0;h[E+40>>3]=+h[w>>3]+(+h[B>>3]-+h[C>>3])*.5;h[E+48>>3]=+h[b>>3];h[E+56>>3]=+h[w>>3]+(+h[B>>3]-+h[C>>3])*.5;lS(a,E,d,f);v=b+16|0;L=(+h[x>>3]-+h[u>>3])*.25;K=+h[v>>3]+L;h[F>>3]=K;A=+h[w>>3];t=b+24|0;J=+h[B>>3]-+h[C>>3];A=A+(+h[t>>3]-A)*.5+J*.125;D=F+8|0;h[D>>3]=A;d=F+16|0;h[d>>3]=K+L;f=F+24|0;h[f>>3]=A-J*.25;oS(a,F,2);J=(+h[x>>3]-+h[u>>3])*.25;A=+h[v>>3]+J;h[F>>3]=A;L=+h[w>>3];K=+h[B>>3]-+h[C>>3];L=L+(+h[t>>3]-L)*.5-K*.125;h[D>>3]=L;h[d>>3]=A+J;h[f>>3]=L+K*.25;oS(a,F,2);K=(+h[x>>3]-+h[u>>3])*.25;h[F>>3]=+h[v>>3]+K;L=+h[w>>3]+(+h[B>>3]-+h[C>>3])*3.0*.25;h[D>>3]=L;h[d>>3]=+h[b>>3]-K;h[f>>3]=L;oS(a,F,2);l6(E);break}else if((e|0)<301989888){switch(e|0){case 285212672:break;default:break a}B=HK(i)|0;u=b+16|0;z=+h[u>>3];C=H+48|0;z=z+(+h[b>>3]-z)*.5+(+h[x>>3]-+h[C>>3])*.5;h[B>>3]=z;v=b+40|0;A=+h[v>>3];w=b+24|0;A=A+(+h[w>>3]-A)*.5+(+h[x>>3]-+h[C>>3])*.5;h[B+8>>3]=A;h[B+16>>3]=z;z=+h[v>>3];L=(+h[x>>3]-+h[C>>3])*.5;z=z+(+h[w>>3]-z)*.5-L;h[B+24>>3]=z;J=+h[u>>3];L=J+(+h[b>>3]-J)*.5-L;h[B+32>>3]=L;h[B+40>>3]=z;h[B+48>>3]=L;h[B+56>>3]=A;lS(a,B,d,f);l6(B);A=+h[u>>3];A=A+(+h[b>>3]-A)*.5;L=(+h[x>>3]-+h[C>>3])*3.0*.25;z=A+L;h[F>>3]=z;J=+h[v>>3];J=J+(+h[w>>3]-J)*.5;K=J+L;B=F+8|0;h[B>>3]=K;D=F+16|0;h[D>>3]=z;J=J-L;f=F+24|0;h[f>>3]=J;L=A-L;h[F+32>>3]=L;h[F+40>>3]=J;h[F+48>>3]=L;h[F+56>>3]=K;E=F+64|0;c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];oS(a,F,5);K=+h[u>>3];L=+h[b>>3];h[F>>3]=K+(L-K)*.5+(+h[x>>3]-+h[C>>3])*3.0*.25;K=+h[v>>3];h[B>>3]=K+(+h[w>>3]-K)*.5;h[D>>3]=L;E=b+8|0;d=b+56|0;h[f>>3]=K+(+h[E>>3]-+h[d>>3])*.5;oS(a,F,2);K=+h[u>>3];h[F>>3]=K;L=+h[v>>3];h[B>>3]=L+(+h[w>>3]-L)*.5;h[D>>3]=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[C>>3])*3.0*.25;h[f>>3]=L+(+h[E>>3]-+h[d>>3])*.5;oS(a,F,2);break}else{switch(e|0){case 301989888:break;default:break a}d=HK(r)|0;w=b+16|0;y=+h[w>>3];s=H+48|0;y=y+(+h[b>>3]-y)*.5+(+h[x>>3]-+h[s>>3])*.25;h[d>>3]=y;B=b+40|0;A=+h[B>>3];C=b+24|0;u=H+56|0;v=H+72|0;A=A+(+h[C>>3]-A)*.5+(+h[u>>3]-+h[v>>3])*.5;t=d+8|0;h[t>>3]=A;h[d+16>>3]=y;A=A+(+h[u>>3]-+h[v>>3])*.125;E=d+24|0;h[E>>3]=A;J=y-(+h[x>>3]-+h[s>>3])*.125;D=d+32|0;h[D>>3]=J;z=A+(+h[u>>3]-+h[v>>3])*.125;h[d+40>>3]=z;h[d+48>>3]=y;L=z+(+h[u>>3]-+h[v>>3])*.125;h[d+56>>3]=L;h[d+64>>3]=y;y=L+(+h[u>>3]-+h[v>>3])*.125;h[d+72>>3]=y;h[d+80>>3]=J;h[d+88>>3]=y;J=+h[w>>3];J=J+(+h[b>>3]-J)*.5;h[d+96>>3]=J;h[d+104>>3]=L;K=J-(+h[x>>3]-+h[s>>3])*.125;h[d+112>>3]=K;h[d+120>>3]=y;K=K-(+h[x>>3]-+h[s>>3])*.125;h[d+128>>3]=K;h[d+136>>3]=y;h[d+144>>3]=K;h[d+152>>3]=L;L=K+(+h[x>>3]-+h[s>>3])*.125;h[d+160>>3]=L;h[d+168>>3]=z;h[d+176>>3]=K;h[d+184>>3]=A;h[d+192>>3]=K;K=+h[t>>3];h[d+200>>3]=K;h[d+208>>3]=L;h[d+216>>3]=K;x=d+224|0;h[x>>3]=J;h[d+232>>3]=+h[E>>3];h[d+240>>3]=+h[D>>3];h[d+248>>3]=K;lS(a,d,m,f);K=+h[x>>3];h[F>>3]=K;J=+h[B>>3];J=J+(+h[C>>3]-J)*.5;D=F+8|0;h[D>>3]=J;E=F+16|0;h[E>>3]=K;f=F+24|0;h[f>>3]=J+(+h[u>>3]-+h[v>>3])*.125;oS(a,F,2);J=+h[x>>3];h[F>>3]=J;K=+h[B>>3];L=+h[u>>3]-+h[v>>3];K=K+(+h[C>>3]-K)*.5+L*.25;h[D>>3]=K;h[E>>3]=J;h[f>>3]=K+L*.125;oS(a,F,2);h[F>>3]=+h[w>>3];L=+h[B>>3];h[D>>3]=L+(+h[C>>3]-L)*.5;h[E>>3]=+h[b>>3];h[f>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}}else{if((e|0)<369098752){if((e|0)<335544320){switch(e|0){case 318767104:break;default:break a}d=HK(j)|0;w=b+16|0;J=+h[w>>3];D=H+48|0;J=J+(+h[b>>3]-J)*.5+(+h[x>>3]-+h[D>>3])*.125;h[d>>3]=J;B=b+40|0;K=+h[B>>3];C=b+24|0;u=H+56|0;v=H+72|0;K=K+(+h[C>>3]-K)*.5+(+h[u>>3]-+h[v>>3])*.5;h[d+8>>3]=K;z=J+(+h[x>>3]-+h[D>>3])*.125;h[d+16>>3]=z;L=K+(+h[u>>3]-+h[v>>3])*.125;h[d+24>>3]=L;h[d+32>>3]=z;z=L+(+h[u>>3]-+h[v>>3])*.25;h[d+40>>3]=z;h[d+48>>3]=J;A=z+(+h[u>>3]-+h[v>>3])*.125;h[d+56>>3]=A;J=J-(+h[x>>3]-+h[D>>3])*.25;h[d+64>>3]=J;h[d+72>>3]=A;A=J-(+h[x>>3]-+h[D>>3])*.125;h[d+80>>3]=A;h[d+88>>3]=z;h[d+96>>3]=A;h[d+104>>3]=L;h[d+112>>3]=J;h[d+120>>3]=K;lS(a,d,g,f);K=+h[w>>3];K=K+(+h[b>>3]-K)*.5;h[F>>3]=K;J=+h[B>>3];J=J+(+h[C>>3]-J)*.5;D=F+8|0;h[D>>3]=J;E=F+16|0;h[E>>3]=K;f=F+24|0;h[f>>3]=J+(+h[u>>3]-+h[v>>3])*.125;oS(a,F,2);J=+h[w>>3];J=J+(+h[b>>3]-J)*.5;h[F>>3]=J;K=+h[B>>3];L=+h[u>>3]-+h[v>>3];K=K+(+h[C>>3]-K)*.5+L*.25;h[D>>3]=K;h[E>>3]=J;h[f>>3]=K+L*.125;oS(a,F,2);h[F>>3]=+h[w>>3];L=+h[B>>3];h[D>>3]=L+(+h[C>>3]-L)*.5;h[E>>3]=+h[b>>3];h[f>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}if((e|0)<352321536){switch(e|0){case 335544320:break;default:break a}d=HK(r)|0;B=b+16|0;y=+h[B>>3];u=H+48|0;y=y+(+h[b>>3]-y)*.5+(+h[x>>3]-+h[u>>3])*.25;h[d>>3]=y;C=b+40|0;A=+h[C>>3];D=b+24|0;s=H+56|0;t=H+72|0;A=A+(+h[D>>3]-A)*.5+(+h[s>>3]-+h[t>>3])*.5;E=d+8|0;h[E>>3]=A;h[d+16>>3]=y;A=A+(+h[s>>3]-+h[t>>3])*.125;v=d+24|0;h[v>>3]=A;K=y-(+h[x>>3]-+h[u>>3])*.125;w=d+32|0;h[w>>3]=K;z=A+(+h[s>>3]-+h[t>>3])*.125;h[d+40>>3]=z;h[d+48>>3]=y;J=z+(+h[s>>3]-+h[t>>3])*.125;h[d+56>>3]=J;h[d+64>>3]=y;y=J+(+h[s>>3]-+h[t>>3])*.125;h[d+72>>3]=y;h[d+80>>3]=K;h[d+88>>3]=y;K=+h[B>>3];K=K+(+h[b>>3]-K)*.5;h[d+96>>3]=K;h[d+104>>3]=J;L=K-(+h[x>>3]-+h[u>>3])*.125;h[d+112>>3]=L;h[d+120>>3]=y;L=L-(+h[x>>3]-+h[u>>3])*.125;h[d+128>>3]=L;h[d+136>>3]=y;h[d+144>>3]=L;h[d+152>>3]=J;J=L+(+h[x>>3]-+h[u>>3])*.125;h[d+160>>3]=J;h[d+168>>3]=z;h[d+176>>3]=L;h[d+184>>3]=A;h[d+192>>3]=L;L=+h[E>>3];h[d+200>>3]=L;h[d+208>>3]=J;h[d+216>>3]=L;E=d+224|0;h[E>>3]=K;h[d+232>>3]=+h[v>>3];h[d+240>>3]=+h[w>>3];h[d+248>>3]=L;lS(a,d,m,f);c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];E=F+16|0;h[E>>3]=+h[F>>3];L=+h[C>>3];f=F+24|0;h[f>>3]=L+(+h[D>>3]-L)*.5;oS(a,F,2);h[F>>3]=+h[B>>3];L=+h[C>>3];h[F+8>>3]=L+(+h[D>>3]-L)*.5;h[E>>3]=+h[b>>3];h[f>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}else{switch(e|0){case 352321536:break;default:break a}d=HK(j)|0;w=b+16|0;K=+h[w>>3];D=H+48|0;K=K+(+h[b>>3]-K)*.5+(+h[x>>3]-+h[D>>3])*.125;h[d>>3]=K;B=b+40|0;L=+h[B>>3];C=b+24|0;u=H+56|0;v=H+72|0;L=L+(+h[C>>3]-L)*.5+(+h[u>>3]-+h[v>>3])*.5;E=d+8|0;h[E>>3]=L;z=K+(+h[x>>3]-+h[D>>3])*.125;h[d+16>>3]=z;J=L+(+h[u>>3]-+h[v>>3])*.125;h[d+24>>3]=J;h[d+32>>3]=z;z=J+(+h[u>>3]-+h[v>>3])*.25;h[d+40>>3]=z;h[d+48>>3]=K;A=z+(+h[u>>3]-+h[v>>3])*.125;h[d+56>>3]=A;K=K-(+h[x>>3]-+h[D>>3])*.25;h[d+64>>3]=K;h[d+72>>3]=A;A=K-(+h[x>>3]-+h[D>>3])*.125;h[d+80>>3]=A;h[d+88>>3]=z;h[d+96>>3]=A;h[d+104>>3]=J;h[d+112>>3]=K;h[d+120>>3]=L;lS(a,d,g,f);L=+h[w>>3];L=L+(+h[b>>3]-L)*.5;h[F>>3]=L;D=F+8|0;h[D>>3]=+h[E>>3];E=F+16|0;h[E>>3]=L;L=+h[B>>3];f=F+24|0;h[f>>3]=L+(+h[C>>3]-L)*.5;oS(a,F,2);h[F>>3]=+h[w>>3];L=+h[B>>3];h[D>>3]=L+(+h[C>>3]-L)*.5;h[E>>3]=+h[b>>3];h[f>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}}if((e|0)<402653184)if((e|0)<385875968){switch(e|0){case 369098752:break;default:break a}d=HK(s)|0;F=H+48|0;h[d>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;E=H+56|0;D=H+72|0;h[d+8>>3]=+h[H+24>>3]-(+h[E>>3]-+h[D>>3])*.5;h[d+16>>3]=+h[F>>3];L=+h[E>>3];h[d+24>>3]=L-(L-+h[D>>3])*.5;h[d+32>>3]=+h[b+32>>3];C=b+40|0;h[d+40>>3]=+h[C>>3];L=+h[x>>3];h[d+48>>3]=L+(L-+h[F>>3])*.5;h[d+56>>3]=+h[C>>3];L=+h[x>>3];h[d+64>>3]=L+(L-+h[F>>3])*.5;h[d+72>>3]=+h[C>>3]+(+h[E>>3]-+h[D>>3])*.5;h[d+80>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;h[d+88>>3]=+h[C>>3]+(+h[E>>3]-+h[D>>3])*.5;h[d+96>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;D=b+56|0;h[d+104>>3]=+h[D>>3];E=b+8|0;L=+h[E>>3];h[d+120>>3]=L-(L-+h[D>>3])*.5;h[d+112>>3]=+h[b>>3];h[d+136>>3]=+h[E>>3];h[d+128>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;lS(a,d,o,f);l6(d);break}else{switch(e|0){case 385875968:break;default:break a}d=HK(q)|0;F=H+48|0;h[d>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;E=H+56|0;D=H+72|0;h[d+8>>3]=+h[H+24>>3]-(+h[E>>3]-+h[D>>3])*.5;h[d+16>>3]=+h[F>>3];L=+h[E>>3];h[d+24>>3]=L-(L-+h[D>>3])*.5;h[d+32>>3]=+h[b+32>>3];C=b+40|0;h[d+40>>3]=+h[C>>3]+(+h[E>>3]-+h[D>>3])*.5;h[d+48>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;h[d+56>>3]=+h[C>>3]+(+h[E>>3]-+h[D>>3])*.5;h[d+64>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;D=b+56|0;h[d+72>>3]=+h[D>>3];E=b+8|0;L=+h[E>>3];h[d+88>>3]=L-(L-+h[D>>3])*.5;h[d+80>>3]=+h[b>>3];h[d+104>>3]=+h[E>>3];h[d+96>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;lS(a,d,t,f);l6(d);break}else if((e|0)<419430400){switch(e|0){case 402653184:break;default:break a}d=HK(q)|0;h[d>>3]=+h[b>>3];C=b+8|0;D=H+48|0;E=H+56|0;F=H+72|0;h[d+8>>3]=+h[C>>3]-(+h[E>>3]-+h[F>>3])*.5;L=+h[x>>3];h[d+16>>3]=L+(L-+h[D>>3])*.5;h[d+24>>3]=+h[C>>3]-(+h[E>>3]-+h[F>>3])*.5;L=+h[x>>3];h[d+32>>3]=L+(L-+h[D>>3])*.5;h[d+40>>3]=+h[H+40>>3];h[d+48>>3]=+h[b+16>>3];L=+h[b+24>>3];C=b+40|0;h[d+56>>3]=L-(L-+h[C>>3])*.5;L=+h[x>>3];h[d+64>>3]=L+(L-+h[D>>3])*.5;h[d+72>>3]=+h[C>>3];h[d+88>>3]=+h[C>>3]+(+h[E>>3]-+h[F>>3])*.5;L=+h[x>>3];h[d+80>>3]=L+(L-+h[D>>3])*.5;h[d+104>>3]=+h[b+56>>3]+(+h[E>>3]-+h[F>>3])*.5;h[d+96>>3]=+h[b>>3];lS(a,d,t,f);l6(d);break}else{switch(e|0){case 419430400:break;default:break a}d=HK(s)|0;h[d>>3]=+h[b>>3];F=b+8|0;E=H+48|0;C=H+56|0;D=H+72|0;h[d+8>>3]=+h[F>>3]-(+h[C>>3]-+h[D>>3])*.5;L=+h[x>>3];h[d+16>>3]=L+(L-+h[E>>3])*.5;h[d+24>>3]=+h[F>>3]-(+h[C>>3]-+h[D>>3])*.5;L=+h[x>>3];h[d+32>>3]=L+(L-+h[E>>3])*.5;h[d+40>>3]=+h[H+40>>3];h[d+48>>3]=+h[b+16>>3];L=+h[b+24>>3];F=b+40|0;h[d+56>>3]=L-(L-+h[F>>3])*.5;L=+h[x>>3];h[d+64>>3]=L+(L-+h[E>>3])*.5;h[d+72>>3]=+h[F>>3];h[d+88>>3]=+h[F>>3]+(+h[C>>3]-+h[D>>3])*.5;L=+h[x>>3];h[d+80>>3]=L+(L-+h[E>>3])*.5;F=b+56|0;h[d+104>>3]=+h[F>>3]+(+h[C>>3]-+h[D>>3])*.5;h[d+96>>3]=+h[v>>3]-(+h[x>>3]-+h[E>>3])*.5;h[d+112>>3]=+h[v>>3]-(+h[x>>3]-+h[E>>3])*.5;h[d+120>>3]=+h[F>>3];h[d+128>>3]=+h[b+48>>3];h[d+136>>3]=+h[F>>3];lS(a,d,o,f);l6(d);break}}while(0);l6(H)}l=I;return}function SM(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0;f=l;l=l+112|0;g=f;k=+h[b+8>>3];k=k+k;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];h[g+16>>3]=+h[b+16>>3];h[g+24>>3]=k-+h[b+24>>3];h[g+32>>3]=+h[b+32>>3];h[g+40>>3]=k-+h[b+40>>3];h[g+48>>3]=+h[b+48>>3];h[g+56>>3]=k-+h[b+56>>3];h[g+64>>3]=+h[b+64>>3];h[g+72>>3]=k-+h[b+72>>3];h[g+80>>3]=+h[b+80>>3];h[g+88>>3]=k-+h[b+88>>3];i=g+96|0;j=b+96|0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];nS(a,b,d,0,0,e&255);nS(a,g,7,0,0,0);l=f;return}function TM(a,b,c,d){a=a|0;b=+b;c=c|0;d=d|0;var e=0.0,f=0.0;f=+h[c>>3];e=+h[c+8>>3];e=e+(+h[d+8>>3]-e)*b;h[a>>3]=f+(+h[d>>3]-f)*b;h[a+8>>3]=e;return}function UM(a){a=a|0;a=c[(c[a+16>>2]|0)+8>>2]|0;if(a){a=c[c[a+4>>2]>>2]|0;if((a|0)!=91)if((a|0)==94)a=2;else return ((a|0)==93?3:(a|0)==96?4:0)|0;else a=1}else a=0;return a|0}function VM(b){b=b|0;var d=0.0,e=0,f=0.0,g=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,H=0,K=0,L=0,M=0,N=0,P=0,Q=0.0,R=0.0,T=0,U=0,V=0.0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0.0;ca=l;l=l+144|0;K=ca+112|0;N=ca+104|0;D=ca+96|0;E=ca+88|0;j=ca+80|0;$=ca+64|0;aa=ca+48|0;T=ca+40|0;U=ca+32|0;o=ca+24|0;x=ca+16|0;B=ca+136|0;A=ca+128|0;L=ca;ba=HK(48)|0;Z=b+16|0;P=c[(c[(c[Z>>2]|0)+8>>2]|0)+8>>2]|0;i=(P|0)==1664;_=c[P>>2]|0;e=c[P+4>>2]|0;g=c[P+8>>2]|0;f=+h[P+16>>3];k=+h[P+32>>3];m=+h[P+24>>3];_=(bP(NA(b,105812)|0)|0)&255|_;P=(_|0)!=0;do if(!i){if(!P){Y=c[Z>>2]|0;d=+h[Y+32>>3]*72.0;r=+h[Y+40>>3]*72.0;r=+(~~(r+(r>=0.0?.5:-.5))|0);d=+(~~(d+(d>=0.0?.5:-.5))|0);break}d=+dN(b);if(d>0.0)r=d;else{Y=c[Z>>2]|0;r=+h[Y+32>>3];d=+h[Y+40>>3];d=(r=0.0?.5:-.5))|0);r=d}}else{r=0.0;d=0.0}while(0);Y=XO(b,c[47222]|0,e,0)|0;X=f+ +YO(b,c[47224]|0,0.0,-360.0);if(!g){W=+YO(b,c[47225]|0,0.0,-100.0);H=XO(b,c[47221]|0,4,0)|0;V=+YO(b,c[47226]|0,0.0,-100.0)}else{H=g;W=k;V=m}e=c[(c[Z>>2]|0)+104>>2]|0;C=e+24|0;c[$>>2]=c[C>>2];c[$+4>>2]=c[C+4>>2];c[$+8>>2]=c[C+8>>2];c[$+12>>2]=c[C+12>>2];n=+h[$>>3];C=$+8|0;if(n>0.0)if(i)k=n;else M=11;else if(i|!(+h[C>>3]>0.0))k=n;else M=11;if((M|0)==11){e=NA(b,105797)|0;f=n+16.0;do if(e){h[x>>3]=0.0;h[o>>3]=0.0;c[j>>2]=o;c[j+4>>2]=x;e=q4(e,105804,j)|0;k=+h[o>>3];if(k<0.0){h[o>>3]=0.0;k=0.0}m=+h[x>>3];if(m<0.0){h[x>>3]=0.0;m=0.0}if((e|0)<=0){h[$>>3]=f;k=8.0;break}k=k*72.0;k=+(~~(k+(k>=0.0?.5:-.5))<<1|0);f=n+k;h[$>>3]=f;if((e|0)!=1){k=m*72.0;k=+(~~(k+(k>=0.0?.5:-.5))<<1|0)}}else{h[$>>3]=f;k=8.0}while(0);h[C>>3]=k+ +h[C>>3];e=c[(c[Z>>2]|0)+104>>2]|0;k=f}q=k-+h[e+24>>3];f=+h[c[(c[(uC(b)|0)+16>>2]|0)+8>>2]>>3];if(f>0.0){Q=f*72.0;Q=+(~~(Q+(Q>=0.0?.5:-.5))|0);R=+eN(k,Q);h[$>>3]=R;h[C>>3]=+eN(+h[C>>3],Q)}else R=k;e=c[(c[Z>>2]|0)+8>>2]|0;do if(!(a[e+12>>0]|0)){g=NA(b,109326)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0){PF(A,uC(b)|0,g);e=c[A>>2]|0;i=c[A+4>>2]|0;if((i&e|0)==-1){e=HB(b)|0;c[D>>2]=g;c[D+4>>2]=e;dA(0,105888,D)|0;g=0;e=0;break}else{a[(c[(uC(b)|0)+16>>2]|0)+114>>0]=1;g=e+2|0;e=i+2|0;break}}else{g=0;e=0}}else{e=c[e>>2]|0;if((a[e>>0]|0)==99?(f2(e,105820)|0)==0:0){g=NA(b,105827)|0;PF(B,uC(b)|0,g);e=c[B>>2]|0;i=c[B+4>>2]|0;if((i&e|0)==-1){e=HB(b)|0;c[E>>2]=g|0?g:105837;c[E+4>>2]=e;dA(0,105843,E)|0;g=0;e=0;break}else{a[(c[(uC(b)|0)+16>>2]|0)+114>>0]=1;g=e+2|0;e=i+2|0;break}}else{g=0;e=0}}while(0);Q=+(g|0);h[aa>>3]=R>Q?R:Q;Q=+h[C>>3];p=+(e|0);A=aa+8|0;h[A>>3]=Q>p?Q:p;e=(H|0)<3&(V!=0.0|W!=0.0)?120:H;g=NA(b,105929)|0;if(!g)i=99;else{i=a[g>>0]|0;i=i<<24>>24==116?116:i<<24>>24==98?98:99}g=c[Z>>2]|0;a[(c[g+104>>2]|0)+80>>0]=i;if((e|0)==4)if((V==0.0?((~~(X+(X>=0.0?.5:-.5))|0)%90|0|0)==0:0)&W==0.0){n=4.0;o=1}else{n=4.0;M=40}else{n=+(e|0);M=40}do if((M|0)==40){g=c[(c[(c[g+8>>2]|0)+8>>2]|0)+44>>2]|0;if(g|0){o=c[g>>2]|0;c[K>>2]=c[aa>>2];c[K+4>>2]=c[aa+4>>2];c[K+8>>2]=c[aa+8>>2];c[K+12>>2]=c[aa+12>>2];lb[o&63](L,K);c[aa>>2]=c[L>>2];c[aa+4>>2]=c[L+4>>2];c[aa+8>>2]=c[L+8>>2];c[aa+12>>2]=c[L+12>>2];o=0;break}f=+h[A>>3];k=f*1.4142135623730951;if(r>k&i<<24>>24==99){m=f/r;m=+G(+(1.0/(1.0-m*m)));m=m*+h[aa>>3];h[aa>>3]=m}else{m=+h[aa>>3]*1.4142135623730951;h[aa>>3]=m;h[A>>3]=k;f=k}if((e|0)>2){z=+I(+(3.141592653589793/n));h[aa>>3]=m/z;h[A>>3]=f/z;o=0}else o=0}while(0);k=+h[A>>3];g=_O(b,c[47227]|0,137609)|0;x=ba+40|0;if((a[g>>0]|0)==115?(f2(g,108531)|0)==0:0){h[aa>>3]=d;h[A>>3]=r;c[x>>2]=c[x>>2]|2048;f=r}else{if(!((bP(g)|0)<<24>>24)){f=+h[aa>>3];d=d>f?d:f;h[aa>>3]=d;f=+h[A>>3];f=r>f?r:f}else{M=c[(c[Z>>2]|0)+104>>2]|0;if(!(!(d<+h[M+24>>3])?!(r<+h[M+32>>3]):0)){L=HB(b)|0;M=HB(uC(b)|0)|0;c[N>>2]=L;c[N+4>>2]=M;dA(0,105938,N)|0}h[aa>>3]=d;f=r}h[A>>3]=f}if(P){y=d>f?d:f;h[A>>3]=y;h[aa>>3]=y;z=y}else{z=f;y=d}d=R-q;do if(!((bP(_O(b,c[47218]|0,137609)|0)|0)<<24>>24)){if(o){d=+h[(R>+h[aa>>3]?$:aa)>>3]-q;break}f=+h[A>>3];if(Q>3]*+G(+(1.0-Q*Q/(f*f)));d=(R>d?R:d)-q}}while(0);g=c[(c[Z>>2]|0)+104>>2]|0;h[g+40>>3]=d;if(!(c[x>>2]&2048)){w=+h[A>>3]-k;h[g+48>>3]=Q+(Q1;g=j?Y:1;a:do if((e|0)<3){g=HK(g<<5)|0;f=+h[aa>>3]*.5;d=+h[A>>3]*.5;h[g>>3]=-f;h[g+8>>3]=-d;h[g+16>>3]=f;h[g+24>>3]=d;if(j){e=1;i=2;while(1){if((e|0)==(Y|0))break;y=f+4.0;z=d+4.0;h[g+(i<<4)>>3]=-y;h[g+(i<<4)+8>>3]=-z;U=i|1;h[g+(U<<4)>>3]=y;h[g+(U<<4)+8>>3]=z;e=e+1|0;i=i+2|0;f=y;d=z}h[aa>>3]=f*2.0;h[A>>3]=d*2.0;e=2}else e=2}else{g=HK(S(g<<4,e)|0)|0;i=c[(c[(c[(c[Z>>2]|0)+8>>2]|0)+8>>2]|0)+44>>2]|0;b:do if(!i){p=6.283185307179586/n;s=p*.5;q=+J(+s);r=+c2(+F(+V)+ +F(+W),1.0);s=V*1.4142135623730951/+I(+s);t=W*.5;k=(p+-3.141592653589793)*.5;X3(k,T,U);u=X/180.0*3.141592653589793;f=0.0;d=0.0;k=k+(3.141592653589793-p)*.5;i=0;m=+h[U>>3]*.5;n=+h[T>>3]*.5;while(1){if((i|0)>=(e|0))break b;k=p+k;X3(k,T,U);m=m+q*+h[U>>3];n=n+q*+h[T>>3];w=t*n+m*(r+s*n);X3(u+ +O(+n,+w),T,U);w=+c2(w,n);v=w*+h[U>>3]*+h[aa>>3];w=w*+h[T>>3]*+h[A>>3];da=+F(+v);d=da>d?da:d;da=+F(+w);f=da>f?da:f;h[g+(i<<4)>>3]=v;h[g+(i<<4)+8>>3]=w;if(o)break;else i=i+1|0}da=-v;h[g+16>>3]=da;h[g+24>>3]=w;h[g+32>>3]=da;da=-w;h[g+40>>3]=da;h[g+48>>3]=v;h[g+56>>3]=da}else{lb[c[i+4>>2]&63](g,aa);f=+h[A>>3]*.5;d=+h[aa>>3]*.5}while(0);d=d*2.0;f=f*2.0;y=y>d?y:d;h[aa>>3]=y;da=z>f?z:f;h[A>>3]=da;d=y/d;f=da/f;i=0;while(1){if((i|0)>=(e|0))break;P=g+(i<<4)|0;b=g+(i<<4)+8|0;da=f*+h[b>>3];h[P>>3]=d*+h[P>>3];h[b>>3]=da;i=i+1|0}if(j){j=e+-1|0;f=+h[g>>3];k=+h[g+8>>3];d=+O(+(k-+h[g+(j<<4)+8>>3]),+(f-+h[g+(j<<4)>>3]));j=0;c:while(1){if((j|0)>=(e|0))break;o=j+1|0;i=(o|0)%(e|0)|0;m=+h[g+(i<<4)>>3];n=+h[g+(i<<4)+8>>3];p=+O(+(n-k),+(m-f));z=(d+3.141592653589793-p)*.5;da=4.0/+J(+z);X3(d-z,T,U);h[T>>3]=da*+h[T>>3];h[U>>3]=da*+h[U>>3];i=1;d=k;while(1){if((i|0)==(Y|0)){d=p;j=o;f=m;k=n;continue c}z=f+ +h[U>>3];da=d+ +h[T>>3];b=(S(i,e)|0)+j|0;h[g+(b<<4)>>3]=z;h[g+(b<<4)+8>>3]=da;i=i+1|0;f=z;d=da}}j=S(e,Y+-1|0)|0;i=0;while(1){if((i|0)>=(e|0))break a;U=i+j|0;z=+h[g+(U<<4)+8>>3];y=+F(+(+h[g+(U<<4)>>3]))*2.0;da=+h[aa>>3];h[aa>>3]=y>da?y:da;z=+F(+z)*2.0;da=+h[A>>3];h[A>>3]=z>da?z:da;i=i+1|0}}}while(0);c[ba>>2]=_;c[ba+4>>2]=Y;c[ba+8>>2]=e;h[ba+16>>3]=X;h[ba+32>>3]=W;h[ba+24>>3]=V;c[ba+44>>2]=g;g=c[Z>>2]|0;f=+h[aa>>3];d=+h[A>>3];e=g+32|0;if(!(c[x>>2]&2048))h[e>>3]=f/72.0;else{h[e>>3]=+h[(R>f?$:aa)>>3]/72.0;d=+h[(Q>d?$:aa)+8>>3]}h[g+40>>3]=d/72.0;c[g+12>>2]=ba;l=ca;return}function WM(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+64|0;j=o+40|0;e=o+32|0;k=o+16|0;n=o;d=(c[(c[(uC(a)|0)+16>>2]|0)+116>>2]|0)>>>2&1^1;m=a+16|0;f=c[c[(c[m>>2]|0)+104>>2]>>2]|0;c[47352]=f;f=D3(f)|0;f=HK(((f|0)>1?f:1)+1|0)|0;b=YM(a,d,1,f)|0;if(!b){c[e>>2]=c[c[(c[m>>2]|0)+104>>2]>>2];dA(1,105773,e)|0;c[47352]=105794;b=YM(a,d,1,f)|0}l6(f);ZM(j,a,b);d=c[m>>2]|0;i=+h[d+32>>3]*72.0;i=+(~~(i+(i>=0.0?.5:-.5))|0);h[n>>3]=i;g=+h[d+40>>3]*72.0;g=+(~~(g+(g>=0.0?.5:-.5))|0);d=n+8|0;h[d>>3]=g;if(!((bP(_O(a,c[47227]|0,137609)|0)|0)<<24>>24)){i=+h[(+h[b>>3]>i?b:n)>>3];h[n>>3]=i;e=b+8|0;g=+h[(+h[e>>3]>g?b:n)+8>>3];h[d>>3]=g;d=e;e=b}else{d=b+8|0;e=b}a=(bP(_O(a,c[47218]|0,137609)|0)|0)&255;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];_M(b,j,a);$M(k,i*-.5,g*.5);c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];aN(b,j,15);n=c[m>>2]|0;h[n+32>>3]=+h[e>>3]/72.0;h[n+40>>3]=(+h[d>>3]+1.0)/72.0;c[n+12>>2]=b;l=o;return}function XM(a){a=a|0;var b=0.0,d=0,e=0.0,f=0.0,g=0,i=0,j=0,k=0,l=0.0,m=0;j=HK(48)|0;k=a+16|0;g=c[(c[(c[(c[k>>2]|0)+8>>2]|0)+8>>2]|0)+4>>2]|0;b=+YO(a,c[47200]|0,1797693134862315708145274.0e284,0.0);f=+YO(a,c[47199]|0,1797693134862315708145274.0e284,0.0);b=b>2]|0;b=f==1797693134862315708145274.0e284&b==1797693134862315708145274.0e284?.05:b>0.0?(b>.0003?b:.0003):b;h[i+40>>3]=b;h[i+32>>3]=b;b=b*72.0;g=XO(a,c[47222]|0,g,0)|0;i=HK((g|0)<1?32:g<<5)|0;f=b*.5;e=-f;h[i>>3]=e;h[i+8>>3]=e;h[i+16>>3]=f;h[i+24>>3]=f;if((g|0)>1){a=1;d=2;e=f;b=f;while(1){if((a|0)==(g|0))break;l=e+4.0;f=b+4.0;h[i+(d<<4)>>3]=-l;h[i+(d<<4)+8>>3]=-f;m=d|1;h[i+(m<<4)>>3]=l;h[i+(m<<4)+8>>3]=f;a=a+1|0;d=d+2|0;e=l;b=f}b=e*2.0}c[j>>2]=1;c[j+4>>2]=g;c[j+8>>2]=2;m=j+16|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[j+44>>2]=i;l=b/72.0;m=c[k>>2]|0;h[m+32>>3]=l;h[m+40>>3]=l;c[m+12>>2]=j;return}function YM(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=HK(72)|0;n=c[(c[b+16>>2]|0)+104>>2]|0;m=0;i=1;j=c[47352]|0;a:while(1){k=a[j>>0]|0;switch(k<<24>>24){case 0:break a;case 92:{j=j+1|0;k=a[j>>0]|0;switch(k<<24>>24){case 124:case 125:case 123:case 92:{l=m;break}default:E=4}break}default:E=4}if((E|0)==4){E=0;switch(k<<24>>24){case 123:{l=m+1|0;break}case 125:{l=m+-1|0;break}default:{l=m;i=((m|0)==0&k<<24>>24==124&1)+i|0}}if((l|0)<0)break}m=l;j=j+1|0}C=g+56|0;c[C>>2]=HK(i<<2)|0;a[g+64>>0]=d;z=(d|0)==0&1;A=f+1|0;B=n+82|0;y=(e|0)==0;w=n+16|0;x=n+4|0;v=n+8|0;l=0;m=0;d=0;u=0;k=0;e=0;n=f;i=0;j=0;b:while(1){p=l;l=0;c:while(1){r=n;d:while(1){t=e;e:while(1){s=i;f:while(1){q=m;o=k;g:while(1){while(1){if(u){E=79;break b}i=c[47352]|0;k=a[i>>0]|0;e=i+1|0;if((k+-1&255)>=31)break;c[47352]=e}switch(k<<24>>24|0){case 92:{E=52;break d}case 0:case 124:case 125:break e;case 60:break f;case 62:break g;case 123:break;default:{E=56;break d}}c[47352]=e;if(o|0){E=32;break b}if(!(a[e>>0]|0)){E=32;break b}o=YM(b,z,0,f)|0;c[(c[C>>2]|0)+(q<<2)>>2]=o;if(!o){E=34;break b}else{q=q+1|0;o=4}}n=s+-1|0;if(a[B>>0]|0){k=o;break d}if(!(o&16)){E=26;break b}if(s>>>0<=A>>>0|(n|0)==(t|0))i=s;else i=(a[n>>0]|0)==32?n:s;a[i>>0]=0;l=Y3(f)|0;c[47352]=(c[47352]|0)+1;m=q;k=o&-17;s=i}if(o&6|0){E=21;break b}if(a[B>>0]|0){E=57;break d}c[47352]=e;m=q;k=o|18;t=f;i=f}if((o&16|0)!=0|y&k<<24>>24==0){E=36;break b}if(!(o&4)){e=HK(72)|0;c[(c[C>>2]|0)+(q<<2)>>2]=e;m=q+1|0}else{e=p;m=q}if(l|0)c[e+60>>2]=l;if(!(o&5)){a[f+j>>0]=32;o=o|1;j=j+1|0}i=f+j|0;if(!(o&1))n=r;else{if((j|0)>1?(D=i+-1|0,(D|0)!=(r|0)):0)i=(a[D>>0]|0)==32?D:i;a[i>>0]=0;n=Y3(f)|0;c[e+52>>2]=xK(b,n,a[B>>0]|0?2:0,+h[w>>3],c[x>>2]|0,c[v>>2]|0)|0;a[e+64>>0]=1;n=f;j=0}i=c[47352]|0;k=a[i>>0]|0;if(!(k<<24>>24)){l=e;u=1;k=o;e=t;i=s;continue b}c[47352]=i+1;if(k<<24>>24==125){E=51;break b}else{p=e;k=0;l=0;e=t;r=n;i=s}}h:do if((E|0)==52){E=0;k=f+j|0;n=s+-1|0;m=j+1|0;switch(a[e>>0]|0){case 0:{k=o;break h}case 62:case 60:case 124:case 125:case 123:{i=d;k=o;break}case 32:{if(!(a[B>>0]|0)){i=1;k=o}else E=54;break}default:E=54}if((E|0)==54){E=0;a[k>>0]=92;i=d;k=o|9;j=m}c[47352]=e;d=i;i=e}else if((E|0)==56){E=0;k=o;n=s+-1|0}else if((E|0)==57){E=0;k=o;n=s+-1|0}while(0);e=f+j|0;if(k&4|0?(a[i>>0]|0)!=32:0){E=60;break b}if(!(k&24))k=(a[i>>0]|0)==32?k:k|9;o=(d|0)!=0;if(!(k&8))if(!(k&16)){e=t;n=r;o=s}else{m=a[i>>0]|0;if(!(o|m<<24>>24!=32))if((s|0)!=(f|0))if((a[n>>0]|0)==32)m=s;else E=74;else m=f;else E=74;if((E|0)==74){E=0;a[s>>0]=m;m=s+1|0;i=c[47352]|0}e=o?m+-1|0:t;n=r;o=m}else{m=a[i>>0]|0;if(!((!(o|m<<24>>24!=32)?(a[e+-1>>0]|0)==32:0)?(a[B>>0]|0)==0:0)){a[e>>0]=m;j=j+1|0}if(o){e=t;n=f+j+-1|0;o=s}else{e=t;n=r;o=s}}i=i+1|0;c[47352]=i;while(1){if((a[i>>0]|0)>=0){m=q;i=o;continue c}t=i+1|0;c[47352]=t;a[f+j>>0]=a[i>>0]|0;j=j+1|0;i=t}}}if((E|0)==21){bN(g,l);g=0}else if((E|0)==26){bN(g,l);g=0}else if((E|0)==32){bN(g,l);g=0}else if((E|0)==34){bN(g,l);g=0}else if((E|0)==36){bN(g,l);g=0}else if((E|0)==51)c[g+48>>2]=m;else if((E|0)==60){bN(g,l);g=0}else if((E|0)==79)c[g+48>>2]=q;return g|0}function ZM(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0,k=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+64|0;n=v+48|0;k=v+40|0;p=v+32|0;u=v+16|0;s=v;j=c[e+52>>2]|0;t=u+8|0;a:do if(!j){o=e+48|0;p=e+56|0;q=e+64|0;r=s+8|0;c[u>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;n=0;while(1){if((n|0)>=(c[o>>2]|0))break a;ZM(s,d,c[(c[p>>2]|0)+(n<<2)>>2]|0);f=+h[t>>3];g=+h[u>>3];i=+h[s>>3];m=+h[r>>3];if(!(a[q>>0]|0)){h[t>>3]=f+m;j=g>i?u:s;k=u}else{h[u>>3]=g+i;j=(f>m?u:s)+8|0;k=t}h[k>>3]=+h[j>>3];n=n+1|0}}else{g=+h[j+24>>3];f=+h[j+32>>3];if(g>0.0|f>0.0){j=NA(d,105797)|0;m=g+16.0;if((j|0)!=0?(c[n>>2]=k,c[n+4>>2]=p,o=q4(j,105804,n)|0,(o|0)>0):0){i=+h[k>>3]*72.0;i=+(~~(i+(i>=0.0?.5:-.5))<<1|0);g=g+i;if((o|0)!=1){i=+h[p>>3]*72.0;i=+(~~(i+(i>=0.0?.5:-.5))<<1|0)}}else{i=8.0;g=m}f=f+i}h[u>>3]=g;h[t>>3]=f}while(0);c[e>>2]=c[u>>2];c[e+4>>2]=c[u+4>>2];c[e+8>>2]=c[u+8>>2];c[e+12>>2]=c[u+12>>2];c[b>>2]=c[u>>2];c[b+4>>2]=c[u+4>>2];c[b+8>>2]=c[u+8>>2];c[b+12>>2]=c[u+12>>2];l=v;return}function _M(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0;r=l;l=l+32|0;n=r+16|0;o=r;p=+h[d>>3];g=p-+h[b>>3];q=+h[d+8>>3];f=q-+h[b+8>>3];c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];d=c[b+52>>2]|0;if(!((e|0)!=0|(d|0)==0)){m=d+40|0;h[m>>3]=g+ +h[m>>3];m=d+48|0;h[m>>3]=f+ +h[m>>3]}k=b+48|0;d=c[k>>2]|0;a:do if(d|0){m=b+64|0;g=((a[m>>0]|0)==0?f:g)/+(d|0);j=b+56|0;i=0;while(1){if((i|0)>=(d|0))break a;d=c[(c[j>>2]|0)+(i<<2)>>2]|0;b=i+1|0;f=+(~~(g*+(b|0))-~~(g*+(i|0))|0);if(!(a[m>>0]|0))$M(o,p,f+ +h[d+8>>3]);else $M(o,f+ +h[d>>3],q);c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];_M(d,n,e);i=b;d=c[k>>2]|0}}while(0);l=r;return}function $M(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function aN(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0;q=l;l=l+48|0;j=q+32|0;n=q+16|0;m=q;a[b+65>>0]=e;k=b+16|0;s=+h[d>>3];p=d+8|0;r=+h[p>>3];$M(n,s,r-+h[b+8>>3]);c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];k=b+32|0;$M(m,s+ +h[b>>3],r);c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];k=c[b+48>>2]|0;m=k+-1|0;n=(e|0)==0;o=b+64|0;i=b+56|0;g=0;while(1){if((g|0)>=(k|0))break;do if(!n){b=(g|0)==0;f=(g|0)==(m|0);if(!(a[o>>0]|0))if(b){b=f?15:14;break}else{b=f?11:10;break}else if(b){b=f?15:13;break}else{b=f?7:5;break}}else b=0;while(0);f=c[(c[i>>2]|0)+(g<<2)>>2]|0;c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];aN(f,j,b&e);b=c[(c[i>>2]|0)+(g<<2)>>2]|0;if(!(a[o>>0]|0))h[p>>3]=+h[p>>3]-+h[b+8>>3];else h[d>>3]=+h[d>>3]+ +h[b>>3];g=g+1|0}l=q;return}function bN(a,b){a=a|0;b=b|0;cN(a);l6(b);return}function cN(a){a=a|0;var b=0,d=0,e=0;d=a+48|0;e=a+56|0;b=0;while(1){if((b|0)>=(c[d>>2]|0))break;cN(c[(c[e>>2]|0)+(b<<2)>>2]|0);b=b+1|0}l6(c[a+60>>2]|0);AK(c[a+52>>2]|0);l6(c[e>>2]|0);l6(a);return}function dN(a){a=a|0;var b=0.0,d=0.0;d=+YO(a,c[47200]|0,0.0,.01);b=+YO(a,c[47199]|0,0.0,.02);b=(d>b?d:b)*72.0;return +(+(~~(b+(b>=0.0?.5:-.5))|0))}function eN(a,b){a=+a;b=+b;var c=0;c=~~(a/b);return +(+((+(c|0)*b+1.0e-05>2]|0)+8>>2]|0;if(!a)a=0;else a=(c[c[a+4>>2]>>2]|0)==91&1;return a|0}function gN(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;f=c[47353]|0;a:do if(!f)d=0;else{g=c[47354]|0;e=0;while(1){if((e|0)>=(g|0)){d=0;break a}d=c[f+(e<<2)>>2]|0;h=c[d>>2]|0;if((a[h>>0]|0)==(a[b>>0]|0)?(f2(h,b)|0)==0:0)break a;e=e+1|0}}while(0);return d|0}function hN(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;do if(!(kP(NA(d,105827)|0)|0))d=b;else{if((a[b>>0]|0)==101?(f2(b,105986)|0)==0:0){d=b;break}d=105820}while(0);f=a[d>>0]|0;if(f<<24>>24==99?(f2(d,105820)|0)==0:0)g=11;else{b=20896;g=7}a:do if((g|0)==7)while(1){g=0;e=c[b>>2]|0;if(!e){g=11;break a}if((a[e>>0]|0)==f<<24>>24?(f2(e,d)|0)==0:0)break a;b=b+16|0;g=7}while(0);if((g|0)==11)b=iN(d)|0;return b|0}function iN(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;d=gN(b)|0;if(!d){f=c[47354]|0;e=f+1|0;c[47354]=e;d=c[47353]|0;e=e<<2;if(!d)d=IK(e)|0;else d=KK(d,e)|0;c[47353]=d;d=HK(16)|0;c[(c[47353]|0)+(f<<2)>>2]=d;c[d>>2]=c[5224];c[d+4>>2]=c[5225];c[d+8>>2]=c[5226];c[d+12>>2]=c[5227];e=Y3(b)|0;c[d>>2]=e;do if(!(c[47176]|0)){if((a[b>>0]|0)==99?(f2(b,105820)|0)==0:0){e=1;break}c[g>>2]=c[5224];c[g+4>>2]=e;dA(0,105991,g)|0;e=0}else e=1;while(0);a[d+12>>0]=e}l=h;return d|0}function jN(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[b>>3]/1.902113032590307;c=+h[b+8>>3]/1.1180339887498947;c=(d>c?d:c)*.9510565162951535*.8090169943749475/.29389262614623657;h[a>>3]=c*2.0*.9510565162951535;h[a+8>>3]=c*1.8090169943749475;return}function kN(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0,g=0.0,i=0.0,j=0.0,k=0,l=0.0,m=0;d=+h[b>>3];k=b+8|0;e=+h[k>>3];c=e/d;if(!(c>.9510565162951536))if(c<.9510565162951536){j=d;e=d*.9510565162951536}else j=d;else j=e/.9510565162951536;i=j/1.902113032590307;d=i*.9510565162951535*.30901699437494745/.7694208842938134;g=i*.19098300562505266*.5;c=.3141592653589793;f=0;while(1){if((f|0)>=10)break;h[a+(f<<4)>>3]=i*+I(+c);h[a+(f<<4)+8>>3]=i*+J(+c)-g;l=c+.6283185307179586;m=f|1;h[a+(m<<4)>>3]=d*+I(+l);h[a+(m<<4)+8>>3]=d*+J(+l)-g;c=l+.6283185307179586;f=f+2|0}h[b>>3]=j;h[k>>3]=e;return}function lN(a){a=a|0;a=c[(c[a+16>>2]|0)+12>>2]|0;if(a|0){l6(c[a+44>>2]|0);l6(a)}return}function mN(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+80|0;k=o+40|0;g=o;n=o+64|0;h=o+56|0;if(!(a[e>>0]|0)){g=4256;h=b+40|0;do{c[b>>2]=c[g>>2];b=b+4|0;g=g+4|0}while((b|0)<(h|0))}else{i=(f|0)==0?106657:f;c[n>>2]=15;j=d+16|0;f=c[j>>2]|0;do if(a[(c[f+104>>2]|0)+82>>0]|0){f=nU(d,e,n)|0;if(!f){f=c[j>>2]|0;m=8;break}if(AN(d,f,g,i,c[n>>2]|0,0)|0){c[k>>2]=HB(d)|0;c[k+4>>2]=e;c[k+8>>2]=i;dA(0,106659,k)|0}}else m=8;while(0);if((m|0)==8){if((c[(c[f+8>>2]|0)+8>>2]|0)==1712)h=0;else{c[h>>2]=d;c[h+4>>2]=0}if(AN(d,0,g,e,c[n>>2]|0,h)|0)BN(d,e)}c[g+36>>2]=0;h=b+40|0;do{c[b>>2]=c[g>>2];b=b+4|0;g=g+4|0}while((b|0)<(h|0))}l=o;return}function nN(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0,i=0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0;r=l;l=l+112|0;n=r+96|0;m=r+80|0;p=r+64|0;k=r+48|0;q=r+32|0;o=r+16|0;f=r;if(!a){c[47357]=0;a=0}else{g=c[a+4>>2]|0;a=c[a>>2]|0;i=(c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&3)*90|0;c[n>>2]=c[b>>2];c[n+4>>2]=c[b+4>>2];c[n+8>>2]=c[b+8>>2];c[n+12>>2]=c[b+12>>2];kK(f,n,i);c[q>>2]=c[f>>2];c[q+4>>2]=c[f+4>>2];c[q+8>>2]=c[f+8>>2];c[q+12>>2]=c[f+12>>2];a:do if(g){d=+h[g+8>>3];e=+h[g+24>>3];s=+h[q>>3];if((+h[g>>3]<=s?s<=+h[g+16>>3]:0)?(j=+h[q+8>>3],d<=j):0)a=j<=e&1;else a=0}else{if((a|0)==(c[47357]|0)){f=c[47358]|0;g=c[47360]|0;i=c[47359]|0}else{g=c[(c[a+16>>2]|0)+12>>2]|0;c[47361]=g;i=c[g+44>>2]|0;c[47359]=i;f=c[g+8>>2]|0;c[47358]=f;g=S((c[g+4>>2]|0)+-1|0,f)|0;g=(g|0)>0?g:0;c[47360]=g;c[47357]=a}a=0;b=0;while(1){if((a|0)>=(f|0)){a=1;break a}t=i+(g+a<<4)|0;c[o>>2]=c[t>>2];c[o+4>>2]=c[t+4>>2];c[o+8>>2]=c[t+8>>2];c[o+12>>2]=c[t+12>>2];t=i+(((a+4|0)%(f|0)|0)+g<<4)|0;c[k>>2]=c[q>>2];c[k+4>>2]=c[q+4>>2];c[k+8>>2]=c[q+8>>2];c[k+12>>2]=c[q+12>>2];c[p>>2]=c[46656];c[p+4>>2]=c[46657];c[p+8>>2]=c[46658];c[p+12>>2]=c[46659];c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];c[n>>2]=c[t>>2];c[n+4>>2]=c[t+4>>2];c[n+8>>2]=c[t+8>>2];c[n+12>>2]=c[t+12>>2];b=((zN(k,p,m,n)|0)==0&1)+b|0;if((b|0)==2){a=0;break}else a=a+2|0}}while(0)}l=r;return a|0}function oN(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;e=c[b+16>>2]|0;if((a[(c[e+104>>2]|0)+82>>0]|0)!=0?(a[e+145>>0]|0)!=0:0)b=qU(b,d,0,f,g)|0;else b=0;return b|0}function pN(e,f){e=e|0;f=f|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0;V=l;l=l+48|0;R=V+24|0;Q=V+16|0;N=V+8|0;M=V;T=V+32|0;q=V+28|0;n=c[e+16>>2]|0;U=n+208|0;o=c[U>>2]|0;if(!o){i=e+152|0;j=n+228|0;k=n+212|0;m=n+244|0;if(!(b[n+260>>1]&1)){O=i;J=0}else P=4}else{i=e+152|0;j=n+228|0;m=n+244|0;k=n+212|0;P=4}if((P|0)==4)if(!(c[i>>2]&4)){aS(e,o,c[j>>2]|0,c[m>>2]|0,c[k>>2]|0);O=i;J=1}else{O=i;J=1}K=f+16|0;i=c[K>>2]|0;y=c[i+12>>2]|0;I=c[y+44>>2]|0;L=c[y+8>>2]|0;y=c[y+4>>2]|0;if((c[47355]|0)<(L|0)){n=L+5|0;c[47355]=n;i=c[47356]|0;n=n<<4;if(!i)i=IK(n)|0;else i=KK(i,n)|0;c[47356]=i;i=c[K>>2]|0}H=(c[i+104>>2]|0)+56|0;i=i+16|0;c[H>>2]=c[i>>2];c[H+4>>2]=c[i+4>>2];c[H+8>>2]=c[i+8>>2];c[H+12>>2]=c[i+12>>2];H=c[K>>2]|0;F=+h[H+32>>3]*72.0;F=(+h[H+88>>3]+ +h[H+96>>3])/+(~~(F+(F>=0.0?.5:-.5))|0);G=+h[H+40>>3]*72.0;G=+h[H+80>>3]/+(~~(G+(G>=0.0?.5:-.5))|0);H=qN(e,f)|0;c[T>>2]=0;i=d[(c[K>>2]|0)+117>>0]|0;do if(!(i&1)){if(i&2|0){B=$O(f,c[47206]|0,106557)|0;fS(e,B);hS(e,$O(f,c[47207]|0,106565)|0);n=0;i=1;break}if(i&8|0){B=$O(f,c[47210]|0,106573)|0;fS(e,B);hS(e,$O(f,c[47211]|0,106581)|0);n=0;i=1;break}if(i&4|0){B=$O(f,c[47208]|0,106589)|0;fS(e,B);hS(e,$O(f,c[47209]|0,106597)|0);n=0;i=1;break}if(!(H&1))if(!(H&576)){n=0;i=0}else{n=rN(f)|0;i=1}else{n=rN(f)|0;if(!((HJ(n,T,q)|0)<<24>>24)){hS(e,n);i=1}else{hS(e,c[T>>2]|0);i=c[T+4>>2]|0;o=XO(f,c[47235]|0,0,0)|0;p=+g[q>>2];if(!i)iS(e,137615,o,p);else iS(e,i,o,p);i=(H&2)>>>1|2}}B=sN(e,f)|0}else{B=$O(f,c[47204]|0,106541)|0;fS(e,B);hS(e,$O(f,c[47205]|0,106549)|0);n=0;i=1}while(0);o=c[(c[K>>2]|0)+8>>2]|0;if(a[o+12>>0]|0){o=c[o>>2]|0;if((a[o>>0]|0)==99){o=(f2(o,105820)|0)==0;P=33}else o=1}else{o=1;P=33}if((P|0)==33){o=o^1;if(!((y|0)!=0|i<<24>>24==0|o)){fS(e,137680);y=1;o=0}}C=(L|0)<3;D=(H&64|0)!=0;v=(H&512|0)!=0;E=(H&8|0)==0;w=(H&1024|0)==0;x=(H&2130706444|0)==0;u=0;while(1){r=(u|0)==0;z=i&255;A=v&r;if((u|0)>=(y|0))break;s=S(u,L)|0;t=c[47356]|0;q=0;while(1){if((q|0)>=(L|0))break;X=q+s|0;p=+h[I+(X<<4)+8>>3];W=c[K>>2]|0;h[t+(q<<4)>>3]=F*+h[I+(X<<4)>>3]+ +h[W+16>>3];h[t+(q<<4)+8>>3]=G*p+ +h[W+24>>3];q=q+1|0}do if(C){if(A?(F3(n,58)|0)!=0:0)if((dI(e,t,n)|0)>1){c[M>>2]=HB(f)|0;dA(3,106605,M)|0;i=0}else i=0;kS(e,c[47356]|0,L,i&255);if(!E)tN(e,f)}else{if(D){if(r?(hI(e,t,n,1)|0)>1:0){c[N>>2]=HB(f)|0;dA(3,106605,N)|0}lS(e,c[47356]|0,L,0);break}if(!w){fS(e,137680);lS(e,c[47356]|0,L,z);fS(e,B);oS(e,(c[47356]|0)+32|0,2);break}if(x){lS(e,t,L,z);break}else{RM(e,t,L,H,z);break}}while(0);u=u+1|0;i=0}q=c[(c[K>>2]|0)+8>>2]|0;if(!(a[q+12>>0]|0)){q=NA(f,109326)|0;if(q|0?a[q>>0]|0:0)P=65}else{q=c[q>>2]|0;if((a[q>>0]|0)==99?(f2(q,105820)|0)==0:0){q=NA(f,105827)|0;if(q|0?a[q>>0]|0:0)P=65}else P=65}if((P|0)==65){s=c[47356]|0;r=0;while(1){if((r|0)>=(L|0))break;p=+h[I+(r<<4)+8>>3];X=c[K>>2]|0;h[s+(r<<4)>>3]=F*+h[I+(r<<4)>>3]+ +h[X+16>>3];h[s+(r<<4)+8>>3]=G*p+ +h[X+24>>3];r=r+1|0}do if(!(o|i<<24>>24==0)){if(C){if(A?(F3(n,58)|0)!=0:0)if((dI(e,s,n)|0)>1){c[Q>>2]=HB(f)|0;dA(3,106605,Q)|0;i=0}else i=0;kS(e,c[47356]|0,L,i&255);if(E)break;tN(e,f);break}if(!D)if(!(H&12)){lS(e,s,L,z);break}else{RM(e,s,L,H,z);break}else{if((hI(e,s,n,1)|0)>1){c[R>>2]=HB(f)|0;dA(3,106605,R)|0}lS(e,c[47356]|0,L,0);break}}while(0);X=c[47356]|0;qS(e,q,X,L,i,_O(f,c[47228]|0,137609)|0)}l6(c[T>>2]|0);BK(e,10,c[(c[K>>2]|0)+104>>2]|0);if(J){if(c[O>>2]&4|0)aS(e,c[U>>2]|0,c[j>>2]|0,c[m>>2]|0,c[k>>2]|0);bS(e)}l=V;return}function qN(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;e=wN(d,f)|0;if(e|0)jS(b,e);e=c[47234]|0;if((e|0?(g=OA(d,e)|0,g|0):0)?a[g>>0]|0:0)sS(b,+YO(d,c[47234]|0,1.0,0.0));l=h;return c[f>>2]|0}function rN(a){a=a|0;return vN(a,135101)|0}function sN(b,d){b=b|0;d=d|0;d=$O(d,c[47202]|0,195341)|0;d=a[d>>0]|0?d:137615;fS(b,d);return d|0}function tN(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,i=0.0,j=0,k=0,m=0;d=l;l=l+96|0;j=d+80|0;k=d+64|0;e=d+32|0;m=d+16|0;g=d;b=c[b+16>>2]|0;f=+h[b+80>>3]*.75*.5;h[m+8>>3]=f;i=+h[b+96>>3]*.6614;h[m>>3]=i;b=b+16|0;c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];c[j>>2]=c[b>>2];c[j+4>>2]=c[b+4>>2];c[j+8>>2]=c[b+8>>2];c[j+12>>2]=c[b+12>>2];uN(g,k,j);c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];g=e+8|0;b=e+24|0;h[b>>3]=+h[g>>3];h[e+16>>3]=+h[e>>3]-i*2.0;oS(a,e,2);f=+h[g>>3]-f*2.0;h[g>>3]=f;h[b>>3]=f;oS(a,e,2);l=d;return}function uN(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=d;return}function vN(b,d){b=b|0;d=d|0;var e=0;e=$O(b,c[47203]|0,195341)|0;if(!(a[e>>0]|0)){e=$O(b,c[47202]|0,195341)|0;return ((a[e>>0]|0)==0?d:e)|0}else return e|0;return 0}function wN(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=$O(b,c[47219]|0,195341)|0;a:do if(!(a[e>>0]|0)){g=0;e=0}else{g=NI(e)|0;i=g;e=0;b:while(1){f=c[i>>2]|0;if(!f)break a;h=i+4|0;switch(a[f>>0]|0){case 102:{i=h;e=e|(f2(f,111402)|0)==0;continue b}case 114:{if(!(f2(f,106617)|0)){f=i;do{j=f;f=f+4|0;h=c[f>>2]|0;c[j>>2]=h}while((h|0)!=0);j=i;e=e|4;i=j;continue b}if(!(f2(f,106635)|0))f=i;else{j=e;i=h;e=j;continue b}do{h=f;f=f+4|0;j=c[f>>2]|0;c[h>>2]=j}while((j|0)!=0);j=i;e=e|3;i=j;continue b}case 100:{if(!(f2(f,106625)|0))f=i;else{j=e;i=h;e=j;continue b}do{h=f;f=f+4|0;j=c[f>>2]|0;c[h>>2]=j}while((j|0)!=0);j=i;e=e|8;i=j;continue b}case 105:{j=(f2(f,134636)|0)==0;i=h;e=j?e|32:e;continue b}case 115:{if(f2(f,106642)|0){j=e;i=h;e=j;continue b}if(!(xN(b)|0)){j=e;i=h;e=j;continue b}else f=i;do{h=f;f=f+4|0;j=c[f>>2]|0;c[h>>2]=j}while((j|0)!=0);j=i;e=e|64;i=j;continue b}case 119:{if(f2(f,106650)|0){j=e;i=h;e=j;continue b}if(!(yN(b)|0)){j=e;i=h;e=j;continue b}else f=i;do{h=f;f=f+4|0;j=c[f>>2]|0;c[h>>2]=j}while((j|0)!=0);j=i;e=e|512;i=j;continue b}default:{j=e;i=h;e=j;continue b}}}}while(0);f=c[(c[(c[b+16>>2]|0)+8>>2]|0)+8>>2]|0;if(f)e=c[f+40>>2]|e;c[d>>2]=e;return g|0}function xN(a){a=a|0;var b=0.0;a=c[(c[(c[a+16>>2]|0)+8>>2]|0)+8>>2]|0;if(!a)a=0;else{if(((c[a+8>>2]|0)==4?(b=+h[a+16>>3],((~~(b+(b>=0.0?.5:-.5))|0)%90|0|0)==0):0)?+h[a+24>>3]==0.0:0)a=+h[a+32>>3]==0.0;else a=0;a=a&1}return a|0}function yN(a){a=a|0;a=c[(c[(c[a+16>>2]|0)+8>>2]|0)+8>>2]|0;if(!a)a=0;else a=(c[a+8>>2]|0)<3&1;return a|0}function zN(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0.0;e=+h[c+8>>3];g=-(+h[d+8>>3]-e);i=+h[c>>3];f=+h[d>>3]-i;e=i*g+e*f;return (+h[a>>3]*g+f*+h[a+8>>3]-e>=0.0^+h[b>>3]*g+f*+h[b+8>>3]-e>=0.0^1)&1|0}function AN(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;H=l;l=l+192|0;D=H+176|0;F=H+160|0;m=H+144|0;B=H+128|0;C=H+112|0;o=H+96|0;p=H+80|0;w=H+64|0;x=H+48|0;y=H+32|0;z=H+16|0;E=H;G=F+8|0;if(!d){c[F>>2]=0;c[F+4>>2]=0;c[F+8>>2]=0;c[F+12>>2]=0;n=(c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&1|0)==0;m=c[b+16>>2]|0;t=+h[m+80>>3]*.5;v=-t;s=+h[m+88>>3];u=-s;m=0;k=0.0;q=n?u:v;r=n?s:t;s=n?t:s;t=0.0;u=n?v:u}else{q=+h[d>>3];u=+h[d+8>>3];r=+h[d+16>>3];s=+h[d+24>>3];$M(m,(q+r)*.5,(u+s)*.5);c[F>>2]=c[m>>2];c[F+4>>2]=c[m+4>>2];c[F+8>>2]=c[m+8>>2];c[F+12>>2]=c[m+12>>2];m=1;k=+h[F>>3];t=+h[G>>3]}v=(r>s?r:s)*4.0;a:do if((f|0)!=0?(A=a[f>>0]|0,A<<24>>24!=0):0){f=f+1|0;n=(i|0)!=0;j=-v;switch(A<<24>>24|0){case 99:{p=1;g=0;f=0;n=0;j=0.0;o=0;break a}case 101:{if(a[f>>0]|0){p=1;g=0;f=0;n=0;j=0.0;o=1;break a}if(n){CN(B,i,t,v);c[F>>2]=c[B>>2];c[F+4>>2]=c[B+4>>2];c[F+8>>2]=c[B+8>>2];c[F+12>>2]=c[B+12>>2]}else h[F>>3]=r;p=0;g=g&2;f=0;n=1;j=0.0;o=0;m=1;break a}case 115:{h[G>>3]=u;switch(a[f>>0]|0){case 0:{if(n){CN(C,i,j,k);c[F>>2]=c[C>>2];c[F+4>>2]=c[C+4>>2];c[F+8>>2]=c[C+8>>2];c[F+12>>2]=c[C+12>>2]}else h[F>>3]=k;p=0;g=g&1;f=0;n=1;j=-1.5707963267948966;o=0;m=1;break a}case 101:{if(n){CN(o,i,j,v);c[F>>2]=c[o>>2];c[F+4>>2]=c[o+4>>2];c[F+8>>2]=c[o+8>>2];c[F+12>>2]=c[o+12>>2]}else h[F>>3]=r;p=0;g=g&3;f=0;n=1;j=-.7853981633974483;o=0;m=1;break a}case 119:{if(n){CN(p,i,j,j);c[F>>2]=c[p>>2];c[F+4>>2]=c[p+4>>2];c[F+8>>2]=c[p+8>>2];c[F+12>>2]=c[p+12>>2]}else h[F>>3]=q;p=0;g=g&9;f=0;n=1;j=-2.356194490192345;o=0;m=1;break a}default:{h[G>>3]=t;p=1;g=0;f=0;n=0;j=0.0;o=1;break a}}}case 119:{if(a[f>>0]|0){p=1;g=0;f=0;n=0;j=0.0;o=1;break a}if(n){CN(w,i,t,j);c[F>>2]=c[w>>2];c[F+4>>2]=c[w+4>>2];c[F+8>>2]=c[w+8>>2];c[F+12>>2]=c[w+12>>2]}else h[F>>3]=q;p=0;g=g&8;f=0;n=1;j=3.141592653589793;o=0;m=1;break a}case 110:{h[G>>3]=s;switch(a[f>>0]|0){case 0:{if(n){CN(x,i,v,k);c[F>>2]=c[x>>2];c[F+4>>2]=c[x+4>>2];c[F+8>>2]=c[x+8>>2];c[F+12>>2]=c[x+12>>2]}else h[F>>3]=k;p=0;g=g&4;f=0;n=1;j=1.5707963267948966;o=0;m=1;break a}case 101:{if(n){CN(y,i,v,v);c[F>>2]=c[y>>2];c[F+4>>2]=c[y+4>>2];c[F+8>>2]=c[y+8>>2];c[F+12>>2]=c[y+12>>2]}else h[F>>3]=r;p=0;g=g&6;f=0;n=1;j=.7853981633974483;o=0;m=1;break a}case 119:{if(n){CN(z,i,v,j);c[F>>2]=c[z>>2];c[F+4>>2]=c[z+4>>2];c[F+8>>2]=c[z+8>>2];c[F+12>>2]=c[z+12>>2]}else h[F>>3]=q;p=0;g=g&12;f=0;n=1;j=2.356194490192345;o=0;m=1;break a}default:{h[G>>3]=t;p=1;g=0;f=0;n=0;j=0.0;o=1;break a}}}case 95:{p=1;f=1;n=0;j=0.0;o=0;break a}default:{p=1;g=0;f=0;n=0;j=0.0;o=1;break a}}}else{p=1;g=0;f=0;n=0;j=0.0;o=0}while(0);C=(c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&3)*90|0;c[D>>2]=c[F>>2];c[D+4>>2]=c[F+4>>2];c[D+8>>2]=c[F+8>>2];c[D+12>>2]=c[F+12>>2];jK(E,D,C);c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];if(!(f<<24>>24))g=DN(g,c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&3)|0;a[e+33>>0]=g;c[e+24>>2]=d;k=+h[F>>3];h[e>>3]=+(~~(k+(k>=0.0?.5:-.5))|0);k=+h[G>>3];h[e+8>>3]=+(~~(k+(k>=0.0?.5:-.5))|0);h[e+16>>3]=+EN(j,c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&3);k=+h[F>>3];j=+h[G>>3];if(k==0.0&j==0.0)g=-128;else{v=+O(+j,+k)+4.71238898038469;g=~~((!(v>=6.283185307179586)?v:v+-6.283185307179586)*256.0/6.283185307179586)&255}a[e+32>>0]=g;a[e+29>>0]=n;a[e+28>>0]=m;a[e+30>>0]=p;a[e+31>>0]=f;l=H;return o|0}function BN(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=HB(a)|0;c[e+4>>2]=b;dA(0,106720,e)|0;l=d;return}function CN(a,b,d,e){a=a|0;b=b|0;d=+d;e=+e;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+128|0;i=p+112|0;j=p+48|0;k=p+16|0;m=p+32|0;n=p;o=c[b>>2]|0;g=c[(c[(uC(o)|0)+16>>2]|0)+116>>2]&3;h[k>>3]=e;h[k+8>>3]=d;f=(g|0)!=0;g=g*90|0;if(f){c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];jK(m,i,g);c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2]}m=j+48|0;q=j+32|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;c[j+20>>2]=0;c[j+24>>2]=0;c[j+28>>2]=0;c[q>>2]=c[k>>2];c[q+4>>2]=c[k+4>>2];c[q+8>>2]=c[k+8>>2];c[q+12>>2]=c[k+12>>2];c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];ZN(b,c[(c[(c[(c[o+16>>2]|0)+8>>2]|0)+4>>2]|0)+12>>2]|0,j,1);if(f){c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];kK(n,i,g);c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2]};c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];l=p;return}function DN(a,b){a=a|0;b=b|0;a:do switch(b|0){case 3:switch(a|0){case 4:{a=2;break a}case 1:{a=8;break a}case 8:{a=1;break a}case 2:{a=4;break a}default:break a}case 2:switch(a|0){case 4:{a=1;break a}case 1:{a=4;break a}default:break a}case 1:switch(a|0){case 4:{a=2;break a}case 1:{a=8;break a}case 8:{a=4;break a}case 2:{a=1;break a}default:break a}default:{}}while(0);return a|0}function EN(a,b){a=+a;b=b|0;switch(b|0){case 3:{if(!(a==3.141592653589793))if(!(a==2.356194490192345))if(!(a==1.5707963267948966))if(!(a==0.0))if(!(a==-.7853981633974483)){if(a==-1.5707963267948966)a=3.141592653589793}else a=2.356194490192345;else a=1.5707963267948966;else a=0.0;else a=-.7853981633974483;else a=-1.5707963267948966;break}case 2:{a=-a;break}case 1:{a=a+-1.5707963267948966;break}default:{}}return +a}function FN(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,g=0.0,i=0,j=0,k=0;e=l;l=l+32|0;k=e+16|0;i=e;a=c[a>>2]|0;j=(c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&3)*90|0;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];kK(i,k,j);d=+h[i>>3];g=+h[i+8>>3];a=c[a+16>>2]|0;f=+h[a+80>>3]*.5;if(!(!(g>=-f)|!(g<=f))?d>=-+h[a+88>>3]:0)a=d<=+h[a+96>>3]&1;else a=0;l=e;return a|0}function GN(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;q=l;l=l+32|0;p=q;e=c[a+16>>2]|0;n=e+208|0;m=c[n>>2]|0;if(!m)o=(b[e+260>>1]&1)!=0;else o=1;g=d+16|0;d=c[g>>2]|0;i=c[d+12>>2]|0;if(i|0){j=e+212|0;k=e+244|0;e=e+228|0;f=a+152|0;if(o?(c[f>>2]&4|0)==0:0){aS(a,m,c[e>>2]|0,c[k>>2]|0,c[j>>2]|0);d=c[g>>2]|0}m=c[a+36>>2]|0;s=+h[d+24>>3]+ +(c[i+8>>2]|0);r=c[i>>2]|0;h[p>>3]=+h[d+16>>3]+ +(c[i+4>>2]|0);h[p+8>>3]=s;c[p+16>>2]=r;z4(m,106751,p)|0;m=c[g>>2]|0;p=(c[m+104>>2]|0)+56|0;m=m+16|0;c[p>>2]=c[m>>2];c[p+4>>2]=c[m+4>>2];c[p+8>>2]=c[m+8>>2];c[p+12>>2]=c[m+12>>2];BK(a,10,c[(c[g>>2]|0)+104>>2]|0);if(o){if(c[f>>2]&4|0)aS(a,c[n>>2]|0,c[e>>2]|0,c[k>>2]|0,c[j>>2]|0);bS(a)}}l=q;return}function HN(a){a=a|0;cN(c[(c[a+16>>2]|0)+12>>2]|0);return}function IN(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0;m=l;l=l+64|0;k=m+40|0;h=m;if(!(a[f>>0]|0)){h=4256;g=b+40|0;do{c[b>>2]=c[h>>2];b=b+4|0;h=h+4|0}while((b|0)<(g|0))}else{g=(g|0)==0?106657:g;i=c[(c[e+16>>2]|0)+12>>2]|0;j=ON(i,f)|0;if(!j){if(AN(e,i+16|0,h,f,15,0)|0)BN(e,f)}else if(AN(e,j+16|0,h,g,d[j+65>>0]|0,0)|0){c[k>>2]=HB(e)|0;c[k+4>>2]=f;c[k+8>>2]=g;dA(0,106659,k)|0}g=b+40|0;do{c[b>>2]=c[h>>2];b=b+4|0;h=h+4|0}while((b|0)<(g|0))}l=m;return}function JN(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0,i=0,j=0.0,k=0,m=0,n=0.0;k=l;l=l+32|0;m=k+16|0;i=k;f=c[a+4>>2]|0;a=c[a>>2]|0;g=(c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&3)*90|0;c[m>>2]=c[b>>2];c[m+4>>2]=c[b+4>>2];c[m+8>>2]=c[b+8>>2];c[m+12>>2]=c[b+12>>2];kK(i,m,g);c[b>>2]=c[i>>2];c[b+4>>2]=c[i+4>>2];c[b+8>>2]=c[i+8>>2];c[b+12>>2]=c[i+12>>2];if(!f){f=c[(c[a+16>>2]|0)+12>>2]|0;g=f+16|0;a=f+24|0;i=f+32|0;f=f+40|0}else{g=f;a=f+8|0;i=f+16|0;f=f+24|0}e=+h[a>>3];d=+h[f>>3];n=+h[b>>3];if((+h[g>>3]<=n?n<=+h[i>>3]:0)?(j=+h[b+8>>3],e<=j):0)a=j<=d&1;else a=0;l=k;return a|0}function KN(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0.0;u=l;l=l+80|0;r=u+64|0;q=u+32|0;t=u;a:do if(!(a[d+28>>0]|0))e=0;else{i=+h[d>>3];p=b+16|0;m=c[(c[p>>2]|0)+12>>2]|0;k=m+48|0;m=m+56|0;d=0;while(1){if((d|0)>=(c[k>>2]|0))break a;n=(c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&1|0)==0;o=c[(c[m>>2]|0)+(d<<2)>>2]|0;j=+(~~+h[(n?o+16|0:o+24|0)>>3]|0);if(j<=i?(s=+(~~+h[(n?o+32|0:o+40|0)>>3]|0),i<=s):0)break;d=d+1|0}if(!(c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&1)){t=c[p>>2]|0;v=+h[t+16>>3];h[f>>3]=j+v;j=+h[t+24>>3];i=+h[t+80>>3];h[f+8>>3]=j-i*.5;h[f+16>>3]=s+v}else{o=(c[(c[m>>2]|0)+(d<<2)>>2]|0)+16|0;b=(c[p>>2]|0)+16|0;c[q>>2]=c[o>>2];c[q+4>>2]=c[o+4>>2];c[q+8>>2]=c[o+8>>2];c[q+12>>2]=c[o+12>>2];c[q+16>>2]=c[o+16>>2];c[q+20>>2]=c[o+20>>2];c[q+24>>2]=c[o+24>>2];c[q+28>>2]=c[o+28>>2];c[r>>2]=c[b>>2];c[r+4>>2]=c[b+4>>2];c[r+8>>2]=c[b+8>>2];c[r+12>>2]=c[b+12>>2];lK(t,q,r);c[f>>2]=c[t>>2];c[f+4>>2]=c[t+4>>2];c[f+8>>2]=c[t+8>>2];c[f+12>>2]=c[t+12>>2];c[f+16>>2]=c[t+16>>2];c[f+20>>2]=c[t+20>>2];c[f+24>>2]=c[t+24>>2];c[f+28>>2]=c[t+28>>2];t=c[p>>2]|0;i=+h[t+80>>3];j=+h[t+24>>3]}h[f+24>>3]=j+i*.5;c[g>>2]=1}while(0);l=u;return e|0}function LN(d,e){d=d|0;e=e|0;var f=0,i=0,j=0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0;z=l;l=l+144|0;p=z+96|0;r=z+64|0;t=z;w=z+128|0;f=c[d+16>>2]|0;x=f+208|0;i=c[x>>2]|0;if(!i)y=(b[f+260>>1]&1)!=0;else y=1;m=e+16|0;s=c[m>>2]|0;q=c[s+12>>2]|0;u=q+16|0;c[r>>2]=c[u>>2];c[r+4>>2]=c[u+4>>2];c[r+8>>2]=c[u+8>>2];c[r+12>>2]=c[u+12>>2];c[r+16>>2]=c[u+16>>2];c[r+20>>2]=c[u+20>>2];c[r+24>>2]=c[u+24>>2];c[r+28>>2]=c[u+28>>2];A=+h[s+16>>3];h[r>>3]=A+ +h[r>>3];k=+h[s+24>>3];s=r+8|0;h[s>>3]=k+ +h[s>>3];s=r+16|0;h[s>>3]=A+ +h[s>>3];u=r+24|0;h[u>>3]=k+ +h[u>>3];u=f+228|0;v=f+212|0;n=f+244|0;o=d+152|0;if(y?(c[o>>2]&4|0)==0:0)aS(d,i,c[u>>2]|0,c[n>>2]|0,c[v>>2]|0);f=qN(d,e)|0;sN(d,e)|0;c[w>>2]=0;if(!(f&1))i=0;else{i=rN(e)|0;if(!((HJ(i,w,p)|0)<<24>>24)){hS(d,i);i=1}else{hS(d,c[w>>2]|0);i=c[w+4>>2]|0;j=XO(e,c[47235]|0,0,0)|0;k=+g[p>>2];if(!i)iS(d,137615,j,k);else iS(d,i,j,k);i=f>>>1&1|2}}j=c[c[(c[m>>2]|0)+8>>2]>>2]|0;if((a[j>>0]|0)==77){m=(f2(j,106528)|0)==0;f=m?f|4:f}if(!(f&2130706444)){c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];c[p+16>>2]=c[r+16>>2];c[p+20>>2]=c[r+20>>2];c[p+24>>2]=c[r+24>>2];c[p+28>>2]=c[r+28>>2];mS(d,p,i)}else{c[t>>2]=c[r>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2];r=t+32|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];h[t+16>>3]=+h[r>>3];h[t+24>>3]=+h[t+8>>3];h[t+48>>3]=+h[t>>3];h[t+56>>3]=+h[t+40>>3];RM(d,t,4,f,i)}MN(d,e,q);l6(c[w>>2]|0);if(y){if(c[o>>2]&4|0)aS(d,c[x>>2]|0,c[u>>2]|0,c[n>>2]|0,c[v>>2]|0);bS(d)}l=z;return}function MN(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+144|0;p=u+128|0;o=u+112|0;q=u+16|0;r=u;i=u+96|0;j=u+80|0;s=u+64|0;t=u+48|0;k=e+52|0;g=c[k>>2]|0;f=d+16|0;if(g){n=g+56|0;g=e+16|0;m=e+32|0;c[o>>2]=c[g>>2];c[o+4>>2]=c[g+4>>2];c[o+8>>2]=c[g+8>>2];c[o+12>>2]=c[g+12>>2];c[p>>2]=c[m>>2];c[p+4>>2]=c[m+4>>2];c[p+8>>2]=c[m+8>>2];c[p+12>>2]=c[m+12>>2];NN(i,o,p);m=(c[f>>2]|0)+16|0;c[o>>2]=c[i>>2];c[o+4>>2]=c[i+4>>2];c[o+8>>2]=c[i+8>>2];c[o+12>>2]=c[i+12>>2];c[p>>2]=c[m>>2];c[p+4>>2]=c[m+4>>2];c[p+8>>2]=c[m+8>>2];c[p+12>>2]=c[m+12>>2];uN(j,o,p);c[n>>2]=c[j>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];c[n+12>>2]=c[j+12>>2];BK(b,10,c[k>>2]|0);sN(b,d)|0}m=(c[f>>2]|0)+16|0;c[r>>2]=c[m>>2];c[r+4>>2]=c[m+4>>2];c[r+8>>2]=c[m+8>>2];c[r+12>>2]=c[m+12>>2];m=e+48|0;n=e+56|0;j=e+64|0;k=q+16|0;i=0;while(1){if((i|0)>=(c[m>>2]|0))break;if((i|0)>0){f=(c[n>>2]|0)+(i<<2)|0;g=c[f>>2]|0;if(!(a[j>>0]|0)){g=g+32|0;c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];h[q>>3]=+h[(c[f>>2]|0)+16>>3];f=k;g=0}else{g=g+16|0;c[q>>2]=c[g>>2];c[q+4>>2]=c[g+4>>2];c[q+8>>2]=c[g+8>>2];c[q+12>>2]=c[g+12>>2];h[k>>3]=+h[q>>3];f=(c[f>>2]|0)+32|0;g=1}h[q+(g<<4)+8>>3]=+h[f+8>>3];c[o>>2]=c[q>>2];c[o+4>>2]=c[q+4>>2];c[o+8>>2]=c[q+8>>2];c[o+12>>2]=c[q+12>>2];c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];uN(s,o,p);c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];c[o>>2]=c[k>>2];c[o+4>>2]=c[k+4>>2];c[o+8>>2]=c[k+8>>2];c[o+12>>2]=c[k+12>>2];c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];uN(t,o,p);c[k>>2]=c[t>>2];c[k+4>>2]=c[t+4>>2];c[k+8>>2]=c[t+8>>2];c[k+12>>2]=c[t+12>>2];oS(b,q,2)}MN(b,d,c[(c[n>>2]|0)+(i<<2)>>2]|0);i=i+1|0}l=u;return}function NN(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=(+h[b+8>>3]+ +h[c+8>>3])*.5;h[a>>3]=(+h[b>>3]+ +h[c>>3])*.5;h[a+8>>3]=d;return}function ON(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=c[b+60>>2]|0;if(!(((e|0)!=0?(a[e>>0]|0)==(a[d>>0]|0):0)?(f2(e,d)|0)==0:0))f=4;a:do if((f|0)==4){g=b+56|0;f=c[b+48>>2]|0;e=0;while(1){if((e|0)>=(f|0)){b=0;break a}b=ON(c[(c[g>>2]|0)+(e<<2)>>2]|0,d)|0;if(!b)e=e+1|0;else break}}while(0);return b|0}function PN(a,b){a=a|0;b=b|0;var d=0;d=b+8|0;h[d>>3]=+h[d>>3]*1.375;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function QN(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0;f=+h[b>>3]*.5;m=+h[b+8>>3];i=m*.5;m=m/11.0;h[a>>3]=f;e=i-m;h[a+8>>3]=e;h[a+16>>3]=f;g=i-m*.44821599999999995;h[a+24>>3]=g;j=f*.551784;h[a+32>>3]=j;h[a+40>>3]=i;h[a+48>>3]=0.0;h[a+56>>3]=i;k=f*-.551784;h[a+64>>3]=k;h[a+72>>3]=i;l=-f;h[a+80>>3]=l;h[a+88>>3]=g;d=a+96|0;h[d>>3]=l;h[a+104>>3]=e;b=a+112|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];b=a+128|0;h[b>>3]=l;h[a+136>>3]=m-i;d=a+144|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];h[a+160>>3]=l;g=-g;h[a+168>>3]=g;h[a+176>>3]=k;i=-i;h[a+184>>3]=i;h[a+192>>3]=0.0;h[a+200>>3]=i;h[a+208>>3]=j;h[a+216>>3]=i;h[a+224>>3]=f;h[a+232>>3]=g;d=a+240|0;h[d>>3]=f;h[a+248>>3]=-e;b=a+256|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];b=a+288|0;d=a+272|0;c[d>>2]=c[a>>2];c[d+4>>2]=c[a+4>>2];c[d+8>>2]=c[a+8>>2];c[d+12>>2]=c[a+12>>2];c[b>>2]=c[a>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[b+12>>2]=c[a+12>>2];return}function RN(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+144|0;u=x+112|0;t=x+96|0;w=x+80|0;s=x+64|0;v=x+32|0;q=x+16|0;r=x;f=x+48|0;do if(a){j=c[a+4>>2]|0;k=c[a>>2]|0;o=(c[(c[(uC(k)|0)+16>>2]|0)+116>>2]&3)*90|0;c[u>>2]=c[b>>2];c[u+4>>2]=c[b+4>>2];c[u+8>>2]=c[b+8>>2];c[u+12>>2]=c[b+12>>2];kK(f,u,o);c[v>>2]=c[f>>2];c[v+4>>2]=c[f+4>>2];c[v+8>>2]=c[f+8>>2];c[v+12>>2]=c[f+12>>2];f=v+8|0;if(j|0){d=+h[v>>3];if(!(+h[j>>3]<=d)){a=0;break}if(!(d<=+h[j+16>>3])){a=0;break}d=+h[f>>3];if(!(+h[j+8>>3]<=d)){a=0;break}a=d<=+h[j+24>>3];break}if((k|0)==(c[47362]|0)){d=+h[23330];e=+h[23331];i=+h[23332]}else{a=k+16|0;b=c[(c[a>>2]|0)+12>>2]|0;c[47363]=b;c[47364]=c[b+44>>2];c[47365]=c[b+8>>2];if(!(c[b+40>>2]&2048)){n=(c[(c[(uC(k)|0)+16>>2]|0)+116>>2]&1|0)==0;o=c[a>>2]|0;h[(n?186664:186672)>>3]=+h[o+88>>3]+ +h[o+96>>3];h[(n?186672:186664)>>3]=+h[o+80>>3];i=+h[o+32>>3]*72.0;g=+h[o+40>>3]*72.0;g=+(~~(g+(g>=0.0?.5:-.5))|0);i=+(~~(i+(i>=0.0?.5:-.5))|0)}else{wP(u,b);i=+h[u+16>>3]-+h[u>>3];g=+h[u+24>>3]-+h[u+8>>3];o=(c[(c[(uC(k)|0)+16>>2]|0)+116>>2]&1|0)==0;h[(o?186664:186672)>>3]=i;h[(o?186672:186664)>>3]=g}d=+h[23333];if(d==0.0){h[23333]=1.0;d=1.0}e=+h[23334];if(e==0.0){h[23334]=1.0;e=1.0}d=i/d;h[23330]=d;e=g/e;h[23331]=e;i=i*.5;h[23332]=i;h[23335]=g*.5;o=S((c[(c[47363]|0)+4>>2]|0)+-1|0,c[47365]|0)|0;c[47366]=(o|0)>0?o:0;c[47362]=k}g=d*+h[v>>3];h[v>>3]=g;d=e*+h[f>>3];h[f>>3]=d;if(!(+F(+g)>i)?(e=+F(+d),p=+h[23335],!(e>p)):0){o=c[47365]|0;if((o|0)<3){a=+c2(g/i,d/p)<1.0;break}b=(c[47367]|0)%(o|0)|0;a=(b+1|0)%(o|0)|0;k=c[47364]|0;m=c[47366]|0;n=k+(m+b<<4)|0;c[q>>2]=c[n>>2];c[q+4>>2]=c[n+4>>2];c[q+8>>2]=c[n+8>>2];c[q+12>>2]=c[n+12>>2];n=k+(m+a<<4)|0;c[r>>2]=c[n>>2];c[r+4>>2]=c[n+4>>2];c[r+8>>2]=c[n+8>>2];c[r+12>>2]=c[n+12>>2];c[s>>2]=c[v>>2];c[s+4>>2]=c[v+4>>2];c[s+8>>2]=c[v+8>>2];c[s+12>>2]=c[v+12>>2];c[w>>2]=c[46672];c[w+4>>2]=c[46673];c[w+8>>2]=c[46674];c[w+12>>2]=c[46675];c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[u>>2]=c[n>>2];c[u+4>>2]=c[n+4>>2];c[u+8>>2]=c[n+8>>2];c[u+12>>2]=c[n+12>>2];if(zN(s,w,t,u)|0){c[s>>2]=c[v>>2];c[s+4>>2]=c[v+4>>2];c[s+8>>2]=c[v+8>>2];c[s+12>>2]=c[v+12>>2];c[w>>2]=c[q>>2];c[w+4>>2]=c[q+4>>2];c[w+8>>2]=c[q+8>>2];c[w+12>>2]=c[q+12>>2];c[t>>2]=c[r>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2];c[u>>2]=c[46672];c[u+4>>2]=c[46673];c[u+8>>2]=c[46674];c[u+12>>2]=c[46675];n=(zN(s,w,t,u)|0)!=0;if(n?(c[s>>2]=c[v>>2],c[s+4>>2]=c[v+4>>2],c[s+8>>2]=c[v+8>>2],c[s+12>>2]=c[v+12>>2],c[w>>2]=c[r>>2],c[w+4>>2]=c[r+4>>2],c[w+8>>2]=c[r+8>>2],c[w+12>>2]=c[r+12>>2],c[t>>2]=c[46672],c[t+4>>2]=c[46673],c[t+8>>2]=c[46674],c[t+12>>2]=c[46675],c[u>>2]=c[q>>2],c[u+4>>2]=c[q+4>>2],c[u+8>>2]=c[q+8>>2],c[u+12>>2]=c[q+12>>2],(zN(s,w,t,u)|0)!=0):0){a=1;break}else{j=b;b=1}while(1){if((b|0)>=(o|0)){b=31;break}if(n){f=a;a=(a+1|0)%(o|0)|0}else{f=(j+-1+o|0)%(o|0)|0;a=j}q=k+(m+f<<4)|0;r=k+(m+a<<4)|0;c[s>>2]=c[v>>2];c[s+4>>2]=c[v+4>>2];c[s+8>>2]=c[v+8>>2];c[s+12>>2]=c[v+12>>2];c[w>>2]=c[46672];c[w+4>>2]=c[46673];c[w+8>>2]=c[46674];c[w+12>>2]=c[46675];c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[u>>2]=c[r>>2];c[u+4>>2]=c[r+4>>2];c[u+8>>2]=c[r+8>>2];c[u+12>>2]=c[r+12>>2];if(!(zN(s,w,t,u)|0)){b=30;break}else{j=f;b=b+1|0}}if((b|0)==30){c[47367]=f;a=0;break}else if((b|0)==31){c[47367]=j;a=1;break}}else a=0}else a=0}else{c[47362]=0;a=0}while(0);l=x;return a&1|0}function SN(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0.0,i=0,j=0,k=0;j=l;l=l+32|0;f=j+16|0;i=j;if(a){a=c[a>>2]|0;k=(c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&3)*90|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];kK(i,f,k);g=+h[i>>3];e=+h[i+8>>3];if((a|0)==(c[47370]|0))d=+h[23338];else{i=c[(c[a+16>>2]|0)+12>>2]|0;k=(c[i+4>>2]<<1)+-2|0;d=+h[(c[i+44>>2]|0)+((((k|0)>0?k:0)|1)<<4)>>3];h[23338]=d;c[47370]=a}if(!(+F(+g)>d)?!(+F(+e)>d):0)a=+c2(g,e)<=d&1;else a=0}else{c[47370]=0;a=0}l=j;return a|0}function TN(e,f){e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0;w=l;l=l+16|0;p=w;m=c[e+16>>2]|0;v=m+208|0;n=c[v>>2]|0;if(!n){i=m+228|0;j=m+212|0;k=m+244|0;g=e+152|0;if(!(b[m+260>>1]&1)){u=i;t=0}else o=4}else{g=e+152|0;i=m+228|0;k=m+244|0;j=m+212|0;o=4}if((o|0)==4)if(!(c[g>>2]&4)){aS(e,n,c[i>>2]|0,c[k>>2]|0,c[j>>2]|0);u=i;t=1}else{u=i;t=1}q=f+16|0;n=c[(c[q>>2]|0)+12>>2]|0;r=c[n+44>>2]|0;s=c[n+8>>2]|0;n=c[n+4>>2]|0;if((c[47368]|0)<(s|0)){m=s+2|0;c[47368]=m;i=c[47369]|0;m=m<<4;if(!i)i=IK(m)|0;else i=KK(i,m)|0;c[47369]=i}wN(f,p)|0;if(!(c[p>>2]&32))jS(e,22068);else jS(e,22064);i=c[47234]|0;if(i|0)sS(e,+YO(f,i,1.0,0.0));i=d[(c[q>>2]|0)+117>>0]|0;do if(!(i&1)){if(i&2|0){fS(e,$O(f,c[47206]|0,106557)|0);i=$O(f,c[47207]|0,106565)|0;hS(e,i);break}if(i&8|0){fS(e,$O(f,c[47210]|0,106573)|0);i=$O(f,c[47211]|0,106581)|0;hS(e,i);break}if(!(i&4)){i=vN(f,137615)|0;hS(e,i);sN(e,f)|0;break}else{fS(e,$O(f,c[47208]|0,106589)|0);i=$O(f,c[47209]|0,106597)|0;hS(e,i);break}}else{fS(e,$O(f,c[47204]|0,106541)|0);i=$O(f,c[47205]|0,106549)|0;hS(e,i)}while(0);if(!n)if(!(a[i>>0]|0))m=1;else{fS(e,i);m=1}else m=n;n=1;o=0;while(1){if((o|0)>=(m|0))break;p=c[47369]|0;f=S(o,s)|0;i=0;while(1){if((i|0)>=(s|0))break;z=i+f|0;y=+h[r+(z<<4)+8>>3];x=c[q>>2]|0;h[p+(i<<4)>>3]=+h[r+(z<<4)>>3]+ +h[x+16>>3];h[p+(i<<4)+8>>3]=y+ +h[x+24>>3];i=i+1|0}kS(e,p,s,n);n=0;o=o+1|0}if(t){if(c[g>>2]&4|0)aS(e,c[v>>2]|0,c[u>>2]|0,c[k>>2]|0,c[j>>2]|0);bS(e)}l=w;return}function UN(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0;g=l;l=l+48|0;h=g;e=VN(b,e,f)|0;c[h+36>>2]=c[f+36>>2];AN(b,c[f+24>>2]|0,h,e,d[f+33>>0]|0,0)|0;b=h;e=a+40|0;do{c[a>>2]=c[b>>2];a=a+4|0;b=b+4|0}while((a|0)<(e|0));l=g;return}function VN(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0;z=l;l=l+32|0;y=z;j=z+24|0;n=z+16|0;x=c[(c[(c[(uC(b)|0)+60>>2]|0)+16>>2]|0)+116>>2]&3;f=b+16|0;w=(c[f>>2]|0)+16|0;c[y>>2]=c[w>>2];c[y+4>>2]=c[w+4>>2];c[y+8>>2]=c[w+8>>2];c[y+12>>2]=c[w+12>>2];WN(j,y,x);w=(c[d+16>>2]|0)+16|0;c[y>>2]=c[w>>2];c[y+4>>2]=c[w+4>>2];c[y+8>>2]=c[w+8>>2];c[y+12>>2]=c[w+12>>2];WN(n,y,x);x=a[e+33>>0]|0;y=x&255;a:do switch(x<<24>>24){case 0:case 15:{d=0;break}default:{d=c[e+24>>2]|0;if(!d){x=(c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&1|0)==0;w=c[f>>2]|0;B=+h[w+80>>3]*.5;A=-B;k=+h[w+88>>3];g=-k;m=x?g:A;i=x?k:B;k=x?B:k;g=x?A:g}else{m=+h[d>>3];i=+h[d+16>>3];k=+h[d+24>>3];g=+h[d+8>>3]}v=~~((g+k)*.5);w=~~((m+i)*.5);x=c[j>>2]|0;t=c[j+4>>2]|0;u=c[n>>2]|0;s=c[n+4>>2]|0;r=~~g;q=~~i;p=~~k;o=~~m;j=0;n=0;d=0;e=0;b=0;while(1){if((n|0)==4)break a;if(1<>2]|0;else f=j}else f=j;j=f;n=n+1|0}}}while(0);l=z;return d|0}function WN(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0;g=b+8|0;switch(d|0){case 0:{f=+h[b>>3];e=+h[g>>3];break}case 2:{f=+h[b>>3];e=-+h[g>>3];break}case 1:{f=-+h[g>>3];e=+h[b>>3];break}case 3:{f=+h[g>>3];e=+h[b>>3];break}default:{f=0.0;e=0.0}}c[a>>2]=~~(f+(f>=0.0?.5:-.5));c[a+4>>2]=~~(e+(e>=0.0?.5:-.5));return}function XN(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+80|0;f=k+40|0;i=k;g=b+16|0;e=c[g>>2]|0;d=e+16|0;j=b+-48|0;h=b+48|0;if(a[e+47>>0]|0){e=c[b>>2]&3;UN(f,c[((e|0)==3?b:h)+40>>2]|0,c[((e|0)==2?b:j)+40>>2]|0,d);e=f;f=d+40|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));e=c[g>>2]|0}d=e+56|0;if(a[e+87>>0]|0){e=c[b>>2]&3;UN(i,c[((e|0)==2?b:j)+40>>2]|0,c[((e|0)==3?b:h)+40>>2]|0,d);e=i;f=d+40|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0))}l=k;return}function YN(){var a=0,b=0,d=0;a=l;l=l+32|0;b=a+16|0;d=a;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];RN(0,b)|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];SN(0,b)|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];nN(0,b)|0;l=a;return}function ZN(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;z=l;l=l+192|0;s=z+176|0;x=z+112|0;y=z+48|0;t=z+32|0;u=z+24|0;v=z+16|0;w=z;if(!(e<<24>>24)){k=d+48|0;c[t>>2]=c[k>>2];c[t+4>>2]=c[k+4>>2];c[t+8>>2]=c[k+8>>2];c[t+12>>2]=c[k+12>>2];k=u;m=v;n=x;o=0}else{c[t>>2]=c[d>>2];c[t+4>>2]=c[d+4>>2];c[t+8>>2]=c[d+8>>2];c[t+12>>2]=c[d+12>>2];k=v;m=u;n=0;o=x}h[u>>3]=0.0;h[v>>3]=1.0;q=t+8|0;f=0.0;g=1.0;j=0;p=+h[t>>3];while(1){r=+h[q>>3];f=(g+f)*.5;iP(w,d,3,f,n,o);c[t>>2]=c[w>>2];c[t+4>>2]=c[w+4>>2];c[t+8>>2]=c[w+8>>2];c[t+12>>2]=c[w+12>>2];c[s>>2]=c[w>>2];c[s+4>>2]=c[w+4>>2];c[s+8>>2]=c[w+8>>2];c[s+12>>2]=c[w+12>>2];a:do if(!((vb[b&127](a,s)|0)<<24>>24)){e=0;while(1){if((e|0)==4){e=k;j=1;break a}j=y+(e<<4)|0;A=x+(e<<4)|0;c[j>>2]=c[A>>2];c[j+4>>2]=c[A+4>>2];c[j+8>>2]=c[A+8>>2];c[j+12>>2]=c[A+12>>2];e=e+1|0}}else e=m;while(0);h[e>>3]=f;i=+h[t>>3];p=p-i;if(!((p>=0.0?p:-p)>.5)?(r=r-+h[q>>3],!((r>=0.0?r:-r)>.5)):0)break;f=+h[u>>3];g=+h[v>>3];p=i}b:do if(!(j<<24>>24)){e=0;while(1){if((e|0)==4)break b;A=d+(e<<4)|0;y=x+(e<<4)|0;c[A>>2]=c[y>>2];c[A+4>>2]=c[y+4>>2];c[A+8>>2]=c[y+8>>2];c[A+12>>2]=c[y+12>>2];e=e+1|0}}else{e=0;while(1){if((e|0)==4)break b;A=d+(e<<4)|0;x=y+(e<<4)|0;c[A>>2]=c[x>>2];c[A+4>>2]=c[x+4>>2];c[A+8>>2]=c[x+8>>2];c[A+12>>2]=c[x+12>>2];e=e+1|0}}while(0);l=z;return}function _N(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0.0;m=l;l=l+48|0;d=m+16|0;f=m;g=m+32|0;i=a+16|0;j=c[i>>2]|0;k=c[j+8>>2]|0;if(k|0?(e=c[(c[k+4>>2]|0)+12>>2]|0,e|0):0){c[g>>2]=a;c[g+4>>2]=0;n=+h[j+96>>3];h[f>>3]=+h[b>>3]-+h[j+16>>3];h[f+8>>3]=+h[b+8>>3]-+h[j+24>>3];c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];k=vb[e&127](g,d)|0;h[(c[i>>2]|0)+96>>3]=n;$N(g,a,b,k)}l=m;return}function $N(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,m=0,n=0;n=l;l=l+64|0;m=n;g=b+16|0;i=c[g>>2]|0;k=+h[i+96>>3];j=i+16|0;f=i+24|0;b=0;while(1){if((b|0)==4)break;h[m+(b<<4)>>3]=+h[d+(b<<4)>>3]-+h[j>>3];h[m+(b<<4)+8>>3]=+h[d+(b<<4)+8>>3]-+h[f>>3];b=b+1|0}ZN(a,c[(c[(c[i+8>>2]|0)+4>>2]|0)+12>>2]|0,m,e);f=c[g>>2]|0;g=f+16|0;i=f+24|0;b=0;while(1){if((b|0)==4)break;h[d+(b<<4)>>3]=+h[m+(b<<4)>>3]+ +h[g>>3];h[d+(b<<4)+8>>3]=+h[m+(b<<4)+8>>3]+ +h[i>>3];b=b+1|0}h[f+96>>3]=k;l=n;return}function aO(b,d){b=b|0;d=d|0;var e=0,f=0;while(1){f=b+16|0;b=c[f>>2]|0;if(!(a[b+112>>0]|0))break;b=c[b+116>>2]|0}b=c[b+8>>2]|0;if(!b){b=HK(40)|0;c[(c[f>>2]|0)+8>>2]=b}e=c[b>>2]|0;b=((c[b+4>>2]|0)*48|0)+48|0;if(!e)b=IK(b)|0;else b=KK(e,b)|0;f=c[(c[f>>2]|0)+8>>2]|0;c[f>>2]=b;f=f+4|0;e=c[f>>2]|0;c[f>>2]=e+1;f=b+(e*48|0)|0;c[f>>2]=HK(d<<4)|0;c[b+(e*48|0)+4>>2]=d;b=b+(e*48|0)+8|0;e=b+40|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(e|0));return f|0}function bO(b,e,f,g,i){b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0.0;D=l;l=l+96|0;A=D+16|0;t=D;x=D+92|0;y=D+88|0;u=D+80|0;m=c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0;z=uC(m)|0;B=aO(b,g)|0;n=b;while(1){o=c[n+16>>2]|0;if(!(a[o+112>>0]|0))break;n=c[o+116>>2]|0}if((a[i+8>>0]|0)==0?(j=c[m+16>>2]|0,k=c[e+16>>2]|0,(c[j+232>>2]|0)==(c[k+232>>2]|0)):0){p=(c[j+236>>2]|0)>(c[k+236>>2]|0);w=p?m:e;m=p?e:m}else w=e;F=(m|0)==(c[((c[n>>2]&3|0)==3?n:n+48|0)+40>>2]|0);p=c[o+40>>2]|0;e=c[o+80>>2]|0;k=d[o+86>>0]|0;E=d[o+46>>0]|0;n=F?k:E;j=F?p:e;o=F?e:p;p=g+-4|0;g=t+8|0;e=u+4|0;if((((F?E:k)|0)!=0?(r=m+16|0,q=c[(c[r>>2]|0)+8>>2]|0,(q|0)!=0):0)?(c[(c[q+4>>2]|0)+12>>2]|0)!=0:0){c[u>>2]=m;c[e>>2]=j;k=0;while(1){if((k|0)>=(p|0))break;j=k+3|0;F=c[r>>2]|0;h[t>>3]=+h[f+(j<<4)>>3]-+h[F+16>>3];h[g>>3]=+h[f+(j<<4)+8>>3]-+h[F+24>>3];F=c[(c[(c[F+8>>2]|0)+4>>2]|0)+12>>2]|0;c[A>>2]=c[t>>2];c[A+4>>2]=c[t+4>>2];c[A+8>>2]=c[t+8>>2];c[A+12>>2]=c[t+12>>2];if(!((vb[F&127](u,A)|0)<<24>>24))break;else k=j}c[x>>2]=k;$N(u,m,f+(k<<4)|0,1)}else{c[x>>2]=0;k=0}if(((n|0)!=0?(v=w+16|0,s=c[(c[v>>2]|0)+8>>2]|0,(s|0)!=0):0)?(c[(c[s+4>>2]|0)+12>>2]|0)!=0:0){c[u>>2]=w;c[e>>2]=o;j=p;while(1){if((j|0)<=0)break;F=c[v>>2]|0;h[t>>3]=+h[f+(j<<4)>>3]-+h[F+16>>3];h[g>>3]=+h[f+(j<<4)+8>>3]-+h[F+24>>3];F=c[(c[(c[F+8>>2]|0)+4>>2]|0)+12>>2]|0;c[A>>2]=c[t>>2];c[A+4>>2]=c[t+4>>2];c[A+8>>2]=c[t+8>>2];c[A+12>>2]=c[t+12>>2];if(!((vb[F&127](u,A)|0)<<24>>24))break;j=j+-3|0}c[y>>2]=j;$N(u,w,f+(j<<4)|0,0)}else{c[y>>2]=p;j=p}while(1){if((k|0)>=(p|0))break;e=k+3|0;H=+h[f+(k<<4)>>3]-+h[f+(e<<4)>>3];G=+h[f+(k<<4)+8>>3]-+h[f+(e<<4)+8>>3];if(H*H+G*G<1.0e-06)k=e;else break}c[x>>2]=k;while(1){if((j|0)<=0)break;F=j+3|0;G=+h[f+(j<<4)>>3]-+h[f+(F<<4)>>3];H=+h[f+(j<<4)+8>>3]-+h[f+(F<<4)+8>>3];if(!(G*G+H*H<1.0e-06))break;j=j+-3|0}c[y>>2]=j;cO(b,w,f,x,y,B,i);p=c[x>>2]|0;m=(c[y>>2]|0)+4|0;n=A+16|0;o=A+32|0;g=A+48|0;k=z+16|0;j=p;while(1){if((j|0)>=(m|0))break;F=(c[B>>2]|0)+(j-p<<4)|0;e=f+(j<<4)|0;c[F>>2]=c[e>>2];c[F+4>>2]=c[e+4>>2];c[F+8>>2]=c[e+8>>2];c[F+12>>2]=c[e+12>>2];c[A>>2]=c[e>>2];c[A+4>>2]=c[e+4>>2];c[A+8>>2]=c[e+8>>2];c[A+12>>2]=c[e+12>>2];e=j+1|0;if((e|0)>=(m|0)){C=35;break}E=(c[B>>2]|0)+(e-p<<4)|0;F=f+(e<<4)|0;c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];c[n>>2]=c[F>>2];c[n+4>>2]=c[F+4>>2];c[n+8>>2]=c[F+8>>2];c[n+12>>2]=c[F+12>>2];F=j+2|0;E=(c[B>>2]|0)+(F-p<<4)|0;F=f+(F<<4)|0;c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];c[o>>2]=c[F>>2];c[o+4>>2]=c[F+4>>2];c[o+8>>2]=c[F+8>>2];c[o+12>>2]=c[F+12>>2];F=j+3|0;E=f+(F<<4)|0;c[g>>2]=c[E>>2];c[g+4>>2]=c[E+4>>2];c[g+8>>2]=c[E+8>>2];c[g+12>>2]=c[E+12>>2];jI((c[k>>2]|0)+16|0,A);j=F}c[B+4>>2]=m-p;l=D;return}function cO(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;m=p+4|0;n=p;o=b;while(1){j=c[(c[o+16>>2]|0)+116>>2]|0;if(!j)break;else o=j}if(!(a[i+8>>0]|0))k=(pb[c[i>>2]&63](o)|0)&255;else k=0;FH(o,m,n);j=i+4|0;if((pb[c[j>>2]&63](d)|0)<<24>>24)c[n>>2]=0;if(!((pb[c[j>>2]&63](c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0)<<24>>24))b=c[m>>2]|0;else{c[m>>2]=0;b=0}if(k){d=c[n>>2]|0;c[m>>2]=d;c[n>>2]=b;b=d}if(!(a[i+9>>0]|0)){if(b|0)c[f>>2]=UH(o,e,c[f>>2]|0,c[g>>2]|0,h,b)|0;j=c[n>>2]|0;if(j|0)c[g>>2]=SH(o,e,c[f>>2]|0,c[g>>2]|0,h,j)|0}else{j=c[n>>2]|0;if(j|b|0)VH(o,e,c[f>>2]|0,c[g>>2]|0,h,b,j)}l=p;return}function dO(a,b){a=a|0;b=b|0;var d=0,e=0;if(+h[b>>3]<+h[b+16>>3]?+h[b+8>>3]<+h[b+24>>3]:0){d=c[a+84>>2]|0;e=a+80|0;a=c[e>>2]|0;c[e>>2]=a+1;a=d+(a<<5)|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+20>>2]=c[b+20>>2];c[a+24>>2]=c[b+24>>2];c[a+28>>2]=c[b+28>>2]}return}function eO(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0;D=l;l=l+112|0;A=D+72|0;r=D+56|0;p=D+16|0;s=D;n=c[d>>2]&3;t=d+48|0;B=c[((n|0)==3?d:t)+40>>2]|0;u=d+16|0;z=c[u>>2]|0;i=z+16|0;if(a[z+47>>0]|0){UN(p,B,c[((n|0)==2?d:d+-48|0)+40>>2]|0,i);n=p;p=i+40|0;do{c[i>>2]=c[n>>2];i=i+4|0;n=n+4|0}while((i|0)<(p|0))}w=B+16|0;n=c[w>>2]|0;i=c[n+8>>2]|0;if(!i)p=0;else p=c[(c[i+4>>2]|0)+16>>2]|0;z=n+16|0;n=(c[u>>2]|0)+16|0;c[r>>2]=c[z>>2];c[r+4>>2]=c[z+4>>2];c[r+8>>2]=c[z+8>>2];c[r+12>>2]=c[z+12>>2];c[A>>2]=c[n>>2];c[A+4>>2]=c[n+4>>2];c[A+8>>2]=c[n+8>>2];c[A+12>>2]=c[n+12>>2];fO(s,r,A);c[b>>2]=c[s>>2];c[b+4>>2]=c[s+4>>2];c[b+8>>2]=c[s+8>>2];c[b+12>>2]=c[s+12>>2];n=b+16|0;if(!(g<<24>>24)){i=c[u>>2]|0;if(!(a[i+45>>0]|0))i=0;else{j=+h[i+32>>3];C=9}}else{j=+gO(c[((c[d>>2]&3|0)==3?d:t)+40>>2]|0);C=9}if((C|0)==9){h[n>>3]=j;i=1}a[b+29>>0]=i;c[b+80>>2]=0;c[b+88>>2]=d;y=f+32|0;c[y>>2]=c[b>>2];c[y+4>>2]=c[b+4>>2];c[y+8>>2]=c[b+8>>2];c[y+12>>2]=c[b+12>>2];y=f+48|0;z=f+52|0;t=b+8|0;g=f+56|0;switch(e|0){case 1:{i=c[w>>2]|0;if((a[i+156>>0]|0)==0?(s=a[(c[u>>2]|0)+49>>0]|0,x=s&255,s<<24>>24!=0):0){c[A>>2]=c[f>>2];c[A+4>>2]=c[f+4>>2];c[A+8>>2]=c[f+8>>2];c[A+12>>2]=c[f+12>>2];c[A+16>>2]=c[f+16>>2];c[A+20>>2]=c[f+20>>2];c[A+24>>2]=c[f+24>>2];c[A+28>>2]=c[f+28>>2];s=A+16|0;r=i+80|0;o=+h[t>>3];p=i+24|0;do if(!(x&4)){i=A+24|0;if(x&1|0){c[y>>2]=1;h[i>>3]=+h[(+h[i>>3]>o?s:b)+8>>3];c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1;break}n=A+8|0;k=+h[b>>3];j=+h[p>>3]-+h[r>>3]*.5;if(!(x&8)){c[y>>2]=2;h[A>>3]=k;h[n>>3]=j;h[i>>3]=o;c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1;break}else{c[y>>2]=8;h[s>>3]=k;h[n>>3]=j;h[i>>3]=o;c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1;break}}else{c[y>>2]=4;m=+h[A>>3];j=+h[p>>3]+ +h[r>>3]*.5;k=+h[s>>3];if(+h[b>>3]<+h[i+16>>3]){m=m+-1.0;q=j+ +((c[(c[(uC(B)|0)+16>>2]|0)+252>>2]|0)/2|0|0);i=c[w>>2]|0;h[s>>3]=+h[i+16>>3]-+h[i+88>>3];h[A+24>>3]=o;h[A+8>>3]=+h[i+24>>3]-+h[i+80>>3]*.5;h[A>>3]=m;h[f+56>>3]=m;h[f+64>>3]=o;h[f+72>>3]=k;h[f+80>>3]=q;i=f+88|0;c[i>>2]=c[A>>2];c[i+4>>2]=c[A+4>>2];c[i+8>>2]=c[A+8>>2];c[i+12>>2]=c[A+12>>2];c[i+16>>2]=c[A+16>>2];c[i+20>>2]=c[A+20>>2];c[i+24>>2]=c[A+24>>2];c[i+28>>2]=c[A+28>>2];i=2;break}else{k=k+1.0;q=j+ +((c[(c[(uC(B)|0)+16>>2]|0)+252>>2]|0)/2|0|0);i=c[w>>2]|0;h[A>>3]=+h[i+16>>3]+ +h[i+96>>3]+0.0;h[A+24>>3]=o;h[A+8>>3]=+h[i+24>>3]-+h[i+80>>3]*.5;h[s>>3]=k;h[f+56>>3]=m;h[f+64>>3]=o;h[f+72>>3]=k;h[f+80>>3]=q;i=f+88|0;c[i>>2]=c[A>>2];c[i+4>>2]=c[A+4>>2];c[i+8>>2]=c[A+8>>2];c[i+12>>2]=c[A+12>>2];c[i+16>>2]=c[A+16>>2];c[i+20>>2]=c[A+20>>2];c[i+24>>2]=c[A+24>>2];c[i+28>>2]=c[A+28>>2];i=2;break}}while(0);c[z>>2]=i;while(1){i=c[d+16>>2]|0;if(!(a[i+112>>0]|0))break;d=c[i+116>>2]|0}a[((B|0)==(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)?i+16|0:i+56|0)+30>>0]=0}else{d=1;C=47}break}case 2:{x=a[(c[u>>2]|0)+49>>0]|0;s=x&255;if(!(x<<24>>24))C=46;else{c[A>>2]=c[f>>2];c[A+4>>2]=c[f+4>>2];c[A+8>>2]=c[f+8>>2];c[A+12>>2]=c[f+12>>2];c[A+16>>2]=c[f+16>>2];c[A+20>>2]=c[f+20>>2];c[A+24>>2]=c[f+24>>2];c[A+28>>2]=c[f+28>>2];n=A+8|0;do if(!(s&4)){i=A+16|0;p=A+24|0;r=(c[y>>2]|0)==4;if(s&1|0)if(r){x=c[w>>2]|0;q=+h[x+24>>3]-+h[x+80>>3]*.5;o=+h[i>>3]+1.0;k=+h[b>>3];m=q-+((c[(c[(uC(B)|0)+16>>2]|0)+252>>2]|0)/2|0|0);b=c[w>>2]|0;h[A>>3]=+h[b+16>>3]+ +h[b+96>>3]+0.0;h[n>>3]=q;h[p>>3]=+h[b+24>>3]+ +h[b+80>>3]*.5;h[i>>3]=o;h[f+56>>3]=k;h[f+64>>3]=m;h[f+72>>3]=o;h[f+80>>3]=q;i=f+88|0;c[i>>2]=c[A>>2];c[i+4>>2]=c[A+4>>2];c[i+8>>2]=c[A+8>>2];c[i+12>>2]=c[A+12>>2];c[i+16>>2]=c[A+16>>2];c[i+20>>2]=c[A+20>>2];c[i+24>>2]=c[A+24>>2];c[i+28>>2]=c[A+28>>2];i=2;break}else{h[p>>3]=+h[(+h[p>>3]>+h[t>>3]?i:b)+8>>3];c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1;break}q=+h[b>>3];b=c[w>>2]|0;k=+h[t>>3];o=+h[b+80>>3]*.5;j=k+1.0;E=+h[b+24>>3];m=E-o;o=E+o;if(!(s&8)){h[A>>3]=q;if(r){h[p>>3]=o;j=k;i=A}else h[n>>3]=m;h[i+8>>3]=j;c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1;break}else{h[i>>3]=q+1.0;if(r){h[p>>3]=o;j=k+-1.0;i=A}else h[n>>3]=m;h[i+8>>3]=j;c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1;break}}else{h[n>>3]=+h[(+h[n>>3]<+h[t>>3]?A:b)+8>>3];c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1}while(0);c[z>>2]=i;while(1){i=c[d+16>>2]|0;if(!(a[i+112>>0]|0))break;d=c[i+116>>2]|0}a[((B|0)==(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)?i+16|0:i+56|0)+30>>0]=0;c[y>>2]=s}break}default:C=46}if((C|0)==46){d=c[y>>2]|0;C=47}a:do if((C|0)==47){if(p|0?(v=wb[p&63](B,(c[u>>2]|0)+16|0,d,g,z)|0,v|0):0){c[y>>2]=v;break};c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];c[g+16>>2]=c[f+16>>2];c[g+20>>2]=c[f+20>>2];c[g+24>>2]=c[f+24>>2];c[g+28>>2]=c[f+28>>2];c[z>>2]=1;switch(e|0){case 8:{Aa(138697,106815,569,106825);break}case 2:{h[((c[y>>2]|0)==4?g:f+72|0)+8>>3]=+h[t>>3];break a}case 1:{h[f+80>>3]=+h[t>>3];c[y>>2]=1;break a}default:break a}}while(0);l=D;return}function fO(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=d;return}function gO(a){a=a|0;var b=0.0,d=0,e=0,f=0.0,g=0,i=0,j=0,k=0.0,l=0.0;i=c[a+16>>2]|0;j=c[i+172>>2]|0;f=0.0;g=0;while(1){a=c[j+(g<<2)>>2]|0;if(!a)break;f=f+ +h[(c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+16>>3];g=g+1|0}e=c[i+180>>2]|0;b=0.0;a=0;while(1){d=c[e+(a<<2)>>2]|0;if(!d)break;b=b+ +h[(c[(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+16>>3];a=a+1|0}k=+h[i+16>>3];l=+h[i+24>>3];j=c[j>>2]|0;f=+O(+(l-+h[(c[(c[((c[j>>2]&3|0)==3?j:j+48|0)+40>>2]|0)+16>>2]|0)+24>>3]),+(k-f/+(g|0)));j=c[e>>2]|0;return +((f+ +O(+(+h[(c[(c[((c[j>>2]&3|0)==2?j:j+-48|0)+40>>2]|0)+16>>2]|0)+24>>3]-l),+(b/+(a|0)-k)))*.5)}function hO(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=l;l=l+112|0;C=F+72|0;r=F+56|0;p=F+16|0;t=F;o=c[d>>2]&3;v=d+-48|0;D=c[((o|0)==2?d:v)+40>>2]|0;x=d+16|0;B=c[x>>2]|0;i=B+56|0;if(a[B+87>>0]|0){UN(p,D,c[((o|0)==3?d:d+48|0)+40>>2]|0,i);o=p;p=i+40|0;do{c[i>>2]=c[o>>2];i=i+4|0;o=o+4|0}while((i|0)<(p|0))}z=D+16|0;o=c[z>>2]|0;i=c[o+8>>2]|0;if(!i)p=0;else p=c[(c[i+4>>2]|0)+16>>2]|0;w=b+40|0;B=o+16|0;o=(c[x>>2]|0)+56|0;c[r>>2]=c[B>>2];c[r+4>>2]=c[B+4>>2];c[r+8>>2]=c[B+8>>2];c[r+12>>2]=c[B+12>>2];c[C>>2]=c[o>>2];c[C+4>>2]=c[o+4>>2];c[C+8>>2]=c[o+8>>2];c[C+12>>2]=c[o+12>>2];fO(t,r,C);c[w>>2]=c[t>>2];c[w+4>>2]=c[t+4>>2];c[w+8>>2]=c[t+8>>2];c[w+12>>2]=c[t+12>>2];o=b+56|0;if(!(g<<24>>24)){i=c[x>>2]|0;if(!(a[i+85>>0]|0))u=0;else{h[o>>3]=+h[i+72>>3];u=1}}else{s=+gO(c[((c[d>>2]&3|0)==2?d:v)+40>>2]|0)+3.141592653589793;h[o>>3]=s;if(s<6.283185307179586)u=1;else Aa(106835,106815,606,106859)}a[b+69>>0]=u;B=f+32|0;c[B>>2]=c[w>>2];c[B+4>>2]=c[w+4>>2];c[B+8>>2]=c[w+8>>2];c[B+12>>2]=c[w+12>>2];B=f+48|0;g=f+52|0;v=f+56|0;t=b+48|0;switch(e|0){case 1:{i=c[z>>2]|0;if((a[i+156>>0]|0)==0?(b=a[(c[x>>2]|0)+89>>0]|0,A=b&255,b<<24>>24!=0):0){c[C>>2]=c[f>>2];c[C+4>>2]=c[f+4>>2];c[C+8>>2]=c[f+8>>2];c[C+12>>2]=c[f+12>>2];c[C+16>>2]=c[f+16>>2];c[C+20>>2]=c[f+20>>2];c[C+24>>2]=c[f+24>>2];c[C+28>>2]=c[f+28>>2];p=C+8|0;s=+h[t>>3];do if(!(A&4)){o=C+16|0;q=+h[w>>3];j=+h[i+80>>3]*.5;n=+h[i+24>>3];if(!(A&1)){i=C+24|0;j=n+j;if(!(A&8)){c[B>>2]=2;h[C>>3]=q;h[i>>3]=j;h[p>>3]=s;c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1;break}else{c[B>>2]=8;h[o>>3]=q;h[i>>3]=j;h[p>>3]=s;c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1;break}}else{c[B>>2]=1;k=+h[C>>3];m=+h[o>>3];j=n-j;if(q<+h[i+16>>3]){n=k+-1.0;q=j-+((c[(c[(uC(D)|0)+16>>2]|0)+252>>2]|0)/2|0|0);i=c[z>>2]|0;h[o>>3]=+h[i+16>>3]-+h[i+88>>3];h[p>>3]=s;h[C+24>>3]=+h[i+24>>3]+ +h[i+80>>3]*.5;h[C>>3]=n;h[f+56>>3]=n;h[f+64>>3]=q;h[f+72>>3]=m;h[f+80>>3]=s;i=f+88|0;c[i>>2]=c[C>>2];c[i+4>>2]=c[C+4>>2];c[i+8>>2]=c[C+8>>2];c[i+12>>2]=c[C+12>>2];c[i+16>>2]=c[C+16>>2];c[i+20>>2]=c[C+20>>2];c[i+24>>2]=c[C+24>>2];c[i+28>>2]=c[C+28>>2];i=2;break}else{q=m+1.0;n=j-+((c[(c[(uC(D)|0)+16>>2]|0)+252>>2]|0)/2|0|0);i=c[z>>2]|0;h[C>>3]=+h[i+16>>3]+ +h[i+96>>3]+0.0;h[p>>3]=s;h[C+24>>3]=+h[i+24>>3]+ +h[i+80>>3]*.5;h[o>>3]=q;h[f+56>>3]=k;h[f+64>>3]=n;h[f+72>>3]=q;h[f+80>>3]=s;i=f+88|0;c[i>>2]=c[C>>2];c[i+4>>2]=c[C+4>>2];c[i+8>>2]=c[C+8>>2];c[i+12>>2]=c[C+12>>2];c[i+16>>2]=c[C+16>>2];c[i+20>>2]=c[C+20>>2];c[i+24>>2]=c[C+24>>2];c[i+28>>2]=c[C+28>>2];i=2;break}}}else{c[B>>2]=4;h[p>>3]=+h[(+h[p>>3]>3];c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1}while(0);c[g>>2]=i;while(1){i=c[d+16>>2]|0;if(!(a[i+112>>0]|0))break;d=c[i+116>>2]|0}a[((D|0)==(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)?i+56|0:i+16|0)+30>>0]=0;c[B>>2]=A}else{d=4;E=47}break}case 2:{A=a[(c[x>>2]|0)+89>>0]|0;u=A&255;if(!(A<<24>>24))E=46;else{c[C>>2]=c[f>>2];c[C+4>>2]=c[f+4>>2];c[C+8>>2]=c[f+8>>2];c[C+12>>2]=c[f+12>>2];c[C+16>>2]=c[f+16>>2];c[C+20>>2]=c[f+20>>2];c[C+24>>2]=c[f+24>>2];c[C+28>>2]=c[f+28>>2];o=C+8|0;do if(!(u&4)){i=C+16|0;p=C+24|0;r=(c[B>>2]|0)==4;if(u&1|0)if(r){m=+h[C>>3]+-1.0;i=c[z>>2]|0;s=+h[i+24>>3]-+h[i+80>>3]*.5;q=+h[w>>3];n=s-+((c[(c[(uC(D)|0)+16>>2]|0)+252>>2]|0)/2|0|0);i=c[z>>2]|0;h[C+16>>3]=+h[i+16>>3]-+h[i+88>>3]+-2.0;h[o>>3]=s;h[p>>3]=+h[i+24>>3]+ +h[i+80>>3]*.5;h[C>>3]=m;h[f+56>>3]=m;h[f+64>>3]=n;h[f+72>>3]=q;h[f+80>>3]=s;i=f+88|0;c[i>>2]=c[C>>2];c[i+4>>2]=c[C+4>>2];c[i+8>>2]=c[C+8>>2];c[i+12>>2]=c[C+12>>2];c[i+16>>2]=c[C+16>>2];c[i+20>>2]=c[C+20>>2];c[i+24>>2]=c[C+24>>2];c[i+28>>2]=c[C+28>>2];i=2;break}else{h[p>>3]=+h[(+h[p>>3]>+h[b+8>>3]?i:b)+8>>3];c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1;break}q=+h[w>>3];f=c[z>>2]|0;k=+h[t>>3];j=k+-1.0;s=+h[f+24>>3];n=+h[f+80>>3]*.5;m=s-n;n=s+n;if(!(u&8)){h[C>>3]=q+-1.0;if(r){h[p>>3]=n;i=C}else{h[o>>3]=m;j=k}h[i+8>>3]=j;c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1;break}else{h[i>>3]=q+1.0;if(r){h[p>>3]=n;i=C}else{h[o>>3]=m;j=k+1.0}h[i+8>>3]=j;c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1;break}}else{h[o>>3]=+h[(+h[o>>3]<+h[t>>3]?C:w)+8>>3];c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1}while(0);c[g>>2]=i;while(1){i=c[d+16>>2]|0;if(!(a[i+112>>0]|0))break;d=c[i+116>>2]|0}a[((D|0)==(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)?i+56|0:i+16|0)+30>>0]=0;c[B>>2]=u}break}default:E=46}if((E|0)==46){d=c[B>>2]|0;E=47}a:do if((E|0)==47){if(p|0?(y=wb[p&63](D,(c[x>>2]|0)+56|0,d,v,g)|0,y|0):0){c[B>>2]=y;break};c[v>>2]=c[f>>2];c[v+4>>2]=c[f+4>>2];c[v+8>>2]=c[f+8>>2];c[v+12>>2]=c[f+12>>2];c[v+16>>2]=c[f+16>>2];c[v+20>>2]=c[f+20>>2];c[v+24>>2]=c[f+24>>2];c[v+28>>2]=c[f+28>>2];c[g>>2]=1;switch(e|0){case 8:{Aa(138697,106815,765,106859);break}case 2:{h[((c[B>>2]|0)==4?v:f+72|0)+8>>3]=+h[t>>3];break a}case 1:{h[f+64>>3]=+h[t>>3];c[B>>2]=4;break a}default:break a}}while(0);l=F;return}function iO(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0;g=c[b+16>>2]|0;i=c[g+96>>2]|0;if((a[g+44>>0]|0)==0?(a[g+84>>0]|0)==0:0)j=6;else{d=a[g+49>>0]|0;e=d&255;if(((e&8|0)==0?(f=a[g+89>>0]|0,(f&8)==0):0)?((e&5|0)==0?1:d<<24>>24!=f<<24>>24):0)j=6;else b=0}if((j|0)==6)if(!i)b=18;else{b=(c[(c[(uC(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0)+16>>2]|0)+116>>2]&1|0)!=0;b=~~(+h[(b?i+32|0:i+24|0)>>3]+18.0)}return b|0}function jO(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=+g;h=+h;i=i|0;var j=0,k=0,l=0,m=0;b=c[(c[d+(e<<2)>>2]|0)+16>>2]|0;if((a[b+44>>0]|0)==0?(a[b+84>>0]|0)==0:0)l=6;else l=3;do if((l|0)==3){j=a[b+49>>0]|0;k=j&255;b=b+89|0;if((k&8|0)==0?(m=a[b>>0]|0,(m&8)==0):0){if((k&5|0)==0?1:j<<24>>24!=m<<24>>24){l=6;break}if(k&4|0){lO(d,e,f,g,h,i);break}if(!(k&1))Aa(138697,106815,1231,106867);else{nO(d,e,f,g,h,i);break}}if((k&2|0)==0?(a[b>>0]&2)==0:0){mO(d,e,f,g,h,i);break}lO(d,e,f,g,h,i)}while(0);if((l|0)==6)kO(d,e,f,g,h,i);return}function kO(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=+g;i=+i;j=j|0;var k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0.0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,R=0;O=l;l=l+16080|0;K=O+80|0;L=O+64|0;M=O+48|0;N=O+32|0;I=O+16|0;J=O;A=c[b+(e<<2)>>2]|0;i=i*.5/+(f|0);i=i>2.0?i:2.0;C=(c[((c[A>>2]&3|0)==3?A:A+48|0)+40>>2]|0)+16|0;z=c[C>>2]|0;B=+h[z+16>>3];G=+h[z+24>>3];A=c[A+16>>2]|0;D=B+ +h[A+16>>3];E=G+ +h[A+24>>3];F=B+ +h[A+56>>3];G=G+ +h[A+64>>3];k=!(E>=G)?-1:1;m=+h[z+96>>3];switch(oO(d[A+49>>0]|0,d[A+89>>0]|0)|0){case 65:case 32:{if(E==G)k=0-k|0;break}default:{}}P=B+m;o=(P-D)*3.0;P=(P-F)*3.0;u=i*+(k|0);t=K+8|0;v=K+16|0;w=K+32|0;x=K+48|0;y=(E+G)*.5;z=K+64|0;A=K+80|0;r=K+96|0;s=K+104|0;q=0;n=0.0;i=m;o=m=(f|0))break;p=e+1|0;e=c[b+(e<<2)>>2]|0;i=i+g;o=o+g;m=m+g;n=u+n;h[K>>3]=D;h[t>>3]=E;P=E+n;pO(L,D+o/3.0,P);c[v>>2]=c[L>>2];c[v+4>>2]=c[L+4>>2];c[v+8>>2]=c[L+8>>2];c[v+12>>2]=c[L+12>>2];Q=B+i;pO(M,Q,P);c[w>>2]=c[M>>2];c[w+4>>2]=c[M+4>>2];c[w+8>>2]=c[M+8>>2];c[w+12>>2]=c[M+12>>2];pO(N,Q,y);c[x>>2]=c[N>>2];c[x+4>>2]=c[N+4>>2];c[x+8>>2]=c[N+8>>2];c[x+12>>2]=c[N+12>>2];P=G-n;pO(I,Q,P);c[z>>2]=c[I>>2];c[z+4>>2]=c[I+4>>2];c[z+8>>2]=c[I+8>>2];c[z+12>>2]=c[I+12>>2];pO(J,F+m/3.0,P);c[A>>2]=c[J>>2];c[A+4>>2]=c[J+4>>2];c[A+8>>2]=c[J+8>>2];c[A+12>>2]=c[J+12>>2];h[r>>3]=F;h[s>>3]=G;k=e+16|0;if((c[(c[k>>2]|0)+96>>2]|0)!=0?(R=(c[(c[(uC(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)|0)+16>>2]|0)+116>>2]&1|0)==0,k=c[(c[k>>2]|0)+96>>2]|0,H=+h[(R?k+24|0:k+32|0)>>3],R=c[C>>2]|0,h[k+56>>3]=H*.5+(i+ +h[R+16>>3]),h[k+64>>3]=+h[R+24>>3],a[k+81>>0]=1,H>g):0)i=i+(H-g);bO(e,c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,K,7,j);e=p;q=q+1|0}l=O;return}function lO(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=+g;i=+i;j=j|0;var k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0;P=l;l=l+16080|0;L=P+80|0;M=P+64|0;N=P+48|0;O=P+32|0;J=P+16|0;K=P;B=c[b+(e<<2)>>2]|0;q=g*.5/+(f|0);q=q>2.0?q:2.0;D=(c[((c[B>>2]&3|0)==3?B:B+48|0)+40>>2]|0)+16|0;k=c[D>>2]|0;g=+h[k+16>>3];C=+h[k+24>>3];B=c[B+16>>2]|0;E=g+ +h[B+16>>3];F=C+ +h[B+24>>3];G=g+ +h[B+56>>3];H=C+ +h[B+64>>3];p=!(E>=G)?-1.0:1.0;s=+h[k+80>>3]*.5;m=E-g;n=G-g;o=g-E;switch(oO(d[B+49>>0]|0,d[B+89>>0]|0)|0){case 15:{m=p*(q+(+h[k+96>>3]-n));break}case 38:{m=p*(q+(+h[k+88>>3]-(g-G)));break}case 41:{m=p*(q+(+h[k+96>>3]-m));break}case 48:{m=p*(q+(+h[k+96>>3]-m));break}case 58:case 57:case 51:case 47:case 37:case 14:{m=p*((+h[k+88>>3]-o+(+h[k+96>>3]-n))/3.0);break}case 73:{m=p*(q+(+h[k+88>>3]-o));break}case 83:{m=p*(+h[k+88>>3]-o);break}case 84:{m=p*(q+(+h[k+88>>3]-o+(+h[k+96>>3]-n))*.5);break}case 85:case 75:case 74:{m=p*(q*2.0+(+h[k+88>>3]-o+(+h[k+96>>3]-n))*.5);break}default:m=0.0}n=C+s;o=(n-F)*3.0;n=(n-H)*3.0;p=q*p;w=L+8|0;x=L+16|0;y=L+32|0;z=L+48|0;q=(E+G)*.5;A=L+64|0;B=L+80|0;u=L+96|0;v=L+104|0;t=0;g=s;o=s=(f|0))break;r=e+1|0;e=c[b+(e<<2)>>2]|0;g=g+i;o=o+i;n=n+i;m=p+m;h[L>>3]=E;h[w>>3]=F;s=E+m;pO(M,s,F+o/3.0);c[x>>2]=c[M>>2];c[x+4>>2]=c[M+4>>2];c[x+8>>2]=c[M+8>>2];c[x+12>>2]=c[M+12>>2];Q=C+g;pO(N,s,Q);c[y>>2]=c[N>>2];c[y+4>>2]=c[N+4>>2];c[y+8>>2]=c[N+8>>2];c[y+12>>2]=c[N+12>>2];pO(O,q,Q);c[z>>2]=c[O>>2];c[z+4>>2]=c[O+4>>2];c[z+8>>2]=c[O+8>>2];c[z+12>>2]=c[O+12>>2];s=G-m;pO(J,s,Q);c[A>>2]=c[J>>2];c[A+4>>2]=c[J+4>>2];c[A+8>>2]=c[J+8>>2];c[A+12>>2]=c[J+12>>2];pO(K,s,H+n/3.0);c[B>>2]=c[K>>2];c[B+4>>2]=c[K+4>>2];c[B+8>>2]=c[K+8>>2];c[B+12>>2]=c[K+12>>2];h[u>>3]=G;h[v>>3]=H;k=e+16|0;if((c[(c[k>>2]|0)+96>>2]|0)!=0?(R=(c[(c[(uC(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)|0)+16>>2]|0)+116>>2]&1|0)==0,k=c[(c[k>>2]|0)+96>>2]|0,I=+h[(R?k+32|0:k+24|0)>>3],R=c[D>>2]|0,h[k+64>>3]=I*.5+(g+ +h[R+24>>3]),h[k+56>>3]=+h[R+16>>3],a[k+81>>0]=1,I>i):0)g=g+(I-i);bO(e,c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,L,7,j);e=r;t=t+1|0}l=P;return}function mO(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=+g;i=+i;j=j|0;var k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0.0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,R=0;O=l;l=l+16080|0;K=O+80|0;L=O+64|0;M=O+48|0;N=O+32|0;I=O+16|0;J=O;A=c[b+(e<<2)>>2]|0;i=i*.5/+(f|0);i=i>2.0?i:2.0;C=(c[((c[A>>2]&3|0)==3?A:A+48|0)+40>>2]|0)+16|0;z=c[C>>2]|0;B=+h[z+16>>3];G=+h[z+24>>3];A=c[A+16>>2]|0;D=B+ +h[A+16>>3];E=G+ +h[A+24>>3];F=B+ +h[A+56>>3];G=G+ +h[A+64>>3];k=!(E>=G)?-1:1;m=+h[z+88>>3];switch(oO(d[A+49>>0]|0,d[A+89>>0]|0)|0){case 67:case 12:{if(E==G)k=0-k|0;break}default:{}}o=(D+m-B)*3.0;P=(F+m-B)*3.0;u=i*+(k|0);t=K+8|0;v=K+16|0;w=K+32|0;x=K+48|0;y=(E+G)*.5;z=K+64|0;A=K+80|0;r=K+96|0;s=K+104|0;q=0;n=0.0;i=m;o=m=(f|0))break;p=e+1|0;e=c[b+(e<<2)>>2]|0;i=i+g;o=o+g;m=m+g;n=u+n;h[K>>3]=D;h[t>>3]=E;P=E+n;pO(L,D-o/3.0,P);c[v>>2]=c[L>>2];c[v+4>>2]=c[L+4>>2];c[v+8>>2]=c[L+8>>2];c[v+12>>2]=c[L+12>>2];Q=B-i;pO(M,Q,P);c[w>>2]=c[M>>2];c[w+4>>2]=c[M+4>>2];c[w+8>>2]=c[M+8>>2];c[w+12>>2]=c[M+12>>2];pO(N,Q,y);c[x>>2]=c[N>>2];c[x+4>>2]=c[N+4>>2];c[x+8>>2]=c[N+8>>2];c[x+12>>2]=c[N+12>>2];P=G-n;pO(I,Q,P);c[z>>2]=c[I>>2];c[z+4>>2]=c[I+4>>2];c[z+8>>2]=c[I+8>>2];c[z+12>>2]=c[I+12>>2];pO(J,F-m/3.0,P);c[A>>2]=c[J>>2];c[A+4>>2]=c[J+4>>2];c[A+8>>2]=c[J+8>>2];c[A+12>>2]=c[J+12>>2];h[r>>3]=F;h[s>>3]=G;k=e+16|0;if((c[(c[k>>2]|0)+96>>2]|0)!=0?(R=(c[(c[(uC(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)|0)+16>>2]|0)+116>>2]&1|0)==0,k=c[(c[k>>2]|0)+96>>2]|0,H=+h[(R?k+24|0:k+32|0)>>3],R=c[C>>2]|0,h[k+56>>3]=+h[R+16>>3]-i-H*.5,h[k+64>>3]=+h[R+24>>3],a[k+81>>0]=1,H>g):0)i=i+(H-g);bO(e,c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,K,7,j);e=p;q=q+1|0}l=O;return}function nO(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=+g;i=+i;j=j|0;var k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0,G=0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,R=0;O=l;l=l+16080|0;K=O+80|0;L=O+64|0;M=O+48|0;N=O+32|0;I=O+16|0;J=O;B=c[b+(e<<2)>>2]|0;A=g*.5/+(f|0);v=(c[((c[B>>2]&3|0)==3?B:B+48|0)+40>>2]|0)+16|0;C=c[v>>2]|0;y=+h[C+16>>3];u=+h[C+24>>3];B=c[B+16>>2]|0;w=y+ +h[B+16>>3];x=u+ +h[B+24>>3];y=y+ +h[B+56>>3];z=u+ +h[B+64>>3];t=!(w>=y)?-1:1;P=+h[C+80>>3]*.5;B=(oO(d[B+49>>0]|0,d[B+89>>0]|0)|0)==67;m=(x+P-u)*3.0;n=(z+P-u)*3.0;A=(A>2.0?A:2.0)*+((B?0-t|0:t)|0);t=K+8|0;B=K+16|0;C=K+32|0;D=K+48|0;E=(w+y)*.5;F=K+64|0;G=K+80|0;r=K+96|0;s=K+104|0;g=P;k=0.0;m=P=(f|0))break;q=e+1|0;o=c[b+(e<<2)>>2]|0;g=g+i;m=m+i;n=n+i;k=A+k;h[K>>3]=w;h[t>>3]=x;P=w+k;pO(L,P,x-m/3.0);c[B>>2]=c[L>>2];c[B+4>>2]=c[L+4>>2];c[B+8>>2]=c[L+8>>2];c[B+12>>2]=c[L+12>>2];Q=u-g;pO(M,P,Q);c[C>>2]=c[M>>2];c[C+4>>2]=c[M+4>>2];c[C+8>>2]=c[M+8>>2];c[C+12>>2]=c[M+12>>2];pO(N,E,Q);c[D>>2]=c[N>>2];c[D+4>>2]=c[N+4>>2];c[D+8>>2]=c[N+8>>2];c[D+12>>2]=c[N+12>>2];P=y-k;pO(I,P,Q);c[F>>2]=c[I>>2];c[F+4>>2]=c[I+4>>2];c[F+8>>2]=c[I+8>>2];c[F+12>>2]=c[I+12>>2];pO(J,P,z-n/3.0);c[G>>2]=c[J>>2];c[G+4>>2]=c[J+4>>2];c[G+8>>2]=c[J+8>>2];c[G+12>>2]=c[J+12>>2];h[r>>3]=y;h[s>>3]=z;e=o+16|0;if((c[(c[e>>2]|0)+96>>2]|0)!=0?(R=(c[(c[(uC(c[((c[o>>2]&3|0)==3?o:o+48|0)+40>>2]|0)|0)+16>>2]|0)+116>>2]&1|0)==0,e=c[(c[e>>2]|0)+96>>2]|0,H=+h[(R?e+32|0:e+24|0)>>3],R=c[v>>2]|0,h[e+64>>3]=+h[R+24>>3]-g-H*.5,h[e+56>>3]=+h[R+16>>3],a[e+81>>0]=1,H>i):0)g=g+(H-i);bO(o,c[((c[o>>2]&3|0)==2?o:o+-48|0)+40>>2]|0,K,7,j);e=q;p=p+1|0}l=O;return}function oO(a,b){a=a|0;b=b|0;var d=0;d=0;while(1){if((d|0)>=8){b=-1;break}if((c[22092+(d<<2)>>2]|0)==(b|0)){b=d;break}d=d+1|0}d=0;while(1){if((d|0)>=8){d=-1;break}if((c[22092+(d<<2)>>2]|0)==(a|0))break;d=d+1|0}if((d|b|0)<0)d=0;else d=c[22124+(d<<5)+(b<<2)>>2]|0;return d|0}function pO(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function qO(b){b=b|0;var d=0,e=0,f=0;if((c[47272]|0)!=0|(c[47271]|0)!=0){e=b+16|0;f=c[(c[e>>2]|0)+100>>2]|0;d=b+48|0;if((f|0?(a[f+81>>0]|0)==0:0)?rO(b,1)|0:0){f=uC(c[((c[b>>2]&3|0)==3?b:d)+40>>2]|0)|0;xP(f,c[(c[e>>2]|0)+100>>2]|0)}f=c[(c[e>>2]|0)+104>>2]|0;if((f|0?(a[f+81>>0]|0)==0:0)?rO(b,0)|0:0){f=uC(c[((c[b>>2]&3|0)==3?b:d)+40>>2]|0)|0;xP(f,c[(c[e>>2]|0)+104>>2]|0)}}return}function rO(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+96|0;p=r+32|0;m=r+16|0;o=r;i=b+16|0;do if((a[(c[i>>2]|0)+112>>0]|0)!=6){e=c[47272]|0;if(!((e|0)!=0?(a[(OA(b,e)|0)>>0]|0)!=0:0)){e=c[47271]|0;if(!e){e=0;break}if(!(a[(OA(b,e)|0)>>0]|0)){e=0;break}}d=d<<24>>24==0;q=c[i>>2]|0;q=c[(d?q+104|0:q+100|0)>>2]|0;e=sO(b)|0;if(e){n=c[e>>2]|0;do if(d){o=c[n>>2]|0;g=+h[o>>3];f=+h[o+8>>3];if(!(c[n+8>>2]|0))e=0;else{k=g;g=+h[n+16>>3];j=f;f=+h[n+24>>3];break}while(1){if((e|0)==4)break;o=p+(e<<4)|0;i=(c[n>>2]|0)+(e<<4)|0;c[o>>2]=c[i>>2];c[o+4>>2]=c[i+4>>2];c[o+8>>2]=c[i+8>>2];c[o+12>>2]=c[i+12>>2];e=e+1|0}iP(m,p,3,.1,0,0);k=+h[m>>3];j=+h[m+8>>3]}else{e=(c[e+4>>2]|0)+-1|0;d=n+(e*48|0)+4|0;i=n+(e*48|0)|0;s=c[i>>2]|0;m=(c[d>>2]|0)+-1|0;f=+h[s+(m<<4)+8>>3];g=+h[s+(m<<4)>>3];if(!(c[n+(e*48|0)+12>>2]|0))e=0;else{k=g;g=+h[n+(e*48|0)+32>>3];j=f;f=+h[n+(e*48|0)+40>>3];break}while(1){if((e|0)==4)break;s=p+(e<<4)|0;n=(c[i>>2]|0)+(e+-4+(c[d>>2]|0)<<4)|0;c[s>>2]=c[n>>2];c[s+4>>2]=c[n+4>>2];c[s+8>>2]=c[n+8>>2];c[s+12>>2]=c[n+12>>2];e=e+1|0}iP(o,p,3,.9,0,0);k=+h[o>>3];j=+h[o+8>>3]}while(0);k=+O(+(j-f),+(k-g));k=k+ +YO(b,c[47272]|0,-25.0,-180.0)/180.0*3.141592653589793;j=+YO(b,c[47271]|0,1.0,0.0)*10.0;h[q+56>>3]=g+j*+I(+k);h[q+64>>3]=f+j*+J(+k);a[q+81>>0]=1;e=1}else e=0}else e=0;while(0);l=r;return e|0}function sO(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;d=b;while(1){e=c[d+16>>2]|0;d=c[e+8>>2]|0;if(d|0)break;if(!(a[e+112>>0]|0)){g=5;break}d=c[e+116>>2]|0}if((g|0)==5){g=HB(c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0;d=HB(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0;c[f>>2]=g;c[f+4>>2]=d;dA(1,106880,f)|0;d=0}l=h;return d|0}function tO(a,d,e){a=a|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0;s=l;l=l+96|0;m=s+80|0;n=s+64|0;o=s+48|0;p=s+32|0;q=s+16|0;r=s;k=b[(c[d+16>>2]|0)+136>>1]|0;d=e+16|0;uO(c[(c[d>>2]|0)+8>>2]|0,p,q);f=+h[p>>3];g=+h[q>>3];u=f-g;i=+h[p+8>>3];j=+h[q+8>>3];t=i-j;a:do if(u*u+t*t<1.0e-06){c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2]}else{d=c[(c[d>>2]|0)+8>>2]|0;switch(k&14){case 4:case 10:{h[n>>3]=(f+g)*.5;h[n+8>>3]=(i+j)*.5;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];oP(r,d,m);c[o>>2]=c[r>>2];c[o+4>>2]=c[r+4>>2];c[o+8>>2]=c[r+8>>2];c[o+12>>2]=c[r+12>>2];break a}default:{vO(o,d,p,q);break a}}}while(0);c[a>>2]=c[o>>2];c[a+4>>2]=c[o+4>>2];c[a+8>>2]=c[o+8>>2];c[a+12>>2]=c[o+12>>2];l=s;return}function uO(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=l;l=l+32|0;g=h+16|0;f=h;j=c[a>>2]|0;e=c[j>>2]|0;i=c[j+8>>2]|0;k=j+16|0;c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];j=j+32|0;c[f>>2]=c[j>>2];c[f+4>>2]=c[j+4>>2];c[f+8>>2]=c[j+8>>2];c[f+12>>2]=c[j+12>>2];if(!i){c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2]}else{c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[b+12>>2]=c[g+12>>2]}i=c[a>>2]|0;j=(c[a+4>>2]|0)+-1|0;e=c[i+(j*48|0)>>2]|0;a=c[i+(j*48|0)+4>>2]|0;k=c[i+(j*48|0)+12>>2]|0;b=i+(j*48|0)+16|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];j=i+(j*48|0)+32|0;c[f>>2]=c[j>>2];c[f+4>>2]=c[j+4>>2];c[f+8>>2]=c[j+8>>2];c[f+12>>2]=c[j+12>>2];if(!k){k=e+(a+-1<<4)|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2]}else{c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2]}l=h;return}function vO(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0;r=c[b+4>>2]|0;g=0.0;f=0;while(1){if((f|0)>=(r|0))break;l=c[b>>2]|0;k=c[l+(f*48|0)>>2]|0;l=c[l+(f*48|0)+4>>2]|0;i=3;j=0;while(1){if((i|0)>=(l|0))break;p=+h[k+(j<<4)>>3]-+h[k+(i<<4)>>3];q=+h[k+(j<<4)+8>>3]-+h[k+(i<<4)+8>>3];i=i+3|0;j=j+3|0;g=g+ +G(+(p*p+q*q))}f=f+1|0}l=0;g=g*.5;a:while(1){if((l|0)>=(r|0)){f=15;break}k=c[b>>2]|0;j=c[k+(l*48|0)>>2]|0;k=c[k+(l*48|0)+4>>2]|0;f=3;i=0;while(1){if((f|0)>=(k|0))break;m=+h[j+(i<<4)>>3];p=+h[j+(i<<4)+8>>3];n=+h[j+(f<<4)>>3];o=+h[j+(f<<4)+8>>3];s=m-n;q=p-o;q=+G(+(s*s+q*q));if(q>=g){f=12;break a}f=f+3|0;i=i+3|0;g=g-q}l=l+1|0}if((f|0)==12){h[d>>3]=m;h[d+8>>3]=p;h[e>>3]=n;h[e+8>>3]=o;s=q-g;h[a>>3]=(g*n+m*s)/q;h[a+8>>3]=(g*o+p*s)/q;return}else if((f|0)==15)Aa(139015,106815,1316,106942)}function wO(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;qO(b);return}function xO(b,d,e,f,g){b=b|0;d=d|0;e=+e;f=f|0;g=g|0;var i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0,G=0,H=0,K=0,L=0,M=0,N=0;L=yO(b)|0;K=c[L+4>>2]|0;M=c[L>>2]|0;H=K+-1|0;D=+h[M+(H<<6)+16>>3];E=+(K|0);F=(g|0)==2;G=(f|0)!=0;n=0;j=0.0;i=0.0;l=0.0;m=0.0;while(1){if((n|0)>=(K|0))break;b=~~+zO(+(n+-1|0),E);C=n+1|0;N=~~+zO(+(C|0),E);o=M+(n<<6)|0;m=+h[o>>3];B=M+(n<<6)+8|0;l=+h[B>>3];u=M+(n<<6)+16|0;v=+h[u>>3];w=M+(n<<6)+24|0;x=M+(n<<6)+32|0;y=M+(n<<6)+40|0;z=M+(n<<6)+48|0;A=M+(n<<6)+56|0;k=+AO(+h[M+(N<<6)+8>>3]-l,+h[M+(N<<6)>>3]-m);p=+AO(+h[M+(b<<6)+8>>3]-l,+h[M+(b<<6)>>3]-m);t=+qb[d&7](v,D,e);b=(n|0)==0;q=k+1.5707963267948966;r=p+-1.5707963267948966;do if(b|(n|0)==(H|0))if(b){if(!F){b=0;s=q;j=t;i=q;break}b=0;s=q;j=t;i=q;l=l-t*+J(+k);m=m-t*+I(+k);break}else{if(!F){b=0;s=r;j=t;i=r;break}b=0;s=r;j=t;i=r;l=l-t*+J(+p);m=m-t*+I(+p);break}else{i=k-p;i=1.5707963267948966-(i<0.0?i+6.283185307179586:i)*.5;j=+I(+i);j=j==0.0?0.0:t/j;i=q+i;if(G|j>t*10.0){i=+zO(r,6.283185307179586);b=1;s=+zO(q,6.283185307179586);j=t}else{b=0;s=i}}while(0);h[o>>3]=m;h[B>>3]=l;h[u>>3]=v;a[w>>0]=108;h[x>>3]=i;h[y>>3]=j;c[z>>2]=b;h[A>>3]=s;n=C}o=HK(12)|0;b=0;while(1){if((b|0)>=(K|0))break;m=+h[M+(b<<6)>>3];l=+h[M+(b<<6)+8>>3];i=+h[M+(b<<6)+32>>3];j=+h[M+(b<<6)+40>>3];N=c[M+(b<<6)+48>>2]|0;k=+h[M+(b<<6)+56>>3];BO(o,m+j*+I(+i),l+j*+J(+i));if(N|0)CO(m,l,j,1,i,k,f,o);b=b+1|0}n=(g|0)==1;k=i+3.141592653589793;if(n)DO(o,m,l,j,i,k);else{BO(o,m+j*+I(+k),l+j*+J(+k));i=k}b=K+-2|0;k=m;while(1){if((b|0)<=-1)break;m=+h[M+(b<<6)>>3];l=+h[M+(b<<6)+8>>3];j=+h[M+(b<<6)+40>>3];N=c[M+(b<<6)+48>>2]|0;i=+h[M+(b<<6)+32>>3]+3.141592653589793;k=+h[M+(b<<6)+56>>3]+3.141592653589793;BO(o,m+j*+I(+k),l+j*+J(+k));if(N|0)CO(m,l,j,0,i,k,f,o);b=b+-1|0;k=m}if(n)DO(o,k,l,j,i,i+3.141592653589793);EO(L);return o|0}function yO(a){a=a|0;var b=0.0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;q=l;l=l+144|0;i=q+128|0;h=q+112|0;j=q+96|0;k=q+64|0;m=q;n=q+80|0;o=FO()|0;p=c[a+4>>2]|0;f=c[a>>2]|0;c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];c[i+8>>2]=c[f+8>>2];c[i+12>>2]=c[f+12>>2];GO(o,i,0.0);g=m+48|0;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];d=0;b=0.0;a:while(1){e=d+3|0;if((e|0)>=(p|0))break;c[m>>2]=c[g>>2];c[m+4>>2]=c[g+4>>2];c[m+8>>2]=c[g+8>>2];c[m+12>>2]=c[g+12>>2];a=1;while(1){if((a|0)==4)break;r=m+(a<<4)|0;s=f+(a+d<<4)|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];a=a+1|0}c[j>>2]=c[m>>2];c[j+4>>2]=c[m+4>>2];c[j+8>>2]=c[m+8>>2];c[j+12>>2]=c[m+12>>2];a=1;while(1){if((a|0)==21){d=e;continue a}iP(n,m,3,+(a|0)/20.0,0,0);c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];c[h>>2]=c[j>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[h+12>>2]=c[j+12>>2];c[i>>2]=c[n>>2];c[i+4>>2]=c[n+4>>2];c[i+8>>2]=c[n+8>>2];c[i+12>>2]=c[n+12>>2];t=b+ +HO(h,i);c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];GO(o,i,t);c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];a=a+1|0;b=t}}IO(o);l=q;return o|0}function zO(a,b){a=+a;b=+b;if(!(!(a<0.0)&!(a>=b)))a=a-+E(+(a/b))*b;return +a}function AO(a,b){a=+a;b=+b;if(!(a==0.0&b==0.0)){a=+O(+a,+b);if(!(a>=0.0))a=a+6.283185307179586}else a=0.0;return +a}function BO(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,g=0;f=c[a>>2]|0;e=a+4|0;g=a+8|0;if((f|0)<(c[e>>2]|0))e=c[g>>2]|0;else{c[e>>2]=2e3;e=KK(c[g>>2]|0,32e3)|0;c[g>>2]=e;f=c[a>>2]|0}c[a>>2]=f+1;h[e+(f<<4)>>3]=b;h[e+(f<<4)+8>>3]=d;return}function CO(a,b,c,d,e,f,g,h){a=+a;b=+b;c=+c;d=d|0;e=+e;f=+f;g=g|0;h=h|0;var i=0.0,j=0.0,k=0.0;d=(d|0)==0;i=d?e:f;j=+I(+i)*c+a;k=+J(+i)*c+a;do if((g|0)==1){e=(d?f:e)-i;e=!(e<=1.7453292519943296e-03)?e:e+6.283185307179586;if(e<3.141592653589793){DO(h,a,b,c,i+e,i);break}else{BO(h,j,k);break}}else BO(h,j,k);while(0);return}function DO(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;var g=0,h=0.0;BO(a,+I(+e)*d+b,+J(+e)*d+c);a:do if(!(d==0.0)){while(1){if(!(f>e))break;f=f+-6.283185307179586}f=e-f;while(1){if(!(f>6.283185307179586))break;f=f+-6.283185307179586}f=f/19.0;g=1;while(1){if((g|0)==20)break a;h=e-f*+(g|0);BO(a,+I(+h)*d+b,+J(+h)*d+c);g=g+1|0}}while(0);return}function EO(a){a=a|0;l6(c[a>>2]|0);l6(a);return}function FO(){var a=0;a=HK(12)|0;c[a+4>>2]=0;c[a+8>>2]=2e3;c[a>>2]=HK(128e3)|0;return a|0}function GO(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,i=0;i=a+4|0;e=c[i>>2]|0;f=a+8|0;g=c[f>>2]|0;if((e|0)<(g|0))a=c[a>>2]|0;else{c[f>>2]=g<<1;e=KK(c[a>>2]|0,g<<7)|0;c[a>>2]=e;a=e;e=c[i>>2]|0}h[a+(e<<6)>>3]=+h[b>>3];h[a+(e<<6)+8>>3]=+h[b+8>>3];c[i>>2]=e+1;h[a+(e<<6)+16>>3]=d;return}function HO(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a>>3]-+h[b>>3];c=+h[a+8>>3]-+h[b+8>>3];return +(+G(+(d*d+c*c)))}function IO(a){a=a|0;var b=0;b=c[a+4>>2]|0;if((c[a+8>>2]|0)>(b|0))c[a>>2]=KK(c[a>>2]|0,b<<6)|0;return}function JO(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m+8|0;j=m;h=m+12|0;c[h>>2]=0;i=c[e+4>>2]|0;if(!i)Aa(106959,106970,203,106981);f=c[i>>2]|0;if(!f)Aa(106995,106970,206,106981);g=i+8|0;if(!(c[g>>2]|0))c[g>>2]=KO(f)|0;if(!(a[195234]|0))f=0;else{f=(NJ(c[i>>2]|0)|0)==0;f=f?0:h}if(!((bT(d,e,f)|0)<<24>>24))LO(e,f);do if(f|0){g=c[h>>2]|0;d=c[15715]|0;f=c[i>>2]|0;if(!g){c[k>>2]=f;z4(d,107038,k)|0;break}else{c[j>>2]=f;c[j+4>>2]=g;z4(d,107006,j)|0;break}}while(0);k=e+32|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];l=m;return}function KO(a){a=a|0;var b=0;b=c[47371]|0;if((b|0)!=0?(C3(b,a)|0)==0:0)a=c[47380]|0;else{l6(b);c[47371]=Y3(a)|0;a=e6(189484,22380,35,36,95)|0;c[47380]=a}return a|0}function LO(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0.0,j=0,k=0.0;j=c[b+4>>2]|0;e=c[j>>2]|0;i=+h[j+16>>3];j=b+32|0;h[j>>3]=0.0;h[b+40>>3]=i*1.2;h[b+16>>3]=0.0;h[b+24>>3]=i*.1;c[b+8>>2]=0;c[b+12>>2]=0;if(N3(e,107072,4)|0)if((N3(e,107077,5)|0)!=0?(N3(e,107083,9)|0)!=0:0){g=4296;e=107093}else{g=8392;e=107129}else{g=6344;e=107110}if(d|0)c[d>>2]=e;e=c[b>>2]|0;if(e|0){f=0.0;while(1){b=a[e>>0]|0;if(!(b<<24>>24))break;k=f+ +h[g+((b&255)<<3)>>3];h[j>>3]=k;e=e+1|0;f=k}h[j>>3]=i*f}return}function MO(a,b){a=a|0;b=b|0;return C3(c[a>>2]|0,c[b>>2]|0)|0}function NO(a){a=a|0;var b=0;b=a+108|0;c[b>>2]=0;c[a+112>>2]=32;c[a+116>>2]=-1;c[a+120>>2]=36;c[a+124>>2]=63;c[a+128>>2]=55;c[a+132>>2]=0;c[a+136>>2]=0;c[a+140>>2]=0;b=Sz(b,c[4591]|0)|0;c[a+144>>2]=b;return b|0}function OO(a,b,d){a=a|0;b=b|0;d=d|0;d=m6(1,32)|0;a=c[b>>2]|0;if(a|0)c[d>>2]=Y3(a)|0;a=c[b+4>>2]|0;if(a|0)c[d+4>>2]=Y3(a)|0;c[d+24>>2]=c[b+24>>2]&127;h[d+16>>3]=+h[b+16>>3];c[d+8>>2]=c[b+8>>2];return d|0}function PO(a,b,d){a=a|0;b=b|0;d=d|0;l6(c[b>>2]|0);l6(c[b+4>>2]|0);l6(b);return}function QO(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0;a=c[b>>2]|0;e=c[d>>2]|0;i=(e|0)==0;if(!a)if(i)j=5;else a=-1;else if(!i){a=f2(a,e)|0;if(!a)j=5}else a=1;do if((j|0)==5){a=c[b+4>>2]|0;e=c[d+4>>2]|0;i=(e|0)==0;if(!a){if(!i){a=-1;break}}else{if(i){a=1;break}a=f2(a,e)|0;if(a|0)break}a=(c[b+24>>2]&127)-(c[d+24>>2]&127)|0;if(!a){g=+h[b+16>>3];f=+h[d+16>>3];if(gf&1}}while(0);return a|0}function RO(){Ea(189524)|0;return}function SO(){var a=0,b=0;b=l;l=l+16|0;a=b;Ea(a|0)|0;l=b;return +(+((c[a+4>>2]|0)+(c[a>>2]|0)-(c[47381]|0)-(c[47382]|0)|0)/60.0)}function TO(a){a=a|0;var b=0,d=0;b=HK(16)|0;a=(a|0)>2?a:2;d=HK(a<<2)|0;c[b>>2]=d;c[b+12>>2]=d;c[b+8>>2]=d;c[b+4>>2]=d+(a<<2);return b|0}function UO(a){a=a|0;l6(c[a>>2]|0);l6(a);return}function VO(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+12|0;e=c[d>>2]|0;c[d>>2]=e+4;c[e>>2]=b;if((c[d>>2]|0)>>>0>=(c[a+4>>2]|0)>>>0)c[d>>2]=c[a>>2];return}function WO(a){a=a|0;var b=0,d=0,e=0;d=a+8|0;b=c[d>>2]|0;if((b|0)!=(c[a+12>>2]|0)){e=b+4|0;c[d>>2]=e;b=c[b>>2]|0;if(e>>>0>=(c[a+4>>2]|0)>>>0)c[d>>2]=c[a>>2]}else b=0;return b|0}function XO(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;i=l;l=l+16|0;g=i;if(((d|0)!=0?(h=OA(b,d)|0,(h|0)!=0):0)?(a[h>>0]|0)!=0:0){d=$1(h,g,10)|0;e=(h|0)==(c[g>>2]|0)?e:(d|0)<(f|0)?f:d}l=i;return e|0}function YO(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var g=0,h=0,i=0,j=0.0;i=l;l=l+16|0;g=i;if(((b|0)!=0&(d|0)!=0?(h=OA(b,d)|0,(h|0)!=0):0)?(a[h>>0]|0)!=0:0){j=+b6(h,g);e=(h|0)==(c[g>>2]|0)?e:j0.0)){b=+YO(a,DA(a,0,107939,0)|0,-1.0,0.0);b=b==0.0?72.0:b}return +b}function _O(a,b,c){a=a|0;b=b|0;c=c|0;if((a|0)!=0&(b|0)!=0)c=OA(a,b)|0;return c|0}function $O(b,c,d){b=b|0;c=c|0;d=d|0;b=_O(b,c,d)|0;if((b|0)!=0?(a[b>>0]|0)!=0:0)d=b;return d|0}function aP(a,b,c){a=a|0;b=b|0;c=c|0;if(!b)a=c&255;else a=bP(OA(a,b)|0)|0;return a|0}function bP(a){a=a|0;return cP(a,0)|0}function cP(b,c){b=b|0;c=c|0;var d=0;if((b|0)!=0?(d=a[b>>0]|0,d<<24>>24!=0):0)if((C3(b,137609)|0)!=0?(C3(b,107950)|0)!=0:0)if((C3(b,107953)|0)!=0?(C3(b,107958)|0)!=0:0){if(((d<<24>>24)+-48|0)>>>0<10)c=(d6(b)|0)&255}else c=1;else c=0;return c|0}function dP(a){a=a|0;var b=0,d=0;while(1){b=(c[a+16>>2]|0)+220|0;d=c[b>>2]|0;if(!((d|0)!=(a|0)&(d|0)!=0))break;a=c[(c[d+16>>2]|0)+220>>2]|0;if(!a){a=d;continue}c[b>>2]=a}return a|0}function eP(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if((a|0)!=(b|0)){d=c[a+16>>2]|0;e=d+220|0;if(!(c[e>>2]|0)){c[e>>2]=a;c[d+216>>2]=1}else a=dP(a)|0;e=c[b+16>>2]|0;d=e+220|0;if(!(c[d>>2]|0)){c[d>>2]=b;c[e+216>>2]=1;d=e;e=1}else{b=dP(b)|0;e=c[b+16>>2]|0;d=e;e=c[e+216>>2]|0}h=c[a+16>>2]|0;g=(c[h+120>>2]|0)>(c[d+120>>2]|0);f=h+216|0;e=e+(c[f>>2]|0)|0;a=g?b:a;c[(g?h:d)+220>>2]=a;c[(g?d+216|0:f)>>2]=e}return a|0}function fP(b){b=b|0;b=c[b+16>>2]|0;c[b+216>>2]=1;c[b+220>>2]=0;a[b+159>>0]=0;return}function gP(a,b){a=a|0;b=b|0;if((dP(a)|0)==(a|0)){a=c[a+16>>2]|0;c[a+220>>2]=b;b=(c[b+16>>2]|0)+216|0;c[b>>2]=(c[b>>2]|0)+(c[a+216>>2]|0);return}else Aa(107970,107962,194,107986)}function hP(a,b){a=a|0;b=b|0;var d=0.0;b=c[(c[b+16>>2]|0)+132>>2]|0;d=+h[b+8>>3]*72.0;h[a>>3]=+h[b>>3]*72.0;h[a+8>>3]=d;return}function iP(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;g=g|0;var i=0,j=0,k=0,m=0.0,n=0,o=0,p=0;o=l;l=l+576|0;n=o;i=0;while(1){if((i|0)>(d|0))break;k=n+(i<<4)|0;j=b+(i<<4)|0;c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];i=i+1|0}m=1.0-e;i=1;while(1){if((i|0)>(d|0))break;j=d-i|0;k=i+-1|0;b=0;while(1){if((b|0)>(j|0))break;p=b+1|0;h[n+(i*96|0)+(b<<4)>>3]=m*+h[n+(k*96|0)+(b<<4)>>3]+ +h[n+(k*96|0)+(p<<4)>>3]*e;h[n+(i*96|0)+(b<<4)+8>>3]=m*+h[n+(k*96|0)+(b<<4)+8>>3]+ +h[n+(k*96|0)+(p<<4)+8>>3]*e;b=p}i=i+1|0}a:do if(f|0){i=0;while(1){if((i|0)>(d|0))break a;p=f+(i<<4)|0;k=n+(i*96|0)|0;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];c[p+8>>2]=c[k+8>>2];c[p+12>>2]=c[k+12>>2];i=i+1|0}}while(0);b:do if(g|0){i=0;while(1){if((i|0)>(d|0))break b;p=g+(i<<4)|0;f=n+((d-i|0)*96|0)+(i<<4)|0;c[p>>2]=c[f>>2];c[p+4>>2]=c[f+4>>2];c[p+8>>2]=c[f+8>>2];c[p+12>>2]=c[f+12>>2];i=i+1|0}}while(0);p=n+(d*96|0)|0;c[a>>2]=c[p>>2];c[a+4>>2]=c[p+4>>2];c[a+8>>2]=c[p+8>>2];c[a+12>>2]=c[p+12>>2];l=o;return}function jP(b){b=b|0;var d=0,e=0,f=0,g=0;e=0;do{d=c[47385]|0;f=d+1024|0;if((d-e|0)<1024){c[47385]=f;f=KK(c[47386]|0,f)|0;c[47386]=f;d=c[47385]|0}else f=c[47386]|0;d=o4(f+e|0,d-e|0,b)|0;if(!d){g=6;break}e=(D3(d)|0)+e|0;d=c[47386]|0}while((a[d+(e+-1)>>0]|0)!=10);if((g|0)==6)d=c[47386]|0;return ((e|0)>0?d:0)|0}function kP(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h+8|0;f=h;do if((b|0)!=0?(a[b>>0]|0)!=0:0){d=c[47179]|0;if(!d){d=c[47178]|0;e=c[47388]|0;if((c[47387]|0)==(d|0))d=e;else{if(e){l6(c[e>>2]|0);l6(c[47388]|0);c[47388]=0;d=c[47178]|0}c[47387]=d;if(!d)break;if(!(a[d>>0]|0))break;d=lP(d)|0;c[47388]=d}if(!((a[b>>0]|0)!=47&(d|0)!=0))break;b=mP(d,c[47389]|0,b)|0;break}e=c[47177]|0;if(e|0?a[e>>0]|0:0){if(!(c[47387]|0)){c[47388]=lP(e)|0;e=c[47177]|0;c[47387]=e}d=I4(b,47)|0;d=(d|0)==0?b:d+1|0;f=I4(d,92)|0;f=(f|0)==0?d:f+1|0;d=I4(f,58)|0;d=(d|0)==0?f:d+1|0;if(!((a[107997]|0)==0|(d|0)==(b|0))){c[g>>2]=b;c[g+4>>2]=e;dA(0,108123,g)|0;a[107997]=0}b=mP(c[47388]|0,c[47389]|0,d)|0;break}if(a[107997]|0){c[f>>2]=d;dA(0,107998,f)|0;a[107997]=0;b=0}else b=0}else b=0;while(0);l=h;return b|0}function lP(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;e=0;f=0;g=0;b=Y3(a)|0;d=0;while(1){b=i6(b,108285)|0;if(!b)break;a=(g<<2)+8|0;if(!f)a=IK(a)|0;else a=KK(d,a)|0;c[a+(g<<2)>>2]=b;f=D3(b)|0;e=e>>>0>f>>>0?e:f;f=a;g=g+1|0;b=0;d=a}c[f+(g<<2)>>2]=0;c[47389]=e;return f|0}function mP(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;h=c[47390]|0;c[47390]=n6(h,b+2+(D3(d)|0)|0)|0;while(1){b=c[a>>2]|0;if(!b){a=0;break}h=c[47390]|0;c[e>>2]=b;c[e+4>>2]=108283;c[e+8>>2]=d;i2(h,108276,e)|0;if(!(H4(c[47390]|0,4)|0)){f=4;break}else a=a+4|0}if((f|0)==4)a=c[47390]|0;l=g;return a|0}function nP(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=(b|0)==0;f=0;while(1){h=c[d+(f<<2)>>2]|0;if(!h)break;if((!g?(a[b>>0]|0)==(a[h>>0]|0):0)?(f2(b,h)|0)==0:0)break;f=f+1|0}return c[e+(f<<2)>>2]|0}function oP(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;z=l;l=l+80|0;x=z+16|0;y=z;u=c[b+4>>2]|0;v=c[b>>2]|0;w=d+8|0;f=0;e=-1;g=1.e+38;b=-1;while(1){if((f|0)>=(u|0))break;s=c[v+(f*48|0)>>2]|0;t=c[v+(f*48|0)+4>>2]|0;r=0;while(1){if((r|0)>=(t|0))break;p=+h[s+(r<<4)>>3]-+h[d>>3];q=+h[s+(r<<4)+8>>3]-+h[w>>3];q=p*p+q*q;A=(e|0)==-1|q>2]|0;e=(((e|0)==((c[v+(b*48|0)+4>>2]|0)+-1|0))<<31>>31)+e|0;e=e-((e|0)%3|0)|0;b=0;while(1){if((b|0)==4)break;B=b+e|0;h[x+(b<<4)>>3]=+h[f+(B<<4)>>3];h[x+(b<<4)+8>>3]=+h[f+(B<<4)+8>>3];b=b+1|0}q=+h[d>>3];p=+h[x>>3]-q;o=+h[w>>3];k=+h[x+8>>3]-o;n=+h[x+48>>3]-q;j=+h[x+56>>3]-o;b=y+8|0;g=1.0;i=0.0;j=n*n+j*j;k=p*p+k*k;while(1){p=(i+g)*.5;iP(y,x,3,p,0,0);m=+h[y>>3];n=+h[b>>3];if(+F(+(k-j))<1.0)break;if(+F(+(g-i))<1.0e-05)break;B=k>3]=m;h[a+8>>3]=n;l=z;return}function pP(){return c[47391]|0}function qP(b){b=b|0;var d=0.0,e=0,f=0,g=0,i=0,j=0,k=0,l=0;d=+YO(b,c[47200]|0,.75,.01);g=b+16|0;h[(c[g>>2]|0)+32>>3]=d;d=+YO(b,c[47199]|0,.5,.02);h[(c[g>>2]|0)+40>>3]=d;l=hN($O(b,c[47201]|0,108287)|0,b)|0;c[(c[g>>2]|0)+8>>2]=l;l=OA(b,c[47216]|0)|0;d=+YO(b,c[47212]|0,14.0,1.0);e=$O(b,c[47213]|0,108295)|0;f=$O(b,c[47214]|0,137615)|0;i=(gD(l)|0)!=0;k=(UM(b)|0)==2;i=xK(b,l,(k?4:0)|(i?2:0),d,e,f)|0;c[(c[g>>2]|0)+104>>2]=i;i=c[47217]|0;if((i|0?(j=OA(b,i)|0,j|0):0)?a[j>>0]|0:0){l=(gD(j)|0)!=0;l=xK(b,j,l?2:0,d,e,f)|0;c[(c[g>>2]|0)+108>>2]=l;l=(c[(uC(b)|0)+16>>2]|0)+113|0;a[l>>0]=a[l>>0]|16}k=(XO(b,c[47220]|0,0,0)|0)&255;l=c[g>>2]|0;a[l+144>>0]=k;db[c[c[(c[l+8>>2]|0)+4>>2]>>2]&127](b);return}function rP(b){b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+112|0;m=v+96|0;n=v+80|0;s=v+40|0;u=v;r=b+48|0;p=uC(c[((c[b>>2]&3|0)==3?b:r)+40>>2]|0)|0;g=m+8|0;c[g>>2]=0;o=n+8|0;c[o>>2]=0;d=c[47251]|0;if(((d|0)!=0?(e=OA(b,d)|0,(e|0)!=0):0)?(a[e>>0]|0)!=0:0){sP(b,m);t=(gD(e)|0)!=0;i=+h[m>>3];f=c[g>>2]|0;d=c[m+12>>2]|0;e=xK(b,e,t?2:0,i,f,d)|0;t=b+16|0;c[(c[t>>2]|0)+96>>2]=e;e=(c[p+16>>2]|0)+113|0;a[e>>0]=a[e>>0]|1;e=bP(_O(b,c[47261]|0,137609)|0)|0;a[(c[t>>2]|0)+114>>0]=e;t=1;e=f}else{t=0;d=0;i=0.0;e=0}f=c[47252]|0;if((f|0?(j=OA(b,f)|0,j|0):0)?a[j>>0]|0:0){if(!e){sP(b,m);i=+h[m>>3];e=c[g>>2]|0;d=c[m+12>>2]|0}g=(gD(j)|0)!=0;j=xK(b,j,g?2:0,i,e,d)|0;c[(c[b+16>>2]|0)+108>>2]=j;j=(c[p+16>>2]|0)+113|0;a[j>>0]=a[j>>0]|32}d=c[47266]|0;if(((d|0)!=0?(k=OA(b,d)|0,(k|0)!=0):0)?(a[k>>0]|0)!=0:0){tP(b,m,n);j=(gD(k)|0)!=0;i=+h[n>>3];d=c[o>>2]|0;e=c[n+12>>2]|0;k=xK(b,k,j?2:0,i,d,e)|0;c[(c[b+16>>2]|0)+100>>2]=k;k=(c[p+16>>2]|0)+113|0;a[k>>0]=a[k>>0]|2}else{e=0;i=0.0;d=0}f=c[47267]|0;if((f|0?(q=OA(b,f)|0,q|0):0)?a[q>>0]|0:0){if(!d){tP(b,m,n);e=c[n+12>>2]|0;i=+h[n>>3];d=c[o>>2]|0}o=(gD(q)|0)!=0;q=xK(b,q,o?2:0,i,d,e)|0;c[(c[b+16>>2]|0)+104>>2]=q;q=(c[p+16>>2]|0)+113|0;a[q>>0]=a[q>>0]|4}d=NA(b,111756)|0;d=d|0?d:195341;if(a[d>>0]|0)a[(c[(c[((c[b>>2]&3|0)==3?b:r)+40>>2]|0)+16>>2]|0)+145>>0]=1;g=b+16|0;f=(c[g>>2]|0)+16|0;e=c[((c[b>>2]&3|0)==3?b:r)+40>>2]|0;uP(s,c[(c[(c[(c[e+16>>2]|0)+8>>2]|0)+4>>2]|0)+8>>2]|0,e,d);d=s;e=f+40|0;do{c[f>>2]=c[d>>2];f=f+4|0;d=d+4|0}while((f|0)<(e|0));if((vP(b,c[47273]|0)|0)<<24>>24)a[(c[g>>2]|0)+46>>0]=0;d=NA(b,111765)|0;d=d|0?d:195341;e=b+-48|0;if(a[d>>0]|0)a[(c[(c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0)+16>>2]|0)+145>>0]=1;f=(c[g>>2]|0)+56|0;e=c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0;uP(u,c[(c[(c[(c[e+16>>2]|0)+8>>2]|0)+4>>2]|0)+8>>2]|0,e,d);d=u;e=f+40|0;do{c[f>>2]=c[d>>2];f=f+4|0;d=d+4|0}while((f|0)<(e|0));if((vP(b,c[47274]|0)|0)<<24>>24)a[(c[g>>2]|0)+86>>0]=0;l=v;return t|0}function sP(a,b){a=a|0;b=b|0;h[b>>3]=+YO(a,c[47248]|0,14.0,1.0);c[b+8>>2]=$O(a,c[47249]|0,108295)|0;c[b+12>>2]=$O(a,c[47250]|0,137615)|0;return}function tP(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=b+8|0;if(!(c[e>>2]|0))sP(a,b);h[d>>3]=+YO(a,c[47268]|0,+h[b>>3],1.0);c[d+8>>2]=$O(a,c[47269]|0,c[e>>2]|0)|0;c[d+12>>2]=$O(a,c[47270]|0,c[b+12>>2]|0)|0;return}function uP(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+128|0;k=m+80|0;h=m+40|0;g=m;if((f|0)!=0?(j=F3(f,58)|0,(j|0)!=0):0){a[j>>0]=0;i=j+1|0;xb[d&31](h,e,f,i);e=k;g=h;d=e+36|0;do{c[e>>2]=c[g>>2];e=e+4|0;g=g+4|0}while((e|0)<(d|0));a[j>>0]=58;f=i}else{xb[d&31](g,e,f,0);e=k;d=e+36|0;do{c[e>>2]=c[g>>2];e=e+4|0;g=g+4|0}while((e|0)<(d|0))}e=b;g=k;d=e+36|0;do{c[e>>2]=c[g>>2];e=e+4|0;g=g+4|0}while((e|0)<(d|0));c[b+36>>2]=f;l=m;return}function vP(b,c){b=b|0;c=c|0;var d=0;if(((c|0)!=0?(d=OA(b,c)|0,(d|0)!=0):0)?(a[d>>0]|0)!=0:0)b=(bP(d)|0)<<24>>24==0&1;else b=0;return b|0}function wP(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0;k=l;l=l+32|0;i=k;j=c[b+8>>2]|0;d=c[b+4>>2]|0;d=(c[b+44>>2]|0)+((S((d|0)>1?d+-1|0:0,j)|0)<<4)|0;e=i+16|0;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];c[i>>2]=c[d>>2];c[i+4>>2]=c[d+4>>2];c[i+8>>2]=c[d+8>>2];c[i+12>>2]=c[d+12>>2];f=i+8|0;g=i+24|0;b=1;while(1){if((b|0)>=(j|0))break;m=d+(b<<4)|0;o=+h[m>>3];h[i>>3]=+h[(+h[i>>3]>3];n=+h[m+8>>3];h[f>>3]=+h[(+h[f>>3]>3];h[e>>3]=+h[(+h[e>>3]>o?e:m)>>3];h[g>>3]=+h[(+h[g>>3]>n?e:m)+8>>3];b=b+1|0}c[a>>2]=c[i>>2];c[a+4>>2]=c[i+4>>2];c[a+8>>2]=c[i+8>>2];c[a+12>>2]=c[i+12>>2];c[a+16>>2]=c[i+16>>2];c[a+20>>2]=c[i+20>>2];c[a+24>>2]=c[i+24>>2];c[a+28>>2]=c[i+28>>2];l=k;return}function xP(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+64|0;g=d+32|0;e=d;f=c[a+16>>2]|0;a=f+16|0;f=c[f+116>>2]&1;c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[g+12>>2]=c[a+12>>2];c[g+16>>2]=c[a+16>>2];c[g+20>>2]=c[a+20>>2];c[g+24>>2]=c[a+24>>2];c[g+28>>2]=c[a+28>>2];yP(e,g,b,f);c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];c[a+16>>2]=c[e+16>>2];c[a+20>>2]=c[e+20>>2];c[a+24>>2]=c[e+24>>2];c[a+28>>2]=c[e+28>>2];l=d;return}function yP(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0,k=0.0,l=0.0,m=0.0;m=+h[d+56>>3];l=+h[d+64>>3];j=e<<24>>24==0;k=+h[d+24>>3];i=+h[d+32>>3];g=(j?k:i)*.5;f=m-g;g=m+g;if(f<+h[b>>3])h[b>>3]=f;e=b+16|0;if(g>+h[e>>3])h[e>>3]=g;g=(j?i:k)*.5;f=l-g;g=l+g;e=b+8|0;if(f<+h[e>>3])h[e>>3]=f;e=b+24|0;if(g>+h[e>>3])h[e>>3]=g;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+20>>2]=c[b+20>>2];c[a+24>>2]=c[b+24>>2];c[a+28>>2]=c[b+28>>2];return}function zP(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,P=0,Q=0.0,R=0.0;M=l;l=l+432|0;I=M+400|0;u=M+384|0;v=M+288|0;L=M+224|0;H=M+192|0;B=M+144|0;C=M+64|0;d=M+368|0;e=M+352|0;f=M+336|0;D=M+320|0;w=M+256|0;x=M+160|0;y=M+112|0;z=M+80|0;A=M+32|0;J=M;G=L+16|0;K=b+16|0;if((qB(b)|0)==0?(c[(c[K>>2]|0)+180>>2]|0)==0:0){AP(L,0.0,0.0);AP(d,0.0,0.0);c[G>>2]=c[d>>2];c[G+4>>2]=c[d+4>>2];c[G+8>>2]=c[d+8>>2];c[G+12>>2]=c[d+12>>2]}else{AP(e,2147483647.0,2147483647.0);c[L>>2]=c[e>>2];c[L+4>>2]=c[e+4>>2];c[L+8>>2]=c[e+8>>2];c[L+12>>2]=c[e+12>>2];AP(f,-2147483647.0,-2147483647.0);c[G>>2]=c[f>>2];c[G+4>>2]=c[f+4>>2];c[G+8>>2]=c[f+8>>2];c[G+12>>2]=c[f+12>>2];E=L+24|0;F=L+8|0;p=C+8|0;q=v+16|0;r=v+8|0;s=v+24|0;t=B+8|0;o=gC(b)|0;while(1){if(!o)break;hP(B,o);d=o+16|0;n=c[d>>2]|0;h[C>>3]=(+h[n+88>>3]+ +h[n+96>>3])*.5;h[p>>3]=+h[n+80>>3]*.5;c[u>>2]=c[B>>2];c[u+4>>2]=c[B+4>>2];c[u+8>>2]=c[B+8>>2];c[u+12>>2]=c[B+12>>2];c[I>>2]=c[C>>2];c[I+4>>2]=c[C+4>>2];c[I+8>>2]=c[C+8>>2];c[I+12>>2]=c[C+12>>2];BP(v,u,I);c[u>>2]=c[B>>2];c[u+4>>2]=c[B+4>>2];c[u+8>>2]=c[B+8>>2];c[u+12>>2]=c[B+12>>2];c[I>>2]=c[C>>2];c[I+4>>2]=c[C+4>>2];c[I+8>>2]=c[C+8>>2];c[I+12>>2]=c[C+12>>2];CP(D,u,I);c[q>>2]=c[D>>2];c[q+4>>2]=c[D+4>>2];c[q+8>>2]=c[D+8>>2];c[q+12>>2]=c[D+12>>2];h[L>>3]=+h[(+h[L>>3]<+h[v>>3]?L:v)>>3];h[F>>3]=+h[(+h[F>>3]<+h[r>>3]?L:v)+8>>3];h[G>>3]=+h[(+h[G>>3]>+h[q>>3]?L:v)+16>>3];h[E>>3]=+h[(+h[E>>3]>+h[s>>3]?L:v)+24>>3];d=c[(c[d>>2]|0)+108>>2]|0;if(d|0?a[d+81>>0]|0:0){n=c[(c[K>>2]|0)+116>>2]&1;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[I+16>>2]=c[L+16>>2];c[I+20>>2]=c[L+20>>2];c[I+24>>2]=c[L+24>>2];c[I+28>>2]=c[L+28>>2];yP(w,I,d,n);c[L>>2]=c[w>>2];c[L+4>>2]=c[w+4>>2];c[L+8>>2]=c[w+8>>2];c[L+12>>2]=c[w+12>>2];c[L+16>>2]=c[w+16>>2];c[L+20>>2]=c[w+20>>2];c[L+24>>2]=c[w+24>>2];c[L+28>>2]=c[w+28>>2]}n=UA(b,o)|0;while(1){if(!n)break;m=n+16|0;d=c[m>>2]|0;g=c[d+8>>2]|0;if(g|0){i=c[g+4>>2]|0;f=0;while(1){if((f|0)>=(i|0))break;k=c[g>>2]|0;j=c[k+(f*48|0)+4>>2]|0;k=k+(f*48|0)|0;e=0;while(1){if((e|0)>=(j|0))break;P=(c[k>>2]|0)+(e<<4)|0;c[B>>2]=c[P>>2];c[B+4>>2]=c[P+4>>2];c[B+8>>2]=c[P+8>>2];c[B+12>>2]=c[P+12>>2];O=+h[B>>3];h[L>>3]=+h[(+h[L>>3]>3];N=+h[t>>3];h[F>>3]=+h[(+h[F>>3]>3];h[G>>3]=+h[(+h[G>>3]>O?G:B)>>3];h[E>>3]=+h[(+h[E>>3]>N?G:B)+8>>3];e=e+1|0}f=f+1|0}e=c[d+96>>2]|0;if((e|0)!=0?(a[e+81>>0]|0)!=0:0){d=c[(c[K>>2]|0)+116>>2]&1;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[I+16>>2]=c[L+16>>2];c[I+20>>2]=c[L+20>>2];c[I+24>>2]=c[L+24>>2];c[I+28>>2]=c[L+28>>2];yP(x,I,e,d);c[L>>2]=c[x>>2];c[L+4>>2]=c[x+4>>2];c[L+8>>2]=c[x+8>>2];c[L+12>>2]=c[x+12>>2];c[L+16>>2]=c[x+16>>2];c[L+20>>2]=c[x+20>>2];c[L+24>>2]=c[x+24>>2];c[L+28>>2]=c[x+28>>2];d=c[m>>2]|0}e=c[d+100>>2]|0;if((e|0)!=0?(a[e+81>>0]|0)!=0:0){d=c[(c[K>>2]|0)+116>>2]&1;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[I+16>>2]=c[L+16>>2];c[I+20>>2]=c[L+20>>2];c[I+24>>2]=c[L+24>>2];c[I+28>>2]=c[L+28>>2];yP(y,I,e,d);c[L>>2]=c[y>>2];c[L+4>>2]=c[y+4>>2];c[L+8>>2]=c[y+8>>2];c[L+12>>2]=c[y+12>>2];c[L+16>>2]=c[y+16>>2];c[L+20>>2]=c[y+20>>2];c[L+24>>2]=c[y+24>>2];c[L+28>>2]=c[y+28>>2];d=c[m>>2]|0}e=c[d+104>>2]|0;if((e|0)!=0?(a[e+81>>0]|0)!=0:0){d=c[(c[K>>2]|0)+116>>2]&1;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[I+16>>2]=c[L+16>>2];c[I+20>>2]=c[L+20>>2];c[I+24>>2]=c[L+24>>2];c[I+28>>2]=c[L+28>>2];yP(z,I,e,d);c[L>>2]=c[z>>2];c[L+4>>2]=c[z+4>>2];c[L+8>>2]=c[z+8>>2];c[L+12>>2]=c[z+12>>2];c[L+16>>2]=c[z+16>>2];c[L+20>>2]=c[z+20>>2];c[L+24>>2]=c[z+24>>2];c[L+28>>2]=c[z+28>>2];d=c[m>>2]|0}d=c[d+108>>2]|0;if(d|0?a[d+81>>0]|0:0){P=c[(c[K>>2]|0)+116>>2]&1;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[I+16>>2]=c[L+16>>2];c[I+20>>2]=c[L+20>>2];c[I+24>>2]=c[L+24>>2];c[I+28>>2]=c[L+28>>2];yP(A,I,d,P);c[L>>2]=c[A>>2];c[L+4>>2]=c[A+4>>2];c[L+8>>2]=c[A+8>>2];c[L+12>>2]=c[A+12>>2];c[L+16>>2]=c[A+16>>2];c[L+20>>2]=c[A+20>>2];c[L+24>>2]=c[A+24>>2];c[L+28>>2]=c[A+28>>2]}}n=WA(b,n)|0}o=hC(b,o)|0}d=c[K>>2]|0;f=c[d+180>>2]|0;g=d+184|0;i=H+8|0;j=H+16|0;k=H+24|0;e=1;while(1){if((e|0)>(f|0))break;P=c[(c[(c[g>>2]|0)+(e<<2)>>2]|0)+16>>2]|0;R=+h[P+16>>3];h[H>>3]=R;Q=+h[P+24>>3];h[i>>3]=Q;N=+h[P+32>>3];h[j>>3]=N;O=+h[P+40>>3];h[k>>3]=O;h[L>>3]=+h[(+h[L>>3]>3];h[F>>3]=+h[(+h[F>>3]>3];h[G>>3]=+h[(+h[G>>3]>N?L:H)+16>>3];h[E>>3]=+h[(+h[E>>3]>O?L:H)+24>>3];e=e+1|0}e=c[d+12>>2]|0;if((e|0)!=0?(a[e+81>>0]|0)!=0:0){d=c[d+116>>2]&1;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[I+16>>2]=c[L+16>>2];c[I+20>>2]=c[L+20>>2];c[I+24>>2]=c[L+24>>2];c[I+28>>2]=c[L+28>>2];yP(J,I,e,d);c[L>>2]=c[J>>2];c[L+4>>2]=c[J+4>>2];c[L+8>>2]=c[J+8>>2];c[L+12>>2]=c[J+12>>2];c[L+16>>2]=c[J+16>>2];c[L+20>>2]=c[J+20>>2];c[L+24>>2]=c[J+24>>2];c[L+28>>2]=c[J+28>>2];d=c[K>>2]|0}P=d+16|0;c[P>>2]=c[L>>2];c[P+4>>2]=c[L+4>>2];c[P+8>>2]=c[L+8>>2];c[P+12>>2]=c[L+12>>2];c[P+16>>2]=c[L+16>>2];c[P+20>>2]=c[L+20>>2];c[P+24>>2]=c[L+24>>2];c[P+28>>2]=c[L+28>>2]}l=M;return}function AP(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function BP(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]-+h[c+8>>3];h[a>>3]=+h[b>>3]-+h[c>>3];h[a+8>>3]=d;return}function CP(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=d;return}function DP(a){a=a|0;if((c[a+60>>2]|0)==(a|0))a=1;else a=(N3(HB(a)|0,108307,7)|0)==0;return a&1|0}function EP(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;a:do if(!e)switch(FC(b)|0){case 0:{e=DA(a,0,c,195341)|0;break a}case 1:{e=DA(a,1,c,195341)|0;break a}case 2:{e=DA(a,2,c,195341)|0;break a}default:{e=0;break a}}while(0);HA(b,e,d)|0;return e|0}function FP(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+144|0;g=k;i=GP(d)|0;h=Sz(23640,c[4591]|0)|0;j=LD(d,108315,1)|0;RC(j,137786,280,1)|0;hA(g,128,k+16|0);e=gC(d)|0;while(1){if(!e)break;a:do if(!(a[(c[e+16>>2]|0)+118>>0]|0)){f=UA(d,e)|0;while(1){if(!f)break a;HP(f,j,g,h,i);f=WA(d,f)|0}}while(0);e=hC(d,e)|0}lA(g);Oz(h)|0;f=qB(j)|0;e=gC(j)|0;while(1){if(!e)break;h=hC(j,e)|0;tC(d,e)|0;e=h}pB(j)|0;if(f|0){j=(c[d+16>>2]|0)+136|0;b[j>>1]=b[j>>1]|1}Oz(i)|0;l=k;return f|0}function GP(a){a=a|0;var b=0;b=Sz(23676,c[4591]|0)|0;QP(a,b);return b|0}function HP(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+48|0;q=t+32|0;p=t+24|0;s=t+16|0;r=t+8|0;k=t;n=c[b>>2]&3;m=c[((n|0)==3?b:b+48|0)+40>>2]|0;n=c[((n|0)==2?b:b+-48|0)+40>>2]|0;do if(!(a[(c[n+16>>2]|0)+118>>0]|0)){if(!(h2(HB(m)|0,108307,7)|0))o=IP(g,HB(m)|0)|0;else o=0;if(!(h2(HB(n)|0,108307,7)|0))j=IP(g,HB(n)|0)|0;else j=0;h=(o|0)!=0;i=(j|0)!=0;if(h|i){if((o|0)==(j|0)){r=HB(m)|0;s=HB(m)|0;c[k>>2]=r;c[k+4>>2]=s;dA(0,108330,k)|0;break}g=JP(f,b)|0;if(g|0){KP(b,c[g+16>>2]|0,c[g+20>>2]|0)|0;break}if(!i)if(!(EC(o,n)|0)){MP(f,m,n,KP(b,LP(m,o,e,d)|0,n)|0);break}else{r=HB(n)|0;s=HB(o)|0;c[q>>2]=r;c[q+4>>2]=s;dA(0,108485,q)|0;break}if(!h)if(!(EC(j,m)|0)){MP(f,m,n,KP(b,m,LP(n,j,e,d)|0)|0);break}else{r=HB(m)|0;s=HB(j)|0;c[p>>2]=r;c[p+4>>2]=s;dA(0,108448,p)|0;break}if(EC(j,o)|0){q=HB(o)|0;s=HB(j)|0;c[r>>2]=q;c[r+4>>2]=s;dA(0,108368,r)|0;break}if(!(EC(o,j)|0)){s=LP(m,o,e,d)|0;MP(f,m,n,KP(b,s,LP(n,j,e,d)|0)|0);break}else{q=HB(j)|0;r=HB(o)|0;c[s>>2]=q;c[s+4>>2]=r;dA(0,108408,s)|0;break}}}while(0);l=t;return}function IP(a,b){a=a|0;b=b|0;a=eb[c[a>>2]&63](a,b,512)|0;if(!a)a=0;else a=c[a+12>>2]|0;return a|0}function JP(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d;f=c[b>>2]&3;c[e>>2]=c[((f|0)==3?b:b+48|0)+40>>2];c[e+4>>2]=c[((f|0)==2?b:b+-48|0)+40>>2];b=eb[c[a>>2]&63](a,e,512)|0;l=d;return b|0}function KP(a,b,c){a=a|0;b=b|0;c=c|0;c=fB(uC(b)|0,b,c,0,1)|0;RC(c,137763,176,1)|0;RA(a,c)|0;return c|0}function LP(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=l;l=l+112|0;g=k;j=k+4|0;kA(e,108522)|0;i=c[47392]|0;c[47392]=i+1;c[g>>2]=i;i2(j,137696,g)|0;kA(e,j)|0;j=e+4|0;g=c[j>>2]|0;i=e+8|0;if(g>>>0>=(c[i>>2]|0)>>>0){iA(e,1)|0;g=c[j>>2]|0}c[j>>2]=g+1;a[g>>0]=58;kA(e,HB(d)|0)|0;h=vC(d)|0;g=c[j>>2]|0;if(g>>>0>=(c[i>>2]|0)>>>0){iA(e,1)|0;g=c[j>>2]|0}a[g>>0]=0;e=c[e>>2]|0;c[j>>2]=e;j=qC(h,e,1)|0;RC(j,137750,304,1)|0;a[(c[j+16>>2]|0)+118>>0]=1;lC(d,j,1)|0;lC(f,b,1)|0;f=uC(j)|0;c[47216]=EP(f,j,108525,195341,c[47216]|0)|0;f=uC(j)|0;c[47219]=EP(f,j,141385,134636,c[47219]|0)|0;f=uC(j)|0;c[47201]=EP(f,j,108531,108537,c[47201]|0)|0;l=k;return j|0}function MP(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;f=l;l=l+32|0;g=f;n=g+8|0;c[n>>2]=b;m=g+12|0;c[m>>2]=d;o=c[e>>2]&3;i=e+48|0;j=g+16|0;c[j>>2]=c[((o|0)==3?e:i)+40>>2];k=e+-48|0;h=g+20|0;c[h>>2]=c[((o|0)==2?e:k)+40>>2];eb[c[a>>2]&63](a,g,1)|0;c[n>>2]=d;c[m>>2]=b;d=c[e>>2]&3;c[j>>2]=c[((d|0)==2?e:k)+40>>2];c[h>>2]=c[((d|0)==3?e:i)+40>>2];eb[c[a>>2]&63](a,g,1)|0;l=f;return}function NP(a,b,d){a=a|0;b=b|0;d=d|0;d=HK(24)|0;c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];c[d+16>>2]=c[b+16>>2];c[d+20>>2]=c[b+20>>2];return d|0}function OP(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function PP(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;e=c[d>>2]|0;if(a>>>0>=e>>>0)if(a>>>0>e>>>0)a=1;else{b=c[b+4>>2]|0;d=c[d+4>>2]|0;return (b>>>0>>0?-1:b>>>0>d>>>0&1)|0}else a=-1;return a|0}function QP(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+16|0;g=h;f=a+16|0;e=1;while(1){a=c[f>>2]|0;if((e|0)>(c[a+180>>2]|0))break;a=c[(c[a+184>>2]|0)+(e<<2)>>2]|0;d=HB(a)|0;if(!(eb[c[b>>2]&63](b,d,512)|0)){i=HK(16)|0;c[i+8>>2]=d;c[i+12>>2]=a;eb[c[b>>2]&63](b,i,1)|0}else{c[g>>2]=d;dA(0,108541,g)|0}QP(a,b);e=e+1|0}l=h;return}function RP(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function SP(a){a=a|0;var b=0,c=0,d=0;d=LD(a,108315,1)|0;RC(d,137786,280,1)|0;b=gC(a)|0;while(1){if(!b)break;c=UA(a,b)|0;while(1){if(!c)break;TP(c,d);c=WA(a,c)|0}b=hC(a,b)|0}b=gC(d)|0;while(1){if(!b)break;c=hC(d,b)|0;UP(b);tC(a,b)|0;b=c}pB(d)|0;return}function TP(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[b>>2]&3;f=c[((e|0)==3?b:b+48|0)+40>>2]|0;e=c[((e|0)==2?b:b+-48|0)+40>>2]|0;if(!((a[(c[f+16>>2]|0)+118>>0]|0)==0?!(a[(c[e+16>>2]|0)+118>>0]|0):0)){f=VP(f,d)|0;e=KP(b,f,VP(e,d)|0)|0;f=c[b+16>>2]|0;d=f+8|0;e=c[e+16>>2]|0;c[e+8>>2]=c[d>>2];c[d>>2]=0;d=f+96|0;c[e+96>>2]=c[d>>2];c[d>>2]=0;d=f+108|0;c[e+108>>2]=c[d>>2];c[d>>2]=0;d=f+100|0;c[e+100>>2]=c[d>>2];c[d>>2]=0;f=f+104|0;c[e+104>>2]=c[f>>2];c[f>>2]=0;WP(b)}return}function UP(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;b=c[e>>2]|0;d=c[b+132>>2]|0;if(d){l6(d);b=c[e>>2]|0}d=c[b+8>>2]|0;if(d){db[c[(c[d+4>>2]|0)+4>>2]&127](a);b=c[e>>2]|0}AK(c[b+104>>2]|0);AK(c[(c[e>>2]|0)+108>>2]|0);TC(a,137750)|0;return}function VP(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=uC(b)|0;a:do if(a[(c[b+16>>2]|0)+118>>0]|0){lC(d,b,1)|0;b=F3(HB(b)|0,58)|0;if(!b)Aa(111509,107962,1225,108593);d=b+1|0;b=qC(f,d,0)|0;if(!b){b=qC(f,d,1)|0;RC(b,137750,304,1)|0;d=IA(f,1,0)|0;while(1){if(!d)break a;g=OA(b,d)|0;e=c[d+12>>2]|0;if((g|0)!=(e|0))HA(b,d,e)|0;d=IA(f,1,d)|0}}}while(0);return b|0}function WP(a){a=a|0;var b=0;b=a+16|0;l6(c[(c[b>>2]|0)+144>>2]|0);XP(a);AK(c[(c[b>>2]|0)+96>>2]|0);AK(c[(c[b>>2]|0)+108>>2]|0);AK(c[(c[b>>2]|0)+100>>2]|0);AK(c[(c[b>>2]|0)+104>>2]|0);TC(a,137763)|0;return}function XP(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;a=c[e>>2]|0;b=c[a+8>>2]|0;if(b){d=0;while(1){a=c[b>>2]|0;if((d|0)>=(c[b+4>>2]|0))break;l6(c[a+(d*48|0)>>2]|0);d=d+1|0;b=c[(c[e>>2]|0)+8>>2]|0}l6(a);l6(c[(c[e>>2]|0)+8>>2]|0);a=c[e>>2]|0}c[a+8>>2]=0;return}function YP(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=DA(a,b,c,0)|0;if(!e)e=DA(a,b,c,d)|0;return e|0}function ZP(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;i=o;h=o+8|0;j=o+16|0;m=F3(b,59)|0;n=d+4|0;e=c[n>>2]|0;k=d+8|0;if(e>>>0>=(c[k>>2]|0)>>>0){iA(d,1)|0;e=c[n>>2]|0}c[n>>2]=e+1;a[e>>0]=38;if(((m|0)!=0?(f=m-b|0,(f+-2|0)>>>0<=6):0)?(N4(j,b,f)|0,a[j+f>>0]=0,c[h>>2]=j,g=e6(h,23712,252,8,96)|0,(g|0)!=0):0){c[i>>2]=c[g+4>>2];i2(j,137696,i)|0;b=c[n>>2]|0;if(b>>>0>=(c[k>>2]|0)>>>0){iA(d,1)|0;b=c[n>>2]|0}c[n>>2]=b+1;a[b>>0]=35;kA(d,j)|0;b=c[n>>2]|0;if(b>>>0>=(c[k>>2]|0)>>>0){iA(d,1)|0;b=c[n>>2]|0}c[n>>2]=b+1;a[b>>0]=59;b=m+1|0}l=o;return b|0}function _P(a,b){a=a|0;b=b|0;return f2(c[a>>2]|0,c[b>>2]|0)|0}function $P(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+1072|0;k=q+8|0;j=q;i=q+16|0;o=q+24|0;c[i>>2]=b;if((c[47393]|0)!=(d|0)){c[47393]=d;a[195240]=0}hA(o,1024,q+40|0);n=o+8|0;p=o+4|0;while(1){f=b+1|0;c[i>>2]=f;e=a[b>>0]|0;if(!(e<<24>>24))break;do if((e&255)<192)if(e<<24>>24==38){g=bQ(i)|0;if(!g)e=38;else{if(g>>>0<127){e=g&255;break}b=c[p>>2]|0;f=b>>>0>=(c[n>>2]|0)>>>0;h=g>>>6;e=(g&63|128)&255;if(g>>>0<2047){if(f){iA(o,1)|0;b=c[p>>2]|0}c[p>>2]=b+1;a[b>>0]=h|192;break}if(f){iA(o,1)|0;b=c[p>>2]|0}c[p>>2]=b+1;a[b>>0]=g>>>12|224;b=c[p>>2]|0;if(b>>>0>=(c[n>>2]|0)>>>0){iA(o,1)|0;b=c[p>>2]|0}c[p>>2]=b+1;a[b>>0]=h&63|128}}else{h=0;m=9}else if((e&255)>=224)if((e&255)>=240)if((e&255)<248){h=3;m=9}else{if(!(a[195240]|0)){c[j>>2]=HB(d)|0;dA(0,110008,j)|0;a[195240]=1}h=-1;e=aQ(e,o)|0;m=9}else{h=2;m=9}else{h=1;m=9}while(0);do if((m|0)==9){m=0;g=0;while(1){if((g|0)>=(h|0)){m=34;break}if((a[f>>0]&-64)<<24>>24!=-128)break;b=c[p>>2]|0;if(b>>>0>=(c[n>>2]|0)>>>0){iA(o,1)|0;b=c[p>>2]|0}c[p>>2]=b+1;a[b>>0]=e;g=g+1|0;e=a[f>>0]|0;f=f+1|0}if((m|0)==34){m=0;c[i>>2]=f;break}c[i>>2]=f;if(!(a[195240]|0)){g=HB(d)|0;c[k>>2]=h+1;c[k+4>>2]=g;dA(0,110129,k)|0;a[195240]=1}e=aQ(e,o)|0}while(0);b=c[p>>2]|0;if(b>>>0>=(c[n>>2]|0)>>>0){iA(o,1)|0;b=c[p>>2]|0}c[p>>2]=b+1;a[b>>0]=e;b=c[i>>2]|0}b=c[p>>2]|0;if(b>>>0>=(c[n>>2]|0)>>>0){iA(o,1)|0;b=c[p>>2]|0}a[b>>0]=0;n=c[o>>2]|0;c[p>>2]=n;p=Y3(n)|0;lA(o);l=q;return p|0} -function tw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;if(a){if((c[a+32>>2]|0)!=1)Aa(95220,95244,187,95375);s=a+36|0;d=c[s>>2]|0;if((d&2|0)==0?(p=(b|0)!=0,(d&1|0)==0|p^1):0)if((c[a>>2]|0)==(c[a+4>>2]|0)?(t=mw(a)|0,(t|0)!=0):0){k=c[a+20>>2]|0;l=c[a+24>>2]|0;m=c[t+20>>2]|0;n=c[t+24>>2]|0;o=c[a>>2]|0;q=IK(o<<2)|0;b=0;while(1){if((b|0)>=(o|0))break;c[q+(b<<2)>>2]=-1;b=b+1|0}b=a+28|0;d=t+28|0;a:do switch((p?8:c[a+16>>2]|0)|0){case 1:{i=c[b>>2]|0;g=c[d>>2]|0;b=0;while(1){if((b|0)>(o|0)){d=0;break}if((c[k+(b<<2)>>2]|0)==(c[m+(b<<2)>>2]|0))b=b+1|0;else{b=0;break a}}b:while(1){if((d|0)>=(o|0)){r=54;break a}e=k+(d<<2)|0;f=d+1|0;a=k+(f<<2)|0;b=c[e>>2]|0;while(1){if((b|0)>=(c[a>>2]|0))break;c[q+(c[l+(b<<2)>>2]<<2)>>2]=b;b=b+1|0}b=c[m+(d<<2)>>2]|0;a=c[m+(f<<2)>>2]|0;d=b;while(1){if((d|0)>=(a|0))break;if((c[q+(c[n+(d<<2)>>2]<<2)>>2]|0)<(c[e>>2]|0)){b=0;break a}else d=d+1|0}while(1){if((b|0)>=(a|0)){d=f;continue b}u=+h[g+(b<<3)>>3]-+h[i+(c[q+(c[n+(b<<2)>>2]<<2)>>2]<<3)>>3];if((u>=0.0?u:-u)>1.0e-07){b=0;break a}else b=b+1|0}}}case 2:{j=c[b>>2]|0;i=c[d>>2]|0;b=0;while(1){if((b|0)>(o|0)){d=0;break}if((c[k+(b<<2)>>2]|0)==(c[m+(b<<2)>>2]|0))b=b+1|0;else{b=0;break a}}c:while(1){if((d|0)>=(o|0)){r=54;break a}f=k+(d<<2)|0;g=d+1|0;a=k+(g<<2)|0;b=c[f>>2]|0;while(1){if((b|0)>=(c[a>>2]|0))break;c[q+(c[l+(b<<2)>>2]<<2)>>2]=b;b=b+1|0}d=c[m+(d<<2)>>2]|0;e=c[m+(g<<2)>>2]|0;b=d;while(1){if((b|0)>=(e|0)){b=d;break}if((c[q+(c[n+(b<<2)>>2]<<2)>>2]|0)<(c[f>>2]|0)){b=0;break a}else b=b+1|0}while(1){if((b|0)>=(e|0)){d=g;continue c}d=b<<1;a=c[q+(c[n+(b<<2)>>2]<<2)>>2]<<1;u=+h[i+(d<<3)>>3]-+h[j+(a<<3)>>3];if((u>=0.0?u:-u)>1.0e-07){b=0;break a}u=+h[i+((d|1)<<3)>>3]-+h[j+((a|1)<<3)>>3];if((u>=0.0?u:-u)>1.0e-07){b=0;break a}else b=b+1|0}}}case 4:{i=c[b>>2]|0;f=c[d>>2]|0;b=0;d:while(1){if((b|0)>=(o|0)){r=54;break a}e=k+(b<<2)|0;g=b+1|0;a=k+(g<<2)|0;d=c[e>>2]|0;while(1){if((d|0)>=(c[a>>2]|0))break;c[q+(c[l+(d<<2)>>2]<<2)>>2]=d;d=d+1|0}b=c[m+(b<<2)>>2]|0;a=c[m+(g<<2)>>2]|0;d=b;while(1){if((d|0)>=(a|0))break;if((c[q+(c[n+(d<<2)>>2]<<2)>>2]|0)<(c[e>>2]|0)){b=0;break a}else d=d+1|0}while(1){if((b|0)>=(a|0)){b=g;continue d}if((c[f+(b<<2)>>2]|0)==(c[i+(c[q+(c[n+(b<<2)>>2]<<2)>>2]<<2)>>2]|0))b=b+1|0;else{b=0;break a}}}}case 8:{a=0;e:while(1){if((a|0)>=(o|0)){r=54;break a}e=k+(a<<2)|0;f=a+1|0;d=k+(f<<2)|0;b=c[e>>2]|0;while(1){if((b|0)>=(c[d>>2]|0))break;c[q+(c[l+(b<<2)>>2]<<2)>>2]=b;b=b+1|0}d=c[m+(f<<2)>>2]|0;b=c[m+(a<<2)>>2]|0;while(1){if((b|0)>=(d|0)){a=f;continue e}if((c[q+(c[n+(b<<2)>>2]<<2)>>2]|0)<(c[e>>2]|0)){b=0;break a}else b=b+1|0}}}default:b=0}while(0);if((r|0)==54){d=c[s>>2]|0;if(p)b=1;else{c[s>>2]=d|2;b=3}c[s>>2]=b|d;b=1}l6(q);nw(t)}else b=0;else b=1}else b=0;return b|0}function uw(a){a=a|0;var b=0,d=0,e=0,f=0;if(!a)b=0;else{e=a+8|0;f=a+40|0;b=ww(c[a>>2]|0,c[a+4>>2]|0,c[e>>2]|0,c[a+16>>2]|0,c[f>>2]|0,c[a+32>>2]|0)|0;d=a+20|0;B6(c[b+20>>2]|0,c[d>>2]|0,(c[a>>2]<<2)+4|0)|0;B6(c[b+24>>2]|0,c[a+24>>2]|0,c[(c[d>>2]|0)+(c[a>>2]<<2)>>2]<<2|0)|0;d=c[a+28>>2]|0;if(d|0)B6(c[b+28>>2]|0,d|0,S(c[e>>2]|0,c[f>>2]|0)|0)|0;c[b+36>>2]=c[a+36>>2];c[b+8>>2]=c[e>>2]}return b|0}function vw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;r=c[a+20>>2]|0;t=c[a+24>>2]|0;u=c[b+20>>2]|0;v=c[b+24>>2]|0;if(!((a|0)!=0&(b|0)!=0))Aa(95282,95244,973,95289);s=c[a+32>>2]|0;if(!((s|0)==1?(s|0)==(c[b+32>>2]|0):0))Aa(95306,95244,974,95289);f=a+16|0;d=c[f>>2]|0;if((d|0)!=(c[b+16>>2]|0))Aa(95356,95244,975,95289);q=c[a>>2]|0;e=c[a+4>>2]|0;if(((q|0)==(c[b>>2]|0)?(e|0)==(c[b+4>>2]|0):0)?(w=ow(q,e,(c[b+8>>2]|0)+(c[a+8>>2]|0)|0,d,1)|0,w|0):0){o=c[w+20>>2]|0;p=c[w+24>>2]|0;s=IK(e<<2)|0;d=0;while(1){if((d|0)>=(e|0))break;c[s+(d<<2)>>2]=-1;d=d+1|0}c[o>>2]=0;d=a+28|0;a=b+28|0;e=w+28|0;a:do switch(c[f>>2]|0){case 1:{m=c[d>>2]|0;l=c[a>>2]|0;j=c[e>>2]|0;d=0;b=0;while(1){if((b|0)>=(q|0))break a;k=b+1|0;e=r+(k<<2)|0;a=c[r+(b<<2)>>2]|0;while(1){if((a|0)>=(c[e>>2]|0))break;n=t+(a<<2)|0;c[s+(c[n>>2]<<2)>>2]=d;c[p+(d<<2)>>2]=c[n>>2];h[j+(d<<3)>>3]=+h[m+(a<<3)>>3];a=a+1|0;d=d+1|0}f=u+(k<<2)|0;g=o+(b<<2)|0;b=c[u+(b<<2)>>2]|0;while(1){if((b|0)>=(c[f>>2]|0))break;a=c[v+(b<<2)>>2]|0;e=c[s+(a<<2)>>2]|0;i=+h[l+(b<<3)>>3];if((e|0)<(c[g>>2]|0)){c[p+(d<<2)>>2]=a;h[j+(d<<3)>>3]=i;d=d+1|0}else{n=j+(e<<3)|0;h[n>>3]=i+ +h[n>>3]}b=b+1|0}c[o+(k<<2)>>2]=d;b=k}}case 2:{n=c[d>>2]|0;m=c[a>>2]|0;k=c[e>>2]|0;b=0;d=0;while(1){if((b|0)>=(q|0))break a;l=b+1|0;e=r+(l<<2)|0;a=c[r+(b<<2)>>2]|0;while(1){if((a|0)>=(c[e>>2]|0))break;g=t+(a<<2)|0;c[s+(c[g>>2]<<2)>>2]=d;c[p+(d<<2)>>2]=c[g>>2];g=a<<1;j=d<<1;h[k+(j<<3)>>3]=+h[n+(g<<3)>>3];h[k+((j|1)<<3)>>3]=+h[n+((g|1)<<3)>>3];a=a+1|0;d=d+1|0}g=u+(l<<2)|0;j=o+(b<<2)|0;f=c[u+(b<<2)>>2]|0;while(1){if((f|0)>=(c[g>>2]|0))break;a=c[v+(f<<2)>>2]|0;e=c[s+(a<<2)>>2]|0;x=f<<1;b=m+((x|1)<<3)|0;i=+h[m+(x<<3)>>3];if((e|0)<(c[j>>2]|0)){c[p+(d<<2)>>2]=a;x=d<<1;h[k+(x<<3)>>3]=i;h[k+((x|1)<<3)>>3]=+h[b>>3];d=d+1|0}else{x=e<<1;e=k+(x<<3)|0;h[e>>3]=i+ +h[e>>3];x=k+((x|1)<<3)|0;h[x>>3]=+h[b>>3]+ +h[x>>3]}f=f+1|0}c[o+(l<<2)>>2]=d;b=l}}case 4:{n=c[d>>2]|0;m=c[a>>2]|0;k=c[e>>2]|0;b=0;d=0;while(1){if((b|0)>=(q|0))break a;l=b+1|0;e=r+(l<<2)|0;a=c[r+(b<<2)>>2]|0;while(1){if((a|0)>=(c[e>>2]|0))break;x=t+(a<<2)|0;c[s+(c[x>>2]<<2)>>2]=d;c[p+(d<<2)>>2]=c[x>>2];c[k+(d<<2)>>2]=c[n+(a<<2)>>2];a=a+1|0;d=d+1|0}g=u+(l<<2)|0;j=o+(b<<2)|0;f=c[u+(b<<2)>>2]|0;while(1){if((f|0)>=(c[g>>2]|0))break;a=c[v+(f<<2)>>2]|0;e=c[s+(a<<2)>>2]|0;b=m+(f<<2)|0;if((e|0)<(c[j>>2]|0)){c[p+(d<<2)>>2]=a;c[k+(d<<2)>>2]=c[b>>2];d=d+1|0}else{x=k+(e<<2)|0;c[x>>2]=(c[x>>2]|0)+(c[b>>2]|0)}f=f+1|0}c[o+(l<<2)>>2]=d;b=l}}case 8:{d=0;b=0;while(1){if((b|0)>=(q|0))break a;j=b+1|0;e=r+(j<<2)|0;a=c[r+(b<<2)>>2]|0;while(1){if((a|0)>=(c[e>>2]|0))break;x=t+(a<<2)|0;c[s+(c[x>>2]<<2)>>2]=d;c[p+(d<<2)>>2]=c[x>>2];d=d+1|0;a=a+1|0}f=u+(j<<2)|0;g=o+(b<<2)|0;e=c[u+(b<<2)>>2]|0;while(1){if((e|0)>=(c[f>>2]|0))break;a=c[v+(e<<2)>>2]|0;if((c[s+(a<<2)>>2]|0)<(c[g>>2]|0)){c[p+(d<<2)>>2]=a;d=d+1|0}e=e+1|0}c[o+(j<<2)>>2]=d;b=j}}default:d=0}while(0);c[w+8>>2]=d;l6(s);return w|0}return 0}function ww(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;a=qw(a,b,d,e,f)|0;if((c|0)>0)rw(a,c)|0;return a|0}function xw(a,b){a=a|0;b=b|0;var d=0;if(!(tw(a,b)|0)){b=mw(a)|0;if(!b)b=0;else{d=vw(a,b)|0;nw(b);b=d+36|0;c[b>>2]=c[b>>2]|3;b=d;d=5}}else{b=uw(a)|0;d=5}if((d|0)==5)b=yw(b)|0;return b|0}function yw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if(!a)a=0;else{k=c[a+20>>2]|0;l=c[a+24>>2]|0;d=c[k>>2]|0;m=a+8|0;b=a+28|0;b:do switch(c[a+16>>2]|0){case 1:{j=c[b>>2]|0;i=0;b=0;while(1){if((i|0)>=(c[a>>2]|0))break b;f=i+1|0;g=k+(f<<2)|0;while(1){e=c[g>>2]|0;if((d|0)>=(e|0))break;e=c[l+(d<<2)>>2]|0;if((e|0)!=(i|0)){c[l+(b<<2)>>2]=e;h[j+(b<<3)>>3]=+h[j+(d<<3)>>3];b=b+1|0}d=d+1|0}c[g>>2]=b;i=f;d=e}}case 2:{j=c[b>>2]|0;i=0;b=0;while(1){if((i|0)>=(c[a>>2]|0))break b;f=i+1|0;g=k+(f<<2)|0;while(1){e=c[g>>2]|0;if((d|0)>=(e|0))break;e=c[l+(d<<2)>>2]|0;if((e|0)!=(i|0)){c[l+(b<<2)>>2]=e;n=d<<1;e=b<<1;h[j+(e<<3)>>3]=+h[j+(n<<3)>>3];h[j+((e|1)<<3)>>3]=+h[j+((n|1)<<3)>>3];b=b+1|0}d=d+1|0}c[g>>2]=b;i=f;d=e}}case 4:{j=c[b>>2]|0;i=0;b=0;while(1){if((i|0)>=(c[a>>2]|0))break b;f=i+1|0;g=k+(f<<2)|0;while(1){e=c[g>>2]|0;if((d|0)>=(e|0))break;e=c[l+(d<<2)>>2]|0;if((e|0)!=(i|0)){c[l+(b<<2)>>2]=e;c[j+(b<<2)>>2]=c[j+(d<<2)>>2];b=b+1|0}d=d+1|0}c[g>>2]=b;i=f;d=e}}case 8:{i=0;b=0;while(1){if((i|0)>=(c[a>>2]|0))break b;f=i+1|0;g=k+(f<<2)|0;while(1){e=c[g>>2]|0;if((d|0)>=(e|0))break;e=c[l+(d<<2)>>2]|0;if((e|0)!=(i|0)){c[l+(b<<2)>>2]=e;b=b+1|0}d=d+1|0}c[g>>2]=b;i=f;d=e}}default:{a=0;break a}}while(0);c[m>>2]=b}while(0);return a|0}function zw(a){a=a|0;if((c[a+32>>2]|0)==2)return Aw(c[a+8>>2]|0,c[a>>2]|0,c[a+4>>2]|0,c[a+20>>2]|0,c[a+24>>2]|0,c[a+28>>2]|0,c[a+16>>2]|0,c[a+40>>2]|0)|0;else Aa(95401,95244,803,95427);return 0}function Aw(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;return Bw(a,b,c,d,e,f,g,h,1)|0}function Bw(a,b,d,e,f,g,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if(!((a|0)>-1&((b|0)>0&(d|0)>0)))Aa(95463,95244,843,95489);j=ww(b,d,a,i,j,1)|0;if(!j)Aa(95534,95244,847,95489);v=c[j+20>>2]|0;u=c[j+24>>2]|0;m=b+1|0;l=0;while(1){if((l|0)==(m|0))break;c[v+(l<<2)>>2]=0;l=l+1|0}n=j+28|0;a:do switch(i|0){case 1:{n=c[n>>2]|0;l=0;while(1){if((l|0)>=(a|0)){r=0;break}m=c[e+(l<<2)>>2]|0;if(!((m|0)>-1&(m|0)<(b|0))){t=13;break}s=c[f+(l<<2)>>2]|0;if(!((s|0)>-1&(s|0)<(d|0))){t=13;break}s=v+(m+1<<2)|0;c[s>>2]=(c[s>>2]|0)+1;l=l+1|0}if((t|0)==13)Aa(138697,95244,862,95489);while(1){if((r|0)==(b|0)){l=0;break}t=r+1|0;d=v+(t<<2)|0;c[d>>2]=(c[d>>2]|0)+(c[v+(r<<2)>>2]|0);r=t}while(1){if((l|0)==(a|0))break;s=v+(c[e+(l<<2)>>2]<<2)|0;t=c[s>>2]|0;h[n+(t<<3)>>3]=+h[g+(l<<3)>>3];d=c[f+(l<<2)>>2]|0;c[s>>2]=t+1;c[u+(t<<2)>>2]=d;l=l+1|0}while(1){if((b|0)<=0)break a;f=b+-1|0;c[v+(b<<2)>>2]=c[v+(f<<2)>>2];b=f}}case 2:{n=c[n>>2]|0;l=0;while(1){if((l|0)>=(a|0)){s=0;break}m=c[e+(l<<2)>>2]|0;if(!((m|0)>-1&(m|0)<(b|0))){t=25;break}r=c[f+(l<<2)>>2]|0;if(!((r|0)>-1&(r|0)<(d|0))){t=25;break}r=v+(m+1<<2)|0;c[r>>2]=(c[r>>2]|0)+1;l=l+1|0}if((t|0)==25)Aa(138697,95244,880,95489);while(1){if((s|0)==(b|0)){l=0;break}t=s+1|0;d=v+(t<<2)|0;c[d>>2]=(c[d>>2]|0)+(c[v+(s<<2)>>2]|0);s=t}while(1){if((l|0)==(a|0))break;s=v+(c[e+(l<<2)>>2]<<2)|0;t=c[s>>2]|0;d=t<<1;h[n+(d<<3)>>3]=+h[g>>3];h[n+((d|1)<<3)>>3]=+h[g+8>>3];d=c[f+(l<<2)>>2]|0;c[s>>2]=t+1;c[u+(t<<2)>>2]=d;g=g+16|0;l=l+1|0}while(1){if((b|0)<=0)break a;f=b+-1|0;c[v+(b<<2)>>2]=c[v+(f<<2)>>2];b=f}}case 4:{n=c[n>>2]|0;l=0;while(1){if((l|0)>=(a|0)){q=0;break}m=c[e+(l<<2)>>2]|0;if(!((m|0)>-1&(m|0)<(b|0))){t=37;break}s=c[f+(l<<2)>>2]|0;if(!((s|0)>-1&(s|0)<(d|0))){t=37;break}s=v+(m+1<<2)|0;c[s>>2]=(c[s>>2]|0)+1;l=l+1|0}if((t|0)==37)Aa(138697,95244,899,95489);while(1){if((q|0)==(b|0)){l=0;break}t=q+1|0;d=v+(t<<2)|0;c[d>>2]=(c[d>>2]|0)+(c[v+(q<<2)>>2]|0);q=t}while(1){if((l|0)==(a|0))break;s=e+(l<<2)|0;c[n+(c[v+(c[s>>2]<<2)>>2]<<2)>>2]=c[g+(l<<2)>>2];d=c[f+(l<<2)>>2]|0;s=v+(c[s>>2]<<2)|0;t=c[s>>2]|0;c[s>>2]=t+1;c[u+(t<<2)>>2]=d;l=l+1|0}while(1){if((b|0)<=0)break a;f=b+-1|0;c[v+(b<<2)>>2]=c[v+(f<<2)>>2];b=f}}case 8:{g=0;while(1){if((g|0)>=(a|0)){o=0;break}l=c[e+(g<<2)>>2]|0;if(!((l|0)>-1&(l|0)<(b|0))){t=48;break}s=c[f+(g<<2)>>2]|0;if(!((s|0)>-1&(s|0)<(d|0))){t=48;break}s=v+(l+1<<2)|0;c[s>>2]=(c[s>>2]|0)+1;g=g+1|0}if((t|0)==48)Aa(138697,95244,915,95489);while(1){if((o|0)==(b|0)){g=0;break}t=o+1|0;d=v+(t<<2)|0;c[d>>2]=(c[d>>2]|0)+(c[v+(o<<2)>>2]|0);o=t}while(1){if((g|0)==(a|0))break;d=c[f+(g<<2)>>2]|0;s=v+(c[e+(g<<2)>>2]<<2)|0;t=c[s>>2]|0;c[s>>2]=t+1;c[u+(t<<2)>>2]=d;g=g+1|0}while(1){if((b|0)<=0)break a;f=b+-1|0;c[v+(b<<2)>>2]=c[v+(f<<2)>>2];b=f}}case 16:{l=0;while(1){if((l|0)>=(a|0)){p=0;break}m=c[e+(l<<2)>>2]|0;if(!((m|0)>-1&(m|0)<(b|0))){t=59;break}s=c[f+(l<<2)>>2]|0;if(!((s|0)>-1&(s|0)<(d|0))){t=59;break}s=v+(m+1<<2)|0;c[s>>2]=(c[s>>2]|0)+1;l=l+1|0}if((t|0)==59)Aa(138697,95244,930,95489);while(1){if((p|0)==(b|0))break;t=p+1|0;d=v+(t<<2)|0;c[d>>2]=(c[d>>2]|0)+(c[v+(p<<2)>>2]|0);p=t}B6(c[n>>2]|0,g|0,S(c[j+40>>2]|0,a)|0)|0;g=0;while(1){if((g|0)==(a|0))break;d=c[f+(g<<2)>>2]|0;s=v+(c[e+(g<<2)>>2]<<2)|0;t=c[s>>2]|0;c[s>>2]=t+1;c[u+(t<<2)>>2]=d;g=g+1|0}while(1){if((b|0)<=0)break a;f=b+-1|0;c[v+(b<<2)>>2]=c[v+(f<<2)>>2];b=f}}default:Aa(138697,95244,944,95489)}while(0);c[v>>2]=0;c[j+8>>2]=a;if(k)j=Cw(j,k)|0;return j|0}function Cw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;v=c[a+20>>2]|0;w=c[a+24>>2]|0;e=c[a+16>>2]|0;s=c[a+4>>2]|0;a:do if(b){r=s<<2;u=IK(r)|0;d=0;while(1){if((d|0)>=(s|0))break;c[u+(d<<2)>>2]=-1;d=d+1|0}d=a+28|0;b:do switch(e|0){case 1:{k=c[d>>2]|0;f=0;e=c[v>>2]|0;d=0;c:while(1){if((d|0)>=(c[a>>2]|0)){x=f;y=u;break b}m=d+1|0;n=v+(m<<2)|0;j=v+(d<<2)|0;d=f;while(1){b=c[n>>2]|0;if((e|0)>=(b|0))break;b=w+(e<<2)|0;f=c[b>>2]|0;g=c[u+(f<<2)>>2]|0;i=k+(e<<3)|0;if((g|0)<(c[j>>2]|0)){c[w+(d<<2)>>2]=f;h[k+(d<<3)>>3]=+h[i>>3];c[u+(c[b>>2]<<2)>>2]=d;d=d+1|0}else{if((c[w+(g<<2)>>2]|0)!=(f|0))break c;t=k+(g<<3)|0;h[t>>3]=+h[i>>3]+ +h[t>>3]}e=e+1|0}c[n>>2]=d;f=d;e=b;d=m}Aa(95536,95244,1792,95561);break}case 2:{t=c[d>>2]|0;switch(b|0){case 1:{b=c[v>>2]|0;e=0;d=0;d:while(1){if((e|0)>=(c[a>>2]|0)){x=d;y=u;break b}m=e+1|0;n=v+(m<<2)|0;k=v+(e<<2)|0;while(1){e=c[n>>2]|0;if((b|0)>=(e|0))break;e=w+(b<<2)|0;f=c[e>>2]|0;g=c[u+(f<<2)>>2]|0;j=b<<1;i=t+(j<<3)|0;j=t+((j|1)<<3)|0;if((g|0)<(c[k>>2]|0)){c[w+(d<<2)>>2]=f;s=d<<1;h[t+(s<<3)>>3]=+h[i>>3];h[t+((s|1)<<3)>>3]=+h[j>>3];c[u+(c[e>>2]<<2)>>2]=d;d=d+1|0}else{if((c[w+(g<<2)>>2]|0)!=(f|0))break d;s=g<<1;r=t+(s<<3)|0;h[r>>3]=+h[i>>3]+ +h[r>>3];s=t+((s|1)<<3)|0;h[s>>3]=+h[j>>3]+ +h[s>>3]}b=b+1|0}c[n>>2]=d;b=e;e=m}Aa(95536,95244,1815,95561);break}case 4:{b=c[v>>2]|0;e=0;d=0;e:while(1){if((e|0)>=(c[a>>2]|0)){x=d;y=u;break b}m=e+1|0;n=v+(m<<2)|0;k=v+(e<<2)|0;while(1){e=c[n>>2]|0;if((b|0)>=(e|0))break;i=w+(b<<2)|0;j=c[i>>2]|0;e=c[u+(j<<2)>>2]|0;g=b<<1;f=t+(g<<3)|0;g=t+((g|1)<<3)|0;if((e|0)<(c[k>>2]|0)){c[w+(d<<2)>>2]=j;s=d<<1;h[t+(s<<3)>>3]=+h[f>>3];h[t+((s|1)<<3)>>3]=+h[g>>3];c[u+(c[i>>2]<<2)>>2]=d;d=d+1|0}else{if((c[w+(e<<2)>>2]|0)!=(j|0))break e;s=e<<1;r=t+(s<<3)|0;h[r>>3]=+h[f>>3]+ +h[r>>3];h[t+((s|1)<<3)>>3]=+h[g>>3]}b=b+1|0}c[n>>2]=d;b=e;e=m}Aa(95536,95244,1835,95561);break}default:{p=t+8|0;switch(b|0){case 2:break;case 3:{f=~~+h[p>>3];i=c[a>>2]|0;d=f;e=0;g=0;f:while(1){if((g|0)>=(i|0))break;j=g+1|0;k=c[v+(j<<2)>>2]|0;b=d;d=c[v+(g<<2)>>2]|0;while(1){if((d|0)>=(k|0)){d=b;g=j;continue f}q=~~+h[t+(e<<1<<3)>>3];b=(b|0)>(q|0)?b:q;f=(f|0)>(q|0)?f:q;e=e+1|0;d=d+1|0}}l6(u);e=d-f+1|0;o=IK(S(e,r)|0)|0;e=S(e,s)|0;d=0;while(1){if((d|0)>=(e|0))break;c[o+(d<<2)>>2]=-1;d=d+1|0}d=0;b=c[v>>2]|0;e=0;g:while(1){if((e|0)>=(c[a>>2]|0)){x=d;y=o;break b}m=e+1|0;n=v+(m<<2)|0;k=v+(e<<2)|0;while(1){e=c[n>>2]|0;if((b|0)>=(e|0))break;e=c[w+(b<<2)>>2]|0;j=b<<1;l=+h[t+(j<<3)>>3];g=o+((S(~~l-f|0,s)|0)+e<<2)|0;i=c[g>>2]|0;j=t+((j|1)<<3)|0;if((i|0)<(c[k>>2]|0)){c[w+(d<<2)>>2]=e;q=d<<1;h[t+(q<<3)>>3]=l;h[t+((q|1)<<3)>>3]=+h[j>>3];c[g>>2]=d;d=d+1|0}else{if((c[w+(i<<2)>>2]|0)!=(e|0))break g;q=i<<1;h[t+(q<<3)>>3]=l;q=t+((q|1)<<3)|0;h[q>>3]=+h[j>>3]+ +h[q>>3]}b=b+1|0}c[n>>2]=d;b=e;e=m}Aa(95614,95244,1905,95561);break}default:{x=0;y=u;break b}}q=~~+h[p>>3];i=c[a>>2]|0;e=q;g=0;d=0;h:while(1){if((g|0)>=(i|0))break;j=g+1|0;k=c[v+(j<<2)>>2]|0;f=d;b=q;d=c[v+(g<<2)>>2]|0;while(1){if((d|0)>=(k|0)){q=b;g=j;d=f;continue h}q=~~+h[t+((f<<1|1)<<3)>>3];f=f+1|0;e=(e|0)>(q|0)?e:q;b=(b|0)<(q|0)?b:q;d=d+1|0}}l6(u);p=e-q+1|0;o=IK(S(p,r)|0)|0;p=S(p,s)|0;d=0;while(1){if((d|0)>=(p|0))break;c[o+(d<<2)>>2]=-1;d=d+1|0}d=0;b=c[v>>2]|0;e=0;i:while(1){if((e|0)>=(c[a>>2]|0)){x=d;y=o;break b}m=e+1|0;n=v+(m<<2)|0;k=v+(e<<2)|0;while(1){e=c[n>>2]|0;if((b|0)>=(e|0))break;e=c[w+(b<<2)>>2]|0;j=b<<1;l=+h[t+((j|1)<<3)>>3];f=(S(~~l-q|0,s)|0)+e|0;g=o+(f<<2)|0;i=c[g>>2]|0;j=t+(j<<3)|0;if((i|0)<(c[k>>2]|0)){c[w+(d<<2)>>2]=e;u=d<<1;h[t+(u<<3)>>3]=+h[j>>3];h[t+((u|1)<<3)>>3]=l;c[g>>2]=d;d=d+1|0}else{if((f|0)>=(p|0)){d=56;break i}if((c[w+(i<<2)>>2]|0)!=(e|0)){d=58;break i}u=i<<1;r=t+(u<<3)|0;h[r>>3]=+h[j>>3]+ +h[r>>3];h[t+((u|1)<<3)>>3]=l}b=b+1|0}c[n>>2]=d;b=e;e=m}if((d|0)==56)Aa(95593,95244,1869,95561);else if((d|0)==58)Aa(95614,95244,1870,95561)}}break}case 4:{k=c[d>>2]|0;e=0;d=0;b=c[v>>2]|0;j:while(1){if((e|0)>=(c[a>>2]|0)){x=d;y=u;break b}m=e+1|0;n=v+(m<<2)|0;j=v+(e<<2)|0;while(1){f=c[n>>2]|0;if((b|0)>=(f|0))break;e=w+(b<<2)|0;f=c[e>>2]|0;g=c[u+(f<<2)>>2]|0;i=k+(b<<2)|0;if((g|0)<(c[j>>2]|0)){c[w+(d<<2)>>2]=f;c[k+(d<<2)>>2]=c[i>>2];c[u+(c[e>>2]<<2)>>2]=d;d=d+1|0}else{if((c[w+(g<<2)>>2]|0)!=(f|0))break j;t=k+(g<<2)|0;c[t>>2]=(c[t>>2]|0)+(c[i>>2]|0)}b=b+1|0}c[n>>2]=d;e=m;b=f}Aa(95536,95244,1929,95561);break}case 8:{e=0;d=0;b=c[v>>2]|0;k:while(1){if((e|0)>=(c[a>>2]|0)){x=d;y=u;break b}j=e+1|0;k=v+(j<<2)|0;i=v+(e<<2)|0;while(1){f=c[k>>2]|0;if((b|0)>=(f|0))break;e=w+(b<<2)|0;f=c[e>>2]|0;g=c[u+(f<<2)>>2]|0;if((g|0)>=(c[i>>2]|0)){if((c[w+(g<<2)>>2]|0)!=(f|0))break k}else{c[w+(d<<2)>>2]=f;c[u+(c[e>>2]<<2)>>2]=d;d=d+1|0}b=b+1|0}c[k>>2]=d;e=j;b=f}Aa(95536,95244,1948,95561);break}default:{a=0;break a}}while(0);c[a+8>>2]=x;l6(y)}while(0);return a|0}function Dw(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;if(!d)Ew(a,c,e,g,b,f);else Fw(a,c,e,g,b,f);return}function Ew(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0;if((c[a+32>>2]|0)!=1)Aa(95220,95244,1121,95784);if((c[a+16>>2]|0)!=1)Aa(95665,95244,1122,95784);p=c[a+28>>2]|0;q=c[a+20>>2]|0;r=c[a+24>>2]|0;s=c[a>>2]|0;n=c[a+4>>2]|0;a=c[d>>2]|0;i=(a|0)!=0;o=(g|0)!=0;if(!f){if(!i)a=IK(S(e<<3,s)|0)|0;g=0;a:while(1){if((g|0)>=(s|0))break;m=S(g,e)|0;i=0;while(1){if((i|0)>=(e|0))break;h[a+(i+m<<3)>>3]=0.0;i=i+1|0}k=g+1|0;l=c[q+(k<<2)>>2]|0;i=c[q+(g<<2)>>2]|0;while(1){if((i|0)>=(l|0)){g=k;continue a}f=p+(i<<3)|0;j=r+(i<<2)|0;g=0;while(1){if((g|0)>=(e|0))break;t=+h[f>>3]*+h[b+((S(c[j>>2]|0,e)|0)+g<<3)>>3];n=a+(g+m<<3)|0;h[n>>3]=+h[n>>3]+t;g=g+1|0}i=i+1|0}}if(o)Hw(a,s,e)}else{if(!i)a=IK(S(e<<3,n)|0)|0;g=S(n,e)|0;i=0;while(1){if((i|0)>=(g|0)){i=0;break}h[a+(i<<3)>>3]=0.0;i=i+1|0}b:while(1){if((i|0)>=(s|0))break;k=i+1|0;l=c[q+(k<<2)>>2]|0;m=S(i,e)|0;i=c[q+(i<<2)>>2]|0;while(1){if((i|0)>=(l|0)){i=k;continue b}f=p+(i<<3)|0;j=r+(i<<2)|0;g=0;while(1){if((g|0)>=(e|0))break;u=a+((S(c[j>>2]|0,e)|0)+g<<3)|0;h[u>>3]=+h[f>>3]*+h[b+(g+m<<3)>>3]+ +h[u>>3];g=g+1|0}i=i+1|0}}if(o)Hw(a,n,e)}c[d>>2]=a;return}function Fw(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o;if((c[a+32>>2]|0)!=1)Aa(95220,95244,1163,95636);if((c[a+16>>2]|0)!=1)Aa(95665,95244,1164,95636);h=c[d>>2]|0;k=c[a>>2]|0;m=c[a+4>>2]|0;i=(h|0)!=0;j=(g|0)!=0;if(!f){if(!i)h=IK(S(e<<3,k)|0)|0;g=0;while(1){if((g|0)>=(e|0))break;c[n>>2]=h+((S(g,k)|0)<<3);Gw(a,b+((S(g,m)|0)<<3)|0,n,0);g=g+1|0}if(!j)Hw(h,e,k)}else{if(!i)h=IK(S(e<<3,m)|0)|0;g=0;while(1){if((g|0)>=(e|0))break;c[n>>2]=h+((S(g,m)|0)<<3);Gw(a,b+((S(g,k)|0)<<3)|0,n,f);g=g+1|0}if(!j)Hw(h,e,m)}c[d>>2]=h;l=o;return}function Gw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;if((c[a+32>>2]|0)!=1)Aa(95220,95244,1222,95693);n=c[a+16>>2]|0;switch(n|0){case 4:case 1:break;default:Aa(95722,95244,1223,95693)}r=c[a+20>>2]|0;p=c[a+24>>2]|0;s=c[a>>2]|0;o=c[a+4>>2]|0;i=c[d>>2]|0;l=s<<3;m=(i|0)!=0;e=(e|0)!=0;j=(b|0)!=0;k=o<<3;q=c[a+28>>2]|0;a:do switch(n|0){case 1:if(j){if(!e){if(m)g=i;else g=IK(l)|0;e=0;b:while(1){if((e|0)>=(s|0))break a;a=g+(e<<3)|0;h[a>>3]=0.0;i=e+1|0;j=c[r+(i<<2)>>2]|0;e=c[r+(e<<2)>>2]|0;f=0.0;while(1){if((e|0)>=(j|0)){e=i;continue b}t=f+ +h[q+(e<<3)>>3]*+h[b+(c[p+(e<<2)>>2]<<3)>>3];h[a>>3]=t;e=e+1|0;f=t}}}if(m)g=i;else g=IK(k)|0;e=0;while(1){if((e|0)>=(o|0)){e=0;break}h[g+(e<<3)>>3]=0.0;e=e+1|0}c:while(1){if((e|0)>=(s|0))break a;a=e+1|0;i=c[r+(a<<2)>>2]|0;j=b+(e<<3)|0;e=c[r+(e<<2)>>2]|0;while(1){if((e|0)>=(i|0)){e=a;continue c}o=g+(c[p+(e<<2)>>2]<<3)|0;h[o>>3]=+h[q+(e<<3)>>3]*+h[j>>3]+ +h[o>>3];e=e+1|0}}}else{if(!e){if(m)g=i;else g=IK(l)|0;e=0;d:while(1){if((e|0)>=(s|0))break a;a=g+(e<<3)|0;h[a>>3]=0.0;i=e+1|0;j=c[r+(i<<2)>>2]|0;e=c[r+(e<<2)>>2]|0;f=0.0;while(1){if((e|0)>=(j|0)){e=i;continue d}t=+h[q+(e<<3)>>3]+f;h[a>>3]=t;e=e+1|0;f=t}}}if(!m)i=IK(k)|0;e=0;while(1){if((e|0)>=(o|0)){e=0;break}h[i+(e<<3)>>3]=0.0;e=e+1|0}e:while(1){if((e|0)>=(s|0)){g=i;break a}g=e+1|0;a=c[r+(g<<2)>>2]|0;e=c[r+(e<<2)>>2]|0;while(1){if((e|0)>=(a|0)){e=g;continue e}b=i+(c[p+(e<<2)>>2]<<3)|0;h[b>>3]=+h[q+(e<<3)>>3]+ +h[b>>3];e=e+1|0}}}case 4:if(j){if(!e){if(m)g=i;else g=IK(l)|0;e=0;f:while(1){if((e|0)>=(s|0))break a;a=g+(e<<3)|0;h[a>>3]=0.0;i=e+1|0;j=c[r+(i<<2)>>2]|0;e=c[r+(e<<2)>>2]|0;f=0.0;while(1){if((e|0)>=(j|0)){e=i;continue f}t=f+ +(c[q+(e<<2)>>2]|0)*+h[b+(c[p+(e<<2)>>2]<<3)>>3];h[a>>3]=t;e=e+1|0;f=t}}}if(m)g=i;else g=IK(k)|0;e=0;while(1){if((e|0)>=(o|0)){e=0;break}h[g+(e<<3)>>3]=0.0;e=e+1|0}g:while(1){if((e|0)>=(s|0))break a;a=e+1|0;i=c[r+(a<<2)>>2]|0;j=b+(e<<3)|0;e=c[r+(e<<2)>>2]|0;while(1){if((e|0)>=(i|0)){e=a;continue g}o=g+(c[p+(e<<2)>>2]<<3)|0;h[o>>3]=+(c[q+(e<<2)>>2]|0)*+h[j>>3]+ +h[o>>3];e=e+1|0}}}else{if(!e){if(m)g=i;else g=IK(l)|0;e=0;h:while(1){if((e|0)>=(s|0))break a;a=g+(e<<3)|0;h[a>>3]=0.0;i=e+1|0;j=c[r+(i<<2)>>2]|0;e=c[r+(e<<2)>>2]|0;f=0.0;while(1){if((e|0)>=(j|0)){e=i;continue h}t=f+ +(c[q+(e<<2)>>2]|0);h[a>>3]=t;e=e+1|0;f=t}}}if(!m)i=IK(k)|0;e=0;while(1){if((e|0)>=(o|0)){e=0;break}h[i+(e<<3)>>3]=0.0;e=e+1|0}i:while(1){if((e|0)>=(s|0)){g=i;break a}g=e+1|0;a=c[r+(g<<2)>>2]|0;e=c[r+(e<<2)>>2]|0;while(1){if((e|0)>=(a|0)){e=g;continue i}b=i+(c[p+(e<<2)>>2]<<3)|0;h[b>>3]=+(c[q+(e<<2)>>2]|0)+ +h[b>>3];e=e+1|0}}}default:Aa(138697,95244,1315,95693)}while(0);c[d>>2]=g;return}function Hw(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=S(b<<3,c)|0;f=IK(d)|0;B6(f|0,a|0,d|0)|0;d=0;while(1){if((d|0)>=(b|0))break;g=S(d,c)|0;e=0;while(1){if((e|0)>=(c|0))break;h[a+((S(e,b)|0)+d<<3)>>3]=+h[f+(e+g<<3)>>3];e=e+1|0}d=d+1|0}l6(f);return}function Iw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;z=c[a+20>>2]|0;A=c[a+24>>2]|0;B=c[b+20>>2]|0;C=c[b+24>>2]|0;y=c[a+32>>2]|0;if(!((y|0)==1?(y|0)==(c[b+32>>2]|0):0))Aa(95306,95244,1408,95813);y=c[a>>2]|0;if(((c[a+4>>2]|0)==(c[b>>2]|0)?(n=c[a+16>>2]|0,(n|0)==(c[b+16>>2]|0)):0)?(m=b+4|0,D=IK(c[m>>2]<<2)|0,(D|0)!=0):0){d=0;while(1){if((d|0)>=(c[m>>2]|0)){e=0;d=0;break}c[D+(d<<2)>>2]=-1;d=d+1|0}a:while(1){if((d|0)>=(y|0))break;j=d+1|0;k=z+(j<<2)|0;l=-2-d|0;i=c[z+(d<<2)>>2]|0;while(1){if((i|0)>=(c[k>>2]|0)){d=j;continue a}f=c[A+(i<<2)>>2]|0;g=B+(f+1<<2)|0;f=c[B+(f<<2)>>2]|0;while(1){if((f|0)>=(c[g>>2]|0))break;d=D+(c[C+(f<<2)>>2]<<2)|0;if((c[d>>2]|0)!=(l|0)){c[d>>2]=l;e=e+1|0}f=f+1|0}i=i+1|0}}d=ow(y,c[m>>2]|0,e,n,1)|0;b:do if(!d)d=0;else{v=c[d+20>>2]|0;w=c[d+24>>2]|0;f=b+28|0;g=d+28|0;e=a+28|0;c:do switch(n|0){case 1:{s=c[e>>2]|0;r=c[f>>2]|0;n=c[g>>2]|0;c[v>>2]=0;e=0;f=0;d:while(1){if((e|0)>=(y|0)){x=f;break c}o=e+1|0;p=z+(o<<2)|0;q=v+(e<<2)|0;a=c[z+(e<<2)>>2]|0;while(1){if((a|0)>=(c[p>>2]|0))break;l=c[A+(a<<2)>>2]|0;m=B+(l+1<<2)|0;b=s+(a<<3)|0;l=c[B+(l<<2)>>2]|0;while(1){if((l|0)>=(c[m>>2]|0))break;e=C+(l<<2)|0;g=c[e>>2]|0;i=D+(g<<2)|0;j=c[i>>2]|0;k=r+(l<<3)|0;if((j|0)<(c[q>>2]|0)){c[i>>2]=f;c[w+(f<<2)>>2]=c[e>>2];h[n+(f<<3)>>3]=+h[b>>3]*+h[k>>3];f=f+1|0}else{if((c[w+(j<<2)>>2]|0)!=(g|0))break d;u=n+(j<<3)|0;h[u>>3]=+h[u>>3]+ +h[b>>3]*+h[k>>3]}l=l+1|0}a=a+1|0}c[v+(o<<2)>>2]=f;e=o}Aa(95835,95244,1468,95813);break}case 2:{u=c[e>>2]|0;t=c[f>>2]|0;p=c[g>>2]|0;c[v>>2]=0;e=0;f=0;e:while(1){if((e|0)>=(y|0)){x=f;break c}q=e+1|0;r=z+(q<<2)|0;s=v+(e<<2)|0;o=c[z+(e<<2)>>2]|0;while(1){if((o|0)>=(c[r>>2]|0))break;m=c[A+(o<<2)>>2]|0;b=B+(m+1<<2)|0;n=o<<1;a=u+(n<<3)|0;n=u+((n|1)<<3)|0;m=c[B+(m<<2)>>2]|0;while(1){if((m|0)>=(c[b>>2]|0))break;e=C+(m<<2)|0;g=c[e>>2]|0;i=D+(g<<2)|0;j=c[i>>2]|0;l=m<<1;k=t+(l<<3)|0;l=t+((l|1)<<3)|0;if((j|0)<(c[s>>2]|0)){c[i>>2]=f;c[w+(f<<2)>>2]=c[e>>2];j=f<<1;h[p+(j<<3)>>3]=+h[a>>3]*+h[k>>3]-+h[n>>3]*+h[l>>3];h[p+((j|1)<<3)>>3]=+h[a>>3]*+h[l>>3]+ +h[n>>3]*+h[k>>3];f=f+1|0}else{if((c[w+(j<<2)>>2]|0)!=(g|0))break e;j=j<<1;i=p+(j<<3)|0;h[i>>3]=+h[i>>3]+(+h[a>>3]*+h[k>>3]-+h[n>>3]*+h[l>>3]);j=p+((j|1)<<3)|0;h[j>>3]=+h[a>>3]*+h[l>>3]+ +h[n>>3]*+h[k>>3]+ +h[j>>3]}m=m+1|0}o=o+1|0}c[v+(q<<2)>>2]=f;e=q}Aa(95835,95244,1497,95813);break}case 4:{s=c[e>>2]|0;r=c[f>>2]|0;n=c[g>>2]|0;c[v>>2]=0;e=0;f=0;f:while(1){if((f|0)>=(y|0)){x=e;break c}o=f+1|0;p=z+(o<<2)|0;q=v+(f<<2)|0;m=c[z+(f<<2)>>2]|0;while(1){if((m|0)>=(c[p>>2]|0))break;l=c[A+(m<<2)>>2]|0;b=B+(l+1<<2)|0;a=s+(m<<2)|0;l=c[B+(l<<2)>>2]|0;while(1){if((l|0)>=(c[b>>2]|0))break;f=C+(l<<2)|0;g=c[f>>2]|0;i=D+(g<<2)|0;j=c[i>>2]|0;k=r+(l<<2)|0;if((j|0)<(c[q>>2]|0)){c[i>>2]=e;c[w+(e<<2)>>2]=c[f>>2];c[n+(e<<2)>>2]=S(c[k>>2]|0,c[a>>2]|0)|0;e=e+1|0}else{if((c[w+(j<<2)>>2]|0)!=(g|0))break f;t=S(c[k>>2]|0,c[a>>2]|0)|0;u=n+(j<<2)|0;c[u>>2]=(c[u>>2]|0)+t}l=l+1|0}m=m+1|0}c[v+(o<<2)>>2]=e;f=o}Aa(95835,95244,1523,95813);break}case 8:{c[v>>2]=0;e=0;f=0;g:while(1){if((f|0)>=(y|0)){x=e;break c}b=f+1|0;a=z+(b<<2)|0;n=v+(f<<2)|0;l=c[z+(f<<2)>>2]|0;while(1){if((l|0)>=(c[a>>2]|0))break;k=c[A+(l<<2)>>2]|0;m=B+(k+1<<2)|0;k=c[B+(k<<2)>>2]|0;while(1){if((k|0)>=(c[m>>2]|0))break;f=C+(k<<2)|0;g=c[f>>2]|0;i=D+(g<<2)|0;j=c[i>>2]|0;if((j|0)>=(c[n>>2]|0)){if((c[w+(j<<2)>>2]|0)!=(g|0))break g}else{c[i>>2]=e;c[w+(e<<2)>>2]=c[f>>2];e=e+1|0}k=k+1|0}l=l+1|0}c[v+(b<<2)>>2]=e;f=b}Aa(95835,95244,1543,95813);break}default:{nw(d);d=0;break b}}while(0);c[d+8>>2]=x}while(0);l6(D)}else d=0;return d|0}function Jw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0;H=c[a+20>>2]|0;I=c[a+24>>2]|0;J=c[b+20>>2]|0;D=c[b+24>>2]|0;E=c[d+20>>2]|0;F=c[d+24>>2]|0;G=c[a+32>>2]|0;if(!((G|0)==1?(G|0)==(c[b+32>>2]|0):0))Aa(95306,95244,1574,95860);G=c[a>>2]|0;if(((((c[a+4>>2]|0)==(c[b>>2]|0)?(c[b+4>>2]|0)==(c[d>>2]|0):0)?(q=c[a+16>>2]|0,(q|0)==(c[b+16>>2]|0)):0)?(q|0)==(c[d+16>>2]|0):0)?(p=d+4|0,K=IK(c[p>>2]<<2)|0,(K|0)!=0):0){e=0;while(1){if((e|0)>=(c[p>>2]|0)){f=0;e=0;break}c[K+(e<<2)>>2]=-1;e=e+1|0}a:while(1){if((e|0)>=(G|0))break;m=e+1|0;n=H+(m<<2)|0;o=-2-e|0;l=c[H+(e<<2)>>2]|0;while(1){if((l|0)>=(c[n>>2]|0)){e=m;continue a}j=c[I+(l<<2)>>2]|0;k=J+(j+1<<2)|0;j=c[J+(j<<2)>>2]|0;while(1){if((j|0)>=(c[k>>2]|0))break;g=c[D+(j<<2)>>2]|0;i=E+(g+1<<2)|0;g=c[E+(g<<2)>>2]|0;while(1){if((g|0)>=(c[i>>2]|0))break;e=K+(c[F+(g<<2)>>2]<<2)|0;if((c[e>>2]|0)!=(o|0)){c[e>>2]=o;f=f+1|0}g=g+1|0}j=j+1|0}l=l+1|0}}e=ow(G,c[p>>2]|0,f,q,1)|0;b:do if(!e)e=0;else{A=c[e+20>>2]|0;B=c[e+24>>2]|0;g=b+28|0;f=a+28|0;j=e+28|0;i=d+28|0;c:do switch(q|0){case 1:{w=c[f>>2]|0;v=c[g>>2]|0;u=c[i>>2]|0;r=c[j>>2]|0;c[A>>2]=0;f=0;g=0;d:while(1){if((f|0)>=(G|0)){C=g;break c}s=f+1|0;t=H+(s<<2)|0;q=A+(f<<2)|0;d=c[H+(f<<2)>>2]|0;while(1){if((d|0)>=(c[t>>2]|0))break;p=c[I+(d<<2)>>2]|0;b=J+(p+1<<2)|0;a=w+(d<<3)|0;p=c[J+(p<<2)>>2]|0;while(1){if((p|0)>=(c[b>>2]|0))break;m=c[D+(p<<2)>>2]|0;n=E+(m+1<<2)|0;o=v+(p<<3)|0;m=c[E+(m<<2)>>2]|0;while(1){if((m|0)>=(c[n>>2]|0))break;f=F+(m<<2)|0;i=c[f>>2]|0;j=K+(i<<2)|0;k=c[j>>2]|0;l=u+(m<<3)|0;if((k|0)<(c[q>>2]|0)){c[j>>2]=g;c[B+(g<<2)>>2]=c[f>>2];h[r+(g<<3)>>3]=+h[a>>3]*+h[o>>3]*+h[l>>3];g=g+1|0}else{if((c[B+(k<<2)>>2]|0)!=(i|0))break d;z=r+(k<<3)|0;h[z>>3]=+h[z>>3]+ +h[a>>3]*+h[o>>3]*+h[l>>3]}m=m+1|0}p=p+1|0}d=d+1|0}c[A+(s<<2)>>2]=g;f=s}Aa(95883,95244,1642,95860);break}case 2:{z=c[f>>2]|0;y=c[g>>2]|0;x=c[i>>2]|0;t=c[j>>2]|0;c[A>>2]=0;f=0;g=0;e:while(1){if((g|0)>=(G|0)){C=f;break c}u=g+1|0;v=H+(u<<2)|0;w=A+(g<<2)|0;d=c[H+(g<<2)>>2]|0;while(1){if((d|0)>=(c[v>>2]|0))break;o=c[I+(d<<2)>>2]|0;q=J+(o+1<<2)|0;s=d<<1;r=z+(s<<3)|0;s=z+((s|1)<<3)|0;o=c[J+(o<<2)>>2]|0;while(1){if((o|0)>=(c[q>>2]|0))break;n=c[D+(o<<2)>>2]|0;p=E+(n+1<<2)|0;a=o<<1;b=y+(a<<3)|0;a=y+((a|1)<<3)|0;n=c[E+(n<<2)>>2]|0;while(1){if((n|0)>=(c[p>>2]|0))break;g=F+(n<<2)|0;i=c[g>>2]|0;j=K+(i<<2)|0;k=c[j>>2]|0;m=n<<1;l=x+(m<<3)|0;m=x+((m|1)<<3)|0;if((k|0)<(c[w>>2]|0)){c[j>>2]=f;c[B+(f<<2)>>2]=c[g>>2];M=+h[r>>3];N=+h[b>>3];L=+h[s>>3];O=+h[a>>3];k=f<<1;h[t+(k<<3)>>3]=+h[l>>3]*(M*N-L*O)-(N*L+M*O)*+h[m>>3];O=+h[r>>3];M=+h[a>>3];L=+h[s>>3];N=+h[b>>3];h[t+((k|1)<<3)>>3]=+h[l>>3]*(O*M+L*N)+(O*N-M*L)*+h[m>>3];f=f+1|0}else{if((c[B+(k<<2)>>2]|0)!=(i|0))break e;N=+h[r>>3];M=+h[b>>3];O=+h[s>>3];L=+h[a>>3];k=k<<1;j=t+(k<<3)|0;h[j>>3]=+h[j>>3]+(+h[l>>3]*(N*M-O*L)-(M*O+N*L)*+h[m>>3]);L=+h[r>>3];N=+h[a>>3];O=+h[s>>3];M=+h[b>>3];k=t+((k|1)<<3)|0;h[k>>3]=+h[l>>3]*(L*N+O*M)+(L*M-N*O)*+h[m>>3]+ +h[k>>3]}n=n+1|0}o=o+1|0}d=d+1|0}c[A+(u<<2)>>2]=f;g=u}Aa(95883,95244,1674,95860);break}case 4:{w=c[f>>2]|0;v=c[g>>2]|0;u=c[i>>2]|0;q=c[j>>2]|0;c[A>>2]=0;f=0;g=0;f:while(1){if((g|0)>=(G|0)){C=f;break c}r=g+1|0;s=H+(r<<2)|0;t=A+(g<<2)|0;b=c[H+(g<<2)>>2]|0;while(1){if((b|0)>=(c[s>>2]|0))break;n=c[I+(b<<2)>>2]|0;a=J+(n+1<<2)|0;d=w+(b<<2)|0;n=c[J+(n<<2)>>2]|0;while(1){if((n|0)>=(c[a>>2]|0))break;m=c[D+(n<<2)>>2]|0;o=E+(m+1<<2)|0;p=v+(n<<2)|0;m=c[E+(m<<2)>>2]|0;while(1){if((m|0)>=(c[o>>2]|0))break;g=F+(m<<2)|0;i=c[g>>2]|0;j=K+(i<<2)|0;k=c[j>>2]|0;l=u+(m<<2)|0;if((k|0)<(c[t>>2]|0)){c[j>>2]=f;c[B+(f<<2)>>2]=c[g>>2];y=S(c[p>>2]|0,c[d>>2]|0)|0;y=S(y,c[l>>2]|0)|0;z=q+(f<<2)|0;c[z>>2]=(c[z>>2]|0)+y;f=f+1|0}else{if((c[B+(k<<2)>>2]|0)!=(i|0))break f;y=S(c[p>>2]|0,c[d>>2]|0)|0;y=S(y,c[l>>2]|0)|0;z=q+(k<<2)|0;c[z>>2]=(c[z>>2]|0)+y}m=m+1|0}n=n+1|0}b=b+1|0}c[A+(r<<2)>>2]=f;g=r}Aa(95883,95244,1706,95860);break}case 8:{c[A>>2]=0;f=0;g=0;g:while(1){if((g|0)>=(G|0)){C=f;break c}b=g+1|0;a=H+(b<<2)|0;d=A+(g<<2)|0;o=c[H+(g<<2)>>2]|0;while(1){if((o|0)>=(c[a>>2]|0))break;m=c[I+(o<<2)>>2]|0;p=J+(m+1<<2)|0;m=c[J+(m<<2)>>2]|0;while(1){if((m|0)>=(c[p>>2]|0))break;l=c[D+(m<<2)>>2]|0;n=E+(l+1<<2)|0;l=c[E+(l<<2)>>2]|0;while(1){if((l|0)>=(c[n>>2]|0))break;g=F+(l<<2)|0;i=c[g>>2]|0;j=K+(i<<2)|0;k=c[j>>2]|0;if((k|0)>=(c[d>>2]|0)){if((c[B+(k<<2)>>2]|0)!=(i|0))break g}else{c[j>>2]=f;c[B+(f<<2)>>2]=c[g>>2];f=f+1|0}l=l+1|0}m=m+1|0}o=o+1|0}c[A+(b<<2)>>2]=f;g=b}Aa(95883,95244,1729,95860);break}default:{nw(e);e=0;break b}}while(0);c[e+8>>2]=C}while(0);l6(K)}else e=0;return e|0}function Kw(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;if((c[a+32>>2]|0)!=2)Aa(95401,95244,1971,95908);if((b|0)>=1){h=c[a+8>>2]|0;g=h+b|0;if((g|0)>=(c[a+12>>2]|0))Lw(a,g+10|0)|0;i=h<<2;g=b<<2;B6((c[a+20>>2]|0)+i|0,d|0,g|0)|0;B6((c[a+24>>2]|0)+i|0,e|0,g|0)|0;g=c[a+40>>2]|0;if(g|0){i=S(g,b)|0;h=S(g,h)|0;B6((c[a+28>>2]|0)+h|0,f|0,i|0)|0}f=a+4|0;h=0;while(1){if((h|0)>=(b|0))break;g=c[d+(h<<2)>>2]|0;if((g|0)>=(c[a>>2]|0))c[a>>2]=g+1;g=c[e+(h<<2)>>2]|0;if((g|0)>=(c[f>>2]|0))c[f>>2]=g+1;h=h+1|0}i=a+8|0;c[i>>2]=(c[i>>2]|0)+b}return a|0}function Lw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=b<<2;f=a+28|0;if((c[a+32>>2]|0)==2){e=a+20|0;c[e>>2]=KK(c[e>>2]|0,d)|0;e=a+24|0;c[e>>2]=KK(c[e>>2]|0,d)|0;d=c[a+40>>2]|0;if((d|0)>0){e=c[f>>2]|0;d=S(d,b)|0;if(!e)d=IK(d)|0;else d=KK(e,d)|0;c[f>>2]=d}}else{e=a+24|0;c[e>>2]=KK(c[e>>2]|0,d)|0;d=c[a+40>>2]|0;if((d|0)>0){e=c[f>>2]|0;d=S(d,b)|0;if(!e)d=IK(d)|0;else d=KK(e,d)|0;c[f>>2]=d}}c[a+12>>2]=b;return a|0}function Mw(a){a=a|0;var b=0,d=0.0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if(!a)a=0;else{l=c[a+20>>2]|0;k=c[a+24>>2]|0;b=a+28|0;b:do switch(c[a+16>>2]|0){case 1:{i=c[b>>2]|0;e=c[a>>2]|0;b=0;c:while(1){if((b|0)>=(e|0))break b;f=b+1|0;g=c[l+(f<<2)>>2]|0;b=c[l+(b<<2)>>2]|0;d=+(g-b|0);while(1){if((b|0)>=(g|0)){b=f;continue c}k=i+(b<<3)|0;h[k>>3]=+h[k>>3]/d;b=b+1|0}}}case 2:{f=c[b>>2]|0;g=c[a>>2]|0;b=0;d:while(1){if((b|0)>=(g|0))break b;i=b+1|0;j=c[l+(i<<2)>>2]|0;e=c[l+(b<<2)>>2]|0;d=+(j-e|0);while(1){if((e|0)>=(j|0)){b=i;continue d}if((c[k+(e<<2)>>2]|0)!=(b|0)){m=e<<1;n=f+(m<<3)|0;h[n>>3]=+h[n>>3]/d;m=f+((m|1)<<3)|0;h[m>>3]=+h[m>>3]/d}e=e+1|0}}}case 4:{Aa(138697,95244,2192,95949);break}case 8:break;default:{a=0;break a}}while(0)}while(0);return a|0}function Nw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if((a|0)!=0?(b=a+8|0,d=c[b>>2]|0,e=c[a+4>>2]|0,(e|0)==(c[a>>2]|0)):0){g=c[a+24>>2]|0;a=c[a+20>>2]|0;f=ow(e,e,d,8,1)|0;B6(c[f+20>>2]|0,a|0,(e<<2)+4|0)|0;B6(c[f+24>>2]|0,g|0,d<<2|0)|0;c[f+8>>2]=c[b>>2];a=sw(f,1)|0;nw(f);a=yw(a)|0;e=a+8|0;d=IK(c[e>>2]<<3)|0;c[a+28>>2]=d;e=c[e>>2]|0;b=0;while(1){if((b|0)>=(e|0))break;h[d+(b<<3)>>3]=1.0;b=b+1|0}c[a+16>>2]=1;c[a+40>>2]=8}else a=0;return a|0}function Ow(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;q=c[a+20>>2]|0;r=c[a+24>>2]|0;w=c[a+4>>2]|0;o=c[a>>2]|0;s=w<<2;t=IK(s)|0;u=IK(s+4|0)|0;v=IK(s)|0;s=IK(s)|0;p=u+4|0;a=0;while(1){if((a|0)>=(w|0))break;c[t+(a<<2)>>2]=0;a=a+1|0}c[p>>2]=w;a=0;while(1){if((a|0)>=(w|0)){h=1;l=0;break}c[v+(a<<2)>>2]=-1;a=a+1|0}a:while(1){if((l|0)>=(o|0))break;g=q+(l<<2)|0;m=l+1|0;n=q+(m<<2)|0;a=c[g>>2]|0;while(1){f=c[n>>2]|0;if((a|0)>=(f|0))break;k=p+(c[t+(c[r+(a<<2)>>2]<<2)>>2]<<2)|0;c[k>>2]=(c[k>>2]|0)+-1;a=a+1|0}a=h;k=c[g>>2]|0;while(1){if((k|0)>=(f|0)){h=a;l=m;continue a}j=r+(k<<2)|0;g=t+(c[j>>2]<<2)|0;i=c[g>>2]|0;h=v+(i<<2)|0;f=s+(i<<2)|0;if((c[h>>2]|0)<(l|0)){c[h>>2]=l;g=p+(i<<2)|0;if(!(c[g>>2]|0)){c[g>>2]=1;g=a;a=i}else{c[f>>2]=a;c[p+(a<<2)>>2]=1;g=a+1|0;f=t+(c[j>>2]<<2)|0}c[f>>2]=a;a=g}else{c[g>>2]=c[f>>2];j=p+(c[f>>2]<<2)|0;c[j>>2]=(c[j>>2]|0)+1}k=k+1|0;f=c[n>>2]|0}}c[u>>2]=0;a=0;f=0;while(1){if((a|0)>=(h|0))break;q=a+1|0;p=u+(q<<2)|0;r=(c[p>>2]|0)+f|0;c[p>>2]=r;a=q;f=r}c[d>>2]=s;a=0;while(1){if((a|0)>=(w|0)){a=h;break}r=u+(c[t+(a<<2)>>2]<<2)|0;d=c[r>>2]|0;c[r>>2]=d+1;c[s+(d<<2)>>2]=a;a=a+1|0}while(1){if((a|0)<=0)break;w=a+-1|0;c[u+(a<<2)>>2]=c[u+(w<<2)>>2];a=w}c[u>>2]=0;c[e>>2]=u;c[b>>2]=h;l6(v);l6(t);return}function Pw(){return +(+(U4()|0)/2147483647.0)}function Qw(a){a=a|0;if((a|0)>1)return (U4()|0)%(a|0)|0|0;else Aa(95983,95989,58,95999);return 0}function Rw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;a:do if((a|0)<1)b=0;else{b=IK(a<<2)|0;d=0;while(1){if((d|0)==(a|0))break;c[b+(d<<2)>>2]=d;d=d+1|0}while(1){if((a|0)<=1)break a;e=Qw(a)|0;d=a+-1|0;g=b+(d<<2)|0;f=c[g>>2]|0;e=b+(e<<2)|0;c[g>>2]=c[e>>2];c[e>>2]=f;a=d}}while(0);return b|0}function Sw(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=0;while(1){if((d|0)>=(a|0))break;e=c+(d<<3)|0;h[e>>3]=+h[b+(d<<3)>>3]-+h[e>>3];d=d+1|0}return c|0}function Tw(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0,f=0.0;d=0;e=0.0;while(1){if((d|0)>=(a|0))break;f=e+ +h[b+(d<<3)>>3]*+h[c+(d<<3)>>3];d=d+1|0;e=f}return +e}function Uw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0,f=0;e=0;while(1){if((e|0)>=(a|0))break;f=c+(e<<3)|0;h[f>>3]=+h[b+(e<<3)>>3]+ +h[f>>3]*d;e=e+1|0}return c|0}function Vw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0,f=0;e=0;while(1){if((e|0)>=(a|0))break;f=b+(e<<3)|0;h[f>>3]=+h[f>>3]+ +h[c+(e<<3)>>3]*d;e=e+1|0}return b|0}function Ww(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0,g=0.0;f=S(c,b)|0;d=S(d,b)|0;e=0.0;c=0;while(1){if((c|0)>=(b|0))break;g=+h[a+(c+f<<3)>>3]-+h[a+(c+d<<3)>>3];e=e+g*g;c=c+1|0}g=+G(+e);return +(g>1.0e-15?g:1.0e-15)}function Xw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0,g=0.0;f=S(c,b)|0;d=S(d,b)|0;e=0.0;c=0;while(1){if((c|0)>=(b|0))break;g=+h[a+(c+f<<3)>>3]-+h[a+(c+d<<3)>>3];e=e+g*g;c=c+1|0}return +(+G(+e))}function Yw(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0,f=0.0;d=0.0;e=0;while(1){if((e|0)>=(c|0))break;f=+h[a+(e<<3)>>3]-+h[b+(e<<3)>>3];d=d+f*f;e=e+1|0}return +(+G(+d))}function Zw(a,b,c,d,e,f,g){a=+a;b=+b;c=+c;d=+d;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0.0;p=l;l=l+80|0;n=p+48|0;m=p+24|0;o=p;i=0;while(1){if((i|0)>=(f|0)){j=0;break}q=+h[g+(i<<3)>>3];h[n+(i<<3)>>3]=q;h[m+(i<<3)>>3]=q;i=i+1|0}while(1){if((j|0)>=(e|0))break;k=S(j,f)|0;i=0;while(1){if((i|0)>=(f|0))break;s=+h[g+(i+k<<3)>>3];r=n+(i<<3)|0;q=+h[r>>3];h[r>>3]=s>3];h[r>>3]=s>q?s:q;i=i+1|0}j=j+1|0}q=+h[m>>3]-+h[n>>3];c=q!=0.0?(c-a)/q:1.0;q=+h[m+8>>3]-+h[n+8>>3];s=(d-b)/q;c=q!=0.0?(c>3]=a;h[o+8>>3]=b;h[o+16>>3]=0.0;j=0;while(1){if((j|0)>=(e|0))break;k=S(j,f)|0;i=0;while(1){if((i|0)>=(f|0))break;r=g+(i+k<<3)|0;h[r>>3]=+h[o+(i<<3)>>3]+c*(+h[r>>3]-+h[n+(i<<3)>>3]);i=i+1|0}j=j+1|0}l=p;return}function _w(a,b){a=a|0;b=b|0;if((qB(a)|0)==1){a=c[(c[(gC(a)|0)+16>>2]|0)+132>>2]|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0}else{$w(a);if(!((bP(NA(b,96005)|0)|0)<<24>>24))b=Jy(a,186376)|0;else b=ax(a)|0;Sy(a,b,186376);bx(b)}return}function $w(a){a=a|0;var b=0;b=uC(c[c[(c[(gC(a)|0)+16>>2]|0)+112>>2]>>2]|0)|0;a=c[46967]|0;if((b|0)!=(a|0)){c[46597]=0;c[46967]=b;c[46968]=DA(b,0,96014,0)|0;c[46969]=DA(c[46967]|0,1,96022,0)|0;c[46970]=DA(c[46967]|0,1,96039,0)|0;a=c[46967]|0}c[46971]=NA(a,96039)|0;Dy(186376);c[46596]=1;h[23301]=+YO(c[46967]|0,c[46968]|0,1.0,0.0);c[46598]=c[46969];c[46599]=c[46970];c[46600]=c[46971];return}function ax(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+144|0;e=f;d=f+8|0;b=c[46597]|0;c[46597]=b+1;c[e>>2]=b;i2(d,96535,e)|0;d=Ey(LD(a,d,1)|0)|0;e=d+8|0;b=gC(a)|0;while(1){if(!b)break;lC(c[e>>2]|0,b,1)|0;c[(c[(c[b+16>>2]|0)+112>>2]|0)+12>>2]=d;b=hC(a,b)|0}l=f;return d|0}function bx(a){a=a|0;Ry(a);return}function cx(a,b){a=a|0;b=b|0;var d=0;d=IK(32)|0;c[d>>2]=4;h[d+8>>3]=.75;c[d+16>>2]=1073741824;c[d+20>>2]=1;c[d+24>>2]=a;c[d+28>>2]=b;return d|0}function dx(a){a=a|0;l6(a);return}function ex(a){a=a|0;var b=0,d=0;if(!a)return;d=c[a+8>>2]|0;do if(d|0){if(c[a>>2]|0){nw(d);b=c[a+12>>2]|0;if(!b)break;nw(b);break}if(c[a+36>>2]|0?(nw(d),b=c[a+12>>2]|0,b|0):0)nw(b)}while(0);nw(c[a+16>>2]|0);nw(c[a+20>>2]|0);b=c[a+24>>2]|0;if(b|0?(c[a>>2]|0)>0:0)l6(b);ex(c[a+28>>2]|0);l6(a);return}function fx(a,b,d,e,f,g,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0;v=l;l=l+32|0;n=v+16|0;o=v+12|0;p=v+8|0;q=v+4|0;r=v;c[n>>2]=a;c[o>>2]=0;c[p>>2]=0;c[q>>2]=0;c[r>>2]=0;c[i>>2]=0;c[j>>2]=0;c[b>>2]=0;c[g>>2]=0;c[e>>2]=0;s=k+28|0;t=k+8|0;u=+(c[a+4>>2]|0);f=d;do{gx(a,n,f,o,0,r,p,q,k,m);f=c[n>>2]|0;if(!f)break;d=c[f+4>>2]|0;f=c[i>>2]|0;a=c[p>>2]|0;if(!f){c[i>>2]=a;c[j>>2]=c[q>>2]}else{a=Iw(f,a)|0;nw(c[i>>2]|0);nw(c[p>>2]|0);c[i>>2]=a;a=Iw(c[q>>2]|0,c[j>>2]|0)|0;nw(c[j>>2]|0);nw(c[q>>2]|0);c[j>>2]=a}f=c[b>>2]|0;if(f|0)nw(f);c[b>>2]=c[n>>2];f=c[e>>2]|0;if(f|0)nw(f);f=c[o>>2]|0;c[e>>2]=f;a=c[g>>2]|0;if(a){l6(a);f=c[o>>2]|0}c[g>>2]=c[r>>2];a=c[n>>2]|0;c[r>>2]=0;if(!(+(d|0)>u*+h[t>>3]))break}while((c[s>>2]|0)==1);l=v;return}function gx(a,b,d,e,f,g,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+32|0;E=I+28|0;p=I+24|0;C=I+20|0;F=I+16|0;s=I+12|0;G=I+8|0;H=I+4|0;n=I;c[E>>2]=0;c[p>>2]=0;c[F>>2]=0;c[G>>2]=0;c[H>>2]=0;c[b>>2]=0;c[e>>2]=0;c[i>>2]=0;c[j>>2]=0;D=c[a>>2]|0;o=k+24|0;c[m>>2]=c[o>>2];q=c[o>>2]|0;v=k+8|0;t=D<<2;x=k+28|0;r=k+20|0;w=+(D|0);a:do switch(q|0){case 12:{c[o>>2]=3;c[m>>2]=3;gx(a,b,d,e,f,g,i,j,k,m);if((((c[b>>2]|0)==0?(c[o>>2]=4,c[m>>2]=4,gx(a,b,d,e,f,g,i,j,k,m),(c[b>>2]|0)==0):0)?(c[o>>2]=6,c[m>>2]=6,gx(a,b,d,e,f,g,i,j,k,m),(c[b>>2]|0)==0):0)?(c[o>>2]=9,c[m>>2]=9,gx(a,b,d,e,f,g,i,j,k,m),(c[b>>2]|0)==0):0){c[o>>2]=2;c[m>>2]=2;gx(a,b,d,e,f,g,i,j,k,m)}c[o>>2]=12;p=0;q=0;r=0;o=0;n=0;m=0;break}case 3:case 6:case 4:{d=c[r>>2]|0;switch(q|0){case 3:{hx(a,d,G,H,n);break}case 4:{ix(a,d,G,H,n);break}default:jx(a,G,H,n)}u=c[n>>2]|0;if(!(c[x>>2]|0)){if((u|0)==(D|0)?1:+(u|0)>w*+h[v>>3]){p=0;q=0;r=0;o=0;n=0;m=0;break a}}else if((u|0)==(D|0)){p=0;q=0;r=0;o=0;n=0;m=0;break a}if((u|0)>=(c[k>>2]|0)){s=IK(t)|0;t=IK(t)|0;v=IK(D<<3)|0;c[C>>2]=0;o=c[H>>2]|0;p=c[G>>2]|0;n=0;d=0;b:while(1){if((n|0)>=(u|0))break;q=n+1|0;r=o+(q<<2)|0;m=c[o+(n<<2)>>2]|0;while(1){if((m|0)>=(c[r>>2]|0)){n=q;continue b}c[s+(d<<2)>>2]=c[p+(m<<2)>>2];c[t+(c[C>>2]<<2)>>2]=n;z=c[C>>2]|0;A=z+1|0;c[C>>2]=A;h[v+(z<<3)>>3]=1.0;m=m+1|0;d=A}}D=Aw(d,D,u,s,t,v,1,8)|0;c[i>>2]=D;c[j>>2]=mw(D)|0;c[e>>2]=0;i=Jw(c[j>>2]|0,a,c[i>>2]|0)|0;c[b>>2]=i;if(!i){p=v;q=t;r=s;o=s;n=t;m=v}else{Gw(c[j>>2]|0,f,g,0);c[j>>2]=Mw(c[j>>2]|0)|0;p=c[b>>2]|0;q=p+36|0;c[q>>2]=c[q>>2]|3;c[b>>2]=yw(p)|0;p=v;q=t;r=s;o=s;n=t;m=v}}else{p=0;q=0;r=0;o=0;n=0;m=0}break}case 1:{kx(a,c[r>>2]|0,E,p);d=c[o>>2]|0;if((d|0)==2)B=24;else B=25;break}case 2:{B=24;break}case 5:{B=26;break}case 10:case 9:{d=c[r>>2]|0;if((q|0)==9)nx(a,d,F,s,C);else ox(a,d,F,s,C);z=c[a+20>>2]|0;A=c[a+24>>2]|0;y=c[s>>2]|0;if(!(c[x>>2]|0)){if((y|0)==(D|0)?1:+(y|0)>w*+h[v>>3]){p=0;q=0;r=0;o=0;n=0;m=0;break a}}else if((y|0)==(D|0)){p=0;q=0;r=0;o=0;n=0;m=0;break a}if((y|0)>=(c[k>>2]|0)){x=c[C>>2]|0;v=x<<2;u=IK(v)|0;v=IK(v)|0;x=IK(x<<3)|0;c[C>>2]=0;s=c[F>>2]|0;r=0;o=0;c:while(1){if((r|0)>=(D|0))break;d=s+(r<<2)|0;t=r+1|0;if((c[d>>2]|0)!=-1){c[u+(o<<2)>>2]=r;c[v+(c[C>>2]<<2)>>2]=c[d>>2];q=c[C>>2]|0;k=q+1|0;c[C>>2]=k;h[x+(q<<3)>>3]=1.0;r=t;o=k;continue}n=c[z+(r<<2)>>2]|0;q=z+(t<<2)|0;p=c[q>>2]|0;d=0;m=n;while(1){if((m|0)>=(p|0))break;d=((c[s+(c[A+(m<<2)>>2]<<2)>>2]|0)>>>31^1)+d|0;m=m+1|0}w=1.0/+(d|0);d=p;while(1){if((n|0)>=(d|0)){r=t;continue c}m=A+(n<<2)|0;if((c[s+(c[m>>2]<<2)>>2]|0)>-1){c[u+(o<<2)>>2]=r;c[v+(c[C>>2]<<2)>>2]=c[s+(c[m>>2]<<2)>>2];d=c[C>>2]|0;m=d+1|0;c[C>>2]=m;h[x+(d<<3)>>3]=w;d=c[q>>2]|0}else m=o;n=n+1|0;o=m}}D=Aw(o,D,y,u,v,x,1,8)|0;c[i>>2]=D;D=mw(D)|0;c[j>>2]=D;i=Jw(D,a,c[i>>2]|0)|0;c[b>>2]=i;if(!i){p=x;q=v;r=u;o=u;n=v;m=x}else{Gw(c[j>>2]|0,f,g,0);p=c[b>>2]|0;q=p+36|0;c[q>>2]=c[q>>2]|3;c[b>>2]=yw(p)|0;c[e>>2]=0;p=x;q=v;r=u;o=u;n=v;m=x}}else{p=0;q=0;r=0;o=0;n=0;m=0}break}default:{p=0;q=0;r=0;o=0;n=0;m=0}}while(0);if((B|0)==24){lx(a,c[r>>2]|0,E,p);d=c[o>>2]|0;B=25}if((B|0)==25)if((d|0)==5)B=26;else B=27;if((B|0)==26){mx(a,c[r>>2]|0,E,p);B=27}do if((B|0)==27){d=c[p>>2]|0;if(!(c[x>>2]|0)){if((d|0)==(D|0)?1:+(d|0)>w*+h[v>>3]){p=0;q=0;r=0;o=0;n=0;m=0;break}}else if((d|0)==(D|0)){p=0;q=0;r=0;o=0;n=0;m=0;break}if((d|0)>=(c[k>>2]|0)){s=IK(t)|0;t=IK(t)|0;u=IK(D<<3)|0;c[C>>2]=0;q=c[E>>2]|0;d=0;p=0;while(1){if((p|0)>=(D|0))break;m=q+(p<<2)|0;n=c[m>>2]|0;if((n|0)>-1){c[s+(c[C>>2]<<2)>>2]=p;c[t+(c[C>>2]<<2)>>2]=d;B=c[C>>2]|0;o=B+1|0;c[C>>2]=o;h[u+(B<<3)>>3]=1.0;if((n|0)!=(p|0)){c[s+(o<<2)>>2]=c[m>>2];c[t+(c[C>>2]<<2)>>2]=d;B=c[C>>2]|0;c[C>>2]=B+1;h[u+(B<<3)>>3]=1.0;c[q+(c[m>>2]<<2)>>2]=-1}c[m>>2]=-1;d=d+1|0}p=p+1|0}D=Aw(c[C>>2]|0,D,d,s,t,u,1,8)|0;c[i>>2]=D;D=mw(D)|0;c[j>>2]=D;i=Jw(D,a,c[i>>2]|0)|0;c[b>>2]=i;if(!i){p=u;q=t;r=s;o=s;n=t;m=u}else{Gw(c[j>>2]|0,f,g,0);c[j>>2]=Mw(c[j>>2]|0)|0;p=c[b>>2]|0;q=p+36|0;c[q>>2]=c[q>>2]|3;c[b>>2]=yw(p)|0;c[e>>2]=0;p=u;q=t;r=s;o=s;n=t;m=u}}else{p=0;q=0;r=0;o=0;n=0;m=0}}while(0);d=c[E>>2]|0;if(d|0)l6(d);d=c[F>>2]|0;if(d|0)l6(d);if(r|0)l6(o);if(q|0)l6(n);if(p|0)l6(m);d=c[G>>2]|0;if(d|0)l6(d);d=c[H>>2]|0;if(d|0)l6(d);l=I;return}function hx(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;t=c[a+20>>2]|0;u=c[a+24>>2]|0;w=c[a>>2]|0;v=w<<2;c[d>>2]=IK(v)|0;c[e>>2]=IK(v+4|0)|0;v=IK(v)|0;g=0;while(1){if((g|0)>=(w|0))break;c[v+(g<<2)>>2]=g;g=g+1|0}c[f>>2]=0;r=c[e>>2]|0;c[r>>2]=0;s=c[a+28>>2]|0;a:do if(!b){g=0;a=0;b:while(1){while(1){if((a|0)>=(w|0)){b=0;j=0.0;a=0;break b}b=a;a=a+1|0;if((c[v+(b<<2)>>2]|0)==-1)continue;b=c[t+(b<<2)>>2]|0;if(((c[t+(a<<2)>>2]|0)-b|0)==1)break}l=c[u+(b<<2)>>2]|0;c[v+(l<<2)>>2]=-1;m=c[d>>2]|0;c[m+(g<<2)>>2]=l;n=t+(l+1<<2)|0;k=c[t+(l<<2)>>2]|0;g=g+1|0;while(1){if((k|0)>=(c[n>>2]|0))break;b=u+(k<<2)|0;i=c[b>>2]|0;if((l|0)!=(i|0)?((c[t+(i+1<<2)>>2]|0)-(c[t+(i<<2)>>2]|0)|0)==1:0){c[v+(i<<2)>>2]=-1;c[m+(g<<2)>>2]=c[b>>2];g=g+1|0}k=k+1|0}i=c[f>>2]|0;b=c[r+(i<<2)>>2]|0;i=i+1|0;c[f>>2]=i;i=r+(i<<2)|0;if((g-b|0)<5){c[i>>2]=g;continue}e=b+1|0;c[i>>2]=e;b=e;i=e;while(1){if(!((i|0)<(g|0)&(b|0)<(g|0)))continue b;e=i+3|0;e=(g|0)<(e|0)?g:e;q=(c[f>>2]|0)+1|0;c[f>>2]=q;c[r+(q<<2)>>2]=e;b=b+1|0;i=e}}c:while(1){while(1){while(1){if((a|0)>=(w|0)){a=0;break c}n=v+(a<<2)|0;q=a+1|0;if((c[n>>2]|0)==-1)a=q;else break}p=c[t+(q<<2)>>2]|0;l=1;m=c[t+(a<<2)>>2]|0;while(1){i=(l|0)!=0;if((m|0)>=(p|0))break;k=c[u+(m<<2)>>2]|0;if((a|0)!=(k|0)?(c[v+(k<<2)>>2]|0)!=-1:0){o=+h[s+(m<<3)>>3];if(!i?!(o>j):0)i=0;else{i=0;b=k;j=o}}else i=l;l=i;m=m+1|0}if(i)a=q;else break}c[v+(b<<2)>>2]=-1;c[n>>2]=-1;p=c[d>>2]|0;c[p+(g<<2)>>2]=a;e=g+2|0;c[p+(g+1<<2)>>2]=b;a=(c[f>>2]|0)+1|0;c[f>>2]=a;c[r+(a<<2)>>2]=e;a=q;g=e}while(1){if((a|0)>=(w|0))break a;if((c[v+(a<<2)>>2]|0)==(a|0)){u=g+1|0;c[(c[d>>2]|0)+(g<<2)>>2]=a;g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[r+(g<<2)>>2]=u;g=u}a=a+1|0}}else{r=Rw(w)|0;n=0;g=0;while(1){if((n|0)>=(w|0)){q=0;a=0;j=0.0;break}a=c[r+(n<<2)>>2]|0;d:do if((c[v+(a<<2)>>2]|0)!=-1?(p=c[t+(a<<2)>>2]|0,((c[t+(a+1<<2)>>2]|0)-p|0)==1):0){k=c[u+(p<<2)>>2]|0;c[v+(k<<2)>>2]=-1;l=c[d>>2]|0;c[l+(g<<2)>>2]=k;m=t+(k+1<<2)|0;i=c[t+(k<<2)>>2]|0;g=g+1|0;while(1){if((i|0)>=(c[m>>2]|0))break;a=u+(i<<2)|0;b=c[a>>2]|0;if((k|0)!=(b|0)?((c[t+(b+1<<2)>>2]|0)-(c[t+(b<<2)>>2]|0)|0)==1:0){c[v+(b<<2)>>2]=-1;c[l+(g<<2)>>2]=c[a>>2];g=g+1|0}i=i+1|0}i=c[e>>2]|0;q=c[f>>2]|0;a=c[i+(q<<2)>>2]|0;q=q+1|0;b=i+(q<<2)|0;c[f>>2]=q;if((g-a|0)<5){c[b>>2]=g;break}q=a+1|0;c[b>>2]=q;a=q;b=q;while(1){if(!((b|0)<(g|0)&(a|0)<(g|0)))break d;q=b+3|0;q=(g|0)<(q|0)?g:q;m=(c[f>>2]|0)+1|0;c[f>>2]=m;c[i+(m<<2)>>2]=q;a=a+1|0;b=q}}while(0);n=n+1|0}while(1){if((q|0)>=(w|0)){a=0;break}m=c[r+(q<<2)>>2]|0;n=v+(m<<2)|0;if((c[n>>2]|0)!=-1){p=c[t+(m+1<<2)>>2]|0;k=1;l=c[t+(m<<2)>>2]|0;while(1){b=(k|0)!=0;if((l|0)>=(p|0))break;i=c[u+(l<<2)>>2]|0;if((m|0)!=(i|0)?(c[v+(i<<2)>>2]|0)!=-1:0){o=+h[s+(l<<3)>>3];if(!b?!(o>j):0)b=0;else{b=0;a=i;j=o}}else b=k;k=b;l=l+1|0}if(!b){c[v+(a<<2)>>2]=-1;c[n>>2]=-1;n=c[d>>2]|0;c[n+(g<<2)>>2]=m;p=g+2|0;c[n+(g+1<<2)>>2]=a;n=c[e>>2]|0;g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[n+(g<<2)>>2]=p;g=p}}q=q+1|0}while(1){if((a|0)>=(w|0))break;if((c[v+(a<<2)>>2]|0)==(a|0)){u=g+1|0;c[(c[d>>2]|0)+(g<<2)>>2]=a;t=c[e>>2]|0;g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[t+(g<<2)>>2]=u;g=u}a=a+1|0}l6(r)}while(0);l6(v);return}function ix(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0.0,k=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;A=l;l=l+16|0;q=A+8|0;y=A+4|0;z=A;c[y>>2]=0;c[z>>2]=0;v=c[a+20>>2]|0;u=c[a+24>>2]|0;w=c[a>>2]|0;x=w<<2;c[d>>2]=IK(x)|0;c[e>>2]=IK(x+4|0)|0;x=IK(x)|0;g=0;while(1){if((g|0)>=(w|0))break;c[x+(g<<2)>>2]=g;g=g+1|0}Ow(a,q,y,z);c[f>>2]=0;s=c[e>>2]|0;c[s>>2]=0;t=c[a+28>>2]|0;g=0;a=0;a:while(1){k=c[q>>2]|0;m=c[z>>2]|0;do{if((a|0)>=(k|0))break a;n=a;a=a+1|0;p=m+(a<<2)|0;i=c[p>>2]|0;n=c[m+(n<<2)>>2]|0}while((i-n|0)<2);m=c[y>>2]|0;k=c[s+(c[f>>2]<<2)>>2]|0;while(1){if((n|0)>=(i|0))break;r=m+(n<<2)|0;c[x+(c[r>>2]<<2)>>2]=-1;i=g+1|0;c[(c[d>>2]|0)+(g<<2)>>2]=c[r>>2];if((i-k|0)>3){g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[s+(g<<2)>>2]=i;g=i}else g=k;k=g;n=n+1|0;g=i;i=c[p>>2]|0}if((g|0)<=(k|0))continue;r=(c[f>>2]|0)+1|0;c[f>>2]=r;c[s+(r<<2)>>2]=g}b:do if(!b){i=0;j=0.0;a=0;c:while(1){while(1){while(1){if((a|0)>=(w|0)){a=0;break c}b=x+(a<<2)|0;r=a+1|0;if((c[b>>2]|0)==-1)a=r;else break}q=c[v+(r<<2)>>2]|0;n=1;p=c[v+(a<<2)>>2]|0;while(1){k=(n|0)!=0;if((p|0)>=(q|0))break;m=c[u+(p<<2)>>2]|0;if((a|0)!=(m|0)?(c[x+(m<<2)>>2]|0)!=-1:0){o=+h[t+(p<<3)>>3];if(!k?!(o>j):0)k=0;else{k=0;i=m;j=o}}else k=n;n=k;p=p+1|0}if(k)a=r;else break}c[x+(i<<2)>>2]=-1;c[b>>2]=-1;q=c[d>>2]|0;c[q+(g<<2)>>2]=a;e=g+2|0;c[q+(g+1<<2)>>2]=i;a=(c[f>>2]|0)+1|0;c[f>>2]=a;c[s+(a<<2)>>2]=e;a=r;g=e}while(1){if((a|0)>=(w|0))break b;if((c[x+(a<<2)>>2]|0)==(a|0)){v=g+1|0;c[(c[d>>2]|0)+(g<<2)>>2]=a;g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[s+(g<<2)>>2]=v;g=v}a=a+1|0}}else{s=Rw(w)|0;r=0;a=0;j=0.0;while(1){if((r|0)>=(w|0)){a=0;break}p=c[s+(r<<2)>>2]|0;b=x+(p<<2)|0;if((c[b>>2]|0)!=-1){q=c[v+(p+1<<2)>>2]|0;m=1;n=c[v+(p<<2)>>2]|0;while(1){i=(m|0)!=0;if((n|0)>=(q|0))break;k=c[u+(n<<2)>>2]|0;if((p|0)!=(k|0)?(c[x+(k<<2)>>2]|0)!=-1:0){o=+h[t+(n<<3)>>3];if(!i?!(o>j):0)i=0;else{i=0;a=k;j=o}}else i=m;m=i;n=n+1|0}if(!i){c[x+(a<<2)>>2]=-1;c[b>>2]=-1;b=c[d>>2]|0;c[b+(g<<2)>>2]=p;q=g+2|0;c[b+(g+1<<2)>>2]=a;b=c[e>>2]|0;g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[b+(g<<2)>>2]=q;g=q}}r=r+1|0}while(1){if((a|0)>=(w|0))break;if((c[x+(a<<2)>>2]|0)==(a|0)){v=g+1|0;c[(c[d>>2]|0)+(g<<2)>>2]=a;u=c[e>>2]|0;g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[u+(g<<2)>>2]=v;g=v}a=a+1|0}l6(s)}while(0);l6(c[y>>2]|0);l6(c[z>>2]|0);l6(x);l=A;return}function jx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;r=c[a+20>>2]|0;s=c[a+24>>2]|0;v=c[a>>2]|0;u=v<<2;c[b>>2]=IK(u)|0;c[d>>2]=IK(u+4|0)|0;u=IK(u)|0;q=IK(v<<4)|0;f=0;while(1){if((f|0)>=(v|0))break;c[u+(f<<2)>>2]=f;f=f+1|0}c[e>>2]=0;c[c[d>>2]>>2]=0;o=c[a+28>>2]|0;t=Rw(v)|0;f=0;m=0;while(1){if((m|0)>=(v|0)){m=0;break}a=c[t+(m<<2)>>2]|0;a:do if((c[u+(a<<2)>>2]|0)!=-1?(n=c[r+(a<<2)>>2]|0,((c[r+(a+1<<2)>>2]|0)-n|0)==1):0){j=c[s+(n<<2)>>2]|0;c[u+(j<<2)>>2]=-1;k=c[b>>2]|0;c[k+(f<<2)>>2]=j;l=r+(j+1<<2)|0;i=c[r+(j<<2)>>2]|0;f=f+1|0;while(1){if((i|0)>=(c[l>>2]|0))break;a=s+(i<<2)|0;g=c[a>>2]|0;if((j|0)!=(g|0)?((c[r+(g+1<<2)>>2]|0)-(c[r+(g<<2)>>2]|0)|0)==1:0){c[u+(g<<2)>>2]=-1;c[k+(f<<2)>>2]=c[a>>2];f=f+1|0}i=i+1|0}i=c[d>>2]|0;l=c[e>>2]|0;a=c[i+(l<<2)>>2]|0;l=l+1|0;g=i+(l<<2)|0;c[e>>2]=l;if((f-a|0)<5){c[g>>2]=f;break}l=a+1|0;c[g>>2]=l;a=l;g=l;while(1){if(!((g|0)<(f|0)&(a|0)<(f|0)))break a;l=g+3|0;l=(f|0)<(l|0)?f:l;k=(c[e>>2]|0)+1|0;c[e>>2]=k;c[i+(k<<2)>>2]=l;a=a+1|0;g=l}}while(0);m=m+1|0}while(1){if((m|0)>=(v|0)){a=0;break}k=c[t+(m<<2)>>2]|0;l=u+(k<<2)|0;if((c[l>>2]|0)!=-1){j=c[r+(k+1<<2)>>2]|0;a=0;i=c[r+(k<<2)>>2]|0;while(1){if((i|0)>=(j|0))break;g=c[s+(i<<2)>>2]|0;if((k|0)!=(g|0)?(p=a<<1,(c[u+(g<<2)>>2]|0)!=-1):0){h[q+(p<<3)>>3]=+(g|0);h[q+((p|1)<<3)>>3]=+h[o+(i<<3)>>3];a=a+1|0}i=i+1|0}if((a|0)>0){k3(q,a,16,81);i=(a|0)<3?a:3;j=c[b>>2]|0;g=0;while(1){a=f+1|0;f=j+(f<<2)|0;if((g|0)>=(i|0))break;n=~~+h[q+(g<<1<<3)>>3];c[u+(n<<2)>>2]=-1;c[f>>2]=n;g=g+1|0;f=a}c[l>>2]=-1;c[f>>2]=k;n=c[d>>2]|0;f=(c[e>>2]|0)+1|0;c[e>>2]=f;c[n+(f<<2)>>2]=a;f=a}}m=m+1|0}while(1){if((a|0)>=(v|0))break;if((c[u+(a<<2)>>2]|0)==(a|0)){s=f+1|0;c[(c[b>>2]|0)+(f<<2)>>2]=a;r=c[d>>2]|0;f=(c[e>>2]|0)+1|0;c[e>>2]=f;c[r+(f<<2)>>2]=s;f=s}a=a+1|0}l6(t);l6(u);return}function kx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;p=c[a+20>>2]|0;q=c[a+24>>2]|0;r=c[a>>2]|0;f=c[a+4>>2]|0;k=IK(r<<2)|0;c[d>>2]=k;a=0;while(1){if((a|0)>=(r|0))break;c[k+(a<<2)>>2]=a;a=a+1|0}c[e>>2]=f;a:do if(!b){f=0;b:while(1){if((f|0)>=(r|0))break a;b=f+1|0;g=p+(b<<2)|0;h=k+(f<<2)|0;a=c[p+(f<<2)>>2]|0;while(1){if((a|0)>=(c[g>>2]|0)){f=b;continue b}i=q+(a<<2)|0;j=c[i>>2]|0;if(((f|0)!=(j|0)?(l=k+(j<<2)|0,(c[l>>2]|0)==(j|0)):0)?(c[h>>2]|0)==(f|0):0){c[l>>2]=f;c[h>>2]=c[i>>2];c[e>>2]=(c[e>>2]|0)+-1}a=a+1|0}}}else{b=Rw(r)|0;a=0;while(1){if((a|0)>=(r|0))break;g=c[b+(a<<2)>>2]|0;h=p+(g+1<<2)|0;f=c[p+(g<<2)>>2]|0;while(1){if((f|0)>=(c[h>>2]|0))break;i=q+(f<<2)|0;j=c[i>>2]|0;if(((g|0)!=(j|0)?(m=c[d>>2]|0,n=m+(j<<2)|0,(c[n>>2]|0)==(j|0)):0)?(o=m+(g<<2)|0,(c[o>>2]|0)==(g|0)):0){c[n>>2]=g;c[o>>2]=c[i>>2];c[e>>2]=(c[e>>2]|0)+-1}f=f+1|0}a=a+1|0}l6(b)}while(0);return}function lx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;s=c[a+20>>2]|0;t=c[a+24>>2]|0;u=c[a>>2]|0;g=c[a+4>>2]|0;p=IK(u<<2)|0;c[d>>2]=p;f=0;while(1){if((f|0)>=(u|0))break;c[p+(f<<2)>>2]=f;f=f+1|0}c[e>>2]=g;r=c[a+28>>2]|0;a:do if(!b){f=0;i=0.0;l=0;while(1){if((l|0)>=(u|0))break a;m=l+1|0;n=c[s+(m<<2)>>2]|0;o=p+(l<<2)|0;b=1;k=c[s+(l<<2)>>2]|0;while(1){a=(b|0)!=0;if((k|0)>=(n|0))break;g=c[t+(k<<2)>>2]|0;if(((l|0)!=(g|0)?(c[p+(g<<2)>>2]|0)==(g|0):0)?(c[o>>2]|0)==(l|0):0){j=+h[r+(k<<3)>>3];if(!a?!(j>i):0)a=0;else{a=0;f=g;i=j}}else a=b;b=a;k=k+1|0}if(a){l=m;continue}c[p+(f<<2)>>2]=l;c[p+(l<<2)>>2]=f;c[e>>2]=(c[e>>2]|0)+-1;l=m}}else{q=Rw(u)|0;p=0;f=0;i=0.0;while(1){if((p|0)>=(u|0))break;l=c[q+(p<<2)>>2]|0;m=c[d>>2]|0;n=m+(l<<2)|0;if((c[n>>2]|0)==(l|0)){o=c[s+(l+1<<2)>>2]|0;k=c[s+(l<<2)>>2]|0;b=1;while(1){a=(b|0)!=0;if((k|0)>=(o|0))break;g=c[t+(k<<2)>>2]|0;if((l|0)!=(g|0)?(c[m+(g<<2)>>2]|0)==(g|0):0){j=+h[r+(k<<3)>>3];if(!a?!(j>i):0)a=0;else{a=0;f=g;i=j}}else a=b;k=k+1|0;b=a}if(!a){c[m+(f<<2)>>2]=l;c[n>>2]=f;c[e>>2]=(c[e>>2]|0)+-1}}p=p+1|0}l6(q)}while(0);return}function mx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;t=c[a+20>>2]|0;u=c[a+24>>2]|0;v=c[a>>2]|0;g=c[a+4>>2]|0;q=IK(v<<2)|0;c[d>>2]=q;f=0;while(1){if((f|0)>=(v|0))break;c[q+(f<<2)>>2]=f;f=f+1|0}c[e>>2]=g;s=c[a+28>>2]|0;a:do if(!b){f=0;i=0.0;l=0;while(1){if((l|0)>=(v|0))break a;k=c[t+(l<<2)>>2]|0;m=l+1|0;n=c[t+(m<<2)>>2]|0;o=+(n-k|0);p=q+(l<<2)|0;b=1;while(1){a=(b|0)!=0;if((k|0)>=(n|0))break;g=c[u+(k<<2)>>2]|0;if(((l|0)!=(g|0)?(c[q+(g<<2)>>2]|0)==(g|0):0)?(c[p>>2]|0)==(l|0):0){j=+h[s+(k<<3)>>3]/o/+((c[t+(g+1<<2)>>2]|0)-(c[t+(g<<2)>>2]|0)|0);if(!a?!(j>i):0)a=0;else{a=0;f=g;i=j}}else a=b;b=a;k=k+1|0}if(a){l=m;continue}c[q+(f<<2)>>2]=l;c[q+(l<<2)>>2]=f;c[e>>2]=(c[e>>2]|0)+-1;l=m}}else{r=Rw(v)|0;q=0;f=0;i=0.0;while(1){if((q|0)>=(v|0))break;l=c[r+(q<<2)>>2]|0;m=c[d>>2]|0;n=m+(l<<2)|0;if((c[n>>2]|0)==(l|0)){k=c[t+(l<<2)>>2]|0;p=c[t+(l+1<<2)>>2]|0;o=+(p-k|0);b=1;while(1){a=(b|0)!=0;if((k|0)>=(p|0))break;g=c[u+(k<<2)>>2]|0;if((l|0)!=(g|0)?(c[m+(g<<2)>>2]|0)==(g|0):0){j=+h[s+(k<<3)>>3]/o/+((c[t+(g+1<<2)>>2]|0)-(c[t+(g<<2)>>2]|0)|0);if(!a?!(j>i):0)a=0;else{a=0;f=g;i=j}}else a=b;k=k+1|0;b=a}if(!a){c[m+(f<<2)>>2]=l;c[n>>2]=f;c[e>>2]=(c[e>>2]|0)+-1}}q=q+1|0}l6(r)}while(0);return}function nx(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;m=c[a+20>>2]|0;n=c[a+24>>2]|0;l=c[a>>2]|0;j=IK(l<<2)|0;c[d>>2]=j;a=0;while(1){if((a|0)>=(l|0))break;c[j+(a<<2)>>2]=-100;a=a+1|0}c[e>>2]=0;c[f>>2]=0;a:do if(!b){h=0;b:while(1){if((h|0)>=(l|0))break a;a=j+(h<<2)|0;i=h+1|0;if((c[a>>2]|0)!=-100){h=i;continue}b=c[e>>2]|0;c[e>>2]=b+1;c[a>>2]=b;b=m+(i<<2)|0;a=c[m+(h<<2)>>2]|0;while(1){if((a|0)>=(c[b>>2]|0)){h=i;continue b}g=c[n+(a<<2)>>2]|0;if((h|0)!=(g|0)){c[j+(g<<2)>>2]=-1;c[f>>2]=(c[f>>2]|0)+1}a=a+1|0}}}else{i=Rw(l)|0;h=0;while(1){if((h|0)>=(l|0))break;j=c[i+(h<<2)>>2]|0;k=c[d>>2]|0;a=k+(j<<2)|0;c:do if((c[a>>2]|0)==-100){b=c[e>>2]|0;c[e>>2]=b+1;c[a>>2]=b;b=m+(j+1<<2)|0;a=c[m+(j<<2)>>2]|0;while(1){if((a|0)>=(c[b>>2]|0))break c;g=c[n+(a<<2)>>2]|0;if((j|0)!=(g|0)){c[k+(g<<2)>>2]=-1;c[f>>2]=(c[f>>2]|0)+1}a=a+1|0}}while(0);h=h+1|0}l6(i)}while(0);c[f>>2]=(c[f>>2]|0)+(c[e>>2]|0);return}function ox(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;n=q+4|0;o=q;p=c[a+20>>2]|0;m=c[a+24>>2]|0;h=c[a>>2]|0;a=IK(h<<2)|0;c[d>>2]=a;g=0;while(1){c[n>>2]=g;if((g|0)>=(h|0))break;c[a+(g<<2)>>2]=-100;g=(c[n>>2]|0)+1|0}c[e>>2]=0;c[f>>2]=0;k=ux(h,(h<<1)+-2|0)|0;a:do if(!b){a=0;while(1){c[n>>2]=a;if((a|0)>=(h|0))break a;j=a+1|0;wx(k,a,(c[p+(j<<2)>>2]|0)-(c[p+(a<<2)>>2]|0)|0)|0;a=j}}else{g=Rw(h)|0;a=0;while(1){if((a|0)>=(h|0))break;j=c[g+(a<<2)>>2]|0;c[n>>2]=j;wx(k,j,(c[p+(j+1<<2)>>2]|0)-(c[p+(j<<2)>>2]|0)|0)|0;a=a+1|0}l6(g)}while(0);b:while(1){j=(xx(k,n,o)|0)==0;a=c[e>>2]|0;if(j)break;c[e>>2]=a+1;c[(c[d>>2]|0)+(c[n>>2]<<2)>>2]=a;a=c[n>>2]|0;j=c[p+(a<<2)>>2]|0;while(1){if((j|0)>=(c[p+(a+1<<2)>>2]|0))continue b;i=c[m+(j<<2)>>2]|0;if((a|0)!=(i|0)){c:do if((c[(c[d>>2]|0)+(i<<2)>>2]|0)==-100){zx(k,i)|0;c[(c[d>>2]|0)+(i<<2)>>2]=-1;g=p+(i+1<<2)|0;a=c[p+(i<<2)>>2]|0;while(1){if((a|0)>=(c[g>>2]|0))break c;b=m+(a<<2)|0;h=c[b>>2]|0;if((i|0)!=(h|0)?(c[(c[d>>2]|0)+(h<<2)>>2]|0)==-100:0){h=yx(k,h)|0;c[o>>2]=h;wx(k,c[b>>2]|0,h+1|0)|0}a=a+1|0}}while(0);c[f>>2]=(c[f>>2]|0)+1;a=c[n>>2]|0}j=j+1|0}}c[f>>2]=(c[f>>2]|0)+a;vx(k);l=q;return}function px(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a+8>>3];c=+h[b+8>>3];return (d>c?-1:d>2]|0)==1:0)f=a;else f=Nw(a)|0;do if(!b)b=0;else{if(tw(b,0)|0?(c[b+16>>2]|0)==1:0)break;b=xw(b,0)|0}while(0);d=rx(f,b,d)|0;b=sx(d,e)|0;if((f|0)!=(a|0))c[d+36>>2]=1;return b|0}function rx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if(!a)a=0;else{e=IK(44)|0;c[e>>2]=0;c[e+4>>2]=c[a+4>>2];c[e+8>>2]=a;c[e+12>>2]=b;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=d;c[e+28>>2]=0;c[e+32>>2]=0;c[e+36>>2]=0;a=e}return a|0}function sx(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+32|0;e=k+20|0;f=k+16|0;g=k+12|0;h=k+8|0;i=k+4|0;j=k;c[f>>2]=0;if((c[a>>2]|0)<((c[b+16>>2]|0)+-1|0)?(fx(c[a+8>>2]|0,i,c[a+12>>2]|0,j,0,f,g,h,b,e),d=c[i>>2]|0,d|0):0){i=c[j>>2]|0;j=rx(d,i,c[f>>2]|0)|0;c[a+28>>2]=j;c[j+40>>2]=c[e>>2];c[j>>2]=(c[a>>2]|0)+1;c[j+4>>2]=c[d>>2];c[j+8>>2]=d;c[j+12>>2]=i;c[j+16>>2]=c[g>>2];c[a+20>>2]=c[h>>2];c[j+32>>2]=a;sx(j,b)|0}l=k;return a|0}function tx(a){a=a|0;var b=0;while(1){b=c[a+28>>2]|0;if(!b)break;else a=b}return a|0}function ux(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=IK(28)|0;c[f>>2]=0;c[f+4>>2]=a;c[f+8>>2]=b;c[f+12>>2]=-1;e=f+16|0;c[e>>2]=IK((b<<2)+4|0)|0;d=0;while(1){if((d|0)>(b|0))break;c[(c[e>>2]|0)+(d<<2)>>2]=0;d=d+1|0}b=(a<<2)+4|0;e=f+20|0;c[e>>2]=IK(b)|0;d=0;while(1){if((d|0)>(a|0))break;c[(c[e>>2]|0)+(d<<2)>>2]=0;d=d+1|0}b=IK(b)|0;c[f+24>>2]=b;d=0;while(1){if((d|0)>(a|0))break;c[b+(d<<2)>>2]=-999;d=d+1|0}return f|0}function vx(a){a=a|0;var b=0,d=0,e=0,f=0;if(a|0){e=a+16|0;b=c[e>>2]|0;if(b|0){f=a+8|0;d=0;while(1){if((d|0)>(c[f>>2]|0))break;zy(c[b+(d<<2)>>2]|0,105);d=d+1|0;b=c[e>>2]|0}l6(b)}b=c[a+20>>2]|0;if(b|0)l6(b);l6(c[a+24>>2]|0);l6(a)}return}function wx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=a+8|0;l=a+20|0;i=a+24|0;m=a+16|0;if(!a)Aa(139256,96044,69,96060);while(1){if((c[h>>2]|0)<(d|0)){j=4;break}e=(c[l>>2]|0)+(b<<2)|0;f=c[e>>2]|0;g=c[a>>2]|0;k=(c[i>>2]|0)+(b<<2)|0;if(!f)break;n=c[k>>2]|0;c[e>>2]=0;c[a>>2]=g+-1;Cy(f,105,(c[m>>2]|0)+(n<<2)|0)}if((j|0)==4)Aa(96079,96044,70,96060);c[a>>2]=g+1;e=a+12|0;if((c[e>>2]|0)<(d|0))c[e>>2]=d;c[k>>2]=d;e=IK(4)|0;c[e>>2]=b;f=c[(c[m>>2]|0)+(d<<2)>>2]|0;if(!f)e=yy(e)|0;else e=Ay(f,e)|0;c[(c[l>>2]|0)+(b<<2)>>2]=e;c[(c[m>>2]|0)+(d<<2)>>2]=e;return a|0}function xx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((a|0)!=0?(c[a>>2]|0)>=1:0){f=a+12|0;e=c[f>>2]|0;c[d>>2]=e;c[a>>2]=(c[a>>2]|0)+-1;d=a+16|0;g=c[(c[d>>2]|0)+(e<<2)>>2]|0;c[b>>2]=c[(By(g)|0)>>2];Cy(g,105,(c[d>>2]|0)+(e<<2)|0);d=c[d>>2]|0;if(!(c[d+(e<<2)>>2]|0)){while(1){if((e|0)<=-1)break;if(c[d+(e<<2)>>2]|0)break;e=e+-1|0}c[f>>2]=e}e=c[b>>2]|0;c[(c[a+20>>2]|0)+(e<<2)>>2]=0;c[(c[a+24>>2]|0)+(e<<2)>>2]=-999;e=1}else e=0;return e|0}function yx(a,b){a=a|0;b=b|0;return c[(c[a+24>>2]|0)+(b<<2)>>2]|0}function zx(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if((a|0)!=0?(e=c[a>>2]|0,(e|0)>=1):0){h=a+24|0;d=c[(c[h>>2]|0)+(b<<2)>>2]|0;c[a>>2]=e+-1;f=a+20|0;e=a+16|0;Cy(c[(c[f>>2]|0)+(b<<2)>>2]|0,105,(c[e>>2]|0)+(d<<2)|0);a=a+12|0;if((d|0)==(c[a>>2]|0)?(g=c[e>>2]|0,(c[g+(d<<2)>>2]|0)==0):0){while(1){if((d|0)<=-1)break;if(c[g+(d<<2)>>2]|0)break;d=d+-1|0}c[a>>2]=d}c[(c[f>>2]|0)+(b<<2)>>2]=0;c[(c[h>>2]|0)+(b<<2)>>2]=-999;d=1}else d=0;return d|0}function Ax(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;if(!(tw(a,0)|0))Aa(96096,96132,260,96147);w=uw(a)|0;x=c[w+20>>2]|0;y=c[w+24>>2]|0;a=w+16|0;e=w+28|0;if((c[a>>2]|0)==1)v=c[e>>2]|0;else{l6(c[e>>2]|0);c[a>>2]=1;v=IK(c[w+8>>2]<<3)|0;c[e>>2]=v}r=IK(c[w>>2]<<2)|0;a=0;while(1){e=c[w>>2]|0;if((a|0)>=(e|0)){q=0;a=e;break}c[r+(a<<2)>>2]=-1;a=a+1|0}a:while(1){if((q|0)>=(a|0)){g=0.0;k=0.0;f=0;u=0;t=a;break}p=q+1|0;i=x+(p<<2)|0;m=x+(q<<2)|0;j=(c[i>>2]|0)-(c[m>>2]|0)|0;c[r+(q<<2)>>2]=q;e=c[m>>2]|0;while(1){o=c[i>>2]|0;if((e|0)>=(o|0))break;a=c[y+(e<<2)>>2]|0;if((q|0)!=(a|0))c[r+(a<<2)>>2]=q;e=e+1|0}n=+(j|0);e=c[m>>2]|0;while(1){if((e|0)>=(o|0))break;a=c[y+(e<<2)>>2]|0;if((q|0)!=(a|0)){i=c[x+(a+1<<2)>>2]|0;a=c[x+(a<<2)>>2]|0;l=n+ +(i-a|0);while(1){if((a|0)>=(i|0))break;l=(c[r+(c[y+(a<<2)>>2]<<2)>>2]|0)==(q|0)?l+-1.0:l;a=a+1|0}h[v+(e<<3)>>3]=l;if(!(l>0.0)){s=23;break a}}e=e+1|0}q=p;a=c[w>>2]|0}if((s|0)==23)Aa(96169,96132,290,96147);while(1){if((u|0)>=(t|0))break;i=u+1|0;j=x+(i<<2)|0;e=c[x+(u<<2)>>2]|0;while(1){if((e|0)>=(c[j>>2]|0))break;a=c[y+(e<<2)>>2]|0;if((u|0)==(a|0))a=f;else{k=k+ +Xw(d,b,u,a);g=g+ +h[v+(e<<3)>>3];a=f+1|0}f=a;e=e+1|0}u=i;t=c[w>>2]|0}n=+(f|0);g=k/n/(g/n);a=0;b:while(1){if((a|0)>=(t|0))break;i=a+1|0;j=c[x+(i<<2)>>2]|0;e=c[x+(a<<2)>>2]|0;while(1){if((e|0)>=(j|0)){a=i;continue b}f=v+(e<<3)|0;if((a|0)!=(c[y+(e<<2)>>2]|0))h[f>>3]=g*+h[f>>3];e=e+1|0}}return w|0}function Bx(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0.0;N=c[a>>2]|0;O=c[a+20>>2]|0;P=c[a+24>>2]|0;if(!(tw(a,0)|0))Aa(96096,96132,333,96177);Q=Ax(a,b,e)|0;R=IK(56)|0;S=R+32|0;h[S>>3]=1.0;c[R+20>>2]=0;c[R+24>>2]=0;h[R+40>>3]=.01;c[R+48>>2]=~~+G(+(+(c[a>>2]|0)));g=N<<3;K=IK(g)|0;c[R+12>>2]=K;a=0;while(1){if((a|0)>=(N|0))break;h[K+(a<<3)>>3]=d;a=a+1|0}L=IK(N<<2)|0;J=IK(g)|0;j=0;while(1){if((j|0)>=(N|0)){n=0;break}k=J+(j<<3)|0;h[k>>3]=0.0;l=j+1|0;m=O+(l<<2)|0;i=c[O+(j<<2)>>2]|0;a=0;d=0.0;while(1){if((i|0)>=(c[m>>2]|0))break;g=c[P+(i<<2)>>2]|0;if((j|0)!=(g|0)){d=+Xw(e,b,j,g);d=d+ +h[k>>3];h[k>>3]=d;a=a+1|0}i=i+1|0}if((a|0)<=0){o=14;break}h[k>>3]=d/+(a|0);j=l}if((o|0)==14)Aa(96209,96132,358,96177);while(1){if((n|0)>=(N|0)){a=0;l=0;break}c[L+(n<<2)>>2]=-1;n=n+1|0}a:while(1){if((l|0)>=(N|0))break;c[L+(l<<2)>>2]=l;j=O+(l<<2)|0;m=l+1|0;n=O+(m<<2)|0;i=c[j>>2]|0;while(1){g=c[n>>2]|0;if((i|0)>=(g|0))break;g=L+(c[P+(i<<2)>>2]<<2)|0;if((c[g>>2]|0)!=(l|0)){c[g>>2]=l;a=a+1|0}i=i+1|0}k=c[j>>2]|0;while(1){if((k|0)>=(g|0)){l=m;continue a}i=c[P+(k<<2)>>2]|0;j=O+(i+1<<2)|0;i=c[O+(i<<2)>>2]|0;while(1){if((i|0)>=(c[j>>2]|0))break;g=L+(c[P+(i<<2)>>2]<<2)|0;if((c[g>>2]|0)!=(l|0)){c[g>>2]=l;a=a+1|0}i=i+1|0}k=k+1|0;g=c[n>>2]|0}}g=a+N|0;F=R+4|0;c[F>>2]=ow(N,N,g,1,1)|0;g=ow(N,N,g,1,1)|0;I=R+8|0;c[I>>2]=g;a=c[F>>2]|0;do if(!((g|0)==0|(a|0)==0)){D=c[a+20>>2]|0;C=c[a+24>>2]|0;A=c[a+28>>2]|0;E=c[g+28>>2]|0;B=c[g+20>>2]|0;x=c[g+24>>2]|0;c[B>>2]=0;c[D>>2]=0;y=(f|0)==0;z=(f|0)==2;f=(f|0)==1;d=0.0;p=0.0;o=0;i=0;b:while(1){if((o|0)>=(N|0)){o=62;break}t=o+N|0;c[L+(o<<2)>>2]=t;k=O+(o<<2)|0;u=o+1|0;v=O+(u<<2)|0;w=J+(o<<3)|0;q=0.0;r=0.0;j=c[k>>2]|0;while(1){a=c[v>>2]|0;if((j|0)>=(a|0))break;g=c[P+(j<<2)>>2]|0;a=L+(g<<2)|0;if((c[a>>2]|0)!=(t|0)){c[a>>2]=t;c[C+(i<<2)>>2]=g;do if(y)s=1.0;else{if(f){s=(+h[w>>3]+ +h[J+(g<<3)>>3])*.5;break}if(!z){o=44;break b}s=+H(+(+Ww(e,b,o,g)),.4)}while(0);U=-1.0/(s*s);h[A+(i<<3)>>3]=U;c[x+(i<<2)>>2]=g;T=s*U;n=E+(i<<3)|0;h[n>>3]=T;p=p+T*+Xw(e,b,o,g);T=+h[n>>3];i=i+1|0;q=q+U;r=r+T;d=d+s*T}j=j+1|0}n=c[k>>2]|0;while(1){if((n|0)>=(a|0))break;k=c[P+(n<<2)>>2]|0;l=O+(k+1<<2)|0;m=J+(k<<3)|0;j=c[O+(k<<2)>>2]|0;while(1){if((j|0)>=(c[l>>2]|0))break;g=P+(j<<2)|0;a=L+(c[g>>2]<<2)|0;if((c[a>>2]|0)!=(t|0)){c[a>>2]=t;do if(y)s=2.0;else{if(f){s=(+h[w>>3]+ +h[m>>3]*2.0+ +h[J+(c[g>>2]<<3)>>3])*.5;break}if(!z){o=57;break b}s=+H(+(+Ww(e,b,o,c[g>>2]|0)),.4)}while(0);c[C+(i<<2)>>2]=c[g>>2];T=-1.0/(s*s);h[A+(i<<3)>>3]=T;c[x+(i<<2)>>2]=c[g>>2];U=s*T;a=E+(i<<3)|0;h[a>>3]=U;p=p+U*+Xw(e,b,c[g>>2]|0,k);U=+h[a>>3];i=i+1|0;q=q+T;r=r+U;d=d+s*U}j=j+1|0}n=n+1|0;a=c[v>>2]|0}c[C+(i<<2)>>2]=o;w=K+(o<<3)|0;U=-(q*+h[w>>3]);h[w>>3]=U;h[A+(i<<3)>>3]=U-q;c[x+(i<<2)>>2]=o;h[E+(i<<3)>>3]=-r;i=i+1|0;c[D+(u<<2)>>2]=i;c[B+(u<<2)>>2]=i;o=u}if((o|0)==44){_3(96216,29,1,c[15715]|0)|0;Aa(138697,96132,418,96177)}else if((o|0)==57){_3(96216,29,1,c[15715]|0)|0;Aa(138697,96132,460,96177)}else if((o|0)==62){d=p/d;a=0;while(1){if((a|0)>=(i|0))break;P=E+(a<<3)|0;h[P>>3]=d*+h[P>>3];a=a+1|0}h[S>>3]=d;c[(c[F>>2]|0)+8>>2]=i;c[(c[I>>2]|0)+8>>2]=i;l6(L);l6(J);nw(Q);M=R;break}}else{Cx(R);M=0}while(0);return M|0}function Cx(a){a=a|0;var b=0;if(a|0){b=c[a+4>>2]|0;if(b|0)nw(b);b=c[a+8>>2]|0;if(b|0)nw(b);b=c[a+12>>2]|0;if(b|0)l6(b);b=c[a+20>>2]|0;if(b|0)db[c[a+16>>2]&127](b);l6(a)}return}function Dx(a,b,d,e,f,g){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0;O=c[a>>2]|0;if(tw(a,0)|0?(c[a+16>>2]|0)==1:0){k=S(O,b)|0;j=0.0;i=0;while(1){if((i|0)>=(k|0))break;u=+h[e+(i<<3)>>3];j=j+u*u;i=i+1|0}a:do if(j==0.0){i=0;while(1){if((i|0)>=(k|0))break a;h[e+(i<<3)>>3]=+Pw()*72.0;i=i+1|0}}while(0);J=c[a+20>>2]|0;K=c[a+24>>2]|0;L=c[a+28>>2]|0;i=IK(56)|0;N=i+32|0;h[N>>3]=1.0;c[i+20>>2]=0;c[i+24>>2]=0;c[i>>2]=a;h[i+40>>3]=.01;c[i+48>>2]=~~+G(+(+(c[a>>2]|0)));M=IK(O<<3)|0;c[i+12>>2]=M;k=0;while(1){if((k|0)>=(O|0))break;h[M+(k<<3)>>3]=d;k=k+1|0}a=(c[a+8>>2]|0)+O|0;H=i+4|0;c[H>>2]=ow(O,O,a,1,1)|0;a=ow(O,O,a,1,1)|0;I=i+8|0;c[I>>2]=a;k=c[H>>2]|0;if(!((a|0)==0|(k|0)==0)){B=c[k+20>>2]|0;C=c[k+24>>2]|0;D=c[a+20>>2]|0;E=c[a+24>>2]|0;z=c[k+28>>2]|0;F=c[a+28>>2]|0;c[D>>2]=0;c[B>>2]=0;t=0.0;u=0.0;A=0;w=0;b:while(1){if((w|0)>=(O|0))break;x=w+1|0;y=J+(x<<2)|0;l=0.0;m=0.0;v=c[J+(w<<2)>>2]|0;j=t;d=u;k=A;while(1){o=z+(k<<3)|0;a=C+(k<<2)|0;p=F+(k<<3)|0;q=E+(k<<2)|0;if((v|0)>=(c[y>>2]|0))break;r=c[K+(v<<2)>>2]|0;if((r|0)!=(w|0)){c[a>>2]=r;s=+h[L+(v<<3)>>3];n=s*s;a=n==0.0;switch(f|0){case 2:{n=a?-1.0e5:-1.0/n;break}case 1:{n=a?-1.0e5:-1.0/s;break}case 0:{n=-1.0;break}default:{P=23;break b}}h[o>>3]=n;c[q>>2]=r;Q=s*n;h[p>>3]=Q;d=d+Q*+Xw(e,b,w,r);Q=+h[p>>3];l=l+n;m=m+Q;j=j+s*Q;k=k+1|0}v=v+1|0}c[a>>2]=w;A=M+(w<<3)|0;t=-(l*+h[A>>3]);h[A>>3]=t;h[o>>3]=t-l;c[q>>2]=w;h[p>>3]=-m;A=k+1|0;c[B+(x<<2)>>2]=A;c[D+(x<<2)>>2]=A;t=j;u=d;w=x}if((P|0)==23)Aa(138697,96132,591,96313);j=(g|0)==0?1.0:u/t;if(j==0.0)i=0;else{k=0;while(1){if((k|0)>=(A|0))break;P=F+(k<<3)|0;h[P>>3]=j*+h[P>>3];k=k+1|0}h[N>>3]=j;c[(c[H>>2]|0)+8>>2]=A;c[(c[I>>2]|0)+8>>2]=A}}else{Cx(i);i=0}return i|0}Aa(96246,96132,525,96313);return 0}function Ex(a){a=a|0;Cx(a);return}function Fx(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;return +(+Gx(a,b,c,d,e))}function Gx(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var g=0,i=0,j=0.0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0;U=l;l=l+16|0;Q=U+12|0;T=U+8|0;n=U+4|0;k=U;m=c[a+4>>2]|0;i=c[a+8>>2]|0;c[Q>>2]=0;c[T>>2]=0;c[n>>2]=0;L=c[a+12>>2]|0;c[k>>2]=0;M=uw(i)|0;N=c[m>>2]|0;O=S(N,b)|0;g=O<<3;R=IK(g)|0;if((R|0)!=0?(P=S(b<<3,N)|0,B6(R|0,d|0,P|0)|0,K=IK(g)|0,c[T>>2]=K,(K|0)!=0):0){J=c[i+20>>2]|0;K=c[i+24>>2]|0;E=c[i+28>>2]|0;F=c[M+28>>2]|0;H=c[m+28>>2]|0;I=a+24|0;g=a+20|0;switch(c[I>>2]|0){case 1:{Hx(c[g>>2]|0,N,b,d,k,n);g=c[k>>2]|0;if(!g){B=0.0;C=0.0;g=0}else{m=vw(m,g)|0;B=0.0;C=0.0}break}case 2:{g=c[g>>2]|0;B=+h[g+8>>3];C=+h[g>>3];g=0;break}default:{B=0.0;C=0.0;g=0}}z=(L|0)==0;A=a+48|0;y=a+40|0;i=c[n>>2]|0;j=1.0;k=0;a:while(1){x=k+1|0;if(!((k|0)<(e|0)&j>f))break;b:do if((c[I>>2]|0)==4){n=c[T>>2]|0;k=0;while(1){if((k|0)>=(N|0))break b;o=S(k,b)|0;a=0;while(1){if((a|0)>=(b|0))break;h[n+(a+o<<3)>>3]=0.0;a=a+1|0}k=k+1|0}}else{t=0;while(1){if((t|0)>=(N|0))break;v=t+1|0;w=J+(v<<2)|0;p=0.0;u=c[J+(t<<2)>>2]|0;k=-1;while(1){if((u|0)>=(c[w>>2]|0))break;n=K+(u<<2)|0;a=c[n>>2]|0;if((t|0)==(a|0))k=u;else{s=+Xw(d,b,t,a);o=E+(u<<3)|0;r=+h[o>>3];q=F+(u<<3)|0;if(r==0.0)r=0.0;else{if(s==0.0){r=r/+h[H+(u<<3)>>3];a=0;while(1){if((a|0)>=(b|0))break;s=r*((+Pw()+.0001)*.0001);V=d+((S(c[n>>2]|0,b)|0)+a<<3)|0;h[V>>3]=+h[V>>3]+s;a=a+1|0}s=+Xw(d,b,t,c[n>>2]|0);r=+h[o>>3]}r=r/s}h[q>>3]=r;p=p+r}u=u+1|0}if((k|0)<=-1){D=25;break a}h[F+(k<<3)>>3]=-p;t=v}Dw(M,0,d,0,T,0,b)}while(0);c:do if(!z){n=c[T>>2]|0;k=0;while(1){if((k|0)>=(N|0))break c;o=L+(k<<3)|0;q=S(k,b)|0;a=0;while(1){if((a|0)>=(b|0))break;w=a+q|0;V=n+(w<<3)|0;h[V>>3]=+h[o>>3]*+h[R+(w<<3)>>3]+ +h[V>>3];a=a+1|0}k=k+1|0}}while(0);switch(c[I>>2]|0){case 1:{n=c[T>>2]|0;k=0;while(1){if((k|0)>=(N|0))break;o=S(k,b)|0;a=0;while(1){if((a|0)>=(b|0))break;D=a+o|0;V=n+(D<<3)|0;h[V>>3]=+h[i+(D<<3)>>3]+ +h[V>>3];a=a+1|0}k=k+1|0}k=n;p=+h[y>>3];a=c[A>>2]|0;D=51;break}case 2:{Ix(N,b,d,c[T>>2]|0,C,B);k=c[T>>2]|0;p=+h[y>>3];a=c[A>>2]|0;if((c[I>>2]|0)==2)Jx(m,C,b,d,k,p,a,Q);else D=51;break}default:{k=c[T>>2]|0;p=+h[y>>3];a=c[A>>2]|0;D=51}}if((D|0)==51){D=0;+cy(m,b,d,k,p,a,0,Q)}if(c[Q>>2]|0)break;j=+Kx(N,b,d,c[T>>2]|0);j=j/+G(+(+Tw(O,d,d)));B6(d|0,c[T>>2]|0,P|0)|0;k=x}if((D|0)==25)Aa(96350,96132,895,96361);nw(M);if(g){nw(g);nw(m)}}else{nw(M);j=1.0;i=0}l6(R);g=c[T>>2]|0;if(g|0)l6(g);if(i|0)l6(i);l=U;return +j}function Hx(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0,C=0.0;q=c[a+8>>2]|0;B=c[a+12>>2]|0;y=c[a+16>>2]|0;A=c[a+32>>2]|0;z=c[A+20>>2]|0;A=c[A+24>>2]|0;m=a+20|0;s=c[m>>2]|0;n=a+24|0;r=c[n>>2]|0;o=a+28|0;p=c[o>>2]|0;x=+h[a>>3];a=(s|0)!=0;i=(r|0)!=0|(p|0)!=0;a:do if((q|2|0)==3){if(!a){if(i)Aa(96395,96132,692,96412);else{j=0;l=0}while(1){if((j|0)>=(B|0))break;w=c[y+(j<<2)>>2]|0;t=+((c[z+(w+1<<2)>>2]|0)-(c[z+(w<<2)>>2]|0)|0)+1.0;j=j+1|0;l=~~(t*t)+l|0}r=l<<2;s=IK(r)|0;c[m>>2]=s;r=IK(r)|0;c[n>>2]=r;p=IK(l<<3)|0;c[o>>2]=p}u=0;a=0;while(1){if((u|0)>=(B|0))break;o=c[y+(u<<2)>>2]|0;q=z+(o<<2)|0;j=c[q>>2]|0;i=c[A+(j<<2)>>2]|0;j=c[A+(j+1<<2)>>2]|0;b:do if((i|0)!=(j|0)){C=+Ww(e,d,i,j);C=C*C;n=z+(o+1<<2)|0;t=+((c[n>>2]|0)-(c[q>>2]|0)|0);c[s+(a<<2)>>2]=o;c[r+(a<<2)>>2]=o;h[p+(a<<3)>>3]=x/C;k=C*(t*t);t=-(x/(C*t));j=c[q>>2]|0;while(1){a=a+1|0;i=c[n>>2]|0;if((j|0)>=(i|0))break;c[s+(a<<2)>>2]=o;c[r+(a<<2)>>2]=c[A+(j<<2)>>2];h[p+(a<<3)>>3]=t;j=j+1|0}k=x/k;m=c[q>>2]|0;while(1){if((m|0)>=(i|0))break b;l=c[A+(m<<2)>>2]|0;c[s+(a<<2)>>2]=l;c[r+(a<<2)>>2]=o;h[p+(a<<3)>>3]=t;j=c[q>>2]|0;while(1){a=a+1|0;i=c[n>>2]|0;if((j|0)>=(i|0))break;w=c[A+(j<<2)>>2]|0;c[s+(a<<2)>>2]=l;c[r+(a<<2)>>2]=w;h[p+(a<<3)>>3]=k;j=j+1|0}m=m+1|0}}while(0);u=u+1|0}i=Aw(a,b,b,s,r,p,1,8)|0;a=0}else{switch(q|0){case 2:case 4:break;default:{i=0;a=0;break a}}do if(!a)if(i)Aa(96395,96132,734,96412);else{v=B<<2;w=IK(v)|0;c[m>>2]=w;v=IK(v)|0;c[n>>2]=v;u=IK(B<<3)|0;c[o>>2]=u;break}else{u=p;v=r;w=s}while(0);a=IK(S(b<<3,d)|0)|0;j=S(d,b)|0;i=0;while(1){if((i|0)>=(j|0)){o=0;break}h[a+(i<<3)>>3]=0.0;i=i+1|0}while(1){if((o|0)>=(B|0))break;p=c[y+(o<<2)>>2]|0;l=z+(p<<2)|0;m=c[l>>2]|0;k=+Ww(e,d,c[A+(m<<2)>>2]|0,c[A+(m+1<<2)>>2]|0);c[w+(o<<2)>>2]=p;c[v+(o<<2)>>2]=p;k=x/k;h[u+(o<<3)>>3]=k;l=c[l>>2]|0;m=c[z+(p+1<<2)>>2]|0;p=S(p,d)|0;j=l;while(1){if((j|0)>=(m|0))break;n=S(c[A+(j<<2)>>2]|0,d)|0;i=0;while(1){if((i|0)>=(d|0))break;s=a+(i+p<<3)|0;h[s>>3]=+h[e+(i+n<<3)>>3]+ +h[s>>3];i=i+1|0}j=j+1|0}k=k/+(m-l|0);i=0;while(1){if((i|0)>=(d|0))break;s=a+(i+p<<3)|0;h[s>>3]=+h[s>>3]*k;i=i+1|0}o=o+1|0}i=Aw(o,b,b,w,v,u,1,8)|0}while(0);c[f>>2]=i;c[g>>2]=a;return}function Ix(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0;f=e*f;g=0;a:while(1){if((g|0)>=(a|0))break;l=g+1|0;m=S(g,b)|0;i=l;while(1){if((i|0)==(a|0)){g=l;continue a}e=+Ww(c,b,g,i);k=S(i,b)|0;j=0;while(1){if((j|0)>=(b|0))break;p=j+m|0;n=j+k|0;o=f*((+h[c+(p<<3)>>3]-+h[c+(n<<3)>>3])/e);p=d+(p<<3)|0;h[p>>3]=+h[p>>3]+o;n=d+(n<<3)|0;h[n>>3]=+h[n>>3]-o;j=j+1|0}i=i+1|0}}return}function Jx(a,b,d,e,f,g,h,i){a=a|0;b=+b;d=d|0;e=e|0;f=f|0;g=+g;h=h|0;i=i|0;var j=0,k=0;k=Tx(a,b)|0;j=Yx(a,b)|0;+$x(k,j,c[a>>2]|0,d,e,f,g,h,i);return}function Kx(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0,k=0.0,l=0;f=0;i=0.0;while(1){if((f|0)>=(a|0))break;j=S(f,b)|0;e=0;g=0.0;while(1){if((e|0)>=(b|0))break;l=e+j|0;k=+h[d+(l<<3)>>3]-+h[c+(l<<3)>>3];e=e+1|0;g=g+k*k}f=f+1|0;i=i+ +G(+g)}return +i}function Lx(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var g=0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0;A=c[a>>2]|0;p=c[a+20>>2]|0;q=c[a+24>>2]|0;if(!(tw(a,0)|0))Aa(96096,96132,1034,96434);r=A<<3;B=IK(r)|0;j=0;while(1){if((j|0)>=(A|0))break;m=B+(j<<3)|0;h[m>>3]=0.0;n=j+1|0;o=p+(n<<2)|0;l=c[p+(j<<2)>>2]|0;g=0;k=0.0;while(1){if((l|0)>=(c[o>>2]|0))break;i=c[q+(l<<2)>>2]|0;if((j|0)!=(i|0)){k=+Xw(e,b,j,i);k=k+ +h[m>>3];h[m>>3]=k;g=g+1|0}l=l+1|0}if((g|0)<=0){z=11;break}h[m>>3]=k/+(g|0);j=n}if((z|0)==11)Aa(96209,96132,1046,96434);g=IK(56)|0;y=g+32|0;h[y>>3]=1.0;c[g+20>>2]=0;c[g+24>>2]=0;h[g+40>>3]=.01;c[g+48>>2]=~~+G(+(+(c[a>>2]|0)));x=IK(r)|0;c[g+12>>2]=x;i=0;while(1){if((i|0)>=(A|0))break;h[x+(i<<3)>>3]=d;i=i+1|0}do if((A|0)>2)if(!f){i=ey(A,b,e)|0;break}else{i=dy(A,b,e)|0;break}else i=uw(a)|0;while(0);f=g+4|0;c[f>>2]=vw(a,i)|0;nw(i);j=uw(c[f>>2]|0)|0;c[g+8>>2]=j;i=c[f>>2]|0;if((j|0)==0|(i|0)==0){Mx(g);g=0}else{r=c[i+20>>2]|0;q=c[i+24>>2]|0;p=c[i+28>>2]|0;f=c[j+28>>2]|0;v=0.0;w=0.0;m=0;while(1){if((m|0)>=(A|0))break;o=m+1|0;n=r+(o<<2)|0;u=0.0;d=0.0;j=-1;s=v;t=w;l=c[r+(m<<2)>>2]|0;while(1){if((l|0)>=(c[n>>2]|0))break;i=c[q+(l<<2)>>2]|0;if((i|0)==(m|0)){k=u;i=l}else{D=+H(+(+Ww(e,b,m,i)),.6);k=1.0/(D*D);h[p+(l<<3)>>3]=k;C=D*k;a=f+(l<<3)|0;h[a>>3]=C;t=t+C*+Xw(e,b,m,i);C=+h[a>>3];k=u+k;d=d+C;i=j;s=s+D*C}u=k;j=i;l=l+1|0}a=x+(m<<3)|0;k=-(u*+h[a>>3]);h[a>>3]=k;if((j|0)<=-1){z=31;break}h[p+(j<<3)>>3]=k-u;h[f+(j<<3)>>3]=-d;v=s;w=t;m=o}if((z|0)==31)Aa(96455,96132,1112,96434);k=w/v;j=c[r+(A<<2)>>2]|0;i=0;while(1){if((i|0)>=(j|0))break;A=f+(i<<3)|0;h[A>>3]=k*+h[A>>3];i=i+1|0}h[y>>3]=k;l6(B)}return g|0}function Mx(a){a=a|0;Cx(a);return}function Nx(a,b,c){a=a|0;b=b|0;c=c|0;+Gx(a,b,c,50,.001);return}function Ox(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;z=c[a>>2]|0;A=c[a+20>>2]|0;B=c[a+24>>2]|0;if(!(tw(a,0)|0))Aa(96096,96132,1149,96466);v=Ax(a,b,e)|0;w=c[v+28>>2]|0;a=IK(8)|0;x=IK(z<<2)|0;y=IK(z<<3)|0;i=0;while(1){if((i|0)>=(z|0)){o=0;break}l=y+(i<<3)|0;h[l>>3]=0.0;m=i+1|0;n=A+(m<<2)|0;j=c[A+(i<<2)>>2]|0;f=0;k=0.0;while(1){if((j|0)>=(c[n>>2]|0))break;g=c[B+(j<<2)>>2]|0;if((i|0)!=(g|0)){k=+Xw(e,b,i,g);k=k+ +h[l>>3];h[l>>3]=k;f=f+1|0}j=j+1|0}if((f|0)<=0){p=11;break}h[l>>3]=k/+(f|0);i=m}if((p|0)==11)Aa(96209,96132,1167,96466);while(1){if((o|0)>=(z|0)){m=0;f=0;break}c[x+(o<<2)>>2]=-1;o=o+1|0}a:while(1){if((m|0)>=(z|0))break;c[x+(m<<2)>>2]=m;j=A+(m<<2)|0;n=m+1|0;o=A+(n<<2)|0;i=c[j>>2]|0;while(1){g=c[o>>2]|0;if((i|0)>=(g|0))break;g=x+(c[B+(i<<2)>>2]<<2)|0;if((c[g>>2]|0)!=(m|0)){c[g>>2]=m;f=f+1|0}i=i+1|0}l=c[j>>2]|0;while(1){if((l|0)>=(g|0)){m=n;continue a}i=c[B+(l<<2)>>2]|0;j=A+(i+1<<2)|0;i=c[A+(i<<2)>>2]|0;while(1){if((i|0)>=(c[j>>2]|0))break;g=x+(c[B+(i<<2)>>2]<<2)|0;if((c[g>>2]|0)!=(m|0)){c[g>>2]=m;f=f+1|0}i=i+1|0}l=l+1|0;g=c[o>>2]|0}}e=ow(z,z,f,1,1)|0;c[a>>2]=e;if(!e){Px(a);a=0}else{p=c[e+20>>2]|0;q=c[e+24>>2]|0;r=c[e+28>>2]|0;c[p>>2]=0;g=0;f=0;while(1){if((g|0)>=(z|0))break;s=g+z|0;c[x+(g<<2)>>2]=s;l=A+(g<<2)|0;t=g+1|0;u=A+(t<<2)|0;b=y+(g<<3)|0;j=c[l>>2]|0;while(1){g=c[u>>2]|0;if((j|0)>=(g|0))break;g=c[B+(j<<2)>>2]|0;i=x+(g<<2)|0;if((c[i>>2]|0)!=(s|0)){c[i>>2]=s;c[q+(f<<2)>>2]=g;o=r+(f<<3)|0;h[o>>3]=(+h[b>>3]+ +h[y+(g<<3)>>3])*.5;h[o>>3]=+h[w+(j<<3)>>3];f=f+1|0}j=j+1|0}o=c[l>>2]|0;while(1){if((o|0)>=(g|0))break;j=c[B+(o<<2)>>2]|0;l=A+(j+1<<2)|0;m=y+(j<<3)|0;n=w+(o<<3)|0;j=c[A+(j<<2)>>2]|0;while(1){if((j|0)>=(c[l>>2]|0))break;g=B+(j<<2)|0;i=x+(c[g>>2]<<2)|0;if((c[i>>2]|0)!=(s|0)){c[i>>2]=s;c[q+(f<<2)>>2]=c[g>>2];i=r+(f<<3)|0;h[i>>3]=(+h[b>>3]+ +h[m>>3]*2.0+ +h[y+(c[g>>2]<<3)>>3])*.5;h[i>>3]=+h[n>>3]+ +h[w+(j<<3)>>3];f=f+1|0}j=j+1|0}o=o+1|0;g=c[u>>2]|0}c[p+(t<<2)>>2]=f;g=t}c[e+8>>2]=f;A=Vp()|0;B=a+4|0;c[B>>2]=A;B6(A|0,d|0,168)|0;B=c[B>>2]|0;c[B+16>>2]=0;c[B+40>>2]=1;A=B+96|0;h[A>>3]=+h[A>>3]*.5;c[B+80>>2]=20;l6(x);l6(y);nw(v)}return a|0}function Px(a){a=a|0;var b=0;if(a|0){b=c[a>>2]|0;if(b|0)nw(b);a=c[a+4>>2]|0;if(a|0)Wp(a)}return}function Qx(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=l;l=l+16|0;h=g;c[h>>2]=0;pq(e,b,c[a>>2]|0,c[a+4>>2]|0,d,f,h);if(!(c[h>>2]|0)){l=g;return}else Aa(96485,96132,1262,96491)}function Rx(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;c[g>>2]=0;g=c[d+120>>2]|0;a:do switch(g|0){case 5:case 6:{if((c[b>>2]|0)>2){b=Lx(b,a,0.0,f,(g|0)!=6&1)|0;Nx(b,a,f);Mx(b)}break}case 4:{g=0;while(1){if((g|0)==1)break a;i=Ox(b,a,d,f)|0;Qx(i,b,e,a,f);Px(i);g=g+1|0}}case 1:{d=0;h=6;break}case 2:{d=1;h=6;break}case 3:{d=2;h=6;break}default:{}}while(0);b:do if((h|0)==6){g=0;while(1){if((g|0)==1)break b;i=Bx(b,a,.05,f,d)|0;+Gx(i,a,f,50,.001);Cx(i);g=g+1|0}}while(0);return}function Sx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0.0,i=0.0,j=0,k=0;k=l;l=l+16|0;f=k;c[f>>2]=d;j=c[a>>2]|0;a=c[j+8>>2]|0;i=+h[j>>3];j=c[a>>2]|0;Gw(a,b,f,0);a=0;g=0.0;while(1){if((a|0)>=(j|0))break;e=g+ +h[b+(a<<3)>>3];a=a+1|0;g=e}d=c[f>>2]|0;e=+(j|0);a=0;while(1){if((a|0)>=(j|0))break;f=d+(a<<3)|0;h[f>>3]=+h[f>>3]+i*(e*+h[b+(a<<3)>>3]-g);a=a+1|0}l=k;return d|0}function Tx(a,b){a=a|0;b=+b;var d=0,e=0;d=IK(8)|0;e=IK(16)|0;c[d>>2]=e;h[e>>3]=b;c[e+8>>2]=a;c[d+4>>2]=28;return d|0}function Ux(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;c[e>>2]=d;Gw(c[a>>2]|0,b,e,0);l=f;return c[e>>2]|0}function Vx(a){a=a|0;var b=0;b=IK(8)|0;c[b>>2]=a;c[b+4>>2]=29;return b|0}function Wx(a){a=a|0;if(a|0)l6(a);return}function Xx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=c[a>>2]|0;e=~~+h[f>>3];f=f+8|0;a=0;while(1){if((a|0)>=(e|0))break;h[d+(a<<3)>>3]=+h[b+(a<<3)>>3]*+h[f+(a<<3)>>3];a=a+1|0}return d|0}function Yx(a,b){a=a|0;b=+b;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0;m=c[a>>2]|0;o=c[a+20>>2]|0;p=c[a+24>>2]|0;k=c[a+28>>2]|0;l=IK(8)|0;i=IK((m<<3)+8|0)|0;c[l>>2]=i;h[i>>3]=+(m|0);i=i+8|0;q=+(m+-1|0);j=1.0/q;b=q*b;a=0;a:while(1){if((a|0)>=(m|0))break;e=i+(a<<3)|0;h[e>>3]=j;f=a+1|0;g=c[o+(f<<2)>>2]|0;d=c[o+(a<<2)>>2]|0;while(1){if((d|0)>=(g|0)){a=f;continue a}if((a|0)==(c[p+(d<<2)>>2]|0)?(n=+h[k+(d<<3)>>3],(n>=0.0?n:-n)>0.0):0)h[e>>3]=1.0/(b+n);d=d+1|0}}c[l+4>>2]=30;return l|0}function Zx(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0;i=c[a>>2]|0;k=c[a+20>>2]|0;l=c[a+24>>2]|0;m=c[a+28>>2]|0;n=IK(8)|0;d=IK((c[a>>2]<<3)+8|0)|0;c[n>>2]=d;h[d>>3]=+(i|0);d=d+8|0;a=0;a:while(1){if((a|0)>=(i|0))break;e=d+(a<<3)|0;h[e>>3]=1.0;f=a+1|0;g=c[k+(f<<2)>>2]|0;b=c[k+(a<<2)>>2]|0;while(1){if((b|0)>=(g|0)){a=f;continue a}if((a|0)==(c[l+(b<<2)>>2]|0)?(j=+h[m+(b<<3)>>3],(j>=0.0?j:-j)>0.0):0)h[e>>3]=1.0/j;b=b+1|0}}c[n+4>>2]=30;return n|0}function _x(a){a=a|0;l6(c[a>>2]|0);if(a|0)l6(a);return}function $x(a,b,c,d,e,f,g,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=+g;i=i|0;j=j|0;var k=0.0,l=0,m=0.0,n=0,o=0,p=0;o=c<<3;n=IK(o)|0;o=IK(o)|0;l=0;m=0.0;while(1){if((l|0)<(d|0))j=0;else break;while(1){if((j|0)>=(c|0))break;p=(S(j,d)|0)+l|0;h[n+(j<<3)>>3]=+h[e+(p<<3)>>3];h[o+(j<<3)>>3]=+h[f+(p<<3)>>3];j=j+1|0}k=+ay(a,b,c,n,o,g,i);j=0;while(1){if((j|0)>=(c|0))break;h[f+((S(j,d)|0)+l<<3)>>3]=+h[n+(j<<3)>>3];j=j+1|0}l=l+1|0;m=m+k}l6(n);l6(o);return +m}function ay(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=+g;h=h|0;var i=0,j=0.0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0.0,t=0,u=0;r=c[a+4>>2]|0;p=c[b+4>>2]|0;q=d<<3;i=IK(q)|0;k=IK(q)|0;t=IK(q)|0;l=IK(q)|0;k=eb[r&63](a,e,k)|0;m=Sw(d,f,k)|0;o=+(d|0);s=+G(+(+Tw(d,m,m)))/o;n=s*g;m=0;f=t;j=1.0;g=s;while(1){if(!(g>n&(m|0)<(h|0)))break;i=eb[p&63](b,k,i)|0;g=+Tw(d,k,i);if((m|0)>0)Uw(d,i,f,g/j)|0;else B6(f|0,i|0,q|0)|0;u=eb[r&63](a,f,l)|0;j=g/+Tw(d,f,u);Vw(d,e,f,j)|0;t=Vw(d,k,u,-j)|0;m=m+1|0;j=g;l=u;g=+G(+(+Tw(d,t,t)))/o}l6(i);l6(k);l6(f);l6(l);return +g}function by(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=l;l=l+16|0;B=C;y=c[a+4>>2]|0;z=y<<3;A=IK(z)|0;u=IK(z)|0;v=IK(z)|0;w=c[a+20>>2]|0;x=c[a+24>>2]|0;s=c[a+28>>2]|0;t=c[15715]|0;r=0;while(1){if((r|0)<(b|0))g=0;else break;while(1){if((g|0)>=(y|0)){a=0;break}q=(S(g,b)|0)+r|0;h[A+(g<<3)>>3]=+h[d+(q<<3)>>3];h[v+(g<<3)>>3]=+h[e+(q<<3)>>3];g=g+1|0}while(1){if((a|0)<(f|0))n=0;else{g=0;break}while(1){if((n|0)>=(y|0))break;o=c[w+(n<<2)>>2]|0;p=n+1|0;q=c[w+(p<<2)>>2]|0;m=o;j=0.0;i=0.0;while(1){if((m|0)>=(q|0))break;g=c[x+(m<<2)>>2]|0;k=+h[s+(m<<3)>>3];if((g|0)==(n|0))i=k;else j=j+k*+h[A+(g<<3)>>3];m=m+1|0}if(j==0.0){c[B>>2]=q-o;z4(t,96513,B)|0}h[u+(n<<3)>>3]=(+h[v+(n<<3)>>3]-j)/i;n=p}B6(A|0,u|0,z|0)|0;a=a+1|0}while(1){if((g|0)>=(y|0))break;h[e+((S(g,b)|0)+r<<3)>>3]=+h[A+(g<<3)>>3];g=g+1|0}r=r+1|0}l6(A);l6(u);l6(v);l=C;return e|0}function cy(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;i=i|0;var j=0;j=c[a>>2]|0;c[i>>2]=0;switch(h|0){case 0:{h=Vx(a)|0;i=Zx(a)|0;f=+$x(h,i,j,b,d,e,f,g,0);Wx(h);_x(i);break}case 1:{by(a,b,d,e,g,0)|0;f=0.0;break}default:f=0.0}return +f}function dy(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;o=l;l=l+32|0;k=o;m=o+20|0;f=o+16|0;g=o+12|0;i=o+8|0;h[k>>3]=1.0;j=a<<3;n=IK(j)|0;j=IK(j)|0;b=0;while(1){if((b|0)>=(a|0))break;e=b<<1;h[n+(b<<3)>>3]=+h[d+(e<<3)>>3];h[j+(b<<3)>>3]=+h[d+((e|1)<<3)>>3];b=b+1|0}c[m>>2]=b;if((a|0)>2)d=Wr(n,j,a,i)|0;else{c[i>>2]=0;d=0}e=ow(a,a,1,1,2)|0;b=0;while(1){c[m>>2]=b;if((b|0)>=(c[i>>2]|0))break;p=b<<1;c[f>>2]=c[d+(p<<2)>>2];c[g>>2]=c[d+((p|1)<<2)>>2];Kw(e,1,f,g,k)|0;b=(c[m>>2]|0)+1|0}if((a|0)==2){c[f>>2]=0;c[g>>2]=1;Kw(e,1,f,g,k)|0;b=0}else b=0;while(1){c[m>>2]=b;if((b|0)>=(a|0))break;Kw(e,1,m,m,k)|0;b=(c[m>>2]|0)+1|0}a=zw(e)|0;nw(e);p=sw(a,0)|0;nw(a);l6(d);l6(n);l6(j);l=o;return p|0}function ey(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;g=m+8|0;i=m;h[i>>3]=1.0;k=a<<3;j=IK(k)|0;k=IK(k)|0;e=0;while(1){if((e|0)>=(a|0))break;f=S(e,b)|0;h[j+(e<<3)>>3]=+h[d+(f<<3)>>3];h[k+(e<<3)>>3]=+h[d+(f+1<<3)>>3];e=e+1|0}c[g>>2]=e;e=Xr(j,k,a,0)|0;f=ow(a,a,1,1,2)|0;b=0;while(1){c[g>>2]=b;if((b|0)<(a|0))d=1;else{b=0;break}while(1){if((d|0)>=(c[e+(b*12|0)>>2]|0))break;Kw(f,1,g,(c[e+(b*12|0)+4>>2]|0)+(d<<2)|0,i)|0;d=d+1|0;b=c[g>>2]|0}b=b+1|0}while(1){c[g>>2]=b;if((b|0)>=(a|0))break;Kw(f,1,g,g,i)|0;b=(c[g>>2]|0)+1|0}i=sw(zw(f)|0,0)|0;nw(f);l6(j);l6(k);Yr(e);l=m;return i|0}function fy(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;gy(f,c);hy(a,b,c,f);iy(b,f,d);jy(f);l=e;return}function gy(a,b){a=a|0;b=b|0;c[a>>2]=IK(b<<4)|0;c[a+4>>2]=b;c[a+8>>2]=0;return}function hy(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=l;l=l+64|0;r=D+32|0;u=D+48|0;v=D+16|0;w=D;t=b<<2;A=IK(t)|0;C=IK(t)|0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;s=IK(t)|0;t=IK(t)|0;f=0;while(1){if((f|0)>=(b|0))break;c[s+(f<<2)>>2]=f;f=f+1|0}q=b+-1|0;ft(a,s,0,q);f=0;while(1){if((f|0)>=(b|0))break;c[t+(c[s+(f<<2)>>2]<<2)>>2]=f;f=f+1|0}ly(u,a,s,b);f=1;while(1){if((f|0)>=(b|0)){f=0;break}c[A+(c[s+(f<<2)>>2]<<2)>>2]=c[s+(f+-1<<2)>>2];f=f+1|0}while(1){if((f|0)>=(q|0))break;p=f+1|0;c[C+(c[s+(f<<2)>>2]<<2)>>2]=c[s+(p<<2)>>2];f=p}k=e+8|0;m=e+4|0;n=v+4|0;o=w+4|0;p=w+8|0;j=0;while(1){if((j|0)>=(d|0))break;if(!((my(u,v)|0)<<24>>24))break;f=c[k>>2]|0;b=c[m>>2]|0;if((f|0)<(b|0))b=c[e>>2]|0;else{c[m>>2]=b<<1;b=n6(c[e>>2]|0,b<<5)|0;c[e>>2]=b;f=c[k>>2]|0}c[k>>2]=f+1;f=b+(f<<4)|0;c[f>>2]=c[v>>2];c[f+4>>2]=c[v+4>>2];c[f+8>>2]=c[v+8>>2];c[f+12>>2]=c[v+12>>2];f=c[v>>2]|0;b=c[t+(f<<2)>>2]|0;g=c[n>>2]|0;i=c[t+(g<<2)>>2]|0;if((b|0)>0?(x=c[s+(b+-1<<2)>>2]|0,y=C+(x<<2)|0,(c[t+(c[y>>2]<<2)>>2]|0)<(i|0)):0){c[w>>2]=x;c[o>>2]=g;h[p>>3]=+h[a+(g<<3)>>3]-+h[a+(x<<3)>>3];c[r>>2]=c[w>>2];c[r+4>>2]=c[w+4>>2];c[r+8>>2]=c[w+8>>2];c[r+12>>2]=c[w+12>>2];ny(u,r);c[y>>2]=g;c[A+(g<<2)>>2]=x}if((i|0)<(q|0)?(z=c[s+(i+1<<2)>>2]|0,B=A+(z<<2)|0,(c[t+(c[B>>2]<<2)>>2]|0)>(b|0)):0){c[w>>2]=f;c[o>>2]=z;h[p>>3]=+h[a+(z<<3)>>3]-+h[a+(f<<3)>>3];c[r>>2]=c[w>>2];c[r+4>>2]=c[w+4>>2];c[r+8>>2]=c[w+8>>2];c[r+12>>2]=c[w+12>>2];ny(u,r);c[B>>2]=f;c[C+(f<<2)>>2]=z}j=j+1|0}l6(A);l6(C);l6(s);l6(t);oy(u);l=D;return}function iy(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=IK(a<<2)|0;l=b+8|0;i=c[l>>2]|0;j=(i<<1)+a|0;h=j<<2;e=IK(h)|0;h=IK(h)|0;f=0;while(1){if((f|0)>=(a|0))break;c[k+(f<<2)>>2]=1;f=f+1|0}f=0;while(1){if((f|0)>=(i|0)){f=0;break}n=c[b>>2]|0;m=c[n+(f<<4)+4>>2]|0;n=k+(c[n+(f<<4)>>2]<<2)|0;c[n>>2]=(c[n>>2]|0)+1;m=k+(m<<2)|0;c[m>>2]=(c[m>>2]|0)+1;f=f+1|0}while(1){if((f|0)>=(j|0))break;g[h+(f<<2)>>2]=1.0;f=f+1|0}i=IK(a*20|0)|0;c[d>>2]=i;f=0;while(1){if((f|0)>=(a|0))break;c[i+(f*20|0)>>2]=1;c[i+(f*20|0)+8>>2]=h;c[i+(f*20|0)+4>>2]=e;c[e>>2]=f;g[h>>2]=0.0;n=c[k+(f<<2)>>2]|0;h=h+(n<<2)|0;e=e+(n<<2)|0;f=f+1|0}l6(k);while(1){e=c[l>>2]|0;if(!e)break;n=e+-1|0;c[l>>2]=n;m=c[b>>2]|0;ky(i,c[m+(n<<4)>>2]|0,c[m+(n<<4)+4>>2]|0)}return}function jy(a){a=a|0;l6(c[a>>2]|0);return}function ky(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0;f=a+(b*20|0)|0;h=c[f>>2]|0;i=c[a+(b*20|0)+4>>2]|0;e=0;while(1){if((e|0)>=(h|0)){j=4;break}if((c[i+(e<<2)>>2]|0)==(d|0))break;else e=e+1|0}if((j|0)==4?(c[f>>2]=h+1,c[i+(h<<2)>>2]=d,i=c[a+(d*20|0)+4>>2]|0,h=a+(d*20|0)|0,j=c[h>>2]|0,c[h>>2]=j+1,c[i+(j<<2)>>2]=b,c[a+8>>2]|0):0){j=c[a+(b*20|0)+8>>2]|0;g[j>>2]=+g[j>>2]+-1.0;j=c[a+(d*20|0)+8>>2]|0;g[j>>2]=+g[j>>2]+-1.0}return}function ly(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0.0,k=0,l=0;f=e+-1|0;c[a+4>>2]=f;c[a+8>>2]=f;c[a>>2]=IK(f<<4)|0;e=0;while(1){if((e|0)>=(f|0))break;l=c[d+(e<<2)>>2]|0;g=e+1|0;k=c[d+(g<<2)>>2]|0;j=+h[b+(k<<3)>>3]-+h[b+(l<<3)>>3];i=c[a>>2]|0;c[i+(e<<4)>>2]=l;c[i+(e<<4)+4>>2]=k;h[i+(e<<4)+8>>3]=j;e=g}e=(f|0)/2|0;while(1){if((e|0)<=-1)break;py(a,e);e=e+-1|0}return}function my(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+4|0;if(!(c[d>>2]|0))a=0;else{e=c[a>>2]|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];b=c[a>>2]|0;e=b+((c[d>>2]|0)+-1<<4)|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];c[d>>2]=(c[d>>2]|0)+-1;py(a,0);a=1}return a|0}function ny(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m;i=a+4|0;j=c[i>>2]|0;d=a+8|0;if((j|0)==(c[d>>2]|0)){c[d>>2]=j<<1;e=n6(c[a>>2]|0,j<<5)|0;c[a>>2]=e;d=c[i>>2]|0}else{d=j;e=c[a>>2]|0}c[i>>2]=d+1;e=e+(j<<4)|0;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];e=j;while(1){if((e|0)<=0)break;d=c[a>>2]|0;f=+h[d+(e<<4)+8>>3];b=e>>>1;g=+h[d+(b<<4)+8>>3];if(!(f>2]|0}j=d+(e<<4)|0;c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];i=d+(b<<4)|0;c[j>>2]=c[i>>2];c[j+4>>2]=c[i+4>>2];c[j+8>>2]=c[i+8>>2];c[j+12>>2]=c[i+12>>2];j=(c[a>>2]|0)+(b<<4)|0;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];e=b}l=m;return}function oy(a){a=a|0;l6(c[a>>2]|0);return}function py(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;i=m;j=a+4|0;while(1){d=b<<1;g=d|1;if((d|0)<(c[j>>2]|0)){n=c[a>>2]|0;e=+h[n+(d<<4)+8>>3];f=+h[n+(b<<4)+8>>3];if(!(e>2]|0)){n=c[a>>2]|0;e=+h[n+(g<<4)+8>>3];f=+h[n+(d<<4)+8>>3];if(!(e>2]|0;n=g+(d<<4)|0;c[i>>2]=c[n>>2];c[i+4>>2]=c[n+4>>2];c[i+8>>2]=c[n+8>>2];c[i+12>>2]=c[n+12>>2];g=g+(b<<4)|0;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];c[n+12>>2]=c[g+12>>2];n=(c[a>>2]|0)+(b<<4)|0;c[n>>2]=c[i>>2];c[n+4>>2]=c[i+4>>2];c[n+8>>2]=c[i+8>>2];c[n+12>>2]=c[i+12>>2];b=d}l=m;return}function qy(a,b,d,e,f,g,i,j){a=a|0;b=b|0;d=+d;e=+e;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0.0;l=(f|0)!=0;if(!l){f=IK(b<<3)|0;if(!(gu(a,b,f,b)|0))m=3;else{a=1;m=17}}else m=3;if((m|0)==3){k=HK(b<<2)|0;c[g>>2]=k;a=0;while(1){if((a|0)>=(b|0))break;c[k+(a<<2)>>2]=a;a=a+1|0}a=b+-1|0;ft(f,k,0,a);n=+h[f+(c[k>>2]<<3)>>3];e=(+h[f+(c[k+(a<<2)>>2]<<3)>>3]-n)*e/+(a|0);e=e=(b|0))break;n=+h[f+(c[k+(g<<2)>>2]<<3)>>3];a=(n-d>e&1)+a|0;g=g+1|0;d=n}c[j>>2]=a;a:do if(!a){k=IK(4)|0;c[i>>2]=k;c[k>>2]=b}else{j=IK(a<<2)|0;c[i>>2]=j;a=0;g=1;while(1){if((g|0)>=(b|0))break a;if(+h[f+(c[k+(g<<2)>>2]<<3)>>3]-+h[f+(c[k+(g+-1<<2)>>2]<<3)>>3]>e){c[j+(a<<2)>>2]=g;a=a+1|0}g=g+1|0}}while(0);if(l)a=0;else{a=0;m=17}}if((m|0)==17)l6(f);return a|0}function ry(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=c[46972]|0;if(d|0)sn(d);c[46972]=rn(b,b,0.0)|0;d=c[46973]|0;if(d|0)l6(d);c[46973]=HK(b<<2)|0;d=c[46974]|0;if(d|0)l6(d);n=HK(b<<3)|0;c[46974]=n;o=c[46972]|0;p=c[46973]|0;i=0;while(1){if((i|0)>=(b|0)){e=10;break}e=a+(i<<2)|0;g=o+(i<<2)|0;f=0.0;d=0;while(1){if((d|0)==(b|0))break;j=+h[(c[e>>2]|0)+(d<<3)>>3];h[(c[g>>2]|0)+(d<<3)>>3]=j;j=+F(+j);f=f>3]=1.0/f;c[p+(i<<2)>>2]=i;i=i+1|0}a:do if((e|0)==10){m=b+-1|0;d=0;l=0;b:while(1){if((l|0)<(m|0)){e=l;f=0.0}else break;while(1){if((e|0)>=(b|0))break;k=c[p+(e<<2)>>2]|0;j=+F(+(+h[(c[o+(k<<2)>>2]|0)+(l<<3)>>3]));j=j*+h[n+(k<<3)>>3];k=f>2]|0;c[e>>2]=c[g>>2];c[g>>2]=k}i=c[o+(c[e>>2]<<2)>>2]|0;f=+h[i+(l<<3)>>3];k=l+1|0;g=k;while(1){if((g|0)>=(b|0)){l=k;continue b}a=c[o+(c[p+(g<<2)>>2]<<2)>>2]|0;e=a+(l<<3)|0;j=+h[e>>3]/f;h[e>>3]=j;c:do if(j!=0.0){e=k;while(1){if((e|0)>=(b|0))break c;q=a+(e<<3)|0;h[q>>3]=+h[q>>3]-j*+h[i+(e<<3)>>3];e=e+1|0}}while(0);g=g+1|0}}d=+h[(c[o+(c[p+(m<<2)>>2]<<2)>>2]|0)+(m<<3)>>3]!=0.0&1}else if((e|0)==15){h[d>>3]=0.0;d=0}while(0);return d|0}function sy(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0,k=0,l=0;k=c[46973]|0;l=c[46972]|0;j=0;while(1){if((j|0)>=(d|0)){e=d;break}g=c[k+(j<<2)>>2]|0;i=l+(g<<2)|0;f=0.0;e=0;while(1){if((e|0)==(j|0))break;f=f+ +h[(c[i>>2]|0)+(e<<3)>>3]*+h[a+(e<<3)>>3];e=e+1|0}h[a+(j<<3)>>3]=+h[b+(g<<3)>>3]-f;j=j+1|0}while(1){b=e+-1|0;if((e|0)<=0)break;g=c[l+(c[k+(b<<2)>>2]<<2)>>2]|0;f=0.0;while(1){if((e|0)>=(d|0))break;f=f+ +h[g+(e<<3)>>3]*+h[a+(e<<3)>>3];e=e+1|0}e=a+(b<<3)|0;h[e>>3]=(+h[e>>3]-f)/+h[g+(b<<3)>>3];e=b}return}function ty(a){a=a|0;var b=0;b=IK(8)|0;c[b>>2]=a;c[b+4>>2]=0;return b|0}function uy(a,b){a=a|0;b=b|0;var d=0,e=0;if(a|0)do{d=a;a=c[a+4>>2]|0;e=c[d>>2]|0;if(e|0)db[b&127](e);l6(d)}while((a|0)!=0);return}function vy(a,b){a=a|0;b=b|0;b=ty(b)|0;c[b+4>>2]=a;return b|0}function wy(a){a=a|0;return c[a>>2]|0}function xy(a){a=a|0;return c[a+4>>2]|0}function yy(a){a=a|0;var b=0;b=IK(12)|0;c[b>>2]=a;c[b+4>>2]=0;c[b+8>>2]=0;return b|0}function zy(a,b){a=a|0;b=b|0;var d=0,e=0;if(a|0)do{d=a;a=c[a+4>>2]|0;e=c[d>>2]|0;if(e|0)db[b&127](e);l6(d)}while((a|0)!=0);return}function Ay(a,b){a=a|0;b=b|0;b=yy(b)|0;if(a|0){c[b+4>>2]=a;c[a+8>>2]=b}return b|0}function By(a){a=a|0;return c[a>>2]|0}function Cy(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if(a|0){e=c[a+4>>2]|0;f=c[a+8>>2]|0;g=c[a>>2]|0;if(g|0)db[b&127](g);l6(a);if(e|0)c[e+8>>2]=f;c[(f|0?f+4|0:d)>>2]=e}return}function Dy(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;return}function Ey(a){a=a|0;var b=0;b=HK(64)|0;Dy(b+36|0);c[b+8>>2]=a;return b|0}function Fy(a){a=a|0;if(a|0){$y(c[a+32>>2]|0);l6(a)}return}function Gy(a){a=a|0;return qB(c[a+8>>2]|0)|0}function Hy(a,b){a=a|0;b=b|0;var d=0,e=0;c[b+4>>2]=0;d=a+4|0;e=c[d>>2]|0;c[((e|0)==0?a:e+4|0)>>2]=b;c[d>>2]=b;return}function Iy(a,b){a=a|0;b=b|0;var d=0;d=c[a>>2]|0;if(!d){c[a>>2]=b;a=a+4|0}else c[b+4>>2]=d;c[a>>2]=b;return}function Jy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;Ky(a,b);j=c[b>>2]|0;h=c[j+4>>2]|0;while(1){if(!h)break;k=c[h+8>>2]|0;i=gC(k)|0;d=c[(c[i+16>>2]|0)+112>>2]|0;a=c[d+16+4>>2]|0;d=c[d+8>>2]|0;f=i;i=hC(k,i)|0;while(1){if(!i)break;e=c[(c[i+16>>2]|0)+112>>2]|0;g=c[e+16+4>>2]|0;if((g|0)<(a|0)){f=i;d=c[e+8>>2]|0;a=g}i=hC(k,i)|0}i=c[(c[d+16>>2]|0)+112>>2]|0;k=i+4|0;c[k>>2]=c[k>>2]|8;c[h>>2]=f;k=c[h+4>>2]|0;Hy((c[i+12>>2]|0)+36|0,h);h=k}Dy(b);return j|0}function Ky(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j;h=j+8|0;f=c[d+24>>2]|0;if(!((f|0)!=0?(e=qC(b,f,0)|0,(e|0)!=0):0))g=3;a:do if((g|0)==3){f=d+20|0;b:do if(c[f>>2]|0){e=gC(b)|0;while(1){if(!e)break b;if((aP(c[c[(c[e+16>>2]|0)+112>>2]>>2]|0,c[f>>2]|0,0)|0)<<24>>24)break a;e=hC(b,e)|0}}while(0);e=gC(b)|0}while(0);if(a[195234]|0){g=c[15715]|0;c[i>>2]=HB(e)|0;z4(g,96524,i)|0}c[h+4>>2]=0;c[h>>2]=0;Ly(b,e,d,1,h);l=j;return}function Ly(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=d+8|0;j=c[l>>2]|0;c[l>>2]=j+1;l=b+16|0;k=c[(c[l>>2]|0)+112>>2]|0;c[k+16+4>>2]=j;c[k+24>>2]=j;k=(e|0)!=0;j=ZA(a,b)|0;while(1){if(!j)break;e=c[j>>2]&3;g=c[((e|0)==2?j:j+-48|0)+40>>2]|0;h=c[(c[j+16>>2]|0)+120>>2]|0;i=(c[h>>2]|0)!=0;if((g|0)==(b|0)){e=c[((e|0)==3?j:j+48|0)+40>>2]|0;if(i)g=e;else{c[h>>2]=-1;g=e}}else if(!i)c[h>>2]=1;e=g+16|0;h=c[(c[e>>2]|0)+112>>2]|0;i=c[h+16+4>>2]|0;do if(!i){c[h+8>>2]=b;My(f,j);Ly(a,g,d,0,f);i=c[(c[l>>2]|0)+112>>2]|0;m=i+24|0;h=(c[(c[e>>2]|0)+112>>2]|0)+24|0;c[m>>2]=c[(c[(c[((c[m>>2]|0)<(c[h>>2]|0)?b:g)+16>>2]|0)+112>>2]|0)+24>>2];if((c[h>>2]|0)>=(c[i+16+4>>2]|0)){e=0;do{h=Ny(f)|0;g=(c[c[(c[h+16>>2]|0)+120>>2]>>2]|0)==1;g=c[((c[h>>2]&3|0)==((g?2:3)|0)?h:h+((g?-1:1)*48|0)|0)+40>>2]|0;if(!(c[(c[(c[g+16>>2]|0)+112>>2]|0)+12>>2]|0)){if(!e)e=Oy(a,d)|0;Py(e,g)}}while((h|0)!=(j|0));if(e|0){if((c[(c[(c[l>>2]|0)+112>>2]|0)+12>>2]|0)==0?(Gy(e)|0)>1:0)Py(e,b);if(k?(c[(c[(c[l>>2]|0)+112>>2]|0)+12>>2]|0)==(e|0):0){Iy(d,e);break}Hy(d,e)}}}else{e=c[(c[l>>2]|0)+112>>2]|0;if((c[e+8>>2]|0)!=(g|0)){m=e+24|0;h=c[m>>2]|0;c[m>>2]=(h|0)<(i|0)?h:i}}while(0);j=_A(a,j,b)|0}if(k?(c[(c[(c[l>>2]|0)+112>>2]|0)+12>>2]|0)==0:0){m=Oy(a,d)|0;Py(m,b);Iy(d,m)}return}function My(a,b){a=a|0;b=b|0;c[(c[(c[b+16>>2]|0)+120>>2]|0)+4>>2]=c[a>>2];c[a>>2]=b;b=a+4|0;c[b>>2]=(c[b>>2]|0)+1;return}function Ny(a){a=a|0;var b=0,d=0,e=0;b=c[a>>2]|0;if(!b)Aa(138697,96555,65,96567);d=a+4|0;e=c[d>>2]|0;if((e|0)>0){c[a>>2]=c[(c[(c[b+16>>2]|0)+120>>2]|0)+4>>2];c[d>>2]=e+-1;return b|0}else Aa(96545,96555,61,96567);return 0}function Oy(a,b){a=a|0;b=b|0;return Ey(Qy(a,b)|0)|0}function Py(a,b){a=a|0;b=b|0;lC(c[a+8>>2]|0,b,1)|0;c[(c[(c[b+16>>2]|0)+112>>2]|0)+12>>2]=a;return}function Qy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+144|0;f=d;e=d+8|0;g=b+12|0;b=c[g>>2]|0;c[g>>2]=b+1;c[f>>2]=b;i2(e,96535,f)|0;b=LD(a,e,1)|0;RC(b,137786,280,1)|0;l=d;return b|0}function Ry(a){a=a|0;var b=0,d=0;b=c[a+36>>2]|0;while(1){if(!b)break;d=c[b+4>>2]|0;Ry(b);b=d}Fy(a);return}function Sy(a,b,c){a=a|0;b=b|0;c=c|0;Ty(a,b,+h[c+32>>3]);return}function Ty(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,i=0;e=b+36|0;f=0;while(1){e=c[e>>2]|0;if(!e)break;Ty(a,e,d);e=e+4|0;f=f+1|0}e=jz(a,b,d)|0;c[b+32>>2]=e;a=gz(e)|0;if((f|0)>0)d=+Uy(f,a,e,b,d);else d=3.141592653589793;if((((a|0)==1?(g=c[b>>2]|0,g|0):0)?c[(c[(c[g+16>>2]|0)+112>>2]|0)+8>>2]|0:0)?(i=b+48|0,h[i>>3]=d,d<0.0):0)h[i>>3]=d+6.283185307179586;return}function Uy(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var g=0.0,i=0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+48|0;t=v;u=HK(a*56|0)|0;c[t+40>>2]=c[e+36>>2];p=e+16|0;j=+h[p>>3];q=t+8|0;h[q>>3]=j;h[t>>3]=j;c[t+44>>2]=c[e>>2];j=6.283185307179586/+(b|0);h[t+16>>3]=j;r=t+24|0;h[r>>3]=-1.0;s=t+32|0;h[s>>3]=-1.0;k=0;o=0;g=0.0;while(1){i=c[d>>2]|0;if(!i)break;d=c[i>>2]|0;if(!(c[(c[(c[d+16>>2]|0)+112>>2]|0)+4>>2]&8))d=o;else{n=u+(o*56|0)|0;c[n>>2]=d;h[u+(o*56|0)+8>>3]=+(k|0)*j;d=o+1|0;g=+Vy(n,t,f)}k=k+1|0;o=d;d=i+4|0}a:do if((o|0)==1){h[u+40>>3]=1.0;d=0}else{n=u+8|0;if((o|0)==2){j=+h[u+64>>3]-+h[n>>3];Wy(u,u+56|0,j>3.141592653589793?6.283185307179586-j:j);d=0;break}else{m=u;d=0}while(1){if((d|0)>=(o|0)){d=0;break a}d=d+1|0;k=m+56|0;j=+h[m+8>>3];if((d|0)==(o|0)){i=u;j=+h[n>>3]-j+6.283185307179586}else{i=k;j=+h[m+64>>3]-j}Wy(m,i,j);m=k}}while(0);while(1){if((d|0)>=(o|0))break;Xy(u+(d*56|0)|0,t,b,f);d=d+1|0}l6(u);if((a|0)==1){f=f*.5+g;Yy(e,-f,0.0,0.0);h[p>>3]=f+ +h[p>>3];u=e+56|0;c[u>>2]=c[u>>2]|1}else h[p>>3]=+h[q>>3];l=v;return +((+h[r>>3]+ +h[s>>3])*.5+-3.141592653589793)}function Vy(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,g=0.0,i=0,j=0,k=0.0;i=0;f=0.0;g=0.0;e=b+40|0;while(1){j=c[e>>2]|0;if(!j)break;e=c[j>>2]|0;if(!e)e=0;else e=c[(c[(c[e+16>>2]|0)+112>>2]|0)+8>>2]|0;if((e|0)==(c[a>>2]|0)){k=+h[j+16>>3];e=i+1|0;f=f+(k*2.0+d);g=g>3]=f;c[a+48>>2]=i;h[a+16>>3]=g+(+h[b>>3]+d);h[a+24>>3]=g;return +g}function Wy(a,b,c){a=a|0;b=b|0;c=+c;var d=0.0,e=0.0;e=+h[b+16>>3];d=+h[a+16>>3];c=(+h[a+32>>3]*e+ +h[b+32>>3]*d)/(e*(c*2.0*d));c=c<1.0?1.0:c;a=a+40|0;if(c>+h[a>>3])h[a>>3]=c;a=b+40|0;if(c>+h[a>>3])h[a>>3]=c;return}function Xy(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0.0,g=0.0,i=0.0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0,C=0.0,D=0.0;y=b+8|0;x=+h[y>>3];z=b+24|0;l=+h[z>>3];A=b+32|0;k=+h[A>>3];f=+h[a+40>>3]*+h[a+16>>3];u=(d|0)==1;v=a+48|0;w=a+8|0;g=+h[a+32>>3];if(u){i=g/6.283185307179586;i=f>i?f:i;f=i*6.283185307179586-g;if(f>0.0){e=f/+(c[v>>2]|0)+e;g=0.0;f=i}else{g=0.0;f=i}}else g=+h[w>>3]-g/(f*2.0);s=f+ +h[a+24>>3];t=s>x;p=e/f;q=((c[v>>2]|0)+1|0)/2|0;r=p*.5;m=b+40|0;i=k;e=l;n=0;o=0.0;while(1){m=c[m>>2]|0;if(!m)break;j=c[m>>2]|0;if(!j)j=0;else j=c[(c[(c[j+16>>2]|0)+112>>2]|0)+8>>2]|0;if((j|0)==(c[a>>2]|0)?(gz(c[m+32>>2]|0)|0)>=1:0){k=+h[m+16>>3]/f;l=r+k;do if(!u)if((c[v>>2]|0)==1){g=+h[w>>3];break}else{g=g+l;break}else{if(g!=0.0)g=(c[v>>2]|0)==2?3.141592653589793:g+k;i=g;e=e<0.0?g:e}while(0);D=f*+I(+g);C=f*+J(+g);Yy(m,D,C,+Zy(m,D,C,g));g=(u?p+k:l)+g;n=n+1|0;j=n;k=(n|0)==(q|0)?g:o}else{j=n;k=o}m=m+4|0;n=j;o=k}f=t?s:x;if((d|0)>1?(B=c[a>>2]|0,(B|0)==(c[b+44>>2]|0)):0)h[(c[(c[B+16>>2]|0)+112>>2]|0)+24>>3]=o;h[y>>3]=f;h[z>>3]=e;h[A>>3]=i;return}function Yy(a,b,d,e){a=a|0;b=+b;d=+d;e=+e;var f=0,g=0.0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0.0;m=c[a+8>>2]|0;n=e!=0.0;f=gC(m)|0;while(1){if(!f)break;k=c[(c[f+16>>2]|0)+132>>2]|0;l=k+8|0;i=+h[k>>3];g=+h[l>>3];if(n){p=+I(+e);o=+J(+e);j=i*p-g*o;g=g*p+i*o}else j=i;h[k>>3]=j+b;h[l>>3]=g+d;f=hC(m,f)|0}f=a+36|0;while(1){f=c[f>>2]|0;if(!f)break;Yy(f,b,d,e);f=f+4|0}return}function Zy(a,b,d,e){a=a|0;b=+b;d=+d;e=+e;var f=0.0,g=0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0;n=c[a+8>>2]|0;f=+h[a+48>>3];do if(!(f>=0.0)){if((gz(c[a+32>>2]|0)|0)==2){f=e+-1.5707963267948966;break}m=c[a>>2]|0;o=m+16|0;l=c[(c[o>>2]|0)+132>>2]|0;k=+h[l>>3]+b;f=+h[l+8>>3]+d;f=k*k+f*f;l=gC(n)|0;g=m;while(1){if(!l)break;if((l|0)!=(m|0)?(p=c[(c[l+16>>2]|0)+132>>2]|0,k=+h[p>>3]+b,i=+h[p+8>>3]+d,i=k*k+i*i,i>3];k=+h[a+16>>3]-j;g=c[o>>2]|0;p=c[g+132>>2]|0;f=+h[p>>3];i=+h[p+8>>3];if(f>-k?(c[a+56>>2]&1|0)!=0:0){i=+O(+i,+(k+f));f=+I(+i);f=1.5707963267948966-i-+M(+(f*((k-j/f)/+G(+(b*b+d*d)))))+e;break}else{f=3.141592653589793-+O(+i,+f);f=f-+h[(c[g+112>>2]|0)+24>>3]+e;f=f>6.283185307179586?f+-6.283185307179586:f;break}}else f=0.0}else{f=3.141592653589793-f+e;f=f<0.0?f+6.283185307179586:f}while(0);return +f}function _y(){return HK(12)|0}function $y(a){a=a|0;var b=0,d=0;if(a|0){b=c[a>>2]|0;while(1){if(!b)break;d=c[b+4>>2]|0;l6(b);b=d}l6(a)}return}function az(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=bz(d)|0;h=a+8|0;c[h>>2]=(c[h>>2]|0)+1;h=a+4|0;i=c[h>>2]|0;d=(b|0)==0?i:b;b=d+4|0;e=g+4|0;f=g+8|0;if((d|0)==(i|0)){c[(i|0?b:a)>>2]=g;c[f>>2]=i;c[e>>2]=0;c[h>>2]=g}else{a=c[b>>2]|0;c[b>>2]=g;c[f>>2]=d;c[a+8>>2]=g;c[e>>2]=a}return}function bz(a){a=a|0;var b=0;b=HK(12)|0;c[b>>2]=a;return b|0}function cz(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=c[a>>2]|0;b=d;while(1){if(!b)break;g=b+4|0;e=c[g>>2]|0;f=b+8|0;c[g>>2]=c[f>>2];c[f>>2]=e;b=e}f=a+4|0;g=c[f>>2]|0;c[f>>2]=d;c[a>>2]=g;return a|0}function dz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[a>>2]|0;if((d|0)!=(b|0)){f=b+8|0;e=c[f>>2]|0;c[a>>2]=b;c[f>>2]=0;b=a+4|0;a=c[b>>2]|0;c[a+4>>2]=d;c[d+8>>2]=a;c[b>>2]=e;c[e+4>>2]=0}return}function ez(a){a=a|0;var b=0,d=0,e=0;d=_y()|0;e=d+4|0;b=0;while(1){a=c[a>>2]|0;if(!a)break;az(d,b,c[a>>2]|0);b=c[e>>2]|0;a=a+4|0}return d|0}function fz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;m=c[a>>2]|0;while(1){if(!m){k=4;break}l=m+4|0;f=c[l>>2]|0;if((c[m>>2]|0)==(b|0))break;else m=f}if((k|0)==4)Aa(96571,96578,217,96589);h=a+4|0;j=m+8|0;i=c[j>>2]|0;c[(i|0?i+4|0:a)>>2]=f;c[(f|0?f+8|0:h)>>2]=i;i=c[a>>2]|0;f=0;g=i;while(1){if(!g)break;b=g+4|0;if((c[g>>2]|0)==(d|0)){k=8;break}f=g;g=c[b>>2]|0}if((k|0)==8){do if(!e){b=g+8|0;if((g|0)==(i|0)){c[a>>2]=m;c[l>>2]=i;c[j>>2]=0;break}else{c[f+4>>2]=m;c[j>>2]=f;c[l>>2]=g;break}}else if((g|0)==(c[h>>2]|0)){c[h>>2]=m;c[l>>2]=0;c[j>>2]=g;break}else{c[j>>2]=g;c[l>>2]=c[b>>2];c[(c[b>>2]|0)+8>>2]=m;break}while(0);c[b>>2]=m}return}function gz(a){a=a|0;return c[a+8>>2]|0}function hz(a,b){a=a|0;b=b|0;iz(a,cz(b)|0);l6(b);return}function iz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[b>>2]|0;if(d|0){e=a+4|0;f=c[e>>2]|0;c[f+4>>2]=d;c[d+8>>2]=f;c[e>>2]=c[b+4>>2];d=a+8|0;c[d>>2]=(c[d>>2]|0)+(c[b+8>>2]|0)}return}function jz(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0;m=c[b+8>>2]|0;kz(a,b);l=lz(m)|0;a=nz(mz(l)|0)|0;oz(m,a);m=pz(a,m)|0;a=gz(m)|0;j=+qz(m);k=(a|0)==1;f=+(a|0);i=f*(j+d)/6.283185307179586;g=k?0.0:i;a=m;while(1){a=c[a>>2]|0;if(!a)break;if(c[(c[(c[(c[a>>2]|0)+16>>2]|0)+112>>2]|0)+4>>2]&8|0){e=4;break}a=a+4|0}if((e|0)==4)dz(m,a);d=6.283185307179586/f;e=0;a=m;while(1){a=c[a>>2]|0;if(!a)break;n=c[(c[a>>2]|0)+16>>2]|0;p=c[n+112>>2]|0;c[p+16>>2]=e;h[p+24>>3]=0.0;f=d*+(e|0);o=g*+I(+f);n=c[n+132>>2]|0;h[n>>3]=o;h[n+8>>3]=g*+J(+f);e=e+1|0;a=a+4|0}o=k?j*.5:i;h[b+16>>3]=o;h[b+24>>3]=o;h[b+48>>3]=-1.0;pB(l)|0;return m|0}function kz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=c[b+8>>2]|0;d=gC(f)|0;while(1){if(!d)break;e=UA(a,d)|0;while(1){if(!e)break;if((c[(c[(c[(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0)+12>>2]|0)==(b|0))jB(f,e,1)|0;e=WA(a,e)|0}d=hC(f,d)|0}return}function lz(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;g=k;f=wz(a,g)|0;g=c[g>>2]|0;i=qB(g)|0;h=xz(g)|0;i=i+-3|0;e=0;while(1){if((e|0)>=(i|0))break;j=Gz(h)|0;d=ZA(g,j)|0;while(1){if(!d)break;b=c[d>>2]&3;a=c[((b|0)==2?d:d+-48|0)+40>>2]|0;if((j|0)==(a|0))a=c[((b|0)==3?d:d+48|0)+40>>2]|0;Fz(h,a);d=_A(g,d,j)|0}yz(g,j,f);d=ZA(g,j)|0;while(1){if(!d)break;b=c[d>>2]&3;a=c[((b|0)==2?d:d+-48|0)+40>>2]|0;if((j|0)==(a|0))a=c[((b|0)==3?d:d+48|0)+40>>2]|0;b=(c[a+16>>2]|0)+236|0;c[b>>2]=(c[b>>2]|0)+-1;Ez(h,a);d=_A(g,d,j)|0}tC(g,j)|0;e=e+1|0}pB(g)|0;Dz(h);l=k;return f|0}function mz(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+144|0;b=f;e=f+8|0;d=c[46975]|0;c[46975]=d+1;c[b>>2]=d;i2(e,96604,b)|0;e=LD(a,e,1)|0;RC(e,137786,280,1)|0;b=gC(a)|0;while(1){if(!b)break;lC(e,b,1)|0;d=c[(c[b+16>>2]|0)+112>>2]|0;c[d+16+12>>2]=0;c[d+32>>2]=0;d=d+4|0;c[d>>2]=c[d>>2]&-2;b=hC(a,b)|0}b=gC(a)|0;while(1){if(!b)break;d=c[(c[b+16>>2]|0)+112>>2]|0;if(!(c[d+4>>2]&1)){c[d+16>>2]=0;vz(a,b,e)}b=hC(a,b)|0}l=f;return e|0}function nz(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if((qB(a)|0)!=1){d=gC(a)|0;while(1){if(!d)break;b=0;e=ZA(a,d)|0;while(1){if(!e)break;b=b+1|0;e=_A(a,e,d)|0}if((b|0)==1)uz(d,d,0,0);d=hC(a,d)|0}b=0;f=0;d=gC(a)|0;while(1){if(!d)break;g=c[(c[d+16>>2]|0)+112>>2]|0;g=(c[g+32>>2]|0)+(c[g+16+12>>2]|0)|0;e=(g|0)>(b|0);b=e?g:b;f=e?d:f;d=hC(a,d)|0}b=_y()|0;e=f+16|0;d=(c[(c[e>>2]|0)+112>>2]|0)+16+4|0;while(1){d=c[d>>2]|0;if((d|0)==(f|0))break;az(b,0,d);d=c[(c[d+16>>2]|0)+112>>2]|0;g=d+4|0;c[g>>2]=c[g>>2]|16;d=d+16|0}az(b,0,f);g=c[(c[e>>2]|0)+112>>2]|0;a=g+4|0;c[a>>2]=c[a>>2]|16;if(c[g+32>>2]|0){a=_y()|0;d=(c[(c[e>>2]|0)+112>>2]|0)+24|0;while(1){d=c[d>>2]|0;if((d|0)==(f|0))break;az(a,0,d);d=c[(c[d+16>>2]|0)+112>>2]|0;g=d+4|0;c[g>>2]=c[g>>2]|16;d=d+16|0}hz(b,a)}}else{b=_y()|0;g=gC(a)|0;az(b,0,g);g=(c[(c[g+16>>2]|0)+112>>2]|0)+4|0;c[g>>2]=c[g>>2]|16}return b|0}function oz(a,b){a=a|0;b=b|0;var d=0;d=gC(a)|0;while(1){if(!d)break;if(!(c[(c[(c[d+16>>2]|0)+112>>2]|0)+4>>2]&16))tz(a,d,b);d=hC(a,d)|0}return}function pz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;g=l;l=l+16|0;f=g;d=rz(a,b)|0;c[f>>2]=d;a:do if(d){e=0;while(1){if((e|0)>=10)break a;a=sz(a,b,f)|0;h=d;d=c[f>>2]|0;if((h|0)==(d|0)|(d|0)==0)break;else e=e+1|0}}while(0);l=g;return a|0}function qz(a){a=a|0;var b=0.0,d=0.0,e=0.0,f=0;b=0.0;while(1){a=c[a>>2]|0;if(!a)break;f=c[(c[c[(c[(c[a>>2]|0)+16>>2]|0)+112>>2]>>2]|0)+16>>2]|0;d=+h[f+32>>3];d=d>b?d:b;e=+h[f+40>>3];b=e>d?e:d;a=a+4|0}return +b}function rz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;k=Hz()|0;e=gC(b)|0;while(1){if(!e)break;d=UA(b,e)|0;while(1){if(!d)break;c[c[(c[d+16>>2]|0)+120>>2]>>2]=0;d=WA(b,d)|0}e=hC(b,e)|0}j=1;d=0;while(1){h=c[a>>2]|0;if(!h)break;i=c[h>>2]|0;g=ZA(b,i)|0;while(1){if(!g)break;f=g+16|0;if((c[c[(c[f>>2]|0)+120>>2]>>2]|0)>0){a=eb[c[k>>2]&63](k,0,128)|0;while(1){if(!a)break;e=c[a+8>>2]|0;if((c[c[(c[e+16>>2]|0)+120>>2]>>2]|0)>(c[c[(c[f>>2]|0)+120>>2]>>2]|0)?(l=c[e>>2]&3,(c[((l|0)==2?e:e+-48|0)+40>>2]|0)!=(i|0)):0)d=((c[((l|0)==3?e:e+48|0)+40>>2]|0)!=(i|0)&1)+d|0;a=eb[c[k>>2]&63](k,a,8)|0}Nz(k,g)}g=_A(b,g,i)|0}e=ZA(b,i)|0;while(1){if(!e)break;a=c[(c[e+16>>2]|0)+120>>2]|0;if(!(c[a>>2]|0)){c[a>>2]=j;Mz(k,e)}e=_A(b,e,i)|0}a=h+4|0;j=j+1|0}Lz(k);return d|0}function sz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=c[d>>2]|0;k=gC(b)|0;a:while(1){if(!k)break;j=ZA(b,k)|0;while(1){if(!j)break;g=c[j>>2]&3;f=c[((g|0)==3?j:j+48|0)+40>>2]|0;if((f|0)==(k|0))f=c[((g|0)==2?j:j+-48|0)+40>>2]|0;i=0;while(1){if((i|0)>=2)break;h=ez(a)|0;fz(a,k,f,i);g=rz(a,b)|0;if((g|0)<(e|0)){$y(h);if(!g){e=0;break a}else e=g}else{$y(a);a=h}i=i+1|0}j=_A(b,j,k)|0}k=hC(b,k)|0}c[d>>2]=e;return a|0}function tz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=_y()|0;e=UA(a,b)|0;while(1){if(!e)break;h=e+-48|0;az(j,0,c[((c[e>>2]&3|0)==2?e:h)+40>>2]|0);h=(c[(c[(c[((c[e>>2]&3|0)==2?e:h)+40>>2]|0)+16>>2]|0)+112>>2]|0)+4|0;c[h>>2]=c[h>>2]|32;e=WA(a,e)|0}e=XA(a,b)|0;while(1){if(!e)break;h=e+48|0;az(j,0,c[((c[e>>2]&3|0)==3?e:h)+40>>2]|0);h=(c[(c[(c[((c[e>>2]&3|0)==3?e:h)+40>>2]|0)+16>>2]|0)+112>>2]|0)+4|0;c[h>>2]=c[h>>2]|32;e=YA(a,e)|0}a:do if((gz(j)|0)>1){f=c[d>>2]|0;g=d+4|0;a=f;while(1){if(!a){i=16;break a}h=a+4|0;if((a|0)==(c[g>>2]|0))e=f;else e=c[h>>2]|0;if(c[(c[(c[(c[a>>2]|0)+16>>2]|0)+112>>2]|0)+4>>2]&32|0?c[(c[(c[(c[e>>2]|0)+16>>2]|0)+112>>2]|0)+4>>2]&32|0:0)break;a=c[h>>2]|0}az(d,a,b)}else i=16;while(0);b:do if((i|0)==16){c:do if((gz(j)|0)>0){e=d;while(1){e=c[e>>2]|0;if(!e)break c;if(c[(c[(c[(c[e>>2]|0)+16>>2]|0)+112>>2]|0)+4>>2]&32|0)break;e=e+4|0}az(d,e,b);break b}while(0);az(d,0,b)}while(0);e=j;while(1){e=c[e>>2]|0;if(!e)break;d=(c[(c[(c[e>>2]|0)+16>>2]|0)+112>>2]|0)+4|0;c[d>>2]=c[d>>2]&-33;e=e+4|0}$y(j);return}function uz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=e;e=c[(c[b+16>>2]|0)+112>>2]|0;while(1){e=c[e+16>>2]|0;if(!e)break;k=d+1|0;e=c[(c[e+16>>2]|0)+112>>2]|0;h=e+16|0;g=h+12|0;b=c[g>>2]|0;h=h+4|0;if(b){i=e+24|0;j=e+32|0;if((b|0)>(d|0)){l=10;break}d=c[h>>2]|0;if((d|0)!=(f|0)){if(!((c[j>>2]|0)!=0?(c[i>>2]|0)==(f|0):0))f=d;c[i>>2]=d;c[j>>2]=b}}c[h>>2]=a;c[g>>2]=k;d=k}if((l|0)==10?(c[j>>2]|0)<=(d|0):0){c[i>>2]=a;c[j>>2]=k}return}function vz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=(c[(c[b+16>>2]|0)+112>>2]|0)+4|0;c[g>>2]=c[g>>2]|1;g=ZA(a,b)|0;while(1){if(!g)break;f=c[g>>2]&3;e=c[((f|0)==2?g:g+-48|0)+40>>2]|0;if((e|0)==(b|0))e=c[((f|0)==3?g:g+48|0)+40>>2]|0;f=e+16|0;if(!(c[(c[(c[f>>2]|0)+112>>2]|0)+4>>2]&1)){jB(d,g,1)|0;c[(c[(c[f>>2]|0)+112>>2]|0)+16>>2]=b;vz(a,e,d)}g=_A(a,g,b)|0}return}function wz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;j=l;l=l+144|0;i=j+8|0;h=j;d=j+16|0;g=c[46976]|0;c[46976]=g+1;c[h>>2]=g;i2(d,96613,h)|0;h=LD(a,d,1)|0;RC(h,137786,280,1)|0;g=c[46976]|0;c[46976]=g+1;c[i>>2]=g;i2(d,96613,i)|0;c[i>>2]=c[a+24>>2];i=lB(d,i,0)|0;d=gC(a)|0;while(1){if(!d)break;lC(h,d,1)|0;g=qC(i,HB(d)|0,1)|0;RC(g,137750,304,1)|0;c[(c[(c[d+16>>2]|0)+112>>2]|0)+16>>2]=g;d=hC(a,d)|0}e=gC(a)|0;while(1){if(!e)break;f=c[(c[(c[e+16>>2]|0)+112>>2]|0)+16>>2]|0;g=f+16|0;d=UA(a,e)|0;while(1){if(!d)break;jB(h,d,1)|0;k=c[(c[(c[(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0)+16>>2]|0;m=fB(i,f,k,0,1)|0;RC(m,137763,176,1)|0;c[(c[m+16>>2]|0)+116>>2]=d;m=(c[g>>2]|0)+236|0;c[m>>2]=(c[m>>2]|0)+1;k=(c[k+16>>2]|0)+236|0;c[k>>2]=(c[k>>2]|0)+1;d=WA(a,d)|0}e=hC(a,e)|0}c[b>>2]=i;l=j;return h|0}function xz(a){a=a|0;var b=0,c=0;c=zz()|0;b=gC(a)|0;while(1){if(!b)break;Ez(c,b);b=hC(a,b)|0}return c|0}function yz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;m=c[(c[b+16>>2]|0)+236>>2]|0;p=m<<2;o=IK(p)|0;p=IK(p)|0;i=0;l=ZA(a,b)|0;n=0;f=0;while(1){if(!l)break;e=c[l>>2]&3;g=c[((e|0)==2?l:l+-48|0)+40>>2]|0;if((g|0)==(b|0))g=c[((e|0)==3?l:l+48|0)+40>>2]|0;h=0;k=ZA(a,b)|0;j=i;while(1){if(!k)break;if((k|0)!=(l|0)){i=c[k>>2]&3;e=c[((i|0)==2?k:k+-48|0)+40>>2]|0;if((e|0)==(b|0))e=c[((i|0)==3?k:k+48|0)+40>>2]|0;i=fB(a,g,e,0,0)|0;if(i)if(g>>>0>>0){e=j+1|0;h=i+16|0;i=c[(c[h>>2]|0)+116>>2]|0;if(!i)h=1;else{tC(d,i)|0;c[(c[h>>2]|0)+116>>2]=0;h=1}}else{h=1;e=j}else e=j}else e=j;k=_A(a,k,b)|0;j=e}if(!h){c[p+(n<<2)>>2]=g;e=n+1|0}else{c[o+(f<<2)>>2]=g;e=n;f=f+1|0}i=j;l=_A(a,l,b)|0;n=e}e=m+-1-i|0;a:do if((e|0)>0){if((e|0)<(n|0))g=0;else{if((e|0)!=(n|0))break;f=c[o>>2]|0;g=f+16|0;e=0;while(1){if((e|0)>=(n|0))break a;m=c[p+(e<<2)>>2]|0;RC(fB(a,f,m,0,1)|0,137763,176,1)|0;d=(c[g>>2]|0)+236|0;c[d>>2]=(c[d>>2]|0)+1;m=(c[m+16>>2]|0)+236|0;c[m>>2]=(c[m>>2]|0)+1;e=e+1|0}}while(1){if((g|0)>=(n|0)){f=2;break}f=g|1;if((f|0)>=(n|0)){f=2;break}d=c[p+(g<<2)>>2]|0;m=c[p+(f<<2)>>2]|0;RC(fB(a,d,m,0,1)|0,137763,176,1)|0;d=(c[d+16>>2]|0)+236|0;c[d>>2]=(c[d>>2]|0)+1;m=(c[m+16>>2]|0)+236|0;c[m>>2]=(c[m>>2]|0)+1;g=g+2|0;e=e+-1|0}while(1){if((e|0)<=0)break a;m=c[p>>2]|0;n=c[p+(f<<2)>>2]|0;RC(fB(a,m,n,0,1)|0,137763,176,1)|0;m=(c[m+16>>2]|0)+236|0;c[m>>2]=(c[m>>2]|0)+1;n=(c[n+16>>2]|0)+236|0;c[n>>2]=(c[n>>2]|0)+1;f=f+1|0;e=e+-1|0}}while(0);l6(p);l6(o);return}function zz(){return Sz(18280,c[4591]|0)|0}function Az(a,b,d){a=a|0;b=b|0;d=d|0;d=IK(16)|0;c[d+12>>2]=0;c[d+8>>2]=c[b+8>>2];return d|0}function Bz(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function Cz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=c[b>>2]|0;e=c[d>>2]|0;return ((b|0)<(e|0)?-1:(b|0)>(e|0)&1)|0}function Dz(a){a=a|0;Oz(a)|0;return}function Ez(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;f=d;e=b+16|0;c[f+8>>2]=c[(c[e>>2]|0)+236>>2];a=(eb[c[a>>2]&63](a,f,1)|0)+12|0;c[(c[e>>2]|0)+164>>2]=c[a>>2];c[a>>2]=b;l=d;return}function Fz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;e=b+16|0;c[f+8>>2]=c[(c[e>>2]|0)+236>>2];f=eb[c[a>>2]&63](a,f,4)|0;if(!f)Aa(96623,96626,107,96636);d=f+12|0;g=c[d>>2]|0;if((g|0)==(b|0)){b=c[(c[e>>2]|0)+164>>2]|0;c[d>>2]=b;if(!b)eb[c[a>>2]&63](a,f,2)|0}else{f=g;d=g+16|0;while(1){a=c[(c[d>>2]|0)+164>>2]|0;e=(a|0)!=0;d=a+16|0;if(!(e&(a|0)!=(b|0)))break;else f=a}if(e)c[(c[f+16>>2]|0)+164>>2]=c[(c[d>>2]|0)+164>>2]}l=h;return}function Gz(a){a=a|0;var b=0,d=0,e=0,f=0;d=eb[c[a>>2]&63](a,0,128)|0;if(d){f=d+12|0;b=c[f>>2]|0;e=c[(c[b+16>>2]|0)+164>>2]|0;c[f>>2]=e;if(!e)eb[c[a>>2]&63](a,d,2)|0}else b=0;return b|0}function Hz(){return Sz(18316,c[4591]|0)|0}function Iz(a,b,d){a=a|0;b=b|0;d=d|0;d=IK(12)|0;c[d+8>>2]=c[b+8>>2];return d|0}function Jz(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function Kz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=c[b>>2]|0;e=c[d>>2]|0;return (b>>>0>e>>>0?1:(b>>>0>>0)<<31>>31)|0}function Lz(a){a=a|0;Oz(a)|0;return}function Mz(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e+8>>2]=b;eb[c[a>>2]&63](a,e,1)|0;l=d;return}function Nz(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e+8>>2]=b;eb[c[a>>2]&63](a,e,2)|0;l=d;return}function Oz(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;do if((a|0)!=0?(c[a+24>>2]|0)<=0:0){h=c[a+4>>2]|0;g=h+32|0;b=c[g>>2]|0;if(b){b=tb[b&127](a,2,0,h)|0;if((b|0)<0){b=-1;break}}else b=0;if(c[a+28>>2]|0)Xz(a,0)|0;e=(b|0)==0;f=a+12|0;if(e){eb[c[c[a+16>>2]>>2]&63](a,0,64)|0;if((Uz(a)|0)>0){b=-1;break}d=a+8|0;b=c[d>>2]|0;if((c[b+12>>2]|0)>0){tb[c[f>>2]&127](a,c[b+8>>2]|0,0,h)|0;b=c[d>>2]|0}tb[c[f>>2]&127](a,b,0,h)|0}b=c[a+20>>2]|0;if(b){if(e&(b|0)==1)tb[c[f>>2]&127](a,a,0,h)|0}else l6(a);b=c[g>>2]|0;if(!b)b=0;else{tb[b&127](a,6,0,h)|0;b=0}}else b=-1;while(0);return b|0}function Pz(a){a=a|0;var b=0,d=0,e=0;e=a+8|0;b=c[e>>2]|0;d=c[b>>2]|0;a:do if(!(d&12)){if(!(d&3)){d=b+8|0;a=c[d>>2]|0;c[d>>2]=0;break}a=Qz(a)|0;d=c[e>>2]|0;b=c[d+8>>2]|0;d=b+(c[d+12>>2]<<2)|0;while(1){if(b>>>0>=d>>>0)break a;c[b>>2]=0;b=b+4|0}}else a=c[b+4>>2]|0;while(0);e=c[e>>2]|0;c[e>>2]=c[e>>2]&-4097;c[e+16>>2]=0;c[e+4>>2]=0;return a|0}function Qz(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=a+8|0;b=c[g>>2]|0;d=c[b>>2]|0;e=b+4|0;if(!(d&4096)){a=b+8|0;a:do if(!(d&3)){if(d&112|0){a=c[a>>2]|0;break}a=c[e>>2]|0;if(!a)a=0;else{while(1){b=a+4|0;d=c[b>>2]|0;if(!d){e=a;break}c[b>>2]=c[d>>2];c[d>>2]=a;a=d}while(1){b=c[e>>2]|0;if(!b)break a;d=c[b+4>>2]|0;if(!d){e=b;continue}while(1){c[b+4>>2]=c[d>>2];c[d>>2]=b;b=c[d+4>>2]|0;if(!b)break;else{f=d;d=b;b=f}}c[e>>2]=d;e=d}}}else{e=c[a>>2]|0;f=e+(c[b+12>>2]<<2)|0;b=0;a=0;while(1){if(e>>>0>=f>>>0)break a;d=c[e>>2]|0;if(d){if(!b){b=d;a=d}else c[b>>2]=d;while(1){d=c[b>>2]|0;if(!d)break;else b=d}c[e>>2]=b}e=e+4|0}}while(0);g=c[g>>2]|0;c[g+4>>2]=a;c[g>>2]=c[g>>2]|4096}else a=c[e>>2]|0;return a|0}function Rz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;t=a+8|0;if(c[c[t>>2]>>2]&4096|0)Tz(a,0)|0;s=c[a+4>>2]|0;k=c[s>>2]|0;l=c[s+4>>2]|0;p=s+8|0;i=c[p>>2]|0;m=c[s+20>>2]|0;n=a+20|0;f=c[n>>2]&-32769;c[n>>2]=f;q=s+16|0;v=0-i|0;r=a+12|0;w=(i|0)<0;o=(d&4098|0)!=0;a:do if(!b){if(d&384|0){f=c[t>>2]|0;e=c[f+8>>2]|0;if(!e){e=0;break}if(d&256){e=c[e+4>>2]|0;c[f+4>>2]=e;if(!e){e=0;break}}else c[f+4>>2]=e;if(w){e=c[e+8>>2]|0;break}else{e=e+v|0;break}}if(o){e=c[t>>2]|0;if(c[e>>2]&144|0){e=0;break}e=c[e+8>>2]|0;if(!e){e=0;break}else{i=e;u=86;break}}if(!(d&64))e=0;else{b:do if((c[q>>2]|0)!=0|w){e=c[(c[t>>2]|0)+8>>2]|0;while(1){if(!e)break b;f=c[e>>2]|0;g=c[q>>2]|0;if(g|0){if(w)h=c[e+8>>2]|0;else h=e+v|0;rb[g&127](a,h,s)}if((c[p>>2]|0)>=0){e=f;continue}tb[c[r>>2]&127](a,e,0,s)|0;e=f}}while(0);e=c[t>>2]|0;c[e+4>>2]=0;c[e+8>>2]=0;c[(c[t>>2]|0)+16>>2]=0;e=0}}else{if(d&2049|0){g=s+12|0;e=c[g>>2]|0;h=(d&1|0)==0;if(!(h|(e|0)==0)){e=eb[e&63](a,b,s)|0;if(!e){e=0;break}else f=e}else f=b;do if((i|0)>-1)b=f+i|0;else{e=tb[c[r>>2]&127](a,0,12,s)|0;if(e|0){c[e+8>>2]=f;b=e;break}if(!(c[g>>2]|0)){e=0;break a}e=c[q>>2]|0;if(h|(e|0)==0){e=0;break a}rb[e&127](a,f,s);e=0;break a}while(0);e=c[t>>2]|0;f=c[e>>2]|0;g=(d&8192|0)!=0;i=b+4|0;h=e+8|0;do if(!(f&128)){if(!(f&16))if(!(f&32)){u=52;break}else{u=48;break}f=c[e+4>>2]|0;e=(f|0)!=0;if(g){if(!e){u=52;break}e=c[f>>2]|0;if(!e){u=52;break}c[b>>2]=e;c[e+4>>2]=b;c[i>>2]=f;c[f>>2]=b;break}else{if(!e){u=48;break}e=c[h>>2]|0;if((f|0)==(e|0)){u=49;break}d=f+4|0;s=c[d>>2]|0;c[i>>2]=s;c[s>>2]=b;c[b>>2]=f;c[d>>2]=b;break}}else if(g)u=52;else u=48;while(0);if((u|0)==48){e=c[h>>2]|0;u=49}else if((u|0)==52){e=c[h>>2]|0;if(!e){c[h>>2]=b;e=b}else{d=e+4|0;c[c[d>>2]>>2]=b;c[i>>2]=c[d>>2]}c[e+4>>2]=b;c[b>>2]=0}if((u|0)==49){c[b>>2]=e;if(!e)e=b;else c[i>>2]=c[e+4>>2];c[e+4>>2]=b;c[(c[t>>2]|0)+8>>2]=b}e=c[t>>2]|0;f=e+16|0;g=c[f>>2]|0;if((g|0)>-1)c[f>>2]=g+1;c[e+4>>2]=b;if(w){e=c[b+8>>2]|0;break}else{e=b+v|0;break}}do if(!(d&512)){h=c[t>>2]|0;e=c[h+4>>2]|0;if(e|0){if(w)g=c[e+8>>2]|0;else g=e+v|0;if((g|0)==(b|0))break}e=b+k|0;if((l|0)<0){b=c[e>>2]|0;j=1;u=70}else{b=e;j=0;u=70}}else{h=c[t>>2]|0;j=(l|0)<0;u=70}while(0);if((u|0)==70){g=(m|0)==0;i=(l|0)<1;e=h+8|0;do{e=c[e>>2]|0;if(!e){e=0;break a}if(w)f=c[e+8>>2]|0;else f=e+v|0;f=f+k|0;if(j)f=c[f>>2]|0;do if(g)if(i){f=f2(b,f)|0;break}else{f=g2(b,f,l)|0;break}else f=tb[m&127](a,b,f,s)|0;while(0)}while((f|0)!=0);f=c[n>>2]|0}c[n>>2]=f|32768;if(!o){f=c[t>>2]|0;do if(!(d&8)){if(!(d&16)){c[f+4>>2]=e;break}if((e|0)==(c[f+8>>2]|0)){c[f+4>>2]=0;e=0;break a}else{e=e+4|0;u=110;break}}else u=110;while(0);if((u|0)==110){e=c[e>>2]|0;c[f+4>>2]=e;if(!e){e=0;break}}if(w){e=c[e+8>>2]|0;break}else{e=e+v|0;break}}else{i=e;u=86}}while(0);if((u|0)==86){e=c[i>>2]|0;g=i+4|0;if(e){c[e+4>>2]=c[g>>2];e=c[i>>2]|0}f=(c[t>>2]|0)+8|0;u=c[f>>2]|0;h=u+4|0;if((i|0)==(u|0)){c[f>>2]=e;e=c[(c[t>>2]|0)+8>>2]|0;if(e|0)c[e+4>>2]=c[h>>2]}else{c[c[g>>2]>>2]=e;if((i|0)==(c[h>>2]|0))c[h>>2]=c[g>>2]}e=c[t>>2]|0;f=e+4|0;if((i|0)==(c[f>>2]|0))g=c[i>>2]|0;else g=0;c[f>>2]=g;u=e+16|0;c[u>>2]=(c[u>>2]|0)+-1;if(w)e=c[i+8>>2]|0;else e=i+v|0;f=c[q>>2]|0;if(!((d&2|0)==0|(f|0)==0))rb[f&127](a,e,s);if((c[p>>2]|0)<0)tb[c[r>>2]&127](a,i,0,s)|0}return e|0}function Sz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;h=k;a:do if((a|0)!=0&(b|0)!=0?(f=k6(40)|0,(f|0)!=0):0){c[f>>2]=0;c[f+16>>2]=0;c[f+4>>2]=0;_z(f,a,0)|0;d=f+20|0;j=a+32|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;d=c[j>>2]|0;g=b+4|0;do if(d){c[h>>2]=0;d=tb[d&127](f,1,h,a)|0;if((d|0)>=0)if(d){e=c[h>>2]|0;if(e|0)if(!(c[g>>2]&c[e>>2])){d=f;i=12;break}else{d=f;break}d=a+28|0;if(!(c[d>>2]|0)){d=f;i=12}else{l6(f);e=tb[c[d>>2]&127](0,0,40,a)|0;if(!e){d=0;break a}c[e>>2]=0;c[e+16>>2]=0;c[e+4>>2]=0;_z(e,a,0)|0;c[e+20>>2]=1;c[e+24>>2]=0;c[e+32>>2]=0;c[e+28>>2]=0;d=e;f=e;i=11}}else{d=f;i=11}else{d=f;i=12}}else{d=f;i=11}while(0);if((i|0)==11){e=tb[c[d+12>>2]&127](d,0,28,a)|0;c[h>>2]=e;if(!e){d=f;i=12}else{c[e>>2]=c[g>>2];h=e+4|0;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0}}if((i|0)==12){l6(d);d=0;break}c[d+8>>2]=e;c[d>>2]=c[b>>2];c[d+16>>2]=b;e=c[j>>2]|0;if(e)tb[e&127](d,5,f,a)|0}else d=0;while(0);l=k;return d|0}function Tz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=c[c[a+16>>2]>>2]|0;j=a+8|0;f=c[j>>2]|0;g=c[f>>2]|0;d=f+4|0;e=f+16|0;if(!b)if(!(g&4096))b=-1;else{h=1;b=c[d>>2]|0;k=5}else if(!(c[e>>2]|0)){h=0;k=5}else b=-1;a:do if((k|0)==5){c[f>>2]=g&-4097;if(!(g&3)){if(!(g&12)){c[d>>2]=0;d=f+8|0}c[d>>2]=b;if(h){b=0;break}c[(c[j>>2]|0)+16>>2]=-1;b=0;break}c[d>>2]=0;if(!h){c[e>>2]=0;while(1){if(!b){b=0;break a}k=c[b>>2]|0;eb[i&63](a,b,32)|0;b=k}}e=c[f+8>>2]|0;f=e+(c[f+12>>2]<<2)|0;while(1){if(e>>>0>=f>>>0){b=0;break a}d=c[e>>2]|0;if(d){c[e>>2]=b;b=c[d>>2]|0;c[d>>2]=0}e=e+4|0}}while(0);return b|0}function Uz(a){a=a|0;var b=0,d=0,e=0;b=a+8|0;d=c[b>>2]|0;if(c[d>>2]&4096){Tz(a,0)|0;d=c[b>>2]|0}e=d+16|0;a=c[e>>2]|0;do if((a|0)<0){b=c[d>>2]|0;if(b&12|0){a=Vz(c[d+4>>2]|0)|0;c[e>>2]=a;break}if(b&112){a=0;b=d+8|0;while(1){b=c[b>>2]|0;if(!b)break;a=a+1|0}c[e>>2]=a}}while(0);return a|0}function Vz(a){a=a|0;var b=0;if(!a)return 0;else{b=Vz(c[a+4>>2]|0)|0;return b+1+(Vz(c[a>>2]|0)|0)|0}return 0}function Wz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;Q=l;l=l+128|0;F=Q+120|0;p=Q;P=a+8|0;e=c[P>>2]|0;if(c[e>>2]&4096){Tz(a,0)|0;e=c[P>>2]|0}M=c[a+4>>2]|0;J=c[M>>2]|0;K=c[M+4>>2]|0;y=M+8|0;v=c[y>>2]|0;L=c[M+20>>2]|0;t=a+20|0;c[t>>2]=c[t>>2]&-32769;h=c[e+4>>2]|0;B=a+12|0;A=M+16|0;N=0-v|0;O=(v|0)<0;j=(h|0)!=0;a:do if(!b)if((d&448|0)==0|j^1)e=0;else{if(!(d&64)){b:do if(!(d&256)){e=h;while(1){f=e+4|0;g=c[f>>2]|0;if(!g)break b;c[f>>2]=c[g>>2];c[g>>2]=e;e=g}}else{e=h;while(1){f=c[e>>2]|0;if(!f)break b;a=f+4|0;c[e>>2]=c[a>>2];c[a>>2]=e;e=f}}while(0);c[(c[P>>2]|0)+4>>2]=e;if(O){e=c[e+8>>2]|0;break}else{e=e+N|0;break}}if((c[A>>2]|0)!=0|O){e=h;do{h=e;while(1){e=h+4|0;f=c[e>>2]|0;if(!f)break;c[e>>2]=c[f>>2];c[f>>2]=h;h=f}e=c[h>>2]|0;f=c[A>>2]|0;if(f|0){if(O)g=c[h+8>>2]|0;else g=h+N|0;rb[f&127](a,g,M)}if((c[y>>2]|0)<0)tb[c[B>>2]&127](a,h,0,M)|0}while((e|0)!=0);e=c[P>>2]|0}c[e+16>>2]=0;c[e+4>>2]=0;e=0}else{D=a+16|0;G=(K|0)<0;E=F+4|0;u=(d&4098|0)!=0;H=(L|0)!=0;C=(d&2|0)!=0;I=(K|0)<1;i=b+J|0;c:do if((c[(c[D>>2]|0)+4>>2]|0)!=8|u^1)x=44;else{if(G)g=c[i>>2]|0;else g=i;f=eb[c[a>>2]&63](a,b,4)|0;while(1){if(!f){x=44;break c}e=f+J|0;if(G)e=c[e>>2]|0;do if(!H)if(I){e=f2(g,e)|0;break}else{e=g2(g,e,K)|0;break}else e=tb[L&127](a,g,e,M)|0;while(0);if(e|0){x=44;break c}if((f|0)==(b|0))break;f=eb[c[a>>2]&63](a,f,8)|0}h=c[(c[P>>2]|0)+4>>2]|0;c[F>>2]=c[h+4>>2];c[E>>2]=c[h>>2];e=F;x=174}while(0);d:do if((x|0)==44){z=(d&516|0)!=0;s=(d&32|0)!=0;do if(!(d&2565)){if(s){if(O)g=c[b+8>>2]|0;else g=b+N|0;e=g+J|0;if(G)e=c[e>>2]|0;if(j){r=b;q=e;m=b;x=62;break}else{e=b;o=F;n=F;h=0;m=b;break}}if(j){if(O)e=c[h+8>>2]|0;else e=h+N|0;if((e|0)!=(b|0))if(G){g=b;r=0;q=c[i>>2]|0;m=0;x=62}else{g=b;r=0;q=i;m=0;x=62}else{g=b;e=0;o=F;n=F;m=0}}else{g=b;e=0;o=F;n=F;h=0;m=0}}else{e=(d&512|0)!=0;if(e|G^1)e=e?b:i;else e=c[i>>2]|0;if(j){g=b;r=0;q=e;m=0;x=62}else{g=b;e=0;o=F;n=F;h=0;m=0}}while(0);e:do if((x|0)==62){f:do if((c[(c[D>>2]|0)+4>>2]|0)==4?(o=c[(c[P>>2]|0)+24>>2]|0,!((o|0)==0|z^1)):0){i=0;j=h;while(1){if((i|0)>=(o|0)){f=F;n=F;k=0;break}b=j+8|0;e=j+N|0;if(O)f=c[b>>2]|0;else f=e;f=f+J|0;if(G)f=c[f>>2]|0;do if(!H)if(I){f=f2(q,f)|0;break}else{f=g2(q,f,K)|0;break}else f=tb[L&127](a,q,f,M)|0;while(0);if(!f){x=75;break}c[p+(i<<2)>>2]=f;j=c[((f|0)<0?j+4|0:j)>>2]|0;if(!j){e=0;break a}else i=i+1|0}if((x|0)==75){if(!O)break a;e=c[b>>2]|0;break a}while(1){if((k|0)>=(o|0)){e=h;break f}j=f+4|0;b=c[p+((k|1)<<2)>>2]|0;do if((c[p+(k<<2)>>2]|0)<0){e=h+4|0;i=c[e>>2]|0;if((b|0)<0){c[e>>2]=c[i>>2];c[i>>2]=h;c[j>>2]=i;f=i;h=n;e=i+4|0;break}else{c[n>>2]=i;c[j>>2]=h;f=h;h=i;e=i;break}}else{i=c[h>>2]|0;e=i+4|0;if((b|0)>0){c[h>>2]=c[e>>2];c[e>>2]=h;c[n>>2]=i;h=i;e=i;break}else{c[j>>2]=i;c[n>>2]=h;f=i;break}}while(0);n=h;k=k+2|0;h=c[e>>2]|0}}else{f=F;n=F;e=h}while(0);g:while(1){i=f;h=e;while(1){if(O)e=c[h+8>>2]|0;else e=h+N|0;e=e+J|0;if(G)e=c[e>>2]|0;do if(!H)if(I){e=f2(q,e)|0;break}else{e=g2(q,e,K)|0;break}else e=tb[L&127](a,q,e,M)|0;while(0);if(!e){e=r;o=i;break e}j=i+4|0;if((e|0)>=0)break;f=h+4|0;i=c[f>>2]|0;if(!i){x=115;break g}if(O)e=c[i+8>>2]|0;else e=i+N|0;e=e+J|0;if(G)e=c[e>>2]|0;do if(!H)if(I){e=f2(q,e)|0;break}else{e=g2(q,e,K)|0;break}else e=tb[L&127](a,q,e,M)|0;while(0);if((e|0)>=0){x=112;break}c[f>>2]=c[i>>2];c[i>>2]=h;c[j>>2]=i;h=c[i+4>>2]|0;if(!h){e=r;o=i;h=0;break e}}if((x|0)==112){x=0;if(!e){x=113;break}c[n>>2]=i;c[j>>2]=h;e=c[i>>2]|0;if(!e){e=r;o=h;n=i;h=0;break e}else{f=h;n=i;continue}}b=c[h>>2]|0;if(!b){x=133;break}if(O)e=c[b+8>>2]|0;else e=b+N|0;e=e+J|0;if(G)e=c[e>>2]|0;do if(!H)if(I){e=f2(q,e)|0;break}else{e=g2(q,e,K)|0;break}else e=tb[L&127](a,q,e,M)|0;while(0);f=b+4|0;if((e|0)>0){c[h>>2]=c[f>>2];c[f>>2]=h;c[n>>2]=b;e=c[b>>2]|0;if(!e){e=r;o=i;n=b;h=0;break e}else{f=i;n=b;continue}}if(!e){x=131;break}c[j>>2]=b;c[n>>2]=h;e=c[f>>2]|0;if(!e){e=r;o=b;n=h;h=0;break e}else{f=b;n=h}}if((x|0)==113){c[j>>2]=h;e=r;o=h;h=i;break}else if((x|0)==115){c[j>>2]=h;e=r;o=h;h=0;break}else if((x|0)==131){c[n>>2]=h;e=r;o=i;n=h;h=b;break}else if((x|0)==133){c[n>>2]=h;e=r;o=i;n=h;h=0;break}}while(0);i=o+4|0;j=(d&8|0)!=0;b=(d&2049|0)!=0;k=(d&16|0)!=0;do if(!h){c[i>>2]=0;c[n>>2]=0;if(!j)if(!k){if(z){e=o;break d}if(b)x=199;else{if(!s){g=0;e=o;break d}C=(c[P>>2]|0)+16|0;c[C>>2]=(c[C>>2]|0)+1}}else x=169;else x=163}else{c[t>>2]=c[t>>2]|32768;f=h+4|0;c[n>>2]=c[f>>2];c[i>>2]=c[h>>2];if(!z){if(j){c[f>>2]=c[F>>2];c[h>>2]=0;c[F>>2]=h;x=163;break}if(k){c[h>>2]=c[E>>2];c[f>>2]=0;c[E>>2]=h;x=169;break}if(u){e=o;x=174;break d}if(b){if(c[(c[D>>2]|0)+4>>2]&4|0){e=h;break}c[f>>2]=0;c[h>>2]=c[E>>2];c[E>>2]=h;x=199;break}if(!s){e=0;break a}if(!(c[(c[D>>2]|0)+4>>2]&4)){c[e+4>>2]=0;c[e>>2]=c[E>>2];c[E>>2]=m;e=(c[P>>2]|0)+16|0;c[e>>2]=(c[e>>2]|0)+1;e=h;break}e=c[A>>2]|0;if(e|0)rb[e&127](a,g,M);if((c[y>>2]|0)<0){tb[c[B>>2]&127](a,m,0,M)|0;e=h}else e=h}else e=h}while(0);if((x|0)==163){e=c[E>>2]|0;if(!e){e=o;break}while(1){f=e+4|0;g=c[f>>2]|0;if(!g)break;c[f>>2]=c[g>>2];c[g>>2]=e;e=g}c[E>>2]=c[e>>2]}else if((x|0)==169){e=c[F>>2]|0;if(!e){e=o;break}while(1){f=c[e>>2]|0;if(!f)break;C=f+4|0;c[e>>2]=c[C>>2];c[C>>2]=e;e=f}c[F>>2]=c[e+4>>2]}else if((x|0)==199){i=M+12|0;e=c[i>>2]|0;f=(d&1|0)==0;if(!(f|(e|0)==0))g=eb[e&63](a,g,M)|0;do if(g){if((v|0)>-1){e=g+v|0;x=209;break}e=tb[c[B>>2]&127](a,0,12,M)|0;if(e|0){c[e+8>>2]=g;break}if((c[i>>2]|0)!=0?(w=c[A>>2]|0,!(f|(w|0)==0)):0){rb[w&127](a,g,M);x=209}else x=209}else{e=h;x=209}while(0);if((x|0)==209)if(!e){e=o;break}f=(c[P>>2]|0)+16|0;g=c[f>>2]|0;if((g|0)>-1)c[f>>2]=g+1}c[e+4>>2]=c[F>>2];c[e>>2]=c[E>>2];h:do if(!((c[(c[D>>2]|0)+4>>2]&8|0)==0|z^1)){if(O)f=c[e+8>>2]|0;else f=e+N|0;f=f+J|0;if(G)f=c[f>>2]|0;while(1){i=e+4|0;g=c[i>>2]|0;if(!g)break h;while(1){h=c[g>>2]|0;if(!h)break;F=h+4|0;c[g>>2]=c[F>>2];c[F>>2]=g;g=h}c[i>>2]=g;if(O)h=c[g+8>>2]|0;else h=g+N|0;h=h+J|0;if(G)h=c[h>>2]|0;do if(!H)if(I){h=f2(f,h)|0;break}else{h=g2(f,h,K)|0;break}else h=tb[L&127](a,f,h,M)|0;while(0);if(h|0)break h;c[i>>2]=c[g>>2];c[g>>2]=e;e=g}}while(0);c[(c[P>>2]|0)+4>>2]=e;if(O){e=c[e+8>>2]|0;break a}else{e=e+N|0;break a}}while(0);if((x|0)==174){if(O)g=c[h+8>>2]|0;else g=h+N|0;f=c[A>>2]|0;if(!((f|0)==0|C^1))rb[f&127](a,g,M);if((c[y>>2]|0)<0)tb[c[B>>2]&127](a,h,0,M)|0;O=(c[P>>2]|0)+16|0;N=c[O>>2]|0;c[O>>2]=(N|0)<1?-1:N+-1|0}do{f=e+4|0;e=c[f>>2]|0}while((e|0)!=0);c[f>>2]=c[F>>2];c[(c[P>>2]|0)+4>>2]=c[E>>2];e=C?g:0}while(0);l=Q;return e|0}function Xz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if(c[c[a+8>>2]>>2]&4096|0)Tz(a,0)|0;f=(b|0)!=0;g=a+16|0;if(f){if(c[c[b+8>>2]>>2]&4096|0)Tz(b,0)|0;if((c[b+16>>2]|0)==(c[g>>2]|0)){d=b;e=7}else b=0}else{d=0;e=7}a:do if((e|0)==7){while(1){if(!d)break;if((d|0)==(a|0)){b=0;break a}d=c[d+28>>2]|0;e=7}d=a+28|0;e=c[d>>2]|0;if(e|0){h=e+24|0;c[h>>2]=(c[h>>2]|0)+-1}c[a+32>>2]=0;c[d>>2]=0;if(f){c[d>>2]=b;c[a>>2]=31;h=b+24|0;c[h>>2]=(c[h>>2]|0)+1;break}else{c[a>>2]=c[c[g>>2]>>2];b=e;break}}while(0);return b|0}function Yz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=a+16|0;a:do if(!(d&99)){p=a+32|0;if((d&516|0)==0?(e=(c[(c[f>>2]|0)+4>>2]&12|0)!=0,(d&384|0)==0|e):0){if(e){if(!(d&408)){e=0;break}n=(d&136|0)!=0;o=(d&272|0)!=0;m=0;f=0;e=0;while(1){if(!a)break;l=eb[c[c[a+16>>2]>>2]&63](a,b,d)|0;do if(!l)g=m;else{h=c[a+4>>2]|0;i=c[h+4>>2]|0;j=c[h+20>>2]|0;g=l+(c[h>>2]|0)|0;if((i|0)<0)k=c[g>>2]|0;else k=g;if(e|0){do if(!j)if((i|0)<1){g=f2(k,f)|0;break}else{g=g2(k,f,i)|0;break}else g=tb[j&127](a,k,f,h)|0;while(0);if(!(n&(g|0)<0|o&(g|0)>0)){g=m;break}}g=a;f=k;e=l}while(0);m=g;a=c[a+28>>2]|0}c[p>>2]=m;break}if(!(d&24)){e=0;break}f=c[p>>2]|0;if(f){e=c[(c[f+4>>2]|0)+8>>2]|0;g=c[(c[f+8>>2]|0)+4>>2]|0;if((e|0)<0)e=c[g+8>>2]|0;else e=g+(0-e)|0;if((e|0)==(b|0))e=b;else{f=a;h=32}}else{f=a;h=32}do if((h|0)==32){while(1){if(!f){h=33;break}e=eb[c[c[f+16>>2]>>2]&63](f,b,4)|0;if(e|0){h=36;break}f=c[f+28>>2]|0;h=32}if((h|0)==33){c[p>>2]=0;e=0;break a}else if((h|0)==36){c[p>>2]=f;break}}while(0);i=(d<<4&128^128)+128|0;e=eb[c[c[f+16>>2]>>2]&63](f,e,d)|0;while(1){h=f+16|0;while(1){if(!e)break;else g=a;while(1){if((g|0)==(f|0))break a;if(eb[c[c[g+16>>2]>>2]&63](g,e,4)|0)break;g=c[g+28>>2]|0}e=eb[c[c[h>>2]>>2]&63](f,e,d)|0}f=c[f+28>>2]|0;c[p>>2]=f;if(!f){e=0;break a}e=eb[c[c[f+16>>2]>>2]&63](f,0,i)|0}}while(1){if(!a){a=0;e=0;break}e=eb[c[c[a+16>>2]>>2]&63](a,b,d)|0;if(e|0)break;a=c[a+28>>2]|0}c[p>>2]=a}else e=eb[c[c[f>>2]>>2]&63](a,b,d)|0;while(0);return e|0}function Zz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=a+32|0;f=eb[c[a>>2]&63](a,0,128)|0;do{if(!f){e=0;break}h=c[g>>2]|0;e=f;f=eb[c[a>>2]&63](a,f,8)|0;e=eb[b&63]((h|0)==0?a:h,e,d)|0}while((e|0)>=0);return e|0}function _z(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=a+4|0;n=c[f>>2]|0;g=b+28|0;h=a+12|0;a:do if(n)if(b){m=c[c[a+16>>2]>>2]|0;i=a+8|0;if(c[c[i>>2]>>2]&4096|0)Tz(a,0)|0;e=c[n+32>>2]|0;if(e|0?(tb[e&127](a,3,b,n)|0)<0:0){b=0;break}c[f>>2]=b;e=c[g>>2]|0;c[h>>2]=(e|0)==0?52:e;e=c[c[i>>2]>>2]|0;if(!(e&112)){l=(d&2|0)!=0;do if(!(e&2))if(!(e&3))if(!(d&1))break;else{b=n;break a}else if((d&3|0)==3){b=n;break a}else break;else if(l){b=n;break a}while(0);g=Qz(a)|0;e=c[i>>2]|0;k=c[e>>2]|0;c[e>>2]=k&-4097;c[e+4>>2]=0;c[e+16>>2]=0;b:do if(k&3|0){k=c[e+8>>2]|0;f=k+(c[e+12>>2]<<2)|0;e=k;while(1){if(e>>>0>=f>>>0)break b;c[e>>2]=0;e=e+4|0}}while(0);i=b+8|0;j=b+4|0;k=b+24|0;while(1){if(!g){b=n;break a}d=c[g>>2]|0;if(!l){e=c[i>>2]|0;if((e|0)<0)e=c[g+8>>2]|0;else e=g+(0-e)|0;h=c[j>>2]|0;e=e+(c[b>>2]|0)|0;if((h|0)<0)e=c[e>>2]|0;f=c[k>>2]|0;if(!f)e=aA(0,e,h)|0;else e=eb[f&63](a,e,b)|0;c[g+4>>2]=e}eb[m&63](a,g,32)|0;g=d}}else b=n}else b=n;else{c[f>>2]=b;n=c[g>>2]|0;c[h>>2]=(n|0)==0?52:n}while(0);return b|0}function $z(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a=(c|0)==0;do if(!b)if(a)a=0;else a=k6(c)|0;else if(a){l6(b);a=0;break}else{a=n6(b,c)|0;break}while(0);return a|0}function aA(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0;g=c;if((e|0)>=1){h=c+e+-1|0;g=(h>>>0>>0?c:h)+(1-g)&-2;f=c;while(1){if(f>>>0>=h>>>0)break;b=S(((d[f>>0]|0)<<8)+b+(d[f+1>>0]|0)|0,17109811)|0;f=f+2|0}f=c+g|0;if(f>>>0>h>>>0)c=e;else{c=e;b=S(((d[f>>0]|0)<<8)+b|0,17109811)|0}}else{while(1){f=a[c>>0]|0;if(!(f<<24>>24))break;h=a[c+1>>0]|0;e=S(((f&255)<<8)+b+(h&255)|0,17109811)|0;b=e;c=c+(h<<24>>24?2:1)|0}c=c-g|0}return S(b+c|0,17109811)|0}function bA(a){a=a|0;var b=0;b=c[46977]|0;c[46977]=a;return b|0}function cA(a){a=a|0;var b=0;b=c[46978]|0;c[46978]=a;return b|0}function dA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=eA(a,b,f)|0;l=e;return d|0}function eA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;e=(a|0)==3?c[46981]|0:(a|0)==2?1:a;c[46981]=e;g=c[46982]|0;c[46982]=g>>>0>e>>>0?g:e;g=(a|0)!=3;do if(e>>>0<(c[46978]|0)>>>0){a=c[46979]|0;if(!a){a=$5()|0;c[46979]=a;if(!a){a=1;break}}if(g){c[46980]=Y5(a)|0;a=c[46979]|0}l2(a,b,d)|0;a=0}else{if(c[46977]|0){fA(a,b,d);a=0;break}e=c[15715]|0;if(g){c[f>>2]=(a|0)==1?96650:96656;z4(e,96664,f)|0}l2(e,b,d)|0;a=0}while(0);l=h;return a|0}function fA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((c[46983]|0)==0?(f=k6(c[4600]|0)|0,c[46983]=f,(f|0)==0):0)Z3(96669,c[15715]|0)|0;else e=4;do if((e|0)==4){if((a|0)!=3){pb[c[46977]&63]((a|0)==1?96650:96656)|0;pb[c[46977]&63](97328)|0}while(1){a=k2(c[46983]|0,c[4600]|0,b,d)|0;f=c[46983]|0;e=c[4600]|0;if((a|0)>-1&(a|0)<(e|0)){e=7;break}g=e<<1;e=a+1|0;e=(g|0)>(e|0)?g:e;c[4600]=e;if(!(n6(f,e)|0)){e=9;break}}if((e|0)==7){pb[c[46977]&63](f)|0;break}else if((e|0)==9){Z3(96669,c[15715]|0)|0;break}}while(0);return}function gA(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;eA(1,a,e)|0;l=d;return}function hA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=b+12|0;if(!e){d=(d|0)==0?1024:d;c[f>>2]=1;e=k6(d)|0;c[b>>2]=e}else{c[b>>2]=e;c[f>>2]=0}c[b+8>>2]=e+d;c[b+4>>2]=e;a[e>>0]=0;return}function iA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=a+8|0;g=c[a>>2]|0;f=g;e=(c[h>>2]|0)-f|0;d=e<<1;e=e+b|0;d=e>>>0>d>>>0?e:d;e=a+4|0;f=(c[e>>2]|0)-f|0;b=a+12|0;if(!(c[b>>2]|0)){i=k6(d)|0;B6(i|0,g|0,f|0)|0;c[b>>2]=1;b=i}else b=n6(g,d)|0;c[a>>2]=b;c[e>>2]=b+f;c[h>>2]=b+d;return 0}function jA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=a+4|0;e=c[f>>2]|0;if((e+d|0)>>>0>(c[a+8>>2]|0)>>>0){iA(a,d)|0;e=c[f>>2]|0}B6(e|0,b|0,d|0)|0;c[f>>2]=(c[f>>2]|0)+d;return d|0}function kA(a,b){a=a|0;b=b|0;return jA(a,b,D3(b)|0)|0}function lA(a){a=a|0;if(c[a+12>>2]|0)l6(c[a>>2]|0);return}function mA(a){a=a|0;var b=0,e=0;b=a+4|0;e=c[b>>2]|0;if(e>>>0>(c[a>>2]|0)>>>0){c[b>>2]=e+-1;a=d[e>>0]|0}else a=-1;return a|0}function nA(a,b,d){a=a|0;b=b|0;d=d|0;fD(c[46985]|0,c[b+8>>2]|0)|0;fD(c[46985]|0,c[b+12>>2]|0)|0;bC(c[46985]|0,b);return}function oA(a,b){a=a|0;b=b|0;var c=0;c=PC(a,96717,0)|0;if((b|0)!=0&(c|0)==0){pA(a);c=PC(a,96717,0)|0}return c|0}function pA(a){a=a|0;var b=0,c=0,d=0;d=vC(a)|0;zE(d,d,107,0,1)|0;c=gC(d)|0;while(1){if(!c)break;rA(a,c);b=UA(d,c)|0;while(1){if(!b)break;sA(a,b);b=WA(d,b)|0}c=hC(d,c)|0}return}function qA(b){b=b|0;var c=0;c=b+24|0;a[c>>0]=a[c>>0]|64;xA(b);c=OD(b)|0;uA((c|0)==0?b:c,b);return}function rA(a,b){a=a|0;b=b|0;var d=0;d=tA(b)|0;if(!((d|0)!=0?(c[d+8>>2]|0)!=0:0))uA(a,b);return}function sA(a,b){a=a|0;b=b|0;var d=0;d=tA(b)|0;if(!((d|0)!=0?(c[d+8>>2]|0)!=0:0))uA(a,b);return}function tA(a){a=a|0;return PC(a,c[4610]|0,0)|0}function uA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=RC(b,c[4610]|0,16,0)|0;f=vA(a,c[b>>2]&3)|0;e=d+8|0;a:do if(!(c[e>>2]|0)){a=vC(a)|0;c[e>>2]=vA(a,c[b>>2]&3)|0;a=wA(b)|0;d=d+12|0;c[d>>2]=aC(uC(b)|0,((a|0)>4?a:4)<<2)|0;a=eb[c[f>>2]&63](f,0,128)|0;while(1){if(!a)break a;e=uC(b)|0;e=dD(e,c[a+12>>2]|0)|0;c[(c[d>>2]|0)+(c[a+16>>2]<<2)>>2]=e;a=eb[c[f>>2]&63](f,a,8)|0}}while(0);return}function vA(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+16|0;d=e;a=oA(a,0)|0;a:do if(!a)a=0;else switch(b|0){case 0:{a=c[a+16>>2]|0;break a}case 1:{a=c[a+8>>2]|0;break a}case 2:case 3:{a=c[a+12>>2]|0;break a}default:{c[d>>2]=b;dA(1,96730,d)|0;a=0;break a}}while(0);l=e;return a|0}function wA(a){a=a|0;var b=0;b=vC(uC(a)|0)|0;a=vA(b,c[a>>2]&3)|0;if(!a)a=0;else a=Uz(a)|0;return a|0}function xA(a){a=a|0;var b=0,d=0,e=0,f=0;d=RC(a,96717,20,0)|0;e=d+8|0;c[e>>2]=SD(a,18404,c[4599]|0)|0;f=d+12|0;c[f>>2]=SD(a,18404,c[4599]|0)|0;d=d+16|0;c[d>>2]=SD(a,18404,c[4599]|0)|0;b=OD(a)|0;if(!b){b=c[46984]|0;if(!((b|0)==0|(b|0)==(a|0))){b=oA(b,0)|0;yA(c[b+8>>2]|0,c[e>>2]|0,a,1);yA(c[b+12>>2]|0,c[f>>2]|0,a,2);yA(c[b+16>>2]|0,c[d>>2]|0,a,0)}}else{a=oA(b,0)|0;Xz(c[e>>2]|0,c[a+8>>2]|0)|0;Xz(c[f>>2]|0,c[a+12>>2]|0)|0;Xz(c[d>>2]|0,c[a+16>>2]|0)|0}return}function yA(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=eb[c[b>>2]&63](b,0,128)|0;while(1){if(!g)break;h=zA(e,c[g+8>>2]|0,c[g+12>>2]|0,c[g+16>>2]|0,f)|0;a[h+22>>0]=a[g+22>>0]|0;a[h+21>>0]=a[g+21>>0]|0;eb[c[d>>2]&63](d,h,1)|0;g=eb[c[b>>2]&63](b,g,8)|0}return}function zA(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=aC(b,24)|0;a[h+20>>0]=g;c[h+8>>2]=dD(b,d)|0;c[h+12>>2]=dD(b,e)|0;c[h+16>>2]=f;return h|0}function AA(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+32|0;e=d;c[e+8>>2]=b;b=eb[c[a>>2]&63](a,e,4)|0;l=d;return b|0}function BA(a,b){a=a|0;b=b|0;var c=0;c=Xz(a,0)|0;b=AA(a,b)|0;Xz(a,c)|0;return b|0}function CA(a,b){a=a|0;b=b|0;a=tA(a)|0;if(!a)a=0;else a=AA(c[a+8>>2]|0,b)|0;return a|0}function DA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if(!a){a=c[46984]|0;if(!a){c[f>>2]=c[4611];a=lB(0,f,0)|0;c[46984]=a}}if(!e)a=FA(a,b,d)|0;else a=EA(a,b,d,e)|0;l=g;return a|0}function EA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=vC(a)|0;oA(a,1)|0;g=vA(a,b)|0;f=BA(g,d)|0;a:do if(!f){f=AA(g,d)|0;if(f|0){f=zA(a,d,e,c[f+16>>2]|0,b)|0;eb[c[g>>2]&63](g,f,1)|0;h=16;break}g=vA(i,b)|0;f=zA(a,d,e,Uz(g)|0,b)|0;eb[c[g>>2]&63](g,f,1)|0;switch(b|0){case 0:{zE(i,i,57,f,1)|0;h=16;break a}case 1:{d=gC(i)|0;while(1){if(!d){h=16;break a}GA(a,d,f);d=hC(i,d)|0}}case 2:case 3:{g=gC(i)|0;while(1){if(!g){h=16;break a}d=UA(i,g)|0;while(1){if(!d)break;GA(a,d,f);d=WA(i,d)|0}g=hC(i,g)|0}}default:break a}}else{h=f+12|0;fD(a,c[h>>2]|0)|0;c[h>>2]=dD(a,e)|0;h=16}while(0);if((h|0)==16)if((b|0)==0&(f|0)!=0)HA(a,f,e)|0;yC(a,a,f);return f|0}function FA(a,b,c){a=a|0;b=b|0;c=c|0;a=vA(a,b)|0;if(!a)a=0;else a=AA(a,c)|0;return a|0}function GA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;b=tA(b)|0;f=d+16|0;e=c[f>>2]|0;if((e|0)>3){g=c[a+64>>2]|0;b=b+12|0;e=e<<2;c[b>>2]=tb[c[(c[g>>2]|0)+8>>2]&127](c[g+12>>2]|0,c[b>>2]|0,e,e+4|0)|0}else b=b+12|0;g=dD(a,c[d+12>>2]|0)|0;c[(c[b>>2]|0)+(c[f>>2]<<2)>>2]=g;return}function HA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=uC(a)|0;g=(tA(a)|0)+12|0;i=b+16|0;fD(h,c[(c[g>>2]|0)+(c[i>>2]<<2)>>2]|0)|0;f=dD(h,d)|0;c[(c[g>>2]|0)+(c[i>>2]<<2)>>2]=f;do if(!(c[a>>2]&3)){e=c[(oA(h,0)|0)+16>>2]|0;f=b+8|0;g=BA(e,c[f>>2]|0)|0;if(!g){i=zA(h,c[f>>2]|0,d,c[i>>2]|0,c[a>>2]&3)|0;eb[c[e>>2]&63](e,i,1)|0;break}else{i=g+12|0;fD(h,c[i>>2]|0)|0;c[i>>2]=dD(h,d)|0;break}}while(0);yC(h,a,b);return 0}function IA(a,b,d){a=a|0;b=b|0;d=d|0;a=vA(a,b)|0;do if(a){b=c[a>>2]|0;if(!d){a=eb[b&63](a,0,128)|0;break}else{a=eb[b&63](a,d,8)|0;break}}else a=0;while(0);return a|0}function JA(a){a=a|0;var b=0;c[46985]=a;b=tA(a)|0;if(b|0){KA(a,b);TC(a,c[b>>2]|0)|0}b=oA(a,0)|0;if(b)if(((UD(a,c[b+8>>2]|0)|0)==0?(UD(a,c[b+12>>2]|0)|0)==0:0)?(UD(a,c[b+16>>2]|0)|0)==0:0){TC(a,c[b>>2]|0)|0;b=0}else b=1;else b=0;return b|0}function KA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=uC(a)|0;e=wA(a)|0;b=b+12|0;a=0;while(1){d=c[b>>2]|0;if((a|0)>=(e|0))break;fD(f,c[d+(a<<2)>>2]|0)|0;a=a+1|0}bC(f,d);return}function LA(a){a=a|0;var b=0;b=tA(a)|0;if(b|0){KA(a,b);TC(a,c[4610]|0)|0}return}function MA(a){a=a|0;var b=0;b=tA(a)|0;if(b|0){KA(a,b);TC(a,c[4610]|0)|0}return}function NA(a,b){a=a|0;b=b|0;b=CA(a,b)|0;if(!b)b=0;else{a=c[(tA(a)|0)+12>>2]|0;b=c[a+(c[b+16>>2]<<2)>>2]|0}return b|0}function OA(a,b){a=a|0;b=b|0;a=c[(tA(a)|0)+12>>2]|0;return c[a+(c[b+16>>2]<<2)>>2]|0}function PA(a,b,c){a=a|0;b=b|0;c=c|0;b=CA(a,b)|0;if(!b)b=-1;else{HA(a,b,c)|0;b=0}return b|0}function QA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=uC(a)|0;f=DA(f,c[a>>2]&3,b,0)|0;if(!f){f=uC(a)|0;f=DA(f,c[a>>2]&3,b,e)|0}HA(a,f,d)|0;return 0}function RA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=uC(a)|0;f=c[a>>2]|0;a:do if(!((c[b>>2]^f)&3)){d=1;e=0;while(1){e=IA(g,f&3,e)|0;if(!e)break a;d=CA(b,c[e+8>>2]|0)|0;if(!d){d=1;break a}f=OA(a,e)|0;HA(b,d,f)|0;if(gD(f)|0)hD(OA(b,d)|0);d=0;f=c[a>>2]|0}}else d=1;while(0);return d|0}function SA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;a=c[b+40>>2]|0;f=c[d+40>>2]|0;if((a|0)==(f|0)){e=(c[b>>2]|0)>>>4;a=(c[d>>2]|0)>>>4;if(e>>>0>=a>>>0)if(e>>>0>a>>>0)a=1;else g=6;else a=-1}else{e=(c[a>>2]|0)>>>4;a=(c[f>>2]|0)>>>4;if(e>>>0>=a>>>0)if(e>>>0>a>>>0)a=1;else g=6;else a=-1}if((g|0)==6)a=0;return a|0}function TA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;a=(c[b+40>>2]|0)+8|0;g=c[a>>2]|0;a=c[a+4>>2]|0;f=(c[d+40>>2]|0)+8|0;e=c[f>>2]|0;f=c[f+4>>2]|0;do if(!(a>>>0>>0|(a|0)==(f|0)&g>>>0>>0))if(a>>>0>f>>>0|(a|0)==(f|0)&g>>>0>e>>>0)a=1;else{e=b+8|0;a=c[e>>2]|0;e=c[e+4>>2]|0;if(!((a|0)==0&(e|0)==0)?(i=d+8|0,h=c[i>>2]|0,i=c[i+4>>2]|0,!((h|0)==0&(i|0)==0)):0){if(e>>>0>>0|(e|0)==(i|0)&a>>>0>>0){a=-1;break}if(e>>>0>i>>>0|(e|0)==(i|0)&a>>>0>h>>>0){a=1;break}}a=0}else a=-1;while(0);return a|0}function UA(a,b){a=a|0;b=b|0;var d=0;b=VA(a,b)|0;if(!b)b=0;else{d=a+44|0;a=b+32|0;Tz(c[d>>2]|0,c[a>>2]|0)|0;b=c[d>>2]|0;b=eb[c[b>>2]&63](b,0,128)|0;c[a>>2]=Pz(c[d>>2]|0)|0}return b|0}function VA(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+48|0;d=e;if((c[b+24>>2]|0)==(a|0))a=b+28|0;else{c[d+16>>2]=b;a=c[a+40>>2]|0;a=eb[c[a>>2]&63](a,d,4)|0}l=e;return a|0}function WA(a,b){a=a|0;b=b|0;var d=0,e=0;d=VA(a,c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0;if(!d)a=0;else{e=a+44|0;d=d+32|0;Tz(c[e>>2]|0,c[d>>2]|0)|0;a=c[e>>2]|0;a=eb[c[a>>2]&63](a,b,8)|0;c[d>>2]=Pz(c[e>>2]|0)|0}return a|0}function XA(a,b){a=a|0;b=b|0;var d=0;b=VA(a,b)|0;if(!b)b=0;else{d=a+44|0;a=b+28|0;Tz(c[d>>2]|0,c[a>>2]|0)|0;b=c[d>>2]|0;b=eb[c[b>>2]&63](b,0,128)|0;c[a>>2]=Pz(c[d>>2]|0)|0}return b|0}function YA(a,b){a=a|0;b=b|0;var d=0,e=0;d=VA(a,c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0;if(!d)a=0;else{e=a+44|0;d=d+28|0;Tz(c[e>>2]|0,c[d>>2]|0)|0;a=c[e>>2]|0;a=eb[c[a>>2]&63](a,b,8)|0;c[d>>2]=Pz(c[e>>2]|0)|0}return a|0}function ZA(a,b){a=a|0;b=b|0;var c=0;c=UA(a,b)|0;if(!c)c=XA(a,b)|0;return c|0}function _A(a,b,d){a=a|0;b=b|0;d=d|0;a:do if((c[b>>2]&3|0)==2){b=WA(a,b)|0;if(!b){b=0;do{if(!b)b=XA(a,d)|0;else b=YA(a,b)|0;if(!b){b=0;break a}}while((c[b+40>>2]|0)==(d|0))}}else do{b=YA(a,b)|0;if(!b){b=0;break a}}while((c[b+40>>2]|0)==(d|0));while(0);return b|0}function $A(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+32|0;f=h+16|0;g=h;if((wB(a)|0)!=0?(c[g>>2]=0,c[g+4>>2]=0,c[g+8>>2]=0,c[g+12>>2]=0,c[f>>2]=c[g>>2],c[f+4>>2]=c[g+4>>2],c[f+8>>2]=c[g+8>>2],c[f+12>>2]=c[g+12>>2],(dB(a,b,e,f)|0)!=0):0)f=0;else f=((d[a+24>>0]|0)>>>2&1^1)&255|(b|0)!=(e|0);l=h;return f|0}function aB(a,b){a=a|0;b=b|0;cB(a,b);return}function bB(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;lC(b,d,1)|0;lC(b,e,1)|0;h=aC(b,96)|0;i=h+48|0;l=oB(b,2)|0;j=c[i>>2]|0;k=c[h>>2]|0;m=h+8|0;c[m>>2]=f;c[m+4>>2]=g;m=h+56|0;c[m>>2]=f;c[m+4>>2]=g;g=l<<4;c[h>>2]=k&12|g|2;c[i>>2]=j&12|g|3;c[h+88>>2]=d;c[h+40>>2]=e;cB(b,h);if(a[b+24>>0]&64){RC(h,c[4610]|0,16,0)|0;sA(b,h)}wC(b,h);return h|0}function cB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;i=l;l=l+16|0;d=i;h=c[b>>2]&3;g=(h|0)==2?b:b+-48|0;h=(h|0)==3?b:b+48|0;e=c[h+40>>2]|0;f=c[g+40>>2]|0;while(1){if(!a)break;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];if(dB(a,e,f,d)|0)break;j=VA(a,e)|0;m=a+44|0;eB(c[m>>2]|0,j+32|0,g);k=a+48|0;eB(c[k>>2]|0,j+24|0,g);j=VA(a,f)|0;eB(c[m>>2]|0,j+28|0,h);eB(c[k>>2]|0,j+20|0,h);a=OD(a)|0}l=i;return}function dB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+48|0;f=h;if(!((b|0)==0|(d|0)==0)?(c[f>>2]=c[e>>2],c[f+4>>2]=c[e+4>>2],c[f+8>>2]=c[e+8>>2],c[f+12>>2]=c[e+12>>2],c[f+40>>2]=b,g=VA(a,d)|0,(g|0)!=0):0){e=a+48|0;g=g+20|0;Tz(c[e>>2]|0,c[g>>2]|0)|0;a=c[e>>2]|0;a=eb[c[a>>2]&63](a,f,4)|0;c[g>>2]=Pz(c[e>>2]|0)|0}else a=0;l=h;return a|0}function eB(a,b,d){a=a|0;b=b|0;d=d|0;Tz(a,c[b>>2]|0)|0;eb[c[a>>2]&63](a,d,1)|0;c[b>>2]=Pz(a)|0;return}function fB(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+48|0;i=o+24|0;m=o+16|0;j=o;h=(f|0)!=0;do if(!(EB(a,2,e,m,0)|0)){if(e|0)if(h){n=18;break}else{f=0;break}if(h?(wB(a)|0)==0:0){n=18;break}n=j;c[n>>2]=0;c[n+4>>2]=0;c[j>>2]=0;n=j+8|0;c[n>>2]=0;c[n+4>>2]=0;n=7}else{g=j;c[g>>2]=0;c[g+4>>2]=0;g=m;k=c[g+4>>2]|0;n=j+8|0;c[n>>2]=c[g>>2];c[n+4>>2]=k;c[j>>2]=2;n=7}while(0);a:do if((n|0)==7){c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];f=dB(a,b,d,i)|0;if(f|0)break;if(!(vB(a)|0))k=0;else{c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];k=dB(a,d,b,i)|0}g=(k|0)!=0;f=h^1;do if(g|f)g=g^1;else{f=vC(a)|0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];f=dB(f,b,d,i)|0;if(!f){if(!(vB(a)|0)){g=1;f=0;break}f=vC(a)|0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];f=dB(f,d,b,i)|0;if(!f){g=1;f=0;break}}aB(a,f);break a}while(0);if(f|g^1)f=g?0:k;else n=18}while(0);if((n|0)==18)if(($A(a,b,d)|0)!=0?(EB(a,2,e,m,1)|0)!=0:0){f=m;f=bB(a,b,d,c[f>>2]|0,c[f+4>>2]|0)|0;IB(a,2,f)}else f=0;l=o;return f|0}function gB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;d=(c[b>>2]&3|0)==3;g=d?b+-48|0:b;d=d?b:b+48|0;b=c[g+40>>2]|0;h=VA(a,c[d+40>>2]|0)|0;f=a+44|0;hB(c[f>>2]|0,h+32|0,g);e=a+48|0;hB(c[e>>2]|0,h+24|0,g);b=VA(a,b)|0;hB(c[f>>2]|0,b+28|0,d);hB(c[e>>2]|0,b+20|0,d);return}function hB(a,b,d){a=a|0;b=b|0;d=d|0;Tz(a,c[b>>2]|0)|0;eb[c[a>>2]&63](a,d,2)|0;c[b>>2]=Pz(a)|0;return}function iB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+16|0;f=e;d=(c[d>>2]&3|0)==2?d:d+-48|0;g=c[d>>2]&3;h=c[((g|0)==3?d:d+48|0)+40>>2]|0;g=c[((g|0)==2?d:d+-48|0)+40>>2]|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];if(dB(b,h,g,f)|0){if((vC(b)|0)==(b|0)){if(a[b+24>>0]&64)MA(d);AC(b,d);ZC(d);h=d+8|0;GB(b,2,c[h>>2]|0,c[h+4>>2]|0)}if(!(zE(b,d,58,0,0)|0))if((vC(b)|0)==(b|0)){bC(b,d);d=0}else d=0;else d=-1}else d=-1;l=e;return d|0}function jB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;e=h;f=lC(a,c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0,d)|0;g=lC(a,c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0,d)|0;do if((f|0)!=0&(g|0)!=0){c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];e=dB(a,f,g,e)|0;f=(e|0)==0;if(!((d|0)!=0&f)){if(f)break}else{cB(a,b);e=b}d=c[e>>2]&3;l=h;return ((d|0)==(c[b>>2]&3|0)?e:e+(((d|0)==3?-1:1)*48|0)|0)|0}while(0);l=h;return 0}function kB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=b+8|0;e=d+8|0;e=t6(c[b>>2]|0,c[b+4>>2]|0,c[e>>2]|0,c[e+4>>2]|0)|0;return ((e|0)==0?0:e>>31|1)|0}function lB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;h=l;l=l+16|0;g=h;j=mB(e)|0;f=vb[c[(c[j>>2]|0)+4>>2]&127](c[j+12>>2]|0,72)|0;c[f>>2]=c[f>>2]&-4;i=f+64|0;c[i>>2]=j;k=f+24|0;d=c[d>>2]|0;c[k>>2]=d;a[k>>0]=d&255|8;c[f+60>>2]=f;e=vb[c[c[j+4>>2]>>2]&127](f,e)|0;c[(c[i>>2]|0)+16>>2]=e;if(EB(f,0,b,g,1)|0){i=g;j=c[i+4>>2]|0;k=f+8|0;c[k>>2]=c[i>>2];c[k+4>>2]=j}k=nB(f)|0;IB(k,0,f);l=h;return k|0}function mB(b){b=b|0;var d=0,e=0,f=0,g=0;d=(b|0)!=0;if(d){e=c[b>>2]|0;e=(e|0)==0?18780:e}else e=18780;g=pb[c[e>>2]&63](b)|0;f=vb[c[e+4>>2]&127](g,80)|0;c[f>>2]=e;c[f+12>>2]=g;if(d){g=c[b+4>>2]|0;c[f+4>>2]=(g|0)==0?18656:g;b=c[b+8>>2]|0;b=(b|0)==0?18756:b}else{c[f+4>>2]=18656;b=18756}c[f+8>>2]=b;a[f+52>>0]=1;return f|0}function nB(b){b=b|0;var d=0,e=0;c[b+36>>2]=SD(b,18836,c[4599]|0)|0;c[b+40>>2]=SD(b,18800,c[4599]|0)|0;d=(vC(b)|0)==(b|0);c[b+44>>2]=SD(b,d?18448:18484,c[4599]|0)|0;d=(vC(b)|0)==(b|0);c[b+48>>2]=SD(b,d?18520:18556,c[4599]|0)|0;c[b+52>>2]=SD(b,18592,c[4599]|0)|0;d=OD(b)|0;if(!((d|0)!=0?(e=oB(d,0)|0,c[b>>2]=c[b>>2]&15|e<<4,e=c[d+52>>2]|0,eb[c[e>>2]&63](e,b,1)|0,!(a[d+24>>0]&64)):0))qA(b);wC(b,b);return b|0}function oB(a,b){a=a|0;b=b|0;var d=0;d=(c[a+64>>2]|0)+24+(b<<3)|0;b=d;b=w6(c[b>>2]|0,c[b+4>>2]|0,1,0)|0;a=D;c[d>>2]=b;c[d+4>>2]=a;D=a;return b|0}function pB(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;f=OD(b)|0;g=(f|0)==0;h=b+64|0;if(g?(c[(c[c[h>>2]>>2]|0)+16>>2]|0)!=0:0){AC(b,b);d=b+8|0;GB(b,0,c[d>>2]|0,c[d+4>>2]|0);d=c[h>>2]|0;db[c[(c[d>>2]|0)+16>>2]&127](c[d+12>>2]|0);d=0}else e=4;do if((e|0)==4){d=MD(b)|0;while(1){if(!d)break;e=ND(d)|0;pB(d)|0;d=e}d=gC(b)|0;while(1){if(!d)break;e=hC(b,d)|0;sC(b,d)|0;d=e}RB(b);AC(b,b);if(((((UD(b,c[b+40>>2]|0)|0)==0?(UD(b,c[b+36>>2]|0)|0)==0:0)?(UD(b,c[b+48>>2]|0)|0)==0:0)?(UD(b,c[b+44>>2]|0)|0)==0:0)?(UD(b,c[b+52>>2]|0)|0)==0:0){if(a[b+24>>0]&64?JA(b)|0:0){d=-1;break}ZC(b);e=b+8|0;GB(b,0,c[e>>2]|0,c[e+4>>2]|0);if(!g){PD(f,b)|0;bC(f,b);d=0;break}while(1){d=c[h>>2]|0;e=c[d+48>>2]|0;if(!e)break;DC(b,c[e>>2]|0)|0}db[c[(c[d+4>>2]|0)+20>>2]&127](c[d+16>>2]|0);if(!(_C(b)|0)){d=c[h>>2]|0;h=c[d+12>>2]|0;g=(c[d>>2]|0)+12|0;lb[c[g>>2]&63](h,b);lb[c[g>>2]&63](h,d);d=0}else d=-1}else d=-1}while(0);return d|0}function qB(a){a=a|0;return Uz(c[a+40>>2]|0)|0}function rB(a){a=a|0;var b=0,c=0,d=0;b=0;c=gC(a)|0;while(1){if(!c)break;d=(sB(a,c,0,1)|0)+b|0;b=d;c=hC(a,c)|0}return b|0}function sB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=VA(a,b)|0;if(f){a=a+44|0;if(!e)b=0;else b=tB(c[a>>2]|0,f+32|0)|0;if(d)b=(tB(c[a>>2]|0,f+28|0)|0)+b|0}else b=0;return b|0}function tB(a,b){a=a|0;b=b|0;var d=0;Tz(a,c[b>>2]|0)|0;d=Uz(a)|0;c[b>>2]=Pz(a)|0;return d|0}function uB(b){b=b|0;return a[b+24>>0]&1|0}function vB(a){a=a|0;return (uB(a)|0)==0|0}function wB(a){a=a|0;return (d[a+24>>0]|0)>>>1&1|0}function xB(a,b){a=a|0;b=b|0;return a|0}function yB(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;if(!d){f=1392;d=c[f>>2]|0;f=c[f+4>>2]|0;c[e>>2]=d;c[e+4>>2]=f;f=w6(d|0,f|0,2,0)|0;e=1392;c[e>>2]=f;c[e+4>>2]=D}else{if(!f)a=aD(a,d)|0;else a=dD(a,d)|0;c[e>>2]=a;c[e+4>>2]=0}return 1}function zB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}function AB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((c&1|0)==0&0==0)fD(a,c)|0;return}function BB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ((c&1|0)==0&0==0?c:0)|0}function CB(a){a=a|0;return}function DB(a,b,c){a=a|0;b=b|0;c=c|0;return} -function Ol(a){a=a|0;var d=0,e=0,f=0,g=0;g=a+16|0;a=c[g>>2]|0;if(b[a+236>>1]|0)Aa(88706,88689,190,88725);d=c[a+196>>2]|0;a=(b[a+238>>1]<<6)+192|0;if(!d)a=IK(a)|0;else a=KK(d,a)|0;e=a+64|0;a=c[g>>2]|0;c[a+196>>2]=e;a=b[a+238>>1]|0;while(1){d=e+(a<<6)|0;if((a|0)<=-1)break;a=a+-1|0;e=e+(a<<6)|0;f=d+64|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));e=c[(c[g>>2]|0)+196>>2]|0}c[e+(a<<6)+8>>2]=0;c[d>>2]=0;e=HK(8)|0;g=c[g>>2]|0;f=c[g+196>>2]|0;c[f+(a<<6)+12>>2]=e;c[f+(a<<6)+4>>2]=e;c[f+(a<<6)+56>>2]=0;h[f+(a<<6)+24>>3]=1.0;h[f+(a<<6)+16>>3]=1.0;h[f+(a<<6)+40>>3]=1.0;h[f+(a<<6)+32>>3]=1.0;g=g+236|0;b[g>>1]=(b[g>>1]|0)+-1<<16>>16;return}function Pl(b){b=b|0;var d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0;j=b+16|0;if(c[(c[j>>2]|0)+96>>2]|0){m=b+48|0;k=dg(c[((c[b>>2]&3|0)==3?b:m)+40>>2]|0)|0;d=c[(c[(c[((c[b>>2]&3|0)==3?b:m)+40>>2]|0)+16>>2]|0)+232>>2]|0;l=Ql(k,b)|0;n=k+16|0;e=c[n>>2]|0;g=c[e+196>>2]|0;o=d+-1|0;i=c[c[g+(o<<6)+4>>2]>>2]|0;if(!i)f=+h[(c[(c[c[g+(d<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]+ +h[g+(d<<6)+24>>3]+ +(c[e+252>>2]|0);else f=+h[(c[i+16>>2]|0)+24>>3]-+h[g+(o<<6)+16>>3];d=Rl(k,o,l)|0;k=c[(c[j>>2]|0)+96>>2]|0;q=+h[k+24>>3];p=+h[k+32>>3];j=(c[(c[n>>2]|0)+116>>2]&1|0)==0;r=j?p:q;g=d+16|0;e=c[g>>2]|0;h[e+80>>3]=r;l=~~(r*.5);p=(j?q:p)*.5;h[e+96>>3]=p;h[e+88>>3]=p;c[e+104>>2]=k;h[e+24>>3]=+(l+~~f|0);e=kh(d,c[((c[b>>2]&3|0)==3?b:m)+40>>2]|0,b)|0;e=c[e+16>>2]|0;h[e+16>>3]=-+h[(c[g>>2]|0)+88>>3];h[e+56>>3]=+h[(c[(c[((c[b>>2]&3|0)==3?b:m)+40>>2]|0)+16>>2]|0)+96>>3];a[e+112>>0]=4;e=b+-48|0;d=kh(d,c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0,b)|0;g=c[g>>2]|0;d=c[d+16>>2]|0;h[d+16>>3]=+h[g+96>>3];h[d+56>>3]=+h[(c[(c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0)+16>>2]|0)+88>>3];a[d+112>>0]=4;d=c[(c[n>>2]|0)+196>>2]|0;e=d+(o<<6)+16|0;f=+(l|0);if(+h[e>>3]>3]=f;d=d+(o<<6)+24|0;if(+h[d>>3]>3]=f;c[g+112>>2]=b}return}function Ql(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;j=n+8|0;f=n+4|0;g=n;d=c[b>>2]&3;e=c[((d|0)==3?b:b+48|0)+40>>2]|0;k=(c[(c[e+16>>2]|0)+232>>2]|0)+-1|0;a=c[(c[a+16>>2]|0)+196>>2]|0;h=c[a+(k<<6)+4>>2]|0;a=c[a+(k<<6)>>2]|0;k=j+8|0;c[k>>2]=-1;c[j>>2]=-1;m=j+12|0;c[m>>2]=a;i=j+4|0;c[i>>2]=a;Sl(e,c[((d|0)==2?b:b+-48|0)+40>>2]|0,f,g);f=c[f>>2]|0;g=c[g>>2]|0;d=0;e=a;b=-1;while(1){if((d|0)>=(e|0))break;e=e+-1|0;Tl(c[h+(d<<2)>>2]|0,j,f,g);if((d|0)!=(e|0))Tl(c[h+(e<<2)>>2]|0,j,f,g);a=c[i>>2]|0;b=c[j>>2]|0;if((a-b|0)<2)break;else d=d+1|0}if((b|0)>(a|0))a=(c[m>>2]|0)+(c[k>>2]|0)|0;else a=a+b|0;l=n;return (a+1|0)/2|0|0}function Rl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=a+16|0;e=c[(c[g>>2]|0)+196>>2]|0;f=c[e+(b<<6)+4>>2]|0;e=(c[e+(b<<6)>>2]<<2)+8|0;if(!f)f=IK(e)|0;else f=KK(f,e)|0;e=c[(c[g>>2]|0)+196>>2]|0;c[e+(b<<6)+4>>2]=f;e=c[e+(b<<6)>>2]|0;while(1){if((e|0)<=(d|0))break;h=e+-1|0;i=c[f+(h<<2)>>2]|0;c[f+(e<<2)>>2]=i;i=(c[i+16>>2]|0)+236|0;c[i>>2]=(c[i>>2]|0)+1;e=h}h=ph(a)|0;i=f+(d<<2)|0;c[i>>2]=h;h=c[h+16>>2]|0;c[h+236>>2]=d;c[h+232>>2]=b;g=(c[(c[g>>2]|0)+196>>2]|0)+(b<<6)|0;h=(c[g>>2]|0)+1|0;c[g>>2]=h;c[f+(h<<2)>>2]=0;return c[i>>2]|0}function Sl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;a=c[(c[a+16>>2]|0)+236>>2]|0;b=c[(c[b+16>>2]|0)+236>>2]|0;f=(a|0)>(b|0);c[d>>2]=f?b:a;c[e>>2]=f?a:b;return}function Tl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;h=o+4|0;g=o;b=c[b+16>>2]|0;do if((a[b+156>>0]|0)==1){n=c[b+236>>2]|0;m=d+4|0;j=c[b+180>>2]|0;if(c[b+176>>2]|0){b=0;g=0;h=0;while(1){i=c[j+(h<<2)>>2]|0;if(!i)break;i=c[(c[(c[((c[i>>2]&3|0)==2?i:i+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;k=(i|0)>(e|0);b=k?((i|0)<(f|0)?b:1):b;g=k?g:1;h=h+1|0}if(g<<24>>24!=0&b<<24>>24==0){c[d>>2]=n+1;break}if(!(g<<24>>24==0&b<<24>>24!=0))break;c[m>>2]=n+-1;break}if((c[b+184>>2]|0)!=2)Aa(88669,88689,63,88696);k=c[j>>2]|0;j=c[j+4>>2]|0;Sl(c[((c[k>>2]&3|0)==2?k:k+-48|0)+40>>2]|0,c[((c[j>>2]&3|0)==2?j:j+-48|0)+40>>2]|0,h,g);j=c[g>>2]|0;k=d+8|0;if((j|0)<=(e|0)){c[d>>2]=n;c[k>>2]=n;break}i=c[h>>2]|0;h=d+12|0;if((i|0)>=(f|0)){c[m>>2]=n;c[h>>2]=n;break}b=(i|0)<(e|0);g=(j|0)>(f|0);if(!(g&b)){if(!(!b?!((j|0)<(f|0)&(i|0)==(e|0)):0))c[k>>2]=n;if(!g?!((j|0)==(f|0)&(i|0)>(e|0)):0)break;c[h>>2]=n}}while(0);l=o;return}function Ul(a){a=a|0;c[47180]=1;mm(a);c[47180]=0;return}function Vl(a){a=a|0;c[47180]=2;mm(a);c[47180]=0;return}function Wl(a){a=a|0;var b=0;RC(a,137750,304,1)|0;qP(a);b=HK((e[(c[(uC(a)|0)+16>>2]|0)+176>>1]|0)<<3)|0;c[(c[a+16>>2]|0)+132>>2]=b;oQ(a,c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&1);return}function Xl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0;u=l;l=l+64|0;j=u+48|0;p=u+40|0;k=u+24|0;i=u+8|0;s=u+56|0;n=u;do if((b|0)!=0?(t=e+16|0,q=c[(c[t>>2]|0)+132>>2]|0,g=OA(e,b)|0,(a[g>>0]|0)!=0):0){a[s>>0]=0;m=q+16|0;r=(d|0)!=0;b=q+8|0;if((c[47184]|0)>2?(c[i>>2]=q,c[i+4>>2]=b,c[i+8>>2]=m,c[i+12>>2]=s,(q4(g,88807,i)|0)>2):0){a[(c[t>>2]|0)+119>>0]=1;g=c[47184]|0;a:do if(+h[23314]>0.0){b=0;while(1){if((b|0)>=(g|0))break a;p=q+(b<<3)|0;h[p>>3]=+h[p>>3]/+h[23314];b=b+1|0}}while(0);if((g|0)>3)Cn(e,f,3);if((a[s>>0]|0)!=33){if(!r){b=1;break}if(!((bP(OA(e,d)|0)|0)<<24>>24)){b=1;break}}a[(c[t>>2]|0)+119>>0]=3;b=1;break}c[k>>2]=q;c[k+4>>2]=b;c[k+8>>2]=s;if((q4(g,102050,k)|0)<=1){c[j>>2]=HB(e)|0;c[j+4>>2]=g;dA(1,88821,j)|0;b=0;break}a[(c[t>>2]|0)+119>>0]=1;g=c[47184]|0;b:do if(+h[23314]>0.0){b=0;while(1){if((b|0)>=(g|0))break b;k=q+(b<<3)|0;h[k>>3]=+h[k>>3]/+h[23314];b=b+1|0}}while(0);do if((g|0)>2){b=c[47233]|0;if((b|0?(o=OA(e,b)|0,o|0):0)?(c[p>>2]=n,(q4(o,101510,p)|0)==1):0){w=+h[23314];v=+h[n>>3];h[m>>3]=w>0.0?v/w:v;Cn(e,f,3);break}Dn(e,f)}while(0);if((a[s>>0]|0)!=33){if(!r){b=1;break}if(!((bP(OA(e,d)|0)|0)<<24>>24)){b=1;break}}a[(c[t>>2]|0)+119>>0]=3;b=1}else b=0;while(0);l=u;return b|0}function Yl(a){a=a|0;var b=0,c=0;c=gC(a)|0;while(1){if(!c)break;b=UA(a,c)|0;while(1){if(!b)break;WP(b);b=WA(a,b)|0}UP(c);c=hC(a,c)|0}Zl(a);return}function Zl(a){a=a|0;if((c[47180]|0)!=0|(c[46837]|0)<0)An(a);if((vC(a)|0)!=(a|0))XC(a,0,137786);return}function _l(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+48|0;m=q+32|0;o=q;k=DA(b,0,102938,0)|0;e=DA(b,0,102972,0)|0;p=cP(NA(b,88865)|0,0)|0;if(!e)e=DA(b,0,102972,195341)|0;zn(b)|0;n=b+16|0;i=0;while(1){j=c[(c[(c[n>>2]|0)+152>>2]|0)+(i<<2)>>2]|0;if(!j){f=12;break}g=j+16|0;f=c[g>>2]|0;if(!(a[f+119>>0]|0)){if(h2(HB(j)|0,108307,7)|0){f=8;break}f=c[g>>2]|0}f=c[f+108>>2]|0;if(f|0)$l(j,f,102934);i=i+1|0}a:do if((f|0)==8){p=HB(j)|0;e=HB(b)|0;c[m>>2]=p;c[m+4>>2]=e;dA(1,88877,m)|0;e=-1}else if((f|0)==12){am(b,k,e);j=bm(b)|0;e=c[(c[n>>2]|0)+8>>2]|0;if(!(c[e+88>>2]|0))e=0;else{c[e+84>>2]=0;e=1}g=(d|0)!=0;i=(e|0)!=0;if(!(i|g&(c[47180]|0)==1^1)?(lr(b)|0)!=0:0){f=c[(c[n>>2]|0)+12>>2]|0;if(!f)f=1;else{a[f+81>>0]=0;f=1}}else f=0;zP(b);if(i){d=(c[n>>2]|0)+16|0;lI(o,b);c[d>>2]=c[o>>2];c[d+4>>2]=c[o+4>>2];c[d+8>>2]=c[o+8>>2];c[d+12>>2]=c[o+12>>2];c[d+16>>2]=c[o+16>>2];c[d+20>>2]=c[o+20>>2];c[d+24>>2]=c[o+24>>2];c[d+28>>2]=c[o+28>>2]}if(!g){c[47185]=1;f=gC(b)|0;while(1){if(!f)break a;p=c[f+16>>2]|0;o=c[p+132>>2]|0;h[p+16>>3]=+h[o>>3]*72.0;h[p+24>>3]=+h[o+8>>3]*72.0;f=hC(b,f)|0}}do if(!(p<<24>>24!=0|i)){p=c[n>>2]|0;if(!(+h[p+16>>3]!=0.0)?!(+h[p+24>>3]!=0.0):0)break;Zm(b)}while(0);if(!((j|0)!=0&(f|(Xm(b)|0)<<24>>24!=0))){if((j|0)==2){c[47185]=1;break}}else cm(b);Wm(b,0)}while(0);l=q;return e|0}function $l(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0;k=l;l=l+48|0;j=k+32|0;f=k+24|0;g=k+16|0;i=k;b=NA(b,e)|0;if(b|0?(c[j>>2]=f,c[j+4>>2]=g,(q4(b,105804,j)|0)==2):0){j=d+56|0;fm(i,+h[f>>3],+h[g>>3]);c[j>>2]=c[i>>2];c[j+4>>2]=c[i+4>>2];c[j+8>>2]=c[i+8>>2];c[j+12>>2]=c[i+12>>2];a[d+81>>0]=1}l=k;return}function am(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+48|0;k=m+32|0;f=m+24|0;g=m+16|0;i=m;j=b+16|0;if((d|0?(c[(c[j>>2]|0)+12>>2]|0)!=0:0)?(n=OA(b,d)|0,c[k>>2]=f,c[k+4>>2]=g,(q4(n,105804,k)|0)==2):0){n=(c[(c[j>>2]|0)+12>>2]|0)+56|0;fm(i,+h[f>>3],+h[g>>3]);c[n>>2]=c[i>>2];c[n+4>>2]=c[i+4>>2];c[n+8>>2]=c[i+8>>2];c[n+12>>2]=c[i+12>>2];a[(c[(c[j>>2]|0)+12>>2]|0)+81>>0]=1}a:do if(e|0){f=MD(b)|0;while(1){if(!f)break a;gm(f,b,d,e);f=ND(f)|0}}while(0);l=m;return}function bm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if(rB(a)|0){f=DA(a,2,102924,0)|0;if(!((f|0)==0|(c[47180]|0)<2)){b=0;e=gC(a)|0;while(1){if(!e)break;d=UA(a,e)|0;while(1){if(!d)break;g=((dm(f,d)|0)!=0&1)+b|0;d=WA(a,d)|0;b=g}e=hC(a,e)|0}if(b){b=(b|0)==(rB(a)|0);b=b?2:1}else b=0}else b=0}else b=2;return b|0}function cm(a){a=a|0;var b=0,d=0,e=0;d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;XP(b);e=b+16|0;AK(c[(c[e>>2]|0)+96>>2]|0);AK(c[(c[e>>2]|0)+108>>2]|0);AK(c[(c[e>>2]|0)+100>>2]|0);AK(c[(c[e>>2]|0)+104>>2]|0);b=WA(a,b)|0}d=hC(a,d)|0}return}function dm(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;B=l;l=l+96|0;z=B+72|0;x=B+56|0;A=B+48|0;y=B+32|0;w=B+16|0;r=B+88|0;s=B+8|0;t=B;u=B+84|0;v=B+80|0;b=OA(d,b)|0;do if(a[b>>0]|0){FH(d,u,v);q=1;f=0;e=0;j=0.0;i=0.0;k=0.0;g=0.0;a:while(1){c[w>>2]=s;c[w+4>>2]=t;c[w+8>>2]=r;if((q4(b,88914,w)|0)==2){p=1;b=b+(c[r>>2]|0)|0;i=+h[s>>3];g=+h[t>>3]}else p=e;c[y>>2]=s;c[y+4>>2]=t;c[y+8>>2]=r;if((q4(b,88926,y)|0)==2){o=1;b=b+(c[r>>2]|0)|0;j=+h[s>>3];k=+h[t>>3]}else o=f;m=em(b)|0;if(!((m|0)>3&((m|0)%3|0|0)==1)){e=8;break}n=IK(m<<4)|0;e=n;f=m;while(1){if(!f)break;c[x>>2]=s;c[x+4>>2]=t;c[x+8>>2]=r;if((q4(b,88996,x)|0)<2){e=13;break a}C=b+(c[r>>2]|0)|0;h[e>>3]=+h[s>>3];h[e+8>>3]=+h[t>>3];e=e+16|0;f=f+-1|0;b=C}while(1){e=a[b>>0]|0;f=b+1|0;if(!(X1(e<<24>>24)|0))break;else b=f}C=e<<24>>24==0;b=C?b:f;q=C?0:q;f=aO(d,m)|0;if(p|0){c[f+8>>2]=c[u>>2];h[f+16>>3]=i;h[f+24>>3]=g}if(o|0){c[f+12>>2]=c[v>>2];h[f+32>>3]=j;h[f+40>>3]=k}e=0;while(1){if((e|0)>=(m|0))break;C=(c[f>>2]|0)+(e<<4)|0;D=n+(e<<4)|0;c[C>>2]=c[D>>2];c[C+4>>2]=c[D+4>>2];c[C+8>>2]=c[D+8>>2];c[C+12>>2]=c[D+12>>2];e=e+1|0}l6(n);if(!q){e=26;break}else{f=o;e=p}}if((e|0)==8){XP(d);if(a[194051]|0){b=0;break}a[194051]=1;D=HB(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)|0;b=HB(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)|0;c[A>>2]=D;c[A+4>>2]=b;dA(0,88939,A)|0;b=0;break}else if((e|0)==13){if(!(a[194051]|0)){a[194051]=1;C=HB(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)|0;D=HB(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)|0;c[z>>2]=C;c[z+4>>2]=D;dA(0,89006,z)|0}l6(n);XP(d);b=0;break}else if((e|0)==26){f=d+16|0;b=c[f>>2]|0;e=c[b+96>>2]|0;if(e){$l(d,e,102938);b=c[f>>2]|0}e=c[b+108>>2]|0;if(e){$l(d,e,102934);b=c[f>>2]|0}e=c[b+100>>2]|0;if(e){$l(d,e,102941);b=c[f>>2]|0}b=c[b+104>>2]|0;if(!b){b=1;break}$l(d,b,102949);b=1;break}}else b=0;while(0);l=B;return b|0}function em(b){b=b|0;var c=0,d=0;d=0;do{while(1){c=a[b>>0]|0;if(!(X1(c&255)|0))break;else b=b+1|0}a:do if(!(c<<24>>24))c=0;else{d=d+1|0;while(1){if(!(c<<24>>24)){c=0;break a}if(c<<24>>24==59|(X1(c&255)|0)!=0)break a;c=b+1|0;b=c;c=a[c>>0]|0}}while(0)}while((X1(c&255)|0)!=0);return d|0}function fm(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function gm(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+32|0;f=h;if((h2(HB(a)|0,108307,7)|0)==0?(hm(a,e,f)|0)!=0:0){RC(a,137786,280,1)|0;i=(c[a+16>>2]|0)+16|0;c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];c[i+8>>2]=c[f+8>>2];c[i+12>>2]=c[f+12>>2];c[i+16>>2]=c[f+16>>2];c[i+20>>2]=c[f+20>>2];c[i+24>>2]=c[f+24>>2];c[i+28>>2]=c[f+28>>2];im(b,a);am(a,d,e)}else g=4;a:do if((g|0)==4){a=MD(a)|0;while(1){if(!a)break a;gm(a,b,d,e);a=ND(a)|0}}while(0);l=h;return}function hm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0,k=0;i=l;l=l+48|0;j=i+32|0;g=i;k=OA(a,b)|0;a=g+8|0;b=g+24|0;c[j>>2]=g;c[j+4>>2]=a;c[j+8>>2]=g+16;c[j+12>>2]=b;if((q4(k,89054,j)|0)==4){e=+h[a>>3];f=+h[b>>3];if(e>f){h[a>>3]=f;h[b>>3]=e};c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];c[d+16>>2]=c[g+16>>2];c[d+20>>2]=c[g+20>>2];c[d+24>>2]=c[g+24>>2];c[d+28>>2]=c[g+28>>2];a=1}else a=0;l=i;return a|0}function im(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;e=a+16|0;d=c[e>>2]|0;g=d+180|0;a=c[g>>2]|0;f=a+1|0;c[g>>2]=f;d=c[d+184>>2]|0;a=a+2|0;if(!d)a=HK(a<<2)|0;else a=JK(d,a,4,f)|0;c[(c[e>>2]|0)+184>>2]=a;c[a+(f<<2)>>2]=b;sK(b);return}function jm(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+48|0;m=n+8|0;k=n;i=n+16|0;j=n+12|0;h=NA(b,89070)|0;do if((h|0)!=0?(g=a[h>>0]|0,g<<24>>24!=0):0){g=g&255;if(!(P2(g)|0))if((e|0)==2|(g+-48|0)>>>0<10)e=h;else break;else{if(!(h2(h,89076,4)|0)){e=0;break}if(!(h2(h,105812,7)|0)){e=1;break}if(h2(h,89081,6)|0)if((e|0)==2)e=h;else break;else e=h+6|0}if(!(((d[e>>0]|0)+-48|0)>>>0<10?(c[k>>2]=j,(q4(e,100234,k)|0)>=1):0)){k=e4()|0;k=(Ya(0)|0)^k;c[j>>2]=k;c[m>>2]=k;i2(i,100234,m)|0;PA(b,89070,i)|0}c[f>>2]=c[j>>2];e=2}while(0);l=n;return e|0}function km(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f+4|0;c[e>>2]=1;d=jm(a,d,e)|0;if((d|0)!=2&(c[46838]|0)!=0)dA(0,89088,f)|0;if((d|0)==1)lm(a,b);W4(c[e>>2]|0);l=f;return d|0}function lm(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0.0,j=0,k=0,l=0.0;g=+(d|0);i=6.283185307179586/g;e=gC(b)|0;f=0.0;while(1){if(!e)break;l=g*+I(+f);j=c[e+16>>2]|0;k=c[j+132>>2]|0;h[k>>3]=l;h[k+8>>3]=g*+J(+f);a[j+119>>0]=1;if((c[47184]|0)>2)Dn(e,d);e=hC(b,e)|0;f=i+f}return}function mm(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0;r=l;l=l+80|0;d=r+24|0;n=r+32|0;k=r;p=r+28|0;m=r+64|0;q=+h[23314];do if(c[47180]|0){h[23314]=72.0;nm(b);om(b);if((_l(b,1)|0)<0){dA(3,89136,d)|0;break}else{aM(b,0);f=32;break}}else{o=cP(NA(b,88865)|0,0)|0;h[23314]=+ZO(b);nm(b);g=pm(b)|0;Kq(b,k,0)|0;i=qm(b)|0;j=kH(b,0,n)|0;d=jH(b,-1,8)|0;c[46837]=d;e=(d|0)<0;do if(!j){if((g|0)!=0&e){c[46837]=8;c[n+16>>2]=2;f=11;break}c[n+16>>2]=2;if((d|0)<=-1){rm(b,g,i);Nq(b,k)|0;om(b);if(!(o<<24>>24)){cn(b);break}else{sm(b);break}}else f=11}else if(e){c[46837]=8;f=11}else f=11;while(0);if((f|0)==11){j=qG(b,p,89164,m)|0;d=c[p>>2]|0;do if((d|0)<=1){rm(b,g,i);Nq(b,k)|0;if(!(o<<24>>24)){cn(b);break}else{sm(b);break}}else{f=o<<24>>24==0;e=0;while(1){if((e|0)>=(d|0))break;d=c[j+(e<<2)>>2]|0;IG(d)|0;rm(d,g,i);Nq(d,k)|0;mQ(d,2);if(f)cn(d);else sm(d);e=e+1|0;d=c[p>>2]|0}if(!(a[m>>0]|0))e=0;else{e=HK(d)|0;a[e>>0]=1;d=c[p>>2]|0}c[n+8>>2]=c[46837];c[n+20>>2]=e;c[n+12>>2]=1;gH(d,j,b,n)|0;l6(e)}while(0);zP(b);om(b);d=0;while(1){if((d|0)>=(c[p>>2]|0))break;n=c[j+(d<<2)>>2]|0;An(n);TC(n,137786)|0;tC(b,n)|0;d=d+1|0}l6(j)}aM(b,o<<24>>24==0&1);f=32}while(0);if((f|0)==32)h[23314]=q;l=r;return}function nm(a){a=a|0;var d=0,e=0,f=0,g=0;mQ(a,2);f=XO(a,DA(a,0,91669,0)|0,2,2)|0;d=(XO(a,DA(a,0,91675,0)|0,f,2)|0)&65535;b[(c[(vC(a)|0)+16>>2]|0)+176>>1]=d;d=c[(c[a+60>>2]|0)+16>>2]|0;g=d+176|0;e=b[g>>1]|0;e=(e&65535)<10?e:10;b[g>>1]=e;e=e&65535;c[47184]=e;b[d+178>>1]=(f|0)<(e|0)?f:e;Cm(a);return}function om(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+1040|0;e=f;d=f+8|0;a:do if((c[47184]|0)>2&(c[47233]|0)!=0){b=gC(a)|0;while(1){if(!b)break a;h[e>>3]=+h[(c[(c[b+16>>2]|0)+132>>2]|0)+16>>3]*72.0;i2(d,101510,e)|0;HA(b,c[47233]|0,d)|0;b=hC(a,b)|0}}while(0);l=f;return}function pm(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;d=NA(b,89849)|0;a:do if(!d)b=1;else{switch(a[d>>0]|0){case 0:{b=1;break a}case 75:{if(!(f2(d,89854)|0)){b=0;break a}break}case 109:{if(!(f2(d,89857)|0)){b=1;break a}break}case 104:{if(!(f2(d,89863)|0)){b=2;break a}break}default:{}}b=HB(b)|0;c[e>>2]=d;c[e+4>>2]=b;dA(0,89868,e)|0;b=1}while(0);l=f;return b|0}function qm(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+32|0;g=h+16|0;f=h+8|0;e=h;d=NA(b,89632)|0;a:do if(!d)b=0;else{switch(a[d>>0]|0){case 0:{b=0;break a}case 99:{if(!(f2(d,89638)|0)){b=1;break a}break}case 115:{if(!(f2(d,89646)|0)){b=2;break a}if(!(f2(d,89653)|0)){b=0;break a}break}case 109:{if(!(f2(d,89663)|0)){if(DA(b,2,92794,0)|0){b=3;break a}c[e>>2]=HB(b)|0;dA(0,89667,e)|0;dA(3,89730,f)|0;b=0;break a}break}default:{}}b=HB(b)|0;c[g>>2]=d;c[g+4>>2]=b;dA(0,89787,g)|0;b=0}while(0);l=h;return b|0}function rm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=NA(a,91362)|0;if(!e)if((b|0)==1)e=200;else e=(qB(a)|0)*100|0;else e=d6(e)|0;c[47183]=e;e=tn(a,b)|0;do if(!((e|0)<2|(c[47183]|0)<0))if(!b){um(a,e,d);break}else{tm(a,e,b,d,c[47184]|0);break}while(0);return}function sm(a){a=a|0;zP(a);Wm(a,1);return}function tm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+64|0;s=v+40|0;p=v+24|0;o=v;q=v+48|0;u=v+44|0;r=(e|0)==2;j=km(b,d,r?0:2)|0;k=Bm(b)|0;m=k|4;t=IK(g<<2)|0;c[t>>2]=IK(S(d<<3,g)|0)|0;i=c[47184]|0;g=1;while(1){if((g|0)>=(i|0))break;c[t+(g<<2)>>2]=(c[t>>2]|0)+((S(g,d)|0)<<3);g=g+1|0}i=(j|0)==0;g=i?m:k;if(a[195234]|0){m=c[15715]|0;k=c[47183]|0;n=+h[23315];c[o>>2]=f;c[o+4>>2]=i&1;c[o+8>>2]=g&3;c[o+12>>2]=k;h[o+16>>3]=n;z4(m,89445,o)|0;_3(89502,15,1,m)|0;RO();_3(89518,13,1,m)|0}o=xm(b,d,q,e,f,u)|0;if(a[195234]|0){m=c[15715]|0;n=+SO();c[p>>2]=d;h[p+8>>3]=n;z4(m,89532,p)|0}if((e|0)!=1){n=+YO(b,DA(b,0,89551,0)|0,0.0,-1797693134862315708145274.0e284);if(r){g=yr(o,d,c[q>>2]|0,t,c[u>>2]|0,c[47184]|0,g,f,c[47183]|0,n)|0;i=12}else i=14}else{g=ln(o,d,c[q>>2]|0,t,c[u>>2]|0,c[47184]|0,g,f,c[47183]|0)|0;i=12}if((i|0)==12)if((g|0)<0)dA(3,89561,s)|0;else i=14;a:do if((i|0)==14){i=gC(b)|0;while(1){if(!i)break a;m=c[i+16>>2]|0;j=c[m+120>>2]|0;k=c[47184]|0;m=m+132|0;g=0;while(1){if((g|0)>=(k|0))break;h[(c[m>>2]|0)+(g<<3)>>3]=+h[(c[t+(g<<2)>>2]|0)+(j<<3)>>3];g=g+1|0}i=hC(b,i)|0}}while(0);Zr(o);l6(c[t>>2]|0);l6(t);l6(c[u>>2]|0);l=v;return}function um(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0.0,k=0;i=l;l=l+48|0;g=i+32|0;f=i;switch(e|0){case 2:{vm(b,d);break}case 1:{if(!(ur(b,d)|0)){c[f>>2]=HB(b)|0;dA(0,89174,f)|0;dA(3,93665,i+8|0)|0;dA(3,89226,i+16|0)|0;dA(3,89298,i+24|0)|0;Rn(b,d)}break}default:{Rn(b,d);if((e|0)==3)wm(b)}}Fn(b,d);Gn(b,d);if(a[195234]|0){f=c[15715]|0;k=c[47183]|0;j=+h[23315];c[g>>2]=e;c[g+4>>2]=k;h[g+8>>3]=j;z4(f,89336,g)|0;RO()}Hn(b,d);l=i;return}function vm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0;j=l;l=l+16|0;g=xm(a,b,j,0,2,0)|0;i=$s(g,b)|0;e=a+16|0;a=0;while(1){if((a|0)>=(b|0))break;f=i+(a<<2)|0;d=0;while(1){if((d|0)==(b|0))break;h[(c[(c[(c[e>>2]|0)+160>>2]|0)+(a<<2)>>2]|0)+(d<<3)>>3]=+(c[(c[f>>2]|0)+(d<<2)>>2]|0);d=d+1|0}a=a+1|0}l6(c[i>>2]|0);l6(i);Zr(g);l=j;return}function wm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0.0;f=a+16|0;d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;g=c[b>>2]&3;e=(c[c[((g|0)==3?b:b+48|0)+40>>2]>>2]|0)>>>4;g=(c[c[((g|0)==2?b:b+-48|0)+40>>2]>>2]|0)>>>4;if((e|0)!=(g|0)){j=+h[(c[b+16>>2]|0)+136>>3];i=c[(c[f>>2]|0)+160>>2]|0;h[(c[i+(g<<2)>>2]|0)+(e<<3)>>3]=j;h[(c[i+(e<<2)>>2]|0)+(g<<3)>>3]=j}b=WA(a,b)|0}d=hC(a,d)|0}return}function xm(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0;j=rB(a)|0;H=TL()|0;if((f|0)==2){k=0;E=0}else{E=DA(a,2,92794,0)|0;k=(c[47236]|0)!=0&1;E=(E|0)!=0}B=(e|1|0)==3;F=IK(b*20|0)|0;G=IK(b<<2)|0;l=(j<<1)+b<<2;m=IK(l)|0;A=B|E;if(A)f=IK(l)|0;else f=0;D=(k|0)!=0;if(D)j=IK(l)|0;else j=0;if(B)k=IK(l)|0;else k=0;l=0;y=gC(a)|0;z=0;while(1){if(!y)break;WL(H);if((c[(c[y+16>>2]|0)+120>>2]|0)!=(z|0)){C=12;break}c[G+(z<<2)>>2]=y;v=F+(z*20|0)+4|0;c[v>>2]=m;w=F+(z*20|0)+8|0;c[w>>2]=A?f:0;x=F+(z*20|0)+12|0;c[x>>2]=D?j:0;c[F+(z*20|0)+16>>2]=B?k:0;s=1;u=ZA(a,y)|0;t=1;r=l;m=m+4|0;f=A?f+4|0:f;j=D?j+4|0:j;k=B?k+4|0:k;while(1){if(!u)break;p=c[u>>2]&3;q=u+-48|0;l=u+48|0;do if((c[((p|0)==2?u:q)+40>>2]|0)==(c[((p|0)==3?u:l)+40>>2]|0)){n=s;p=t;l=r}else{n=ym(H,u,s)|0;p=u+16|0;if((n|0)!=(s|0)){if(D){q=(c[x>>2]|0)+(n<<2)|0;g[q>>2]=+h[(c[p>>2]|0)+128>>3]+ +g[q>>2]}if(!E){n=s;p=t;l=r;break}n=(c[w>>2]|0)+(n<<2)|0;I=+h[(c[p>>2]|0)+136>>3];o=+(~~+g[n>>2]|0);g[n>>2]=I>o?I:o;n=s;p=t;l=r;break}J=c[u>>2]&3;l=(J|0)==3?u:l;r=r+1|0;n=s+1|0;s=m+4|0;c[m>>2]=c[(c[(c[((c[l+40>>2]|0)==(y|0)?((J|0)==2?u:q):l)+40>>2]|0)+16>>2]|0)+120>>2];if(D){g[j>>2]=+h[(c[p>>2]|0)+128>>3];j=j+4|0}m=f+4|0;if(E){g[f>>2]=+h[(c[p>>2]|0)+136>>3];if(B)C=27;else f=m}else if(B){g[f>>2]=1.0;C=27}if((C|0)==27){C=0;f=NA(u,101860)|0;l=k+4|0;if((f|0)!=0?(h2(f,136010,4)|0)==0:0)o=0.0;else o=(y|0)==(c[((c[u>>2]&3|0)==2?u:q)+40>>2]|0)?1.0:-1.0;g[k>>2]=o;f=m;k=l}p=t+1|0;l=r;m=s}while(0);s=n;u=_A(a,u,y)|0;t=p;r=l}c[F+(z*20|0)>>2]=t;c[c[v>>2]>>2]=z;l=r;y=hC(a,y)|0;z=z+1|0}if((C|0)==12)Aa(89375,89390,819,89402);if(B)zm(F,b,e,G);n=(l|0)/2|0;a:do if((n|0)!=(rB(a)|0)){l=(n<<1)+b<<2;k=KK(c[F+4>>2]|0,l)|0;if(E)f=KK(c[F+8>>2]|0,l)|0;if(D){m=0;j=KK(c[F+12>>2]|0,l)|0}else m=0;while(1){if((m|0)>=(b|0))break a;l=c[F+(m*20|0)>>2]|0;c[F+(m*20|0)+4>>2]=k;if(E){c[F+(m*20|0)+8>>2]=f;f=f+(l<<2)|0}if(D){c[F+(m*20|0)+12>>2]=j;j=j+(l<<2)|0}m=m+1|0;k=k+(l<<2)|0}}while(0);c[d>>2]=n;if(!i)l6(G);else c[i>>2]=G;XL(H);return F|0}function ym(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=c[b>>2]&3;e=c[(c[(c[((f|0)==3?b:b+48|0)+40>>2]|0)+16>>2]|0)+120>>2]|0;b=c[(c[(c[((f|0)==2?b:b+-48|0)+40>>2]|0)+16>>2]|0)+120>>2]|0;f=(e|0)>(b|0);return YL(a,f?b:e,f?e:b,d)|0}function zm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=0;while(1){if((g|0)>=(d|0)){g=0;break}h=c[(c[f+(g<<2)>>2]|0)+16>>2]|0;a[h+157>>0]=0;a[h+158>>0]=0;g=g+1|0}while(1){if((g|0)>=(d|0))break;if(!(a[(c[(c[f+(g<<2)>>2]|0)+16>>2]|0)+157>>0]|0))Am(b,g,e,f);g=g+1|0}return}function Am(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0;q=(c[f+(d<<2)>>2]|0)+16|0;l=c[q>>2]|0;a[l+157>>0]=1;a[l+158>>0]=1;l=b+(d*20|0)|0;m=b+(d*20|0)+16|0;n=b+(d*20|0)+4|0;o=(e|0)==3?-1.0:1.0;k=1;a:while(1){if((k|0)>=(c[l>>2]|0)){h=14;break}h=(c[m>>2]|0)+(k<<2)|0;do if(!(+g[h>>2]==1.0)){p=c[(c[n>>2]|0)+(k<<2)>>2]|0;i=c[(c[f+(p<<2)>>2]|0)+16>>2]|0;if(!(a[i+158>>0]|0)){if(a[i+157>>0]|0)break;Am(b,p,e,f);break}g[h>>2]=o;i=c[b+(p*20|0)>>2]|0;j=b+(p*20|0)+4|0;h=1;while(1){if((h|0)>=(i|0)){h=9;break a}if((c[(c[j>>2]|0)+(h<<2)>>2]|0)==(d|0))break;h=h+1|0}g[(c[b+(p*20|0)+16>>2]|0)+(h<<2)>>2]=-1.0}while(0);k=k+1|0}if((h|0)==9)Aa(89416,89390,721,89436);else if((h|0)==14){a[(c[q>>2]|0)+158>>0]=0;return}}function Bm(a){a=a|0;var b=0,d=0;d=l;l=l+16|0;b=d;a=XO(a,DA(a,0,89577,0)|0,2,0)|0;if((a|0)==0|(a|0)>2){c[b>>2]=89577;dA(0,89586,b)|0;a=2}l=d;return a|0}function Cm(a){a=a|0;var b=0,d=0,e=0;d=qB(a)|0;c[46838]=DA(a,1,102924,0)|0;e=DA(a,1,90961,0)|0;b=gC(a)|0;while(1){if(!b)break;Wl(b);Xl(c[46838]|0,e,b,d)|0;b=hC(a,b)|0}d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;Dm(b);b=WA(a,b)|0}d=hC(a,d)|0}return}function Dm(a){a=a|0;var b=0.0;RC(a,137763,176,1)|0;rP(a)|0;b=+YO(a,c[47236]|0,1.0,1.0);h[(c[a+16>>2]|0)+128>>3]=b;return}function Em(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0;a=HK(64)|0;e=a+8|0;f=d+8|0;g=e+48|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(g|0));d=c[d+56>>2]|0;c[a+56>>2]=d;b[(c[d+16>>2]|0)+168>>1]=1;return a|0}function Fm(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function Gm(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;e=c[d>>2]|0;if(a>>>0<=e>>>0)if(a>>>0>=e>>>0){e=c[b+24>>2]|0;a=c[d+24>>2]|0;if(e>>>0<=a>>>0)if(e>>>0>=a>>>0){a=~~(+h[b+8>>3]-+h[d+8>>3]);if(!a){a=~~(+h[b+16>>3]-+h[d+16>>3]);if(!a){a=~~(+h[b+32>>3]-+h[d+32>>3]);if(!a)a=~~(+h[b+40>>3]-+h[d+40>>3])}}}else a=-1;else a=1}else a=-1;else a=1;return a|0}function Hm(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0.0,j=0,k=0,m=0;k=l;l=l+16|0;g=k;h=e+16|0;m=b[(c[h>>2]|0)+168>>1]|0;j=m<<16>>16;i=+(f|0);if(m<<16>>16!=1&(a[195236]|0)==0){h=IK(j<<2)|0;f=0;while(1){if((f|0)>=(j|0))break;c[h+(f<<2)>>2]=e;e=c[(c[e+16>>2]|0)+172>>2]|0;f=f+1|0}jO(d,h,0,j,i,i,17832);e=0;while(1){if((e|0)>=(j|0))break;f=c[h+(e<<2)>>2]|0;g=f+16|0;if(c[(c[g>>2]|0)+96>>2]|0){m=uC(c[((c[f>>2]&3|0)==3?f:f+48|0)+40>>2]|0)|0;xP(m,c[(c[g>>2]|0)+96>>2]|0)}qO(f);e=e+1|0}l6(h)}else{c[g>>2]=e;jO(d,g,0,1,i,i,17832);if(c[(c[h>>2]|0)+96>>2]|0){m=uC(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)|0;xP(m,c[(c[h>>2]|0)+96>>2]|0)}qO(e)}l=k;return}function Im(a){a=a|0;return 0}function Jm(a){a=a|0;return 0}function Km(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0,Q=0,R=0.0,S=0,T=0,U=0;U=l;l=l+384|0;P=U+368|0;Q=U+112|0;y=U+32|0;q=U+336|0;D=U+320|0;E=U+304|0;F=U+288|0;H=U+272|0;z=U+256|0;A=U+240|0;B=U+224|0;C=U+208|0;i=U+192|0;r=U+176|0;s=U+160|0;t=U+144|0;u=U+128|0;v=U+96|0;w=U+16|0;x=U;S=d+4|0;T=b+16|0;a:do switch(UM(b)|0){case 3:case 1:{b=HK(8)|0;f=c[T>>2]|0;i=c[f+12>>2]|0;do if(!(e<<24>>24)){f=c[i+8>>2]|0;if((f|0)>2){R=0.0;y=c[i+44>>2]|0;q=0;K=+g[d>>2];L=+g[S>>2];break}else{R=+S4()*.01;f=8;y=0;q=1;K=0.0;L=0.0;break}}else if(!(c[i+40>>2]&2048)){L=+h[f+88>>3];K=-L;R=+h[f+80>>3];O=R*-.5;h[y>>3]=K;h[y+8>>3]=O;h[y+16>>3]=L;h[y+24>>3]=O;R=R*.5;h[y+32>>3]=L;h[y+40>>3]=R;h[y+48>>3]=K;h[y+56>>3]=R;R=0.0;f=4;q=0;K=0.0;L=0.0;break}else{wP(q,i);K=+h[q>>3];O=+h[q+8>>3];L=+h[q+16>>3];R=+h[q+24>>3];h[y>>3]=K;h[y+8>>3]=O;h[y+16>>3]=L;h[y+24>>3]=O;h[y+32>>3]=L;h[y+40>>3]=R;h[y+48>>3]=K;h[y+56>>3]=R;R=0.0;f=4;q=0;K=0.0;L=0.0;break}while(0);c[b+4>>2]=f;r=HK(f<<4)|0;c[b>>2]=r;s=d+8|0;M=+(f|0);t=(f|0)==4;N=-K;O=-L;e=0;while(1){if((f|0)<=(e|0))break a;i=(a[s>>0]|0)!=0;u=c[T>>2]|0;do if(q){k=R+ +(e|0)*6.283185307179586/M;o=+I(+k);k=+J(+k);p=+g[d>>2];m=+g[S>>2];j=+h[u+80>>3];n=+h[u+96>>3]+ +h[u+88>>3];if(i){k=k*(m+j);j=o*(p+n)}else{k=k*m*j;j=o*p*n}m=j*.5;j=k*.5}else{n=+h[y+(e<<4)+8>>3];m=+h[y+(e<<4)>>3];if(!i){m=K*m;j=L*n;break}if(!t){j=+G(+(n*n+m*m));m=m*(K/j+1.0);j=n*(L/j+1.0);break}switch(e|0){case 0:{k=L;j=K;break}case 1:{k=L;j=N;break}case 2:{k=O;j=N;break}case 3:{k=O;j=K;break}default:{k=0.0;j=0.0}}m=m+j;j=n+k}while(0);Q=f-e+-1|0;h[r+(Q<<4)>>3]=m+ +h[u+16>>3];h[r+(Q<<4)+8>>3]=j+ +h[u+24>>3];e=e+1|0}}case 2:{b=c[(c[T>>2]|0)+12>>2]|0;j=+h[b+16>>3];n=+h[b+24>>3];k=+h[b+32>>3];m=+h[b+40>>3];b=HK(8)|0;c[b+4>>2]=4;f=HK(64)|0;c[b>>2]=f;T=(c[T>>2]|0)+16|0;c[Q>>2]=c[T>>2];c[Q+4>>2]=c[T+4>>2];c[Q+8>>2]=c[T+8>>2];c[Q+12>>2]=c[T+12>>2];if(!(a[d+8>>0]|0)){c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(z,j,n,P,d);c[f>>2]=c[z>>2];c[f+4>>2]=c[z+4>>2];c[f+8>>2]=c[z+8>>2];c[f+12>>2]=c[z+12>>2];T=(c[b>>2]|0)+16|0;c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(A,j,m,P,d);c[T>>2]=c[A>>2];c[T+4>>2]=c[A+4>>2];c[T+8>>2]=c[A+8>>2];c[T+12>>2]=c[A+12>>2];T=(c[b>>2]|0)+32|0;c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(B,k,m,P,d);c[T>>2]=c[B>>2];c[T+4>>2]=c[B+4>>2];c[T+8>>2]=c[B+8>>2];c[T+12>>2]=c[B+12>>2];T=(c[b>>2]|0)+48|0;c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(C,k,n,P,d);c[T>>2]=c[C>>2];c[T+4>>2]=c[C+4>>2];c[T+8>>2]=c[C+8>>2];c[T+12>>2]=c[C+12>>2];break a}else{R=j-+g[d>>2];O=n-+g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(D,R,O,P);c[f>>2]=c[D>>2];c[f+4>>2]=c[D+4>>2];c[f+8>>2]=c[D+8>>2];c[f+12>>2]=c[D+12>>2];T=(c[b>>2]|0)+16|0;O=j-+g[d>>2];R=m+ +g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(E,O,R,P);c[T>>2]=c[E>>2];c[T+4>>2]=c[E+4>>2];c[T+8>>2]=c[E+8>>2];c[T+12>>2]=c[E+12>>2];T=(c[b>>2]|0)+32|0;R=k+ +g[d>>2];O=m+ +g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(F,R,O,P);c[T>>2]=c[F>>2];c[T+4>>2]=c[F+4>>2];c[T+8>>2]=c[F+8>>2];c[T+12>>2]=c[F+12>>2];T=(c[b>>2]|0)+48|0;O=k+ +g[d>>2];R=n-+g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(H,O,R,P);c[T>>2]=c[H>>2];c[T+4>>2]=c[H+4>>2];c[T+8>>2]=c[H+8>>2];c[T+12>>2]=c[H+12>>2];break a}}case 4:{b=HK(8)|0;c[b+4>>2]=4;f=HK(64)|0;c[b>>2]=f;H=c[T>>2]|0;F=H+16|0;c[Q>>2]=c[F>>2];c[Q+4>>2]=c[F+4>>2];c[Q+8>>2]=c[F+8>>2];c[Q+12>>2]=c[F+12>>2];j=-+h[H+88>>3];k=-+h[H+80>>3];if(!(a[d+8>>0]|0)){c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(u,j,k,P,d);c[f>>2]=c[u>>2];c[f+4>>2]=c[u+4>>2];c[f+8>>2]=c[u+8>>2];c[f+12>>2]=c[u+12>>2];S=(c[b>>2]|0)+16|0;H=c[T>>2]|0;O=-+h[H+88>>3];R=+h[H+80>>3];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(v,O,R,P,d);c[S>>2]=c[v>>2];c[S+4>>2]=c[v+4>>2];c[S+8>>2]=c[v+8>>2];c[S+12>>2]=c[v+12>>2];S=(c[b>>2]|0)+32|0;H=c[T>>2]|0;R=+h[H+96>>3];O=+h[H+80>>3];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(w,R,O,P,d);c[S>>2]=c[w>>2];c[S+4>>2]=c[w+4>>2];c[S+8>>2]=c[w+8>>2];c[S+12>>2]=c[w+12>>2];S=(c[b>>2]|0)+48|0;T=c[T>>2]|0;O=+h[T+96>>3];R=-+h[T+80>>3];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(x,O,R,P,d);c[S>>2]=c[x>>2];c[S+4>>2]=c[x+4>>2];c[S+8>>2]=c[x+8>>2];c[S+12>>2]=c[x+12>>2];break a}else{R=j-+g[d>>2];O=k-+g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(i,R,O,P);c[f>>2]=c[i>>2];c[f+4>>2]=c[i+4>>2];c[f+8>>2]=c[i+8>>2];c[f+12>>2]=c[i+12>>2];H=(c[b>>2]|0)+16|0;F=c[T>>2]|0;O=-+h[F+88>>3]-+g[d>>2];R=+h[F+80>>3]+ +g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(r,O,R,P);c[H>>2]=c[r>>2];c[H+4>>2]=c[r+4>>2];c[H+8>>2]=c[r+8>>2];c[H+12>>2]=c[r+12>>2];H=(c[b>>2]|0)+32|0;F=c[T>>2]|0;R=+h[F+96>>3]+ +g[d>>2];O=+h[F+80>>3]+ +g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(s,R,O,P);c[H>>2]=c[s>>2];c[H+4>>2]=c[s+4>>2];c[H+8>>2]=c[s+8>>2];c[H+12>>2]=c[s+12>>2];H=(c[b>>2]|0)+48|0;T=c[T>>2]|0;O=+h[T+96>>3]+ +g[d>>2];R=-+h[T+80>>3]-+g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(t,O,R,P);c[H>>2]=c[t>>2];c[H+4>>2]=c[t+4>>2];c[H+8>>2]=c[t+8>>2];c[H+12>>2]=c[t+12>>2];break a}}default:b=0}while(0);l=U;return b|0}function Lm(a,b,c,d){a=a|0;b=+b;c=+c;d=d|0;c=+h[d+8>>3]+c;h[a>>3]=+h[d>>3]+b;h[a+8>>3]=c;return}function Mm(a,b,c,d,e){a=a|0;b=+b;c=+c;d=d|0;e=e|0;c=+h[d+8>>3]+ +g[e+4>>2]*c;h[a>>3]=+h[d>>3]+ +g[e>>2]*b;h[a+8>>3]=c;return}function Nm(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;o=l;l=l+112|0;j=o+88|0;i=o+72|0;k=o+32|0;m=o+16|0;n=o;f=o+56|0;g=o+40|0;h=b+48|0;r=(c[(c[((c[b>>2]&3|0)==3?b:h)+40>>2]|0)+16>>2]|0)+16|0;p=b+16|0;q=(c[p>>2]|0)+16|0;c[i>>2]=c[r>>2];c[i+4>>2]=c[r+4>>2];c[i+8>>2]=c[r+8>>2];c[i+12>>2]=c[r+12>>2];c[j>>2]=c[q>>2];c[j+4>>2]=c[q+4>>2];c[j+8>>2]=c[q+8>>2];c[j+12>>2]=c[q+12>>2];Om(f,i,j);c[m>>2]=c[f>>2];c[m+4>>2]=c[f+4>>2];c[m+8>>2]=c[f+8>>2];c[m+12>>2]=c[f+12>>2];f=b+-48|0;q=(c[(c[((c[b>>2]&3|0)==2?b:f)+40>>2]|0)+16>>2]|0)+16|0;p=(c[p>>2]|0)+56|0;c[i>>2]=c[q>>2];c[i+4>>2]=c[q+4>>2];c[i+8>>2]=c[q+8>>2];c[i+12>>2]=c[q+12>>2];c[j>>2]=c[p>>2];c[j+4>>2]=c[p+4>>2];c[j+8>>2]=c[p+8>>2];c[j+12>>2]=c[p+12>>2];Om(g,i,j);c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];c[n+12>>2]=c[g+12>>2];if(!e){g=-1111;f=-1111}else{r=c[b>>2]&3;g=c[(c[(c[((r|0)==2?b:f)+40>>2]|0)+16>>2]|0)+288>>2]|0;f=c[(c[(c[((r|0)==3?b:h)+40>>2]|0)+16>>2]|0)+288>>2]|0};c[i>>2]=c[m>>2];c[i+4>>2]=c[m+4>>2];c[i+8>>2]=c[m+8>>2];c[i+12>>2]=c[m+12>>2];c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];KX(d,i,f,j,g,k)|0;p=k;q=c[p+4>>2]|0;r=a;c[r>>2]=c[p>>2];c[r+4>>2]=q;l=o;return}function Om(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=d;return}function Pm(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+144|0;r=w+104|0;s=w+88|0;q=w+80|0;p=w+72|0;m=w+64|0;u=w+128|0;o=w+32|0;n=w+124|0;v=w+16|0;t=w;k=w+120|0;j=(c[b+16>>2]|0)+144|0;i=c[j>>2]|0;j=c[j+4>>2]|0;h=m;c[h>>2]=i;c[h+4>>2]=j;h=i;c[v>>2]=c[h>>2];c[v+4>>2]=c[h+4>>2];c[v+8>>2]=c[h+8>>2];c[v+12>>2]=c[h+12>>2];j=i+(j+-1<<4)|0;c[t>>2]=c[j>>2];c[t+4>>2]=c[j+4>>2];c[t+8>>2]=c[j+8>>2];c[t+12>>2]=c[j+12>>2];a:do if(!(g<<24>>24)){h=-1111;g=-1111}else{h=-1111;g=-1111;j=0;while(1){if((j|0)>=(f|0))break a;i=e+(j<<2)|0;if((g|0)==-1111){g=c[i>>2]|0;c[s>>2]=c[g>>2];c[s+4>>2]=c[g+4>>2];c[r>>2]=c[v>>2];c[r+4>>2]=c[v+4>>2];c[r+8>>2]=c[v+8>>2];c[r+12>>2]=c[v+12>>2];g=(LX(s,r)|0)==0;g=g?-1111:j}if((h|0)==-1111){h=c[i>>2]|0;c[s>>2]=c[h>>2];c[s+4>>2]=c[h+4>>2];c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];h=(LX(s,r)|0)==0;h=h?-1111:j}j=j+1|0}}while(0);Qm(e,f,g,h,k,n);c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;c[o+20>>2]=0;c[o+24>>2]=0;c[o+28>>2]=0;h=c[k>>2]|0;n=c[n>>2]|0;c[r>>2]=c[m>>2];c[r+4>>2]=c[m+4>>2];g=b+48|0;if((MX(h,n,r,o,u)|0)<0){u=HB(c[((c[b>>2]&3|0)==3?b:g)+40>>2]|0)|0;v=HB(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0;c[p>>2]=u;c[p+4>>2]=v;dA(1,89929,p)|0}else{if((d[195234]|0)>1){p=c[15715]|0;n=HB(c[((c[b>>2]&3|0)==3?b:g)+40>>2]|0)|0;g=b+-48|0;o=HB(c[((c[b>>2]&3|0)==2?b:g)+40>>2]|0)|0;c[q>>2]=n;c[q+4>>2]=o;z4(p,89977,q)|0}else g=b+-48|0;bO(b,c[((c[b>>2]&3|0)==2?b:g)+40>>2]|0,c[u>>2]|0,c[u+4>>2]|0,17832);l6(h);c[s>>2]=c[v>>2];c[s+4>>2]=c[v+4>>2];c[s+8>>2]=c[v+8>>2];c[s+12>>2]=c[v+12>>2];c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];wO(a,b,s,r)}l=w;return}function Qm(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;i=0;h=0;while(1){if((i|0)>=(b|0))break;if(!((i|0)==(d|0)|(i|0)==(e|0)))h=(c[(c[a+(i<<2)>>2]|0)+4>>2]|0)+h|0;i=i+1|0}o=IK(h<<5)|0;i=0;n=0;while(1){if((n|0)>=(b|0))break;a:do if(!((n|0)==(d|0)|(n|0)==(e|0))){m=a+(n<<2)|0;l=0;while(1){j=c[m>>2]|0;k=c[j+4>>2]|0;if((l|0)>=(k|0))break a;p=l+1|0;q=o+(i<<5)|0;j=(c[j>>2]|0)+(l<<4)|0;c[q>>2]=c[j>>2];c[q+4>>2]=c[j+4>>2];c[q+8>>2]=c[j+8>>2];c[q+12>>2]=c[j+12>>2];j=o+(i<<5)+16|0;k=(c[c[m>>2]>>2]|0)+(((p|0)<(k|0)?p:0)<<4)|0;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];l=p;i=i+1|0}}while(0);n=n+1|0}if((i|0)==(h|0)){c[f>>2]=o;c[g>>2]=h;return}else Aa(89991,89998,77,90013)}function Rm(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;o=l;l=l+32|0;m=o+12|0;f=o;mr(f,a);c[m>>2]=c[f>>2];c[m+4>>2]=c[f+4>>2];c[m+8>>2]=c[f+8>>2];f=gC(a)|0;while(1){if(!f)break;g=UA(a,f)|0;while(1){if(!g)break;XN(g);g=WA(a,g)|0}f=hC(a,f)|0}h=Sz(17796,c[4591]|0)|0;f=gC(a)|0;while(1){if(!f)break;g=UA(a,f)|0;while(1){if(!g)break;i=g+16|0;if((c[47180]|0)>1?(j=c[i>>2]|0,(c[j+8>>2]|0)!=0):0){p=j+168|0;b[p>>1]=(b[p>>1]|0)+1<<16>>16}else n=14;if((n|0)==14?(n=0,k=Sm(h,g)|0,(k|0)!=(g|0)):0){p=c[k+16>>2]|0;q=p+168|0;b[q>>1]=(b[q>>1]|0)+1<<16>>16;p=p+172|0;c[(c[i>>2]|0)+172>>2]=c[p>>2];c[p>>2]=g}g=WA(a,g)|0}f=hC(a,f)|0}Oz(h)|0;if(!(eb[d&63](a,m,e)|0)){c[47185]=1;f=0}else f=1;l=o;return f|0}function Sm(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0.0,i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0;t=l;l=l+64|0;s=t;e=c[b>>2]&3;k=c[((e|0)==3?b:b+48|0)+40>>2]|0;e=c[((e|0)==2?b:b+-48|0)+40>>2]|0;j=c[b+16>>2]|0;o=j+24|0;f=j+56|0;i=j+64|0;j=j+16|0;do if(k>>>0>=e>>>0){if(k>>>0>e>>>0){r=e;e=k;p=+h[j>>3];q=+h[o>>3];g=+h[f>>3];d=+h[i>>3];break}m=+h[f>>3];n=+h[i>>3];g=+h[j>>3];d=+h[o>>3];if(!(gm)){f=d>n;if(d>3];q=+h[i>>3];g=+h[j>>3];d=+h[o>>3]}while(0);c[s+8>>2]=r;h[s+16>>3]=g;h[s+24>>3]=d;c[s+32>>2]=e;h[s+40>>3]=p;h[s+48>>3]=q;c[s+56>>2]=b;s=c[(eb[c[a>>2]&63](a,s,1)|0)+56>>2]|0;l=t;return s|0}function Tm(a,b){a=a|0;b=b|0;return Rm(a,24,b)|0}function Um(d,e,f){d=d|0;e=e|0;f=f|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0;G=l;l=l+112|0;C=G+88|0;B=G+72|0;t=G+56|0;p=G+24|0;o=G;u=G+64|0;D=G+40|0;E=G+8|0;i=(c[47180]|0)>1&1;s=(f|0)==8;do if((f|0)>5){r=HK((qB(d)|0)<<2)|0;n=s&1;m=gC(d)|0;q=0;while(1){if(!m)break;j=Km(m,e,n)|0;k=(c[m+16>>2]|0)+288|0;if(!j){c[k>>2]=-1111;j=q}else{c[k>>2]=q;c[r+(q<<2)>>2]=j;j=q+1|0}m=hC(d,m)|0;q=j}if(r){j=it(r,q)|0;if(j|0){if(s){z=0;A=r;y=r;v=1;break}z=HX(r,q)|0;A=r;y=r;v=1;break}if(s){dA(0,90027,o)|0;j=0;z=0;A=r;y=r;v=1;break}else{H=+g[e+4>>2];h[p>>3]=+g[e>>2];h[p+8>>3]=H;dA(0,90105,p)|0;j=0;z=0;A=r;y=r;v=1;break}}else{j=0;z=0;A=0;y=0;v=0}}else{j=0;z=0;A=0;q=0;y=0;v=0}while(0);w=(f|0)==10;x=(z|0)!=0;j=s&(j|0)!=0;if(a[195234]|0){s=c[15715]|0;c[t>>2]=j|x^1?(j?90187:90204):w?110357:90218;z4(s,90228,t)|0}a:do if(!x){if(j){pQ(d,0);i=1}}else{k=gC(d)|0;while(1){if(!k)break a;j=UA(d,k)|0;while(1){if(!j)break;t=(c[j+16>>2]|0)+144|0;Nm(u,j,z,1,0,0);r=u;s=c[r+4>>2]|0;c[t>>2]=c[r>>2];c[t+4>>2]=s;j=WA(d,j)|0}k=hC(d,k)|0}}while(0);p=(i|0)==0;r=d+60|0;i=0;o=gC(d)|0;j=0;while(1){if(!o)break;s=o+16|0;e=UA(d,o)|0;while(1){if(!e)break;n=c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0;m=e+16|0;k=c[m>>2]|0;if(!p?(c[k+8>>2]|0)!=0:0){u=(c[s>>2]|0)+16|0;t=k+16|0;c[B>>2]=c[u>>2];c[B+4>>2]=c[u+4>>2];c[B+8>>2]=c[u+8>>2];c[B+12>>2]=c[u+12>>2];c[C>>2]=c[t>>2];c[C+4>>2]=c[t+4>>2];c[C+8>>2]=c[t+8>>2];c[C+12>>2]=c[t+12>>2];Om(D,B,C);t=(c[n+16>>2]|0)+16|0;u=(c[m>>2]|0)+56|0;c[B>>2]=c[t>>2];c[B+4>>2]=c[t+4>>2];c[B+8>>2]=c[t+8>>2];c[B+12>>2]=c[t+12>>2];c[C>>2]=c[u>>2];c[C+4>>2]=c[u+4>>2];c[C+8>>2]=c[u+8>>2];c[C+12>>2]=c[u+12>>2];Om(E,B,C);c[B>>2]=c[D>>2];c[B+4>>2]=c[D+4>>2];c[B+8>>2]=c[D+8>>2];c[B+12>>2]=c[D+12>>2];c[C>>2]=c[E>>2];c[C+4>>2]=c[E+4>>2];c[C+8>>2]=c[E+8>>2];c[C+12>>2]=c[E+12>>2];wO(d,e,B,C)}else F=33;b:do if((F|0)==33){F=0;u=b[k+168>>1]|0;k=u<<16>>16;if(u<<16>>16){if((o|0)==(n|0)){if(!i){j=HK(96)|0;c[j+84>>2]=HK(((qB(d)|0)<<5)+11520|0)|0;i=j}Hm(i,e,c[(c[(c[r>>2]|0)+16>>2]|0)+248>>2]|0);break}if(!x){MM(d,e,f,17832);break}k=a[195236]|0?1:k;m=e;n=0;while(1){if((n|0)>=(k|0))break b;if(w)Pm(d,m,A,q,1);else Vm(d,m);m=c[(c[m+16>>2]|0)+172>>2]|0;n=n+1|0}}}while(0);e=WA(d,e)|0}o=hC(d,o)|0}if(x)JX(z);if(i|0){l6(c[i+84>>2]|0);l6(j)}if(v){i=0;while(1){if((i|0)>=(q|0))break;l6(c[A+(i<<2)>>2]|0);i=i+1|0}l6(y)}l=G;return 0}function Vm(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;k=l;l=l+96|0;g=k+64|0;f=k+48|0;e=k+40|0;h=k+80|0;m=k+32|0;i=k+16|0;j=k;n=(c[b+16>>2]|0)+144|0;o=c[n>>2]|0;n=c[n+4>>2]|0;p=m;c[p>>2]=o;c[p+4>>2]=n;p=o;c[i>>2]=c[p>>2];c[i+4>>2]=c[p+4>>2];c[i+8>>2]=c[p+8>>2];c[i+12>>2]=c[p+12>>2];n=o+(n+-1<<4)|0;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];c[g>>2]=c[m>>2];c[g+4>>2]=c[m+4>>2];DY(g,h);if((d[195234]|0)>1){o=c[15715]|0;m=HB(c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0;p=b+-48|0;n=HB(c[((c[b>>2]&3|0)==2?b:p)+40>>2]|0)|0;c[e>>2]=m;c[e+4>>2]=n;z4(o,90253,e)|0;e=p}else e=b+-48|0;bO(b,c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0,c[h>>2]|0,c[h+4>>2]|0,17832);c[f>>2]=c[i>>2];c[f+4>>2]=c[i+4>>2];c[f+8>>2]=c[i+8>>2];c[f+12>>2]=c[i+12>>2];c[g>>2]=c[j>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];wO(a,b,f,g);l=k;return}function Wm(a,d){a=a|0;d=d|0;var e=0;e=b[(c[a+16>>2]|0)+136>>1]&14;if(d<<24>>24)Xm(a)|0;if(e<<16>>16)Tm(a,e&65535)|0;return}function Xm(a){a=a|0;var b=0,d=0,e=0,f=0;d=Ym(a)|0;b=gC(a)|0;while(1){if(!b)break;e=c[b+16>>2]|0;f=c[e+132>>2]|0;h[e+16>>3]=+h[f>>3]*72.0;h[e+24>>3]=+h[f+8>>3]*72.0;b=hC(a,b)|0}return d|0}function Ym(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0.0,i=0.0,j=0,k=0,l=0,m=0;a:do if((c[a+60>>2]|0)==(a|0)?(d=a+16|0,e=c[d>>2]|0,(c[(c[e+8>>2]|0)+84>>2]|0)!=0):0){if(!(+h[e+16>>3]!=0.0)?!(+h[e+24>>3]!=0.0):0)b=0;else{Zm(a);b=1;e=c[d>>2]|0}m=(c[e+116>>2]&1|0)!=0;l=e+40|0;j=e+32|0;if(m){i=+h[j>>3];h[j>>3]=+h[l>>3];h[l>>3]=i}d=c[e+8>>2]|0;e=d+64|0;k=d+72|0;b:do switch(c[d+84>>2]|0){case 2:{f=+h[e>>3];if(f<=0.0)break a;g=f/+h[j>>3];f=+h[k>>3]/+h[l>>3];if(g<1.0|f<1.0)if(g>3];if(f<=0.0)break a;g=f/+h[j>>3];f=+h[k>>3]/+h[l>>3];if(!(g>1.0&f>1.0))break a;f=g>3];f=+h[l>>3]/+h[j>>3];if(f1){d=gC(a)|0;while(1){if(!d)break c;b=UA(a,d)|0;while(1){if(!b)break;if(c[(c[b+16>>2]|0)+8>>2]|0)_m(b,f,g);b=WA(a,b)|0}d=hC(a,d)|0}}while(0);b=gC(a)|0;while(1){if(!b)break;m=c[(c[b+16>>2]|0)+132>>2]|0;h[m>>3]=f*+h[m>>3];m=m+8|0;h[m>>3]=g*+h[m>>3];b=hC(a,b)|0}$m(a,f,g);b=1}else b=0;while(0);return b|0}function Zm(b){b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0;n=l;l=l+32|0;k=n+16|0;m=n;d=(c[b+16>>2]|0)+16|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];f=+h[m>>3];g=f/72.0;i=+h[m+8>>3];j=i/72.0;d=gC(b)|0;while(1){if(!d)break;e=c[d+16>>2]|0;o=c[e+132>>2]|0;h[o>>3]=+h[o>>3]-g;o=o+8|0;h[o>>3]=+h[o>>3]-j;e=c[e+108>>2]|0;if(e|0?a[e+81>>0]|0:0){o=e+56|0;h[o>>3]=+h[o>>3]-f;o=e+64|0;h[o>>3]=+h[o>>3]-i}d=hC(b,d)|0}e=gC(b)|0;while(1){if(!e)break;d=UA(b,e)|0;while(1){if(!d)break;if(c[(c[d+16>>2]|0)+8>>2]|0){c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];an(d,k)}d=WA(b,d)|0}e=hC(b,e)|0}c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];bn(b,k);l=n;return}function _m(b,d,e){b=b|0;d=+d;e=+e;var f=0.0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0;r=c[b>>2]&3;k=c[(c[(c[((r|0)==2?b:b+-48|0)+40>>2]|0)+16>>2]|0)+132>>2]|0;u=d+-1.0;s=u*+h[k>>3]*72.0;v=e+-1.0;t=v*+h[k+8>>3]*72.0;r=c[(c[(c[((r|0)==3?b:b+48|0)+40>>2]|0)+16>>2]|0)+132>>2]|0;u=u*+h[r>>3]*72.0;v=v*+h[r+8>>3]*72.0;r=c[b+16>>2]|0;k=c[r+8>>2]|0;l=c[k+4>>2]|0;m=l+-1|0;b=0;k=c[k>>2]|0;while(1){if((b|0)>=(l|0))break;n=c[k+4>>2]|0;o=(b|0)==(m|0);p=n+-1|0;i=0;j=c[k>>2]|0;while(1){if((i|0)>=(n|0))break;q=j+8|0;f=+h[j>>3];g=+h[q>>3];do if(i|b)if(o&(i|0)==(p|0)){h[j>>3]=s+f;f=t+g;break}else{h[j>>3]=f*d;f=g*e;break}else{h[j>>3]=u+f;f=v+g}while(0);h[q>>3]=f;i=i+1|0;j=j+16|0}if(c[k+8>>2]|0){q=k+16|0;h[q>>3]=u+ +h[q>>3];q=k+24|0;h[q>>3]=v+ +h[q>>3]}if(c[k+12>>2]|0){q=k+32|0;h[q>>3]=s+ +h[q>>3];q=k+40|0;h[q>>3]=t+ +h[q>>3]}b=b+1|0;k=k+48|0}b=c[r+96>>2]|0;if(b|0?a[b+81>>0]|0:0){q=b+56|0;h[q>>3]=+h[q>>3]*d;q=b+64|0;h[q>>3]=+h[q>>3]*e}b=c[r+100>>2]|0;if(b|0?a[b+81>>0]|0:0){q=b+56|0;h[q>>3]=s+ +h[q>>3];q=b+64|0;h[q>>3]=t+ +h[q>>3]}b=c[r+104>>2]|0;if(b|0?a[b+81>>0]|0:0){r=b+56|0;h[r>>3]=u+ +h[r>>3];r=b+64|0;h[r>>3]=v+ +h[r>>3]}return}function $m(b,d,e){b=b|0;d=+d;e=+e;var f=0,g=0,i=0;i=b+16|0;g=c[i>>2]|0;b=g+32|0;h[b>>3]=+h[b>>3]*d;b=g+40|0;h[b>>3]=+h[b>>3]*e;b=g+16|0;h[b>>3]=+h[b>>3]*d;b=g+24|0;h[b>>3]=+h[b>>3]*e;b=c[g+12>>2]|0;if((b|0)!=0?(a[b+81>>0]|0)!=0:0){f=b+56|0;h[f>>3]=+h[f>>3]*d;f=b+64|0;h[f>>3]=+h[f>>3]*e;f=1;b=g}else{f=1;b=g}while(1){if((f|0)>(c[b+180>>2]|0))break;$m(c[(c[b+184>>2]|0)+(f<<2)>>2]|0,d,e);f=f+1|0;b=c[i>>2]|0}return}function an(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0;k=c[b+16>>2]|0;b=c[k+8>>2]|0;j=c[b+4>>2]|0;l=d+8|0;b=c[b>>2]|0;g=0;while(1){if((g|0)>=(j|0))break;i=c[b+4>>2]|0;e=c[b>>2]|0;f=0;while(1){if((f|0)>=(i|0))break;h[e>>3]=+h[e>>3]-+h[d>>3];m=e+8|0;h[m>>3]=+h[m>>3]-+h[l>>3];e=e+16|0;f=f+1|0}if(c[b+8>>2]|0){m=b+16|0;h[m>>3]=+h[m>>3]-+h[d>>3];m=b+24|0;h[m>>3]=+h[m>>3]-+h[l>>3]}if(c[b+12>>2]|0){m=b+32|0;h[m>>3]=+h[m>>3]-+h[d>>3];m=b+40|0;h[m>>3]=+h[m>>3]-+h[l>>3]}b=b+48|0;g=g+1|0}b=c[k+96>>2]|0;if(b|0?a[b+81>>0]|0:0){m=b+56|0;h[m>>3]=+h[m>>3]-+h[d>>3];m=b+64|0;h[m>>3]=+h[m>>3]-+h[l>>3]}b=c[k+108>>2]|0;if(b|0?a[b+81>>0]|0:0){m=b+56|0;h[m>>3]=+h[m>>3]-+h[d>>3];m=b+64|0;h[m>>3]=+h[m>>3]-+h[l>>3]}b=c[k+100>>2]|0;if(b|0?a[b+81>>0]|0:0){m=b+56|0;h[m>>3]=+h[m>>3]-+h[d>>3];m=b+64|0;h[m>>3]=+h[m>>3]-+h[l>>3]}b=c[k+104>>2]|0;if(b|0?a[b+81>>0]|0:0){m=b+56|0;h[m>>3]=+h[m>>3]-+h[d>>3];m=b+64|0;h[m>>3]=+h[m>>3]-+h[l>>3]}return}function bn(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0,k=0,m=0;k=l;l=l+16|0;j=k;g=+h[d>>3];i=b+16|0;b=c[i>>2]|0;e=b+32|0;h[e>>3]=+h[e>>3]-g;f=+h[d+8>>3];e=b+40|0;h[e>>3]=+h[e>>3]-f;e=b+16|0;h[e>>3]=+h[e>>3]-g;e=b+24|0;h[e>>3]=+h[e>>3]-f;e=c[b+12>>2]|0;if((e|0)!=0?(a[e+81>>0]|0)!=0:0){m=e+56|0;h[m>>3]=+h[m>>3]-g;e=e+64|0;h[e>>3]=+h[e>>3]-f;e=1}else e=1;while(1){if((e|0)>(c[b+180>>2]|0))break;m=c[(c[b+184>>2]|0)+(e<<2)>>2]|0;c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];bn(m,j);e=e+1|0;b=c[i>>2]|0}l=k;return}function cn(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0.0,i=0,j=0;i=l;l=l+16|0;d=i;zP(a);e=a+16|0;b=c[e>>2]|0;f=+h[b+16>>3]/72.0;g=+h[b+24>>3]/72.0;b=gC(a)|0;while(1){if(!b)break;j=c[(c[b+16>>2]|0)+132>>2]|0;h[j>>3]=+h[j>>3]-f;j=j+8|0;h[j>>3]=+h[j>>3]-g;b=hC(a,b)|0}j=(c[e>>2]|0)+16|0;c[d>>2]=c[j>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];c[d+12>>2]=c[j+12>>2];dn(a,d);Wm(a,1);l=i;return}function dn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0.0;g=l;l=l+16|0;f=g;d=a+16|0;a=1;while(1){e=c[d>>2]|0;if((a|0)>(c[e+180>>2]|0))break;e=c[(c[e+184>>2]|0)+(a<<2)>>2]|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];dn(e,f);a=a+1|0}j=+h[b>>3];f=e+32|0;h[f>>3]=+h[f>>3]-j;i=+h[b+8>>3];b=e+40|0;h[b>>3]=+h[b>>3]-i;b=e+16|0;h[b>>3]=+h[b>>3]-j;b=e+24|0;h[b>>3]=+h[b>>3]-i;l=g;return}function en(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0;p=(e|0)>2;n=0;o=0;j=c[f+4>>2]|0;b=c[f>>2]|0;while(1){if((o|0)>=(d|0)){b=0;break}i=c[(c[g+(o<<2)>>2]|0)+16>>2]|0;l=a[i+119>>0]|0;a:do if(!(l<<24>>24)){k=b+8|0;h[b>>3]=+S4();i=j+8|0;h[j>>3]=+S4();if(p){b=2;while(1){if((b|0)==(e|0)){j=n;b=k;break a}q=+S4();h[(c[f+(b<<2)>>2]|0)+(o<<3)>>3]=q;b=b+1|0}}else{j=n;b=k}}else{k=c[i+132>>2]|0;m=b+8|0;h[b>>3]=+h[k>>3];i=j+8|0;h[j>>3]=+h[k+8>>3];b:do if(p){j=2;b=k+16|0;while(1){if((j|0)==(e|0))break b;h[(c[f+(j<<2)>>2]|0)+(o<<3)>>3]=+h[b>>3];j=j+1|0;b=b+8|0}}while(0);j=(l&255)>1?1:n;b=m}while(0);n=j;o=o+1|0;j=i}while(1){if((b|0)>=(e|0))break;Et(d,c[f+(b<<2)>>2]|0);b=b+1|0}return n|0}function fn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0;d=HK(((S(b+1|0,b)|0)/2|0)<<2)|0;n=rn(b,b,0.0)|0;o=rn(b,b,0.0)|0;a:do if(!(c[a+8>>2]|0)){e=0;while(1){if((e|0)>=(b|0))break a;i=c[a+(e*20|0)>>2]|0;j=a+(e*20|0)+4|0;k=n+(e<<2)|0;f=1;while(1){if((f|0)>=(i|0))break;m=c[(c[j>>2]|0)+(f<<2)>>2]|0;h[(c[n+(m<<2)>>2]|0)+(e<<3)>>3]=-1.0;h[(c[k>>2]|0)+(m<<3)>>3]=-1.0;f=f+1|0}e=e+1|0}}else{e=0;while(1){if((e|0)>=(b|0))break a;i=c[a+(e*20|0)>>2]|0;j=a+(e*20|0)+4|0;k=a+(e*20|0)+8|0;m=n+(e<<2)|0;f=1;while(1){if((f|0)>=(i|0))break;p=c[(c[j>>2]|0)+(f<<2)>>2]|0;l=-1.0/+g[(c[k>>2]|0)+(f<<2)>>2];h[(c[n+(p<<2)>>2]|0)+(e<<3)>>3]=l;h[(c[m>>2]|0)+(p<<3)>>3]=l;f=f+1|0}e=e+1|0}}while(0);b:do if(!(tr(b,n,o)|0)){l6(d);d=0}else{f=0;j=0;m=b;while(1){if((j|0)>=(b|0))break b;k=o+(j<<2)|0;e=j;i=f;while(1){if((e|0)==(b|0))break;if((j|0)==(e|0))l=0.0;else{p=c[k>>2]|0;l=+h[p+(j<<3)>>3]+ +h[(c[o+(e<<2)>>2]|0)+(e<<3)>>3]-+h[p+(e<<3)>>3]*2.0}g[d+(i<<2)>>2]=l;e=e+1|0;i=i+1|0}f=f+m|0;j=j+1|0;m=m+-1|0}}while(0);sn(n);sn(o);return d|0}function gn(b,d){b=b|0;d=d|0;var e=0,f=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;s=l;l=l+16|0;r=s;if(c[b+8>>2]|0){e=hn(b,d)|0;i=0.0;f=0;q=0;while(1){if((q|0)>=(d|0))break;f=f+q|0;p=c[b+(q*20|0)>>2]|0;m=b+(q*20|0)+4|0;n=(S(q,d)|0)-f|0;o=b+(q*20|0)+8|0;k=1;while(1){if((k|0)>=(p|0))break;j=c[(c[m>>2]|0)+(k<<2)>>2]|0;if((j|0)>=(q|0)){j=e+(n+j<<2)|0;t=+g[(c[o>>2]|0)+(k<<2)>>2];i=i+ +F(+(+g[j>>2]-t));g[j>>2]=t}k=k+1|0}q=q+1|0}if(a[195234]|0){d=c[15715]|0;h[r>>3]=i;z4(d,90269,r)|0}}else e=0;l=s;return e|0}function hn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;h=m;i=HK(((S(b+1|0,b)|0)/2|0)<<2)|0;j=HK(b<<2)|0;rr(h,b);d=0;f=0;k=b;while(1){if((d|0)>=(b|0))break;es(d,a,b,j);e=d;g=f;while(1){if((e|0)==(b|0))break;c[i+(g<<2)>>2]=c[j+(e<<2)>>2];e=e+1|0;g=g+1|0}d=d+1|0;f=f+k|0;k=k+-1|0}l6(j);sr(h);l=m;return i|0}function jn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;i=n;j=HK(((S(b+1|0,b)|0)/2|0)<<2)|0;k=HK(b<<2)|0;rr(i,b);d=0;f=0;m=b;while(1){if((d|0)>=(b|0))break;nr(d,a,b,k,i);e=d;h=f;while(1){if((e|0)==(b|0))break;g[j+(h<<2)>>2]=+(c[k+(e<<2)>>2]|0);e=e+1|0;h=h+1|0}d=d+1|0;f=f+m|0;m=m+-1|0}l6(k);sr(i);l=n;return j|0}function kn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;r=a+8|0;d=c[r>>2]|0;e=0;f=0;while(1){if((f|0)>=(b|0))break;e=(c[a+(f*20|0)>>2]|0)+e|0;f=f+1|0}f=HK(e<<2)|0;q=HK(b<<2)|0;e=0;while(1){if((e|0)>=(b|0))break;c[q+(e<<2)>>2]=0;e=e+1|0}if(!(c[r>>2]|0)){h=0;while(1){if((h|0)>=(b|0))break;c[a+(h*20|0)+8>>2]=f;Ws(a,h,q);i=a+(h*20|0)|0;j=c[i>>2]|0;k=a+(h*20|0)+4|0;l=+(j+-1|0);e=1;while(1){if((e|0)>=(j|0))break;p=c[(c[k>>2]|0)+(e<<2)>>2]|0;s=l+ +((c[a+(p*20|0)>>2]|0)+-1|0);g[f+(e<<2)>>2]=s-+((Vs(a,h,p,q)|0)<<1|0);e=e+1|0}Xs(a,h,q);f=f+(c[i>>2]<<2)|0;h=h+1|0}f=jn(a,b)|0}else{j=0;while(1){if((j|0)>=(b|0))break;Ws(a,j,q);k=a+(j*20|0)|0;m=c[k>>2]|0;n=a+(j*20|0)+4|0;o=m+-2|0;p=a+(j*20|0)+8|0;i=1;while(1){if((i|0)>=(m|0))break;e=c[(c[n>>2]|0)+(i<<2)>>2]|0;h=o+(c[a+(e*20|0)>>2]|0)|0;s=+(h-((Vs(a,j,e,q)|0)<<1)|0);l=+g[(c[p>>2]|0)+(i<<2)>>2];if(s>l)l=+(h-((Vs(a,j,e,q)|0)<<1)|0);g[f+(i<<2)>>2]=l;i=i+1|0}Xs(a,j,q);c[p>>2]=f;f=f+(c[k>>2]<<2)|0;j=j+1|0}f=hn(a,b)|0}l6(q);l6(c[r>>2]|0);c[r>>2]=0;a:do if(d|0){e=0;while(1){if((e|0)>=(b|0))break a;c[a+(e*20|0)+8>>2]=d;d=d+(c[a+(e*20|0)>>2]<<2)|0;e=e+1|0}}while(0);return f|0}function ln(b,e,f,i,j,k,m,n,o){b=b|0;e=e|0;f=f|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0.0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0;N=l;l=l+80|0;M=N+56|0;L=N+48|0;A=N+40|0;v=N+32|0;t=N+24|0;s=N+16|0;q=N+8|0;p=N;r=m&4;K=m&3;a:do if((o|0)<0)f=0;else{if(a[195234]|0)RO();m=(n|0)==2;b:do if(m){if(a[195234]|0)_3(93591,24,1,c[15715]|0)|0;f=kn(b,e)|0;x=14}else{switch(n|0){case 1:{f=fn(b,e)|0;if(f|0){J=f;break b}dA(0,93616,p)|0;dA(3,93665,q)|0;x=15;break b}case 3:break;default:{x=15;break b}}if(a[195234]|0)_3(93718,21,1,c[15715]|0)|0;f=gn(b,e)|0;x=14}while(0);if((x|0)==14)if(!f)x=15;else J=f;do if((x|0)==15){if(a[195234]|0)_3(93740,26,1,c[15715]|0)|0;if(!(c[b+8>>2]|0)){J=jn(b,e)|0;break}else{J=hn(b,e)|0;break}}while(0);if(a[195234]|0){I=c[15715]|0;h[s>>3]=+SO();z4(I,93767,s)|0;_3(93779,25,1,I)|0;RO()}c:do if((e|0)>1&(r|0)!=0)if((mn(b,e,i,k,r,K,m&1)|0)<0){v=0;t=0;f=-1;b=0;s=0;r=0;q=0;p=0;n=0;m=0}else{m=0;while(1){if((m|0)>=(k|0)){z=0;x=34;break c}n=i+(m<<2)|0;u=1.0;f=0;while(1){if((f|0)==(e|0)){f=0;break}y=+F(+(+h[(c[n>>2]|0)+(f<<3)>>3]));u=y>u?y:u;f=f+1|0}while(1){if((f|0)==(e|0)){f=0;break}I=(c[n>>2]|0)+(f<<3)|0;h[I>>3]=+h[I>>3]/u;f=f+1|0}while(1){if((f|0)==(e|0))break;y=(+S4()+-.5)*1.0e-06;I=(c[n>>2]|0)+(f<<3)|0;h[I>>3]=+h[I>>3]+y;f=f+1|0}Et(e,c[n>>2]|0);m=m+1|0}}else{z=en(0,e,k,i,j)|0;x=34}while(0);d:do if((x|0)==34){if(a[195234]|0){I=c[15715]|0;h[t>>3]=+SO();z4(I,93805,t)|0}if((e|0)==1|(o|0)==0){f=0;break a}if(a[195234]|0){I=c[15715]|0;h[v>>3]=+SO();z4(I,93767,v)|0;_3(90291,26,1,I)|0;RO()}r=k<<2;I=HK(r)|0;b=e<<2;s=S(b,k)|0;H=HK(s)|0;f=0;while(1){if((f|0)>=(k|0))break;n=H+((S(f,e)|0)<<2)|0;c[I+(f<<2)>>2]=n;p=i+(f<<2)|0;m=0;while(1){if((m|0)>=(e|0))break;g[n+(m<<2)>>2]=+h[(c[p>>2]|0)+(m<<3)>>3];m=m+1|0}f=f+1|0}G=e+-1|0;e:do if(!K){f=0;u=0.0;p=0;while(1){if((p|0)>=(G|0))break e;q=e-p|0;n=f;m=1;while(1){f=n+1|0;if((m|0)>=(q|0))break;n=f;u=u+ +g[J+(f<<2)>>2];m=m+1|0}p=p+1|0}}else u=+(e|0)*+(G|0)*.5;while(0);C=(S(e+1|0,e)|0)/2|0;D=(K|0)==2;if(D)_t(C,J);$t(C,J);E=e<<3;n=HK(E)|0;u6(n|0,0,E|0)|0;f=0;p=0;while(1){if((p|0)>=(G|0)){f=e;m=0;p=0;break}q=e-p|0;w=0.0;m=1;while(1){f=f+1|0;if((m|0)>=(q|0))break;y=+g[J+(f<<2)>>2];B=n+(m+p<<3)|0;h[B>>3]=+h[B>>3]-y;w=w+y;m=m+1|0}B=n+(p<<3)|0;h[B>>3]=+h[B>>3]-w;p=p+1|0}while(1){if((m|0)>=(e|0))break;g[J+(p<<2)>>2]=+h[n+(m<<3)>>3];B=f+p|0;f=f+-1|0;m=m+1|0;p=B}B=HK(r)|0;c[B>>2]=HK(s)|0;f=1;while(1){if((f|0)>=(k|0))break;c[B+(f<<2)>>2]=(c[B>>2]|0)+((S(f,e)|0)<<2);f=f+1|0}q=HK(b)|0;p=HK(b)|0;m=HK(C<<2)|0;if(a[195234]|0){x=c[15715]|0;h[A>>3]=+SO();z4(x,93767,A)|0;_3(90318,15,1,x)|0;RO()}x=(z|0)==0;z=c[15715]|0;f=0;r=0;y=1797693134862315708145274.0e284;while(1){if(!(r<<24>>24==0&(f|0)<(o|0)))break;u6(n|0,0,E|0)|0;if(D){au(C,J,m);v=0;b=0}else{v=0;b=0}while(1){if((v|0)>=(G|0)){r=e;s=0;b=0;break}t=e-v+-1|0;Yt(t,0.0,p);r=0;while(1){if((r|0)>=(k|0))break;A=I+(r<<2)|0;Yt(t,+g[(c[A>>2]|0)+(v<<2)>>2],q);Tt(t,q,-1.0,(c[A>>2]|0)+(v<<2)+4|0);_t(t,q);St(t,q,p,p);r=r+1|0}bu(t,p);r=0;while(1){if((r|0)>=(t|0))break;s=p+(r<<2)|0;w=+g[s>>2];if(w>=3402823466385288598117041.0e14|w<0.0)g[s>>2]=0.0;r=r+1|0}r=b+1|0;b=v+1|0;f:do if(D){w=0.0;s=0;while(1){if((s|0)>=(t|0))break f;A=m+(r<<2)|0;O=+g[p+(s<<2)>>2]*+g[A>>2];g[A>>2]=O;A=n+(b+s<<3)|0;h[A>>3]=+h[A>>3]-O;w=w+O;r=r+1|0;s=s+1|0}}else{w=0.0;s=0;while(1){if((s|0)>=(t|0))break f;O=+g[p+(s<<2)>>2];g[m+(r<<2)>>2]=O;A=n+(b+s<<3)|0;h[A>>3]=+h[A>>3]-O;w=w+O;r=r+1|0;s=s+1|0}}while(0);A=n+(v<<3)|0;h[A>>3]=+h[A>>3]-w;v=b;b=r}while(1){if((s|0)>=(e|0)){r=0;break}g[m+(b<<2)>>2]=+h[n+(s<<3)>>3];A=r+b|0;r=r+-1|0;s=s+1|0;b=A}while(1){if((r|0)>=(k|0)){w=0.0;r=0;break}Qt(m,e,c[I+(r<<2)>>2]|0,c[B+(r<<2)>>2]|0);r=r+1|0}while(1){if((r|0)>=(k|0))break;w=w+ +Wt(e,c[I+(r<<2)>>2]|0,c[B+(r<<2)>>2]|0);r=r+1|0}w=u+w*2.0;r=0;while(1){if((r|0)>=(k|0))break;A=I+(r<<2)|0;Qt(J,e,c[A>>2]|0,q);w=w-+Wt(e,c[A>>2]|0,q);r=r+1|0}P=y-w;O=+h[23315];r=(w=0.0?P:-P)/y=(k|0))break;t=I+(b<<2)|0;s=c[t>>2]|0;g:do if(x){if((xr(J,s,c[B+(b<<2)>>2]|0,e,.001,e)|0)<0){v=B;t=J;f=-1;b=H;s=I;r=B;break d}}else{Vt(e,s,q);if((xr(J,q,c[B+(b<<2)>>2]|0,e,.001,e)|0)<0){v=B;t=J;f=-1;b=H;s=I;r=B;break d}else s=0;while(1){if((s|0)>=(e|0))break g;if((d[(c[(c[j+(s<<2)>>2]|0)+16>>2]|0)+119>>0]|0)<=1)c[(c[t>>2]|0)+(s<<2)>>2]=c[q+(s<<2)>>2];s=s+1|0}}while(0);b=b+1|0}if(((f|0)%5|0|0)==0&(a[195234]|0)!=0?(h[L>>3]=w,z4(z,90672,L)|0,((f+5|0)%50|0|0)==0):0)W5(10,z)|0;f=f+1|0;y=w}if(!(a[195234]|0))r=0;else{O=+nn(I,J,k,e,K);P=+SO();h[M>>3]=O;c[M+8>>2]=f;h[M+16>>3]=P;z4(z,90334,M)|0;r=0}while(1){if((r|0)>=(k|0)){v=B;t=J;b=H;s=I;r=B;break d}b=I+(r<<2)|0;t=i+(r<<2)|0;s=0;while(1){if((s|0)>=(e|0))break;h[(c[t>>2]|0)+(s<<3)>>3]=+g[(c[b>>2]|0)+(s<<2)>>2];s=s+1|0}r=r+1|0}}while(0);l6(b);l6(s);l6(t);if(v|0){l6(c[v>>2]|0);l6(r)}l6(q);l6(p);l6(n);l6(m)}while(0);l=N;return f|0}function mn(b,d,e,f,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;Q=l;l=l+32|0;o=Q+24|0;P=Q+8|0;H=Q+4|0;N=Q;M=(d|0)<50?d:50;O=IK(M<<2)|0;G=d<<3;n=IK(S(G,M)|0)|0;m=0;while(1){if((m|0)>=(M|0))break;c[O+(m<<2)>>2]=n+((S(m,d)|0)<<3);m=m+1|0}D=M<<1;D=(D|0)>50?D:50;D=(D|0)>(d|0)?d:D;c[o>>2]=0;os(b,d,D,o,k);ps(c[o>>2]|0,d,D);ju(c[o>>2]|0,D,d,O,M);l6(c[c[o>>2]>>2]|0);l6(c[o>>2]|0);D=d<<2;L=IK(D)|0;m=0;while(1){if((m|0)>=(d|0))break;c[L+(m<<2)>>2]=-1;m=m+1|0}rr(P,d);J=c[b+8>>2]|0;I=(k|0)!=0;if(I)at(b,d);B=IK(D)|0;K=IK(160)|0;n=IK(d*160|0)|0;C=IK(160)|0;m=0;while(1){if((m|0)==40)break;c[C+(m<<2)>>2]=n+((S(m,d)|0)<<2);m=m+1|0}m=(U4()|0)%(d|0)|0;c[L+(m<<2)>>2]=0;c[K>>2]=m;n=c[C>>2]|0;if(I){_r(m,b,d,n);n=0;o=0}else{nr(m,b,d,n,P);n=0;o=0}while(1){if((o|0)>=(d|0)){r=1;break}E=c[(c[C>>2]|0)+(o<<2)>>2]|0;c[B+(o<<2)>>2]=E;A=(E|0)>(n|0);m=A?o:m;n=A?E:n;o=o+1|0}while(1){if((r|0)==40){m=0;break}c[L+(m<<2)>>2]=r;c[K+(r<<2)>>2]=m;t=C+(r<<2)|0;n=c[t>>2]|0;if(I){_r(m,b,d,n);q=0;n=0}else{nr(m,b,d,n,P);q=0;n=0}while(1){if((q|0)>=(d|0))break;o=B+(q<<2)|0;E=c[o>>2]|0;k=c[(c[t>>2]|0)+(q<<2)>>2]|0;k=(E|0)<(k|0)?E:k;c[o>>2]=k;if((k|0)<=(n|0)){if((k|0)==(n|0)?((U4()|0)%(q+1|0)|0|0)==0:0){n=c[o>>2]|0;m=q}}else{n=k;m=q}q=q+1|0}r=r+1|0}while(1){if((m|0)>=(d|0))break;c[B+(m<<2)>>2]=-1;m=m+1|0}w=IK(D)|0;E=IK(d<<4)|0;x=d+-1|0;y=x<<2;A=0;k=0;o=0;n=0;v=0;while(1){if((v|0)>=(d|0))break;m=L+(v<<2)|0;z=v+1|0;a:do if((c[m>>2]|0)>-1){r=E+(v<<4)+4|0;c[r>>2]=IK(y)|0;t=IK(y)|0;c[E+(v<<4)+8>>2]=t;c[E+(v<<4)>>2]=x;a[E+(v<<4)+12>>0]=1;q=C+(c[m>>2]<<2)|0;m=0;while(1){if((m|0)==(v|0)){m=z;break}c[(c[r>>2]|0)+(m<<2)>>2]=m;c[t+(m<<2)>>2]=c[(c[q>>2]|0)+(m<<2)>>2];m=m+1|0}while(1){if((m|0)==(d|0)){m=x;break a}v=m+-1|0;c[(c[r>>2]|0)+(v<<2)>>2]=m;c[t+(v<<2)>>2]=c[(c[q>>2]|0)+(m<<2)>>2];m=m+1|0}}else{if((n|0)<40){o=IK(D)|0;k=IK(D)|0;n=d;m=1}else m=0;a[E+(v<<4)+12>>0]=m;c[E+(v<<4)+4>>2]=o;c[E+(v<<4)+8>>2]=k;c[E+(v<<4)>>2]=40;m=0;while(1){if((m|0)==40)break;c[o+(m<<2)>>2]=c[K+(m<<2)>>2];c[k+(m<<2)>>2]=c[(c[C+(m<<2)>>2]|0)+(v<<2)>>2];m=m+1|0}k=k+160|0;o=o+160|0;n=n+-40|0;m=40}while(0);A=m+A|0;v=z}l6(B);l6(w);if(C|0){l6(c[C>>2]|0);l6(C)}C=IK(d*20|0)|0;q=A+d<<2;r=IK(q)|0;v=(j|0)==2;q=IK(q)|0;t=0;while(1){if((t|0)>=(d|0))break;c[C+(t*20|0)+4>>2]=r;c[C+(t*20|0)+8>>2]=q;m=(c[E+(t<<4)>>2]|0)+1|0;w=C+(t*20|0)|0;c[w>>2]=m;o=(c[E+(t<<4)+8>>2]|0)+-4|0;k=E+(t<<4)+4|0;b:do if(v){p=0.0;n=1;while(1){if((n|0)>=(m|0))break b;c[r+(n<<2)>>2]=c[(c[k>>2]|0)+(n+-1<<2)>>2];u=+(c[o+(n<<2)>>2]|0);u=-1.0/(u*u);g[q+(n<<2)>>2]=u;p=p-u;n=n+1|0;m=c[w>>2]|0}}else{p=0.0;n=1;while(1){if((n|0)>=(m|0))break b;c[r+(n<<2)>>2]=c[(c[k>>2]|0)+(n+-1<<2)>>2];u=-1.0/+(c[o+(n<<2)>>2]|0);g[q+(n<<2)>>2]=u;p=p-u;n=n+1|0;m=c[w>>2]|0}}while(0);c[r>>2]=t;g[q>>2]=p;D=c[w>>2]|0;q=q+(D<<2)|0;r=r+(D<<2)|0;t=t+1|0}B=IK(f<<2)|0;c[B>>2]=IK(S(f<<3,M)|0)|0;m=1;while(1){if((m|0)>=(f|0))break;c[B+(m<<2)>>2]=(c[B>>2]|0)+((S(m,M)|0)<<3);m=m+1|0}c:do if(i){m=0;while(1){if((m|0)>=(f|0))break;o=B+(m<<2)|0;n=0;while(1){if((n|0)>=(M|0))break;h[(c[o>>2]|0)+(n<<3)>>3]=0.0;n=n+1|0}m=m+1|0}if((f|0)!=2){m=0;while(1){if((m|0)>=(f|0)){m=0;break c}h[(c[B+(m<<2)>>2]|0)+(m<<3)>>3]=1.0;m=m+1|0}}h[c[B>>2]>>3]=1.0;m=B+4|0;if(!((ku(O,M,d,c[m>>2]|0)|0)<<24>>24)){n=c[m>>2]|0;m=0;while(1){if((m|0)>=(M|0))break;h[n+(m<<3)>>3]=0.0;m=m+1|0}h[n+8>>3]=1.0;m=0}else m=0}else{n=0;while(1){if((n|0)>=(f|0)){m=0;break c}o=B+(n<<2)|0;m=0;while(1){if((m|0)>=(M|0))break;u=+(U4()|0)/2147483647.0;h[(c[o>>2]|0)+(m<<3)>>3]=u;m=m+1|0}n=n+1|0}}while(0);while(1){if((m|0)>=(f|0))break;Ot(O,d,M,c[B+(m<<2)>>2]|0,c[e+(m<<2)>>2]|0);m=m+1|0}c[H>>2]=0;c[N>>2]=0;Dt(C,O,d,M,H);Bt(O,c[H>>2]|0,M,d,M,N);l6(c[c[H>>2]>>2]|0);l6(c[H>>2]|0);z=IK(G)|0;A=IK(M<<3)|0;m=0;n=0;p=+on(e,E,f,d,j);d:while(1){if((n|0)<50&m<<24>>24==0)x=0;else break;while(1){if((x|0)>=(f|0))break;y=e+(x<<2)|0;o=0;while(1){if((o|0)>=(d|0))break;q=z+(o<<3)|0;h[q>>3]=0.0;r=(c[E+(o<<4)+8>>2]|0)+-4|0;t=c[C+(o*20|0)+4>>2]|0;v=c[C+(o*20|0)+8>>2]|0;w=C+(o*20|0)|0;s=0.0;k=1;while(1){if((k|0)>=(c[w>>2]|0))break;m=c[t+(k<<2)>>2]|0;u=+ct(e,f,o,m);if(u>1.0e-30){u=-(+g[v+(k<<2)>>2]*+(c[r+(k<<2)>>2]|0))/u;h[q>>3]=+h[q>>3]+ +h[(c[y>>2]|0)+(m<<3)>>3]*u;s=s-u}k=k+1|0}h[q>>3]=+h[q>>3]+s*+h[(c[y>>2]|0)+(o<<3)>>3];o=o+1|0}At(O,M,d,z,A);m=B+(x<<2)|0;if(wr(c[N>>2]|0,c[m>>2]|0,A,M,.001,M,0)|0){n=-1;break d}Ot(O,d,M,c[m>>2]|0,c[y>>2]|0);x=x+1|0}if(!(n&1)){u=+on(e,E,f,d,j);p=+F(+(u-p))/(u+1.0e-10);m=p<+h[23315]&1;p=u}else m=0;n=n+1|0}l6(A);l6(z);if(I){bt(b,d,J);m=0}else m=0;while(1){if((m|0)>=(d|0))break;if(a[E+(m<<4)+12>>0]|0){l6(c[E+(m<<4)+4>>2]|0);l6(c[E+(m<<4)+8>>2]|0)}m=m+1|0}l6(E);l6(c[C+4>>2]|0);l6(c[C+8>>2]|0);l6(C);l6(L);l6(K);l6(c[B>>2]|0);l6(B);m=c[N>>2]|0;if(m|0){l6(c[m>>2]|0);l6(c[N>>2]|0)}l6(c[O>>2]|0);l6(O);sr(P);l=Q;return n|0}function nn(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0;q=e+-1|0;o=(f|0)==2;h=0.0;f=0;m=0;while(1){if((m|0)>=(q|0))break;p=e-m|0;n=1;while(1){f=f+1|0;if((n|0)>=(p|0))break;k=n+m|0;i=0.0;j=0;while(1){if((j|0)>=(d|0))break;r=c[a+(j<<2)>>2]|0;l=+g[r+(m<<2)>>2]-+g[r+(k<<2)>>2];i=i+l*l;j=j+1|0}i=+G(+i);l=+g[b+(f<<2)>>2];if(o){i=1.0/+G(+l)-i;i=i*i}else{i=1.0/l-i;i=i*i}n=n+1|0;h=h+l*i}m=m+1|0}return +h}function on(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0;a:do if((f|0)==2){g=0.0;l=0;while(1){if((l|0)>=(e|0))break a;n=c[b+(l<<4)>>2]|0;o=b+(l<<4)+4|0;m=b+(l<<4)+8|0;k=0;while(1){if((k|0)>=(n|0))break;j=c[(c[o>>2]|0)+(k<<2)>>2]|0;if((j|0)>(l|0)){i=0.0;f=0;while(1){if((f|0)>=(d|0))break;q=c[a+(f<<2)>>2]|0;p=+h[q+(l<<3)>>3]-+h[q+(j<<3)>>3];i=i+p*p;f=f+1|0}i=+G(+i);p=+(c[(c[m>>2]|0)+(k<<2)>>2]|0);i=p-i;g=g+i*i/(p*p)}k=k+1|0}l=l+1|0}}else{l=0;g=0.0;while(1){if((l|0)>=(e|0))break a;m=c[b+(l<<4)>>2]|0;n=b+(l<<4)+4|0;o=b+(l<<4)+8|0;k=0;while(1){if((k|0)>=(m|0))break;j=c[(c[n>>2]|0)+(k<<2)>>2]|0;if((j|0)>(l|0)){i=0.0;f=0;while(1){if((f|0)>=(d|0))break;q=c[a+(f<<2)>>2]|0;p=+h[q+(l<<3)>>3]-+h[q+(j<<3)>>3];i=i+p*p;f=f+1|0}i=+G(+i);p=+(c[(c[o>>2]|0)+(k<<2)>>2]|0);i=p-i;g=g+i*i/p}k=k+1|0}l=l+1|0}}while(0);return +g}function pn(a){a=+a;a=+G(+a);return +(a*(a*a))}function qn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0.0;g=c[47184]|0;e=0.0;f=0;while(1){if((f|0)>=(g|0))break;i=+h[a+(f<<3)>>3]-+h[b+(f<<3)>>3];h[d+(f<<3)>>3]=i;e=e+i*i;f=f+1|0}return +(+G(+e))}function rn(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,i=0;i=HK(a<<2)|0;f=0;g=HK(S(a<<3,b)|0)|0;while(1){if((f|0)>=(a|0))break;c[i+(f<<2)>>2]=g;e=0;while(1){if((e|0)>=(b|0))break;h[g+(e<<3)>>3]=d;e=e+1|0}f=f+1|0;g=g+(b<<3)|0}return i|0}function sn(a){a=a|0;if(a|0){l6(c[a>>2]|0);l6(a)}return}function tn(b,d){b=b|0;d=d|0;var e=0.0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0;o=l;l=l+16|0;f=o;k=o+8|0;if(a[195234]|0){n=c[15715]|0;j=HB(b)|0;m=qB(b)|0;c[f>>2]=j;c[f+4>>2]=m;z4(n,90372,f)|0}a:do if(a[195235]|0){i=b+60|0;f=gC(b)|0;b:while(1){if(!f)break a;j=hC(b,f)|0;switch(un(b,f,k)|0){case 0:{tC(c[i>>2]|0,f)|0;f=j;continue b}case 1:{tC(c[i>>2]|0,f)|0;f=vn(b,c[k>>2]|0,j)|0;continue b}default:{f=j;continue b}}}}while(0);n=qB(b)|0;m=rB(b)|0;k=DA(b,2,92794,0)|0;g=+(n|0);c:do if(!d){h[23315]=g*.0001;nK(b,109187,186520);f=NA(c[b+60>>2]|0,90401)|0;if(!f)e=.99;else e=+a6(f);h[23317]=e;f=HK((n<<2)+4|0)|0;j=b+16|0;c[(c[j>>2]|0)+152>>2]=f;f=0;e=0.0;i=gC(b)|0;while(1){if(!i)break c;c[(c[(c[j>>2]|0)+152>>2]|0)+(f<<2)>>2]=i;q=c[i+16>>2]|0;c[q+120>>2]=f;c[q+124>>2]=-1;p=e+ +wn(b,i,k);f=f+1|0;e=p;i=hC(b,i)|0}}else{h[23315]=.0001;nK(b,109187,186520);f=0;e=0.0;i=gC(b)|0;while(1){if(!i)break c;c[(c[i+16>>2]|0)+120>>2]=f;p=e+ +wn(b,i,k);f=f+1|0;e=p;i=hC(b,i)|0}}while(0);f=NA(b,90409)|0;if((f|0)!=0?(a[f>>0]|0)!=0:0){e=+h[23315];g=+a6(f);if(!(e>g))e=g}else e=e/+(((m|0)>1?m:1)|0)*+G(+g)+1.0;h[23316]=e;if(!(c[47180]|d)){d=rn(n,n,e)|0;q=b+16|0;c[(c[q>>2]|0)+160>>2]=d;d=rn(n,n,1.0)|0;c[(c[q>>2]|0)+164>>2]=d;d=rn(n,c[47184]|0,1.0)|0;c[(c[q>>2]|0)+168>>2]=d;d=xn(n,n,c[47184]|0)|0;c[(c[q>>2]|0)+172>>2]=d}l=o;return n|0}function un(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;f=0;e=0;j=ZA(a,b)|0;a:while(1){if(!j)break;h=c[j>>2]&3;g=c[((h|0)==2?j:j+-48|0)+40>>2]|0;h=c[((h|0)==3?j:j+48|0)+40>>2]|0;do if((g|0)!=(h|0)){i=(h|0)==(b|0);if((e|0)!=1){f=i?g:h;c[d>>2]=f;e=e+1|0;break}if(!((g|0)==(f|0)&i)?!((g|0)==(b|0)&(h|0)==(f|0)):0){e=2;break a}else e=1}while(0);j=_A(a,j,b)|0}return e|0}function vn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;g=a+60|0;a:while(1){b:while(1){if(!b)break a;switch(un(a,b,f)|0){case 0:{e=5;break b}case 1:{e=8;break b}default:b=0}}if((e|0)==5){if((d|0)==(b|0))d=hC(a,d)|0;tC(c[g>>2]|0,b)|0;b=0;continue}else if((e|0)==8){if((d|0)==(b|0))d=hC(a,d)|0;tC(c[g>>2]|0,b)|0;b=c[f>>2]|0;continue}}l=h;return d|0}function wn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0,k=0;k=l;l=l+32|0;i=k+8|0;g=k;b=UA(a,b)|0;e=0.0;while(1){if(!b)break;switch(yn(b,d,g)|0){case 0:{f=+h[g>>3];break}case 2:{c[i>>2]=HB(a)|0;h[i+8>>3]=1.0;dA(3,90421,i)|0;j=6;break}default:j=6}if((j|0)==6){j=0;h[g>>3]=1.0;f=1.0}h[(c[b+16>>2]|0)+136>>3]=f;b=WA(a,b)|0;e=e+f}l=k;return +e}function xn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0;j=HK((a<<2)+4|0)|0;k=(b<<2)+4|0;l=d<<3;g=0;while(1){if((g|0)>=(a|0))break;i=j+(g<<2)|0;c[i>>2]=HK(k)|0;f=0;while(1){if((f|0)>=(b|0))break;e=HK(l)|0;c[(c[i>>2]|0)+(f<<2)>>2]=e;e=0;while(1){if((e|0)>=(d|0))break;h[(c[(c[i>>2]|0)+(f<<2)>>2]|0)+(e<<3)>>3]=0.0;e=e+1|0}f=f+1|0}c[(c[i>>2]|0)+(f<<2)>>2]=0;g=g+1|0}c[j+(g<<2)>>2]=0;return j|0}function yn(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;i=k;do if((d|0)!=0?(f=OA(b,d)|0,(a[f>>0]|0)!=0):0){c[i>>2]=e;if(((q4(f,101510,i)|0)>=1?(g=+h[e>>3],!(g<0.0)):0)?g!=0.0|(c[47180]|0)!=0:0){b=0;break}c[j>>2]=f;dA(0,90448,j)|0;b=2}else b=1;while(0);l=k;return b|0}function zn(a){a=a|0;return tn(a,0)|0}function An(a){a=a|0;a=a+16|0;l6(c[(c[a>>2]|0)+152>>2]|0);if(!(c[47180]|0)){sn(c[(c[a>>2]|0)+160>>2]|0);sn(c[(c[a>>2]|0)+164>>2]|0);sn(c[(c[a>>2]|0)+168>>2]|0);Bn(c[(c[a>>2]|0)+172>>2]|0);c[(c[a>>2]|0)+172>>2]=0}return}function Bn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if(a|0){f=0;while(1){g=a+(f<<2)|0;b=c[g>>2]|0;if(!b)break;else e=0;while(1){d=c[b+(e<<2)>>2]|0;if(!d)break;l6(d);e=e+1|0;b=c[g>>2]|0}l6(b);f=f+1|0}l6(a)}return}function Cn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0;e=+(b|0);b=a+16|0;while(1){if((d|0)>=(c[47184]|0))break;f=e*+S4();h[(c[(c[b>>2]|0)+132>>2]|0)+(d<<3)>>3]=f;d=d+1|0}return}function Dn(a,b){a=a|0;b=b|0;Cn(a,b,2);return}function En(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0;e=+(b|0);f=e*+S4();d=a+16|0;h[c[(c[d>>2]|0)+132>>2]>>3]=f;e=e*+S4();h[(c[(c[d>>2]|0)+132>>2]|0)+8>>3]=e;if((c[47184]|0)>2)Dn(a,b);return}function Fn(b,d){b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if(a[195234]|0)_3(90466,26,1,c[15715]|0)|0;d=km(b,d,2)|0;a:do if((d|0)!=1){if(!(c[46839]|d)){dA(0,90493,e)|0;c[46839]=1}b=b+16|0;d=0;while(1){e=c[(c[(c[b>>2]|0)+152>>2]|0)+(d<<2)>>2]|0;if(!e)break a;if(!(a[(c[e+16>>2]|0)+119>>0]|0))En(e,1);d=d+1|0}}while(0);l=f;return}function Gn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;r=l;l=l+96|0;q=r+80|0;o=r;if(a[195234]|0){_3(90542,25,1,c[15715]|0)|0;RO()}p=b+16|0;i=c[p>>2]|0;m=c[i+164>>2]|0;i=c[i+160>>2]|0;n=0;while(1){if((n|0)>=(d|0))break;j=i+(n<<2)|0;k=m+(n<<2)|0;f=0;while(1){if((f|0)==(n|0))break;g=+h[(c[j>>2]|0)+(f<<3)>>3];g=1.0/(g*g);e=c[(c[p>>2]|0)+152>>2]|0;e=fB(b,c[e+(n<<2)>>2]|0,c[e+(f<<2)>>2]|0,0,0)|0;if(e)g=g*+h[(c[e+16>>2]|0)+128>>3];h[(c[m+(f<<2)>>2]|0)+(n<<3)>>3]=g;h[(c[k>>2]|0)+(f<<3)>>3]=g;f=f+1|0}n=n+1|0}b=c[47184]|0;f=0;while(1){if((f|0)<(d|0))e=0;else break;while(1){if((e|0)>=(b|0))break;h[(c[(c[(c[p>>2]|0)+168>>2]|0)+(f<<2)>>2]|0)+(e<<3)>>3]=0.0;e=e+1|0}f=f+1|0}j=0;while(1){e=c[(c[(c[p>>2]|0)+152>>2]|0)+(j<<2)>>2]|0;if(!e)break;b=e+16|0;e=0;while(1){if((e|0)>=(d|0))break;a:do if((j|0)!=(e|0)){g=+qn(c[(c[b>>2]|0)+132>>2]|0,c[(c[(c[(c[(c[p>>2]|0)+152>>2]|0)+(e<<2)>>2]|0)+16>>2]|0)+132>>2]|0,o);i=c[47184]|0;f=0;while(1){if((f|0)>=(i|0))break a;n=c[p>>2]|0;s=+h[o+(f<<3)>>3];s=+h[(c[(c[n+164>>2]|0)+(j<<2)>>2]|0)+(e<<3)>>3]*(s-s*+h[(c[(c[n+160>>2]|0)+(j<<2)>>2]|0)+(e<<3)>>3]/g);h[(c[(c[(c[n+172>>2]|0)+(j<<2)>>2]|0)+(e<<2)>>2]|0)+(f<<3)>>3]=s;n=(c[(c[n+168>>2]|0)+(j<<2)>>2]|0)+(f<<3)|0;h[n>>3]=s+ +h[n>>3];f=f+1|0}}while(0);e=e+1|0}j=j+1|0}if(a[195234]|0){p=c[15715]|0;h[q>>3]=+SO();z4(p,90568,q)|0}l=r;return}function Hn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0.0,m=0;j=l;l=l+32|0;i=j+24|0;g=j+8|0;f=j;k=+h[23315];h[23235]=k*k;while(1){e=In(b,d)|0;if(!e)break;Jn(b,d,e)}if(!(a[195234]|0))d=b+16|0;else{e=c[15715]|0;h[f>>3]=+Kn(b,d);z4(e,90578,f)|0;d=b+16|0;m=c[(c[d>>2]|0)+156>>2]|0;f=(m|0)==(c[47183]|0)?90592:195341;k=+SO();c[g>>2]=m;c[g+4>>2]=f;h[g+8>>3]=k;z4(e,90594,g)|0}d=c[(c[d>>2]|0)+156>>2]|0;if((d|0)==(c[47183]|0)){m=HB(b)|0;c[i>>2]=d;c[i+4>>2]=m;dA(0,90621,i)|0}l=j;return}function In(b,e){b=b|0;e=e|0;var f=0.0,g=0,i=0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;s=l;l=l+16|0;r=s;p=(c[46841]|0)+1|0;c[46841]=p;b=c[b+16>>2]|0;if((c[b+156>>2]|0)<(c[47183]|0)){n=b+152|0;o=c[47184]|0;m=b+168|0;b=0;f=0.0;k=0;while(1){if((k|0)>=(e|0))break;i=c[(c[n>>2]|0)+(k<<2)>>2]|0;if((d[(c[i+16>>2]|0)+119>>0]|0)<=1){j=0.0;g=0;while(1){if((g|0)>=(o|0))break;t=+h[(c[(c[m>>2]|0)+(k<<2)>>2]|0)+(g<<3)>>3];j=j+t*t;g=g+1|0}if(j>f){b=i;f=j}}k=k+1|0}if(!(f<+h[23235])){if((a[195234]|0)!=0&((p|0)%100|0|0)==0?(q=c[15715]|0,h[r>>3]=+G(+f),z4(q,90672,r)|0,((c[46841]|0)%1e3|0|0)==0):0)W5(10,q)|0}else b=0}else b=0;l=s;return b|0}function Jn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o;k=d+16|0;m=c[(c[k>>2]|0)+120>>2]|0;f=c[46840]|0;if(!f){g=c[47184]|0;g=IK(S(g<<3,g)|0)|0}else{g=c[47184]|0;g=KK(f,S(g<<3,g)|0)|0}c[46840]=g;Ln(a,b,m,g);i=c[47184]|0;j=a+16|0;f=0;while(1){if((f|0)>=(i|0))break;h[185888+(f<<3)>>3]=-+h[(c[(c[(c[j>>2]|0)+168>>2]|0)+(m<<2)>>2]|0)+(f<<3)>>3];f=f+1|0}Uu(g,185968,185888,i);f=0;while(1){if((f|0)>=(c[47184]|0))break;e=+h[23317];e=e+ +S4()*((1.0-e)*2.0);i=185968+(f<<3)|0;e=+h[i>>3]*e;h[i>>3]=e;i=(c[(c[k>>2]|0)+132>>2]|0)+(f<<3)|0;h[i>>3]=e+ +h[i>>3];f=f+1|0}k=(c[j>>2]|0)+156|0;c[k>>2]=(c[k>>2]|0)+1;Mn(a,b,m);if(pP()|0){g=c[47184]|0;e=0.0;f=0;while(1){if((f|0)>=(g|0))break;e=e+ +F(+(+h[185968+(f<<3)>>3]));f=f+1|0}e=+G(+e);m=c[15715]|0;c[n>>2]=HB(d)|0;h[n+8>>3]=e;z4(m,90663,n)|0}l=o;return}function Kn(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0;q=b+-1|0;n=a+16|0;o=c[47184]|0;g=0;d=0.0;a:while(1){if((g|0)>=(q|0))break;m=c[n>>2]|0;p=c[m+152>>2]|0;j=g+1|0;k=(c[p+(g<<2)>>2]|0)+16|0;l=m+164|0;m=m+160|0;i=j;while(1){if((i|0)>=(b|0)){g=j;continue a}f=(c[p+(i<<2)>>2]|0)+16|0;a=0;e=0.0;while(1){if((a|0)>=(o|0))break;r=+h[(c[(c[k>>2]|0)+132>>2]|0)+(a<<3)>>3]-+h[(c[(c[f>>2]|0)+132>>2]|0)+(a<<3)>>3];a=a+1|0;e=e+r*r}r=+h[(c[(c[m>>2]|0)+(g<<2)>>2]|0)+(i<<3)>>3];r=d+ +h[(c[(c[l>>2]|0)+(g<<2)>>2]|0)+(i<<3)>>3]*(e+r*r-r*2.0*+G(+e));i=i+1|0;d=r}}return +d}function Ln(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+80|0;w=x;v=c[a+16>>2]|0;k=c[v+164>>2]|0;m=c[v+160>>2]|0;v=c[v+152>>2]|0;j=c[v+(d<<2)>>2]|0;g=c[47184]|0;a=0;while(1){if((a|0)>=(g|0))break;i=S(g,a)|0;f=0;while(1){if((f|0)==(g|0))break;h[e+(f+i<<3)>>3]=0.0;f=f+1|0}a=a+1|0}u=c[47184]|0;t=j+16|0;s=k+(d<<2)|0;k=m+(d<<2)|0;j=0;while(1){if((j|0)>=(b|0))break;a:do if((j|0)!=(d|0)){f=(c[v+(j<<2)>>2]|0)+16|0;r=0.0;a=0;while(1){if((a|0)>=(u|0))break;q=+h[(c[(c[t>>2]|0)+132>>2]|0)+(a<<3)>>3]-+h[(c[(c[f>>2]|0)+132>>2]|0)+(a<<3)>>3];h[w+(a<<3)>>3]=q;r=r+q*q;a=a+1|0}n=1.0/+pn(r);i=0;while(1){if((i|0)>=(u|0))break a;f=(c[s>>2]|0)+(j<<3)|0;g=(c[k>>2]|0)+(j<<3)|0;o=+h[w+(i<<3)>>3];a=0;while(1){p=+h[f>>3];q=+h[g>>3];if((a|0)==(i|0))break;m=e+((S(a,u)|0)+i<<3)|0;h[m>>3]=+h[m>>3]+n*(p*q*o*+h[w+(a<<3)>>3]);a=a+1|0}m=e+((S(u,i)|0)+i<<3)|0;h[m>>3]=p*(1.0-n*(q*(r-o*o)))+ +h[m>>3];i=i+1|0}}while(0);j=j+1|0}f=c[47184]|0;i=1;while(1){if((i|0)>=(f|0))break;g=S(f,i)|0;a=0;while(1){if((a|0)==(i|0))break;h[e+(a+g<<3)>>3]=+h[e+((S(a,f)|0)+i<<3)>>3];a=a+1|0}i=i+1|0}l=x;return}function Mn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0;m=l;l=l+80|0;k=m;j=a+16|0;f=c[j>>2]|0;g=c[(c[f+152>>2]|0)+(d<<2)>>2]|0;e=c[47184]|0;f=f+168|0;a=0;while(1){if((a|0)>=(e|0))break;h[(c[(c[f>>2]|0)+(d<<2)>>2]|0)+(a<<3)>>3]=0.0;a=a+1|0}f=g+16|0;a=0;while(1){if((a|0)>=(b|0))break;a:do if((a|0)!=(d|0)){i=+qn(c[(c[f>>2]|0)+132>>2]|0,c[(c[(c[(c[(c[j>>2]|0)+152>>2]|0)+(a<<2)>>2]|0)+16>>2]|0)+132>>2]|0,k);g=c[47184]|0;e=0;while(1){if((e|0)>=(g|0))break a;n=c[j>>2]|0;q=c[n+172>>2]|0;r=(c[(c[q+(d<<2)>>2]|0)+(a<<2)>>2]|0)+(e<<3)|0;o=+h[k+(e<<3)>>3];o=+h[(c[(c[n+164>>2]|0)+(d<<2)>>2]|0)+(a<<3)>>3]*(o-o*+h[(c[(c[n+160>>2]|0)+(d<<2)>>2]|0)+(a<<3)>>3]/i);h[r>>3]=o;n=c[n+168>>2]|0;s=(c[n+(d<<2)>>2]|0)+(e<<3)|0;h[s>>3]=+h[s>>3]+o;q=(c[(c[q+(a<<2)>>2]|0)+(d<<2)>>2]|0)+(e<<3)|0;o=+h[q>>3];p=-+h[r>>3];h[q>>3]=p;n=(c[n+(a<<2)>>2]|0)+(e<<3)|0;h[n>>3]=p-o+ +h[n>>3];e=e+1|0}}while(0);a=a+1|0}l=m;return}function Nn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0;d=a+16|0;g=c[46842]|0;b=c[(c[d>>2]|0)+124>>2]|0;while(1){if((b|0)<=0)break;i=(b+-1|0)/2|0;j=g+(i<<2)|0;e=c[j>>2]|0;f=e+16|0;if(+h[(c[f>>2]|0)+136>>3]<=+h[(c[d>>2]|0)+136>>3])break;c[j>>2]=a;c[(c[d>>2]|0)+124>>2]=i;c[g+(b<<2)>>2]=e;c[(c[f>>2]|0)+124>>2]=b;b=i}return}function On(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0;i=a+16|0;j=c[46843]|0;k=c[46842]|0;g=c[(c[i>>2]|0)+124>>2]|0;while(1){e=g<<1|1;if((e|0)>=(j|0))break;d=e+1|0;if((d|0)<(j|0)){f=c[k+(d<<2)>>2]|0;b=c[k+(e<<2)>>2]|0;if(+h[(c[f+16>>2]|0)+136>>3]<+h[(c[b+16>>2]|0)+136>>3]){e=d;b=f}else l=6}else{b=c[k+(e<<2)>>2]|0;l=6}if((l|0)==6)l=0;d=b+16|0;if(+h[(c[i>>2]|0)+136>>3]<=+h[(c[d>>2]|0)+136>>3])break;c[k+(e<<2)>>2]=a;c[(c[i>>2]|0)+124>>2]=e;c[k+(g<<2)>>2]=b;c[(c[d>>2]|0)+124>>2]=g;g=e}return}function Pn(a){a=a|0;var b=0,d=0;b=(c[a+16>>2]|0)+124|0;if((c[b>>2]|0)>=0)Aa(90678,90698,643,90706);d=c[46843]|0;c[46843]=d+1;c[b>>2]=d;c[(c[46842]|0)+(d<<2)>>2]=a;if((d|0)>0)Nn(a);return}function Qn(){var a=0,b=0,d=0,e=0;b=c[46843]|0;if(!b)a=0;else{e=c[46842]|0;a=c[e>>2]|0;d=b+-1|0;c[46843]=d;b=c[e+(d<<2)>>2]|0;c[e>>2]=b;c[(c[b+16>>2]|0)+124>>2]=0;if((d|0)>1)On(b);c[(c[a+16>>2]|0)+124>>2]=-1}return a|0}function Rn(b,d){b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;c[46842]=HK((d<<2)+4|0)|0;if(a[195234]|0){_3(90720,28,1,c[15715]|0)|0;RO()}d=gC(b)|0;while(1){if(!d)break;Sn(b,d);d=hC(b,d)|0}if(a[195234]|0){b=c[15715]|0;h[e>>3]=+SO();z4(b,90568,e)|0}l6(c[46842]|0);l=f;return}function Sn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,i=0,j=0,k=0;e=c[(c[a+16>>2]|0)+152>>2]|0;f=+h[23316];d=0;while(1){g=c[e+(d<<2)>>2]|0;if(!g)break;h[(c[g+16>>2]|0)+136>>3]=f;d=d+1|0}c[46844]=b;k=c[b+16>>2]|0;h[k+136>>3]=0.0;c[k+128>>2]=0;Pn(b);a:while(1){j=Qn()|0;if(!j)break;d=c[46844]|0;k=j+16|0;if((j|0)!=(d|0))Tn(a,d,j,+h[(c[k>>2]|0)+136>>3]);i=ZA(a,j)|0;while(1){if(!i)continue a;d=c[i>>2]&3;b=c[((d|0)==3?i:i+48|0)+40>>2]|0;if((b|0)==(j|0))b=c[((d|0)==2?i:i+-48|0)+40>>2]|0;d=c[k>>2]|0;f=+h[d+136>>3]+ +h[(c[i+16>>2]|0)+136>>3];e=c[b+16>>2]|0;g=e+136|0;do if(+h[g>>3]>f){h[g>>3]=f;if((c[e+124>>2]|0)>-1){Nn(b);break}else{c[e+128>>2]=(c[d+128>>2]|0)+1;Pn(b);break}}while(0);i=_A(a,i,j)|0}}return}function Tn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;b=c[(c[b+16>>2]|0)+120>>2]|0;d=c[(c[d+16>>2]|0)+120>>2]|0;a=c[(c[a+16>>2]|0)+160>>2]|0;h[(c[a+(d<<2)>>2]|0)+(b<<3)>>3]=e;h[(c[a+(b<<2)>>2]|0)+(d<<3)>>3]=e;return}function Un(a){a=a|0;mQ(a,2);b[(c[a+16>>2]|0)+176>>1]=2;c[47184]=2;Vn(a);return}function Vn(a){a=a|0;var b=0,d=0,e=0,f=0;b=qB(a)|0;e=HK(b*56|0)|0;b=HK((b<<2)+4|0)|0;f=a+16|0;c[(c[f>>2]|0)+152>>2]=b;b=gC(a)|0;d=0;while(1){if(!b)break;Wl(b);c[(c[b+16>>2]|0)+112>>2]=e+(d*56|0);c[(c[(c[f>>2]|0)+152>>2]|0)+(d<<2)>>2]=b;b=hC(a,b)|0;d=d+1|0}d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;Wn(b);b=WA(a,b)|0}d=hC(a,d)|0}return}function Wn(a){a=a|0;var b=0.0;RC(a,137763,176,1)|0;rP(a)|0;b=+YO(a,c[47236]|0,1.0,0.0);h[(c[a+16>>2]|0)+128>>3]=b;return}function Xn(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+80|0;m=u+32|0;i=u+24|0;g=u+16|0;j=u;t=u+72|0;p=u+40|0;if(qB(b)|0){Un(b);f=NA(b,96039)|0;if(f)if(a[f>>0]|0){d=qC(b,f,0)|0;if(!d){c[g>>2]=f;dA(0,90749,g)|0;dA(3,90789,i)|0;d=0;s=1}else s=0}else{d=0;s=1}else{d=0;s=0}n=DA(b,1,96039,0)|0;o=(n|0)!=0;f=NA(b,141045)|0;if((f|0?a[f>>0]|0:0)?(k=j+8|0,c[m>>2]=j,c[m+4>>2]=k,(q4(f,105804,m)|0)==1):0)h[k>>3]=+h[j>>3];if(qB(b)|0){m=BG(b,t,0)|0;if((c[t>>2]|0)==1){g=(d|0)!=0;do if(g)e=d;else{if(o?(e=Yn(b,n)|0,e|0):0)break;e=0}while(0);f=Wu(b,e)|0;if(!((e|0)!=0|o^1))HA(f,n,137699)|0;r=(gC(b)|0)+16|0;l6(c[(c[r>>2]|0)+112>>2]|0);c[(c[r>>2]|0)+112>>2]=0;lr(b)|0;cn(b);d=(s|0)==0|g?d:f}else{iH(b,2,8,p)|0;c[p+12>>2]=0;k=(s|0)==0;j=0;while(1){if((j|0)>=(c[t>>2]|0))break;g=c[m+(j<<2)>>2]|0;e=(d|0)!=0;if(e?(EC(g,d)|0)!=0:0)f=d;else r=23;do if((r|0)==23){r=0;if(o?(q=Yn(g,n)|0,q|0):0){f=q;break}f=0}while(0);IG(g)|0;i=Wu(g,f)|0;d=k|e?d:i;if(o?(f|0)==0|(f|0)==(d|0):0)HA(i,n,137699)|0;lr(g)|0;j=j+1|0}r=(gC(b)|0)+16|0;l6(c[(c[r>>2]|0)+112>>2]|0);c[(c[r>>2]|0)+112>>2]=0;hH(c[t>>2]|0,m,b,p)|0;cn(b)}e=0;while(1){if((e|0)>=(c[t>>2]|0))break;tC(b,c[m+(e<<2)>>2]|0)|0;e=e+1|0}l6(m)}if(s|0)PA(b,96039,HB(d)|0)|0;rM(b)}l=u;return}function Yn(a,b){a=a|0;b=b|0;var c=0;c=gC(a)|0;while(1){if(!c){c=0;break}if((bP(OA(c,b)|0)|0)<<24>>24)break;c=hC(a,c)|0}return c|0}function Zn(a){a=a|0;var b=0,c=0;b=gC(a)|0;if(b|0){while(1){if(!b)break;c=UA(a,b)|0;while(1){if(!c)break;WP(c);c=WA(a,c)|0}UP(b);b=hC(a,b)|0}_n(a)}return}function _n(a){a=a|0;l6(c[(c[a+16>>2]|0)+152>>2]|0);if((vC(a)|0)!=(a|0))XC(a,0,137786);return}function $n(a){a=a|0;ao(a);if(!((qB(a)|0)==0?!(c[(c[a+16>>2]|0)+180>>2]|0):0)){kv(a);rM(a)}return}function ao(a){a=a|0;c[47201]=DA(a,1,108531,108537)|0;mQ(a,2);b[(c[a+16>>2]|0)+176>>1]=2;c[47184]=2;bo(a,0);co(a);return}function bo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;h=(b|0)==0;if(h){go(g);b=g}d=MD(a)|0;while(1){if(!d)break;if(!(h2(HB(d)|0,108307,7)|0)){RC(d,137786,280,1)|0;ho(b,d);bo(d,0)}else bo(d,b);d=ND(d)|0}if(h?(e=c[g+8>>2]|0,f=a+16|0,c[(c[f>>2]|0)+180>>2]=e,e|0):0){h=KK(c[g>>2]|0,(e<<2)+4|0)|0;c[(c[f>>2]|0)+184>>2]=h}l=i;return}function co(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=HK((qB(a)|0)<<2)|0;b=HK(((qB(a)|0)<<2)+4|0)|0;g=a+16|0;c[(c[g>>2]|0)+152>>2]=b;b=gC(a)|0;d=0;while(1){if(!b)break;RC(b,137750,304,1)|0;c[(c[b+16>>2]|0)+112>>2]=f+(d<<2);c[(c[(c[g>>2]|0)+152>>2]|0)+(d<<2)>>2]=b;eo(b);e=UA(a,b)|0;while(1){if(!e)break;fo(e);e=WA(a,e)|0}b=hC(a,b)|0;d=d+1|0}return}function eo(a){a=a|0;PA(a,108531,108537)|0;return}function fo(a){a=a|0;RC(a,137763,304,1)|0;return}function go(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function ho(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;g=a+8|0;d=(c[g>>2]|0)+1|0;c[g>>2]=d;e=a+4|0;h=c[e>>2]|0;f=h+10|0;if((d|0)<(h|0))a=c[a>>2]|0;else{c[e>>2]=f;d=KK(c[a>>2]|0,f<<2)|0;c[a>>2]=d;a=d;d=c[g>>2]|0}c[a+(d<<2)>>2]=b;return}function io(a){a=a|0;var b=0,d=0;b=gC(a)|0;if(b|0){l6(c[(c[b+16>>2]|0)+112>>2]|0);while(1){if(!b)break;d=UA(a,b)|0;while(1){if(!d)break;WP(d);d=WA(a,d)|0}UP(b);b=hC(a,b)|0}jo(a)}return}function jo(a){a=a|0;l6(c[(c[a+16>>2]|0)+152>>2]|0);if((vC(a)|0)!=(a|0))XC(a,0,137786);return}function ko(a){a=a|0;var d=0,e=0,f=0;lo(a);mo(a,0);no(a,0);oo(a,0);d=c[a+16>>2]|0;if(!(c[(c[d+8>>2]|0)+84>>2]|0)){d=b[d+136>>1]&14;if(d<<16>>16)Tm(a,d&65535)|0}else{d=gC(a)|0;while(1){if(!d)break;f=c[d+16>>2]|0;e=c[f+132>>2]|0;h[e>>3]=+h[f+16>>3]/72.0;h[e+8>>3]=+h[f+24>>3]/72.0;d=hC(a,d)|0}Wm(a,1)}rM(a);return}function lo(a){a=a|0;var d=0,e=0;mQ(a,2);b[(c[a+16>>2]|0)+176>>1]=2;c[47184]=2;d=gC(a)|0;while(1){if(!d)break;Wl(d);d=hC(a,d)|0}e=gC(a)|0;while(1){if(!e)break;d=UA(a,e)|0;while(1){if(!d)break;RC(d,137763,176,1)|0;rP(d)|0;d=WA(a,d)|0}e=hC(a,e)|0}return}function mo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;h=(b|0)==0;if(h){to(g);b=g}d=MD(a)|0;while(1){if(!d)break;if(!(h2(HB(d)|0,108307,7)|0)){RC(d,137786,280,1)|0;sK(d);uo(b,d);mo(d,0)}else mo(d,b);d=ND(d)|0}if(h?(e=c[g+8>>2]|0,f=a+16|0,c[(c[f>>2]|0)+180>>2]=e,e|0):0){h=KK(c[g>>2]|0,(e<<2)+4|0)|0;c[(c[f>>2]|0)+184>>2]=h}l=i;return}function no(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;T=l;l=l+448|0;J=T+400|0;I=T+384|0;S=T+344|0;R=T+320|0;Q=T+248|0;G=T+208|0;A=T+152|0;B=T+96|0;p=T+88|0;e=T+64|0;L=T+32|0;M=T;E=T+416|0;u=T+304|0;z=T+288|0;N=T+192|0;O=T+176|0;P=T+136|0;K=T+72|0;o=c[a+60>>2]|0;if((d[195234]|0)>1){po(b);H=c[15715]|0;c[e>>2]=HB(a)|0;z4(H,91024,e)|0}H=a+16|0;g=b+1|0;e=1;f=0;while(1){i=c[H>>2]|0;if((e|0)>(c[i+180>>2]|0))break;F=c[(c[i+184>>2]|0)+(e<<2)>>2]|0;no(F,g);e=e+1|0;f=(qB(F)|0)+f|0}r=(qB(a)|0)-f|0;e=c[H>>2]|0;F=(c[e+180>>2]|0)+r|0;v=(F|0)==0;if(v?(c[e+12>>2]|0)==0:0){S=e+16|0;c[S>>2]=0;c[S+4>>2]=0;c[S+8>>2]=0;c[S+12>>2]=0;h[e+40>>3]=18.0;h[e+32>>3]=18.0}else{e=E+16|0;do if((iH(a,4,4,E)|0)>>>0>=3)if((c[e>>2]|0)==4?(c[E+28>>2]&2|0)!=0:0){f=DA(o,0,99491,0)|0;e=DA(o,1,99491,0)|0;if((f|0)!=0|(e|0)!=0){c[E+24>>2]=HK(F<<2)|0;break}else{c[p>>2]=HB(a)|0;dA(0,90878,p)|0;e=0;f=0;break}}else{e=0;f=0}else{c[e>>2]=3;e=0;f=0}while(0);C=HK(F<<5)|0;D=HK(F<<2)|0;s=E+24|0;o=(f|0)!=0;q=0;i=1;while(1){g=c[H>>2]|0;if((i|0)>(c[g+180>>2]|0))break;g=c[(c[g+184>>2]|0)+(i<<2)>>2]|0;y=C+(q<<5)|0;x=(c[g+16>>2]|0)+16|0;c[y>>2]=c[x>>2];c[y+4>>2]=c[x+4>>2];c[y+8>>2]=c[x+8>>2];c[y+12>>2]=c[x+12>>2];c[y+16>>2]=c[x+16>>2];c[y+20>>2]=c[x+20>>2];c[y+24>>2]=c[x+24>>2];c[y+28>>2]=c[x+28>>2];if(o&(c[s>>2]|0)!=0){y=XO(g,f,0,0)|0;c[(c[s>>2]|0)+(q<<2)>>2]=y}c[D+(q<<2)>>2]=g;q=q+1|0;i=i+1|0}w=L+16|0;x=L+8|0;y=L+24|0;a:do if((r|0)>0){p=(e|0)!=0;o=gC(a)|0;f=q;while(1){if(!o)break a;g=c[o+16>>2]|0;i=g+112|0;if(!(c[i>>2]|0)){c[i>>2]=a;c[L>>2]=0;c[L+4>>2]=0;c[L+8>>2]=0;c[L+12>>2]=0;h[w>>3]=+h[g+88>>3]+ +h[g+96>>3];h[y>>3]=+h[g+80>>3];t=C+(f<<5)|0;c[t>>2]=c[L>>2];c[t+4>>2]=c[L+4>>2];c[t+8>>2]=c[L+8>>2];c[t+12>>2]=c[L+12>>2];c[t+16>>2]=c[L+16>>2];c[t+20>>2]=c[L+20>>2];c[t+24>>2]=c[L+24>>2];c[t+28>>2]=c[L+28>>2];if(p&(c[s>>2]|0)!=0){t=XO(o,e,0,0)|0;c[(c[s>>2]|0)+(f<<2)>>2]=t}c[D+(f<<2)>>2]=o;f=f+1|0}o=hC(a,o)|0}}while(0);t=bH(F,C,E)|0;e=c[s>>2]|0;if(e|0)l6(e);qo(M,2147483647.0,2147483647.0);r=M+16|0;qo(u,-2147483647.0,-2147483647.0);c[r>>2]=c[u>>2];c[r+4>>2]=c[u+4>>2];c[r+8>>2]=c[u+8>>2];c[r+12>>2]=c[u+12>>2];o=M+24|0;p=M+8|0;q=c[15715]|0;e=0;while(1){i=c[H>>2]|0;if((e|0)>=(F|0))break;k=+(c[t+(e<<3)>>2]|0);n=+(c[t+(e<<3)+4>>2]|0);f=C+(e<<5)|0;c[L>>2]=c[f>>2];c[L+4>>2]=c[f+4>>2];c[L+8>>2]=c[f+8>>2];c[L+12>>2]=c[f+12>>2];c[L+16>>2]=c[f+16>>2];c[L+20>>2]=c[f+20>>2];c[L+24>>2]=c[f+24>>2];c[L+28>>2]=c[f+28>>2];j=k+ +h[L>>3];h[L>>3]=j;k=k+ +h[w>>3];h[w>>3]=k;m=n+ +h[x>>3];h[x>>3]=m;n=n+ +h[y>>3];h[y>>3]=n;h[M>>3]=+h[(+h[M>>3]>3];h[p>>3]=+h[(+h[p>>3]>3];h[r>>3]=+h[(+h[r>>3]>k?M:L)+16>>3];h[o>>3]=+h[(+h[o>>3]>n?M:L)+24>>3];f=c[D+(e<<2)>>2]|0;g=f+16|0;if((e|0)<(c[i+180>>2]|0)){u=(c[g>>2]|0)+16|0;c[u>>2]=c[L>>2];c[u+4>>2]=c[L+4>>2];c[u+8>>2]=c[L+8>>2];c[u+12>>2]=c[L+12>>2];c[u+16>>2]=c[L+16>>2];c[u+20>>2]=c[L+20>>2];c[u+24>>2]=c[L+24>>2];c[u+28>>2]=c[L+28>>2];if((d[195234]|0)>1){po(b);c[B>>2]=HB(f)|0;h[B+8>>3]=j;h[B+16>>3]=m;h[B+24>>3]=k;h[B+32>>3]=n;z4(q,90857,B)|0}}else{u=(c[g>>2]|0)+16|0;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[J>>2]=c[w>>2];c[J+4>>2]=c[w+4>>2];c[J+8>>2]=c[w+8>>2];c[J+12>>2]=c[w+12>>2];ro(z,I,J);c[u>>2]=c[z>>2];c[u+4>>2]=c[z+4>>2];c[u+8>>2]=c[z+8>>2];c[u+12>>2]=c[z+12>>2];if((d[195234]|0)>1){po(b);u=HB(f)|0;s=c[g>>2]|0;m=+h[s+16>>3];n=+h[s+24>>3];c[A>>2]=u;h[A+8>>3]=m;h[A+16>>3]=n;z4(q,90845,A)|0}}e=e+1|0}e=c[i+12>>2]|0;if(e|0){j=+h[e+24>>3];if(v){k=+h[e+32>>3];c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;h[r>>3]=j;h[o>>3]=k;k=j;m=0.0}else{k=+h[r>>3];m=+h[M>>3]}n=j-(k-m);j=n*.5;if(n>0.0){h[M>>3]=m-j;h[r>>3]=k+j}}if((b|0)>0)j=+((c[E+8>>2]|0)>>>0)*.5;else j=0.0;k=+h[M>>3]-j;h[M>>3]=k;m=j+ +h[r>>3];h[r>>3]=m;n=+h[p>>3]-(j+ +h[i+56>>3]);h[p>>3]=n;j=+h[o>>3]+(j+ +h[i+88>>3]);h[o>>3]=j;if((d[195234]|0)>1){po(b);c[G>>2]=HB(a)|0;h[G+8>>3]=k;h[G+16>>3]=n;h[G+24>>3]=m;h[G+32>>3]=j;z4(q,90857,G)|0}e=0;while(1){if((e|0)>=(F|0))break;f=c[D+(e<<2)>>2]|0;g=f+16|0;if((e|0)<(c[(c[H>>2]|0)+180>>2]|0)){G=(c[g>>2]|0)+16|0;c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[L+16>>2]=c[G+16>>2];c[L+20>>2]=c[G+20>>2];c[L+24>>2]=c[G+24>>2];c[L+28>>2]=c[G+28>>2];c[I>>2]=c[G>>2];c[I+4>>2]=c[G+4>>2];c[I+8>>2]=c[G+8>>2];c[I+12>>2]=c[G+12>>2];c[J>>2]=c[M>>2];c[J+4>>2]=c[M+4>>2];c[J+8>>2]=c[M+8>>2];c[J+12>>2]=c[M+12>>2];so(L,I,J);c[I>>2]=c[w>>2];c[I+4>>2]=c[w+4>>2];c[I+8>>2]=c[w+8>>2];c[I+12>>2]=c[w+12>>2];c[J>>2]=c[M>>2];c[J+4>>2]=c[M+4>>2];c[J+8>>2]=c[M+8>>2];c[J+12>>2]=c[M+12>>2];so(N,I,J);c[w>>2]=c[N>>2];c[w+4>>2]=c[N+4>>2];c[w+8>>2]=c[N+8>>2];c[w+12>>2]=c[N+12>>2];G=(c[g>>2]|0)+16|0;c[G>>2]=c[L>>2];c[G+4>>2]=c[L+4>>2];c[G+8>>2]=c[L+8>>2];c[G+12>>2]=c[L+12>>2];c[G+16>>2]=c[L+16>>2];c[G+20>>2]=c[L+20>>2];c[G+24>>2]=c[L+24>>2];c[G+28>>2]=c[L+28>>2];if((d[195234]|0)>1){po(b);G=HB(f)|0;j=+h[L>>3];k=+h[x>>3];m=+h[w>>3];n=+h[y>>3];c[Q>>2]=G;h[Q+8>>3]=j;h[Q+16>>3]=k;h[Q+24>>3]=m;h[Q+32>>3]=n;z4(q,90857,Q)|0}}else{G=(c[g>>2]|0)+16|0;c[I>>2]=c[G>>2];c[I+4>>2]=c[G+4>>2];c[I+8>>2]=c[G+8>>2];c[I+12>>2]=c[G+12>>2];c[J>>2]=c[M>>2];c[J+4>>2]=c[M+4>>2];c[J+8>>2]=c[M+8>>2];c[J+12>>2]=c[M+12>>2];so(O,I,J);c[G>>2]=c[O>>2];c[G+4>>2]=c[O+4>>2];c[G+8>>2]=c[O+8>>2];c[G+12>>2]=c[O+12>>2];if((d[195234]|0)>1){po(b);G=HB(f)|0;E=c[g>>2]|0;m=+h[E+16>>3];n=+h[E+24>>3];c[R>>2]=G;h[R+8>>3]=m;h[R+16>>3]=n;z4(q,90845,R)|0}}e=e+1|0}c[I>>2]=c[r>>2];c[I+4>>2]=c[r+4>>2];c[I+8>>2]=c[r+8>>2];c[I+12>>2]=c[r+12>>2];c[J>>2]=c[M>>2];c[J+4>>2]=c[M+4>>2];c[J+8>>2]=c[M+8>>2];c[J+12>>2]=c[M+12>>2];so(P,I,J);c[r>>2]=c[P>>2];c[r+4>>2]=c[P+4>>2];c[r+8>>2]=c[P+8>>2];c[r+12>>2]=c[P+12>>2];c[I>>2]=c[M>>2];c[I+4>>2]=c[M+4>>2];c[I+8>>2]=c[M+8>>2];c[I+12>>2]=c[M+12>>2];c[J>>2]=c[M>>2];c[J+4>>2]=c[M+4>>2];c[J+8>>2]=c[M+8>>2];c[J+12>>2]=c[M+12>>2];so(K,I,J);c[M>>2]=c[K>>2];c[M+4>>2]=c[K+4>>2];c[M+8>>2]=c[K+8>>2];c[M+12>>2]=c[K+12>>2];R=(c[H>>2]|0)+16|0;c[R>>2]=c[M>>2];c[R+4>>2]=c[M+4>>2];c[R+8>>2]=c[M+8>>2];c[R+12>>2]=c[M+12>>2];c[R+16>>2]=c[M+16>>2];c[R+20>>2]=c[M+20>>2];c[R+24>>2]=c[M+24>>2];c[R+28>>2]=c[M+28>>2];if((d[195234]|0)>1){po(b);R=HB(a)|0;j=+h[M>>3];k=+h[p>>3];m=+h[r>>3];n=+h[o>>3];c[S>>2]=R;h[S+8>>3]=j;h[S+16>>3]=k;h[S+24>>3]=m;h[S+32>>3]=n;z4(q,90857,S)|0}l6(C);l6(D);l6(t)}l=T;return}function oo(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0,t=0,u=0,v=0;u=l;l=l+80|0;t=u+32|0;j=u+8|0;e=u;s=a+16|0;p=c[s>>2]|0;q=+h[p+16>>3];r=+h[p+24>>3];if((d[195234]|0)>1){po(b);p=c[15715]|0;c[e>>2]=HB(a)|0;z4(p,90830,e)|0}p=(b|0)!=0;a:do if(p){e=gC(a)|0;f=c[15715]|0;while(1){if(!e)break a;g=e+16|0;i=c[g>>2]|0;if((c[i+112>>2]|0)==(a|0)?(v=i+16|0,h[v>>3]=q+ +h[v>>3],i=i+24|0,h[i>>3]=r+ +h[i>>3],(d[195234]|0)>1):0){po(b);v=HB(e)|0;i=c[g>>2]|0;n=+h[i+16>>3];o=+h[i+24>>3];c[j>>2]=v;h[j+8>>3]=n;h[j+16>>3]=o;z4(f,90845,j)|0}e=hC(a,e)|0}}else f=c[15715]|0;while(0);j=b+1|0;a=1;while(1){e=c[s>>2]|0;if((a|0)>(c[e+180>>2]|0))break;i=c[(c[e+184>>2]|0)+(a<<2)>>2]|0;if(p){g=i+16|0;e=c[g>>2]|0;k=q+ +h[e+16>>3];m=r+ +h[e+24>>3];n=q+ +h[e+32>>3];o=r+ +h[e+40>>3];if((d[195234]|0)>1){po(b);c[t>>2]=HB(i)|0;h[t+8>>3]=k;h[t+16>>3]=m;h[t+24>>3]=n;h[t+32>>3]=o;z4(f,90857,t)|0;e=c[g>>2]|0}h[e+16>>3]=k;h[e+24>>3]=m;h[e+32>>3]=n;h[e+40>>3]=o}oo(i,j);a=a+1|0}l=u;return}function po(a){a=a|0;var b=0;b=c[15715]|0;while(1){if((a|0)<=0)break;Z3(90875,b)|0;a=a+-1|0}return}function qo(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function ro(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=(+h[b+8>>3]+ +h[c+8>>3])*.5;h[a>>3]=(+h[b>>3]+ +h[c>>3])*.5;h[a+8>>3]=d;return}function so(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]-+h[c+8>>3];h[a>>3]=+h[b>>3]-+h[c>>3];h[a+8>>3]=d;return}function to(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function uo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;g=a+8|0;d=(c[g>>2]|0)+1|0;c[g>>2]=d;e=a+4|0;h=c[e>>2]|0;f=h+10|0;if((d|0)<(h|0))a=c[a>>2]|0;else{c[e>>2]=f;d=KK(c[a>>2]|0,f<<2)|0;c[a>>2]=d;a=d;d=c[g>>2]|0}c[a+(d<<2)>>2]=b;return}function vo(a){a=a|0;var b=0;b=gC(a)|0;while(1){if(!b)break;UP(b);b=hC(a,b)|0}wo(a);return}function wo(a){a=a|0;var b=0,d=0,e=0;b=a+16|0;a=1;while(1){e=c[b>>2]|0;d=c[e+184>>2]|0;if((a|0)>(c[e+180>>2]|0))break;e=c[d+(a<<2)>>2]|0;AK(c[(c[e+16>>2]|0)+12>>2]|0);wo(e);a=a+1|0}l6(d);return}function xo(a){a=a|0;var b=0,d=0,e=0;WC(a,1,137750,304,1);FP(a)|0;b=HK(((qB(a)|0)<<2)+4|0)|0;e=a+16|0;c[(c[e>>2]|0)+152>>2]=b;b=0;d=gC(a)|0;while(1){if(!d)break;yo(d);c[(c[(c[e>>2]|0)+152>>2]|0)+(b<<2)>>2]=d;c[(c[d+16>>2]|0)+120>>2]=b;b=b+1|0;d=hC(a,d)|0}e=DA(a,2,92794,0)|0;d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;zo(b,e);b=WA(a,b)|0}d=hC(a,d)|0}Ao(a);return}function yo(a){a=a|0;var b=0;qP(a);b=HK((e[(c[(uC(a)|0)+16>>2]|0)+176>>1]|0)<<3)|0;c[(c[a+16>>2]|0)+132>>2]=b;oQ(a,c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&1);return}function zo(a,b){a=a|0;b=b|0;var d=0,e=0.0;RC(a,137763,176,1)|0;e=+YO(a,c[47236]|0,1.0,0.0);d=a+16|0;h[(c[d>>2]|0)+128>>3]=e;e=+YO(a,b,+h[(c[5180]|0)+32>>3],0.0);h[(c[d>>2]|0)+136>>3]=e;rP(a)|0;return}function Ao(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+32|0;q=r+16|0;p=r;m=r+24|0;n=DA(b,1,102924,0)|0;a:do if(n|0){o=DA(b,1,90961,0)|0;i=b+16|0;j=(o|0)==0;k=c[15715]|0;g=0;while(1){e=c[(c[(c[i>>2]|0)+152>>2]|0)+(g<<2)>>2]|0;if(!e)break a;b=OA(e,n)|0;do if(a[b>>0]|0){f=e+16|0;d=c[(c[f>>2]|0)+132>>2]|0;a[m>>0]=0;c[p>>2]=d;c[p+4>>2]=d+8;c[p+8>>2]=m;if((q4(b,102050,p)|0)<=1){c[q>>2]=HB(e)|0;c[q+4>>2]=b;z4(k,90965,q)|0;break}b:do if(+h[23314]>0.0){b=0;while(1){if((b|0)==2)break b;s=d+(b<<3)|0;h[s>>3]=+h[s>>3]/+h[23314];b=b+1|0}}while(0);b=c[f>>2]|0;a[b+119>>0]=1;if((a[m>>0]|0)!=33){if(j)break;if(!((bP(OA(e,o)|0)|0)<<24>>24))break;b=c[f>>2]|0}a[b+119>>0]=3}while(0);g=g+1|0}}while(0);l=r;return}function Bo(a){a=a|0;var b=0,c=0;c=gC(a)|0;while(1){if(!c)break;b=UA(a,c)|0;while(1){if(!b)break;WP(b);b=WA(a,b)|0}UP(c);c=hC(a,c)|0}Co(a);return}function Co(a){a=a|0;Do(a);a=a+16|0;l6(c[(c[a>>2]|0)+152>>2]|0);l6(c[(c[a>>2]|0)+140>>2]|0);return}function Do(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=a+16|0;f=1;while(1){e=c[g>>2]|0;b=c[e+184>>2]|0;if((f|0)>(c[e+180>>2]|0))break;e=c[b+(f<<2)>>2]|0;b=e+16|0;AK(c[(c[b>>2]|0)+12>>2]|0);d=c[(c[b>>2]|0)+140>>2]|0;if(d|0){l6(c[d>>2]|0);l6(c[(c[b>>2]|0)+140>>2]|0)}Do(e);f=f+1|0}l6(b);if((vC(a)|0)!=(a|0))TC(a,137786)|0;return}function Eo(a,b){a=a|0;b=b|0;c[b+4>>2]=DA(a,0,91017,0)|0;c[b+8>>2]=DA(a,0,141419,0)|0;c[b+12>>2]=DA(a,0,141351,0)|0;c[b>>2]=a;c[b+16>>2]=0;c[b+36>>2]=iH(a,2,4,b+20|0)|0;return}function Fo(a){a=a|0;var d=0,e=0;mQ(a,2);d=HK(56)|0;e=a+16|0;c[(c[e>>2]|0)+140>>2]=d;d=(XO(a,DA(a,0,91675,0)|0,2,2)|0)&65535;d=(d&65535)<10?d:10;b[(c[e>>2]|0)+176>>1]=d;c[47184]=d&65535;Go(a,0,a);cp(a);xo(a);return}function Go(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;m=l;l=l+16|0;j=m;k=(d|0)==0;if(k){Ho(j);d=j}g=e+16|0;f=MD(a)|0;while(1){if(!f)break;if(!(h2(HB(f)|0,108307,7)|0)){RC(f,137786,280,1)|0;n=HK(56)|0;p=c[f+16>>2]|0;c[p+140>>2]=n;o=c[g>>2]|0;b[p+176>>1]=b[o+176>>1]|0;c[n+44>>2]=(c[(c[o+140>>2]|0)+44>>2]|0)+1;c[n+48>>2]=e;Io(d,f);Go(f,0,f)}else Go(f,d,e);f=ND(f)|0}if(k?(h=c[j+8>>2]|0,i=a+16|0,c[(c[i>>2]|0)+180>>2]=h,h|0):0){p=KK(c[j>>2]|0,(h<<2)+4|0)|0;c[(c[i>>2]|0)+184>>2]=p}l=m;return}function Ho(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function Io(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;g=a+8|0;d=(c[g>>2]|0)+1|0;c[g>>2]=d;e=a+4|0;h=c[e>>2]|0;f=h+10|0;if((d|0)<(h|0))a=c[a>>2]|0;else{c[e>>2]=f;d=KK(c[a>>2]|0,f<<2)|0;c[a>>2]=d;a=d;d=c[g>>2]|0}c[a+(d<<2)>>2]=b;return}function Jo(a){a=a|0;var b=0,c=0;b=l;l=l+64|0;c=b;Eo(a,c);Ko(a,c);Lo(a);Mo(a,a);No(a);l=b;return}function Ko(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0.0;s=l;l=l+64|0;r=s+48|0;e=s+40|0;o=s+56|0;n=s+52|0;m=s;if(a[195234]|0){q=c[15715]|0;c[e>>2]=HB(b)|0;z4(q,91024,e)|0}e=gC(b)|0;while(1){if(!e)break;c[(c[e+16>>2]|0)+164>>2]=0;e=hC(b,e)|0}p=Oo(b,d)|0;q=Fv(p,o,n)|0;e=q;while(1){k=e+4|0;f=c[e>>2]|0;if(!f)break;dp(f,m);e=gC(f)|0;while(1){if(!e)break;g=hC(f,e)|0;i=e+16|0;j=c[i>>2]|0;if(c[j+212>>2]|0){v=Po(e,f)|0;Ko(v,d);v=c[(c[v+16>>2]|0)+140>>2]|0;u=+h[v+24>>3];j=c[i>>2]|0;h[j+32>>3]=u;t=+h[v+32>>3];h[j+40>>3]=t;u=u*72.0*.5;h[j+88>>3]=u;h[j+96>>3]=u;h[j+80>>3]=t*72.0;e=g;continue}if(c[(c[j+112>>2]|0)+8>>2]|0){e=g;continue}tC(f,e)|0;e=g}if((qB(f)|0)<=1){e=k;continue}if((c[d>>2]|0)==(b|0))Iq(f)|0;qp(f,m);e=k}e=c[o>>2]|0;if((e|0)<=1)if((e|0)==1){zP(c[q>>2]|0);e=0}else e=0;else{if(!(c[n>>2]|0))f=0;else{f=HK(e)|0;a[f>>0]=1;e=c[o>>2]|0}c[d+40>>2]=f;e=OG(e,q,0,d+20|0)|0;l6(f)}Qo(p,c[o>>2]|0,q,e,b,d);l6(e);g=gC(p)|0;while(1){if(!g)break;e=c[g+16>>2]|0;f=c[e+212>>2]|0;i=e+132|0;if(!f){e=c[(c[e+112>>2]|0)+8>>2]|0;if(e|0){o=c[i>>2]|0;v=c[(c[e+16>>2]|0)+132>>2]|0;h[v>>3]=+h[o>>3];h[v+8>>3]=+h[o+8>>3]}}else{o=c[i>>2]|0;x=+h[e+32>>3];w=+h[o>>3]-x*.5;v=c[(c[f+16>>2]|0)+140>>2]|0;h[v+8>>3]=w;t=+h[e+40>>3];u=+h[o+8>>3]-t*.5;h[v+16>>3]=u;h[v+24>>3]=x+w;h[v+32>>3]=t+u}g=hC(p,g)|0}v=(c[(c[b+16>>2]|0)+140>>2]|0)+8|0;o=(c[(c[p+16>>2]|0)+140>>2]|0)+8|0;c[v>>2]=c[o>>2];c[v+4>>2]=c[o+4>>2];c[v+8>>2]=c[o+8>>2];c[v+12>>2]=c[o+12>>2];c[v+16>>2]=c[o+16>>2];c[v+20>>2]=c[o+20>>2];c[v+24>>2]=c[o+24>>2];c[v+28>>2]=c[o+28>>2];Ro(p,q);l6(q);if(a[195234]|0){v=c[15715]|0;c[r>>2]=HB(b)|0;z4(v,91035,r)|0}l=s;return}function Lo(b){b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0,l=0.0,m=0.0;d=gC(b)|0;while(1){if(!d)break;e=c[d+16>>2]|0;if(a[e+118>>0]|0){k=c[(c[(c[e+212>>2]|0)+16>>2]|0)+140>>2]|0;j=+h[k+24>>3]-+h[k+8>>3];i=+h[k+32>>3]-+h[k+16>>3];m=j*.5;l=i*.5;g=m*72.0;f=l*72.0;k=c[e+132>>2]|0;h[k>>3]=m;h[k+8>>3]=l;h[e+32>>3]=j;h[e+40>>3]=i;h[e+96>>3]=g;h[e+88>>3]=g;h[e+80>>3]=i*72.0;e=c[(c[e+12>>2]|0)+44>>2]|0;h[e>>3]=g;h[e+8>>3]=f;i=-g;h[e+16>>3]=i;h[e+24>>3]=f;h[e+32>>3]=i;f=-f;h[e+40>>3]=f;h[e+48>>3]=g;h[e+56>>3]=f}d=hC(b,d)|0}return}function Mo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0,j=0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0;i=a+16|0;j=c[(c[i>>2]|0)+140>>2]|0;f=+h[j+8>>3];g=+h[j+16>>3];j=(a|0)!=(b|0);a:do if(j){d=gC(a)|0;while(1){if(!d){a=1;break a}e=c[d+16>>2]|0;if((c[e+212>>2]|0)==(a|0)){e=c[e+132>>2]|0;h[e>>3]=f+ +h[e>>3];e=e+8|0;h[e>>3]=g+ +h[e>>3]}d=hC(a,d)|0}}else a=1;while(0);while(1){d=c[i>>2]|0;if((a|0)>(c[d+180>>2]|0))break;d=c[(c[d+184>>2]|0)+(a<<2)>>2]|0;if(j){e=c[(c[d+16>>2]|0)+140>>2]|0;p=e+8|0;n=e+16|0;l=e+24|0;e=e+32|0;o=g+ +h[n>>3];m=f+ +h[l>>3];k=g+ +h[e>>3];h[p>>3]=f+ +h[p>>3];h[n>>3]=o;h[l>>3]=m;h[e>>3]=k}Mo(d,b);a=a+1|0}return}function No(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0.0;b=a+16|0;a=c[b>>2]|0;d=c[a+140>>2]|0;g=+h[d+16>>3]*72.0;f=+h[d+24>>3]*72.0;e=+h[d+32>>3]*72.0;h[a+16>>3]=+h[d+8>>3]*72.0;h[a+24>>3]=g;h[a+32>>3]=f;h[a+40>>3]=e;a=1;while(1){d=c[b>>2]|0;if((a|0)>(c[d+180>>2]|0))break;No(c[(c[d+184>>2]|0)+(a<<2)>>2]|0);a=a+1|0}return}function Oo(e,f){e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=l;l=l+160|0;t=z+24|0;u=z+8|0;i=z;g=z+56|0;x=f+16|0;y=c[x>>2]|0;c[x>>2]=y+1;c[t>>2]=y;i2(g,91097,t)|0;if((d[195234]|0)>1){y=c[15715]|0;x=HB(e)|0;c[i>>2]=g;c[i+4>>2]=x;z4(y,91104,i)|0};c[t>>2]=c[4658];x=lB(91457,t,0)|0;RC(x,137786,280,1)|0;w=HK(56)|0;y=x+16|0;p=c[y>>2]|0;c[p+140>>2]=w;w=e+16|0;b[p+176>>1]=b[(c[w>>2]|0)+176>>1]|0;Xo(e,x,92808);Xo(e,x,93413);Xo(e,x,91503);p=f+4|0;q=t+16|0;r=t+8|0;s=t+24|0;k=0;o=1;while(1){g=c[w>>2]|0;if((o|0)>(c[g+180>>2]|0))break;c[t>>2]=c[332];c[t+4>>2]=c[333];c[t+8>>2]=c[334];c[t+12>>2]=c[335];c[t+16>>2]=c[336];c[t+20>>2]=c[337];c[t+24>>2]=c[338];c[t+28>>2]=c[339];i=c[(c[g+184>>2]|0)+(o<<2)>>2]|0;sK(i);j=Yo(x,HB(i)|0)|0;m=j+16|0;g=c[m>>2]|0;c[g+212>>2]=i;n=k+1|0;c[g+120>>2]=k;if(c[p>>2]|0)Zo(i,j,f,t);g=gC(i)|0;while(1){if(!g)break;c[(c[g+16>>2]|0)+164>>2]=j;g=hC(i,g)|0}g=c[m>>2]|0;if(a[g+119>>0]|0){m=c[g+132>>2]|0;h[m>>3]=(+h[t>>3]+ +h[q>>3])*.5;h[m+8>>3]=(+h[r>>3]+ +h[s>>3])*.5}k=n;o=o+1|0}m=gC(e)|0;while(1){if(!m)break;g=m+16|0;i=c[g>>2]|0;if(!(c[i+164>>2]|0)){j=i+212|0;t=c[j>>2]|0;if(t|0?(t|0)!=(c[(c[(c[w>>2]|0)+140>>2]|0)+48>>2]|0):0){v=18;break}c[j>>2]=e;if(!(a[i+118>>0]|0)){j=Yo(x,HB(m)|0)|0;i=c[g>>2]|0;c[i+164>>2]=j;j=c[j+16>>2]|0;c[j+120>>2]=k;h[j+32>>3]=+h[i+32>>3];h[j+40>>3]=+h[i+40>>3];h[j+88>>3]=+h[i+88>>3];h[j+96>>3]=+h[i+96>>3];h[j+80>>3]=+h[i+80>>3];c[j+8>>2]=c[i+8>>2];c[j+12>>2]=c[i+12>>2];g=a[i+119>>0]|0;if(g<<24>>24){f=c[i+132>>2]|0;t=c[j+132>>2]|0;h[t>>3]=+h[f>>3];h[t+8>>3]=+h[f+8>>3];a[j+119>>0]=g}c[(c[j+112>>2]|0)+8>>2]=m;g=k+1|0}else g=k}else g=k;m=hC(e,m)|0;k=g}if((v|0)==18){f=HB(m)|0;t=HB(e)|0;v=HB(c[(c[g>>2]|0)+212>>2]|0)|0;c[u>>2]=f;c[u+4>>2]=t;c[u+8>>2]=v;dA(1,91127,u)|0;Ca(187380,1)}n=gC(e)|0;while(1){if(!n)break;o=c[(c[n+16>>2]|0)+164>>2]|0;p=o+16|0;j=UA(e,n)|0;while(1){if(!j)break;g=c[(c[(c[((c[j>>2]&3|0)==2?j:j+-48|0)+40>>2]|0)+16>>2]|0)+164>>2]|0;if((g|0)!=(o|0)){if(g>>>0>o>>>0)m=fB(x,o,g,0,1)|0;else m=fB(x,g,o,0,1)|0;RC(m,137763,176,1)|0;i=c[j+16>>2]|0;v=c[m+16>>2]|0;h[v+136>>3]=+h[i+136>>3];h[v+128>>3]=+h[i+128>>3];g=c[(c[g+16>>2]|0)+112>>2]|0;i=g+4|0;c[i>>2]=(c[i>>2]|0)+1;i=c[(c[p>>2]|0)+112>>2]|0;u=i+4|0;c[u>>2]=(c[u>>2]|0)+1;if(!(c[v+172>>2]|0)){c[g>>2]=(c[g>>2]|0)+1;c[i>>2]=(c[i>>2]|0)+1}_o(m,j)}j=WA(e,j)|0}n=hC(e,n)|0}g=c[(c[w>>2]|0)+140>>2]|0;i=c[g>>2]|0;if(i|0){j=HK((c[g+4>>2]<<4)+16|0)|0;c[c[(c[y>>2]|0)+140>>2]>>2]=j;g=0;while(1){if(!(c[i>>2]|0))break;n=c[(c[(c[i+4>>2]|0)+16>>2]|0)+164>>2]|0;if(n){$o(e,i);o=Yo(x,194052)|0;p=o+16|0;c[(c[p>>2]|0)+120>>2]=k;if(o>>>0>n>>>0)m=fB(x,n,o,0,1)|0;else m=fB(x,o,n,0,1)|0;RC(m,137763,176,1)|0;v=c[i>>2]|0;u=c[v+16>>2]|0;w=c[m+16>>2]|0;h[w+136>>3]=+h[u+136>>3];h[w+128>>3]=+h[u+128>>3];_o(m,v);v=c[(c[p>>2]|0)+112>>2]|0;w=v+4|0;c[w>>2]=(c[w>>2]|0)+1;w=c[(c[n+16>>2]|0)+112>>2]|0;u=w+4|0;c[u>>2]=(c[u>>2]|0)+1;c[v>>2]=(c[v>>2]|0)+1;c[w>>2]=(c[w>>2]|0)+1;c[j+4>>2]=o;h[j+8>>3]=+h[i+8>>3];c[j>>2]=m;g=g+1|0;j=j+16|0;k=k+1|0}i=i+16|0}c[(c[(c[y>>2]|0)+140>>2]|0)+4>>2]=g}l=z;return x|0}function Po(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0,i=0,j=0,k=0,l=0;l=c[a+16>>2]|0;k=c[l+212>>2]|0;l=c[(c[l+112>>2]|0)+4>>2]|0;do if(l|0){j=HK((l<<4)+16|0)|0;f=Uo(a,b)|0;g=f+8|0;b=0;e=f;while(1){if(!(c[e>>2]|0))break;i=e+24|0;if(!(c[i>>2]|0))d=+h[g>>3]+6.283185307179586;else d=+h[e+32>>3];b=Vo(a,e,j,b,d)|0;e=i}if((b|0)==(l|0)){a=c[(c[k+16>>2]|0)+140>>2]|0;c[a>>2]=j;c[a+4>>2]=l;l6(f);break}else Aa(91043,91053,766,91062)}while(0);return k|0}function Qo(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0.0;B=l;l=l+32|0;u=B+16|0;y=B;m=c[g+8>>2]|0;k=c[g+12>>2]|0;v=(c[g>>2]|0)==(f|0);z=(b|0)!=0;x=y+8|0;w=y+4|0;A=y+12|0;a:do if(z){n=c[(c[d>>2]|0)+16>>2]|0;j=+h[n+16>>3];m=~~(j+(j>=0.0?.5:-.5));c[y>>2]=m;j=+h[n+24>>3];g=~~(j+(j>=0.0?.5:-.5));c[w>>2]=g;j=+h[n+32>>3];k=~~(j+(j>=0.0?.5:-.5));c[x>>2]=k;j=+h[n+40>>3];n=~~(j+(j>=0.0?.5:-.5));c[A>>2]=n;if((b|0)>1){b=c[e>>2]|0;t=c[e+4>>2]|0;m=m+b|0;c[y>>2]=m;s=g+t|0;c[w>>2]=s;b=k+b|0;c[x>>2]=b;p=u+4|0;q=u+8|0;r=u+12|0;o=e;g=d;t=n+t|0;while(1){g=g+4|0;k=o+8|0;c[A>>2]=t;n=c[g>>2]|0;if(!n){p=0;break a}F=c[n+16>>2]|0;G=+h[F+16>>3];i=+h[F+24>>3];j=+h[F+32>>3];H=+h[F+40>>3];F=~~(H+(H>=0.0?.5:-.5));c[r>>2]=F;n=c[k>>2]|0;E=c[o+12>>2]|0;D=~~(G+(G>=0.0?.5:-.5))+n|0;c[u>>2]=D;C=~~(i+(i>=0.0?.5:-.5))+E|0;c[p>>2]=C;n=~~(j+(j>=0.0?.5:-.5))+n|0;c[q>>2]=n;E=F+E|0;c[r>>2]=E;D=c[((m|0)<(D|0)?y:u)>>2]|0;c[y>>2]=D;C=c[((s|0)<(C|0)?y:u)+4>>2]|0;c[w>>2]=C;n=c[((b|0)>(n|0)?y:u)+8>>2]|0;c[x>>2]=n;o=k;t=c[((t|0)>(E|0)?y:u)+12>>2]|0;m=D;s=C;b=n}}else{p=0;s=g;t=n;b=k}}else{c[y>>2]=0;c[w>>2]=0;b=XO(f,m,54,3)|0;c[x>>2]=b;t=XO(f,k,36,3)|0;c[A>>2]=t;p=1;s=0;m=0}while(0);n=f+16|0;o=c[n>>2]|0;g=c[o+12>>2]|0;if(g){H=+h[g+24>>3];g=~~(H+(H>=0.0?.5:-.5))+(m-b)|0;if((g|0)>0){g=g>>>1;m=m-g|0;c[y>>2]=m;b=g+b|0;c[x>>2]=b;g=0}else g=0}else g=p;if(v|(g|0)!=0){k=0;g=o}else{k=XO(a,c[47198]|0,8,0)|0;g=c[n>>2]|0}q=k-m|0;p=~~(+(k-s|0)+ +h[g+56>>3]);c[y>>2]=0;c[w>>2]=0;o=q+k+b|0;c[x>>2]=o;n=~~(+(p+k|0)+ +h[g+88>>3]+ +(t|0));c[A>>2]=n;b:do if(z){g=e;c:while(1){b=d+4|0;k=c[d>>2]|0;if(!k)break b;if(!g){m=0;d=q;g=p}else{m=g+8|0;d=(c[g>>2]|0)+q|0;g=(c[g+4>>2]|0)+p|0}j=+(d|0)/72.0;i=+(g|0)/72.0;d=gC(k)|0;while(1){if(!d){d=b;g=m;continue c}F=c[(c[d+16>>2]|0)+132>>2]|0;h[F>>3]=j+ +h[F>>3];F=F+8|0;h[F>>3]=i+ +h[F>>3];d=hC(k,d)|0}}}while(0);F=c[(c[a+16>>2]|0)+140>>2]|0;h[F+8>>3]=0.0;h[F+16>>3]=0.0;h[F+24>>3]=+(o|0)/72.0;h[F+32>>3]=+(n|0)/72.0;l=B;return}function Ro(a,b){a=a|0;b=b|0;var d=0,e=0;while(1){d=c[b>>2]|0;if(!d)break;So(d);TC(d,137786)|0;b=b+4|0}b=c[c[(c[a+16>>2]|0)+140>>2]>>2]|0;if(b|0)l6(b);So(a);TC(a,137786)|0;d=gC(a)|0;while(1){if(!d)break;e=hC(a,d)|0;b=UA(a,d)|0;while(1){if(!b)break;l6(c[(c[b+16>>2]|0)+172>>2]|0);TC(b,137763)|0;b=WA(a,b)|0}To(d);d=e}pB(a)|0;return}function So(a){a=a|0;l6(c[(c[a+16>>2]|0)+140>>2]|0);return}function To(a){a=a|0;var b=0;b=a+16|0;l6(c[(c[b>>2]|0)+112>>2]|0);l6(c[(c[b>>2]|0)+132>>2]|0);TC(a,137750)|0;return}function Uo(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0;k=a+16|0;l=c[c[(c[k>>2]|0)+112>>2]>>2]|0;m=HK((l*24|0)+24|0)|0;i=0;j=ZA(b,a)|0;while(1){if(!j)break;g=c[j>>2]&3;e=c[((g|0)==2?j:j+-48|0)+40>>2]|0;if((e|0)==(a|0))e=c[((g|0)==3?j:j+48|0)+40>>2]|0;e=c[(c[e+16>>2]|0)+132>>2]|0;g=c[(c[k>>2]|0)+132>>2]|0;d=+h[e>>3]-+h[g>>3];f=+h[e+8>>3]-+h[g+8>>3];c[m+(i*24|0)>>2]=j;h[m+(i*24|0)+8>>3]=+O(+f,+d);h[m+(i*24|0)+16>>3]=d*d+f*f;i=i+1|0;j=_A(b,j,a)|0}if((i|0)!=(l|0))Aa(91076,91053,642,91085);k3(m,l,24,67);a:do if((l|0)>1){a=l+-1|0;e=0;b:while(1){if((e|0)>=(a|0))break a;f=+h[m+(e*24|0)+8>>3];g=e+1|0;j=g;while(1){i=m+(j*24|0)+8|0;if((j|0)>=(l|0))break;if(!(+h[i>>3]==f))break;j=j+1|0}if((j|0)==(g|0)){e=g;continue}if((j|0)==(l|0))d=3.141592653589793;else d=+h[i>>3];d=(d-f)/+(j-e|0);d=d>.03490658503988659?.03490658503988659:d;f=0.0;while(1){if((e|0)>=(j|0))continue b;k=m+(e*24|0)+8|0;h[k>>3]=f+ +h[k>>3];f=d+f;e=e+1|0}}}while(0);return m|0}function Vo(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=+g;var i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0.0,q=0;k=c[d>>2]|0;n=c[k+16>>2]|0;m=b[n+168>>1]|0;o=m<<16>>16;j=c[k>>2]&3;i=c[((j|0)==2?k:k+-48|0)+40>>2]|0;if((i|0)==(a|0))i=c[((j|0)==3?k:k+48|0)+40>>2]|0;p=+h[d+8>>3];g=(g-p)/+(m<<16>>16);g=g>.03490658503988659?.03490658503988659:g;q=i>>>0>a>>>0;m=o+f|0;l=q?g:-g;d=q?1:-1;k=0;j=c[n+172>>2]|0;i=q?f:m+-1|0;g=q?p:p+ +(o+-1|0)*g;while(1){if((k|0)>=(o|0))break;q=c[j>>2]|0;c[e+(i<<4)>>2]=q;f=c[q>>2]&3;n=(f|0)==3?q:q+48|0;c[e+(i<<4)+4>>2]=c[((c[(c[(c[n+40>>2]|0)+16>>2]|0)+164>>2]|0)==(a|0)?n:(f|0)==2?q:q+-48|0)+40>>2];h[e+(i<<4)+8>>3]=g;k=k+1|0;j=j+4|0;i=i+d|0;g=l+g}return m|0}function Wo(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a+8>>3];d=+h[b+8>>3];if(!(c>d))if(!(c>3];c=+h[b+16>>3];if(d>c)a=1;else a=(d>31}else a=-1;else a=1;return a|0}function Xo(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=DA(a,0,c,0)|0;do if(d|0){a=OA(a,d)|0;d=DA(b,0,c,0)|0;if(!d){DA(b,0,c,a)|0;break}else{HA(b,d,a)|0;break}}while(0);return}function Yo(a,b){a=a|0;b=b|0;var d=0,f=0;b=qC(a,b,1)|0;RC(b,137750,304,1)|0;f=HK(32)|0;d=b+16|0;c[(c[d>>2]|0)+112>>2]=f;a=IK((e[(c[a+16>>2]|0)+176>>1]|0)<<3)|0;c[(c[d>>2]|0)+132>>2]=a;return b|0}function Zo(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+80|0;n=q+56|0;m=q+32|0;o=q;p=q+64|0;i=c[e+4>>2]|0;k=OA(b,i)|0;do if(a[k>>0]|0){if((c[e>>2]|0)!=(b|0)){e=OA(OD(b)|0,i)|0;if((e|0)==(k|0))break;if(!(f2(k,e)|0))break}a[p>>0]=0;e=o+8|0;i=o+16|0;j=o+24|0;c[m>>2]=o;c[m+4>>2]=e;c[m+8>>2]=i;c[m+12>>2]=j;c[m+16>>2]=p;if((q4(k,91238,m)|0)<=3){c[n>>2]=HB(b)|0;c[n+4>>2]=k;dA(0,91256,n)|0;break}g=+h[23314];if(g>0.0){h[o>>3]=+h[o>>3]/g;h[e>>3]=+h[e>>3]/g;h[i>>3]=+h[i>>3]/g;h[j>>3]=+h[j>>3]/g}p=a[p>>0]|0;a[(c[d+16>>2]|0)+119>>0]=p<<24>>24==33?3:p<<24>>24==63?2:1;c[f>>2]=c[o>>2];c[f+4>>2]=c[o+4>>2];c[f+8>>2]=c[o+8>>2];c[f+12>>2]=c[o+12>>2];c[f+16>>2]=c[o+16>>2];c[f+20>>2]=c[o+20>>2];c[f+24>>2]=c[o+24>>2];c[f+28>>2]=c[o+28>>2]}while(0);l=q;return}function _o(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;f=a+16|0;g=c[f>>2]|0;e=c[g+172>>2]|0;g=b[g+168>>1]|0;a=(g<<2)+4|0;if(!e)a=IK(a)|0;else a=KK(e,a)|0;c[a+(g<<2)>>2]=d;d=c[f>>2]|0;c[d+172>>2]=a;d=d+168|0;b[d>>1]=(b[d>>1]|0)+1<<16>>16;return}function $o(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;i=l;l=l+48|0;h=i+24|0;g=i;e=c[b>>2]|0;d=c[e>>2]&3;f=c[((d|0)==2?e:e+-48|0)+40>>2]|0;d=c[((d|0)==3?e:e+48|0)+40>>2]|0;b=D3(HB(a)|0)|0;j=D3(HB(f)|0)|0;j=(b+8+j+(D3(HB(d)|0)|0)|0)>999;b=HB(a)|0;if(j){d=HB(d)|0;j=HB(f)|0;h=(c[e>>2]|0)>>>4;c[g>>2]=b;c[g+4>>2]=d;c[g+8>>2]=j;j=g+16|0;c[j>>2]=h;c[j+4>>2]=0;i2(194052,91196,g)|0}else{d=c[(c[d+16>>2]|0)+120>>2]|0;j=c[(c[f+16>>2]|0)+120>>2]|0;g=(c[e>>2]|0)>>>4;c[h>>2]=b;c[h+4>>2]=d;c[h+8>>2]=j;j=h+16|0;c[j>>2]=g;c[j+4>>2]=0;i2(194052,91215,h)|0}l=i;return}function ap(a){a=a|0;var d=0,e=0,f=0.0,g=0.0,i=0,j=0,k=0;j=4;i=k6(40)|0;c[i>>2]=0;g=+h[23314];o=0;f=+da(1,a|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,i|0,j|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)!=1){h[23314]=f;o=0;$(102,a|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,i|0,j|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)!=1){i=x6(187380,1,i|0,j|0)|0;j=D;o=0;e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,i|0,j|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)!=1)d=0;else d=D}else d=D}else d=D;while(1){if(d|0)break;o=0;$(103,a|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,i|0,j|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;continue}o=0;la(22,a|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,i|0,j|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;continue}if(b[(c[a+16>>2]|0)+136>>1]&14){o=0;$(104,a|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,i|0,j|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;continue}}o=0;ha(22,a|0,0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,i|0,j|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1)d=D;else{k=12;break}}if((k|0)==12)h[23314]=g;l6(i|0);return}function bp(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;e=a+16|0;f=b[(c[e>>2]|0)+136>>1]&14;d=f&65535;if((f&65535)>8){if(f<<16>>16==12){if(Rm(a,25,10)|0){c[47180]=2;h=5}}else h=5;do if((h|0)==5)if(!(b[(c[e>>2]|0)+136>>1]&1)){Tm(a,d)|0;break}else{dA(0,91299,g)|0;d=2;break}while(0);c[47180]=0}if((c[47185]|0)<1)Tm(a,d)|0;l=i;return}function cp(a){a=a|0;var b=0.0,d=0.0,e=0,f=0;e=l;l=l+16|0;f=c[5180]|0;c[46512]=c[f>>2];c[46513]=c[f+4>>2];c[46515]=c[f+8>>2];c[46517]=c[f+12>>2];h[23264]=0.0;h[23259]=+h[f+16>>3];h[23260]=+h[f+24>>3];c[46516]=XO(a,DA(a,0,91362,0)|0,600,0)|0;b=+YO(a,DA(a,0,91503,0)|0,.3,0.0);h[23261]=b;f=c[5180]|0;h[f+32>>3]=b;b=+h[f+40>>3];if(b==-1.0)b=+YO(a,DA(a,0,91370,0)|0,-1.0,0.0);h[23262]=b;c[46514]=1;f=jm(a,2,186056)|0;c[46526]=f;if(!f){dA(0,91373,e)|0;c[46514]=2}c[46542]=(S(c[46516]|0,c[46517]|0)|0)/100|0;d=+h[23261];h[23266]=d*d;if(c[46512]|0){b=+h[23264];if(b<=0.0){b=d*3.0;h[23264]=b}h[23265]=b*b}l=e;return}function dp(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0,i=0,j=0;j=l;l=l+16|0;d=j;g=c[c[(c[a+16>>2]|0)+140>>2]>>2]|0;i=ep(a,b)|0;fp(d,a,g);e=+h[d>>3];f=+h[d+8>>3];a:do if(!(c[46512]|0)){b=0;while(1){if((b|0)>=(c[46543]|0))break a;ip(a,+gp(b),g);b=b+1|0}}else{d=Hv(qB(a)|0)|0;Mv(d,qB(a)|0);b=0;while(1){if((b|0)>=(c[46543]|0))break;hp(a,+gp(b),g,d);b=b+1|0}Ov(d)}while(0);b:do if(e!=0.0|f!=0.0){b=gC(a)|0;while(1){if(!b)break b;g=c[(c[b+16>>2]|0)+132>>2]|0;h[g>>3]=e+ +h[g>>3];g=g+8|0;h[g>>3]=f+ +h[g>>3];b=hC(a,b)|0}}while(0);if(i|0)jp();l=j;return}function ep(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0,i=0,j=0;if(+h[23262]==-1.0){i=qB(a)|0;d=+h[23261];h[23262]=+h[23260]*d*+G(+(+(i|0)))/5.0;i=1}else{i=0;d=+h[23261]}g=c[46542]|0;h[b+8>>3]=+gp(g);h[b+16>>3]=d;h[b+24>>3]=+h[23259];e=c[46516]|0;a=e-g|0;c[b>>2]=a;f=c[46515]|0;do if((f|0)>-1){if((f|0)<=(g|0)){c[46543]=f;a=0;j=10;break}if((f|0)<=(e|0)){c[46543]=g;a=f-g|0;j=10}}else{c[46543]=g;j=10}while(0);if((j|0)==10)c[b+32>>2]=a;return i|0}function fp(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0;w=qB(d)|0;x=c[(c[(c[d+16>>2]|0)+140>>2]|0)+4>>2]|0;u=gC(d)|0;v=0;n=0;f=0;g=0;o=0;while(1){l=+(f|0);k=+(n|0);y=(v|0)!=0;if(!u)break;p=c[u+16>>2]|0;if(!(a[p+119>>0]|0))p=v;else{p=c[p+132>>2]|0;j=+h[p>>3];i=+h[p+8>>3];if(y){t=+(g|0);s=+(o|0);o=~~(i>s?i:s);n=~~(jt?j:t)}else{g=~~j;f=~~i;o=f;n=g}p=v+1|0}u=hC(d,u)|0;v=p}t=+h[23261]*(+G(+(+(w-x|0)))+1.0)*.5*1.2;h[23268]=t;h[23267]=t;if((v|0)!=1)if((v|0)>1){r=+(g+n|0)*.5;s=+(o+f|0)*.5;q=+(g-n|0)*1.2;k=+(o-f|0)*1.2;l=t*4.0*t;m=q*k/l;i=q*.5;j=k*.5;do if(!(m>=1.0)){if(m>0.0){j=+G(+m)*2.0;i=q/j;h[23267]=i;j=k/j;A=19;break}if(q>0.0){h[23267]=i;j=l/q*.5;A=19;break}if(k>0.0){i=l/k*.5;h[23267]=i;A=19}else{j=t;i=t}}else{h[23267]=i;A=19}while(0);if((A|0)==19)h[23268]=j;q=+O(+j,+i);t=i/+I(+q);h[23267]=t;i=j/+J(+q);h[23268]=i;j=t}else{r=0.0;s=0.0;j=t;i=t}else{r=k;s=l;j=t;i=t}h[23269]=j*j;h[23270]=i*i;if((c[46526]|0)==2)f=c[46514]|0;else{f=e4()|0;f=(Ya(0)|0)^f}W4(f);a:do if(!e){e=gC(d)|0;if(!y)while(1){if(!e)break a;t=+h[23267];t=t*(+S4()*2.0+-1.0);A=e+16|0;h[c[(c[A>>2]|0)+132>>2]>>3]=t;t=+h[23268];t=t*(+S4()*2.0+-1.0);h[(c[(c[A>>2]|0)+132>>2]|0)+8>>3]=t;e=hC(d,e)|0}while(1){if(!e)break a;f=e+16|0;g=c[f>>2]|0;if(!(a[g+119>>0]|0)){t=+h[23267];t=t*(+S4()*2.0+-1.0);h[c[(c[f>>2]|0)+132>>2]>>3]=t;t=+h[23268];t=t*(+S4()*2.0+-1.0);h[(c[(c[f>>2]|0)+132>>2]|0)+8>>3]=t}else{A=c[g+132>>2]|0;h[A>>3]=+h[A>>3]-r;A=A+8|0;h[A>>3]=+h[A>>3]-s}e=hC(d,e)|0}}else{while(1){if(!(c[e>>2]|0))break;w=e+8|0;t=r+ +h[23267]*+I(+(+h[w>>3]));y=c[(c[e+4>>2]|0)+16>>2]|0;x=c[y+132>>2]|0;h[x>>3]=t;h[x+8>>3]=s+ +h[23268]*+J(+(+h[w>>3]));a[y+119>>0]=1;e=e+16|0}m=r*.1;q=s*.1;u=gC(d)|0;while(1){if(!u)break a;p=u+16|0;e=c[p>>2]|0;if(!((c[(c[e+112>>2]|0)+8>>2]|0)==0?!(c[e+212>>2]|0):0))A=31;do if((A|0)==31){A=0;if(a[e+119>>0]|0){y=c[e+132>>2]|0;h[y>>3]=+h[y>>3]-r;y=y+8|0;h[y>>3]=+h[y>>3]-s;break}o=ZA(d,u)|0;n=0;j=0.0;i=0.0;while(1){if(!o)break;g=c[o>>2]&3;e=(g|0)==2?o:o+-48|0;f=c[e+40>>2]|0;g=(g|0)==3?o:o+48|0;if((f|0)!=(c[g+40>>2]|0)?(z=c[(c[((f|0)==(u|0)?g:e)+40>>2]|0)+16>>2]|0,(a[z+119>>0]|0)!=0):0){e=n+1|0;y=c[z+132>>2]|0;l=+h[y+8>>3];k=+h[y>>3];if(!n){j=k;i=l}else{B=+(n|0);t=+(e|0);j=(j*B+k)/t;i=(i*B+l)/t}}else e=n;o=_A(d,o,u)|0;n=e}do if((n|0)<=1)if((n|0)==1){f=c[p>>2]|0;e=c[f+132>>2]|0;h[e>>3]=m+j*.98;i=q+i*.9;break}else{i=+S4()*6.283185307179586;B=+S4()*.9;t=B*+h[23267]*+I(+i);f=c[p>>2]|0;e=c[f+132>>2]|0;h[e>>3]=t;i=B*+h[23268]*+J(+i);break}else{f=c[p>>2]|0;e=c[f+132>>2]|0;h[e>>3]=j}while(0);h[e+8>>3]=i;a[f+119>>0]=1}while(0);u=hC(d,u)|0}}while(0);h[b>>3]=r;h[b+8>>3]=s;return}function gp(a){a=a|0;var b=0;b=c[46516]|0;return +(+h[23262]*+(b-a|0)/+(b|0))}function hp(a,b,d,e){a=a|0;b=+b;d=d|0;e=e|0;var f=0,g=0,i=0,j=0.0;if(!(b<=0.0)){Nv(e);f=gC(a)|0;while(1){if(!f)break;i=c[f+16>>2]|0;g=(c[i+112>>2]|0)+16|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;i=c[i+132>>2]|0;j=+h[23264];g=~~+E(+(+h[i>>3]/j));Qv(e,g,~~+E(+(+h[i+8>>3]/j)),f);f=hC(a,f)|0}g=gC(a)|0;while(1){if(!g)break;f=UA(a,g)|0;while(1){if(!f)break;i=c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0;if((g|0)!=(i|0))lp(g,i,f);f=WA(a,f)|0}g=hC(a,g)|0}Sv(e,26);mp(a,b,d)}return}function ip(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,g=0;if(!(b<=0.0)){e=gC(a)|0;while(1){if(!e)break;g=(c[(c[e+16>>2]|0)+112>>2]|0)+16|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;e=hC(a,e)|0}g=gC(a)|0;while(1){if(!g)break;else e=g;while(1){e=hC(a,e)|0;if(!e)break;kp(g,e)}e=UA(a,g)|0;while(1){if(!e)break;f=c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0;if((g|0)!=(f|0))lp(g,f,e);e=WA(a,e)|0}g=hC(a,g)|0}mp(a,b,d)}return}function jp(){h[23262]=-1.0;return}function kp(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0;g=c[(c[b+16>>2]|0)+132>>2]|0;f=c[(c[a+16>>2]|0)+132>>2]|0;e=+h[g>>3]-+h[f>>3];d=+h[g+8>>3]-+h[f+8>>3];np(a,b,e,d,e*e+d*d);return}function lp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0.0,j=0,k=0;j=b+16|0;k=c[(c[j>>2]|0)+132>>2]|0;b=a+16|0;a=c[(c[b>>2]|0)+132>>2]|0;e=+h[k>>3]-+h[a>>3];f=+h[k+8>>3]-+h[a+8>>3];g=e;i=f;e=e*e;f=f*f;while(1){e=f+e;if(!(e==0.0))break;e=+(5-((U4()|0)%10|0)|0);f=+(5-((U4()|0)%10|0)|0);g=e;i=f;e=e*e;f=f*f}f=+G(+e);k=(c[46513]|0)==0;d=c[d+16>>2]|0;e=+h[d+136>>3];f=+h[d+128>>3]*(k?f:f-e)/(k?e:f);g=g*f;k=c[(c[j>>2]|0)+112>>2]|0;d=k+16|0;h[d>>3]=+h[d>>3]-g;i=i*f;k=k+24|0;h[k>>3]=+h[k>>3]-i;k=c[(c[b>>2]|0)+112>>2]|0;d=k+16|0;h[d>>3]=g+ +h[d>>3];k=k+24|0;h[k>>3]=i+ +h[k>>3];return}function mp(b,d,e){b=b|0;d=+d;e=e|0;var f=0.0,g=0.0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0.0;o=d*d;n=(e|0)==0;l=gC(b)|0;while(1){if(!l)break;k=c[l+16>>2]|0;if(!(a[k+119>>0]&2)){e=c[k+112>>2]|0;f=+h[e+16>>3];g=+h[e+24>>3];i=f*f+g*g;j=c[k+132>>2]|0;m=j+8|0;if(!(i>3]+f;f=+h[m>>3]+g;do if(!n){g=+G(+(i*i/+h[23269]+f*f/+h[23270]));if((c[e+8>>2]|0)==0?(c[k+212>>2]|0)==0:0){h[j>>3]=i/g;f=f/g;break}if(!(g>=1.0)){h[j>>3]=i;break}else{h[j>>3]=i*.95/g;f=f*.95/g;break}}else h[j>>3]=i;while(0);h[m>>3]=f}l=hC(b,l)|0}return}function np(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=+e;f=+f;var g=0,i=0;while(1){if(!(f==0.0))break;f=+(5-((U4()|0)%10|0)|0);e=+(5-((U4()|0)%10|0)|0);d=f;f=f*f+e*e}if(c[46513]|0)f=f*+G(+f);f=+h[23266]/f;i=c[a+16>>2]|0;g=c[i+112>>2]|0;a=c[b+16>>2]|0;b=c[a+112>>2]|0;if(((c[g+8>>2]|0)==0?(c[i+212>>2]|0)==0:0)?(c[b+8>>2]|0)==0:0)f=(c[a+212>>2]|0)==0?f*10.0:f;d=d*f;i=b+16|0;h[i>>3]=+h[i>>3]+d;e=e*f;i=b+24|0;h[i>>3]=e+ +h[i>>3];i=g+16|0;h[i>>3]=+h[i>>3]-d;i=g+24|0;h[i>>3]=+h[i>>3]-e;return}function op(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;f=c[b+8>>2]|0;g=c[b>>2]|0;e=c[b+4>>2]|0;b=f;while(1){if(!b)break;a=f;while(1){if(!a)break;if((b|0)!=(a|0))kp(c[b>>2]|0,c[a>>2]|0);a=c[a+4>>2]|0}b=c[b+4>>2]|0}h=g+-1|0;a=e+-1|0;pp(d,h,a,f);pp(d,h,e,f);b=e+1|0;pp(d,h,b,f);pp(d,g,a,f);pp(d,g,b,f);g=g+1|0;pp(d,g,a,f);pp(d,g,e,f);pp(d,g,b,f);return 0}function pp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0,k=0,l=0,m=0;a=Tv(a,b,d)|0;if((e|0)!=0&(a|0)!=0){k=a+8|0;do{d=c[e>>2]|0;j=d+16|0;a=k;while(1){a=c[a>>2]|0;if(!a)break;b=c[a>>2]|0;m=c[(c[b+16>>2]|0)+132>>2]|0;l=c[(c[j>>2]|0)+132>>2]|0;f=+h[m>>3]-+h[l>>3];g=+h[m+8>>3]-+h[l+8>>3];i=f*f+g*g;if(i<+h[23265])np(d,b,f,g,i);a=a+4|0}e=c[e+4>>2]|0}while((e|0)!=0)}return}function qp(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=l;l=l+16|0;g=h;e=NA(b,92808)|0;if(a[195234]|0)_3(91417,8,1,c[15715]|0)|0;if(!((e|0)!=0?(a[e>>0]|0)!=0:0))e=91426;f=F3(e,58)|0;do if(!f)f=0;else{if((f|0)!=(e|0)?((a[e>>0]|0)+-48|0)>>>0>=10:0){f=0;break}i=d6(e)|0;e=f+1|0;f=(i|0)>0?i:0}while(0);if(a[195234]|0){i=c[15715]|0;c[g>>2]=f;c[g+4>>2]=e;z4(i,91434,g)|0}if(!((f|0)!=0?!(rp(b,d,f)|0):0))kr(b,e)|0;l=h;return}function rp(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0;t=l;l=l+64|0;r=t;j=t+40|0;s=qB(b)|0;k=rB(b)|0;ir(j,b);c[46884]=c[j>>2];c[46885]=c[j+4>>2];c[46886]=c[j+8>>2];if(a[187544]|0){g[46884]=+g[46884]/72.0;g[46885]=+g[46885]/72.0}f=sp(b)|0;a:do if(!f)f=0;else{j=r;i=j+40|0;do{c[j>>2]=c[d>>2];j=j+4|0;d=d+4|0}while((j|0)<(i|0));j=r+16|0;q=+h[j>>3];o=+(k|0);p=+(S(s+-1|0,s)|0);i=0;n=q;while(1){if(!((f|0)!=0&(i|0)<(e|0)))break a;tp(s,r);m=+h[170]*+h[23272];h[23273]=m;h[23274]=o*m*2.0/p;d=0;while(1){if((d|0)>=(c[46550]|0))break;m=+up(d);if(m<=0.0)break;f=vp(b,m)|0;if(!f){f=0;break}else d=d+1|0}m=q+n;h[j>>3]=m;i=i+1|0;n=m}}while(0);l=t;return f|0}function sp(a){a=a|0;var b=0,c=0,d=0,e=0;b=0;e=gC(a)|0;while(1){if(!e)break;else d=e;while(1){c=hC(a,d)|0;if(!c)break;d=c;b=(yp(e,c)|0)+b|0}e=hC(a,e)|0}return b|0}function tp(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0;e=+h[b+16>>3];h[171]=e;c[344]=c[b>>2];f=+h[b+8>>3];h[23276]=f;c[46550]=c[b+32>>2];d=+h[b+24>>3];if(d>0.0)h[170]=d;h[23272]=e*e;if(f==0.0)h[23276]=e*+G(+(+(a|0)))/5.0;return}function up(a){a=a|0;var b=0;b=c[344]|0;return +(+h[23276]*+(b-a|0)/+(b|0))}function vp(b,d){b=b|0;d=+d;var e=0,f=0,g=0,i=0.0,j=0,k=0.0,l=0.0,m=0.0,n=0.0;e=gC(b)|0;while(1){if(!e)break;j=(c[(c[e+16>>2]|0)+112>>2]|0)+16|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;e=hC(b,e)|0}e=0;j=gC(b)|0;while(1){if(!j)break;else g=j;while(1){f=hC(b,g)|0;if(!f)break;g=f;e=(wp(j,f)|0)+e|0}f=UA(b,j)|0;while(1){if(!f)break;xp(j,c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0);f=WA(b,f)|0}j=hC(b,j)|0}a:do if(!e)e=0;else{n=d*d;g=gC(b)|0;while(1){if(!g)break a;f=c[g+16>>2]|0;if((a[f+119>>0]|0)!=3){j=c[f+112>>2]|0;l=+h[j+16>>3];i=+h[j+24>>3];m=l*l+i*i;f=c[f+132>>2]|0;k=+h[f>>3];if(m>3]=l+k;else{m=+G(+m);h[f>>3]=k+l*d/m;i=i*d/m}j=f+8|0;h[j>>3]=i+ +h[j>>3]}g=hC(b,g)|0}}while(0);return e|0}function wp(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0;g=c[(c[b+16>>2]|0)+132>>2]|0;f=c[(c[a+16>>2]|0)+132>>2]|0;e=+h[g>>3]-+h[f>>3];d=+h[g+8>>3]-+h[f+8>>3];return Ap(a,b,e,d,e*e+d*d)|0}function xp(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0.0,i=0,j=0.0,k=0.0,l=0,m=0;if(!(yp(a,b)|0)){i=c[b+16>>2]|0;m=c[i+132>>2]|0;f=c[a+16>>2]|0;l=c[f+132>>2]|0;e=+h[m>>3]-+h[l>>3];g=+h[m+8>>3]-+h[l+8>>3];j=+G(+(e*e+g*g));d=+zp(a);d=d+ +zp(b);k=j-d;d=k*k/(j*(+h[171]+d));e=e*d;b=c[i+112>>2]|0;a=b+16|0;h[a>>3]=+h[a>>3]-e;d=g*d;b=b+24|0;h[b>>3]=+h[b>>3]-d;b=c[f+112>>2]|0;a=b+16|0;h[a>>3]=e+ +h[a>>3];b=b+24|0;h[b>>3]=d+ +h[b>>3]}return}function yp(b,d){b=b|0;d=d|0;var e=0.0,f=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0;f=c[d+16>>2]|0;m=c[f+132>>2]|0;b=c[b+16>>2]|0;d=c[b+132>>2]|0;l=+h[m>>3]-+h[d>>3];e=+h[m+8>>3]-+h[d+8>>3];d=(a[187544]|0)!=0;k=+h[b+32>>3];i=+g[46884];j=+h[f+32>>3];if(!((l<0.0?-l:l)<=(d?k*.5+i:k*i*.5)+(d?i+j*.5:j*i*.5)))d=0;else{j=+h[b+40>>3];l=+g[46885];k=+h[f+40>>3];d=(e<0.0?-e:e)<=(d?j*.5+l:j*l*.5)+(d?l+k*.5:k*l*.5)}return d&1|0}function zp(b){b=b|0;var d=0.0,e=0.0,f=0.0,i=0;i=(a[187544]|0)!=0;b=c[b+16>>2]|0;f=+h[b+32>>3];e=+g[46884];e=i?f*.5+e:f*e*.5;f=+h[b+40>>3];d=+g[46885];d=i?f*.5+d:f*d*.5;return +(+G(+(e*e+d*d)))}function Ap(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=+e;f=+f;var g=0,i=0;while(1){if(!(f==0.0))break;f=+(5-((U4()|0)%10|0)|0);e=+(5-((U4()|0)%10|0)|0);d=f;f=f*f+e*e}g=yp(a,b)|0;f=((g|0)==0?+h[23274]:+h[23273])/f;d=d*f;b=c[(c[b+16>>2]|0)+112>>2]|0;i=b+16|0;h[i>>3]=+h[i>>3]+d;f=e*f;b=b+24|0;h[b>>3]=f+ +h[b>>3];b=c[(c[a+16>>2]|0)+112>>2]|0;a=b+16|0;h[a>>3]=+h[a>>3]-d;b=b+24|0;h[b>>3]=+h[b>>3]-f;return g|0}function Bp(a){a=a|0;mQ(a,2);b[(c[a+16>>2]|0)+176>>1]=2;c[47184]=2;Cp(a);return}function Cp(a){a=a|0;var b=0,d=0,e=0,f=0;e=HK((qB(a)|0)<<2)|0;b=HK(((qB(a)|0)<<2)+4|0)|0;f=a+16|0;c[(c[f>>2]|0)+152>>2]=b;b=gC(a)|0;d=0;while(1){if(!b)break;Wl(b);c[(c[b+16>>2]|0)+112>>2]=e+(d<<2);c[(c[(c[f>>2]|0)+152>>2]|0)+(d<<2)>>2]=b;b=hC(a,b)|0;d=d+1|0}d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;Dp(b);b=WA(a,b)|0}d=hC(a,d)|0}return}function Dp(a){a=a|0;var b=0.0;RC(a,137763,176,1)|0;rP(a)|0;b=+YO(a,c[47236]|0,1.0,0.0);h[(c[a+16>>2]|0)+128>>3]=b;return}function Ep(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m+4|0;j=m;c[k>>2]=c[4660];k=lB(91457,k,0)|0;RC(k,91465,280,1)|0;c[(c[a+16>>2]|0)+140>>2]=k;d=gC(a)|0;while(1){if(!d)break;e=d+16|0;if(!(c[c[(c[e>>2]|0)+112>>2]>>2]|0)){i=Fp(k,HB(d)|0,d)|0;c[c[(c[e>>2]|0)+112>>2]>>2]=i}d=hC(a,d)|0}e=gC(a)|0;while(1){if(!e)break;d=UA(a,e)|0;while(1){if(!d)break;g=c[d>>2]&3;f=c[c[(c[(c[((g|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+112>>2]>>2]|0;g=c[c[(c[(c[((g|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]>>2]|0;if((f|0)!=(g|0))RC(fB(k,f,g,0,1)|0,137763,176,1)|0;d=WA(a,d)|0}e=hC(a,e)|0}i=BG(k,j,0)|0;e=0;while(1){if((e|0)>=(c[j>>2]|0))break;g=c[i+(e<<2)>>2]|0;d=gC(g)|0;while(1){if(!d)break;f=UA(a,c[c[(c[d+16>>2]|0)+112>>2]>>2]|0)|0;while(1){if(!f)break;h=c[c[(c[(c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]>>2]|0;if((d|0)!=(h|0)){h=fB(k,d,h,0,1)|0;RC(h,137763,176,1)|0;jB(g,h,1)|0}f=WA(a,f)|0}d=hC(g,d)|0}e=e+1|0}d=gC(k)|0;while(1){if(!d)break;e=UA(k,d)|0;while(1){if(!e)break;a=HK(8)|0;c[(c[e+16>>2]|0)+120>>2]=a;e=WA(k,e)|0}d=hC(k,d)|0}c[b>>2]=c[j>>2];l=m;return i|0}function Fp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;b=qC(a,b,1)|0;RC(b,137750,304,1)|0;e=HK(40)|0;a=b+16|0;c[(c[a>>2]|0)+112>>2]=e;e=HK(c[47184]<<3)|0;a=c[a>>2]|0;c[a+132>>2]=e;e=c[d+16>>2]|0;h[a+88>>3]=+h[e+88>>3];h[a+96>>3]=+h[e+96>>3];h[a+80>>3]=+h[e+80>>3];c[c[a+112>>2]>>2]=d;return b|0}function Gp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+48|0;b=h+32|0;e=h;if(qB(a)|0){g=Ep(a,b)|0;f=c[b>>2]|0;b=c[g>>2]|0;if((f|0)==1){_w(b,a);Hp(c[g>>2]|0);lr(a)|0}else{d=c[b+60>>2]|0;iH(a,2,8,e)|0;b=0;while(1){if((b|0)>=(f|0))break;i=c[g+(b<<2)>>2]|0;_w(i,a);lr(i)|0;b=b+1|0}hH(f,g,d,e)|0;b=0;while(1){if((b|0)>=(f|0))break;Hp(c[g+(b<<2)>>2]|0);b=b+1|0}}l6(g)}l=h;return}function Hp(a){a=a|0;var b=0,d=0,e=0;b=gC(a)|0;while(1){if(!b)break;d=c[b+16>>2]|0;e=c[d+132>>2]|0;d=c[(c[(c[c[d+112>>2]>>2]|0)+16>>2]|0)+132>>2]|0;h[d>>3]=+h[e>>3];h[d+8>>3]=+h[e+8>>3];b=hC(a,b)|0}return}function Ip(a){a=a|0;if(qB(a)|0){Bp(a);Gp(a);l6(c[(c[(gC(a)|0)+16>>2]|0)+112>>2]|0);cn(a);rM(a)}return}function Jp(a){a=a|0;var b=0,d=0,e=0;b=gC(a)|0;if(b|0){e=a+16|0;Kp(c[(c[e>>2]|0)+140>>2]|0);while(1){if(!b)break;d=UA(a,b)|0;while(1){if(!d)break;WP(d);d=WA(a,d)|0}UP(b);b=hC(a,b)|0}l6(c[(c[e>>2]|0)+152>>2]|0);if((vC(a)|0)!=(a|0))XC(a,0,137786)}return}function Kp(a){a=a|0;var b=0,d=0;d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;l6(c[(c[b+16>>2]|0)+120>>2]|0);b=WA(a,b)|0}b=d+16|0;l6(c[(c[b>>2]|0)+112>>2]|0);l6(c[(c[b>>2]|0)+132>>2]|0);d=hC(a,d)|0}pB(a)|0;return}function Lp(b){b=b|0;var d=0,e=0.0,f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+112|0;k=r+40|0;m=r+16|0;q=r+100|0;n=r;i=r+88|0;o=r+56|0;Mp(b);j=(c[47184]|0)==2;d=j&1;if(qB(b)|0){p=Vp()|0;Np(b,p);Kq(b,m,0)|0;f=p+124|0;if(j&(c[m>>2]|0)==18){c[f>>2]=c[m+8>>2];h[p+144>>3]=+h[m+16>>3];ir(i,b);if(!(a[i+8>>0]|0)){h[n>>3]=.05555555555555555;e=.05555555555555555}else{e=+g[i+4>>2];h[n>>3]=+g[i>>2]/72.0;e=e/72.0}h[n+8>>3]=e;d=0}else c[f>>2]=-1;if(a[195234]|0)Xp(p);j=BG(b,q,0)|0;if((c[q>>2]|0)==1){c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];Op(b,p,k);if(d|0)Nq(b,m)|0;cn(b);d=0}else{iH(b,2,8,o)|0;c[o+12>>2]=1;i=(d|0)==0;f=0;while(1){d=c[q>>2]|0;if((f|0)>=(d|0))break;d=c[j+(f<<2)>>2]|0;IG(d)|0;c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];Op(d,p,k);if(!i)Nq(d,m)|0;mQ(d,2);cn(d);f=f+1|0}hH(d,j,b,o)|0;d=0}while(1){if((d|0)>=(c[q>>2]|0))break;tC(b,c[j+(d<<2)>>2]|0)|0;d=d+1|0}l6(j);Wp(p)}rM(b);l=r;return}function Mp(a){a=a|0;var d=0,f=0;mQ(a,2);d=XO(a,DA(a,0,91669,0)|0,2,2)|0;f=(XO(a,DA(a,0,91675,0)|0,d,2)|0)&65535;b[(c[(vC(a)|0)+16>>2]|0)+176>>1]=f;if((e[(c[(vC(a)|0)+16>>2]|0)+176>>1]|0)<10)f=b[(c[(vC(a)|0)+16>>2]|0)+176>>1]|0;else f=10;b[(c[(vC(a)|0)+16>>2]|0)+176>>1]=f;f=f&65535;c[47184]=f;b[(c[(vC(a)|0)+16>>2]|0)+178>>1]=(d|0)<(f|0)?d:f;Sp(a);return}function Np(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+16|0;f=g+8|0;d=g+12|0;e=b+108|0;c[d>>2]=c[e>>2];if((jm(a,2,d)|0)!=2)dA(0,91470,g)|0;c[e>>2]=c[d>>2];h[b+24>>3]=+YO(a,DA(a,0,91503,0)|0,-1.0,0.0);h[b>>3]=-+YO(a,DA(a,0,91505,0)|0,1.0001234,0.0);c[b+40>>2]=XO(a,DA(a,0,91520,0)|0,2147483647,0)|0;c[b+120>>2]=Qp(a,DA(a,0,91527,0)|0)|0;c[b+132>>2]=Rp(a,DA(a,0,91537,0)|0)|0;c[b+136>>2]=0;c[b+112>>2]=(cP(NA(a,91546)|0,0)|0)&255;c[b+128>>2]=(cP(NA(a,91555)|0,1)|0)&255;h[b+152>>3]=+YO(a,DA(a,0,91570,0)|0,0.0,-1797693134862315708145274.0e284);d=XO(a,DA(a,0,91579,0)|0,0,0)|0;a=b+160|0;c[a>>2]=d;if((d|0)>4){c[f>>2]=d;dA(0,91592,f)|0;c[a>>2]=0}l=g;return}function Op(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+48|0;f=q;n=q+32|0;j=q+28|0;g=q+24|0;p=q+20|0;o=q+16|0;c[g>>2]=0;c[p>>2]=0;c[o>>2]=0;i=b+136|0;e=c[47184]|0;if((c[i>>2]|0)==1)m=Hq(a,e,o)|0;else m=Hq(a,e,0)|0;do if((c[b+124>>2]|0)>-1)if((c[b+160>>2]|0)>0){c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];k=Gq(a,f,g,p)|0;break}else{c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];k=Gq(a,f,0,0)|0;break}else k=0;while(0);e=Pp(a)|0;c[n>>2]=e;switch(c[i>>2]|0){case 1:case 0:{tq(c[47184]|0,m,c[o>>2]|0,b,0,k,e,c[g>>2]|0,c[p>>2]|0,j);break}case 5:{Fq(c[47184]|0,m,e,j);break}case 4:{e=c[o>>2]|0;if(!e)e=Nw(m)|0;else e=xw(e,0)|0;c[o>>2]=e;Aq(c[47184]|0,m,e,n,1,200,.001,j);break}default:{}}e=gC(a)|0;while(1){if(!e)break;d=c[47184]|0;g=c[e+16>>2]|0;b=(c[n>>2]|0)+((S(c[g+120>>2]|0,d)|0)<<3)|0;g=g+132|0;f=0;while(1){if((f|0)>=(d|0))break;h[(c[g>>2]|0)+(f<<3)>>3]=+h[b+(f<<3)>>3];f=f+1|0}e=hC(a,e)|0}l6(k);l6(c[n>>2]|0);nw(m);e=c[o>>2]|0;if(e|0)nw(e);e=c[p>>2]|0;if(e|0)l6(e);l=q;return}function Pp(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0;j=c[47184]|0;j=HK(S(j<<3,qB(b)|0)|0)|0;a:do if(DA(b,1,102924,0)|0){f=gC(b)|0;while(1){if(!f)break a;d=c[f+16>>2]|0;b:do if(a[d+119>>0]|0){g=c[47184]|0;i=d+132|0;e=S(g,c[d+120>>2]|0)|0;d=0;while(1){if((d|0)>=(g|0))break b;h[j+(e+d<<3)>>3]=+h[(c[i>>2]|0)+(d<<3)>>3];d=d+1|0}}while(0);f=hC(b,f)|0}}while(0);return j|0}function Qp(b,c){b=b|0;c=c|0;do if(c){b=OA(b,c)|0;c=a[b>>0]|0;if((c+-48|0)>>>0<10){b=d6(b)|0;b=(b|0)<5?b:0;break}if(P2(c)|0)if(C3(b,91631)|0)if(C3(b,91640)|0)if(C3(b,136010)|0)if(!(C3(b,91651)|0))b=3;else{b=(C3(b,91662)|0)==0;b=b?4:0}else b=0;else b=1;else b=2;else b=0}else b=0;while(0);return b|0}function Rp(b,c){b=b|0;c=c|0;do if(c){b=OA(b,c)|0;c=a[b>>0]|0;if((c+-48|0)>>>0<10){b=d6(b)|0;b=b>>>0<3?b:1;break}if(P2(c)|0)if((C3(b,136010)|0)!=0?(C3(b,137609)|0)!=0:0)if(((C3(b,100031)|0)!=0?(C3(b,107953)|0)!=0:0)?(C3(b,107958)|0)!=0:0){b=(C3(b,91626)|0)==0;b=b?2:1}else b=1;else b=0;else b=1}else b=1;while(0);return b|0}function Sp(a){a=a|0;var b=0,c=0;b=gC(a)|0;while(1){if(!b)break;Wl(b);b=hC(a,b)|0}c=gC(a)|0;while(1){if(!c)break;b=UA(a,c)|0;while(1){if(!b)break;Tp(b);b=WA(a,b)|0}c=hC(a,c)|0}return}function Tp(a){a=a|0;RC(a,137763,176,1)|0;rP(a)|0;return}function Up(a){a=a|0;var b=0,c=0;c=gC(a)|0;while(1){if(!c)break;b=UA(a,c)|0;while(1){if(!b)break;WP(b);b=WA(a,b)|0}UP(c);c=hC(a,c)|0}return}function Vp(){var a=0,b=0;a=IK(168)|0;h[a>>3]=-1.0001234;h[a+8>>3]=1.0;c[a+16>>2]=1;h[a+24>>3]=-1.0;h[a+32>>3]=.2;c[a+40>>2]=0;c[a+44>>2]=4;c[a+48>>2]=1;c[a+52>>2]=45;c[a+56>>2]=10;h[a+64>>3]=.6;h[a+72>>3]=.001;c[a+80>>2]=500;h[a+88>>3]=.9;h[a+96>>3]=.1;c[a+104>>2]=1;c[a+108>>2]=123;b=a+112|0;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[a+128>>2]=1;c[a+132>>2]=3;c[a+136>>2]=0;h[a+144>>3]=-4.0;h[a+152>>3]=0.0;c[a+160>>2]=0;return a|0}function Wp(a){a=a|0;l6(a);return}function Xp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;b=l;l=l+176|0;d=b+160|0;f=b+152|0;g=b+128|0;k=b+112|0;j=b+88|0;m=b+64|0;n=b+56|0;o=b+40|0;q=b+24|0;p=b+16|0;r=b;e=c[15715]|0;_3(91679,27,1,e)|0;i=+h[a+8>>3];h[r>>3]=+h[a>>3];h[r+8>>3]=i;z4(e,91707,r)|0;r=c[a+108>>2]|0;c[p>>2]=c[a+16>>2];c[p+4>>2]=r;z4(e,91758,p)|0;i=+h[a+32>>3];h[q>>3]=+h[a+24>>3];h[q+8>>3]=i;z4(e,91785,q)|0;q=c[a+44>>2]|0;p=c[a+48>>2]|0;c[o>>2]=c[a+40>>2];c[o+4>>2]=q;c[o+8>>2]=p;z4(e,91808,o)|0;o=c[a+56>>2]|0;c[n>>2]=c[a+52>>2];c[n+4>>2]=o;z4(e,91859,n)|0;i=+h[a+72>>3];n=c[a+80>>2]|0;h[m>>3]=+h[a+64>>3];h[m+8>>3]=i;c[m+16>>2]=n;z4(e,91892,m)|0;i=+h[a+96>>3];m=c[a+104>>2]|0;h[j>>3]=+h[a+88>>3];h[j+8>>3]=i;c[j+16>>2]=m;z4(e,91950,j)|0;j=c[a+116>>2]|0;i=+h[a+152>>3];c[k>>2]=c[a+112>>2];c[k+4>>2]=j;h[k+8>>3]=i;z4(e,91996,k)|0;k=c[a+124>>2]|0;j=c[a+128>>2]|0;i=+h[a+144>>3];c[g>>2]=c[17844+(c[a+120>>2]<<2)>>2];c[g+4>>2]=k;c[g+8>>2]=j;h[g+16>>3]=i;z4(e,92049,g)|0;g=c[17888+(c[a+136>>2]<<2)>>2]|0;c[f>>2]=c[17872+(c[a+132>>2]<<2)>>2];c[f+4>>2]=g;z4(e,92114,f)|0;c[d>>2]=c[a+160>>2];z4(e,92144,d)|0;l=b;return}function Yp(a){a=a|0;l6(a);return}function Zp(a){a=a|0;var b=0;b=IK(184)|0;c[b>>2]=a;c[b+176>>2]=0;return b|0}function _p(a,b){a=a|0;b=+b;var d=0,e=0,f=0,g=0,i=0,j=0;e=c[a>>2]|0;h[a+8+(e<<3)>>3]=b;f=a+176|0;g=c[a>>2]|0;i=g+1|0;d=g+-1|0;j=(g|0)>19;a:do switch(c[f>>2]|0){case 0:{if((g|0)==20)c[f>>2]=-1;else{c[f>>2]=1;d=j?20:i}c[a>>2]=d;break}case 1:if((g|0)<20?+h[a+8+(e+-1<<3)>>3]>b:0){c[a>>2]=j?20:i;break a}else{c[a>>2]=d;c[f>>2]=-1;break a}default:if((g|0)>0?+h[a+8+(e+1<<3)>>3]>b:0){c[a>>2]=d;break a}else{c[a>>2]=i;c[f>>2]=1;break a}}while(0);return}function $p(a){a=a|0;return c[a>>2]|0}function aq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0;o=c[a+20>>2]|0;p=c[a+24>>2]|0;m=c[a>>2]|0;n=c[o+(m<<2)>>2]|0;if(!n)e=1.0;else{a=0;e=0.0;a:while(1){if((a|0)>=(m|0))break;j=a+1|0;k=c[o+(j<<2)>>2]|0;l=S(a,b)|0;i=c[o+(a<<2)>>2]|0;while(1){if((i|0)>=(k|0)){a=j;continue a}g=p+(i<<2)|0;a=0;f=0.0;while(1){if((a|0)>=(b|0))break;q=+h[d+(a+l<<3)>>3]-+h[d+((S(c[g>>2]|0,b)|0)<<3)>>3];a=a+1|0;f=f+q*q}i=i+1|0;e=e+ +G(+f)}}e=e/+(n|0)}return +e}function bq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=b+10|0;if((c[d>>2]|0)<=(b|0)){c[d>>2]=e;c[a>>2]=KK(c[a>>2]|0,e<<3)|0}return}function cq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=b+10|0;if((c[d>>2]|0)<=(b|0)){c[d>>2]=e;c[a>>2]=KK(c[a>>2]|0,e<<2)|0}return}function dq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0,j=0,k=0;k=l;l=l+16|0;j=k;i=S(d,b)|0;b=S(c,b)|0;d=0;while(1){if((d|0)==2)break;h[j+(d<<3)>>3]=+h[a+(d+i<<3)>>3]-+h[a+(d+b<<3)>>3];d=d+1|0}g=+h[j>>3];f=+h[j+8>>3];do if(!((g>=0.0?g:-g)<=(f>=0.0?f:-f)*1.0e-05)){e=+N(+(f/g));if(g>0.0){if(!(f<0.0))break;e=e+6.283185307179586;break}else{if(!(g<0.0))break;e=e+3.141592653589793;break}}else e=f>0.0?1.5707963267948966:4.71238898038469;while(0);l=k;return +e}function eq(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a>>3];c=+h[b>>3];return (d>c?1:(d>31)|0}function fq(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0.0,m=0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0.0,B=0.0,C=0,D=0,E=0,F=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0,R=0.0,T=0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0.0;$=l;l=l+80|0;_=$+32|0;Z=$;q=+h[e>>3];n=e+24|0;o=+h[n>>3];p=e+32|0;k=+h[p>>3];R=+h[e+72>>3];T=c[e+80>>2]|0;U=+h[e+88>>3];r=+h[e+96>>3];V=c[e+104>>2]|0;W=e+56|0;j=c[W>>2]|0;do if(!((d|0)==0|(T|0)<1)?(X=c[d+4>>2]|0,!((b|0)<1|(X|0)<1)):0){Q=c[d>>2]|0;Y=Zp(j)|0;c[i>>2]=0;if((Q|0)!=(X|0)){c[i>>2]=-100;Yp(Y);c[W>>2]=j;break}O=sw(d,1)|0;P=c[O+20>>2]|0;Q=c[O+24>>2]|0;a:do if(c[e+16>>2]|0){T4(c[e+108>>2]|0);m=S(X,b)|0;j=0;while(1){if((j|0)>=(m|0))break a;h[g+(j<<3)>>3]=+Pw();j=j+1|0}}while(0);if(o<0.0){o=+aq(O,b,g);h[n>>3]=o}if(k<0.0){h[p>>3]=.2;k=.2}if(q>=0.0){h[e>>3]=-1.0;q=-1.0}N=+H(+o,+(1.0-q));B=+H(+k,+((2.0-q)/3.0))/o;C=S(X,b<<3)|0;D=IK(C)|0;E=IK(C)|0;F=e+116|0;I=e+64|0;J=c[15715]|0;K=O+8|0;L=Z+8|0;M=Z+16|0;z=0;A=0.0;w=r;while(1){B6(D|0,g|0,C|0)|0;x=$p(Y)|0;y=ew(b,X,x,g,(c[F>>2]|0)==0?0:f)|0;$v(y,E,g,+h[I>>3],q,N,Z,i);n=0;b:while(1){if((n|0)>=(X|0)){r=0.0;m=0;break}p=S(n,b)|0;s=E+(p<<3)|0;t=n+1|0;u=P+(t<<2)|0;m=c[P+(n<<2)>>2]|0;while(1){if((m|0)>=(c[u>>2]|0)){n=t;continue b}v=Q+(m<<2)|0;j=c[v>>2]|0;c:do if((j|0)!=(n|0)){k=+Xw(g,b,n,j);j=0;while(1){if((j|0)>=(b|0))break c;r=k*(B*(+h[g+(j+p<<3)>>3]-+h[g+((S(c[v>>2]|0,b)|0)+j<<3)>>3]));aa=s+(j<<3)|0;h[aa>>3]=+h[aa>>3]-r;j=j+1|0}}while(0);m=m+1|0}}while(1){if((m|0)>=(X|0))break;n=S(m,b)|0;p=E+(n<<3)|0;k=0.0;j=0;while(1){if((j|0)>=(b|0))break;ba=+h[p+(j<<3)>>3];k=k+ba*ba;j=j+1|0}k=+G(+k);r=r+k;d:do if(k>0.0){j=0;while(1){if((j|0)>=(b|0)){j=0;break d}aa=p+(j<<3)|0;h[aa>>3]=+h[aa>>3]/k;j=j+1|0}}else j=0;while(0);while(1){if((j|0)>=(b|0))break;aa=g+(j+n<<3)|0;h[aa>>3]=+h[aa>>3]+w*+h[p+(j<<3)>>3];j=j+1|0}m=m+1|0}z=z+1|0;if(!y){if(a[195234]|0){aa=c[K>>2]|0;c[_>>2]=z;h[_+8>>3]=w;h[_+16>>3]=r;c[_+24>>2]=aa;h[_+32>>3]=o;z4(J,92400,_)|0}}else{lw(y);_p(Y,+h[Z>>3]+ +h[L>>3]*.85+ +h[M>>3]*3.3)}w=+gq(V,w,r,A,U);if(!((z|0)<(T|0)&w>R))break;else A=r}if(c[e+112>>2]|0)hq(b,O,g);Yp(Y);c[W>>2]=x;l6(D);if((O|0)!=(d|0))nw(O);l6(E)}while(0);l=$;return}function gq(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0.0;f=b*e;if((a|0)!=0&!(c>=d)){if(!(d*.95>2]|0;C=c[b+20>>2]|0;t=c[b+24>>2]|0;c[v>>2]=10;c[A>>2]=10;u=IK(B<<2)|0;f=IK(80)|0;c[y>>2]=f;e=IK(40)|0;c[z>>2]=e;b=0;while(1){if((b|0)>=(B|0)){n=0;r=f;k=e;o=e;m=f;break}c[u+(b<<2)>>2]=0;b=b+1|0}while(1){if((n|0)>=(B|0))break;b=c[C+(n<<2)>>2]|0;a:do if((((c[C+(n+1<<2)>>2]|0)-b|0)==1?(c[u+(n<<2)>>2]|0)==0:0)?(w=c[t+(b<<2)>>2]|0,x=u+(w<<2)|0,(c[x>>2]|0)==0):0){c[x>>2]=1;q=C+(w+1<<2)|0;n=0;s=0;g=0.0;p=c[C+(w<<2)>>2]|0;k=o;b=r;while(1){if((p|0)>=(c[q>>2]|0))break;e=t+(p<<2)|0;f=c[e>>2]|0;if(((c[C+(f+1<<2)>>2]|0)-(c[C+(f<<2)>>2]|0)|0)==1){c[u+(f<<2)>>2]=1;cq(z,s,v);g=g+ +Xw(d,a,w,c[e>>2]|0);k=c[z>>2]|0;c[k+(s<<2)>>2]=c[e>>2];e=n;f=s+1|0}else{bq(y,n,A);j=+dq(d,a,w,c[e>>2]|0);b=c[y>>2]|0;h[b+(n<<3)>>3]=j;e=n+1|0;f=s;m=b}n=e;s=f;p=p+1|0}j=g/+(s|0);if((n|0)>0){iq(n,m);b=m}g=(s|0)>1?6.283185307179586/+(s+-1|0):0.0;e=0;i=0.0;while(1){if((e|0)>=(s|0)){o=k;f=k;break a}jq(d,a,j,i,w,c[k+(e<<2)>>2]|0);e=e+1|0;i=g+i}}else{e=n;f=k;b=r}while(0);n=e+1|0;r=b;k=f}l6(u);l6(r);l6(k);l=D;return}function iq(a,b){a=a|0;b=b|0;k3(b,a,8,68);return}function jq(a,b,c,d,e,f){a=a|0;b=b|0;c=+c;d=+d;e=e|0;f=f|0;var g=0.0;g=+I(+d)*c;e=S(e,b)|0;f=S(f,b)|0;h[a+(f<<3)>>3]=g+ +h[a+(e<<3)>>3];d=+J(+d)*c;h[a+(f+1<<3)>>3]=d+ +h[a+(e+1<<3)>>3];return}function kq(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0.0,C=0.0,D=0,E=0,F=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0,R=0.0,T=0,U=0,V=0,W=0;n=+h[d>>3];m=d+24|0;l=+h[m>>3];o=d+32|0;k=+h[o>>3];P=+h[d+72>>3];Q=c[d+80>>2]|0;R=+h[d+88>>3];r=+h[d+96>>3];T=c[d+104>>2]|0;i=c[d+56>>2]|0;_3(92499,32,1,c[15715]|0)|0;if(!((b|0)==0|(Q|0)<1)?(U=c[b>>2]|0,j=c[b+4>>2]|0,!((a|0)<1|(j|0)<1)):0){p=a<<3;V=IK(S(p,j)|0)|0;if((j|0)<(c[d+52>>2]|0)){J=0;K=0;L=0;M=0;N=0;O=0}else{Zp(i)|0;M=IK(a*80|0)|0;N=IK(80)|0;O=IK(80)|0;J=O;K=N;L=M}c[g>>2]=0;if((U|0)==(j|0)){D=sw(b,1)|0;E=c[D+20>>2]|0;F=c[D+24>>2]|0;I=S(U,a)|0;a:do if(c[d+16>>2]|0){T4(c[d+108>>2]|0);i=0;while(1){if((i|0)>=(I|0))break a;h[f+(i<<3)>>3]=+Pw();i=i+1|0}}while(0);if(l<0.0){l=+aq(D,a,f);h[m>>3]=l}if(k<0.0){h[o>>3]=.2;k=.2}if(n>=0.0){h[d>>3]=-1.0;n=-1.0}B=1.0-n;C=+H(+l,+B);z=+H(+k,+((2.0-n)/3.0))/l;A=IK(p)|0;w=S(U,p)|0;x=IK(w)|0;y=d+116|0;u=n==-1.0;v=(e|0)!=0;s=0;t=0.0;while(1){i=0;while(1){if((i|0)>=(I|0))break;h[V+(i<<3)>>3]=0.0;i=i+1|0}B6(x|0,f|0,w|0)|0;q=0;while(1){if((q|0)<(U|0))i=0;else{o=0;break}while(1){if((i|0)>=(a|0))break;h[A+(i<<3)>>3]=0.0;i=i+1|0}p=S(q,a)|0;b:do if(v&(c[y>>2]|0)!=0){i=0;while(1){if((i|0)==(U|0)){i=0;break b}c:do if((i|0)!=(q|0)){l=+Ww(f,a,q,i);g=e+(i<<3)|0;m=S(i,a)|0;n=l*l;j=0;while(1){if((j|0)>=(a|0))break c;o=A+(j<<3)|0;if(u)k=n;else k=+H(+l,+B);h[o>>3]=+h[o>>3]+C*+h[g>>3]*(+h[f+(j+p<<3)>>3]-+h[f+(j+m<<3)>>3])/k;j=j+1|0}}while(0);i=i+1|0}}else{i=0;while(1){if((i|0)==(U|0)){i=0;break b}d:do if((i|0)!=(q|0)){l=+Ww(f,a,q,i);g=S(i,a)|0;n=l*l;j=0;while(1){if((j|0)>=(a|0))break d;m=A+(j<<3)|0;if(u)k=n;else k=+H(+l,+B);h[m>>3]=+h[m>>3]+C*(+h[f+(j+p<<3)>>3]-+h[f+(j+g<<3)>>3])/k;j=j+1|0}}while(0);i=i+1|0}}while(0);while(1){if((i|0)>=(a|0))break;o=V+(i+p<<3)|0;h[o>>3]=+h[A+(i<<3)>>3]+ +h[o>>3];i=i+1|0}q=q+1|0}e:while(1){if((o|0)<(U|0))i=0;else{l=0.0;j=0;break}while(1){if((i|0)>=(a|0))break;h[A+(i<<3)>>3]=0.0;i=i+1|0}p=o+1|0;g=E+(p<<2)|0;q=S(o,a)|0;j=c[E+(o<<2)>>2]|0;while(1){if((j|0)>=(c[g>>2]|0)){i=0;break}m=F+(j<<2)|0;i=c[m>>2]|0;f:do if((i|0)!=(o|0)){k=+Xw(f,a,o,i);i=0;while(1){if((i|0)>=(a|0))break f;n=k*(z*(+h[f+(i+q<<3)>>3]-+h[f+((S(c[m>>2]|0,a)|0)+i<<3)>>3]));W=A+(i<<3)|0;h[W>>3]=+h[W>>3]-n;i=i+1|0}}while(0);j=j+1|0}while(1){if((i|0)>=(a|0)){o=p;continue e}W=V+(i+q<<3)|0;h[W>>3]=+h[A+(i<<3)>>3]+ +h[W>>3];i=i+1|0}}while(1){if((j|0)>=(U|0))break;g=S(j,a)|0;i=0;while(1){if((i|0)>=(a|0)){k=0.0;i=0;break}h[A+(i<<3)>>3]=+h[V+(i+g<<3)>>3];i=i+1|0}while(1){if((i|0)>=(a|0))break;n=+h[A+(i<<3)>>3];k=k+n*n;i=i+1|0}k=+G(+k);l=l+k;g:do if(k>0.0){i=0;while(1){if((i|0)>=(a|0)){i=0;break g}W=A+(i<<3)|0;h[W>>3]=+h[W>>3]/k;i=i+1|0}}else i=0;while(0);while(1){if((i|0)>=(a|0))break;W=f+(i+g<<3)|0;h[W>>3]=+h[W>>3]+r*+h[A+(i<<3)>>3];i=i+1|0}j=j+1|0}s=s+1|0;r=+gq(T,r,l,t,R);if(!((s|0)<(Q|0)&r>P))break;else t=l}if(c[d+112>>2]|0)hq(a,D,f);l6(x);if((D|0)!=(b|0))nw(D);l6(A)}else c[g>>2]=-100;if(L|0)l6(M);if(K|0)l6(N);if(J|0)l6(O);l6(V)}return}function lq(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,I=0,J=0,K=0,L=0.0,M=0.0,N=0,O=0,P=0.0,Q=0.0,R=0,T=0,U=0,V=0,W=0,X=0.0,Y=0,Z=0.0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;ia=l;l=l+32|0;aa=ia+24|0;ba=ia+20|0;fa=ia+16|0;ga=ia+12|0;ha=ia+8|0;W=ia;s=+h[d>>3];k=d+24|0;r=+h[k>>3];m=d+32|0;q=+h[m>>3];X=+h[d+72>>3];Y=c[d+80>>2]|0;Z=+h[d+88>>3];t=+h[d+96>>3];_=c[d+104>>2]|0;c[aa>>2]=0;c[ba>>2]=10;c[fa>>2]=0;c[ga>>2]=0;c[ha>>2]=0;h[W>>3]=0.0;ea=d+56|0;n=c[ea>>2]|0;if(!((b|0)==0|(Y|0)<1)?($=c[b>>2]|0,i=c[b+4>>2]|0,!((a|0)<1|(i|0)<1)):0){if((i|0)<(c[d+52>>2]|0)){da=0;ca=0}else{da=Zp(n)|0;c[fa>>2]=IK(a*80|0)|0;c[ga>>2]=IK(80)|0;c[ha>>2]=IK(80)|0;ca=1}c[g>>2]=0;a:do if(($|0)==(i|0)){o=sw(b,1)|0;R=c[o+20>>2]|0;T=c[o+24>>2]|0;b:do if(c[d+16>>2]|0){T4(c[d+108>>2]|0);j=S($,a)|0;i=0;while(1){if((i|0)>=(j|0))break b;h[f+(i<<3)>>3]=+Pw();i=i+1|0}}while(0);if(r<0.0){r=+aq(o,a,f);h[k>>3]=r}if(q<0.0){h[m>>3]=.2;q=.2}if(s>=0.0){h[d>>3]=-1.0;s=-1.0}P=1.0-s;Q=+H(+r,+P);M=+H(+q,+((2.0-s)/3.0))/r;N=a<<3;U=IK(N)|0;N=S($,N)|0;V=IK(N)|0;O=d+116|0;I=s==-1.0;J=d+64|0;K=(e|0)!=0;L=+($|0);i=0;E=0;F=0.0;while(1){E=E+1|0;B6(V|0,f|0,N|0)|0;if(ca){i=$p(da)|0;n=i;i=ew(a,$,i,f,(c[O>>2]|0)==0?0:e)|0}u=0.0;s=0.0;y=0;r=0.0;c:while(1){if((y|0)<($|0))j=0;else break;while(1){if((j|0)>=(a|0))break;h[U+(j<<3)>>3]=0.0;j=j+1|0}C=y+1|0;m=R+(C<<2)|0;D=S(y,a)|0;k=c[R+(y<<2)>>2]|0;while(1){if((k|0)>=(c[m>>2]|0))break;p=T+(k<<2)|0;j=c[p>>2]|0;d:do if((j|0)!=(y|0)){q=+Xw(f,a,y,j);j=0;while(1){if((j|0)>=(a|0))break d;w=q*(M*(+h[f+(j+D<<3)>>3]-+h[f+((S(c[p>>2]|0,a)|0)+j<<3)>>3]));B=U+(j<<3)|0;h[B>>3]=+h[B>>3]-w;j=j+1|0}}while(0);k=k+1|0}e:do if(!ca)if(K&(c[O>>2]|0)!=0){j=0;while(1){if((j|0)==($|0))break e;f:do if((j|0)!=(y|0)){v=+Ww(f,a,y,j);m=e+(j<<3)|0;p=S(j,a)|0;w=v*v;k=0;while(1){if((k|0)>=(a|0))break f;x=U+(k<<3)|0;if(I)q=w;else q=+H(+v,+P);h[x>>3]=+h[x>>3]+Q*+h[m>>3]*(+h[f+(k+D<<3)>>3]-+h[f+(k+p<<3)>>3])/q;k=k+1|0}}while(0);j=j+1|0}}else{j=0;while(1){if((j|0)==($|0))break e;g:do if((j|0)!=(y|0)){v=+Ww(f,a,y,j);m=S(j,a)|0;w=v*v;k=0;while(1){if((k|0)>=(a|0))break g;p=U+(k<<3)|0;if(I)q=w;else q=+H(+v,+P);h[p>>3]=+h[p>>3]+Q*(+h[f+(k+D<<3)>>3]-+h[f+(k+m<<3)>>3])/q;k=k+1|0}}while(0);j=j+1|0}}else{_v(i,+h[J>>3],f+(D<<3)|0,y,aa,ba,fa,ga,ha,W,g);u=u+ +h[W>>3];B=c[aa>>2]|0;s=s+ +(B|0);if(c[g>>2]|0){m=U;k=V;i=U;j=V;p=72;break a}m=c[ha>>2]|0;p=c[ga>>2]|0;x=c[fa>>2]|0;j=0;while(1){if((j|0)>=(B|0))break e;v=+h[m+(j<<3)>>3];v=v>1.0e-15?v:1.0e-15;y=p+(j<<3)|0;z=S(j,a)|0;w=v*v;k=0;while(1){if((k|0)>=(a|0))break;A=U+(k<<3)|0;if(I)q=w;else q=+H(+v,+P);h[A>>3]=+h[A>>3]+Q*+h[y>>3]*(+h[f+(k+D<<3)>>3]-+h[x+(k+z<<3)>>3])/q;k=k+1|0}j=j+1|0}}while(0);q=0.0;j=0;while(1){if((j|0)>=(a|0))break;w=+h[U+(j<<3)>>3];q=q+w*w;j=j+1|0}q=+G(+q);r=r+q;h:do if(q>0.0){j=0;while(1){if((j|0)>=(a|0)){j=0;break h}B=U+(j<<3)|0;h[B>>3]=+h[B>>3]/q;j=j+1|0}}else j=0;while(0);while(1){if((j|0)>=(a|0)){y=C;continue c}B=f+(j+D<<3)|0;h[B>>3]=+h[B>>3]+t*+h[U+(j<<3)>>3];j=j+1|0}}if(i|0){lw(i);_p(da,s/L*5.0+u/L)}t=+gq(_,t,r,F,Z);if(!((E|0)<(Y|0)&t>X))break;else F=r}if(!(c[d+112>>2]|0)){m=U;k=V;j=V;i=U;p=71}else{hq(a,o,f);m=U;k=V;j=V;i=U;p=71}}else{c[g>>2]=-100;o=b;m=0;k=0;j=0;i=0;p=71}while(0);if((p|0)==71)if(ca)p=72;if((p|0)==72){Yp(da);c[ea>>2]=n}if(k|0)l6(j);if((o|0)!=(b|0))nw(o);if(m|0)l6(i);i=c[fa>>2]|0;if(i|0)l6(i);i=c[ga>>2]|0;if(i|0)l6(i);i=c[ha>>2]|0;if(i|0)l6(i)}l=ia;return}function mq(a,b,d,e,f,g,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=+i;j=j|0;var k=0,m=0,n=0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0,u=0.0,v=0.0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0.0,D=0,E=0.0,F=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0,$=0.0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;ha=l;l=l+48|0;p=ha+8|0;ca=ha+40|0;da=ha+36|0;X=ha+32|0;fa=ha+28|0;ga=ha+24|0;Y=ha;q=+h[e>>3];r=e+32|0;s=+h[r>>3];Z=+h[e+72>>3];_=c[e+80>>2]|0;$=+h[e+88>>3];u=+h[e+96>>3];aa=c[e+104>>2]|0;c[ca>>2]=0;c[da>>2]=10;c[X>>2]=0;c[fa>>2]=0;c[ga>>2]=0;h[Y>>3]=0.0;if(!((b|0)==0|(_|0)<1)?(ba=c[b>>2]|0,n=c[b+4>>2]|0,!((a|0)<1|(n|0)<1)):0){if((c[e+132>>2]|0)!=0?(n|0)>=(c[e+52>>2]|0):0){m=IK(a*80|0)|0;c[X>>2]=m;c[fa>>2]=IK(80)|0;c[ga>>2]=IK(80)|0;t=1;k=m}else{t=0;k=0;m=0}c[j>>2]=0;if((ba|0)==(n|0)){W=sw(b,1)|0;if(!d){V=0;k=W}else{V=c[d+28>>2]|0;k=d}U=c[k+24>>2]|0;T=c[k+20>>2]|0;o=+(ba|0);if(i<0.0){F=+nq(ba,T,V);E=+(c[T+(ba<<2)>>2]|0);i=E/(o*o-E)*i/+H(+F,+(q+1.0));R=c[15715]|0;h[p>>3]=F;h[p+8>>3]=i;z4(R,92532,p)|0}a:do if(c[e+16>>2]|0){_3(92554,24,1,c[15715]|0)|0;T4(c[e+108>>2]|0);m=S(ba,a)|0;k=0;while(1){if((k|0)>=(m|0))break a;h[g+(k<<3)>>3]=+Pw();k=k+1|0}}while(0);oq(ba,a,g,T,U,V);if(s<0.0)h[r>>3]=.2;if(!(q>=0.0))o=q;else{h[e>>3]=-1.0;o=-1.0}Q=a<<3;P=IK(Q)|0;Q=S(ba,Q)|0;R=IK(Q)|0;M=(t|0)!=0;N=e+116|0;O=o==-1.0;F=1.0-o;I=(f|0)!=0;J=(V|0)==0;K=e+8|0;L=e+64|0;k=0;D=0;E=0.0;o=1.0;C=u;b:while(1){D=D+1|0;B6(R|0,g|0,Q|0)|0;if(M)k=ew(a,ba,10,g,(c[N>>2]|0)==0?0:f)|0;t=0;s=0.0;c:while(1){if((t|0)<(ba|0))m=0;else break;while(1){if((m|0)>=(a|0))break;h[P+(m<<3)>>3]=0.0;m=m+1|0}B=t+1|0;r=T+(B<<2)|0;A=S(t,a)|0;p=c[T+(t<<2)>>2]|0;while(1){if((p|0)>=(c[r>>2]|0))break;d=U+(p<<2)|0;m=c[d>>2]|0;d:do if((m|0)!=(t|0)){z=+Ww(g,a,t,m);if(!J)o=+h[V+(p<<3)>>3];q=+h[K>>3];v=z-o;u=o*o;e:do if(!(q==2.0))if(q==1.0){q=1.0/u;m=0;while(1){if((m|0)>=(a|0))break e;u=-(v*(q*(+h[g+(m+A<<3)>>3]-+h[g+((S(c[d>>2]|0,a)|0)+m<<3)>>3])))/z;y=P+(m<<3)|0;h[y>>3]=+h[y>>3]+u;m=m+1|0}}else{q=1.0/+H(+o,+(q+1.0));m=0;while(1){if((m|0)>=(a|0))break e;u=q*(+h[g+(m+A<<3)>>3]-+h[g+((S(c[d>>2]|0,a)|0)+m<<3)>>3]);u=-(u*+H(+v,+(+h[K>>3])))/z;y=P+(m<<3)|0;h[y>>3]=+h[y>>3]+u;m=m+1|0}}else{q=1.0/(o*u);m=0;while(1){if((m|0)>=(a|0))break e;u=-(v*(v*(q*(+h[g+(m+A<<3)>>3]-+h[g+((S(c[d>>2]|0,a)|0)+m<<3)>>3]))))/z;y=P+(m<<3)|0;h[y>>3]=+h[y>>3]+u;m=m+1|0}}while(0);u=z*z;q=+H(+z,+F);if(I&(c[N>>2]|0)!=0){n=f+(p<<3)|0;q=O?u:q;m=0;while(1){if((m|0)>=(a|0))break d;y=P+(m<<3)|0;z=i*+h[n>>3]*(+h[g+(m+A<<3)>>3]-+h[g+((S(c[d>>2]|0,a)|0)+m<<3)>>3])/q;h[y>>3]=+h[y>>3]-z;m=m+1|0}}else{q=O?u:q;m=0;while(1){if((m|0)>=(a|0))break d;y=P+(m<<3)|0;z=i*(+h[g+(m+A<<3)>>3]-+h[g+((S(c[d>>2]|0,a)|0)+m<<3)>>3])/q;h[y>>3]=+h[y>>3]-z;m=m+1|0}}}while(0);p=p+1|0}f:do if(!M)if(I&(c[N>>2]|0)!=0){m=0;while(1){if((m|0)==(ba|0)){q=0.0;m=0;break f}g:do if((m|0)!=(t|0)){u=+Ww(g,a,t,m);d=f+(m<<3)|0;p=S(m,a)|0;v=u*u;n=0;while(1){if((n|0)>=(a|0))break g;r=P+(n<<3)|0;if(O)q=v;else q=+H(+u,+F);h[r>>3]=+h[r>>3]+i*+h[d>>3]*(+h[g+(n+A<<3)>>3]-+h[g+(n+p<<3)>>3])/q;n=n+1|0}}while(0);m=m+1|0}}else{m=0;while(1){if((m|0)==(ba|0)){q=0.0;m=0;break f}h:do if((m|0)!=(t|0)){u=+Ww(g,a,t,m);d=S(m,a)|0;v=u*u;n=0;while(1){if((n|0)>=(a|0))break h;p=P+(n<<3)|0;if(O)q=v;else q=+H(+u,+F);h[p>>3]=+h[p>>3]+i*(+h[g+(n+A<<3)>>3]-+h[g+(n+d<<3)>>3])/q;n=n+1|0}}while(0);m=m+1|0}}else{_v(k,+h[L>>3],g+(A<<3)|0,t,ca,da,X,fa,ga,Y,j);d=c[ca>>2]|0;if(c[j>>2]|0)break b;p=c[ga>>2]|0;r=c[fa>>2]|0;t=c[X>>2]|0;m=0;while(1){if((m|0)>=(d|0)){q=0.0;m=0;break f}u=+h[p+(m<<3)>>3];u=u>1.0e-15?u:1.0e-15;w=r+(m<<3)|0;x=S(m,a)|0;v=u*u;n=0;while(1){if((n|0)>=(a|0))break;y=P+(n<<3)|0;if(O)q=v;else q=+H(+u,+F);h[y>>3]=+h[y>>3]+i*+h[w>>3]*(+h[g+(n+A<<3)>>3]-+h[t+(n+x<<3)>>3])/q;n=n+1|0}m=m+1|0}}while(0);while(1){if((m|0)>=(a|0))break;z=+h[P+(m<<3)>>3];q=q+z*z;m=m+1|0}q=+G(+q);s=s+q;i:do if(q>0.0){m=0;while(1){if((m|0)>=(a|0)){m=0;break i}y=P+(m<<3)|0;h[y>>3]=+h[y>>3]/q;m=m+1|0}}else m=0;while(0);while(1){if((m|0)>=(a|0)){t=B;continue c}y=g+(m+A<<3)|0;h[y>>3]=+h[y>>3]+C*+h[P+(m<<3)>>3];m=m+1|0}}if(k|0)lw(k);C=+gq(aa,C,s,E,$);if(!((D|0)<(_|0)&C>Z)){ea=88;break}else E=s}if((ea|0)==88?c[e+112>>2]|0:0)hq(a,W,g);l6(R);if((W|0)!=(b|0))nw(W);l6(P);k=c[X>>2]|0;m=k}else c[j>>2]=-100;if(m|0)l6(k);k=c[fa>>2]|0;if(k|0)l6(k);k=c[ga>>2]|0;if(k|0)l6(k)}l=ha;return}function nq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0,j=0.0;if(!d)e=1.0;else{f=0;e=0.0;a:while(1){if((f|0)>=(a|0))break;g=f+1|0;i=c[b+(g<<2)>>2]|0;f=c[b+(f<<2)>>2]|0;while(1){if((f|0)>=(i|0)){f=g;continue a}j=e+ +h[d+(f<<3)>>3];f=f+1|0;e=j}}e=e/+(c[b+(a<<2)>>2]|0)}return +e}function oq(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0;v=l;l=l+16|0;u=v;t=(g|0)==0;k=0.0;m=0.0;n=1.0;j=0;a:while(1){if((j|0)>=(a|0))break;r=j+1|0;s=e+(r<<2)|0;q=c[e+(j<<2)>>2]|0;while(1){if((q|0)>=(c[s>>2]|0)){j=r;continue a}i=c[f+(q<<2)>>2]|0;b:do if((i|0)!=(j|0)){o=+Ww(d,b,j,i);if(!t)n=+h[g+(q<<3)>>3];w=1.0/(n*n);p=o*(n*w);o=o*(o*w);i=0;while(1){if((i|0)>=(b|0))break b;i=i+1|0;k=o+k;m=p+m}}while(0);q=q+1|0}}k=m/k;j=S(b,a)|0;i=0;while(1){if((i|0)>=(j|0))break;b=d+(i<<3)|0;h[b>>3]=k*+h[b>>3];i=i+1|0}d=c[15715]|0;h[u>>3]=k;z4(d,92579,u)|0;l=v;return} -function $g(a){a=a|0;var b=0,d=0,e=0;while(1){b=c[(c[a+16>>2]|0)+116>>2]|0;if(!b)break;else a=b}b=c[a>>2]&3;d=c[(c[((b|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0;e=c[d+232>>2]|0;a=c[(c[((b|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0;b=c[a+232>>2]|0;if((e|0)<=(b|0))if((e|0)<(b|0))a=1;else a=(c[d+236>>2]|0)<(c[a+236>>2]|0)&1;else a=0;return a|0}function ah(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+16|0;e=d+8|0;f=d;h=(c[a+16>>2]|0)+180|0;g=(c[b+16>>2]|0)+172|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];b=bh(a,f,b,e)|0;l=d;return b|0}function bh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=c[b+4>>2]|0;a:do if((f|0)>0?(g=c[e+4>>2]|0,(g|0)>0):0)if((f|0)<(g|0)){f=c[b>>2]|0;e=0;while(1){b=c[f+(e<<2)>>2]|0;if(!b){b=0;break a}if((c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)==(d|0))break;else e=e+1|0}}else{f=c[e>>2]|0;e=0;while(1){b=c[f+(e<<2)>>2]|0;if(!b){b=0;break a}if((c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)==(a|0))break;else e=e+1|0}}else b=0;while(0);return b|0}function ch(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+16|0;e=d+8|0;f=d;h=(c[a+16>>2]|0)+188|0;g=(c[b+16>>2]|0)+196|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];b=bh(a,f,b,e)|0;l=d;return b|0}function dh(a){a=a|0;var b=0,d=0,e=0,f=0;e=a+48|0;d=c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0;b=c[d+180>>2]|0;d=(c[d+184>>2]<<2)+8|0;if(!b)b=IK(d)|0;else b=KK(b,d)|0;c[(c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0)+180>>2]=b;f=c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0;b=c[f+180>>2]|0;f=f+184|0;d=c[f>>2]|0;c[f>>2]=d+1;c[b+(d<<2)>>2]=a;e=c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0;c[(c[e+180>>2]|0)+(c[e+184>>2]<<2)>>2]=0;e=a+-48|0;d=c[(c[((c[a>>2]&3|0)==2?a:e)+40>>2]|0)+16>>2]|0;b=c[d+172>>2]|0;d=(c[d+176>>2]<<2)+8|0;if(!b)b=IK(d)|0;else b=KK(b,d)|0;c[(c[(c[((c[a>>2]&3|0)==2?a:e)+40>>2]|0)+16>>2]|0)+172>>2]=b;b=c[(c[((c[a>>2]&3|0)==2?a:e)+40>>2]|0)+16>>2]|0;d=c[b+172>>2]|0;b=b+176|0;f=c[b>>2]|0;c[b>>2]=f+1;c[d+(f<<2)>>2]=a;f=c[(c[((c[a>>2]&3|0)==2?a:e)+40>>2]|0)+16>>2]|0;c[(c[f+172>>2]|0)+(c[f+176>>2]<<2)>>2]=0;return a|0}function eh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=a+4|0;f=c[e>>2]|0;d=0;while(1){if((d|0)>=(f|0))break;g=c[a>>2]|0;h=g+(d<<2)|0;if((c[h>>2]|0)==(b|0)){i=4;break}else d=d+1|0}if((i|0)==4){i=f+-1|0;c[e>>2]=i;c[h>>2]=c[g+(i<<2)>>2];c[(c[a>>2]|0)+(i<<2)>>2]=0}return}function fh(a){a=a|0;if(!a)Aa(85823,85833,117,85842);else{eh((c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+180|0,a);eh((c[(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+172|0,a);return}}function gh(a){a=a|0;var b=0,d=0,e=0,f=0;e=a+48|0;d=c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0;b=c[d+204>>2]|0;d=(c[d+208>>2]<<2)+8|0;if(!b)b=IK(d)|0;else b=KK(b,d)|0;c[(c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0)+204>>2]=b;f=c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0;b=c[f+204>>2]|0;f=f+208|0;d=c[f>>2]|0;c[f>>2]=d+1;c[b+(d<<2)>>2]=a;e=c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0;c[(c[e+204>>2]|0)+(c[e+208>>2]<<2)>>2]=0;return}function hh(a){a=a|0;ih(a,(c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+204|0);return}function ih(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=b+4|0;e=c[h>>2]|0;g=c[b>>2]|0;d=0;while(1){if((d|0)>=(e|0)){f=4;break}if((c[g+(d<<2)>>2]|0)==(a|0))break;else d=d+1|0}if((f|0)==4){d=(e<<2)+8|0;if(!g)d=IK(d)|0;else d=KK(g,d)|0;c[b>>2]=d;f=c[h>>2]|0;g=f+1|0;c[h>>2]=g;c[d+(f<<2)>>2]=a;c[(c[b>>2]|0)+(g<<2)>>2]=0}return}function jh(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=HK(96)|0;g=o+48|0;c[g>>2]=c[g>>2]|3;c[o>>2]=c[o>>2]&-4|2;i=HK(176)|0;n=o+16|0;c[n>>2]=i;c[((c[o>>2]&3|0)==3?o:g)+40>>2]=d;j=o+-48|0;c[((c[o>>2]&3|0)==2?o:j)+40>>2]=e;a[i+112>>0]=1;if(!f){c[i+156>>2]=1;b[i+154>>1]=1;b[i+168>>1]=1;b[i+170>>1]=1}else{c[o>>2]=c[o>>2]&15|c[f>>2]&-16;c[g>>2]=c[g>>2]&15|c[f>>2]&-16;m=f+16|0;h=c[m>>2]|0;b[i+168>>1]=b[h+168>>1]|0;b[i+154>>1]=b[h+154>>1]|0;c[i+156>>2]=c[h+156>>2];b[i+170>>1]=b[h+170>>1]|0;d=c[((c[o>>2]&3|0)==3?o:g)+40>>2]|0;e=c[f>>2]&3;k=f+48|0;l=f+-48|0;if((d|0)!=(c[((e|0)==3?f:k)+40>>2]|0)){if((d|0)==(c[((e|0)==2?f:l)+40>>2]|0)){g=i+16|0;d=h+56|0;e=g+40|0;do{c[g>>2]=c[d>>2];g=g+4|0;d=d+4|0}while((g|0)<(e|0))}}else{g=i+16|0;d=h+16|0;e=g+40|0;do{c[g>>2]=c[d>>2];g=g+4|0;d=d+4|0}while((g|0)<(e|0))}d=c[((c[o>>2]&3|0)==2?o:j)+40>>2]|0;e=c[f>>2]&3;if((d|0)!=(c[((e|0)==2?f:l)+40>>2]|0)){if((d|0)==(c[((e|0)==3?f:k)+40>>2]|0)){g=(c[n>>2]|0)+56|0;d=(c[m>>2]|0)+16|0;e=g+40|0;do{c[g>>2]=c[d>>2];g=g+4|0;d=d+4|0}while((g|0)<(e|0))}}else{g=(c[n>>2]|0)+56|0;d=(c[m>>2]|0)+56|0;e=g+40|0;do{c[g>>2]=c[d>>2];g=g+4|0;d=d+4|0}while((g|0)<(e|0))}d=(c[m>>2]|0)+172|0;if(!(c[d>>2]|0))c[d>>2]=o;c[(c[n>>2]|0)+116>>2]=f}return o|0}function kh(a,b,c){a=a|0;b=b|0;c=c|0;return dh(jh(a,b,c)|0)|0}function lh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[a+16>>2]|0)+192|0;f=c[d>>2]|0;e=c[b+16>>2]|0;c[e+164>>2]=f;a=f;if(f|0)c[(c[a+16>>2]|0)+168>>2]=b;c[d>>2]=b;c[e+168>>2]=0;if((a|0)==(b|0))Aa(85859,85833,215,85875);else return}function mh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if((a|0)==(b|0))Aa(85885,85833,220,85892);f=c[b+16>>2]|0;d=f+164|0;if(c[d>>2]|0)Aa(85905,85833,221,85892);e=(c[a+16>>2]|0)+164|0;c[d>>2]=c[e>>2];d=c[e>>2]|0;if(d|0)c[(c[d+16>>2]|0)+168>>2]=b;c[f+168>>2]=a;c[e>>2]=b;return}function nh(a,b){a=a|0;b=b|0;var d=0;if(!(oh(a,b)|0))Aa(85924,85833,231,85945);b=c[b+16>>2]|0;d=c[b+164>>2]|0;b=b+168|0;if(d|0)c[(c[d+16>>2]|0)+168>>2]=c[b>>2];b=c[b>>2]|0;if(!b)c[(c[a+16>>2]|0)+192>>2]=d;else c[(c[b+16>>2]|0)+164>>2]=d;return}function oh(a,b){a=a|0;b=b|0;a=(c[a+16>>2]|0)+192|0;while(1){a=c[a>>2]|0;if((a|0)==0|(a|0)==(b|0))break;a=(c[a+16>>2]|0)+164|0}return a|0}function ph(b){b=b|0;var d=0,e=0,f=0,g=0;d=HK(64)|0;c[d>>2]=c[d>>2]&-4|1;e=d+16|0;c[e>>2]=HK(304)|0;c[d+24>>2]=vC(b)|0;g=c[e>>2]|0;a[g+156>>0]=1;h[g+96>>3]=1.0;h[g+88>>3]=1.0;h[g+80>>3]=1.0;c[g+216>>2]=1;c[g+176>>2]=0;g=HK(20)|0;f=c[e>>2]|0;c[f+172>>2]=g;c[f+184>>2]=0;f=HK(20)|0;c[(c[e>>2]|0)+180>>2]=f;lh(b,d);b=(c[b+16>>2]|0)+232|0;c[b>>2]=(c[b>>2]|0)+1;return d|0}function qh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=d+48|0;f=c[(c[((c[d>>2]&3|0)==3?d:g)+40>>2]|0)+16>>2]|0;e=c[f+188>>2]|0;f=(c[f+192>>2]<<2)+8|0;if(!e)e=IK(f)|0;else e=KK(e,f)|0;c[(c[(c[((c[d>>2]&3|0)==3?d:g)+40>>2]|0)+16>>2]|0)+188>>2]=e;h=c[(c[((c[d>>2]&3|0)==3?d:g)+40>>2]|0)+16>>2]|0;e=c[h+188>>2]|0;h=h+192|0;f=c[h>>2]|0;c[h>>2]=f+1;c[e+(f<<2)>>2]=d;g=c[(c[((c[d>>2]&3|0)==3?d:g)+40>>2]|0)+16>>2]|0;c[(c[g+188>>2]|0)+(c[g+192>>2]<<2)>>2]=0;g=d+-48|0;f=c[(c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0)+16>>2]|0;e=c[f+196>>2]|0;f=(c[f+200>>2]<<2)+8|0;if(!e)e=IK(f)|0;else e=KK(e,f)|0;c[(c[(c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0)+16>>2]|0)+196>>2]=e;e=c[(c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0)+16>>2]|0;f=c[e+196>>2]|0;e=e+200|0;h=c[e>>2]|0;c[e>>2]=h+1;c[f+(h<<2)>>2]=d;h=c[(c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0)+16>>2]|0;c[(c[h+196>>2]|0)+(c[h+200>>2]<<2)>>2]=0;a[(c[b+16>>2]|0)+240>>0]=1;a[(c[(dg(b)|0)+16>>2]|0)+240>>0]=1;return}function rh(a){a=a|0;var b=0,d=0;if(!a)Aa(85823,85833,269,85962);b=c[(c[a+16>>2]|0)+116>>2]|0;if(b|0?(d=(c[b+16>>2]|0)+172|0,(c[d>>2]|0)==(a|0)):0)c[d>>2]=0;eh((c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+188|0,a);eh((c[(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+196|0,a);return}function sh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;d=(c[a+16>>2]|0)+172|0;e=c[d>>2]|0;do if((e|0)!=(b|0))if(!e){c[d>>2]=b;th(a,b);break}else Aa(87865,85833,340,86e3);else dA(0,85979,f)|0;while(0);l=f;return}function th(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,i=0;f=(c[d+16>>2]|0)+170|0;i=c[a+16>>2]|0;a=b[i+170>>1]|0;if((e[f>>1]|0)<(a&65535))b[f>>1]=a;g=i+168|0;h=i+154|0;f=i+156|0;a=d;while(1){if(!a)break;d=c[a+16>>2]|0;i=d+168|0;b[i>>1]=(e[i>>1]|0)+(e[g>>1]|0);i=d+154|0;b[i>>1]=(e[i>>1]|0)+(e[h>>1]|0);i=d+156|0;c[i>>2]=(c[i>>2]|0)+(c[f>>2]|0);a=c[d+172>>2]|0}return}function uh(d){d=d|0;var e=0,f=0,g=0,h=0;f=d+16|0;e=c[(c[f>>2]|0)+172>>2]|0;a:while(1){if(!e)break;vh(e,d);h=c[e+16>>2]|0;g=c[h+172>>2]|0;if(!(b[h+168>>1]|0))wh(e);while(1){if((a[(c[e+16>>2]|0)+112>>0]|0)!=1){e=g;continue a}e=c[(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0;if((a[e+156>>0]|0)!=1){e=g;continue a}if((c[e+184>>2]|0)!=1){e=g;continue a}e=c[c[e+180>>2]>>2]|0;vh(e,d)}}c[(c[f>>2]|0)+172>>2]=0;return}function vh(a,d){a=a|0;d=d|0;var f=0;f=c[d+16>>2]|0;d=c[a+16>>2]|0;a=d+168|0;b[a>>1]=(e[a>>1]|0)-(e[f+168>>1]|0);a=d+154|0;b[a>>1]=(e[a>>1]|0)-(e[f+154>>1]|0);d=d+156|0;c[d>>2]=(c[d>>2]|0)-(c[f+156>>2]|0);return}function wh(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if(!a)Aa(85823,85833,128,86013);g=a+48|0;d=0;while(1){b=c[a>>2]|0;e=(c[(c[((b&3|0)==3?a:g)+40>>2]|0)+16>>2]|0)+180|0;f=c[(c[e>>2]|0)+(d<<2)>>2]|0;if(!f)break;if((f|0)==(a|0))eh(e,a);d=d+1|0}g=a+-48|0;f=0;while(1){d=(c[(c[((b&3|0)==2?a:g)+40>>2]|0)+16>>2]|0)+172|0;e=c[(c[d>>2]|0)+(f<<2)>>2]|0;if(!e)break;if((e|0)==(a|0)){eh(d,a);b=c[a>>2]|0}f=f+1|0}return}function xh(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;p=l;l=l+1040|0;n=p+4|0;o=p;m=p+8|0;k=a+16|0;a=c[k>>2]|0;j=b[a+236>>1]|0;while(1){if((j|0)>(b[a+238>>1]|0))break;i=c[a+196>>2]|0;h=i+(j<<6)|0;i=i+(j<<6)+4|0;g=0;a=0;while(1){d=(a|0)!=0;if((g|0)>=(c[h>>2]|0))break;e=c[(c[i>>2]|0)+(g<<2)>>2]|0;f=e+16|0;if(c[(c[f>>2]|0)+112>>2]|0){if(!d){c[n>>2]=c[4658];a=lB(86035,n,0)|0}c[o>>2]=g;i2(m,137696,o)|0;s=qC(a,m,1)|0;RC(s,91465,24,1)|0;d=c[(c[f>>2]|0)+180>>2]|0;q=c[d>>2]|0;q=c[(c[(c[((c[q>>2]&3|0)==2?q:q+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;d=c[d+4>>2]|0;d=c[(c[(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;r=(q|0)>(d|0);f=c[s+16>>2]|0;c[f+12>>2]=r?d:q;c[f+16>>2]=r?q:d;c[f+20>>2]=e}g=g+1|0}if(d){if((qB(a)|0)>1)yh(a,h);pB(a)|0}j=j+1|0;a=c[k>>2]|0}l=p;return}function yh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=0;h=gC(a)|0;a:while(1){if(!h)break;i=hC(a,h)|0;j=h+16|0;g=i;while(1){if(!g){h=i;continue a}f=c[g+16>>2]|0;e=c[j>>2]|0;if((c[f+16>>2]|0)>(c[e+12>>2]|0)){if((c[e+16>>2]|0)<=(c[f+12>>2]|0))fB(a,h,g,0,1)|0}else{fB(a,g,h,0,1)|0;d=1}g=hC(a,g)|0}}do if(d|0){h=LD(a,86038,1)|0;j=HK((qB(a)|0)<<2)|0;i=HK((qB(a)|0)<<2)|0;f=b+4|0;e=gC(a)|0;b:while(1){if(!e){d=23;break}if((c[(c[e+16>>2]|0)+8>>2]|0)==0?sB(a,e,1,1)|0:0){c:do if(zh(a,e,h,i)|0){g=qB(h)|0;if((Ah(a,h,j)|0)!=(g|0)){d=17;break b}k3(i,g,4,60);d=0;while(1){if((d|0)>=(g|0))break c;b=i+(d<<2)|0;k=c[j+(d<<2)>>2]|0;c[(c[k+16>>2]|0)+236>>2]=c[b>>2];c[(c[f>>2]|0)+(c[b>>2]<<2)>>2]=k;d=d+1|0}}while(0);Ch(h)}e=hC(a,e)|0}if((d|0)==17)Aa(86043,86053,265,86064);else if((d|0)==23){l6(j);break}}while(0);return}function zh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;h=c[b+16>>2]|0;c[h+8>>2]=1;h=c[(c[(c[h+20>>2]|0)+16>>2]|0)+236>>2]|0;c[e+((qB(d)|0)<<2)>>2]=h;lC(d,b,1)|0;h=UA(a,b)|0;f=0;while(1){if(!h)break;j=c[h>>2]&3;g=c[((j|0)==2?h:h+-48|0)+40>>2]|0;i=c[g+16>>2]|0;f=((c[(c[(c[i+20>>2]|0)+16>>2]|0)+236>>2]|0)>(c[(c[(c[(c[(c[((j|0)==3?h:h+48|0)+40>>2]|0)+16>>2]|0)+20>>2]|0)+16>>2]|0)+236>>2]|0)&1)+f|0;if(!(c[i+8>>2]|0))f=(zh(a,g,d,e)|0)+f|0;h=WA(a,h)|0}h=XA(a,b)|0;while(1){if(!h)break;i=c[h>>2]&3;g=c[((i|0)==3?h:h+48|0)+40>>2]|0;j=c[g+16>>2]|0;f=((c[(c[(c[(c[(c[((i|0)==2?h:h+-48|0)+40>>2]|0)+16>>2]|0)+20>>2]|0)+16>>2]|0)+236>>2]|0)>(c[(c[(c[j+20>>2]|0)+16>>2]|0)+236>>2]|0)&1)+f|0;if(!(c[j+8>>2]|0))f=(zh(a,g,d,e)|0)+f|0;h=YA(a,h)|0}return f|0}function Ah(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=0;while(1){e=Dh(a,b)|0;if(!e)break;c[d+(f<<2)>>2]=c[(c[e+16>>2]|0)+20>>2];sC(b,e)|0;e=UA(a,e)|0;while(1){if(!e)break;g=WA(a,e)|0;iB(a,e)|0;e=g}f=f+1|0}return f|0}function Bh(a,b){a=a|0;b=b|0;return (c[a>>2]|0)-(c[b>>2]|0)|0}function Ch(a){a=a|0;var b=0,c=0;b=gC(a)|0;while(1){if(!b)break;c=hC(a,b)|0;sC(a,b)|0;b=c}return}function Dh(a,b){a=a|0;b=b|0;var c=0;c=gC(b)|0;while(1){if(!c){c=0;break}if(!(sB(a,c,1,0)|0))break;c=hC(b,c)|0}return c|0}function Eh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;Fh(b);i=b+16|0;f=0;e=0;while(1){if((f|0)>=(c[(c[i>>2]|0)+220>>2]|0))break;Gh(b,f);f=f+1|0;e=(Hh(b,0,d)|0)+e|0}Ih(b);h=1;while(1){f=c[i>>2]|0;g=c[f+180>>2]|0;if((h|0)>(g|0))break;g=(Jh(c[(c[f+184>>2]|0)+(h<<2)>>2]|0,d)|0)+e|0;h=h+1|0;e=g}do if((g|0)>0){f=NA(b,86078)|0;if(f|0?(bP(f)|0)<<24>>24==0:0)break;gl(b);a[194049]=1;e=Hh(b,2,d)|0}while(0);Kh(b,e);return}function Fh(d){d=d|0;var e=0;if(a[195234]|0)RO();a[194049]=0;c[46783]=d;e=((rB(dg(d)|0)|0)<<2)+4|0;c[46782]=HK(e)|0;c[46781]=HK(e)|0;Ai(d);e=d+16|0;if(b[(c[e>>2]|0)+136>>1]&16)Bi(d);Pk(d);Dl(d,1);Ci(d);Rh(d);e=c[e>>2]|0;c[46784]=b[e+236>>1];c[46785]=b[e+238>>1];return}function Gh(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;a=c[a+16>>2]|0;c[a+192>>2]=c[(c[a+216>>2]|0)+(d<<2)>>2];a:do if((d|0)>0){d=b[a+238>>1]|0;e=a+196|0;a=b[a+236>>1]|0;while(1){if((a|0)>(d|0))break a;f=c[e>>2]|0;g=f+(a<<6)+4|0;f=f+(a<<6)|0;c[g>>2]=(c[g>>2]|0)+(c[f>>2]<<2);c[f>>2]=0;a=a+1|0}}while(0);return}function Hh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+32|0;p=q;if((d|0)>1){f=fi(0)|0;gi(b)}else f=2147483647;o=c[15715]|0;n=d;g=0;d=f;while(1){if((n|0)>=3)break;g=c[47183]|0;if((n|0)==2)if((f|0)>(d|0)){ii(b);f=d}else f=d;else{f=(g|0)<4?g:4;if((dg(b)|0)==(b|0))hi(b,n);if(!n)Sh(b);Th(b);i=fi(0)|0;if((i|0)>(d|0)){g=f;f=i}else{gi(b);g=f;f=i;d=i}}i=0;m=0;while(1){j=(f|0)==0;if((m|0)>=(g|0))break;if(a[195234]|0){c[p>>2]=n;c[p+4>>2]=m;c[p+8>>2]=i;c[p+12>>2]=f;c[p+16>>2]=d;z4(o,86471,p)|0}k=i+1|0;if(j|(i|0)>=(c[46786]|0))break;ji(b,m);f=fi(0)|0;if((f|0)>(d|0))i=k;else{gi(b);i=+(f|0)<+(d|0)*+h[23234]?0:k;d=f}m=m+1|0}if(j){f=0;break}else n=n+1|0}if((f|0)>(d|0))ii(b);if((d|0)>0){ki(b,0);f=fi(0)|0}else f=d;a:do if(e|0){d=0;while(1){if((d|0)>=(g|0))break a;li(b);d=d+1|0}}while(0);l=q;return f|0}function Ih(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;o=q;ei(d);m=d+16|0;e=c[m>>2]|0;n=c[15715]|0;k=b[e+236>>1]|0;while(1){if((k|0)>(b[e+238>>1]|0))break;f=c[e+196>>2]|0;g=c[f+(k<<6)+8>>2]|0;c[f+(k<<6)>>2]=g;h=c[f+(k<<6)+12>>2]|0;c[f+(k<<6)+4>>2]=h;j=0;while(1){if((j|0)>=(g|0))break;i=c[h+(j<<2)>>2]|0;if(!i){p=6;break}c[(c[i+16>>2]|0)+236>>2]=j;j=j+1|0}if((p|0)==6){p=0;if(a[195234]|0){f=HB(d)|0;e=c[(c[(c[m>>2]|0)+196>>2]|0)+(k<<6)>>2]|0;c[o>>2]=f;c[o+4>>2]=k;c[o+8>>2]=j;c[o+12>>2]=e;z4(n,86421,o)|0;e=c[m>>2]|0;f=c[e+196>>2]|0}c[f+(k<<6)>>2]=j}k=k+1|0}l=q;return}function Jh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;al(a);Rh(a);Sh(a);Th(a);f=a+16|0;d=Hh(a,2,b)|0;e=1;while(1){g=c[f>>2]|0;if((e|0)>(c[g+180>>2]|0))break;d=(Jh(c[(c[g+184>>2]|0)+(e<<2)>>2]|0,b)|0)+d|0;e=e+1|0}Uh(a);return d|0}function Kh(d,e){d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0;q=l;l=l+16|0;p=q;f=c[46781]|0;if(f|0){l6(f);c[46781]=0}f=c[46782]|0;if(f|0){l6(f);c[46782]=0}o=d+16|0;f=1;while(1){g=c[o>>2]|0;if((f|0)>(c[g+180>>2]|0))break;Lh(c[(c[g+184>>2]|0)+(f<<2)>>2]|0);f=f+1|0}n=b[g+236>>1]|0;f=g;while(1){if((n|0)>(b[f+238>>1]|0))break;else m=0;while(1){f=c[f+196>>2]|0;if((m|0)>=(c[f+(n<<6)>>2]|0))break;k=(c[(c[f+(n<<6)+4>>2]|0)+(m<<2)>>2]|0)+16|0;f=c[k>>2]|0;c[f+236>>2]=m;f=c[f+188>>2]|0;a:do if(f|0){g=0;while(1){i=c[f+(g<<2)>>2]|0;if(!i)break a;j=i+16|0;if((a[(c[j>>2]|0)+112>>0]|0)==4){rh(i);l6(c[j>>2]|0);l6(i);g=g+-1|0;f=c[(c[k>>2]|0)+188>>2]|0}g=g+1|0}}while(0);m=m+1|0;f=c[o>>2]|0}Mh(c[f+(n<<6)+56>>2]|0);n=n+1|0;f=c[o>>2]|0}if(a[195234]|0){o=c[15715]|0;d=HB(d)|0;r=+SO();c[p>>2]=d;c[p+4>>2]=e;h[p+8>>3]=r;z4(o,86089,p)|0}l=q;return}function Lh(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=a+16|0;d=1;while(1){f=c[g>>2]|0;if((d|0)>(c[f+180>>2]|0))break;Lh(c[(c[f+184>>2]|0)+(d<<2)>>2]|0);d=d+1|0}a:do if(c[f+268>>2]|0){e=b[f+236>>1]|0;d=f;while(1){if((e|0)>(b[d+238>>1]|0))break a;j=c[(c[d+268>>2]|0)+(e<<2)>>2]|0;i=Nh(a,j,-1)|0;j=Nh(a,j,1)|0;c[(c[(c[g>>2]|0)+268>>2]|0)+(e<<2)>>2]=i;k=c[(c[(c[(dg(a)|0)+16>>2]|0)+196>>2]|0)+(e<<6)+4>>2]|0;i=c[(c[i+16>>2]|0)+236>>2]|0;f=c[g>>2]|0;h=c[f+196>>2]|0;c[h+(e<<6)+4>>2]=k+(i<<2);c[h+(e<<6)>>2]=(c[(c[j+16>>2]|0)+236>>2]|0)+1-i;e=e+1|0;d=f}}while(0);return}function Mh(a){a=a|0;if(a|0){l6(c[a+8>>2]|0);l6(a)}return}function Nh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=b;while(1){b=Oh(b,c)|0;if(!b)break;if(Ph(a,b)|0){d=b;continue}e=(Qh(a,b)|0)==0;d=e?d:b}return d|0}function Oh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(!a)Aa(86128,86053,1023,86130);a=a+16|0;if((b|0)<0){a=c[a>>2]|0;e=c[a+236>>2]|0;if((e|0)>0){a=(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(c[a+232>>2]<<6)+4|0;d=e+-1|0;f=7}else g=0}else{a=c[a>>2]|0;e=c[a+236>>2]|0;a=(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(c[a+232>>2]<<6)+4|0;d=e+1|0;f=7}if((f|0)==7){a=c[(c[a>>2]|0)+(d<<2)>>2]|0;if(a)if((S((c[(c[a+16>>2]|0)+236>>2]|0)-e|0,b)|0)>0)g=a;else Aa(86139,86053,1029,86130);else g=0}return g|0}function Ph(b,d){b=b|0;d=d|0;if(!(a[(c[d+16>>2]|0)+156>>0]|0))b=(EC(b,d)|0)!=0;else b=0;return b&1|0}function Qh(b,d){b=b|0;d=d|0;var e=0,f=0;d=c[d+16>>2]|0;if(((a[d+156>>0]|0)==1?(c[d+176>>2]|0)==1:0)?(c[d+184>>2]|0)==1:0){d=c[d+180>>2]|0;while(1){d=c[d>>2]|0;e=c[d+16>>2]|0;if(!(a[e+112>>0]|0))break;else d=e+116|0}if(EC(b,d)|0)d=1;else f=7}else f=7;if((f|0)==7)d=0;return d|0}function Rh(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;d=c[47194]|0;a:do if((d|0)!=0|(c[47223]|0)!=0){d=_O(b,d,0)|0;if(d|0){switch(a[d>>0]|0){case 0:break a;case 111:{if(!(f2(d,86341)|0)){$h(b,1);break a}break}case 105:{if(!(f2(d,99036)|0)){$h(b,0);break a}break}default:{}}c[e>>2]=d;dA(1,86345,e)|0;break}d=MD(b)|0;while(1){if(!d)break;if(!(Mj(d)|0))Rh(d);d=ND(d)|0}if(c[47223]|0)ai(b)}while(0);l=f;return}function Sh(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=d+16|0;e=c[k>>2]|0;j=b[e+236>>1]|0;while(1){if((j|0)>(b[e+238>>1]|0))break;else{f=0;i=0}while(1){g=c[e+196>>2]|0;h=c[g+(j<<6)>>2]|0;if((i|0)>=(h|0))break;g=c[(c[(c[g+(j<<6)+4>>2]|0)+(i<<2)>>2]|0)+16>>2]|0;a[g+158>>0]=0;a[g+157>>0]=0;c[g+284>>2]=i;if((f|0)==0&(c[g+192>>2]|0)>0){f=Zh(h,h)|0;e=c[k>>2]|0;c[(c[e+196>>2]|0)+(j<<6)+56>>2]=f;f=1}i=i+1|0}a:do if(f){i=0;f=h;while(1){if((i|0)>=(f|0))break a;h=c[(c[g+(j<<6)+4>>2]|0)+(i<<2)>>2]|0;if(!(a[(c[h+16>>2]|0)+157>>0]|0)){_h(d,h);e=c[k>>2]|0;f=c[e+196>>2]|0;g=f;f=c[f+(j<<6)>>2]|0}i=i+1|0}}while(0);j=j+1|0}return}function Th(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=d+16|0;e=c[t>>2]|0;if(a[e+240>>0]|0){h=0;s=b[e+236>>1]|0;f=0;a:while(1){r=(h|0)!=0;if((s|0)>(b[e+238>>1]|0))break;g=c[e+196>>2]|0;i=c[g+(s<<6)>>2]|0;if(!i)g=h;else{g=c[g+(s<<6)+4>>2]|0;p=c[(c[(c[g>>2]|0)+16>>2]|0)+236>>2]|0;e=0;while(1){h=e+1|0;if((e|0)>=(i|0))break;a[(c[(c[g+(e<<2)>>2]|0)+16>>2]|0)+157>>0]=0;e=h}e=h<<2;if(r)q=KK(f,e)|0;else q=IK(e)|0;m=0;n=0;while(1){e=c[t>>2]|0;g=c[e+196>>2]|0;h=c[g+(s<<6)>>2]|0;i=e+116|0;o=q+(m<<2)|0;if((h|0)<=(n|0))break;j=c[(c[g+(s<<6)+4>>2]|0)+(((c[i>>2]&1|0)==0?h+~n|0:n)<<2)>>2]|0;l=j+16|0;e=0;k=0;while(1){i=c[l>>2]|0;if((e|0)>=(c[i+200>>2]|0)){g=0;h=0;e=i;break}i=((Vh(d,c[(c[i+196>>2]|0)+(e<<2)>>2]|0)|0)!=0&1)+k|0;e=e+1|0;k=i}while(1){if((h|0)>=(c[e+192>>2]|0))break;i=((Vh(d,c[(c[e+188>>2]|0)+(h<<2)>>2]|0)|0)!=0&1)+g|0;g=i;h=h+1|0;e=c[l>>2]|0}if(g|k)if((k|0)==0&(a[e+157>>0]|0)==0)e=(Wh(d,j,o,s)|0)+m|0;else e=m;else{c[o>>2]=j;e=m+1|0}m=e;n=n+1|0}b:do if(m){c:do if(!(c[i>>2]&1)){g=q;e=o;while(1){e=e+-4|0;if(g>>>0>=e>>>0){h=0;break c}o=c[g>>2]|0;c[g>>2]=c[e>>2];c[e>>2]=o;g=g+4|0}}else h=0;while(0);while(1){e=c[t>>2]|0;i=c[e+196>>2]|0;g=c[i+(s<<6)>>2]|0;if((h|0)>=(g|0)){m=0;h=i;break}o=c[q+(h<<2)>>2]|0;c[(c[i+(s<<6)+4>>2]|0)+(h<<2)>>2]=o;c[(c[o+16>>2]|0)+236>>2]=h+p;h=h+1|0}while(1){if((m|0)>=(g|0))break b;l=(c[(c[h+(s<<6)+4>>2]|0)+(m<<2)>>2]|0)+16|0;i=c[(c[l>>2]|0)+188>>2]|0;if(i){k=0;g=i;while(1){h=c[g+(k<<2)>>2]|0;e=c[t>>2]|0;if(!h)break;j=c[h>>2]&3;i=c[(c[(c[((j|0)==2?h:h+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;j=c[(c[(c[((j|0)==3?h:h+48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;if(!(c[e+116>>2]&1))if((i|0)<(j|0))u=35;else e=k;else if((i|0)>(j|0))u=35;else e=k;if((u|0)==35){u=0;if(Vh(d,h)|0){u=36;break a}rh(h);Xh(d,h);e=k+-1|0;g=c[(c[l>>2]|0)+188>>2]|0}k=e+1|0}g=c[e+196>>2]|0;h=g;g=c[g+(s<<6)>>2]|0}m=m+1|0}}while(0);a[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(s<<6)+49>>0]=0;g=q;f=q}h=g;s=s+1|0}if((u|0)==36)Aa(86187,86053,1561,86226);if(r)l6(f)}return}function Uh(a){a=a|0;var d=0,e=0;e=a+16|0;a=c[e>>2]|0;a:do if(c[a+268>>2]|0){d=b[a+236>>1]|0;while(1){if((d|0)>(b[a+238>>1]|0))break a;c[(c[a+268>>2]|0)+(d<<2)>>2]=c[c[(c[a+196>>2]|0)+(d<<6)+4>>2]>>2];d=d+1|0;a=c[e>>2]|0}}while(0);return}function Vh(a,b){a=a|0;b=b|0;if((c[(c[b+16>>2]|0)+156>>2]|0)!=0?(Yh(a,c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0)!=0:0)a=(Yh(a,c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0)!=0&1;else a=0;return a|0}function Wh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;l=d+16|0;g=c[l>>2]|0;a[g+157>>0]=1;a:do if((c[g+192>>2]|0)>0){h=0;j=0;while(1){i=c[(c[g+188>>2]|0)+(j<<2)>>2]|0;if(!i)break a;if((Vh(b,i)|0)!=0?(k=c[((c[i>>2]&3|0)==2?i:i+-48|0)+40>>2]|0,(a[(c[k+16>>2]|0)+157>>0]|0)==0):0)h=(Wh(b,k,e+(h<<2)|0,f)|0)+h|0;j=j+1|0;g=c[l>>2]|0}}else h=0;while(0);if((c[g+232>>2]|0)==(f|0)){c[e+(h<<2)>>2]=d;return h+1|0}else Aa(86239,86053,1490,86255);return 0}function Xh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=c[d>>2]&3;i=c[((h|0)==2?d:d+-48|0)+40>>2]|0;f=c[(c[i+16>>2]|0)+188>>2]|0;l=d+48|0;a:do if(!f)m=14;else{g=((h|0)==3?d:l)+40|0;e=0;while(1){j=c[f+(e<<2)>>2]|0;if(!j){m=14;break a}if((c[((c[j>>2]&3|0)==2?j:j+-48|0)+40>>2]|0)==(c[g>>2]|0))break;else e=e+1|0}sh(d,j);e=(c[d+16>>2]|0)+172|0;if(!(c[e>>2]|0))c[e>>2]=j;e=c[j+16>>2]|0;if((a[e+112>>0]|0)==4?(k=e+116|0,(c[k>>2]|0)==0):0)c[k>>2]=d;b=c[(c[((c[d>>2]&3|0)==3?d:l)+40>>2]|0)+16>>2]|0;e=c[b+204>>2]|0;b=(c[b+208>>2]<<2)+8|0;if(!e)e=IK(b)|0;else e=KK(e,b)|0;c[(c[(c[((c[d>>2]&3|0)==3?d:l)+40>>2]|0)+16>>2]|0)+204>>2]=e;i=c[(c[((c[d>>2]&3|0)==3?d:l)+40>>2]|0)+16>>2]|0;j=c[i+204>>2]|0;i=i+208|0;k=c[i>>2]|0;c[i>>2]=k+1;c[j+(k<<2)>>2]=d;l=c[(c[((c[d>>2]&3|0)==3?d:l)+40>>2]|0)+16>>2]|0;c[(c[l+204>>2]|0)+(c[l+208>>2]<<2)>>2]=0}while(0);if((m|0)==14){m=jh(i,c[((h|0)==3?d:l)+40>>2]|0,d)|0;d=c[d+16>>2]|0;l=c[m+16>>2]|0;a[l+112>>0]=(a[d+112>>0]|0)==4?4:3;c[l+96>>2]=c[d+96>>2];qh(b,m)}return}function Yh(a,b){a=a|0;b=b|0;var c=0;c=Ph(a,b)|0;return Qh(a,b)|0|c|0}function Zh(a,b){a=a|0;b=b|0;var d=0;d=HK(12)|0;c[d>>2]=a;c[d+4>>2]=b;c[d+8>>2]=HK(S(b,a)|0)|0;return d|0}function _h(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;o=d+16|0;l=c[o>>2]|0;k=c[(c[(c[b+16>>2]|0)+196>>2]|0)+(c[l+232>>2]<<6)+56>>2]|0;a[l+157>>0]=1;a[l+158>>0]=1;l=(c[(c[(dg(b)|0)+16>>2]|0)+180>>2]|0)>0;e=c[o>>2]|0;f=c[e+188>>2]|0;a:do if(f){m=k+4|0;n=k+8|0;d=0;b:while(1){j=c[f+(d<<2)>>2]|0;if(!j){p=e;break a}g=j+-48|0;e=j+48|0;if(l){if((EC(b,c[((c[j>>2]&3|0)==3?j:e)+40>>2]|0)|0)!=0?(EC(b,c[((c[j>>2]&3|0)==2?j:g)+40>>2]|0)|0)!=0:0)q=7}else q=7;do if((q|0)==7){q=0;h=j+16|0;if(c[(c[h>>2]|0)+156>>2]|0){s=c[j>>2]&3;r=c[(c[((s|0)==2?j:g)+40>>2]|0)+16>>2]|0;i=c[r+284>>2]|0;f=(i|0)<(c[k>>2]|0);e=((s|0)==3?j:e)+40|0;if((a[r+158>>0]|0)==1){if(!f){q=10;break b}e=c[(c[(c[e>>2]|0)+16>>2]|0)+284>>2]|0;f=c[m>>2]|0;if((e|0)>=(f|0)){q=12;break b}a[(c[n>>2]|0)+((S(f,i)|0)+e)>>0]=1;rh(j);d=d+-1|0;if((a[(c[h>>2]|0)+112>>0]|0)==4)break;Xh(b,j);break}else{if(!f){q=16;break b}e=c[(c[(c[e>>2]|0)+16>>2]|0)+284>>2]|0;f=c[m>>2]|0;if((e|0)>=(f|0)){q=18;break b}a[(c[n>>2]|0)+((S(f,e)|0)+i)>>0]=1;e=c[((c[j>>2]&3|0)==2?j:g)+40>>2]|0;if(a[(c[e+16>>2]|0)+157>>0]|0)break;_h(b,e);break}}}while(0);f=c[o>>2]|0;d=d+1|0;e=f;f=c[f+188>>2]|0}if((q|0)==10)Aa(86265,86053,1251,86297);else if((q|0)==12)Aa(86309,86053,1252,86297);else if((q|0)==16)Aa(86265,86053,1260,86297);else if((q|0)==18)Aa(86309,86053,1261,86297)}else p=e;while(0);a[p+158>>0]=0;return}function $h(a,b){a=a|0;b=b|0;var c=0;c=gC(a)|0;while(1){if(!c)break;bi(a,c,b);c=hC(a,c)|0}return}function ai(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;g=l;l=l+16|0;f=g;d=gC(b)|0;while(1){if(!d)break;e=_O(d,c[47223]|0,0)|0;a:do if(e|0){switch(a[e>>0]|0){case 0:break a;case 111:{if(!(f2(e,86341)|0)){bi(b,d,1);break a}break}case 105:{if(!(f2(e,99036)|0)){bi(b,d,0);break a}break}default:{}}h=HB(d)|0;c[f>>2]=e;c[f+4>>2]=h;dA(1,86376,f)|0}while(0);d=hC(b,d)|0}l=g;return}function bi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=c[46782]|0;h=d+16|0;f=c[h>>2]|0;a:do if(!(c[f+212>>2]|0)){i=(e|0)!=0;b:do if(i){g=0;d=0;e=f;while(1){f=c[(c[e+180>>2]|0)+(g<<2)>>2]|0;if(!f)break b;if(!(ci(f)|0)){c[j+(d<<2)>>2]=f;d=d+1|0;e=c[h>>2]|0}g=g+1|0}}else{g=0;d=0;e=f;while(1){f=c[(c[e+172>>2]|0)+(g<<2)>>2]|0;if(!f)break b;if(!(ci(f)|0)){c[j+(d<<2)>>2]=f;d=d+1|0;e=c[h>>2]|0}g=g+1|0}}while(0);if((d|0)>=2){c[j+(d<<2)>>2]=0;k3(j,d,4,61);h=i?2:3;g=i?-1:1;f=1;while(1){d=c[j+(f<<2)>>2]|0;if(!d)break a;e=c[j+(f+-1<<2)>>2]|0;e=c[((c[e>>2]&3|0)==(h|0)?e:e+(g*48|0)|0)+40>>2]|0;d=c[((c[d>>2]&3|0)==(h|0)?d:d+(g*48|0)|0)+40>>2]|0;if(ch(e,d)|0)break a;i=jh(e,d,0)|0;a[(c[i+16>>2]|0)+112>>0]=4;qh(b,i);f=f+1|0}}}while(0);return}function ci(a){a=a|0;var b=0;while(1){b=c[(c[a+16>>2]|0)+116>>2]|0;if(!b)break;else a=b}b=c[a>>2]&3;return (c[(c[(c[((b|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0)!=(c[(c[(c[((b|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0)|0}function di(a,b){a=a|0;b=b|0;return ((c[c[a>>2]>>2]|0)>>>4)-((c[c[b>>2]>>2]|0)>>>4)|0}function ei(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=c[a+16>>2]|0;h=g+220|0;i=c[h>>2]|0;if((i|0)>=2){f=c[g+216>>2]|0;a=0;e=0;while(1){if((e|0)==(i|0))break;d=c[f+(e<<2)>>2]|0;if(a|0)c[(c[a+16>>2]|0)+164>>2]=d;j=c[d+16>>2]|0;c[j+168>>2]=a;a=d;d=j;while(1){d=c[d+164>>2]|0;if(!d)break;a=d;d=c[d+16>>2]|0}e=e+1|0}c[h>>2]=1;c[g+192>>2]=c[f>>2];b[g+236>>1]=c[46784];b[g+238>>1]=c[46785]}return}function fi(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;i=c[46783]|0;j=i+16|0;f=c[j>>2]|0;g=0;h=b[f+236>>1]|0;while(1){if((h|0)>=(b[f+238>>1]|0))break;d=c[f+196>>2]|0;if(!(a[d+(h<<6)+49>>0]|0)){e=yi(i,h)|0;d=c[j>>2]|0;f=c[d+196>>2]|0;c[f+(h<<6)+52>>2]=e;a[f+(h<<6)+49>>0]=1}else{e=c[d+(h<<6)+52>>2]|0;d=f}g=e+g|0;h=h+1|0;f=d}return g|0}function gi(a){a=a|0;var d=0,e=0,f=0,g=0,i=0,j=0;a=c[a+16>>2]|0;g=b[a+238>>1]|0;i=a+196|0;a=b[a+236>>1]|0;while(1){if((a|0)>(g|0))break;f=c[i>>2]|0;e=c[f+(a<<6)>>2]|0;f=f+(a<<6)+4|0;d=0;while(1){if((d|0)>=(e|0))break;j=c[(c[(c[f>>2]|0)+(d<<2)>>2]|0)+16>>2]|0;h[j+16>>3]=+(c[j+236>>2]|0);d=d+1|0}a=a+1|0}return}function hi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+16|0;m=r;n=d+16|0;o=TO(c[(c[n>>2]|0)+232>>2]|0)|0;j=c[n>>2]|0;f=j+192|0;g=f;while(1){g=c[g>>2]|0;if(!g)break;g=c[g+16>>2]|0;a[g+157>>0]=0;g=g+164|0}h=b[j+238>>1]|0;i=j+196|0;g=b[j+236>>1]|0;while(1){if((g|0)>(h|0))break;c[(c[i>>2]|0)+(g<<6)>>2]=0;g=g+1|0}i=(e|0)==0;while(1){g=c[f>>2]|0;if(!g)break;h=g+16|0;f=c[h>>2]|0;if((c[c[(i?f+172|0:f+180|0)>>2]>>2]|0)==0?(k=f+157|0,(a[k>>0]|0)==0):0){a[k>>0]=1;VO(o,g);while(1){f=WO(o)|0;if(!f)break;if((a[(c[f+16>>2]|0)+159>>0]|0)==7){fl(d,f,e,o);continue}else{wi(d,f);xi(o,f,e);continue}}f=c[h>>2]|0}f=f+164|0}if(WO(o)|0)dA(1,86584,m)|0;f=c[n>>2]|0;j=b[f+236>>1]|0;while(1){if((j|0)>(b[f+238>>1]|0))break;a[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(j<<6)+49>>0]=0;if((c[f+116>>2]&1|0)!=0?(p=c[f+196>>2]|0,q=c[p+(j<<6)>>2]|0,(q|0)>0):0){g=c[p+(j<<6)+4>>2]|0;h=q+-1|0;i=(h|0)/2|0;f=0;while(1){if((f|0)>(i|0))break;qi(c[g+(f<<2)>>2]|0,c[g+(h-f<<2)>>2]|0);f=f+1|0}f=c[n>>2]|0}j=j+1|0}if((dg(d)|0)==(d|0)?(fi(0)|0)>0:0)ki(d,0);UO(o);l=r;return}function ii(d){d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;n=d+16|0;d=c[n>>2]|0;f=b[d+236>>1]|0;e=b[d+238>>1]|0;l=e<<16>>16;m=d+196|0;g=f;while(1){if((g|0)>(l|0))break;k=c[m>>2]|0;j=c[k+(g<<6)>>2]|0;k=k+(g<<6)+4|0;i=0;while(1){if((i|0)>=(j|0))break;o=c[(c[(c[k>>2]|0)+(i<<2)>>2]|0)+16>>2]|0;c[o+236>>2]=~~+h[o+16>>3];i=i+1|0}g=g+1|0}while(1){if((f|0)>(e<<16>>16|0))break;a[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(f<<6)+49>>0]=0;o=c[d+196>>2]|0;k3(c[o+(f<<6)+4>>2]|0,c[o+(f<<6)>>2]|0,4,62);o=c[n>>2]|0;f=f+1|0;e=b[o+238>>1]|0;d=o}return}function ji(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;l=((d|0)%4|0|0)<2&1;f=c[a+16>>2]|0;i=b[f+238>>1]|0;j=i<<16>>16;f=b[f+236>>1]|0;g=f<<16>>16;h=c[(c[46783]|0)+16>>2]|0;if(!(d&1)){k=1;e=j;d=(f<<16>>16<=(b[h+236>>1]|0)&1)+g|0}else{k=-1;e=g;d=((i<<16>>16>=(b[h+238>>1]|0))<<31>>31)+j|0}e=k+e|0;while(1){if((d|0)==(e|0))break;ti(a,d,l,(si(a,d,d-k|0)|0)&255);d=d+k|0}ki(a,l^1);return}function ki(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=d+16|0;g=c[k>>2]|0;i=b[g+236>>1]|0;j=b[g+238>>1]|0;h=g+196|0;f=i<<16>>16;while(1){if((f|0)>(j|0)){h=i;break}a[(c[h>>2]|0)+(f<<6)+48>>0]=1;f=f+1|0}while(1){f=0;h=h<<16>>16;while(1){if((h|0)>(b[g+238>>1]|0))break;if(a[(c[g+196>>2]|0)+(h<<6)+48>>0]|0){f=(ri(d,h,e)|0)+f|0;g=c[k>>2]|0}h=h+1|0}if((f|0)<=0)break;h=b[g+236>>1]|0}return}function li(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;o=d+16|0;e=c[o>>2]|0;n=b[e+238>>1]|0;a:while(1){if((n|0)<(b[e+236>>1]|0)){e=16;break}f=c[e+196>>2]|0;a[f+(n<<6)+48>>0]=0;p=(n|0)>0;q=n+1|0;g=0;b:while(1){l=(c[f+(n<<6)>>2]|0)+-1|0;m=f+(n<<6)+4|0;k=f+(q<<6)|0;while(1){if((g|0)>=(l|0))break b;j=c[m>>2]|0;i=c[j+(g<<2)>>2]|0;g=g+1|0;j=c[j+(g<<2)>>2]|0;if((c[(c[i+16>>2]|0)+236>>2]|0)>=(c[(c[j+16>>2]|0)+236>>2]|0)){e=7;break a}if(mi(d,i,j)|0)continue;if(p){f=ni(i,j)|0;h=ni(j,i)|0}else{f=0;h=0}if((c[k>>2]|0)>0){f=(oi(i,j)|0)+f|0;h=(oi(j,i)|0)+h|0}if((h|0)<=(f|0))break}pi(d,n,i,j);e=c[o>>2]|0;f=c[e+196>>2]|0}n=n+-1|0}if((e|0)==7)Aa(86535,86053,721,86561);else if((e|0)==16)return}function mi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=c[d+16>>2]|0;i=c[j+212>>2]|0;f=c[e+16>>2]|0;g=c[f+212>>2]|0;h=(i|0)!=(g|0);do if(!(a[194049]|0))if((g|0)==0|((i|0)==0|h^1))k=9;else{if((a[j+159>>0]|0)==7?(a[j+156>>0]|0)==1:0){b=0;break}if((a[f+159>>0]|0)==7?(a[f+156>>0]|0)==1:0){b=0;break}b=1}else if(h)b=1;else k=9;while(0);if((k|0)==9){f=c[b+16>>2]|0;b=c[(c[f+196>>2]|0)+(c[j+232>>2]<<6)+56>>2]|0;if(!b)b=0;else{j=(c[f+116>>2]&1|0)==0;k=S(c[b+4>>2]|0,c[(c[(j?d:e)+16>>2]|0)+284>>2]|0)|0;b=a[(c[b+8>>2]|0)+((c[(c[(j?e:d)+16>>2]|0)+284>>2]|0)+k)>>0]|0}}return b|0}function ni(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;l=a+16|0;j=c[(c[d+16>>2]|0)+172>>2]|0;d=0;while(1){a=c[j>>2]|0;if(!a)break;i=c[a+16>>2]|0;k=b[i+154>>1]|0;g=c[(c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;i=i+16|0;f=c[(c[l>>2]|0)+172>>2]|0;a=d;while(1){d=c[f>>2]|0;if(!d)break;e=(c[(c[(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)-g|0;d=d+16|0;if((e|0)<=0){if((e|0)==0?(m=c[d>>2]|0,+h[m+16>>3]>+h[i>>3]):0){d=m;n=9}}else{d=c[d>>2]|0;n=9}if((n|0)==9){n=0;a=(S(b[d+154>>1]|0,k)|0)+a|0}f=f+4|0}j=j+4|0;d=a}return d|0}function oi(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;l=a+16|0;j=c[(c[d+16>>2]|0)+180>>2]|0;d=0;while(1){a=c[j>>2]|0;if(!a)break;i=c[a+16>>2]|0;k=b[i+154>>1]|0;g=c[(c[(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;i=i+56|0;f=c[(c[l>>2]|0)+180>>2]|0;a=d;while(1){d=c[f>>2]|0;if(!d)break;e=(c[(c[(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)-g|0;d=d+16|0;if((e|0)<=0){if((e|0)==0?(m=c[d>>2]|0,+h[m+56>>3]>+h[i>>3]):0){d=m;n=9}}else{d=c[d>>2]|0;n=9}if((n|0)==9){n=0;a=(S(b[d+154>>1]|0,k)|0)+a|0}f=f+4|0}j=j+4|0;d=a}return d|0}function pi(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;i=a[(c[e+16>>2]|0)+156>>0]|0;if(i<<24>>24!=(a[(c[f+16>>2]|0)+156>>0]|0)){j=b+16|0;l=c[(c[j>>2]|0)+196>>2]|0;k=c[l+(d<<6)>>2]|0;l=l+(d<<6)+4|0;b=0;g=0;h=0;while(1){if((b|0)>=(k|0))break;o=(a[(c[(c[(c[l>>2]|0)+(b<<2)>>2]|0)+16>>2]|0)+156>>0]|0)==0;b=b+1|0;g=(o&1)+g|0;h=((o^1)&1)+h|0}i=i<<24>>24==0;h=(g|0)<(h|0)?(i?e:f):i?f:e;i=0;b=0;while(1){if((b|0)>=(k|0))break;i=(c[(c[l>>2]|0)+(b<<2)>>2]|0)==(h|0)?b:i;b=b+1|0}o=(a[(c[h+16>>2]|0)+156>>0]|0)==0&1;n=0;g=i;while(1){b=g+-1|0;if((g|0)<=0){m=0;b=i;break}if((a[(c[(c[(c[l>>2]|0)+(b<<2)>>2]|0)+16>>2]|0)+156>>0]|0)!=(o|0)){m=0;b=i;break}n=n+1|0;g=b}while(1){b=b+1|0;if((b|0)>=(k|0))break;if((a[(c[(c[(c[l>>2]|0)+(b<<2)>>2]|0)+16>>2]|0)+156>>0]|0)!=(o|0))break;m=m+1|0}qi(e,f);j=c[(c[j>>2]|0)+196>>2]|0;k=c[j+(d<<6)>>2]|0;j=j+(d<<6)+4|0;b=0;while(1){if((b|0)>=(k|0)){h=0;g=i;break}i=(c[(c[j>>2]|0)+(b<<2)>>2]|0)==(h|0)?b:i;b=b+1|0}while(1){b=g+-1|0;if((g|0)<=0){g=0;b=i;break}if((a[(c[(c[(c[j>>2]|0)+(b<<2)>>2]|0)+16>>2]|0)+156>>0]|0)!=(o|0)){g=0;b=i;break}h=h+1|0;g=b}while(1){b=b+1|0;if((b|0)>=(k|0))break;if((a[(c[(c[(c[j>>2]|0)+(b<<2)>>2]|0)+16>>2]|0)+156>>0]|0)!=(o|0))break;g=g+1|0}d=h-g|0;o=n-m|0;if((((d|0)>-1?d:0-d|0)|0)>(((o|0)>-1?o:0-o|0)|0))qi(e,f)}return}function qi(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;f=c[a+16>>2]|0;e=c[f+232>>2]|0;f=f+236|0;d=c[f>>2]|0;g=b+16|0;h=c[(c[g>>2]|0)+236>>2]|0;c[f>>2]=h;f=(c[46783]|0)+16|0;c[(c[(c[(c[f>>2]|0)+196>>2]|0)+(e<<6)+4>>2]|0)+(h<<2)>>2]=a;c[(c[g>>2]|0)+236>>2]=d;c[(c[(c[(c[f>>2]|0)+196>>2]|0)+(e<<6)+4>>2]|0)+(d<<2)>>2]=b;return}function ri(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=d+16|0;n=c[(c[q>>2]|0)+196>>2]|0;a[n+(e<<6)+48>>0]=0;r=(e|0)>0;s=e+1|0;o=(f|0)!=0;p=e+-1|0;g=0;i=0;f=n;a:while(1){l=(c[f+(e<<6)>>2]|0)+-1|0;m=f+(e<<6)+4|0;h=f+(s<<6)|0;n=g;while(1){if((n|0)>=(l|0)){f=17;break a}k=c[m>>2]|0;j=c[k+(n<<2)>>2]|0;n=n+1|0;k=c[k+(n<<2)>>2]|0;if((c[(c[j+16>>2]|0)+236>>2]|0)>=(c[(c[k+16>>2]|0)+236>>2]|0)){f=5;break a}if(mi(d,j,k)|0)continue;if(r){f=ni(j,k)|0;g=ni(k,j)|0}else{f=0;g=0}if((c[h>>2]|0)>0){f=(oi(j,k)|0)+f|0;g=(oi(k,j)|0)+g|0}if((f|0)>(g|0))break;if((f|0)==(g|0)&(o&(f|0)>0)){f=g;break}}qi(j,k);i=f-g+i|0;g=c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0;a[g+(e<<6)+49>>0]=0;h=c[q>>2]|0;f=c[h+196>>2]|0;a[f+(e<<6)+48>>0]=1;if((b[h+236>>1]|0)<(e|0)){a[g+(p<<6)+49>>0]=0;a[f+(p<<6)+48>>0]=1}if((b[h+238>>1]|0)<=(e|0)){g=n;continue}a[g+(s<<6)+49>>0]=0;a[f+(s<<6)+48>>0]=1;g=n}if((f|0)==5)Aa(86535,86053,770,86569);else if((f|0)==17)return i|0;return 0}function si(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;p=c[46781]|0;q=a+16|0;a=c[(c[q>>2]|0)+196>>2]|0;r=c[a+(e<<6)+4>>2]|0;n=(f|0)>(e|0);o=p+4|0;m=0;while(1){f=c[a+(e<<6)>>2]|0;if((m|0)>=(f|0)){a=0;i=0;break}l=(c[r+(m<<2)>>2]|0)+16|0;k=c[l>>2]|0;a:do if(n){j=c[k+180>>2]|0;a=0;i=0;while(1){f=c[j+(i<<2)>>2]|0;if(!f)break a;g=c[f+16>>2]|0;if((b[g+154>>1]|0)>0){c[p+(a<<2)>>2]=d[g+88>>0]|c[(c[(c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]<<8;a=a+1|0}i=i+1|0}}else{j=c[k+172>>2]|0;i=0;a=0;while(1){f=c[j+(i<<2)>>2]|0;if(!f)break a;g=c[f+16>>2]|0;if((b[g+154>>1]|0)>0){c[p+(a<<2)>>2]=d[g+48>>0]|c[(c[(c[((c[f>>2]&3|0)==3?f:f+48|0)+40>>2]|0)+16>>2]|0)+236>>2]<<8;a=a+1|0}i=i+1|0}}while(0);b:do switch(a|0){case 0:{h[k+240>>3]=-1.0;break}case 1:{h[k+240>>3]=+(c[p>>2]|0);break}case 2:{h[k+240>>3]=+(((c[o>>2]|0)+(c[p>>2]|0)|0)/2|0|0);break}default:{k3(p,a,4,60);f=(a|0)/2|0;j=c[p+(f<<2)>>2]|0;i=(c[l>>2]|0)+240|0;if(a&1|0){h[i>>3]=+(j|0);break b}g=(c[p+(a+-1<<2)>>2]|0)-j|0;a=c[p+(f+-1<<2)>>2]|0;f=a-(c[p>>2]|0)|0;if((f|0)==(g|0)){h[i>>3]=+((a+j|0)/2|0|0);break b}else{h[i>>3]=+(((S(f,j)|0)+(S(a,g)|0)|0)/(f+g|0)|0|0);break b}}}while(0);m=m+1|0;a=c[(c[q>>2]|0)+196>>2]|0}while(1){if((i|0)>=(f|0))break;g=c[r+(i<<2)>>2]|0;p=c[g+16>>2]|0;if((c[p+184>>2]|0)==0?(c[p+176>>2]|0)==0:0){a=(ui(g)|0|a&255)&255;f=c[(c[(c[q>>2]|0)+196>>2]|0)+(e<<6)>>2]|0}i=i+1|0}return a|0}function ti(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;m=c[(c[b+16>>2]|0)+196>>2]|0;q=c[m+(d<<6)+4>>2]|0;m=c[m+(d<<6)>>2]|0;o=(e|0)!=0;n=(f|e|0)==0;f=0;e=m;m=q+(m<<2)|0;while(1){l=e+-1|0;if((e|0)>0)e=q;else break;a:while(1){b:while(1){if(e>>>0>=m>>>0)break a;do{if(e>>>0>=m>>>0)break a;k=c[e>>2]|0;e=e+4|0}while(+h[(c[k+16>>2]|0)+240>>3]<0.0);g=0;while(1){if(e>>>0>=m>>>0)break a;i=c[e>>2]|0;if(!(g<<24>>24!=0?(c[(c[i+16>>2]|0)+212>>2]|0)!=0:0)){if(mi(b,k,i)|0)continue b;j=c[i+16>>2]|0;if(+h[j+240>>3]>=0.0)break;g=(c[j+212>>2]|0)==0?g:1}e=e+4|0}g=~~+h[(c[k+16>>2]|0)+240>>3];j=~~+h[(c[i+16>>2]|0)+240>>3];if((g|0)>(j|0)|o&(g|0)==(j|0))break}qi(k,i);f=f+1|0}e=l;m=n?m+-4|0:m}if(f|0?(p=c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0,a[p+(d<<6)+49>>0]=0,(d|0)>0):0)a[p+(d+-1<<6)+49>>0]=0;return}function ui(a){a=a|0;var b=0.0,d=0,e=0,f=0,g=0,i=0;a=c[a+16>>2]|0;i=a+240|0;if((c[a+200>>2]|0)>0){g=c[a+196>>2]|0;a=c[g>>2]|0;a=c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0;d=1;while(1){e=c[g+(d<<2)>>2]|0;f=c[a+16>>2]|0;if(!e)break;e=c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0;a=(c[(c[e+16>>2]|0)+236>>2]|0)>(c[f+236>>2]|0)?e:a;d=d+1|0}b=+h[f+240>>3];if(!(b>=0.0))a=1;else{h[i>>3]=b+1.0;a=0}}else if((c[a+192>>2]|0)>0){e=c[a+188>>2]|0;d=c[e>>2]|0;a=1;d=c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0;while(1){f=c[e+(a<<2)>>2]|0;g=c[d+16>>2]|0;if(!f)break;f=c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0;a=a+1|0;d=(c[(c[f+16>>2]|0)+236>>2]|0)<(c[g+236>>2]|0)?f:d}b=+h[g+240>>3];if(b>0.0){h[i>>3]=b+-1.0;a=0}else a=1}else a=1;return a|0}function vi(a,b){a=a|0;b=b|0;return (c[(c[(c[a>>2]|0)+16>>2]|0)+236>>2]|0)-(c[(c[(c[b>>2]|0)+16>>2]|0)+236>>2]|0)|0}function wi(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+96|0;o=p+64|0;n=p+48|0;h=p+24|0;f=p;j=d+16|0;k=c[(c[j>>2]|0)+232>>2]|0;m=a+16|0;e=c[(c[m>>2]|0)+196>>2]|0;i=c[e+(k<<6)>>2]|0;do if((c[e+(k<<6)+8>>2]|0)>=1){c[(c[e+(k<<6)+4>>2]|0)+(i<<2)>>2]=d;c[(c[j>>2]|0)+236>>2]=i;a=c[m>>2]|0;f=c[a+196>>2]|0;e=f+(k<<6)|0;g=c[e>>2]|0;c[e>>2]=g+1;if((g|0)>=(c[f+(k<<6)+8>>2]|0))Aa(86649,86053,1346,86685);g=c[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(k<<6)+8>>2]|0;if((i|0)>(g|0)){m=HB(d)|0;n=c[(c[j>>2]|0)+236>>2]|0;o=c[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(k<<6)+8>>2]|0;c[h>>2]=1359;c[h+4>>2]=m;c[h+8>>2]=n;c[h+12>>2]=k;c[h+16>>2]=o;dA(1,86701,h)|0;break}e=b[a+236>>1]|0;a=b[a+238>>1]|0;if((k|0)<(e|0)|(k|0)>(a|0)){c[n>>2]=1364;c[n+4>>2]=k;c[n+8>>2]=e;c[n+12>>2]=a;dA(1,86774,n)|0;break}if(((c[f+(k<<6)+4>>2]|0)+(i<<2)|0)>>>0>((c[f+(k<<6)+12>>2]|0)+(g<<2)|0)>>>0){i=HB(d)|0;n=c[(c[m>>2]|0)+196>>2]|0;m=(c[n+(k<<6)+4>>2]|0)+(c[(c[j>>2]|0)+236>>2]<<2)|0;n=(c[n+(k<<6)+12>>2]|0)+(c[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(k<<6)+8>>2]<<2)|0;c[o>>2]=1370;c[o+4>>2]=k;c[o+8>>2]=i;c[o+12>>2]=m;c[o+16>>2]=k;c[o+20>>2]=k;c[o+24>>2]=n;dA(1,86835,o)|0}}else{n=HB(a)|0;o=HB(d)|0;c[f>>2]=1339;c[f+4>>2]=n;c[f+8>>2]=o;c[f+12>>2]=k;c[f+16>>2]=i;dA(1,86594,f)|0}while(0);l=p;return}function xi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=d+16|0;a:do if(!e){g=0;while(1){d=c[h>>2]|0;if((g|0)>=(c[d+184>>2]|0))break a;d=c[(c[d+180>>2]|0)+(g<<2)>>2]|0;e=d+-48|0;f=(c[(c[((c[d>>2]&3|0)==2?d:e)+40>>2]|0)+16>>2]|0)+157|0;if(!(a[f>>0]|0)){a[f>>0]=1;VO(b,c[((c[d>>2]&3|0)==2?d:e)+40>>2]|0)}g=g+1|0}}else{g=0;while(1){d=c[h>>2]|0;if((g|0)>=(c[d+176>>2]|0))break a;d=c[(c[d+172>>2]|0)+(g<<2)>>2]|0;e=d+48|0;f=(c[(c[((c[d>>2]&3|0)==3?d:e)+40>>2]|0)+16>>2]|0)+157|0;if(!(a[f>>0]|0)){a[f>>0]=1;VO(b,c[((c[d>>2]&3|0)==3?d:e)+40>>2]|0)}g=g+1|0}}while(0);return}function yi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+16|0;t=u;g=d+16|0;f=c[(c[g>>2]|0)+196>>2]|0;r=c[f+(e<<6)+4>>2]|0;s=e+1|0;d=c[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(s<<6)>>2]|0;if((c[46787]|0)>(d|0))d=c[46788]|0;else{f=d+1|0;c[46787]=f;d=c[46788]|0;f=f<<2;if(!d)d=IK(f)|0;else d=KK(d,f)|0;c[46788]=d;f=c[(c[g>>2]|0)+196>>2]|0}q=f+(s<<6)|0;g=0;while(1){if((g|0)>=(c[q>>2]|0))break;c[d+(g<<2)>>2]=0;g=g+1|0}p=f+(e<<6)|0;o=0;g=0;d=0;while(1){j=c[p>>2]|0;if((o|0)>=(j|0))break;n=c[(c[(c[r+(o<<2)>>2]|0)+16>>2]|0)+180>>2]|0;a:do if((g|0)>0){m=c[46788]|0;k=0;while(1){h=c[n+(k<<2)>>2]|0;if(!h)break a;j=h+16|0;i=c[(c[(c[((c[h>>2]&3|0)==2?h:h+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;while(1){h=i+1|0;if((i|0)>=(g|0))break;i=h;d=(S(b[(c[j>>2]|0)+154>>1]|0,c[m+(h<<2)>>2]|0)|0)+d|0}k=k+1|0}}while(0);h=0;while(1){i=c[n+(h<<2)>>2]|0;if(!i)break;m=c[(c[(c[((c[i>>2]&3|0)==2?i:i+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;k=(c[46788]|0)+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(b[(c[i+16>>2]|0)+154>>1]|0);g=(m|0)>(g|0)?m:g;h=h+1|0}o=o+1|0}i=f+(e<<6)+4|0;h=0;while(1){if((h|0)>=(j|0))break;g=c[(c[(c[i>>2]|0)+(h<<2)>>2]|0)+16>>2]|0;if(a[g+145>>0]|0){e=g+180|0;c[t>>2]=c[e>>2];c[t+4>>2]=c[e+4>>2];d=(zi(t,1)|0)+d|0}h=h+1|0}i=c[q>>2]|0;h=f+(s<<6)+4|0;g=0;while(1){if((g|0)>=(i|0))break;f=c[(c[(c[h>>2]|0)+(g<<2)>>2]|0)+16>>2]|0;if(a[f+145>>0]|0){s=f+172|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];d=(zi(t,-1)|0)+d|0}g=g+1|0}l=u;return d|0}function zi(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;n=(d|0)>0;l=c[a>>2]|0;d=0;a=0;a:while(1){m=c[l+(d<<2)>>2]|0;if(!m)break;d=d+1|0;k=m+16|0;if(n){j=m+-48|0;i=d;while(1){e=c[l+(i<<2)>>2]|0;if(!e)continue a;f=c[e+16>>2]|0;g=c[k>>2]|0;if(+((c[(c[(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)-(c[(c[(c[((c[m>>2]&3|0)==2?m:j)+40>>2]|0)+16>>2]|0)+236>>2]|0)|0)*(+h[f+16>>3]-+h[g+16>>3])<0.0)a=(S(b[f+154>>1]|0,b[g+154>>1]|0)|0)+a|0;i=i+1|0}}else{j=m+48|0;i=d;while(1){e=c[l+(i<<2)>>2]|0;if(!e)continue a;f=c[e+16>>2]|0;g=c[k>>2]|0;if(+((c[(c[(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)-(c[(c[(c[((c[m>>2]&3|0)==3?m:j)+40>>2]|0)+16>>2]|0)+236>>2]|0)|0)*(+h[f+56>>3]-+h[g+56>>3])<0.0)a=(S(b[f+154>>1]|0,b[g+154>>1]|0)|0)+a|0;i=i+1|0}}}return a|0}function Ai(a){a=a|0;var b=0.0,d=0.0;c[46786]=8;c[47183]=24;h[23234]=.995;a=NA(a,86957)|0;if(a|0?(b=+a6(a),b>0.0):0){d=b*+(c[46786]|0);c[46786]=~~(d<=1.0?1.0:d);b=b*+(c[47183]|0);c[47183]=~~(b<=1.0?1.0:b)}return}function Bi(a){a=a|0;var d=0,e=0;e=(b[(c[a+16>>2]|0)+238>>1]|0)+2|0;d=HK(e<<2)|0;Di(a,d,e,0)|0;l6(d);return}function Ci(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=a+16|0;i=HK((b[(c[h>>2]|0)+238>>1]<<2)+8|0)|0;g=gC(a)|0;while(1){if(!g)break;f=i+(c[(c[g+16>>2]|0)+232>>2]<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=UA(a,g)|0;while(1){if(!f)break;j=c[f>>2]&3;d=c[(c[(c[((j|0)==3?f:f+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0;j=c[(c[(c[((j|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0;k=(d|0)>(j|0);e=k?d:j;d=k?j:d;while(1){d=d+1|0;if((d|0)>=(e|0))break;k=i+(d<<2)|0;c[k>>2]=(c[k>>2]|0)+1}f=WA(a,f)|0}g=hC(a,g)|0}f=HK((b[(c[h>>2]|0)+238>>1]<<6)+128|0)|0;e=c[h>>2]|0;c[e+196>>2]=f;d=b[e+236>>1]|0;while(1){if((d|0)>(b[e+238>>1]|0))break;j=i+(d<<2)|0;e=c[j>>2]|0;c[f+(d<<6)>>2]=e;c[f+(d<<6)+8>>2]=e;j=HK((c[j>>2]<<2)+4|0)|0;e=c[h>>2]|0;k=c[e+196>>2]|0;c[k+(d<<6)+4>>2]=j;c[k+(d<<6)+12>>2]=j;d=d+1|0;f=k}l6(i);return}function Di(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0;m=a+16|0;i=1;while(1){g=c[m>>2]|0;if((i|0)>(c[g+180>>2]|0))break;l=Di(c[(c[g+184>>2]|0)+(i<<2)>>2]|0,d,e,f)|0;i=i+1|0;f=l}a:do if((dg(a)|0)!=(a|0)){u6(d|0,0,e<<2|0)|0;g=gC(a)|0;while(1){if(!g)break;k=g+16|0;c[d+(c[(c[k>>2]|0)+232>>2]<<2)>>2]=1;i=UA(a,g)|0;while(1){if(!i)break;l=i+-48|0;j=c[(c[k>>2]|0)+232>>2]|0;while(1){e=j+1|0;if((j|0)>=(c[(c[(c[((c[i>>2]&3|0)==2?i:l)+40>>2]|0)+16>>2]|0)+232>>2]|0))break;c[d+(e<<2)>>2]=1;j=e}i=WA(a,i)|0}g=hC(a,g)|0}g=c[m>>2]|0;i=b[g+236>>1]|0;while(1){if((i|0)>(b[g+238>>1]|0))break a;if(!(c[d+(i<<2)>>2]|0)){if(!f)f=LD(dg(a)|0,86947,1)|0;g=qC(f,0,1)|0;RC(g,137750,304,1)|0;l=g+16|0;j=c[l>>2]|0;c[j+232>>2]=i;h[j+96>>3]=.5;h[j+88>>3]=.5;h[j+80>>3]=1.0;c[j+216>>2]=1;c[j+176>>2]=0;j=HK(20)|0;k=c[l>>2]|0;c[k+172>>2]=j;c[k+184>>2]=0;k=HK(20)|0;c[(c[l>>2]|0)+180>>2]=k;lC(a,g,1)|0;g=c[m>>2]|0}i=i+1|0}}while(0);return f|0}function Ei(a){a=a|0;var b=0,d=0;Uh(a);b=a+16|0;a=1;while(1){d=c[b>>2]|0;if((a|0)>(c[d+180>>2]|0))break;Ei(c[(c[d+184>>2]|0)+(a<<2)>>2]|0);a=a+1|0}return}function Fi(a){a=a|0;var b=0,d=0;b=c[a>>2]&3;d=Gi(c[((b|0)==3?a:a+48|0)+40>>2]|0)|0;b=c[17348+(d*12|0)+((Gi(c[((b|0)==2?a:a+-48|0)+40>>2]|0)|0)<<2)>>2]|0;a=(c[a+16>>2]|0)+156|0;c[a>>2]=S(c[a>>2]|0,b)|0;return}function Gi(b){b=b|0;b=c[b+16>>2]|0;if((a[b+156>>0]|0)==1)b=2;else b=(a[b+160>>0]|0)<2&1;return b|0}function Hi(b,d){b=b|0;d=d|0;if(c[(c[b+16>>2]|0)+192>>2]|0){gl(b);Ii(b);if(a[195236]|0)ul(b);Ji(b);if(Ml(b)|0)Ii(b);Ki(b);if(sL(b,2,Li(b)|0)|0?(Mi(b),sL(b,2,Li(b)|0)|0):0)Aa(86965,86993,134,87004);Ni(b);Oi(b,d);Pi(b)}return}function Ii(d){d=d|0;var e=0,f=0,g=0,i=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0;v=d+16|0;e=c[v>>2]|0;w=c[e+196>>2]|0;t=b[e+236>>1]|0;while(1){if((t|0)>(b[e+238>>1]|0))break;n=w+(t<<6)|0;o=w+(t<<6)+4|0;p=w+(t<<6)+40|0;q=w+(t<<6)+24|0;r=w+(t<<6)+32|0;s=w+(t<<6)+16|0;m=0;while(1){if((m|0)>=(c[n>>2]|0))break;l=(c[(c[o>>2]|0)+(m<<2)>>2]|0)+16|0;e=c[l>>2]|0;j=+h[e+80>>3]*.5;i=c[e+204>>2]|0;a:do if(i){g=0;while(1){f=c[i+(g<<2)>>2]|0;if(!f)break a;x=c[f>>2]&3;if((c[((x|0)==3?f:f+48|0)+40>>2]|0)==(c[((x|0)==2?f:f+-48|0)+40>>2]|0)?(u=c[(c[f+16>>2]|0)+96>>2]|0,(u|0)!=0):0){k=+h[u+32>>3]*.5;j=j>k?j:k}g=g+1|0}}while(0);if(+h[p>>3]>3]=j;h[p>>3]=j}if(+h[r>>3]>3]=j;h[r>>3]=j}i=c[e+212>>2]|0;if(i|0){if((i|0)==(d|0))g=0;else{g=XO(i,c[47198]|0,8,0)|0;e=c[l>>2]|0}f=c[e+232>>2]|0;e=c[i+16>>2]|0;j=j+ +(g|0);if((f|0)==(b[e+236>>1]|0)){x=e+128|0;k=+h[x>>3];h[x>>3]=k>j?k:j}if((f|0)==(b[e+238>>1]|0)){x=e+120|0;k=+h[x>>3];h[x>>3]=k>j?k:j}}m=m+1|0}t=t+1|0;e=c[v>>2]|0}m=oj(d)|0;g=c[v>>2]|0;e=b[g+238>>1]|0;h[(c[(c[c[w+(e<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]=+h[w+(e<<6)+16>>3];f=b[g+236>>1]|0;i=g+252|0;k=0.0;while(1){l=e+-1|0;if((e|0)<=(f|0))break;y=+h[w+(e<<6)+40>>3]+ +h[w+(l<<6)+32>>3]+ +(c[i>>2]|0);j=+h[w+(e<<6)+24>>3]+ +h[w+(l<<6)+16>>3]+8.0;j=y>j?y:j;if((c[w+(l<<6)>>2]|0)>0)h[(c[(c[c[w+(l<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]=j+ +h[(c[(c[c[w+(e<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3];k=k>j?k:j;e=l}b:do if((m|0)!=0?(c[g+116>>2]&1|0)!=0:0){pj(d,0);g=c[v>>2]|0;if(a[g+276>>0]|0){e=b[g+238>>1]|0;f=b[g+236>>1]|0;j=+h[(c[(c[c[w+(e<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3];k=0.0;while(1){i=e+-1|0;if((e|0)<=(f|0))break b;z=+h[(c[(c[c[w+(i<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3];y=z-j;j=z;k=k>y?k:y;e=i}}}while(0);c:do if(a[g+276>>0]|0){i=b[g+236>>1]|0;f=b[g+238>>1]|0;while(1){e=f+-1|0;if((f|0)<=(i|0))break c;if((c[w+(e<<6)>>2]|0)<=0){f=e;continue}h[(c[(c[c[w+(e<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]=k+ +h[(c[(c[c[w+(f<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3];f=e}}while(0);e=g+192|0;while(1){e=c[e>>2]|0;if(!e)break;e=c[e+16>>2]|0;h[e+24>>3]=+h[(c[(c[c[w+(c[e+232>>2]<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3];e=e+164|0}return}function Ji(a){a=a|0;var b=0,d=0,e=0;kj(a);b=(c[a+16>>2]|0)+192|0;while(1){b=c[b>>2]|0;if(!b)break;e=b+16|0;b=c[e>>2]|0;d=c[b+224>>2]|0;if(d){lj(a,d);b=c[e>>2]|0}d=c[b+228>>2]|0;if(!d)d=b;else{lj(a,d);d=c[e>>2]|0}e=c[d+204>>2]|0;if(e|0){b=0;while(1)if(!(c[e+(b<<2)>>2]|0))break;else b=b+1|0}b=d+164|0}return}function Ki(a){a=a|0;Yi(a);Zi(a);_i(a);$i(a);aj(a);return}function Li(a){a=a|0;var b=0,c=0.0;b=NA(a,87193)|0;if(!b)a=2147483647;else{c=+a6(b);a=~~(c*+(qB(a)|0))}return a|0}function Mi(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=d+16|0;e=c[r>>2]|0;q=b[e+236>>1]|0;while(1){p=b[e+238>>1]|0;if((q|0)>(p|0)){s=19;break}n=c[e+196>>2]|0;o=n+(q<<6)|0;m=c[o>>2]|0;n=n+(q<<6)+4|0;l=0;f=0;a:while(1){if((l|0)>=(m|0)){s=14;break}f=c[(c[n>>2]|0)+(l<<2)>>2]|0;h=c[f+16>>2]|0;i=c[h+256>>2]|0;b:do if(i|0){g=0;while(1){j=c[i+(g<<2)>>2]|0;if(!j)break b;k=c[j>>2]&3;if((c[(c[(c[((k|0)==2?j:j+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)>(q|0))break a;if((c[(c[(c[((k|0)==3?j:j+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)>(q|0))break a;else g=g+1|0}}while(0);h=c[h+248>>2]|0;c:do if(h|0){g=0;while(1){i=c[h+(g<<2)>>2]|0;if(!i)break c;j=c[i>>2]&3;if((c[(c[(c[((j|0)==3?i:i+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)>(q|0))break a;if((c[(c[(c[((j|0)==2?i:i+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)>(q|0))break a;else g=g+1|0}}while(0);l=l+1|0}if((s|0)==14){s=0;if(f){f=c[c[n>>2]>>2]|0;e=c[c[o+(((q|0)<(p|0)?1:-1)<<6)+4>>2]>>2]|0;if(!e){s=16;break}o=ph(d)|0;p=o+16|0;a[(c[p>>2]|0)+156>>0]=2;Wi(o,f,0.0,0)|0;Wi(o,e,0.0,0)|0;c[(c[p>>2]|0)+232>>2]=c[(c[((c[(c[f+16>>2]|0)+232>>2]|0)<(c[(c[e+16>>2]|0)+232>>2]|0)?f:e)+16>>2]|0)+232>>2];e=c[r>>2]|0}}q=q+1|0}if((s|0)==16)Aa(87101,86993,111,87104);else if((s|0)==19)return}function Ni(a){a=a|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0;a=c[a+16>>2]|0;i=c[a+196>>2]|0;e=b[a+238>>1]|0;a=b[a+236>>1]|0;while(1){if((a|0)>(e|0))break;f=c[i+(a<<6)>>2]|0;g=i+(a<<6)+4|0;d=0;while(1){if((d|0)>=(f|0))break;k=c[(c[(c[g>>2]|0)+(d<<2)>>2]|0)+16>>2]|0;j=k+232|0;h[k+16>>3]=+(c[j>>2]|0);c[j>>2]=a;d=d+1|0}a=a+1|0}return}function Oi(a,d){a=a|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0.0;Qi(a,a);i=a+16|0;l=c[i>>2]|0;a:do if((b[l+238>>1]|0)>0?(j=c[l+8>>2]|0,e=c[j+84>>2]|0,e|0):0){m=~~(+h[l+32>>3]-+h[l+16>>3]);n=~~(+h[l+40>>3]-+h[l+24>>3]);o=(c[l+116>>2]&1|0)==0;if((e|0)==4){p=Ri(a)|0;l=c[i>>2]|0;j=c[l+8>>2]|0}else p=(e|0)==2&1;q=+((o?m:n)|0);k=+((o?n:m)|0);i=j+72|0;e=j+64|0;b:do if(!(p<<24>>24)){switch(c[j+84>>2]|0){case 5:{f=+h[e>>3];if(f<=0.0)break a;k=f/+h[l+32>>3];q=+h[i>>3]/+h[l+40>>3];f=k1.0&q>1.0){k=f;break b}else break a}case 1:break;default:break a}g=+h[j+16>>3];f=k/q;if(f>3];if(f<=0.0)break a;g=f/q;f=+h[i>>3]/k;if(g<1.0|f<1.0)if(g>2]&1|0)==0;g=e?f:k;f=e?k:f;e=l+192|0;while(1){e=c[e>>2]|0;if(!e)break;e=c[e+16>>2]|0;p=e+16|0;q=f*+h[p>>3];h[p>>3]=+(~~(q+(q>=0.0?.5:-.5))|0);p=e+24|0;q=g*+h[p>>3];h[p>>3]=+(~~(q+(q>=0.0?.5:-.5))|0);e=e+164|0}Si(a,f,g)}while(0);if(d|0)Ti(a,d);return}function Pi(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=b+16|0;b=(c[h>>2]|0)+192|0;while(1){b=c[b>>2]|0;if(!b)break;g=b+16|0;d=0;while(1){b=c[g>>2]|0;f=c[b+180>>2]|0;e=c[f+(d<<2)>>2]|0;if(!e)break;l6(c[e+16>>2]|0);l6(e);d=d+1|0}if(f){l6(f);b=c[g>>2]|0}d=c[b+172>>2]|0;if(d){l6(d);b=c[g>>2]|0}f=b+256|0;e=c[f+4>>2]|0;b=b+180|0;c[b>>2]=c[f>>2];c[b+4>>2]=e;b=c[g>>2]|0;e=b+248|0;f=c[e+4>>2]|0;b=b+172|0;c[b>>2]=c[e>>2];c[b+4>>2]=f;b=(c[g>>2]|0)+164|0}b=0;d=c[(c[h>>2]|0)+192>>2]|0;a:while(1){g=(b|0)==0;f=b+16|0;b=d;while(1){if(!b)break a;e=c[b+16>>2]|0;d=c[e+164>>2]|0;if((a[e+156>>0]|0)!=2)continue a;if(g)c[(c[h>>2]|0)+192>>2]=d;else c[(c[f>>2]|0)+164>>2]=d;l6(e);l6(b);b=d}}c[(c[(c[(c[h>>2]|0)+192>>2]|0)+16>>2]|0)+168>>2]=0;return}function Qi(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=a+16|0;d=1;while(1){f=c[e>>2]|0;if((d|0)>(c[f+180>>2]|0))break;Qi(c[(c[f+184>>2]|0)+(d<<2)>>2]|0,b);d=d+1|0}Vi(a,b);return}function Ri(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0.0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0;s=l;l=l+80|0;e=s+64|0;d=s+48|0;f=s+16|0;m=s;r=s+32|0;a=a+16|0;b=c[(c[a>>2]|0)+8>>2]|0;t=b+48|0;c[f>>2]=c[t>>2];c[f+4>>2]=c[t+4>>2];c[f+8>>2]=c[t+8>>2];c[f+12>>2]=c[t+12>>2];if((!(+h[f>>3]<.001)?(g=f+8|0,!(+h[g>>3]<.001)):0)?(i=b+32|0,c[m>>2]=c[i>>2],c[m+4>>2]=c[i+4>>2],c[m+8>>2]=c[i+8>>2],c[m+12>>2]=c[i+12>>2],c[d>>2]=c[f>>2],c[d+4>>2]=c[f+4>>2],c[d+8>>2]=c[f+8>>2],c[d+12>>2]=c[f+12>>2],c[e>>2]=c[i>>2],c[e+4>>2]=c[i+4>>2],c[e+8>>2]=c[i+8>>2],c[e+12>>2]=c[i+12>>2],Ui(r,d,e),c[f>>2]=c[r>>2],c[f+4>>2]=c[r+4>>2],c[f+8>>2]=c[r+8>>2],c[f+12>>2]=c[r+12>>2],c[d>>2]=c[r>>2],c[d+4>>2]=c[r+4>>2],c[d+8>>2]=c[r+8>>2],c[d+12>>2]=c[r+12>>2],c[e>>2]=c[m>>2],c[e+4>>2]=c[m+4>>2],c[e+8>>2]=c[m+8>>2],c[e+12>>2]=c[m+12>>2],Ui(f,d,e),i=c[a>>2]|0,j=+h[i+32>>3],k=+h[i+40>>3],n=+h[f>>3],o=n/j,p=+h[g>>3],q=p/k,!(o>=1.0&q>=1.0)):0){o=o.5?o:.5;q=p*+R(+(k*o/p))/k;p=j*(n*+R(+(j*o/n))/j);a=c[i+8>>2]|0;h[a+64>>3]=p;h[a+72>>3]=k*q;a=1}else a=0;l=s;return a|0}function Si(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0;e=a+16|0;a=1;while(1){f=c[e>>2]|0;if((a|0)>(c[f+180>>2]|0))break;Si(c[(c[f+184>>2]|0)+(a<<2)>>2]|0,b,d);a=a+1|0}e=f+16|0;h[e>>3]=+h[e>>3]*b;e=f+24|0;h[e>>3]=+h[e>>3]*d;e=f+32|0;h[e>>3]=+h[e>>3]*b;f=f+40|0;h[f>>3]=+h[f>>3]*d;return}function Ti(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0.0,k=0,m=0,n=0,o=0;n=l;l=l+32|0;k=n+24|0;i=n+16|0;g=n;o=c[b+16>>2]|0;f=+h[o+32>>3]-+h[o+16>>3];e=+h[o+40>>3]-+h[o+24>>3];j=f/e;if(a[195234]|0){o=c[15715]|0;h[g>>3]=j;h[g+8>>3]=f*e/1.0e4;z4(o,87017,g)|0;c[i>>2]=uk(b)|0;z4(o,87042,i)|0}e=+h[d>>3];b=d+24|0;do if(!(j>e*1.1)){if(!(j<=e*.8)){c[b>>2]=0;m=9;break}c[b>>2]=-1;if(a[195234]|0){_3(87052,34,1,c[15715]|0)|0;m=9}}else{c[b>>2]=~~(e*+((c[d+20>>2]|0)-(c[d+16>>2]|0)|0)/j);m=9}while(0);if((m|0)==9?a[195234]|0:0){o=c[15715]|0;c[k>>2]=c[b>>2];z4(o,87087,k)|0}l=n;return}function Ui(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]-+h[c+8>>3];h[a>>3]=+h[b>>3]-+h[c>>3];h[a+8>>3]=d;return}function Vi(d,e){d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;n=(dg(d)|0)==(d|0);s=d+16|0;t=c[s>>2]|0;q=b[t+236>>1]|0;r=b[t+238>>1]|0;a:do if(n){n=t+196|0;m=q;g=-2147483647.0;f=2147483647.0;while(1){if((m|0)>(r|0))break;d=c[n>>2]|0;l=c[d+(m<<6)>>2]|0;if((l|0)!=0?(o=c[d+(m<<6)+4>>2]|0,p=c[o>>2]|0,(p|0)!=0):0){j=1;d=p;while(1){d=c[d+16>>2]|0;i=a[d+156>>0]|0;if(!((j|0)<(l|0)&i<<24>>24!=0))break;d=c[o+(j<<2)>>2]|0;j=j+1|0}if(!(i<<24>>24)){k=+h[d+16>>3]-+h[d+88>>3];j=f>2]|0)+16>>2]|0;if(!(a[d+156>>0]|0))break;else{d=i;i=i+-1|0}}u=+h[d+16>>3]+ +h[d+96>>3];g=g>u?g:u;f=j?f:k}}m=m+1|0}i=c[t+180>>2]|0;j=t+184|0;d=1;while(1){if((d|0)>(i|0))break a;p=c[(c[(c[j>>2]|0)+(d<<2)>>2]|0)+16>>2]|0;u=+h[p+16>>3]+-8.0;k=+h[p+32>>3]+8.0;d=d+1|0;g=g>k?g:k;f=f>2]|0)+16>>2]|0)+232>>2]|0);f=+(c[(c[(c[t+256>>2]|0)+16>>2]|0)+232>>2]|0)}while(0);e=c[(c[e+16>>2]|0)+196>>2]|0;k=+h[(c[(c[c[e+(r<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]-+h[t+120>>3];u=+h[(c[(c[c[e+(q<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]+ +h[t+128>>3];h[t+16>>3]=f;h[t+24>>3]=k;e=c[s>>2]|0;h[e+32>>3]=g;h[e+40>>3]=u;return}function Wi(a,d,e,f){a=a|0;d=d|0;e=+e;f=f|0;var g=0,h=0,i=0,j=0;i=HK(96)|0;j=i+48|0;c[j>>2]=c[j>>2]|3;c[i>>2]=c[i>>2]&-4|2;g=HK(176)|0;h=i+16|0;c[h>>2]=g;c[((c[i>>2]&3|0)==3?i:j)+40>>2]=a;c[((c[i>>2]&3|0)==2?i:i+-48|0)+40>>2]=d;if(e>65535.0){Xi(e);e=65535.0;g=c[h>>2]|0}b[g+170>>1]=~~(e+(e>=0.0?.5:-.5));c[g+156>>2]=f;dh(i)|0;return i|0}function Xi(a){a=+a;var b=0,d=0;b=l;l=l+16|0;d=b;h[d>>3]=a;c[d+8>>2]=65535;dA(1,87117,d)|0;l=b;return}function Yi(a){a=a|0;var b=0,d=0,e=0,f=0;a=(c[a+16>>2]|0)+192|0;while(1){a=c[a>>2]|0;if(!a)break;f=a+16|0;e=c[f>>2]|0;a=e+172|0;d=c[a+4>>2]|0;e=e+248|0;c[e>>2]=c[a>>2];c[e+4>>2]=d;e=c[f>>2]|0;d=e+180|0;a=c[d+4>>2]|0;e=e+256|0;c[e>>2]=c[d>>2];c[e+4>>2]=a;e=c[f>>2]|0;a=c[e+180>>2]|0;d=0;while(1)if(!(c[a+(d<<2)>>2]|0))break;else d=d+1|0;b=c[e+172>>2]|0;a=0;while(1)if(!(c[b+(a<<2)>>2]|0))break;else a=a+1|0;c[e+176>>2]=0;a=HK((a+d<<2)+16|0)|0;e=c[f>>2]|0;c[e+172>>2]=a;c[e+184>>2]=0;e=HK(16)|0;a=c[f>>2]|0;c[a+180>>2]=e;a=a+164|0}return}function Zi(d){d=d|0;var f=0,g=0,i=0.0,j=0,k=0,m=0.0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0;z=l;l=l+16|0;w=z;x=d+16|0;u=c[x>>2]|0;y=c[u+196>>2]|0;d=(a[(c[(c[d+60>>2]|0)+16>>2]|0)+113>>0]&1)!=0;v=c[u+248>>2]|0;c[w>>2]=v;c[w+4>>2]=d?5:v;v=b[u+236>>1]|0;d=u;while(1){if((v|0)>(b[d+238>>1]|0))break;r=y+(v<<6)+4|0;c[(c[(c[c[r>>2]>>2]|0)+16>>2]|0)+232>>2]=0;s=y+(v<<6)|0;t=+(c[w+((v&1)<<2)>>2]|0);m=0.0;k=0;a:while(1){if((k|0)>=(c[s>>2]|0))break;f=c[r>>2]|0;n=c[f+(k<<2)>>2]|0;u=n+16|0;d=c[u>>2]|0;i=+h[d+96>>3];h[d+240>>3]=i;if((c[d+208>>2]|0)>0){j=0;f=0;while(1){g=c[(c[d+204>>2]|0)+(j<<2)>>2]|0;if(!g)break;q=c[g>>2]&3;if((c[((q|0)==3?g:g+48|0)+40>>2]|0)==(c[((q|0)==2?g:g+-48|0)+40>>2]|0)){f=(iO(g)|0)+f|0;d=c[u>>2]|0}j=j+1|0}q=d+96|0;i=+(f|0)+ +h[q>>3];h[q>>3]=i;f=c[r>>2]|0}q=k+1|0;f=c[f+(q<<2)>>2]|0;if(!f)p=m;else{o=f+16|0;p=t+(i+ +h[(c[o>>2]|0)+88>>3]);Wi(n,f,p,0)|0;d=~~(m+p);c[(c[o>>2]|0)+232>>2]=d;p=+(d|0);d=c[u>>2]|0}f=c[d+112>>2]|0;if(f){j=c[d+256>>2]|0;k=c[j>>2]|0;j=c[j+4>>2]|0;d=(c[(c[(c[((c[k>>2]&3|0)==2?k:k+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)>(c[(c[(c[((c[j>>2]&3|0)==2?j:j+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0);g=d?j:k;j=d?k:j;k=f+16|0;d=c[k>>2]|0;i=+((S(c[(c[x>>2]|0)+248>>2]|0,e[d+170>>1]|0)|0)/2|0|0);o=c[g>>2]&3;f=c[((o|0)==2?g:g+-48|0)+40>>2]|0;g=c[((o|0)==3?g:g+48|0)+40>>2]|0;if(!(ij(g,f)|0))Wi(f,g,+(~~(i+ +h[(c[f+16>>2]|0)+96>>3]+ +h[(c[g+16>>2]|0)+88>>3])|0),c[d+156>>2]|0)|0;d=c[j>>2]&3;f=c[((d|0)==3?j:j+48|0)+40>>2]|0;d=c[((d|0)==2?j:j+-48|0)+40>>2]|0;if(!(ij(d,f)|0)){Wi(f,d,+(~~(i+ +h[(c[f+16>>2]|0)+96>>3]+ +h[(c[d+16>>2]|0)+88>>3])|0),c[(c[k>>2]|0)+156>>2]|0)|0;o=0}else o=0}else o=0;while(1){d=c[u>>2]|0;if((o|0)>=(c[d+192>>2]|0)){m=p;k=q;continue a}k=c[(c[d+188>>2]|0)+(o<<2)>>2]|0;j=c[k>>2]&3;g=c[((j|0)==3?k:k+48|0)+40>>2]|0;j=c[((j|0)==2?k:k+-48|0)+40>>2]|0;d=(c[(c[g+16>>2]|0)+236>>2]|0)<(c[(c[j+16>>2]|0)+236>>2]|0);f=d?g:j;g=d?j:g;i=+h[(c[f+16>>2]|0)+96>>3]+ +h[(c[g+16>>2]|0)+88>>3];j=k+16|0;d=~~(i+ +(S(c[(c[x>>2]|0)+248>>2]|0,e[(c[j>>2]|0)+170>>1]|0)|0));n=ah(f,g)|0;m=+(d|0);if(!n){d=c[j>>2]|0;if(!(c[d+96>>2]|0))Wi(f,g,m,c[d+156>>2]|0)|0}else{d=c[j>>2]|0;A=+h[d+136>>3];i=i+ +(c[(c[x>>2]|0)+248>>2]|0)+ +(~~(A+(A>=0.0?.5:-.5))|0);f=~~(m>i?m:i);if((f|0)>65535){Xi(+(f|0));f=65535;d=c[j>>2]|0}j=c[n+16>>2]|0;g=j+170|0;B=e[g>>1]|0;b[g>>1]=(B|0)>(f|0)?B:f;j=j+156|0;c[j>>2]=c[(c[((c[j>>2]|0)>(c[d+156>>2]|0)?n:k)+16>>2]|0)+156>>2]}o=o+1|0}}v=v+1|0;d=c[x>>2]|0}l=z;return}function _i(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;d=(c[b+16>>2]|0)+192|0;while(1){d=c[d>>2]|0;if(!d)break;g=d+16|0;d=c[g>>2]|0;e=c[d+256>>2]|0;a:do if(e){f=0;while(1){e=c[e+(f<<2)>>2]|0;if(!e)break a;n=ph(b)|0;d=n+16|0;a[(c[d>>2]|0)+156>>0]=2;l=e+16|0;k=c[l>>2]|0;i=~~(+h[k+56>>3]-+h[k+16>>3]);m=(i|0)>0;j=m?0:0-i|0;i=m?i:0;m=e+48|0;Wi(n,c[((c[e>>2]&3|0)==3?e:m)+40>>2]|0,+(i+1|0),c[k+156>>2]|0)|0;k=e+-48|0;Wi(n,c[((c[e>>2]&3|0)==2?e:k)+40>>2]|0,+(j+1|0),c[(c[l>>2]|0)+156>>2]|0)|0;l=c[e>>2]&3;i=(c[(c[(c[((l|0)==3?e:m)+40>>2]|0)+16>>2]|0)+232>>2]|0)-i|0;e=(c[(c[(c[((l|0)==2?e:k)+40>>2]|0)+16>>2]|0)+232>>2]|0)-j|0;c[(c[d>>2]|0)+232>>2]=((i|0)<(e|0)?i:e)+-1;d=c[g>>2]|0;f=f+1|0;e=c[d+256>>2]|0}}while(0);d=d+164|0}return}function $i(a){a=a|0;if((c[(c[a+16>>2]|0)+180>>2]|0)>0){dj(a);ej(a);fj(a);gj(a)}return}function aj(a){a=a|0;var b=0.0,d=0.0,e=0,f=0;e=a+16|0;f=c[(c[e>>2]|0)+8>>2]|0;if((c[f+84>>2]|0)==3?(b=+h[f+64>>3],d=+h[f+72>>3],!(b*d<=1.0)):0){bj(a);f=c[e>>2]|0;d=(c[f+116>>2]&1|0)==0?b:d;Wi(c[f+256>>2]|0,c[f+260>>2]|0,d<65535.0?d:65535.0,1e3)|0}return}function bj(a){a=a|0;var d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;m=n;e=XO(a,c[47198]|0,8,0)|0;cj(a);i=a+16|0;g=c[i>>2]|0;j=c[g+256>>2]|0;k=c[g+260>>2]|0;f=+(e|0);e=b[g+236>>1]|0;while(1){if((e|0)>(b[g+238>>1]|0))break;d=c[g+196>>2]|0;do if(c[d+(e<<6)>>2]|0){d=c[c[d+(e<<6)+4>>2]>>2]|0;if(!d){c[m>>2]=HB(a)|0;c[m+4>>2]=e;dA(1,87201,m)|0;break}else{Wi(j,d,f+ +h[(c[d+16>>2]|0)+88>>3]+ +h[g+96>>3],0)|0;g=c[i>>2]|0;d=c[g+196>>2]|0;d=c[(c[d+(e<<6)+4>>2]|0)+((c[d+(e<<6)>>2]|0)+-1<<2)>>2]|0;Wi(d,k,f+ +h[(c[d+16>>2]|0)+96>>3]+ +h[g+64>>3],0)|0;break}}while(0);e=e+1|0;g=c[i>>2]|0}l=n;return}function cj(b){b=b|0;var d=0,e=0,f=0;d=b+16|0;if(!(c[(c[d>>2]|0)+256>>2]|0)){f=ph(dg(b)|0)|0;a[(c[f+16>>2]|0)+156>>0]=2;e=ph(dg(b)|0)|0;a[(c[e+16>>2]|0)+156>>0]=2;if((c[(c[d>>2]|0)+12>>2]|0?(dg(b)|0)!=(b|0):0)?(c[(c[(vC(b)|0)+16>>2]|0)+116>>2]&1|0)==0:0){b=c[d>>2]|0;Wi(f,e,+(~~+h[b+48+((+h[b+48>>3]>+h[b+80>>3]?0:2)<<4)>>3]|0),0)|0}d=c[d>>2]|0;c[d+256>>2]=f;c[d+260>>2]=e}return}function dj(a){a=a|0;var b=0,d=0;b=a+16|0;do if((dg(a)|0)!=(a|0)){bj(a);a=c[b>>2]|0;a=ah(c[a+256>>2]|0,c[a+260>>2]|0)|0;if(!a){d=c[b>>2]|0;Wi(c[d+256>>2]|0,c[d+260>>2]|0,1.0,128)|0;break}else{d=(c[a+16>>2]|0)+156|0;c[d>>2]=(c[d>>2]|0)+128;break}}while(0);a=1;while(1){d=c[b>>2]|0;if((a|0)>(c[d+180>>2]|0))break;dj(c[(c[d+184>>2]|0)+(a<<2)>>2]|0);a=a+1|0}return}function ej(d){d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0,o=0;k=XO(d,c[47198]|0,8,0)|0;o=d+16|0;e=c[o>>2]|0;m=+(k|0);k=b[e+236>>1]|0;while(1){if((k|0)>(b[e+238>>1]|0)){f=1;break}e=c[e+196>>2]|0;a:do if(c[e+(k<<6)>>2]|0?(l=c[c[e+(k<<6)+4>>2]>>2]|0,l|0):0){i=l+16|0;f=c[(c[i>>2]|0)+236>>2]|0;while(1){if((f|0)<=0)break;f=f+-1|0;j=c[(c[(c[(c[(dg(d)|0)+16>>2]|0)+196>>2]|0)+(k<<6)+4>>2]|0)+(f<<2)>>2]|0;g=j+16|0;e=c[g>>2]|0;if(!(a[e+156>>0]|0)){n=10;break}if(hj(d,j)|0){n=9;break}}if((n|0)==9){e=c[g>>2]|0;n=10}if((n|0)==10){n=0;Wi(j,c[(c[o>>2]|0)+256>>2]|0,m+ +h[e+96>>3],0)|0}f=(c[(c[(c[o>>2]|0)+196>>2]|0)+(k<<6)>>2]|0)+(c[(c[i>>2]|0)+236>>2]|0)|0;while(1){if((f|0)>=(c[(c[(c[(dg(d)|0)+16>>2]|0)+196>>2]|0)+(k<<6)>>2]|0))break a;i=c[(c[(c[(c[(dg(d)|0)+16>>2]|0)+196>>2]|0)+(k<<6)+4>>2]|0)+(f<<2)>>2]|0;g=i+16|0;e=c[g>>2]|0;if(!(a[e+156>>0]|0))break;if(!(hj(d,i)|0))f=f+1|0;else{n=15;break}}if((n|0)==15){n=0;e=c[g>>2]|0}Wi(c[(c[o>>2]|0)+260>>2]|0,i,m+ +h[e+88>>3],0)|0}while(0);k=k+1|0;e=c[o>>2]|0}while(1){if((f|0)>(c[e+180>>2]|0))break;ej(c[(c[e+184>>2]|0)+(f<<2)>>2]|0);f=f+1|0;e=c[o>>2]|0}return}function fj(a){a=a|0;var b=0,d=0.0,e=0,f=0,g=0;e=XO(a,c[47198]|0,8,0)|0;cj(a);b=a+16|0;d=+(e|0);a=1;while(1){e=c[b>>2]|0;if((a|0)>(c[e+180>>2]|0))break;e=c[(c[e+184>>2]|0)+(a<<2)>>2]|0;cj(e);f=c[b>>2]|0;g=e+16|0;Wi(c[f+256>>2]|0,c[(c[g>>2]|0)+256>>2]|0,d+ +h[f+96>>3],0)|0;f=c[b>>2]|0;Wi(c[(c[g>>2]|0)+260>>2]|0,c[f+260>>2]|0,d+ +h[f+64>>3],0)|0;fj(e);a=a+1|0}return}function gj(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0,o=0;d=XO(a,c[47198]|0,8,0)|0;n=a+16|0;a=1;while(1){f=c[n>>2]|0;e=c[f+180>>2]|0;if((a|0)>(e|0))break;cj(c[(c[f+184>>2]|0)+(a<<2)>>2]|0);a=a+1|0}m=+(d|0);l=1;a=e;d=f;while(1){if((l|0)>(a|0))break;k=l+1|0;j=k;while(1){e=c[d+184>>2]|0;f=c[e+(l<<2)>>2]|0;if((j|0)>(a|0))break;e=c[e+(j<<2)>>2]|0;g=(b[(c[f+16>>2]|0)+236>>1]|0)>(b[(c[e+16>>2]|0)+236>>1]|0);i=g?e:f;e=g?f:e;f=c[i+16>>2]|0;g=c[e+16>>2]|0;o=b[g+236>>1]|0;h=o<<16>>16;if((b[f+238>>1]|0)>=o<<16>>16){a=(c[(c[(c[c[(c[f+196>>2]|0)+(h<<6)+4>>2]>>2]|0)+16>>2]|0)+236>>2]|0)<(c[(c[(c[c[(c[g+196>>2]|0)+(h<<6)+4>>2]>>2]|0)+16>>2]|0)+236>>2]|0);Wi(c[(c[(a?i:e)+16>>2]|0)+260>>2]|0,c[(c[(a?e:i)+16>>2]|0)+256>>2]|0,m,0)|0;a=c[n>>2]|0;d=a;a=c[a+180>>2]|0}j=j+1|0}gj(f);d=c[n>>2]|0;l=k;a=c[d+180>>2]|0}return}function hj(b,d){b=b|0;d=d|0;var e=0;d=c[d+16>>2]|0;if((a[d+156>>0]|0)==1){d=c[c[d+256>>2]>>2]|0;while(1){e=c[(c[d+16>>2]|0)+116>>2]|0;if(!e)break;else d=e}if(!(EC(b,c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)|0))d=(EC(b,c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)|0)==0&1;else d=0}else d=0;return d|0}function ij(a,b){a=a|0;b=b|0;return jj(a,b)|0}function jj(a,b){a=a|0;b=b|0;var d=0,e=0;a:do if((a|0)==(b|0))a=1;else{d=c[(c[a+16>>2]|0)+180>>2]|0;a=0;while(1){e=c[d+(a<<2)>>2]|0;if(!e){a=0;break a}if(!(jj(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,b)|0))a=a+1|0;else{a=1;break}}}while(0);return a|0}function kj(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;l=d+16|0;d=c[l>>2]|0;k=b[d+236>>1]|0;while(1){if((k|0)>(b[d+238>>1]|0))break;h=c[d+196>>2]|0;g=c[h+(k<<6)>>2]|0;h=h+(k<<6)+4|0;j=0;f=0;while(1){i=j+1|0;if((f|0)>=(g|0))break;e=c[(c[(c[h>>2]|0)+(f<<2)>>2]|0)+16>>2]|0;c[e+236>>2]=j;if((a[e+159>>0]|0)==6)e=(c[e+216>>2]|0)+j|0;else e=i;j=e;f=f+1|0}if((j|0)>(g|0)){e=c[h>>2]|0;d=i<<2;if(!e)d=IK(d)|0;else d=KK(e,d)|0;f=c[(c[l>>2]|0)+196>>2]|0;c[f+(k<<6)+4>>2]=d;g=c[f+(k<<6)>>2]|0;while(1){e=g+-1|0;if((g|0)<=0)break;f=c[d+(e<<2)>>2]|0;c[d+(c[(c[f+16>>2]|0)+236>>2]<<2)>>2]=f;f=c[(c[l>>2]|0)+196>>2]|0;g=e;d=c[f+(k<<6)+4>>2]|0}c[f+(k<<6)>>2]=j;c[d+(j<<2)>>2]=0;d=c[l>>2]|0}k=k+1|0}return}function lj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;o=l;l=l+48|0;n=o+32|0;m=o+8|0;d=o+24|0;k=o+16|0;j=o;e=b+16|0;f=c[e>>2]|0;a:do if((c[f+216>>2]|0)>=2){c[m>>2]=~~(+h[f+16>>3]-+h[f+88>>3]);c[m+4>>2]=~~+h[f+24>>3];c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];mj(d,b,n);g=d;i=c[g+4>>2]|0;d=m;c[d>>2]=c[g>>2];c[d+4>>2]=i;e=c[e>>2]|0;d=(c[e+236>>2]|0)+1|0;if((c[e+184>>2]|0)>0){j=c[c[e+180>>2]>>2]|0;j=XA(a,c[((c[j>>2]&3|0)==2?j:j+-48|0)+40>>2]|0)|0;while(1){if(!j)break a;i=(c[j>>2]&3|0)==2?j:j+-48|0;e=i+48|0;f=c[((c[i>>2]&3|0)==3?i:e)+40>>2]|0;if((f|0)!=(b|0)?(dP(f)|0)==(b|0):0){e=c[((c[i>>2]&3|0)==3?i:e)+40>>2]|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];nj(k,a,e,n,d);e=k;f=c[e+4>>2]|0;g=m;c[g>>2]=c[e>>2];c[g+4>>2]=f;uh(i);g=i+-48|0;f=c[(c[((c[i>>2]&3|0)==2?i:g)+40>>2]|0)+16>>2]|0;e=c[f+172>>2]|0;f=(c[f+176>>2]<<2)+8|0;if(!e)e=IK(f)|0;else e=KK(e,f)|0;c[(c[(c[((c[i>>2]&3|0)==2?i:g)+40>>2]|0)+16>>2]|0)+172>>2]=e;p=c[(c[((c[i>>2]&3|0)==2?i:g)+40>>2]|0)+16>>2]|0;e=c[p+172>>2]|0;p=p+176|0;f=c[p>>2]|0;c[p>>2]=f+1;c[e+(f<<2)>>2]=i;i=c[(c[((c[i>>2]&3|0)==2?i:g)+40>>2]|0)+16>>2]|0;c[(c[i+172>>2]|0)+(c[i+176>>2]<<2)>>2]=0;d=d+1|0}j=YA(a,j)|0}}else{i=c[c[e+172>>2]>>2]|0;i=UA(a,c[((c[i>>2]&3|0)==3?i:i+48|0)+40>>2]|0)|0;while(1){if(!i)break a;e=i+-48|0;f=c[((c[i>>2]&3|0)==2?i:e)+40>>2]|0;if((f|0)!=(b|0)?(dP(f)|0)==(b|0):0){e=c[((c[i>>2]&3|0)==2?i:e)+40>>2]|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];nj(j,a,e,n,d);e=j;f=c[e+4>>2]|0;g=m;c[g>>2]=c[e>>2];c[g+4>>2]=f;uh(i);g=i+48|0;f=c[(c[((c[i>>2]&3|0)==3?i:g)+40>>2]|0)+16>>2]|0;e=c[f+180>>2]|0;f=(c[f+184>>2]<<2)+8|0;if(!e)e=IK(f)|0;else e=KK(e,f)|0;c[(c[(c[((c[i>>2]&3|0)==3?i:g)+40>>2]|0)+16>>2]|0)+180>>2]=e;f=c[(c[((c[i>>2]&3|0)==3?i:g)+40>>2]|0)+16>>2]|0;k=c[f+180>>2]|0;f=f+184|0;p=c[f>>2]|0;c[f>>2]=p+1;c[k+(p<<2)>>2]=i;p=c[(c[((c[i>>2]&3|0)==3?i:g)+40>>2]|0)+16>>2]|0;c[(c[p+180>>2]|0)+(c[p+184>>2]<<2)>>2]=0;d=d+1|0}i=WA(a,i)|0}}}while(0);l=o;return}function mj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0;oQ(b,c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&1);e=c[b+16>>2]|0;h[e+24>>3]=+(c[d+4>>2]|0);f=+(c[d>>2]|0)+ +h[e+88>>3];h[e+16>>3]=f;f=f+ +h[e+96>>3];c[d>>2]=~~(f+ +(c[(c[(uC(b)|0)+16>>2]|0)+248>>2]|0));e=d;b=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=b;return}function nj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=l;l=l+16|0;h=i;b=dg(b)|0;g=dP(d)|0;if((g|0)!=(d|0))mh(g,d);j=c[d+16>>2]|0;c[j+236>>2]=f;g=c[(c[g+16>>2]|0)+232>>2]|0;c[j+232>>2]=g;c[(c[(c[(c[b+16>>2]|0)+196>>2]|0)+(g<<6)+4>>2]|0)+(f<<2)>>2]=d;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];mj(a,d,h);l=i;return}function oj(a){a=a|0;var d=0.0,e=0.0,f=0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0.0;m=c[(c[(dg(a)|0)+16>>2]|0)+196>>2]|0;if((dg(a)|0)==(a|0))j=8.0;else j=+(XO(a,c[47198]|0,8,0)|0);l=a+16|0;g=c[l>>2]|0;f=0;k=1;e=+h[g+120>>3];d=+h[g+128>>3];while(1){if((k|0)>(c[g+180>>2]|0))break;i=c[(c[g+184>>2]|0)+(k<<2)>>2]|0;f=oj(i)|0|f;i=c[i+16>>2]|0;g=c[l>>2]|0;if((b[i+238>>1]|0)==(b[g+238>>1]|0)){n=j+ +h[i+120>>3];e=e>n?e:n}if((b[i+236>>1]|0)==(b[g+236>>1]|0)){n=j+ +h[i+128>>3];d=d>n?d:n}k=k+1|0}if((dg(a)|0)!=(a|0)?(c[(c[l>>2]|0)+12>>2]|0)!=0:0)if(!(c[(c[(vC(a)|0)+16>>2]|0)+116>>2]&1)){k=c[l>>2]|0;f=1;e=e+ +h[k+56>>3];d=d+ +h[k+88>>3]}else f=1;k=c[l>>2]|0;h[k+120>>3]=e;h[k+128>>3]=d;if((dg(a)|0)!=(a|0)){l=c[l>>2]|0;a=m+(b[l+236>>1]<<6)+24|0;n=+h[a>>3];h[a>>3]=n>d?n:d;m=m+(b[l+238>>1]<<6)+16|0;n=+h[m>>3];h[m>>3]=n>e?n:e}return f|0}function pj(a,d){a=a|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0.0,q=0.0;o=c[(c[(dg(a)|0)+16>>2]|0)+196>>2]|0;if((dg(a)|0)==(a|0))e=0;else e=XO(a,c[47198]|0,8,0)|0;l=a+16|0;i=c[l>>2]|0;m=e+d|0;k=+(e|0);j=1;f=+h[i+128>>3];g=+h[i+120>>3];e=i;while(1){if((j|0)>(c[e+180>>2]|0))break;i=c[(c[e+184>>2]|0)+(j<<2)>>2]|0;pj(i,m);i=c[i+16>>2]|0;e=c[l>>2]|0;if((b[i+238>>1]|0)==(b[e+238>>1]|0)){q=k+ +h[i+120>>3];g=g>q?g:q}if((b[i+236>>1]|0)==(b[e+236>>1]|0)){q=k+ +h[i+128>>3];f=f>q?f:q}j=j+1|0}h[e+120>>3]=g;h[e+128>>3]=f;if(((dg(a)|0)!=(a|0)?(n=c[l>>2]|0,c[n+12>>2]|0):0)?(p=+h[n+48+((+h[n+104>>3]>+h[n+72>>3]?3:1)<<4)+8>>3]-(f+(g+(+h[(c[(c[c[o+(b[n+236>>1]<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]-+h[(c[(c[c[o+(b[n+238>>1]<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]))),p>0.0):0)qj(a,~~p,d);if((dg(a)|0)!=(a|0)){n=c[l>>2]|0;m=o+(b[n+236>>1]<<6)+24|0;q=+h[m>>3];p=+h[n+128>>3];h[m>>3]=q>p?q:p;o=o+(b[n+238>>1]<<6)+16|0;p=+h[o>>3];q=+h[n+120>>3];h[o>>3]=p>q?p:q}return}function qj(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0.0,l=0,m=0,n=0.0,o=0,p=0;j=c[(dg(a)|0)+16>>2]|0;o=c[j+196>>2]|0;l=c[a+16>>2]|0;a=b[l+238>>1]|0;f=b[l+236>>1]|0;p=(d+1|0)/2|0;m=l+120|0;n=+(p|0)+ +h[m>>3];i=+(e|0);e=~~(n-(+h[o+(a<<6)+16>>3]-i));l=l+128|0;i=+h[o+(f<<6)+24>>3]-i;k=+(d-p|0)+ +h[l>>3];if((e|0)>0){g=+(e|0);while(1){if((a|0)<(f|0))break;if((c[o+(a<<6)>>2]|0)>0){p=(c[(c[c[o+(a<<6)+4>>2]>>2]|0)+16>>2]|0)+24|0;h[p>>3]=g+ +h[p>>3]}a=a+-1|0}g=k+g}else g=k;a=~~(g-i);a:do if((a|0)>0){e=b[j+236>>1]|0;g=+(a|0);while(1){a=f+-1|0;if((f|0)<=(e|0))break a;if((c[o+(a<<6)>>2]|0)<=0){f=a;continue}f=(c[(c[c[o+(a<<6)+4>>2]>>2]|0)+16>>2]|0)+24|0;h[f>>3]=g+ +h[f>>3];f=a}}while(0);h[l>>3]=k;h[m>>3]=n;return}function rj(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[b+16>>2]|0;f=a[e+84>>0]|0;b=c[d+16>>2]|0;do if(f<<24>>24==(a[b+84>>0]|0)){if(+h[e+56>>3]==+h[b+56>>3]){if(!(f<<24>>24==0?1:+h[e+64>>3]==+h[b+64>>3])){b=0;break}}else if(f<<24>>24){b=0;break}if(+h[e+16>>3]==+h[b+16>>3]?+h[e+24>>3]==+h[b+24>>3]:0){b=1;break}b=(a[e+44>>0]|0)==0}else b=0;while(0);return b&1|0}function sj(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=a+16|0;d=c[j>>2]|0;b[d+236>>1]=32767;b[d+238>>1]=-1;d=0;i=gC(a)|0;while(1){e=c[j>>2]|0;if(!i)break;f=e+238|0;g=c[(c[i+16>>2]|0)+232>>2]|0;h=g&65535;if((b[f>>1]|0)<(g|0))b[f>>1]=h;e=e+236|0;if((b[e>>1]|0)>(g|0))b[e>>1]=h;if(!d)d=i;else d=(g|0)<(c[(c[d+16>>2]|0)+232>>2]|0)?i:d;i=hC(a,i)|0}c[e+264>>2]=d;return}function tj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0;b=NA(a,87246)|0;if(!b)b=2147483647;else{g=+a6(b);b=~~(g*+(qB(a)|0))}e=a+16|0;d=0;while(1){f=c[e>>2]|0;if((d|0)>=(c[f+220>>2]|0))break;c[f+192>>2]=c[(c[f+216>>2]|0)+(d<<2)>>2];sL(a,(c[f+180>>2]|0)==0&1,b)|0;d=d+1|0}return}function uj(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+16|0;g=h;f=d+16|0;if(!(NA(d,87255)|0))wj(d,e);else{i=(c[f>>2]|0)+136|0;b[i>>1]=b[i>>1]|16;vj(d,e)}if(a[195234]|0){i=c[15715]|0;e=c[f>>2]|0;f=b[e+236>>1]|0;c[g>>2]=b[e+238>>1];c[g+4>>2]=f;z4(i,87263,g)|0}l=h;return}function vj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0.0;h=l;l=l+16|0;g=h;c[46789]=0;c[g>>2]=c[4658];g=lB(87473,g,0)|0;RC(g,87502,280,1)|0;CC(g,17444,17384);xj(a);d=NA(a,87246)|0;if(!d)e=2147483647;else{i=+a6(d);e=~~(i*+(qB(a)|0))}Nj(a,0);Oj(a,g);Pj(a,g);Qj(a,g,0,0);Rj(g);f=Sj(g)|0;Tj(g);if(b|0){Hk(g);vk(g)}d=NA(a,102887)|0;if(!d)d=-1;else d=d6(d)|0;LK(g,1,e,d)|0;Uj(a,g,f);pB(g)|0;l=h;return}function wj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=l;l=l+32|0;f=g+16|0;e=g+8|0;d=g;xj(a);do if(!b){yj(a,a);Kk(a);zj(d,a);h=d;d=c[h+4>>2]|0;b=e;c[b>>2]=c[h>>2];c[b+4>>2]=d;Dl(a,0);b=0}else{Hk(a);vk(a);yj(a,a);Kk(a);zj(d,a);i=d;d=c[i+4>>2]|0;h=e;c[h>>2]=c[i>>2];c[h+4>>2]=d;Dl(a,0);h=c[a+16>>2]|0;if((c[h+220>>2]|0)<=1?(c[h+180>>2]|0)<=0:0)break;c[b+32>>2]=1;b=0}while(0);sk(a);c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];if(Aj(a,f)|0)Dl(a,0);if(!b)tj(a);else wk(a,b);Bj(a,b);Cj(a);l=g;return}function xj(d){d=d|0;var f=0,g=0,h=0;if(a[(c[(c[d+60>>2]|0)+16>>2]|0)+113>>0]&1){g=gC(d)|0;while(1){if(!g)break;f=UA(d,g)|0;while(1){if(!f)break;h=(c[f+16>>2]|0)+170|0;b[h>>1]=(e[h>>1]|0)<<1;f=WA(d,f)|0}g=hC(d,g)|0}h=(c[d+16>>2]|0)+252|0;c[h>>2]=((c[h>>2]|0)+1|0)/2|0}return}function yj(a,b){a=a|0;b=b|0;var d=0;b=MD(b)|0;while(1){if(!b)break;d=Kj(b)|0;do if(d)if((d|0)==7&(c[47182]|0)==100){Gj(a,b);break}else{Lj(a,b,d);break}else yj(a,b);while(0);b=ND(b)|0}return}function zj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=d+16|0;d=c[h>>2]|0;e=c[d+228>>2]|0;j=b+4|0;f=c[d+224>>2]|0;g=(f|0)==0;a:do if(!((e|0)==0&g)){if(!g){e=dP(f)|0;d=c[h>>2]|0;c[d+224>>2]=e;e=c[d+228>>2]|0}do if(e){d=dP(e)|0;e=c[h>>2]|0;c[e+228>>2]=d;if(d){e=d+16|0;d=c[e>>2]|0;f=(a[d+159>>0]|0)==5&1;while(1){d=c[c[d+180>>2]>>2]|0;if(!d){d=11;break}g=c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0;if((g|0)!=(dP(g)|0)){d=9;break}rk(d);d=c[e>>2]|0}if((d|0)==9)Aa(87366,87306,346,87398);else if((d|0)==11){k=f;i=c[h>>2]|0;break}}else{k=0;i=e}}else{k=0;i=d}while(0);d=c[i+224>>2]|0;if(!d){l=k;m=0}else{e=d+16|0;d=c[e>>2]|0;f=(a[d+159>>0]|0)==3&1;while(1){d=c[c[d+172>>2]>>2]|0;if(!d){l=k;m=f;break a}i=c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0;if((i|0)!=(dP(i)|0))break;rk(d);d=c[e>>2]|0}Aa(87411,87306,353,87398)}}else{l=0;m=0}while(0);c[b>>2]=m;c[j>>2]=l;return}function Aj(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;j=a+16|0;i=c[j>>2]|0;if((c[i+228>>2]|0)==0?(c[i+224>>2]|0)==0:0)d=0;else e=3;a:do if((e|0)==3){g=gC(a)|0;i=d+4|0;h=c[d>>2]&65535;d=0;while(1){if(!g)break a;if((g|0)==(dP(g)|0)){f=g+16|0;e=c[f>>2]|0;if((c[e+184>>2]|0)==0?(k=c[(c[j>>2]|0)+228>>2]|0,!((k|0)==0|(g|0)==(k|0))):0){d=kh(g,k,0)|0;e=c[d+16>>2]|0;b[e+170>>1]=c[i>>2];c[e+156>>2]=0;e=c[f>>2]|0}if((c[e+176>>2]|0)==0?(l=c[(c[j>>2]|0)+224>>2]|0,!((l|0)==0|(g|0)==(l|0))):0){d=kh(l,g,0)|0;f=c[d+16>>2]|0;b[f+170>>1]=h;c[f+156>>2]=0}}g=hC(a,g)|0}}while(0);return (d|0)!=0|0}function Bj(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=gC(d)|0;l=d+16|0;f=c[l>>2]|0;a:do if(g){b[f+236>>1]=32767;b[f+238>>1]=-1;k=(e|0)==0;while(1){if(!g)break;f=dP(g)|0;j=c[g+16>>2]|0;h=j+232|0;e=c[h>>2]|0;if((f|0)!=(g|0)&(k|(e|0)==0)){e=(c[(c[f+16>>2]|0)+232>>2]|0)+e|0;c[h>>2]=e}f=c[l>>2]|0;h=f+238|0;i=e&65535;if((b[h>>1]|0)<(e|0))b[h>>1]=i;f=f+236|0;if((b[f>>1]|0)>(e|0))b[f>>1]=i;switch(a[j+159>>0]|0){case 6:case 0:break;default:fP(g)}g=hC(d,g)|0}if((dg(d)|0)==(d|0)){if((c[47182]|0)==100)e=1;else{Fj(d);break}while(1){f=c[l>>2]|0;if((e|0)>(c[f+180>>2]|0))break a;Ej(c[(c[f+184>>2]|0)+(e<<2)>>2]|0);e=e+1|0}}}else{b[f+238>>1]=0;b[f+236>>1]=0}while(0);return}function Cj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=b+16|0;e=0;while(1){d=c[j>>2]|0;if((e|0)>=(c[d+220>>2]|0))break;i=c[(c[d+216>>2]|0)+(e<<2)>>2]|0;c[d+192>>2]=i;d=i;while(1){if(!d)break;i=d+16|0;Dj((c[i>>2]|0)+172|0);Dj((c[i>>2]|0)+180|0);i=c[i>>2]|0;a[i+157>>0]=0;d=c[i+164>>2]|0}e=e+1|0}i=gC(b)|0;while(1){if(!i)break;h=UA(b,i)|0;while(1){if(!h)break;f=h+16|0;d=c[f>>2]|0;g=c[d+172>>2]|0;if((g|0)!=0?(k=g+16|0,(h|0)==(c[(c[k>>2]|0)+116>>2]|0)):0){d=gC(b)|0;while(1){if(!d)break;e=UA(b,d)|0;while(1){if(!e)break;if((h|0)!=(e|0)?(l=(c[e+16>>2]|0)+172|0,m=c[l>>2]|0,(m|0)!=0&(g|0)==(m|0)):0)c[l>>2]=0;e=WA(b,e)|0}d=hC(b,d)|0}l6(c[k>>2]|0);l6(g);d=c[f>>2]|0}c[d+172>>2]=0;h=WA(b,h)|0}i=hC(b,i)|0}l6(c[(c[j>>2]|0)+216>>2]|0);m=c[j>>2]|0;c[m+216>>2]=0;c[m+220>>2]=0;return}function Dj(a){a=a|0;var b=0,d=0;d=a+4|0;b=c[d>>2]|0;while(1){if((b|0)<=-1)break;c[(c[a>>2]|0)+(b<<2)>>2]=0;b=b+-1|0}c[d>>2]=0;return}function Ej(a){a=a|0;var d=0,f=0,g=0;d=a+16|0;f=c[d>>2]|0;g=c[(c[(c[f+264>>2]|0)+16>>2]|0)+232>>2]|0;a=f+236|0;b[a>>1]=(e[a>>1]|0)+g;a=f+238|0;b[a>>1]=(e[a>>1]|0)+g;a=1;while(1){if((a|0)>(c[f+180>>2]|0))break;Ej(c[(c[f+184>>2]|0)+(a<<2)>>2]|0);a=a+1|0;f=c[d>>2]|0}return}function Fj(b){b=b|0;var d=0;d=MD(dg(b)|0)|0;while(1){if(!d)break;if((a[(c[d+16>>2]|0)+274>>0]|0)==7)Gj(b,d);d=ND(d)|0}return}function Gj(a,b){a=a|0;b=b|0;var d=0;d=(c[b+16>>2]|0)+200|0;do if((c[d>>2]|0)==0?(c[d>>2]=a,Hj(a,b),gC(b)|0):0){Ij(a,b);if((c[47182]|0)==100){wj(b,0);Jj(b);break}else{sj(b);break}}while(0);return}function Hj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=b+16|0;g=gC(d)|0;while(1){if(!g)break;i=hC(d,g)|0;j=g+16|0;if(!(a[(c[j>>2]|0)+159>>0]|0))f=1;else{tC(d,g)|0;g=i;continue}while(1){e=c[h>>2]|0;b=c[e+180>>2]|0;if((f|0)>=(b|0))break;if(EC(c[(c[e+184>>2]|0)+(f<<2)>>2]|0,g)|0){k=7;break}f=f+1|0}if((k|0)==7){k=0;b=c[(c[h>>2]|0)+180>>2]|0}if((f|0)<(b|0))tC(d,g)|0;c[(c[j>>2]|0)+212>>2]=0;g=i}e=gC(d)|0;while(1){if(!e)break;b=UA(dg(d)|0,e)|0;while(1){if(!b)break;if(EC(d,c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0)jB(d,b,1)|0;b=WA(dg(d)|0,b)|0}e=hC(d,e)|0}return}function Ij(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;e=a+16|0;d=c[e>>2]|0;g=d+180|0;a=c[g>>2]|0;f=a+1|0;c[g>>2]=f;d=c[d+184>>2]|0;a=a+2|0;if(!d)a=HK(a<<2)|0;else a=JK(d,a,4,f)|0;c[(c[e>>2]|0)+184>>2]=a;c[a+(f<<2)>>2]=b;sK(b);return}function Jj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;g=c[b+16>>2]|0;d=g+192|0;h=0;while(1){d=c[d>>2]|0;if(!d)break;f=c[d+16>>2]|0;if(!(c[f+232>>2]|0))e=(a[f+156>>0]|0)==0?d:h;else e=h;d=f+164|0;h=e}if(!h)Aa(87291,87306,238,87313);c[g+264>>2]=h;d=gC(b)|0;while(1){if(!d){d=13;break}e=d+16|0;if(!((d|0)==(h|0)?1:(c[(c[e>>2]|0)+216>>2]|0)<2)){d=11;break}eP(d,h)|0;a[(c[e>>2]|0)+159>>0]=7;d=hC(b,d)|0}if((d|0)==11)Aa(87328,87306,242,87313);else if((d|0)==13)return}function Kj(b){b=b|0;var d=0;if(!(Mj(b)|0)){d=nP(NA(b,87443)|0,17396,17420)|0;a[(c[b+16>>2]|0)+274>>0]=d;b=d}else b=7;return b|0}function Lj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;g=gC(d)|0;a:do if(g|0){j=e&255;i=g+16|0;f=g;h=j;while(1){a[(c[f+16>>2]|0)+159>>0]=h;f=hC(d,f)|0;if(!f)break;eP(g,f)|0;h=a[(c[i>>2]|0)+159>>0]|0}b=b+16|0;switch(e|0){case 3:case 2:{f=c[b>>2]|0;h=c[f+224>>2]|0;if(h){g=eP(h,g)|0;f=c[b>>2]|0}c[f+224>>2]=g;break}case 5:case 4:{f=c[b>>2]|0;h=c[f+228>>2]|0;if(h){g=eP(h,g)|0;f=c[b>>2]|0}c[f+228>>2]=g;break}default:break a}switch(e|0){case 3:{f=f+224|0;break}case 5:{f=f+228|0;break}default:break a}a[(c[(c[f>>2]|0)+16>>2]|0)+159>>0]=j}while(0);return}function Mj(a){a=a|0;return (h2(HB(a)|0,108307,7)|0)==0|0}function Nj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;g=m;if(!(gk(b)|0)){j=b+16|0;do if(DP(b)|0)if(!d){c[(c[j>>2]|0)+204>>2]=0;d=b;break}else{c[(c[j>>2]|0)+204>>2]=(c[(c[d+16>>2]|0)+204>>2]|0)+1;hk(b,d);d=b;break}while(0);e=MD(b)|0;while(1){if(!e)break;Nj(e,d);e=ND(e)|0}a:do if(DP(b)|0){e=gC(b)|0;while(1){if(!e)break a;f=(c[e+16>>2]|0)+212|0;if(!(c[f>>2]|0))c[f>>2]=b;e=hC(b,e)|0}}while(0);d=d+16|0;switch(ik(b)|0){case 3:{a[(c[d>>2]|0)+241>>0]=1;k=19;break}case 2:{k=19;break}case 5:{a[(c[d>>2]|0)+242>>0]=1;k=21;break}case 4:{k=21;break}case 1:{jk(b)|0;break}case 6:break;default:{e=HB(b)|0;f=NA(b,87443)|0;c[g>>2]=e;c[g+4>>2]=f;dA(0,87626,g)|0}}if((k|0)==19){k=jk(b)|0;k=kk(k,c[(c[d>>2]|0)+208>>2]|0)|0;c[(c[d>>2]|0)+208>>2]=k}else if((k|0)==21){k=jk(b)|0;k=kk(k,c[(c[d>>2]|0)+212>>2]|0)|0;c[(c[d>>2]|0)+212>>2]=k}if((DP(b)|0?(h=c[j>>2]|0,i=c[h+208>>2]|0,i|0):0)?(i|0)==(c[h+212>>2]|0):0){i=jk(b)|0;k=c[j>>2]|0;c[k+208>>2]=i;c[k+212>>2]=i}}l=m;return}function Oj(a,b){a=a|0;b=b|0;var d=0,e=0;c[46789]=0;d=gC(a)|0;while(1){if(!d)break;if((Vj(d)|0)==(d|0)){e=Yj(b,HB(d)|0)|0;c[(c[d+16>>2]|0)+148>>2]=e}d=hC(a,d)|0}d=gC(a)|0;while(1){if(!d)break;b=d+16|0;if(!(c[(c[b>>2]|0)+148>>2]|0)){e=c[(c[(Vj(d)|0)+16>>2]|0)+148>>2]|0;c[(c[b>>2]|0)+148>>2]=e}d=hC(a,d)|0}return}function Pj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=gC(a)|0;while(1){if(!h)break;d=c[(c[h+16>>2]|0)+148>>2]|0;i=UA(a,h)|0;while(1){if(!i)break;do if((bk(i)|0)==0?(j=i+-48|0,k=c[(c[(Vj(c[((c[i>>2]&3|0)==2?i:j)+40>>2]|0)|0)+16>>2]|0)+148>>2]|0,(d|0)!=(k|0)):0){f=c[i>>2]&3;g=i+48|0;e=((f|0)==3?i:g)+40|0;f=c[(c[(c[((f|0)==2?i:j)+40>>2]|0)+16>>2]|0)+212>>2]|0;if(!(ck(i)|0)){if((ak(c[(c[(c[e>>2]|0)+16>>2]|0)+212>>2]|0)|0)==0?(ak(f)|0)==0:0){dk(b,d,k,i);break}ek(b,d,k,i);break}else{f=Vj(c[e>>2]|0)|0;e=c[i>>2]&3;if((f|0)!=(c[(c[(c[(c[(c[((e|0)==3?i:g)+40>>2]|0)+16>>2]|0)+212>>2]|0)+16>>2]|0)+212>>2]|0)?(g=Vj(c[((e|0)==2?i:j)+40>>2]|0)|0,(g|0)!=(c[(c[(c[(c[(c[((c[i>>2]&3|0)==2?i:j)+40>>2]|0)+16>>2]|0)+212>>2]|0)+16>>2]|0)+208>>2]|0)):0)e=k;else{e=d;d=k}dk(b,d,e,i);break}}while(0);i=WA(a,i)|0}h=hC(a,h)|0}return}function Qj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if((DP(a)|0)!=0?(ak(a)|0)!=0:0){i=gC(a)|0;while(1){f=(d|0)!=0;h=(e|0)!=0;if(!i)break;if(!(XA(a,i)|0)){g=c[(c[(Vj(i)|0)+16>>2]|0)+148>>2]|0;if(!f)d=Yj(b,87524)|0;fB(b,d,g,0,1)|0}if(!(UA(a,i)|0)){f=c[(c[(Vj(i)|0)+16>>2]|0)+148>>2]|0;if(!h)e=Yj(b,87529)|0;fB(b,f,e,0,1)|0}i=hC(a,i)|0}if(h&f){$j(fB(b,d,e,0,1)|0,0,1e3);f=d}else f=d}else f=d;d=MD(a)|0;while(1){if(!d)break;Qj(d,b,f,e);d=ND(d)|0}return}function Rj(b){b=b|0;var d=0,e=0;d=gC(b)|0;while(1){if(!d)break;e=c[d+16>>2]|0;a[e+158>>0]=0;a[e+157>>0]=0;d=hC(b,d)|0}d=gC(b)|0;while(1){if(!d)break;Zj(b,d);d=hC(b,d)|0}return}function Sj(a){a=a|0;var b=0,d=0,e=0,f=0;b=gC(a)|0;while(1){if(!b)break;c[(c[b+16>>2]|0)+128>>2]=0;b=hC(a,b)|0}b=0;e=gC(a)|0;while(1){if(!e)break;d=b+1|0;if(!(c[(c[e+16>>2]|0)+128>>2]|0)){Xj(a,e,d);b=d}e=hC(a,e)|0}a:do if((b|0)>1){f=Yj(a,87518)|0;d=1;e=gC(a)|0;while(1){if(!e)break a;if((c[(c[e+16>>2]|0)+128>>2]|0)==(d|0)){fB(a,f,e,0,1)|0;d=d+1|0}e=hC(a,e)|0}}while(0);return b|0}function Tj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;g=gC(a)|0;while(1){if(!g)break;h=g+16|0;f=UA(a,g)|0;while(1){if(!f)break;b=c[h>>2]|0;d=c[b+180>>2]|0;b=(c[b+184>>2]<<2)+8|0;if(!d)b=IK(b)|0;else b=KK(d,b)|0;d=c[h>>2]|0;c[d+180>>2]=b;d=d+184|0;e=c[d>>2]|0;c[d>>2]=e+1;c[b+(e<<2)>>2]=f;e=c[h>>2]|0;c[(c[e+180>>2]|0)+(c[e+184>>2]<<2)>>2]=0;e=f+-48|0;d=c[(c[((c[f>>2]&3|0)==2?f:e)+40>>2]|0)+16>>2]|0;b=c[d+172>>2]|0;d=(c[d+176>>2]<<2)+8|0;if(!b)b=IK(d)|0;else b=KK(b,d)|0;c[(c[(c[((c[f>>2]&3|0)==2?f:e)+40>>2]|0)+16>>2]|0)+172>>2]=b;i=c[(c[((c[f>>2]&3|0)==2?f:e)+40>>2]|0)+16>>2]|0;b=c[i+172>>2]|0;i=i+176|0;d=c[i>>2]|0;c[i>>2]=d+1;c[b+(d<<2)>>2]=f;e=c[(c[((c[f>>2]&3|0)==2?f:e)+40>>2]|0)+16>>2]|0;c[(c[e+172>>2]|0)+(c[e+176>>2]<<2)>>2]=0;f=WA(a,f)|0}g=hC(a,g)|0}return}function Uj(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;n=a+16|0;p=c[n>>2]|0;b[p+236>>1]=32767;b[p+238>>1]=-1;a:do if((f|0)>1){h=HK((f<<2)+4|0)|0;g=f+1|0;f=1;while(1){if((f|0)==(g|0)){m=h;o=h;break a}c[h+(f<<2)>>2]=32767;f=f+1|0}}else{m=0;o=0}while(0);p=(m|0)!=0;h=gC(a)|0;while(1){if(!h)break;i=c[(c[(c[(Vj(h)|0)+16>>2]|0)+148>>2]|0)+16>>2]|0;j=c[i+232>>2]|0;k=c[h+16>>2]|0;c[k+232>>2]=j;f=c[n>>2]|0;g=f+238|0;l=j&65535;if((b[g>>1]|0)<(j|0))b[g>>1]=l;f=f+236|0;if((b[f>>1]|0)>(j|0))b[f>>1]=l;if(p){l=c[i+128>>2]|0;c[k+128>>2]=l;l=m+(l<<2)|0;k=c[l>>2]|0;c[l>>2]=(k|0)<(j|0)?k:j}h=hC(a,h)|0}b:do if(!p){m=b[(c[n>>2]|0)+236>>1]|0;g=m<<16>>16;if(m<<16>>16>0){f=gC(a)|0;while(1){if(!f)break;m=(c[f+16>>2]|0)+232|0;c[m>>2]=(c[m>>2]|0)-g;f=hC(a,f)|0}f=c[n>>2]|0;n=f+236|0;b[n>>1]=(e[n>>1]|0)-g;f=f+238|0;b[f>>1]=(e[f>>1]|0)-g;f=0}else f=0}else{f=gC(a)|0;while(1){if(!f){f=1;break b}l=c[f+16>>2]|0;n=l+232|0;c[n>>2]=(c[n>>2]|0)-(c[m+(c[l+128>>2]<<2)>>2]|0);f=hC(a,f)|0}}while(0);Wj(a,f);i=gC(d)|0;while(1){if(!i)break;g=i+16|0;f=c[g>>2]|0;h=c[f+172>>2]|0;if(h){l6(h);f=c[g>>2]|0}f=c[f+180>>2]|0;if(f|0)l6(f);i=hC(d,i)|0}l6(c[(c[(gC(a)|0)+16>>2]|0)+112>>2]|0);f=gC(a)|0;while(1){if(!f)break;c[(c[f+16>>2]|0)+112>>2]=0;f=hC(a,f)|0}if(p)l6(o);return}function Vj(a){a=a|0;var b=0,d=0,e=0;b=a+16|0;d=(c[b>>2]|0)+152|0;e=c[d>>2]|0;if(e){if((e|0)!=(a|0)){e=Vj(e)|0;c[(c[b>>2]|0)+152>>2]=e;return e|0}}else c[d>>2]=a;return a|0}function Wj(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=a+16|0;e=1;while(1){f=c[j>>2]|0;if((e|0)>(c[f+180>>2]|0))break;Wj(c[(c[f+184>>2]|0)+(e<<2)>>2]|0,0);e=e+1|0}if((d|0)!=0|(c[f+200>>2]|0)!=0){b[f+236>>1]=32767;b[f+238>>1]=-1;e=0;i=gC(a)|0;while(1){d=c[j>>2]|0;if(!i)break;g=c[(c[i+16>>2]|0)+232>>2]|0;f=d+238|0;h=g&65535;if((b[f>>1]|0)<(g|0))b[f>>1]=h;d=d+236|0;if((b[d>>1]|0)>(g|0)){b[d>>1]=h;e=i}i=hC(a,i)|0}c[d+264>>2]=e}return}function Xj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(c[b+16>>2]|0)+128|0;a:do if(!(c[e>>2]|0)){c[e>>2]=d;e=UA(a,b)|0;while(1){if(!e)break;Xj(a,c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,d);e=WA(a,e)|0}e=XA(a,b)|0;while(1){if(!e)break a;Xj(a,c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0,d);e=YA(a,e)|0}}while(0);return}function Yj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=qC(a,b,1)|0;b=f+16|0;c[(c[b>>2]|0)+176>>2]=0;e=HK(20)|0;d=c[b>>2]|0;c[d+172>>2]=e;c[d+184>>2]=0;d=HK(20)|0;b=c[b>>2]|0;c[b+180>>2]=d;d=c[46789]|0;e=b+168|0;if(!d){c[e>>2]=0;c[(c[a+16>>2]|0)+192>>2]=f}else{c[e>>2]=d;c[(c[d+16>>2]|0)+164>>2]=f}c[46789]=f;c[b+164>>2]=0;return f|0}function Zj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=d+16|0;e=c[h>>2]|0;f=e+157|0;if(!(a[f>>0]|0)){a[f>>0]=1;a[e+158>>0]=1;d=UA(b,d)|0;while(1){if(!d)break;e=WA(b,d)|0;f=c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0;g=c[f+16>>2]|0;if(a[g+158>>0]|0){_j(b,d);d=e;continue}if(a[g+157>>0]|0){d=e;continue}Zj(b,f);d=e}a[(c[h>>2]|0)+158>>0]=0}return}function _j(a,b){a=a|0;b=b|0;var d=0,f=0,g=0;d=c[b>>2]&3;g=b+-48|0;f=b+48|0;d=fB(a,c[((d|0)==2?b:g)+40>>2]|0,c[((d|0)==3?b:f)+40>>2]|0,0,0)|0;if(!d){d=c[b>>2]&3;d=fB(a,c[((d|0)==2?b:g)+40>>2]|0,c[((d|0)==3?b:f)+40>>2]|0,0,1)|0}g=c[b+16>>2]|0;$j(d,e[g+170>>1]|0,c[g+156>>2]|0);tC(a,b)|0;return}function $j(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0;a=c[a+16>>2]|0;g=a+170|0;h=e[g>>1]|0;b[g>>1]=(h|0)>(d|0)?h:d;d=a+156|0;c[d>>2]=(c[d>>2]|0)+f;return}function ak(a){a=a|0;return (cP(NA(a,87534)|0,0)|0)&255|0}function bk(b){b=b|0;var d=0,e=0;d=c[47258]|0;if((((d|0)!=0?(e=OA(b,d)|0,(e|0)!=0):0)?(a[e>>0]|0)!=0:0)?(bP(e)|0)<<24>>24==0:0)b=1;else b=0;return b|0}function ck(a){a=a|0;var b=0,d=0;d=c[a>>2]&3;b=c[(c[(c[((d|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0;a=c[(c[(c[((d|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0;if((b|0)==(a|0))return 1;else{d=fk(b,a)|0;return ((d|0)==(b|0)|(d|0)==(a|0))&1|0}return 0}function dk(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+16|0;h=j;g=fB(a,b,d,0,0)|0;if(!g){g=fB(a,d,b,0,0)|0;if(!g){g=fB(a,b,d,0,1)|0;if(!g){b=HB(b)|0;f=HB(d)|0;c[h>>2]=b;c[h+4>>2]=f;dA(1,87551,h)|0}else i=4}else i=4}else i=4;if((i|0)==4){i=c[f+16>>2]|0;$j(g,e[i+170>>1]|0,c[i+156>>2]|0)}l=j;return}function ek(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+112|0;j=m;i=m+4|0;h=XA(a,d)|0;while(1){if(!h){k=6;break}n=UA(a,c[((c[h>>2]&3|0)==3?h:h+48|0)+40>>2]|0)|0;if(n|0?(c[((c[n>>2]&3|0)==2?n:n+-48|0)+40>>2]|0)==(f|0):0)break;h=YA(a,h)|0}if((k|0)==6){n=c[46790]|0;c[46790]=n+1;c[j>>2]=n;i2(i,87542,j)|0;i=Yj(a,i)|0;n=fB(a,i,d,0,1)|0;i=fB(a,i,f,0,1)|0;f=c[g+16>>2]|0;k=f+156|0;n=(c[n+16>>2]|0)+156|0;c[n>>2]=(c[n>>2]|0)+((c[k>>2]|0)*1e3|0);n=c[i+16>>2]|0;j=n+170|0;b[j>>1]=b[(c[((e[j>>1]|0)>(e[f+170>>1]|0)?i:g)+16>>2]|0)+170>>1]|0;n=n+156|0;c[n>>2]=(c[n>>2]|0)+(c[k>>2]|0)}l=m;return}function fk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;a:while(1){e=a+16|0;while(1){if((a|0)==(b|0))break a;f=c[e>>2]|0;d=c[b+16>>2]|0;if((c[f+204>>2]|0)>=(c[d+204>>2]|0))break;b=c[d+200>>2]|0}a=c[f+200>>2]|0}return a|0}function gk(a){a=a|0;return (gC(a)|0)==0|0}function hk(a,b){a=a|0;b=b|0;c[(c[a+16>>2]|0)+200>>2]=b;Ij(b,a);Hj(b,a);return}function ik(b){b=b|0;var c=0;b=NA(b,87443)|0;if((b|0)!=0?(a[b>>0]|0)!=0:0)if(f2(b,87453)|0)if(f2(b,87457)|0)if(f2(b,87464)|0)if(f2(b,87468)|0)if(!(f2(b,87448)|0))b=1;else c=8;else b=5;else b=4;else b=3;else b=2;else c=8;if((c|0)==8)b=6;return b|0}function jk(a){a=a|0;var b=0,c=0;c=gC(a)|0;a:do if(!c)b=0;else{b=Vj(c)|0;while(1){c=hC(a,c)|0;if(!c)break a;kk(b,c)|0}}while(0);return b|0}function kk(a,b){a=a|0;b=b|0;if(b){a=Vj(a)|0;c[(c[(Vj(b)|0)+16>>2]|0)+152>>2]=a}return a|0}function lk(a,b,d){a=a|0;b=b|0;d=d|0;RC(b,87502,c[d>>2]|0,1)|0;return}function mk(a,b,d){a=a|0;b=b|0;d=d|0;RC(b,87669,c[d+4>>2]|0,1)|0;return}function nk(a,b,d){a=a|0;b=b|0;d=d|0;RC(b,87654,c[d+8>>2]|0,1)|0;return}function ok(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+240|0;m=p+120|0;n=p;c[47262]=DA(b,2,87684,0)|0;k=DA(b,2,87693,0)|0;c[47263]=k;a:do if((k|0)!=0|(c[47262]|0)!=0){k=gC(b)|0;while(1){if(!k)break a;j=0;d=0;i=ZA(b,k)|0;while(1){if(!i){f=0;break}e=c[i>>2]|0;g=e&3;f=c[((g|0)==2?i:i+-48|0)+40>>2]|0;h=i+48|0;b:do if((f|0)!=(c[((g|0)==3?i:h)+40>>2]|0)){g=c[47262]|0;do if((f|0)==(k|0)&(g|0)!=0){f=OA(i,g)|0;if(!(a[f>>0]|0)){e=c[i>>2]|0;break}else{e=j;d=pk(m,d,k,i,f)|0;break b}}while(0);f=c[47263]|0;if((f|0?(c[((e&3|0)==3?i:h)+40>>2]|0)==(k|0):0)?(o=OA(i,f)|0,(a[o>>0]|0)!=0):0)e=pk(n,j,k,i,o)|0;else e=j}else e=j;while(0);j=e;i=_A(b,i,k)|0}while(1){if((f|0)>=(d|0)){e=0;break}e=m+(f*24|0)+4|0;if((c[m+(f*24|0)+8>>2]|0)>1)qk(k,e);e=c[e>>2]|0;if(e|0)l6(e);f=f+1|0}while(1){if((e|0)>=(j|0))break;d=n+(e*24|0)+4|0;if((c[n+(e*24|0)+8>>2]|0)>1)qk(k,d);d=c[d>>2]|0;if(d|0)l6(d);e=e+1|0}k=hC(b,k)|0}}while(0);l=p;return}function pk(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;s=l;l=l+16|0;n=s;p=s+12|0;q=s+8|0;r=0;while(1){m=b+(r*24|0)|0;if((r|0)>=(d|0)){o=10;break}j=c[m>>2]|0;if((a[j>>0]|0)==(a[g>>0]|0)?(f2(j,g)|0)==0:0){o=5;break}r=r+1|0}do if((o|0)==5){k=b+(r*24|0)+4|0;m=b+(r*24|0)+8|0;j=c[k>>2]|0;if(!j)j=IK((c[m>>2]<<2)+8|0)|0;else j=KK(j,(c[m>>2]<<2)+8|0)|0;c[k>>2]=j;n=c[m>>2]|0;o=n+1|0;c[m>>2]=o;c[j+(n<<2)>>2]=f;c[(c[k>>2]|0)+(o<<2)>>2]=0;o=13}else if((o|0)==10){j=b+(r*24|0)+4|0;k=b+(r*24|0)+8|0;if((d|0)>4){b=HB(e)|0;c[n>>2]=5;c[n+4>>2]=b;dA(1,87702,n)|0;break}else{c[k>>2]=0;t=HK(8)|0;c[j>>2]=t;n=c[k>>2]|0;o=n+1|0;c[k>>2]=o;c[t+(n<<2)>>2]=f;c[(c[j>>2]|0)+(o<<2)>>2]=0;c[m>>2]=g;c[b+(r*24|0)+12>>2]=0;h[b+(r*24|0)+16>>3]=0.0;d=d+1|0;o=13;break}}while(0);if((o|0)==13){FH(f,p,q);j=(c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0)==(e|0)?c[q>>2]|0:c[p>>2]|0;if(j){q=b+(r*24|0)+12|0;t=c[q>>2]|0;c[q>>2]=t+1;if(!t)i=+JH(f,j);else i=0.0;h[b+(r*24|0)+16>>3]=i}}l=s;return d|0}function qk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0;x=l;l=l+80|0;t=x+68|0;u=x+64|0;s=x;v=d+4|0;m=c[v>>2]|0;w=b+16|0;n=c[w>>2]|0;q=+h[n+16>>3];r=+h[n+24>>3];j=0;o=0.0;p=0.0;while(1){if((j|0)>=(m|0))break;f=c[(c[d>>2]|0)+(j<<2)>>2]|0;i=c[f>>2]&3;e=c[((i|0)==2?f:f+-48|0)+40>>2]|0;if((e|0)==(b|0))e=c[((i|0)==3?f:f+48|0)+40>>2]|0;i=c[e+16>>2]|0;y=+h[i+16>>3]-q;g=+h[i+24>>3]-r;k=+c2(y,g);j=j+1|0;o=o+y/k;p=p+g/k}k=+c2(o,p);g=+h[n+88>>3]+ +h[n+96>>3];y=+h[n+80>>3];n=g>y+ +(c[(c[(uC(b)|0)+16>>2]|0)+252>>2]|0);e=c[w>>2]|0;if(n)g=+h[e+88>>3]+ +h[e+96>>3];else{g=+h[e+80>>3];g=g+ +(c[(c[(uC(b)|0)+16>>2]|0)+252>>2]|0);e=c[w>>2]|0}y=o/k*g+ +h[e+16>>3];g=p/k*g+ +h[e+24>>3];h[s>>3]=q;m=s+8|0;h[m>>3]=r;h[s+16>>3]=(q*2.0+y)/3.0;h[s+24>>3]=(r*2.0+g)/3.0;h[s+32>>3]=(q+y*2.0)/3.0;h[s+40>>3]=(r+g*2.0)/3.0;h[s+48>>3]=y;h[s+56>>3]=g;_N(b,s);n=c[w>>2]|0;g=+h[s>>3]-+h[n+16>>3];k=+h[m>>3]-+h[n+24>>3];g=+(~~(g+(g>=0.0?.5:-.5))|0);k=+(~~(k+(k>=0.0?.5:-.5))|0);y=+h[n+88>>3];s=~~((y+g)*256.0/(y+ +h[n+96>>3]))&255;n=0;while(1){if((n|0)>=(c[v>>2]|0))break;m=c[(c[d>>2]|0)+(n<<2)>>2]|0;FH(m,t,u);while(1){if(!m)break;else f=m;while(1){if(!f){i=m;break}e=c[f>>2]|0;i=f+-48|0;j=f+16|0;if((c[((e&3|0)==2?f:i)+40>>2]|0)==(b|0)){e=c[j>>2]|0;h[e+56>>3]=g;h[e+64>>3]=k;h[e+72>>3]=0.0;c[e+80>>2]=0;a[e+84>>0]=1;a[e+85>>0]=0;a[e+86>>0]=0;a[e+87>>0]=0;a[e+88>>0]=s;a[e+89>>0]=0;c[e+92>>2]=0;e=c[f>>2]|0}if((c[((e&3|0)==3?f:f+48|0)+40>>2]|0)==(b|0)){e=c[j>>2]|0;h[e+16>>3]=g;h[e+24>>3]=k;h[e+32>>3]=0.0;c[e+40>>2]=0;a[e+44>>0]=1;a[e+45>>0]=0;a[e+46>>0]=0;a[e+47>>0]=0;a[e+48>>0]=s;a[e+49>>0]=0;c[e+52>>2]=0}if((a[(c[j>>2]|0)+112>>0]|0)!=1){f=0;continue}e=c[(c[((c[f>>2]&3|0)==2?f:i)+40>>2]|0)+16>>2]|0;if((a[e+156>>0]|0)!=1){f=0;continue}if((c[e+184>>2]|0)!=1){f=0;continue}f=c[c[e+180>>2]>>2]|0}while(1){if(!i)break;e=c[i>>2]|0;j=i+16|0;if((c[((e&3|0)==2?i:i+-48|0)+40>>2]|0)==(b|0)){e=c[j>>2]|0;h[e+56>>3]=g;h[e+64>>3]=k;h[e+72>>3]=0.0;c[e+80>>2]=0;a[e+84>>0]=1;a[e+85>>0]=0;a[e+86>>0]=0;a[e+87>>0]=0;a[e+88>>0]=s;a[e+89>>0]=0;c[e+92>>2]=0;e=c[i>>2]|0}f=i+48|0;if((c[((e&3|0)==3?i:f)+40>>2]|0)==(b|0)){e=c[j>>2]|0;h[e+16>>3]=g;h[e+24>>3]=k;h[e+32>>3]=0.0;c[e+40>>2]=0;a[e+44>>0]=1;a[e+45>>0]=0;a[e+46>>0]=0;a[e+47>>0]=0;a[e+48>>0]=s;a[e+49>>0]=0;c[e+52>>2]=0}if((a[(c[j>>2]|0)+112>>0]|0)!=1){i=0;continue}e=c[(c[((c[i>>2]&3|0)==3?i:f)+40>>2]|0)+16>>2]|0;if((a[e+156>>0]|0)!=1){i=0;continue}if((c[e+176>>2]|0)!=1){i=0;continue}i=c[c[e+172>>2]>>2]|0}m=c[(c[m+16>>2]|0)+172>>2]|0}n=n+1|0}a[(c[w>>2]|0)+145>>0]=1;l=x;return}function rk(a){a=a|0;var b=0,d=0,e=0;fh(a);b=c[a>>2]&3;d=a+-48|0;e=a+48|0;b=ah(c[((b|0)==2?a:d)+40>>2]|0,c[((b|0)==3?a:e)+40>>2]|0)|0;if(!b){b=c[a>>2]&3;kh(c[((b|0)==2?a:d)+40>>2]|0,c[((b|0)==3?a:e)+40>>2]|0,a)|0}else sh(a,b);return}function sk(b){b=b|0;var d=0,e=0,f=0,g=0;f=b+16|0;e=0;while(1){b=c[f>>2]|0;if((e|0)>=(c[b+220>>2]|0))break;d=c[(c[b+216>>2]|0)+(e<<2)>>2]|0;c[b+192>>2]=d;b=d;d=b;while(1){if(!d)break;g=c[d+16>>2]|0;a[g+157>>0]=0;d=c[g+164>>2]|0}while(1){if(!b)break;tk(b);b=c[(c[b+16>>2]|0)+164>>2]|0}e=e+1|0}return}function tk(b){b=b|0;var d=0,e=0,f=0,g=0;g=b+16|0;d=c[g>>2]|0;b=d+157|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[d+158>>0]=1;b=0;while(1){f=c[(c[d+180>>2]|0)+(b<<2)>>2]|0;if(!f)break;d=c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0;e=c[d+16>>2]|0;if(!(a[e+158>>0]|0)){if(!(a[e+157>>0]|0))tk(d)}else{rk(f);b=b+-1|0}b=b+1|0;d=c[g>>2]|0}a[d+158>>0]=0}return}function uk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;e=gC(a)|0;b=0;while(1){if(!e)break;d=UA(a,e)|0;while(1){if(!d)break;g=c[d>>2]&3;h=c[(c[(c[((g|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0;g=c[(c[(c[((g|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0;f=h-g|0;d=WA(a,d)|0;b=((h|0)==(g|0)?0:((f|0)>-1?f:0-f|0)+-1|0)+b|0}e=hC(a,e)|0}return b|0}function vk(b){b=b|0;var d=0,e=0,f=0,g=0;e=gC(b)|0;while(1){if(!e)break;g=c[e+16>>2]|0;f=c[g+176>>2]|0;g=g+172|0;d=0;while(1){if((d|0)>=(f|0))break;a[(c[(c[(c[g>>2]|0)+(d<<2)>>2]|0)+16>>2]|0)+112>>0]=0;d=d+1|0}e=hC(b,e)|0}return}function wk(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+16|0;p=r;k=c[d+24>>2]|0;xk(b);m=(k|0)==-1;n=d+8|0;j=m^1;o=c[15715]|0;g=1797693134862315708145274.0e284;i=0;while(1){if(!(m|(i|0)<(k|0)))break;e=gC(b)|0;while(1){if(!e)break;c[(c[e+16>>2]|0)+232>>2]=0;e=hC(b,e)|0}tj(b);f=+yk(b);h[n>>3]=f;if(a[195234]|0){h[p>>3]=f;z4(o,87754,p)|0;f=+h[n>>3]}if(!(!(f<=+h[d>>3])&(!(g<=f)|j))){q=9;break}zk(b);g=f;i=i+1|0}if((q|0)==9){q=d+20|0;c[d+16>>2]=c[q>>2];c[q>>2]=i}tj(b);Ak(b);Bk();h[n>>3]=+yk(b);l=r;return}function xk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0;c[46794]=IK((qB(a)|0)*24|0)|0;c[46793]=0;b=gC(a)|0;while(1){if(!b)break;c[(c[b+16>>2]|0)+120>>2]=-1;b=hC(a,b)|0}l=gC(a)|0;while(1){if(!l)break;f=l+16|0;do if(!(c[(c[f>>2]|0)+216>>2]|0)){j=HK(4)|0;i=c[46794]|0;k=c[46793]|0;c[i+(k*24|0)>>2]=j;c[j>>2]=l;c[i+(k*24|0)+4>>2]=1;j=c[f>>2]|0;h[i+(k*24|0)+8>>3]=+h[j+32>>3];h[i+(k*24|0)+16>>3]=+h[j+40>>3];c[j+120>>2]=k;c[46793]=k+1}else{g=dP(l)|0;i=g+16|0;b=c[i>>2]|0;d=c[b+120>>2]|0;if((d|0)>-1){j=c[46794]|0;i=c[j+(d*24|0)>>2]|0;g=j+(d*24|0)+4|0;k=c[g>>2]|0;c[g>>2]=k+1;c[i+(k<<2)>>2]=l;k=c[f>>2]|0;i=j+(d*24|0)+8|0;h[i>>3]=+h[k+32>>3]+ +h[i>>3];j=j+(d*24|0)+16|0;m=+h[j>>3];n=+h[k+40>>3];h[j>>3]=m>2]=d;break}d=HK(c[b+216>>2]<<2)|0;j=c[46794]|0;k=c[46793]|0;b=j+(k*24|0)|0;c[b>>2]=d;c[d>>2]=g;d=j+(k*24|0)+4|0;e=j+(k*24|0)+8|0;if((g|0)==(l|0)){c[d>>2]=1;d=c[i>>2]|0;h[e>>3]=+h[d+32>>3];e=c[f>>2]|0;b=e}else{c[(c[b>>2]|0)+4>>2]=l;c[d>>2]=2;d=c[i>>2]|0;i=c[f>>2]|0;h[e>>3]=+h[d+32>>3]+ +h[i+32>>3];b=c[(+h[d+40>>3]<+h[i+40>>3]?l:g)+16>>2]|0;e=i}h[j+(k*24|0)+16>>3]=+h[b+40>>3];c[d+120>>2]=k;c[e+120>>2]=k;c[46793]=k+1}while(0);l=hC(a,l)|0}return}function yk(a){a=a|0;var b=0.0,d=0.0,e=0,f=0,g=0,i=0.0,j=0.0;Ak(a);g=c[46791]|0;e=c[a+16>>2]|0;b=+(S(c[e+252>>2]|0,g+-1|0)|0);f=c[46792]|0;e=e+248|0;a=0;d=0.0;while(1){if((a|0)>=(g|0))break;i=+h[f+(a*40|0)+24>>3]+ +(S(c[e>>2]|0,c[f+(a*40|0)+16>>2]|0)|0);j=b+ +h[f+(a*40|0)+32>>3];a=a+1|0;b=j;d=d=(qB(a)|0))break;c[(c[46795]|0)+(b<<2)>>2]=b;b=b+1|0}Ak(a);Ck(a);Dk(a);return}function Ak(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0.0,k=0,l=0,m=0;c[46791]=0;b=c[46792]|0;if(b|0){e=0;while(1){if((e|0)>=(c[46793]|0))break;d=c[b+(e*40|0)+4>>2]|0;if(d){l6(d);b=c[46792]|0}d=c[b+(e*40|0)+8>>2]|0;if(d){l6(d);b=c[46792]|0}e=e+1|0}l6(b)}c[46792]=HK((c[46793]|0)*40|0)|0;b=0;while(1){d=c[46793]|0;if((b|0)>=(d|0))break;l=HK(d<<2)|0;c[(c[46792]|0)+(b*40|0)+4>>2]=l;l=HK(c[46793]<<2)|0;m=c[46792]|0;c[m+(b*40|0)+8>>2]=l;c[m+(b*40|0)>>2]=b;c[m+(b*40|0)+12>>2]=0;c[m+(b*40|0)+16>>2]=0;m=m+(b*40|0)+24|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;b=b+1|0}e=gC(a)|0;while(1){if(!e)break;d=UA(a,e)|0;while(1){if(!d)break;i=c[d>>2]|0;f=d+-48|0;g=c[46792]|0;b=c[(c[(c[((i&3|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0;while(1){b=b+1|0;if((b|0)>=(c[(c[(c[((i&3|0)==2?d:f)+40>>2]|0)+16>>2]|0)+232>>2]|0))break;i=g+(b*40|0)+16|0;c[i>>2]=(c[i>>2]|0)+1;i=c[d>>2]|0}d=WA(a,d)|0}e=hC(a,e)|0}k=c[46793]|0;l=c[46794]|0;m=c[46792]|0;d=a+16|0;b=0;while(1){if((b|0)>=(k|0))break;e=l+(b*24|0)|0;f=(c[c[e>>2]>>2]|0)+16|0;g=c[(c[f>>2]|0)+232>>2]|0;if((g|0)>=(c[46791]|0))c[46791]=g+1;i=m+(g*40|0)+24|0;j=+h[i>>3];h[i>>3]=j+(+h[l+(b*24|0)+8>>3]*72.0+(j>0.0?+(c[(c[d>>2]|0)+248>>2]|0):0.0));i=m+(g*40|0)+32|0;j=+h[l+(b*24|0)+16>>3]*72.0;if(+h[i>>3]>3]=j;c[(c[m+(g*40|0)+4>>2]|0)+(c[m+(g*40|0)+12>>2]<<2)>>2]=e;a=m+((c[(c[f>>2]|0)+232>>2]|0)*40|0)+12|0;c[a>>2]=(c[a>>2]|0)+1;b=b+1|0}return}function Bk(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=c[46791]|0;l=c[46792]|0;j=0;b=0;a=0;while(1){if((j|0)>=(k|0))break;i=c[l+(j*40|0)+12>>2]|0;d=l+(j*40|0)|0;e=(b|0)==0;a:do if(i)if(!e){if((c[d>>2]|0)>(a|0)){f=l+(j*40|0)+4|0;d=0;while(1){if((d|0)>=(i|0))break a;g=c[(c[f>>2]|0)+(d<<2)>>2]|0;h=c[g+4>>2]|0;e=0;while(1){if((e|0)>=(h|0))break;m=(c[(c[(c[g>>2]|0)+(e<<2)>>2]|0)+16>>2]|0)+232|0;c[m>>2]=(c[m>>2]|0)-b;e=e+1|0}d=d+1|0}}}else b=0;else{if(e)a=c[d>>2]|0;b=b+1|0}while(0);j=j+1|0}return}function Ck(a){a=a|0;var b=0;b=c[46795]|0;k3(b,qB(a)|0,4,63);return}function Dk(b){b=b|0;var d=0.0,e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0;k=c[46791]|0;l=c[46792]|0;i=c[46795]|0;j=0;while(1){if((j|0)>=(k|0)){e=0;f=0.0;break}e=c[i+(j<<2)>>2]|0;g=j+1|0;if((c[l+(e*40|0)+12>>2]|0)<2)j=g;else{m=4;break}}if((m|0)==4)if((k|0)>(g|0))f=+h[l+((c[i+(g<<2)>>2]|0)*40|0)+24>>3];else f=0.0;a:do if((j|0)!=(k|0)){k3(c[l+(e*40|0)+4>>2]|0,c[l+(e*40|0)+12>>2]|0,4,64);g=c[46792]|0;d=+h[g+(e*40|0)+24>>3];if(!(!(f<=d*.25)?!(f>=d*3.0*.25):0))f=d*.5;t=c[g+(e*40|0)+12>>2]|0;s=b+16|0;p=0;q=0;d=0.0;i=0;r=0;while(1){if((r|0)>=(i+t|0))break a;do if(!(c[(c[g+(e*40|0)+8>>2]|0)+(r<<2)>>2]|0)){m=c[(c[g+(e*40|0)+4>>2]|0)+(r<<2)>>2]|0;b=m+8|0;n=+h[b>>3]*72.0;o=d>0.0?+(c[(c[s>>2]|0)+248>>2]|0):0.0;j=(q|0)!=0;if(!(j&!(d+n+o<=f))){k=j?p:m;j=j?q:1;d=d+(n+o);break}k=p+4|0;l=m+4|0;j=0;while(1){if((j|0)<(c[k>>2]|0))g=0;else break;while(1){if((g|0)>=(c[l>>2]|0))break;a[(c[(kh(c[(c[p>>2]|0)+(j<<2)>>2]|0,c[(c[m>>2]|0)+(g<<2)>>2]|0,0)|0)+16>>2]|0)+112>>0]=1;g=g+1|0}j=j+1|0}g=c[46792]|0;c[(c[g+(e*40|0)+8>>2]|0)+(r<<2)>>2]=1;k=g+(e*40|0)+12|0;c[k>>2]=(c[k>>2]|0)+-1;k=g+(e*40|0)+16|0;c[k>>2]=(c[k>>2]|0)+1;k=g+(e*40|0)+24|0;h[k>>3]=+h[k>>3]-(+h[b>>3]*72.0+ +(c[(c[s>>2]|0)+248>>2]|0));k=p;j=q}else{k=p;j=q;i=i+1|0}while(0);p=k;q=j;r=r+1|0}}while(0);return}function Ek(a,b){a=a|0;b=b|0;a=Fk(c[a>>2]|0)|0;b=Fk(c[b>>2]|0)|0;return ((b|0)<(a|0)&1)-((b|0)>(a|0)&1)|0}function Fk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=a+4|0;d=0;b=0;while(1){if((d|0)>=(c[f>>2]|0))break;e=c[(c[a>>2]|0)+(d<<2)>>2]|0;g=uC(e)|0;e=UA(g,e)|0;while(1){if(!e)break;e=WA(g,e)|0;b=b+1|0}d=d+1|0}return b|0}function Gk(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0;f=c[46792]|0;e=+h[f+((c[b>>2]|0)*40|0)+24>>3];d=+h[f+((c[a>>2]|0)*40|0)+24>>3];return (e>d&1)-(e>2]|0)+216>>2]=0;b=hC(a,b)|0}return}function Ik(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g+8|0;d=g+20|0;c[d>>2]=5;a=NA(a,99906)|0;if(a|0?(c[e>>2]=g,c[e+4>>2]=d,(q4(a,87769,e)|0)>=1):0)dA(0,87776,f)|0;c[b+24>>2]=0;c[b+32>>2]=0;l=g;return 0}function Jk(b){b=b|0;var d=0,e=0;d=c[47258]|0;if((((d|0)!=0?(e=OA(b,d)|0,(e|0)!=0):0)?(a[e>>0]|0)!=0:0)?(bP(e)|0)<<24>>24==0:0)b=1;else b=0;return b|0}function Kk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;dl(a);b=gC(a)|0;while(1){if(!b)break;d=UA(a,b)|0;while(1){if(!d)break;do if(((c[(c[d+16>>2]|0)+172>>2]|0)==0?(Jk(d)|0)==0:0)?(e=d+48|0,f=dP(c[((c[d>>2]&3|0)==3?d:e)+40>>2]|0)|0,g=d+-48|0,h=dP(c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0)|0,(f|0)!=(h|0)):0){if((c[(c[f+16>>2]|0)+212>>2]|0)==0?(c[(c[h+16>>2]|0)+212>>2]|0)==0:0){i=ah(f,h)|0;if(!i){kh(f,h,d)|0;break}else{sh(d,i);break}}i=c[d>>2]&3;Lk(a,c[((i|0)==3?d:e)+40>>2]|0,c[((i|0)==2?d:g)+40>>2]|0,d)}while(0);d=WA(a,d)|0}b=hC(a,b)|0}return}function Lk(b,d,f,g){b=b|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;j=c[g>>2]&3;h=c[(c[((j|0)==3?g:g+48|0)+40>>2]|0)+16>>2]|0;i=c[h+212>>2]|0;if(!i)k=0;else k=(c[h+232>>2]|0)-(c[(c[(c[(c[i+16>>2]|0)+264>>2]|0)+16>>2]|0)+232>>2]|0)|0;h=c[(c[((j|0)==2?g:g+-48|0)+40>>2]|0)+16>>2]|0;i=c[h+212>>2]|0;if(!i)h=0;else h=(c[h+232>>2]|0)-(c[(c[(c[(c[i+16>>2]|0)+264>>2]|0)+16>>2]|0)+232>>2]|0)|0;j=g+16|0;k=k-h+(e[(c[j>>2]|0)+170>>1]|0)|0;b=ph(b)|0;a[(c[b+16>>2]|0)+156>>0]=2;i=dP(d)|0;d=dP(f)|0;f=Wi(b,i,(k|0)>0?0.0:+(0-k|0),(c[(c[j>>2]|0)+156>>2]|0)*10|0)|0;c[(c[(Wi(b,d,+(((k|0)>0?k:0)|0),c[(c[j>>2]|0)+156>>2]|0)|0)+16>>2]|0)+116>>2]=g;c[(c[f+16>>2]|0)+116>>2]=g;return}function Mk(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=c[d>>2]&3;j=(k|0)==3?d:d+48|0;k=(k|0)==2?d:d+-48|0;k=c[(c[(c[((c[(c[(c[j+40>>2]|0)+16>>2]|0)+232>>2]|0)>(c[(c[(c[k+40>>2]|0)+16>>2]|0)+232>>2]|0)?j:k)+40>>2]|0)+16>>2]|0)+232>>2]|0;j=d+16|0;h=c[j>>2]|0;d=h+172|0;if(c[d>>2]|0)Aa(87865,87887,148,87896);c[d>>2]=f;i=(g|0)==0;d=f;while(1){g=c[d+16>>2]|0;if(!i){f=g+168|0;b[f>>1]=(e[f>>1]|0)+(e[h+168>>1]|0)}f=g+154|0;b[f>>1]=(e[f>>1]|0)+(e[h+154>>1]|0);g=g+156|0;c[g>>2]=(c[g>>2]|0)+(c[h+156>>2]|0);g=d+-48|0;h=c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0;if((c[(c[h+16>>2]|0)+232>>2]|0)==(k|0))break;Nk(a,h);d=c[c[(c[(c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0;if(!d)break;h=c[j>>2]|0}return}function Nk(a,b){a=a|0;b=b|0;var d=0.0;d=+((c[(c[a+16>>2]|0)+248>>2]|0)/2|0|0);b=c[b+16>>2]|0;a=b+88|0;h[a>>3]=+h[a>>3]+d;b=b+96|0;h[b>>3]=d+ +h[b>>3];return}function Ok(a,b){a=a|0;b=b|0;var d=0,e=0;if(((((a|0)!=0&(b|0)!=0?(e=c[a>>2]&3,d=c[b>>2]&3,(c[((e|0)==3?a:a+48|0)+40>>2]|0)==(c[((d|0)==3?b:b+48|0)+40>>2]|0)):0)?(c[((e|0)==2?a:a+-48|0)+40>>2]|0)==(c[((d|0)==2?b:b+-48|0)+40>>2]|0):0)?(c[(c[a+16>>2]|0)+96>>2]|0)==(c[(c[b+16>>2]|0)+96>>2]|0):0)?(rj(a,b)|0)!=0:0)a=1;else a=0;return a|0}function Pk(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=b+16|0;d=c[t>>2]|0;c[d+192>>2]=0;c[d+232>>2]=0;dl(b);d=1;while(1){e=c[t>>2]|0;if((d|0)>(c[e+180>>2]|0))break;el(b,c[(c[e+184>>2]|0)+(d<<2)>>2]|0);d=d+1|0}h=gC(b)|0;while(1){if(!h)break;g=UA(b,h)|0;while(1){if(!g)break;d=c[g>>2]|0;e=(c[(c[((d&3|0)==2?g:g+-48|0)+40>>2]|0)+16>>2]|0)+160|0;f=a[e>>0]|0;if(f<<24>>24<3){a[e>>0]=f+1<<24>>24;d=c[g>>2]|0}d=(c[(c[((d&3|0)==3?g:g+48|0)+40>>2]|0)+16>>2]|0)+160|0;e=a[d>>0]|0;if(e<<24>>24<3)a[d>>0]=e+1<<24>>24;g=WA(b,g)|0}h=hC(b,h)|0}m=gC(b)|0;while(1){if(!m)break;if((c[(c[m+16>>2]|0)+212>>2]|0)==0?(m|0)==(dP(m)|0):0){lh(b,m);l=(c[t>>2]|0)+232|0;c[l>>2]=(c[l>>2]|0)+1}d=0;l=UA(b,m)|0;while(1){if(!l)break;i=l+16|0;e=c[i>>2]|0;a:do if(!(c[e+172>>2]|0)){j=l+48|0;k=l+-48|0;f=d+16|0;if(Qk(l)|0){if(!(Ok(d,l)|0)){Rk(b,l);d=l;break}e=c[(c[f>>2]|0)+172>>2]|0;if(e|0){Mk(b,l,e,0);gh(l);break}i=c[l>>2]&3;if((c[(c[(c[((i|0)==3?l:j)+40>>2]|0)+16>>2]|0)+232>>2]|0)!=(c[(c[(c[((i|0)==2?l:k)+40>>2]|0)+16>>2]|0)+232>>2]|0))break;sh(l,d);gh(l);break}if((d|0?(s=c[l>>2]&3,n=c[((s|0)==3?l:j)+40>>2]|0,o=c[d>>2]&3,(n|0)==(c[((o|0)==3?d:d+48|0)+40>>2]|0)):0)?(p=c[((s|0)==2?l:k)+40>>2]|0,(p|0)==(c[((o|0)==2?d:d+-48|0)+40>>2]|0)):0){if((c[(c[n+16>>2]|0)+232>>2]|0)==(c[(c[p+16>>2]|0)+232>>2]|0)){sh(l,d);gh(l);break}if(((c[e+96>>2]|0)==0?(c[(c[f>>2]|0)+96>>2]|0)==0:0)?rj(l,d)|0:0)if(!(a[195236]|0)){Mk(b,l,c[(c[f>>2]|0)+172>>2]|0,1);gh(l);break}else{a[(c[i>>2]|0)+112>>0]=6;break}}h=c[l>>2]&3;e=c[((h|0)==3?l:j)+40>>2]|0;if((e|0)==(c[((h|0)==2?l:k)+40>>2]|0)){gh(l);d=l;break}e=dP(e)|0;f=dP(c[((c[l>>2]&3|0)==2?l:k)+40>>2]|0)|0;h=c[l>>2]&3;if((c[((h|0)==3?l:j)+40>>2]|0)==(e|0)?(c[((h|0)==2?l:k)+40>>2]|0)==(f|0):0){g=c[(c[e+16>>2]|0)+232>>2]|0;h=c[(c[f+16>>2]|0)+232>>2]|0;if((g|0)==(h|0)){qh(b,l);d=l;break}if((h|0)>(g|0)){Sk(b,e,f,l);d=l;break}e=fB(b,f,e,0,0)|0;do if(e|0?(q=c[e>>2]&3,r=c[((q|0)==2?e:e+-48|0)+40>>2]|0,(r|0)!=(c[((c[l>>2]&3|0)==2?l:k)+40>>2]|0)):0){f=e+16|0;if(!(c[(c[f>>2]|0)+172>>2]|0))Sk(b,c[((q|0)==3?e:e+48|0)+40>>2]|0,r,e);if((c[(c[i>>2]|0)+96>>2]|0)==0?(c[(c[f>>2]|0)+96>>2]|0)==0:0){if(!(rj(l,e)|0))break;if(!(a[195236]|0)){gh(l);Mk(b,l,c[(c[f>>2]|0)+172>>2]|0,1);break a}else{a[(c[i>>2]|0)+112>>0]=6;a[(c[f>>2]|0)+153>>0]=1;break a}}}while(0);d=c[l>>2]&3;Sk(b,c[((d|0)==2?l:k)+40>>2]|0,c[((d|0)==3?l:j)+40>>2]|0,l);d=l}}else d=l;while(0);l=WA(b,l)|0}m=hC(b,m)|0}if((dg(b)|0)!=(b|0)){d=c[(c[t>>2]|0)+216>>2]|0;if(!d)d=IK(4)|0;else d=KK(d,4)|0;t=c[t>>2]|0;c[t+216>>2]=d;c[d>>2]=c[t+192>>2]}return}function Qk(b){b=b|0;var d=0;d=c[b>>2]&3;if((a[(c[(c[((d|0)==3?b:b+48|0)+40>>2]|0)+16>>2]|0)+159>>0]|0)==7)b=1;else b=(a[(c[(c[((d|0)==2?b:b+-48|0)+40>>2]|0)+16>>2]|0)+159>>0]|0)==7;return b&1|0}function Rk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=Vk(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)|0;g=Vk(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)|0;i=(c[(c[f+16>>2]|0)+232>>2]|0)>(c[(c[g+16>>2]|0)+232>>2]|0);e=i?f:g;f=i?g:f;g=f+16|0;i=e+16|0;a:do if((c[(c[g>>2]|0)+212>>2]|0)!=(c[(c[i>>2]|0)+212>>2]|0)){h=ah(f,e)|0;if(h|0){Mk(b,d,h,1);break}if((c[(c[g>>2]|0)+232>>2]|0)!=(c[(c[i>>2]|0)+232>>2]|0)){Sk(b,f,e,d);e=(c[d+16>>2]|0)+172|0;while(1){e=c[e>>2]|0;if(!e)break a;f=e+-48|0;if((c[(c[(c[((c[e>>2]&3|0)==2?e:f)+40>>2]|0)+16>>2]|0)+232>>2]|0)>(c[(c[i>>2]|0)+232>>2]|0))break a;a[(c[e+16>>2]|0)+112>>0]=5;e=c[(c[(c[((c[e>>2]&3|0)==2?e:f)+40>>2]|0)+16>>2]|0)+180>>2]|0}}}while(0);return}function Sk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=e+16|0;f=c[k>>2]|0;g=b+16|0;j=d+16|0;if(!(c[f+96>>2]|0))i=-1;else i=((c[(c[j>>2]|0)+232>>2]|0)+(c[(c[g>>2]|0)+232>>2]|0)|0)/2|0;if(c[f+172>>2]|0)Aa(87908,87887,89,87933);h=c[(c[g>>2]|0)+232>>2]|0;while(1){g=h+1|0;f=c[(c[j>>2]|0)+232>>2]|0;if((h|0)>=(f|0))break;if((g|0)<(f|0)){if((g|0)==(i|0))f=Tk(a,e)|0;else f=Uk(a)|0;c[(c[f+16>>2]|0)+232>>2]=g}else f=d;Fi(kh(b,f,e)|0);h=g;b=f}if(!(c[(c[k>>2]|0)+172>>2]|0))Aa(87944,87887,103,87933);else return}function Tk(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0.0;i=d+16|0;g=c[(c[i>>2]|0)+96>>2]|0;e=+h[g+24>>3];f=+h[g+32>>3];g=ph(b)|0;d=g+16|0;c[(c[d>>2]|0)+104>>2]=c[(c[i>>2]|0)+96>>2];j=+(c[(c[(vC(g)|0)+16>>2]|0)+248>>2]|0);h[(c[d>>2]|0)+88>>3]=j;if(!(a[(c[i>>2]|0)+114>>0]|0)){b=(c[(c[(vC(b)|0)+16>>2]|0)+116>>2]&1|0)==0;i=c[d>>2]|0;h[i+80>>3]=b?f:e;h[i+96>>3]=b?e:f}return g|0}function Uk(a){a=a|0;var b=0;b=ph(a)|0;Nk(a,b);return b|0}function Vk(b){b=b|0;var d=0;d=c[b+16>>2]|0;if((a[d+159>>0]|0)==7)b=c[(c[(c[(c[d+212>>2]|0)+16>>2]|0)+268>>2]|0)+(c[d+232>>2]<<2)>>2]|0;else b=dP(b)|0;return b|0}function Wk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=dg(a)|0;h=gC(a)|0;while(1){if(!h)break;b=ZA(j,h)|0;i=0;while(1){if(!b)break;l=_A(j,b,h)|0;if(EC(a,b)|0){k=i;b=l;i=k;continue}k=(c[b>>2]&3|0)==2?b:b+-48|0;m=(Ok(i,k)|0)==0;e=c[k>>2]&3;b=c[((e|0)==3?k:k+48|0)+40>>2]|0;d=c[(c[b+16>>2]|0)+232>>2]|0;e=c[((e|0)==2?k:k+-48|0)+40>>2]|0;f=c[(c[e+16>>2]|0)+232>>2]|0;g=(d|0)==(f|0);if(!m){c[(c[k+16>>2]|0)+172>>2]=g?i:0;b=c[(c[i+16>>2]|0)+172>>2]|0;if(!b){m=i;b=l;i=m;continue}Mk(a,k,b,0);hh(k);m=i;b=l;i=m;continue}if(!g)if((f|0)>(d|0)){Xk(b,e,k);b=l;i=k;continue}else{Xk(e,b,k);b=l;i=k;continue}b=ch(b,e)|0;if(!b){qh(j,k);b=l;i=k;continue}if((k|0)==(b|0)){m=i;b=l;i=m;continue}hh(k);if(c[(c[k+16>>2]|0)+172>>2]|0){m=i;b=l;i=m;continue}sh(k,b);m=i;b=l;i=m}h=hC(a,h)|0}return}function Xk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=Yk(a)|0;e=Yk(b)|0;Zk(f,e,d,c[(c[d+16>>2]|0)+172>>2]|0,(f|0)==(a|0)&(e|0)==(b|0)?1:5);return}function Yk(b){b=b|0;var d=0,e=0,f=0;d=c[b+16>>2]|0;e=c[d+212>>2]|0;if((e|0)!=0?(f=c[e+16>>2]|0,(a[f+272>>0]|0)==0):0)b=c[(c[f+268>>2]|0)+(c[d+232>>2]<<2)>>2]|0;return b|0}function Zk(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0;n=d+16|0;l=c[(c[n>>2]|0)+232>>2]|0;o=e+16|0;j=c[(c[o>>2]|0)+232>>2]|0;if((j|0)<=(l|0))Aa(87969,87997,81,88007);m=c[g>>2]&3;if(!((c[((m|0)==3?g:g+48|0)+40>>2]|0)==(d|0)?(c[((m|0)==2?g:g+-48|0)+40>>2]|0)==(e|0):0))i=5;a:do if((i|0)==5){i=f+16|0;if((b[(c[g+16>>2]|0)+168>>1]|0)>1){c[(c[i>>2]|0)+172>>2]=0;if(((j-l|0)==1?(k=ah(d,e)|0,k|0):0)?rj(f,k)|0:0){sh(f,k);if(a[(c[n>>2]|0)+156>>0]|0)break;if(a[(c[o>>2]|0)+156>>0]|0)break;gh(f);break}m=h&255;h=d;l=c[(c[n>>2]|0)+232>>2]|0;while(1){i=c[(c[o>>2]|0)+232>>2]|0;if((l|0)>=(i|0))break a;if((l|0)<(i+-1|0)){i=dg(d)|0;j=g+-48|0;i=_k(i,c[((c[g>>2]&3|0)==2?g:j)+40>>2]|0)|0;k=g}else{i=e;j=g+-48|0;k=g}a[(c[(kh(h,i,f)|0)+16>>2]|0)+112>>0]=m;n=(c[g+16>>2]|0)+168|0;b[n>>1]=(b[n>>1]|0)+-1<<16>>16;h=i;l=l+1|0;g=c[c[(c[(c[((c[k>>2]&3|0)==2?g:j)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0}}do if((j-l|0)==1){g=ah(d,e)|0;if(g|0?rj(f,g)|0:0){c[(c[i>>2]|0)+172>>2]=g;m=c[g+16>>2]|0;a[m+112>>0]=h;m=m+168|0;b[m>>1]=(b[m>>1]|0)+1<<16>>16;if(a[(c[n>>2]|0)+156>>0]|0)break;if(a[(c[o>>2]|0)+156>>0]|0)break;gh(f);break}c[(c[i>>2]|0)+172>>2]=0;g=kh(d,e,f)|0;a[(c[g+16>>2]|0)+112>>0]=h}while(0);l=c[(c[o>>2]|0)+232>>2]|0;if((l-(c[(c[n>>2]|0)+232>>2]|0)|0)>1){if((c[((c[g>>2]&3|0)==3?g:g+48|0)+40>>2]|0)!=(d|0)){c[(c[i>>2]|0)+172>>2]=0;l=kh(d,c[((c[g>>2]&3|0)==2?g:g+-48|0)+40>>2]|0,f)|0;c[(c[i>>2]|0)+172>>2]=l;fh(g);g=l;l=c[(c[o>>2]|0)+232>>2]|0}while(1){i=c[g>>2]&3;j=c[((i|0)==2?g:g+-48|0)+40>>2]|0;k=c[j+16>>2]|0;if((c[k+232>>2]|0)==(l|0))break;g=c[c[k+180>>2]>>2]|0}if((j|0)!=(e|0)){a[(c[(kh(c[((i|0)==3?g:g+48|0)+40>>2]|0,e,f)|0)+16>>2]|0)+112>>0]=h;fh(g)}}}while(0);return}function _k(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=b+16|0;b=c[d>>2]|0;e=c[b+232>>2]|0;$k(a,e,c[b+236>>2]|0,2);b=ph(a)|0;d=c[d>>2]|0;f=c[b+16>>2]|0;h[f+88>>3]=+h[d+88>>3];h[f+96>>3]=+h[d+96>>3];c[f+232>>2]=c[d+232>>2];d=(c[d+236>>2]|0)+1|0;c[f+236>>2]=d;c[(c[(c[(c[a+16>>2]|0)+196>>2]|0)+(e<<6)+4>>2]|0)+(d<<2)>>2]=b;return b|0}function $k(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;h=a+16|0;f=c[(c[h>>2]|0)+196>>2]|0;i=c[f+(b<<6)+4>>2]|0;a:do if((e|0)<1){d=d-e|0;while(1){g=d+1|0;a=c[f+(b<<6)>>2]|0;if((g|0)>=(a|0))break;a=c[i+(g<<2)>>2]|0;f=d+e|0;c[(c[a+16>>2]|0)+236>>2]=f;c[i+(f<<2)>>2]=a;d=g;f=c[(c[h>>2]|0)+196>>2]|0}g=e+-1|0;d=g+a|0;while(1){if((d|0)>=(a|0))break a;c[i+(d<<2)>>2]=0;f=c[(c[h>>2]|0)+196>>2]|0;d=d+1|0;a=c[f+(b<<6)>>2]|0}}else{g=e+-1|0;a=c[f+(b<<6)>>2]|0;while(1){a=a+-1|0;if((a|0)<=(d|0))break;j=c[i+(a<<2)>>2]|0;f=g+a|0;c[(c[j+16>>2]|0)+236>>2]=f;c[i+(f<<2)>>2]=j}f=e+d|0;a=d;while(1){a=a+1|0;if((a|0)>=(f|0))break;c[i+(a<<2)>>2]=0}a=c[(c[h>>2]|0)+196>>2]|0;f=a;a=c[a+(b<<6)>>2]|0}while(0);c[f+(b<<6)>>2]=g+a;return}function al(a){a=a|0;var b=0;Pk(a);b=c[a+16>>2]|0;c[b+220>>2]=1;c[c[b+216>>2]>>2]=c[b+192>>2];Ci(a);hi(a,0);bl(a);Wk(a);cl(a);return}function bl(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;m=dg(d)|0;n=d+16|0;f=c[n>>2]|0;l=b[f+236>>1]|0;o=m+16|0;e=l<<16>>16;if(l<<16>>16>0)a[(c[(c[o>>2]|0)+196>>2]|0)+(e+-1<<6)+49>>0]=0;l=e;while(1){if((l|0)>(b[f+238>>1]|0))break;k=c[(c[(c[(c[f+268>>2]|0)+(l<<2)>>2]|0)+16>>2]|0)+236>>2]|0;$k(m,l,k,c[(c[f+196>>2]|0)+(l<<6)>>2]|0);i=0;j=k;e=c[o>>2]|0;while(1){f=c[n>>2]|0;p=c[f+196>>2]|0;g=p+(l<<6)+4|0;e=c[e+196>>2]|0;h=c[e+(l<<6)+4>>2]|0;if((i|0)>=(c[p+(l<<6)>>2]|0))break;e=c[(c[g>>2]|0)+(i<<2)>>2]|0;c[h+(j<<2)>>2]=e;p=c[e+16>>2]|0;c[p+236>>2]=j;if((a[p+156>>0]|0)==1)c[e+24>>2]=vC(m)|0;nh(d,e);lh(m,e);e=c[o>>2]|0;p=e+232|0;c[p>>2]=(c[p>>2]|0)+1;i=i+1|0;j=j+1|0}c[g>>2]=h+(k<<2);a[e+(l<<6)+49>>0]=0;l=l+1|0}e=c[o>>2]|0;if((l|0)<(b[e+238>>1]|0))a[(c[e+196>>2]|0)+(l<<6)+49>>0]=0;a[f+272>>0]=1;return}function cl(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=a+16|0;d=c[i>>2]|0;h=b[d+236>>1]|0;while(1){if((h|0)>(b[d+238>>1]|0))break;f=c[(c[d+268>>2]|0)+(h<<2)>>2]|0;g=f+16|0;while(1){d=c[g>>2]|0;e=c[c[d+180>>2]>>2]|0;if(!e)break;fh(e)}while(1){d=c[c[d+172>>2]>>2]|0;if(!d)break;fh(d);d=c[g>>2]|0}nh(dg(a)|0,f);c[(c[(c[i>>2]|0)+268>>2]|0)+(h<<2)>>2]=0;h=h+1|0;d=c[i>>2]|0}return}function dl(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o;f=gC(b)|0;while(1){if(!f)break;e=f+16|0;d=c[e>>2]|0;if((a[d+159>>0]|0)==7){fP(f);d=c[e>>2]|0}c[d+212>>2]=0;f=hC(b,f)|0}m=b+16|0;k=1;while(1){d=c[m>>2]|0;if((k|0)>(c[d+180>>2]|0))break;h=c[(c[d+184>>2]|0)+(k<<2)>>2]|0;i=h+16|0;d=gC(h)|0;a:while(1){if(!d)break;j=hC(h,d)|0;e=d+16|0;if(a[(c[e>>2]|0)+159>>0]|0){f=HB(d)|0;g=HB(b)|0;c[n>>2]=f;c[n+4>>2]=g;dA(0,88016,n)|0;tC(h,d)|0;d=j;continue}gP(d,c[(c[i>>2]|0)+264>>2]|0);g=c[e>>2]|0;c[g+212>>2]=h;a[g+159>>0]=7;g=UA(h,d)|0;while(1){if(!g){d=j;continue a}d=c[(c[g+16>>2]|0)+172>>2]|0;b:do if(d|0)do{e=d+-48|0;f=c[(c[((c[d>>2]&3|0)==2?d:e)+40>>2]|0)+16>>2]|0;if((a[f+156>>0]|0)!=1)break b;c[f+212>>2]=h;d=c[c[(c[(c[((c[d>>2]&3|0)==2?d:e)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0}while((d|0)!=0);while(0);g=WA(h,g)|0}}k=k+1|0}l=o;return}function el(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=e+16|0;g=HK((b[(c[k>>2]|0)+238>>1]<<2)+8|0)|0;f=c[k>>2]|0;c[f+268>>2]=g;g=0;h=b[f+236>>1]|0;while(1){if((h|0)>(b[f+238>>1]|0))break;f=ph(d)|0;c[(c[(c[k>>2]|0)+268>>2]|0)+(h<<2)>>2]=f;j=c[f+16>>2]|0;c[j+232>>2]=h;a[j+159>>0]=7;c[j+212>>2]=e;if(g|0){j=(c[(kh(g,f,0)|0)+16>>2]|0)+154|0;b[j>>1]=(b[j>>1]|0)*1e3}g=f;h=h+1|0;f=c[k>>2]|0}j=gC(e)|0;while(1){f=c[k>>2]|0;i=f+268|0;if(!j)break;h=(c[(c[i>>2]|0)+(c[(c[j+16>>2]|0)+232>>2]<<2)>>2]|0)+16|0;f=(c[h>>2]|0)+216|0;c[f>>2]=(c[f>>2]|0)+1;f=UA(e,j)|0;while(1){if(!f)break;i=c[f>>2]|0;d=f+-48|0;g=c[(c[(c[((i&3|0)==3?f:f+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0;while(1){if((g|0)>=(c[(c[(c[((i&3|0)==2?f:d)+40>>2]|0)+16>>2]|0)+232>>2]|0))break;i=(c[(c[c[(c[h>>2]|0)+180>>2]>>2]|0)+16>>2]|0)+168|0;b[i>>1]=(b[i>>1]|0)+1<<16>>16;g=g+1|0;i=c[f>>2]|0}f=WA(e,f)|0}j=hC(e,j)|0}d=b[f+238>>1]|0;f=b[f+236>>1]|0;while(1){if((f|0)>(d|0))break;g=(c[(c[(c[i>>2]|0)+(f<<2)>>2]|0)+16>>2]|0)+216|0;h=c[g>>2]|0;if((h|0)>1)c[g>>2]=h+-1;f=f+1|0}return}function fl(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=(c[(c[e+16>>2]|0)+212>>2]|0)+16|0;e=c[k>>2]|0;j=f+1|0;if((a[e+273>>0]|0)!=(j|0)){i=b[e+236>>1]|0;while(1){h=b[e+238>>1]|0;if((i|0)>(h<<16>>16|0))break;wi(d,c[(c[e+268>>2]|0)+(i<<2)>>2]|0);i=i+1|0;e=c[k>>2]|0}i=b[e+236>>1]|0;while(1){if((i|0)>(h<<16>>16|0))break;xi(g,c[(c[e+268>>2]|0)+(i<<2)>>2]|0,f);d=c[k>>2]|0;i=i+1|0;h=b[d+238>>1]|0;e=d}a[e+273>>0]=j}return}function gl(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=gC(b)|0;while(1){if(!h)break;c[(c[h+16>>2]|0)+212>>2]=0;g=UA(b,h)|0;while(1){if(!g)break;d=c[(c[g+16>>2]|0)+172>>2]|0;a:do if(d|0)do{e=d+-48|0;f=c[(c[((c[d>>2]&3|0)==2?d:e)+40>>2]|0)+16>>2]|0;if((a[f+156>>0]|0)!=1)break a;c[f+212>>2]=0;d=c[c[(c[(c[((c[d>>2]&3|0)==2?d:e)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0}while((d|0)!=0);while(0);g=WA(b,g)|0}h=hC(b,h)|0}hl(b);return}function hl(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=b+16|0;d=1;while(1){f=c[e>>2]|0;if((d|0)>(c[f+180>>2]|0))break;hl(c[(c[f+184>>2]|0)+(d<<2)>>2]|0);d=d+1|0}i=gC(b)|0;while(1){if(!i)break;d=(c[i+16>>2]|0)+212|0;if(!(c[d>>2]|0))c[d>>2]=b;h=UA(b,i)|0;while(1){if(!h)break;d=c[(c[h+16>>2]|0)+172>>2]|0;a:do if(d|0)do{e=c[d>>2]|0;g=d+-48|0;f=c[(c[((e&3|0)==2?d:g)+40>>2]|0)+16>>2]|0;if((a[f+156>>0]|0)!=1)break a;f=f+212|0;if(!(c[f>>2]|0)){c[f>>2]=b;e=c[d>>2]|0}d=c[c[(c[(c[((e&3|0)==2?d:g)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0}while((d|0)!=0);while(0);h=WA(b,h)|0}i=hC(b,i)|0}return}function il(a){a=a|0;var b=0,c=0,d=0;d=GP(a)|0;c=gC(a)|0;while(1){if(!c)break;b=UA(a,c)|0;while(1){if(!b)break;jl(b,d);b=WA(a,b)|0}c=hC(a,c)|0}Oz(d)|0;return}function jl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;R=l;l=l+320|0;L=R+296|0;K=R+280|0;G=R+136|0;z=R+120|0;q=R+104|0;m=R+88|0;f=R+80|0;I=R+16|0;C=R;n=R+264|0;o=R+248|0;p=R+232|0;s=R+216|0;E=R+200|0;F=R+184|0;B=R+168|0;M=R+152|0;i=kl(NA(a,88070)|0,b)|0;u=kl(NA(a,88076)|0,b)|0;v=(u|0)!=0;h=(i|0)!=0;do if(h|v?(Q=a+16|0,e=c[(c[Q>>2]|0)+8>>2]|0,e|0):0){A=a+48|0;b=c[a>>2]&3;g=c[((b|0)==3?a:A)+40>>2]|0;if((c[e+4>>2]|0)>1){P=HB(g)|0;Q=HB(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)|0;c[f>>2]=P;c[f+4>>2]=Q;dA(0,88082,f)|0;break}P=c[e>>2]|0;k=c[P+4>>2]|0;y=a+-48|0;t=c[((b|0)==2?a:y)+40>>2]|0;N=IK(48)|0;w=P+12|0;c[N+12>>2]=c[w>>2];D=P+8|0;c[N+8>>2]=c[D>>2];H=P+16|0;j=P+32|0;k=k+-1|0;x=N+32|0;r=g+16|0;t=t+16|0;do if(h){g=(c[i+16>>2]|0)+16|0;i=(c[t>>2]|0)+16|0;c[L>>2]=c[i>>2];c[L+4>>2]=c[i+4>>2];c[L+8>>2]=c[i+8>>2];c[L+12>>2]=c[i+12>>2];if(!(ll(L,g)|0)){s=HB(c[((c[a>>2]&3|0)==3?a:A)+40>>2]|0)|0;J=HB(c[((c[a>>2]&3|0)==2?a:y)+40>>2]|0)|0;O=NA(a,88070)|0;c[m>>2]=s;c[m+4>>2]=J;c[m+8>>2]=O;dA(0,88123,m)|0;O=25;break}b=c[P>>2]|0;c[L>>2]=c[b>>2];c[L+4>>2]=c[b+4>>2];c[L+8>>2]=c[b+8>>2];c[L+12>>2]=c[b+12>>2];if(!(ll(L,g)|0))b=0;else{J=(c[r>>2]|0)+16|0;c[L>>2]=c[J>>2];c[L+4>>2]=c[J+4>>2];c[L+8>>2]=c[J+8>>2];c[L+12>>2]=c[J+12>>2];if(ll(L,g)|0){s=HB(c[((c[a>>2]&3|0)==3?a:A)+40>>2]|0)|0;J=HB(c[((c[a>>2]&3|0)==2?a:y)+40>>2]|0)|0;O=NA(a,88070)|0;c[q>>2]=s;c[q+4>>2]=J;c[q+8>>2]=O;dA(0,88166,q)|0;O=25;break}if(!(c[D>>2]|0))Aa(88208,88219,369,88230);c[K>>2]=c[b>>2];c[K+4>>2]=c[b+4>>2];c[K+8>>2]=c[b+8>>2];c[K+12>>2]=c[b+12>>2];c[L>>2]=c[H>>2];c[L+4>>2]=c[H+4>>2];c[L+8>>2]=c[H+8>>2];c[L+12>>2]=c[H+12>>2];ml(C,K,L,g);J=(c[P>>2]|0)+48|0;c[J>>2]=c[C>>2];c[J+4>>2]=c[C+4>>2];c[J+8>>2]=c[C+8>>2];c[J+12>>2]=c[C+12>>2];J=(c[P>>2]|0)+16|0;c[K>>2]=c[C>>2];c[K+4>>2]=c[C+4>>2];c[K+8>>2]=c[C+8>>2];c[K+12>>2]=c[C+12>>2];c[L>>2]=c[H>>2];c[L+4>>2]=c[H+4>>2];c[L+8>>2]=c[H+8>>2];c[L+12>>2]=c[H+12>>2];nl(n,K,L);c[J>>2]=c[n>>2];c[J+4>>2]=c[n+4>>2];c[J+8>>2]=c[n+8>>2];c[J+12>>2]=c[n+12>>2];J=c[P>>2]|0;b=J+16|0;c[K>>2]=c[b>>2];c[K+4>>2]=c[b+4>>2];c[K+8>>2]=c[b+8>>2];c[K+12>>2]=c[b+12>>2];c[L>>2]=c[H>>2];c[L+4>>2]=c[H+4>>2];c[L+8>>2]=c[H+8>>2];c[L+12>>2]=c[H+12>>2];nl(o,K,L);c[J>>2]=c[o>>2];c[J+4>>2]=c[o+4>>2];c[J+8>>2]=c[o+8>>2];c[J+12>>2]=c[o+12>>2];J=c[P>>2]|0;b=J+32|0;J=J+16|0;c[K>>2]=c[J>>2];c[K+4>>2]=c[J+4>>2];c[K+8>>2]=c[J+8>>2];c[K+12>>2]=c[J+12>>2];c[L>>2]=c[C>>2];c[L+4>>2]=c[C+4>>2];c[L+8>>2]=c[C+8>>2];c[L+12>>2]=c[C+12>>2];nl(p,K,L);c[b>>2]=c[p>>2];c[b+4>>2]=c[p+4>>2];c[b+8>>2]=c[p+8>>2];c[b+12>>2]=c[p+12>>2];b=c[w>>2]|0;if(!b){J=3;break}J=(SH(a,c[P>>2]|0,0,0,N,b)|0)+3|0;break}while(1){if((b|0)>=(k|0))break;if(ol((c[P>>2]|0)+(b<<4)|0,g)|0)break;b=b+3|0}e=c[w>>2]|0;f=(e|0)!=0;if((b|0)==(k|0))if(f){J=(c[P>>2]|0)+(k<<4)|0;c[K>>2]=c[j>>2];c[K+4>>2]=c[j+4>>2];c[K+8>>2]=c[j+8>>2];c[K+12>>2]=c[j+12>>2];c[L>>2]=c[J>>2];c[L+4>>2]=c[J+4>>2];c[L+8>>2]=c[J+8>>2];c[L+12>>2]=c[J+12>>2];ml(s,K,L,g);c[x>>2]=c[s>>2];c[x+4>>2]=c[s+4>>2];c[x+8>>2]=c[s+8>>2];c[x+12>>2]=c[s+12>>2];J=k;break}else Aa(88247,88219,387,88230);else{if(f)b=SH(a,c[P>>2]|0,0,b,N,e)|0;J=b+3|0;break}}else O=25;while(0);if((O|0)==25)if(!(c[w>>2]|0))J=k;else{c[x>>2]=c[j>>2];c[x+4>>2]=c[j+4>>2];c[x+8>>2]=c[j+8>>2];c[x+12>>2]=c[j+12>>2];J=k}j=N+16|0;do if(v){i=(c[u+16>>2]|0)+16|0;v=(c[r>>2]|0)+16|0;c[L>>2]=c[v>>2];c[L+4>>2]=c[v+4>>2];c[L+8>>2]=c[v+8>>2];c[L+12>>2]=c[v+12>>2];if(!(ll(L,i)|0)){L=HB(c[((c[a>>2]&3|0)==3?a:A)+40>>2]|0)|0;M=HB(c[((c[a>>2]&3|0)==2?a:y)+40>>2]|0)|0;O=NA(a,88076)|0;c[z>>2]=L;c[z+4>>2]=M;c[z+8>>2]=O;dA(0,88258,z)|0;O=50;break}b=(c[P>>2]|0)+(J<<4)|0;c[L>>2]=c[b>>2];c[L+4>>2]=c[b+4>>2];c[L+8>>2]=c[b+8>>2];c[L+12>>2]=c[b+12>>2];h=J+-3|0;if(ll(L,i)|0){M=(c[t>>2]|0)+16|0;c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];if(ll(L,i)|0){L=HB(c[((c[a>>2]&3|0)==3?a:A)+40>>2]|0)|0;M=HB(c[((c[a>>2]&3|0)==2?a:y)+40>>2]|0)|0;O=NA(a,88076)|0;c[G>>2]=L;c[G+4>>2]=M;c[G+8>>2]=O;dA(0,88301,G)|0;O=50;break}if(!(c[w>>2]|0))Aa(88247,88219,429,88230);c[K>>2]=c[b>>2];c[K+4>>2]=c[b+4>>2];c[K+8>>2]=c[b+8>>2];c[K+12>>2]=c[b+12>>2];c[L>>2]=c[x>>2];c[L+4>>2]=c[x+4>>2];c[L+8>>2]=c[x+8>>2];c[L+12>>2]=c[x+12>>2];ml(C,K,L,i);M=(c[P>>2]|0)+(h<<4)|0;c[M>>2]=c[C>>2];c[M+4>>2]=c[C+4>>2];c[M+8>>2]=c[C+8>>2];c[M+12>>2]=c[C+12>>2];M=J+-1|0;d=(c[P>>2]|0)+(M<<4)|0;c[K>>2]=c[C>>2];c[K+4>>2]=c[C+4>>2];c[K+8>>2]=c[C+8>>2];c[K+12>>2]=c[C+12>>2];c[L>>2]=c[x>>2];c[L+4>>2]=c[x+4>>2];c[L+8>>2]=c[x+8>>2];c[L+12>>2]=c[x+12>>2];nl(E,K,L);c[d>>2]=c[E>>2];c[d+4>>2]=c[E+4>>2];c[d+8>>2]=c[E+8>>2];c[d+12>>2]=c[E+12>>2];d=c[P>>2]|0;I=d+(J<<4)|0;d=d+(M<<4)|0;c[K>>2]=c[d>>2];c[K+4>>2]=c[d+4>>2];c[K+8>>2]=c[d+8>>2];c[K+12>>2]=c[d+12>>2];c[L>>2]=c[x>>2];c[L+4>>2]=c[x+4>>2];c[L+8>>2]=c[x+8>>2];c[L+12>>2]=c[x+12>>2];nl(F,K,L);c[I>>2]=c[F>>2];c[I+4>>2]=c[F+4>>2];c[I+8>>2]=c[F+8>>2];c[I+12>>2]=c[F+12>>2];I=c[P>>2]|0;d=I+(J+-2<<4)|0;M=I+(M<<4)|0;c[K>>2]=c[M>>2];c[K+4>>2]=c[M+4>>2];c[K+8>>2]=c[M+8>>2];c[K+12>>2]=c[M+12>>2];c[L>>2]=c[C>>2];c[L+4>>2]=c[C+4>>2];c[L+8>>2]=c[C+8>>2];c[L+12>>2]=c[C+12>>2];nl(B,K,L);c[d>>2]=c[B>>2];c[d+4>>2]=c[B+4>>2];c[d+8>>2]=c[B+8>>2];c[d+12>>2]=c[B+12>>2];d=c[D>>2]|0;if(!d){d=h;break}d=UH(a,c[P>>2]|0,h,h,N,d)|0;break}f=J;while(1){g=f+-3|0;if((f|0)>0)b=0;else break;while(1){if((b|0)==4)break;G=I+(b<<4)|0;F=(c[P>>2]|0)+(f-b<<4)|0;c[G>>2]=c[F>>2];c[G+4>>2]=c[F+4>>2];c[G+8>>2]=c[F+8>>2];c[G+12>>2]=c[F+12>>2];b=b+1|0}if(!(ol(I,i)|0))f=g;else{b=0;O=42;break}}a:do if((O|0)==42)while(1){O=0;if((b|0)==4)break a;O=(c[P>>2]|0)+(f-b<<4)|0;G=I+(b<<4)|0;c[O>>2]=c[G>>2];c[O+4>>2]=c[G+4>>2];c[O+8>>2]=c[G+8>>2];c[O+12>>2]=c[G+12>>2];b=b+1|0;O=42}while(0);b=c[D>>2]|0;e=(b|0)!=0;if(f|0){if(!e){d=g;break}d=UH(a,c[P>>2]|0,g,h,N,b)|0;break}if(e){d=c[P>>2]|0;c[K>>2]=c[H>>2];c[K+4>>2]=c[H+4>>2];c[K+8>>2]=c[H+8>>2];c[K+12>>2]=c[H+12>>2];c[L>>2]=c[d>>2];c[L+4>>2]=c[d+4>>2];c[L+8>>2]=c[d+8>>2];c[L+12>>2]=c[d+12>>2];ml(M,K,L,i);c[j>>2]=c[M>>2];c[j+4>>2]=c[M+4>>2];c[j+8>>2]=c[M+8>>2];c[j+12>>2]=c[M+12>>2];d=0;break}else Aa(88208,88219,452,88230)}else O=50;while(0);if((O|0)==50)if(!(c[D>>2]|0))d=0;else{c[j>>2]=c[H>>2];c[j+4>>2]=c[H+4>>2];c[j+8>>2]=c[H+8>>2];c[j+12>>2]=c[H+12>>2];d=0}b=J-d+1|0;f=N+4|0;c[f>>2]=b;c[N>>2]=IK(b<<4)|0;b=0;while(1){e=c[P>>2]|0;if((b|0)>=(c[f>>2]|0))break;O=(c[N>>2]|0)+(b<<4)|0;a=e+(d<<4)|0;c[O>>2]=c[a>>2];c[O+4>>2]=c[a+4>>2];c[O+8>>2]=c[a+8>>2];c[O+12>>2]=c[a+12>>2];d=d+1|0;b=b+1|0}l6(e);l6(P);c[c[(c[Q>>2]|0)+8>>2]>>2]=N}while(0);l=R;return}function kl(b,d){b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if((b|0)!=0?(a[b>>0]|0)!=0:0){d=IP(d,b)|0;if(!d){c[e>>2]=b;dA(0,88421,e)|0;d=0}}else d=0;l=f;return d|0}function ll(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a>>3];if((+h[b>>3]<=d?d<=+h[b+16>>3]:0)?(c=+h[a+8>>3],+h[b+8>>3]<=c):0)a=c<=+h[b+24>>3];else a=0;return a&1|0}function ml(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0.0,B=0,C=0,D=0,E=0,F=0;F=l;l=l+464|0;r=F+48|0;E=F+32|0;x=F+16|0;y=F;z=F+364|0;B=F+264|0;C=F+164|0;D=F+64|0;u=+h[b>>3];v=+h[b+8>>3];k=+h[d>>3];w=+h[d+8>>3];c[x>>2]=c[e>>2];c[x+4>>2]=c[e+4>>2];c[x+8>>2]=c[e+8>>2];c[x+12>>2]=c[e+12>>2];j=e+16|0;c[y>>2]=c[j>>2];c[y+4>>2]=c[j+4>>2];c[y+8>>2]=c[j+8>>2];c[y+12>>2]=c[j+12>>2];m=+h[x>>3];n=v-w;o=u-k;j=a+8|0;e=y+8|0;f=+h[x+8>>3];if(k=f?!(g<=+h[e>>3]):1)):0){s=g;t=m}else i=3;do if((i|0)==3){g=+h[y>>3];if(k>g?(p=v+ +(~~(n*(g-u)/o)|0),!(p>=f?!(p<=+h[e>>3]):1)):0){s=p;t=g;break}if(w=m)|!(q<=g))):0){s=f;t=q;break}f=+h[e>>3];if(w>f?(A=u+ +(~~(o*(f-v)/n)|0),!(!(A>=m)|!(A<=g))):0){s=f;t=A;break};c[r>>2]=c[b>>2];c[r+4>>2]=c[b+4>>2];c[r+8>>2]=c[b+8>>2];c[r+12>>2]=c[b+12>>2];z=tl(r,z)|0;c[r>>2]=c[d>>2];c[r+4>>2]=c[d+4>>2];c[r+8>>2]=c[d+8>>2];c[r+12>>2]=c[d+12>>2];B=tl(r,B)|0;c[r>>2]=c[x>>2];c[r+4>>2]=c[x+4>>2];c[r+8>>2]=c[x+8>>2];c[r+12>>2]=c[x+12>>2];C=tl(r,C)|0;c[r>>2]=c[y>>2];c[r+4>>2]=c[y+4>>2];c[r+8>>2]=c[y+8>>2];c[r+12>>2]=c[y+12>>2];D=tl(r,D)|0;c[E>>2]=z;c[E+4>>2]=B;c[E+8>>2]=C;c[E+12>>2]=D;dA(1,88343,E)|0;Aa(138697,88219,78,88395)}while(0);h[a>>3]=t;h[j>>3]=s;l=F;return}function nl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=(+h[b+8>>3]+ +h[c+8>>3])*.5;h[a>>3]=(+h[b>>3]+ +h[c>>3])*.5;h[a+8>>3]=d;return}function ol(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+80|0;j=m+16|0;k=m;e=0;while(1){if((e|0)==4)break;i=j+(e<<4)|0;g=a+(e<<4)|0;c[i>>2]=c[g>>2];c[i+4>>2]=c[g+4>>2];c[i+8>>2]=c[g+8>>2];c[i+12>>2]=c[g+12>>2];e=e+1|0}e=b+8|0;i=b+24|0;d=+pl(a,0.0,1.0,+h[b>>3],+h[e>>3],+h[i>>3]);if(d>=0.0&d<2.0)iP(k,j,3,d,a,0);else d=2.0;g=b+16|0;f=+pl(a,0.0,d>1.0?1.0:d,+h[g>>3],+h[e>>3],+h[i>>3]);if(f>=0.0&f1.0?1.0:d,+h[e>>3],+h[b>>3],+h[g>>3]);if(f>=0.0&f1.0?1.0:d,+h[i>>3],+h[b>>3],+h[g>>3]);if(f>=0.0&f>3]-d))<=.005){b=+h[a+56>>3];b=!(b>=e)|!(b<=f)?-1.0:c;break a}break}default:{}}iP(i,a,3,.5,j,k);g=(b+c)*.5;b=+pl(j,b,g,d,e,f);if(!(b>=0.0))b=+pl(k,g,c,d,e,f)}while(0);l=m;return +b}function ql(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;var g=0.0,i=0,j=0,k=0,m=0;m=l;l=l+144|0;j=m+80|0;k=m+16|0;i=m;a:do if(!(b==c)){switch(rl(a,d)|0){case 0:{b=-1.0;break a}case 1:{if(+F(+(+h[a+56>>3]-d))<=.005){b=+h[a+48>>3];b=!(b>=e)|!(b<=f)?-1.0:c;break a}break}default:{}}iP(i,a,3,.5,j,k);g=(b+c)*.5;b=+ql(j,b,g,d,e,f);if(!(b>=0.0))b=+ql(k,g,c,d,e,f)}while(0);l=m;return +b}function rl(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0.0,g=0,i=0;f=+h[a+8>>3];e=fb&1;c=1;d=e;e=(e|0)==0&1;while(1){if((c|0)==4)break;f=+h[a+(c<<4)+8>>3];i=fb&1;g=((d|0)!=0&(i|0)!=(d|0)&1)+e|0;c=c+1|0;d=i;e=g}return e|0}function sl(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0.0,g=0,i=0;f=+h[a>>3];e=fb&1;c=1;d=e;e=(e|0)==0&1;while(1){if((c|0)==4)break;f=+h[a+(c<<4)>>3];i=fb&1;g=((d|0)!=0&(i|0)!=(d|0)&1)+e|0;c=c+1|0;d=i;e=g}return e|0}function tl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;c=l;l=l+16|0;d=c;e=+h[a+8>>3];h[d>>3]=+h[a>>3];h[d+8>>3]=e;i2(b,88409,d)|0;l=c;return b|0}function ul(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+16|0;s=v;u=4;t=k6(40)|0;c[t>>2]=0;r=a+16|0;e=c[r>>2]|0;a:do if(((b[e+238>>1]|0)-(b[e+236>>1]|0)|0)>=2){m=1;d=e;e=c[e+196>>2]|0;b:while(1){n=m+1|0;if(!(c[e+(n<<6)>>2]|0)){q=15;break}else k=0;while(1){h=c[e+(m<<6)>>2]|0;if((k|0)>=(h|0)){m=n;continue b}i=c[(c[e+(m<<6)+4>>2]|0)+(k<<2)>>2]|0;o=0;g=la(20,i|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){f=A6(c[d>>2]|0,t|0,u|0)|0;if(!f)Ca(d|0,p|0);D=p}else f=-1;if((f|0)==1){d=D;break b}j=k+1|0;if(g<<24>>24){g=j;d=h;while(1){if((g|0)>=(d|0))break;o=0;d=ra(65,i|0,c[(c[e+(m<<6)+4>>2]|0)+(g<<2)>>2]|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,t|0,u|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){d=D;break b}if(!(d<<24>>24))break;d=c[(c[r>>2]|0)+196>>2]|0;g=g+1|0;e=d;d=c[d+(m<<6)>>2]|0}if((g-k|0)>1){o=0;ba(15,a|0,m|0,k|0,g+-1|0,1);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,t|0,u|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;break b}}}e=c[r>>2]|0;k=j;d=e;e=c[e+196>>2]|0}}c:do if((q|0)==15){while(1){if((m|0)>0)k=0;else break;while(1){e=c[d+196>>2]|0;h=c[e+(m<<6)>>2]|0;if((k|0)>=(h|0))break;i=c[(c[e+(m<<6)+4>>2]|0)+(k<<2)>>2]|0;o=0;g=la(21,i|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){f=A6(c[d>>2]|0,t|0,u|0)|0;if(!f)Ca(d|0,p|0);D=p}else f=-1;if((f|0)==1){d=D;break c}j=k+1|0;if(g<<24>>24){g=j;d=h;while(1){if((g|0)>=(d|0))break;o=0;d=ra(66,i|0,c[(c[e+(m<<6)+4>>2]|0)+(g<<2)>>2]|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,t|0,u|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){d=D;break c}if(!(d<<24>>24))break;d=c[(c[r>>2]|0)+196>>2]|0;g=g+1|0;e=d;d=c[d+(m<<6)>>2]|0}if((g-k|0)>1){o=0;ba(15,a|0,m|0,k|0,g+-1|0,0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,t|0,u|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;break c}}}k=j;d=c[r>>2]|0}m=m+-1|0;q=15}t=x6(187184,1,t|0,u|0)|0;u=D;o=0;d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,t|0,u|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1)d=D;else d=0}while(0);d:while(1){if(d){o=0;aa(23,3,88449,s|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,t|0,u|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;continue}else break}else f=1;while(1){d=c[r>>2]|0;if((f|0)>(c[d+180>>2]|0))break a;o=0;$(101,c[(c[d+184>>2]|0)+(f<<2)>>2]|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,t|0,u|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;continue d}f=f+1|0}}}while(0);l6(t|0);l=v;return}function vl(b){b=b|0;b=c[b+16>>2]|0;if(((a[b+156>>0]|0)==1?(c[b+176>>2]|0)==1:0)?(c[b+184>>2]|0)==1:0)b=(c[b+104>>2]|0)==0&1;else b=0;return b|0}function wl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+80|0;h=i+40|0;g=i;e=c[c[(c[a+16>>2]|0)+172>>2]>>2]|0;a=c[c[(c[b+16>>2]|0)+172>>2]>>2]|0;if(((vl(b)|0)<<24>>24!=0?(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)==(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0):0)?(Cl(e,a)|0)<<24>>24!=0:0){d=(c[a+16>>2]|0)+16|0;f=g;a=(c[e+16>>2]|0)+16|0;b=f+40|0;do{c[f>>2]=c[a>>2];f=f+4|0;a=a+4|0}while((f|0)<(b|0));f=h;a=d;b=f+40|0;do{c[f>>2]=c[a>>2];f=f+4|0;a=a+4|0}while((f|0)<(b|0));a=(eg(g,h)|0)==0&1}else a=0;l=i;return a|0}function xl(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=a+16|0;q=c[(c[(c[(c[t>>2]|0)+196>>2]|0)+(b<<6)+4>>2]|0)+(d<<2)>>2]|0;p=d+1|0;m=(f|0)==1;n=q+16|0;l=p;while(1){if((l|0)>(e|0)){g=e;s=p;break}o=c[(c[(c[(c[t>>2]|0)+196>>2]|0)+(b<<6)+4>>2]|0)+(l<<2)>>2]|0;k=o+16|0;a:do if(m)while(1){d=c[k>>2]|0;j=c[c[d+180>>2]>>2]|0;if(!j)break a;h=c[(c[n>>2]|0)+180>>2]|0;i=j+-48|0;f=0;while(1){d=c[h+(f<<2)>>2]|0;if(!d){r=8;break}if((c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)==(c[((c[j>>2]&3|0)==2?j:i)+40>>2]|0))break;else f=f+1|0}if((r|0)==8){r=0;d=kh(q,c[((c[j>>2]&3|0)==2?j:i)+40>>2]|0,j)|0}while(1){f=c[c[(c[k>>2]|0)+172>>2]>>2]|0;if(!f)break;sh(f,d);fh(f)}fh(j)}else while(1){d=c[k>>2]|0;j=c[c[d+172>>2]>>2]|0;if(!j)break a;h=c[(c[n>>2]|0)+172>>2]|0;i=j+48|0;f=0;while(1){d=c[h+(f<<2)>>2]|0;if(!d){r=17;break}if((c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)==(c[((c[j>>2]&3|0)==3?j:i)+40>>2]|0))break;else f=f+1|0}if((r|0)==17){r=0;d=kh(c[((c[j>>2]&3|0)==3?j:i)+40>>2]|0,q,j)|0}while(1){f=c[c[(c[k>>2]|0)+180>>2]>>2]|0;if(!f)break;sh(f,d);fh(f)}fh(j)}while(0);if((c[d+176>>2]|0)!=(0-(c[d+184>>2]|0)|0)){r=23;break}nh(a,o);l=l+1|0}if((r|0)==23)Aa(88585,88629,115,88636);while(1){g=g+1|0;f=c[(c[t>>2]|0)+196>>2]|0;d=f+(b<<6)|0;f=c[f+(b<<6)+4>>2]|0;h=f+(s<<2)|0;if((g|0)>=(c[d>>2]|0))break;r=c[f+(g<<2)>>2]|0;c[h>>2]=r;c[(c[r+16>>2]|0)+236>>2]=s;s=s+1|0}c[d>>2]=s;c[h>>2]=0;return}function yl(b){b=b|0;b=c[b+16>>2]|0;if(((a[b+156>>0]|0)==1?(c[b+184>>2]|0)==1:0)?(c[b+176>>2]|0)==1:0)b=(c[b+104>>2]|0)==0&1;else b=0;return b|0}function zl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+80|0;h=i+40|0;g=i;e=c[c[(c[a+16>>2]|0)+180>>2]>>2]|0;a=c[c[(c[b+16>>2]|0)+180>>2]>>2]|0;if(((yl(b)|0)<<24>>24!=0?(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0)==(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0):0)?(Cl(e,a)|0)<<24>>24!=0:0){d=(c[a+16>>2]|0)+56|0;f=g;a=(c[e+16>>2]|0)+56|0;b=f+40|0;do{c[f>>2]=c[a>>2];f=f+4|0;a=a+4|0}while((f|0)<(b|0));f=h;a=d;b=f+40|0;do{c[f>>2]=c[a>>2];f=f+4|0;a=a+4|0}while((f|0)<(b|0));a=(eg(g,h)|0)==0&1}else a=0;l=i;return a|0}function Al(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+32|0;p=r+16|0;o=r;m=d+16|0;f=c[m>>2]|0;e=b[f+236>>1]|0;while(1){if((e|0)>(b[f+238>>1]|0))break;c[(c[f+268>>2]|0)+(e<<2)>>2]=0;e=e+1|0;f=c[m>>2]|0}sj(d);j=gC(d)|0;while(1){if(!j)break;Bl(d,j);i=UA(d,j)|0;while(1){if(!i)break;else f=i;while(1){e=c[(c[f+16>>2]|0)+172>>2]|0;if(!e)break;else f=e}h=i+-48|0;while(1){e=f+-48|0;g=c[((c[f>>2]&3|0)==2?f:e)+40>>2]|0;if((c[(c[g+16>>2]|0)+232>>2]|0)>=(c[(c[(c[((c[i>>2]&3|0)==2?i:h)+40>>2]|0)+16>>2]|0)+232>>2]|0))break;Bl(d,g);f=c[c[(c[(c[((c[f>>2]&3|0)==2?f:e)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0}i=WA(d,i)|0}j=hC(d,j)|0}e=c[m>>2]|0;i=b[e+236>>1]|0;while(1){if((i|0)>(b[e+238>>1]|0)){k=1;n=e;break}e=c[(c[e+268>>2]|0)+(i<<2)>>2]|0;j=c[(c[(c[(dg(d)|0)+16>>2]|0)+196>>2]|0)+(i<<6)+4>>2]|0;f=e+16|0;if((c[j+(c[(c[f>>2]|0)+236>>2]<<2)>>2]|0)!=(e|0)){q=17;break}h=c[(c[(c[(dg(d)|0)+16>>2]|0)+196>>2]|0)+(i<<6)+4>>2]|0;e=c[m>>2]|0;f=c[e+196>>2]|0;c[f+(i<<6)+4>>2]=h+(c[(c[(c[(c[e+268>>2]|0)+(i<<2)>>2]|0)+16>>2]|0)+236>>2]<<2);e=-1;h=0;a:while(1){if((h|0)>=(c[f+(i<<6)>>2]|0))break;f=c[(c[f+(i<<6)+4>>2]|0)+(h<<2)>>2]|0;if(!f)break;g=c[f+16>>2]|0;b:do if(!(a[g+156>>0]|0))if(!(EC(d,f)|0))break a;else e=h;else{f=c[c[g+172>>2]>>2]|0;while(1){if(!f)break b;g=c[(c[f+16>>2]|0)+116>>2]|0;if(!g)break;else f=g}if(EC(d,c[((c[f>>2]&3|0)==3?f:f+48|0)+40>>2]|0)|0){j=(EC(d,c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0)|0)==0;e=j?e:h}}while(0);h=h+1|0;f=c[(c[m>>2]|0)+196>>2]|0}if((e|0)==-1){c[p>>2]=HB(d)|0;c[p+4>>2]=i;dA(0,88549,p)|0}j=c[m>>2]|0;c[(c[j+196>>2]|0)+(i<<6)>>2]=e+1;i=i+1|0;e=j}if((q|0)==17){p=HB(e)|0;q=c[(c[f>>2]|0)+236>>2]|0;c[o>>2]=p;c[o+4>>2]=q;c[o+8>>2]=i;dA(1,88491,o)|0;Ca(187184,1)}while(1){if((k|0)>(c[n+180>>2]|0))break;Al(c[(c[n+184>>2]|0)+(k<<2)>>2]|0);k=k+1|0;n=c[m>>2]|0}l=r;return}function Bl(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[b+16>>2]|0;a=(c[(c[a+16>>2]|0)+268>>2]|0)+(c[d+232>>2]<<2)|0;e=c[a>>2]|0;if(!((e|0)!=0?(c[(c[e+16>>2]|0)+236>>2]|0)<=(c[d+236>>2]|0):0))c[a>>2]=b;return}function Cl(b,d){b=b|0;d=d|0;var e=0,f=0;while(1){f=c[b+16>>2]|0;if(!(a[f+112>>0]|0))break;b=c[f+116>>2]|0}while(1){e=c[d+16>>2]|0;if(!(a[e+112>>0]|0))break;d=c[e+116>>2]|0}if((a[f+153>>0]|0)==0?(a[e+153>>0]|0)==0:0){f=c[d>>2]&3;e=c[b>>2]&3;b=(S((c[(c[(c[((e|0)==3?b:b+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((e|0)==2?b:b+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0,(c[(c[(c[((f|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((f|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0)|0)>0&1}else b=0;return b|0}function Dl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+544|0;j=k+528|0;El(j,k+512|0,k);e=(a[194050]|0)+1<<24>>24;a[194050]=e<<24>>24==0?1:e;e=c[b+16>>2]|0;c[e+220>>2]=0;c[e+232>>2]=0;e=(d|0)>0;d=gC(b)|0;while(1){if(!d)break;if(e?(h=c[d+16>>2]|0,i=c[h+212>>2]|0,(i|0)!=0):0){g=c[(c[(c[i+16>>2]|0)+268>>2]|0)+(c[h+232>>2]<<2)>>2]|0;f=7}else f=6;if((f|0)==6?(f=0,(d|0)==(dP(d)|0)):0){g=d;f=7}if((f|0)==7?(0,(a[(c[g+16>>2]|0)+157>>0]|0)!=(a[194050]|0)):0){Fl(b);Gl(j,b,g);Hl(b)}d=hC(b,d)|0}Il(j);l=k;return}function El(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=d;c[b+4>>2]=d+512;c[b+12>>2]=0;c[b+8>>2]=0;c[a>>2]=b;c[a+4>>2]=b;c[a+8>>2]=d;return}function Fl(a){a=a|0;c[(c[a+16>>2]|0)+192>>2]=0;c[46835]=0;return}function Gl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+32|0;p=q;Jl(b,e);k=p+8|0;m=p+16|0;n=p+24|0;a:while(1){o=Kl(b)|0;if(!o)break;e=o+16|0;if((a[(c[e>>2]|0)+157>>0]|0)==(a[194050]|0))continue;Ll(d,o);h=c[e>>2]|0;g=h+180|0;j=c[g+4>>2]|0;i=p;c[i>>2]=c[g>>2];c[i+4>>2]=j;i=h+172|0;j=c[i+4>>2]|0;g=k;c[g>>2]=c[i>>2];c[g+4>>2]=j;g=h+188|0;j=c[g+4>>2]|0;i=m;c[i>>2]=c[g>>2];c[i+4>>2]=j;h=h+196|0;i=c[h+4>>2]|0;j=n;c[j>>2]=c[h>>2];c[j+4>>2]=i;j=3;while(1){if((j|0)<=-1)continue a;e=c[p+(j<<3)>>2]|0;b:do if(e|0){i=(c[p+(j<<3)+4>>2]|0)+-1|0;h=e+(i<<2)|0;while(1){if((i|0)<=-1)break b;f=c[h>>2]|0;g=c[f>>2]&3;e=c[((g|0)==2?f:f+-48|0)+40>>2]|0;if((e|0)==(o|0))e=c[((g|0)==3?f:f+48|0)+40>>2]|0;if((a[(c[e+16>>2]|0)+157>>0]|0)!=(a[194050]|0)?(e|0)==(dP(e)|0):0)Jl(b,e);h=h+-4|0;i=i+-1|0}}while(0);j=j+-1|0}}l=q;return}function Hl(a){a=a|0;var b=0,d=0,e=0,f=0;d=a+16|0;a=c[d>>2]|0;f=a+220|0;e=c[f>>2]|0;b=e+1|0;c[f>>2]=b;a=c[a+216>>2]|0;b=b<<2;if(!a)a=IK(b)|0;else a=KK(a,b)|0;f=c[d>>2]|0;c[f+216>>2]=a;c[a+(e<<2)>>2]=c[f+192>>2];return}function Il(a){a=a|0;var b=0;a=c[(c[a>>2]|0)+12>>2]|0;while(1){if(!a)break;b=c[a+12>>2]|0;l6(c[a>>2]|0);l6(a);a=b}return}function Jl(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;h=k+8|0;g=k;j=b+8|0;f=c[j>>2]|0;i=b+4|0;b=c[i>>2]|0;if((f|0)==(c[b+4>>2]|0)){f=c[b+12>>2]|0;if(!f){f=HK(16)|0;if(!f)dA(1,99270,g)|0;c[f+8>>2]=c[i>>2];c[f+12>>2]=0;b=HK(4e6)|0;c[f>>2]=b;if(!b){dA(1,88649,h)|0;b=c[f>>2]|0}c[f+4>>2]=b+4e6;c[(c[i>>2]|0)+12>>2]=f}c[i>>2]=f;f=c[f>>2]|0;c[j>>2]=f}a[(c[e+16>>2]|0)+157>>0]=(d[194050]|0)+1;c[j>>2]=f+4;c[f>>2]=e;l=k;return}function Kl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=a+8|0;b=c[f>>2]|0;d=a+4|0;e=c[d>>2]|0;if((b|0)==(c[e>>2]|0))if((e|0)==(c[a>>2]|0))b=0;else{b=c[e+8>>2]|0;c[d>>2]=b;b=c[b+4>>2]|0;c[f>>2]=b;g=4}else g=4;if((g|0)==4){b=b+-4|0;c[f>>2]=b;b=c[b>>2]|0}return b|0}function Ll(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=c[b+16>>2]|0;g=f+232|0;c[g>>2]=(c[g>>2]|0)+1;g=c[d+16>>2]|0;a[g+157>>0]=a[194050]|0;b=c[46835]|0;e=g+168|0;if(!b){c[e>>2]=0;c[f+192>>2]=d}else{c[e>>2]=b;c[(c[b+16>>2]|0)+164>>2]=d}c[46835]=d;c[g+164>>2]=0;return}function Ml(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0;m=b+16|0;d=(c[m>>2]|0)+192|0;while(1){d=c[d>>2]|0;if(!d)break;g=d+16|0;d=c[g>>2]|0;e=c[d+188>>2]|0;a:do if(!e)f=0;else{f=0;while(1){e=c[e+(f<<2)>>2]|0;if(!e){f=0;break a}Nl(e);d=c[g>>2]|0;f=f+1|0;e=c[d+188>>2]|0}}while(0);while(1){if((f|0)>=(c[d+208>>2]|0))break;e=c[(c[d+204>>2]|0)+(f<<2)>>2]|0;l=c[e>>2]&3;if((c[(c[(c[((l|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)==(c[(c[(c[((l|0)==3?e:e+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)){Nl(e);d=c[g>>2]|0}f=f+1|0}d=d+164|0}l=c[m>>2]|0;d=c[l+196>>2]|0;if(!((c[d+56>>2]|0)==0?(c[l+180>>2]|0)<=0:0))i=13;b:do if((i|0)==13){i=c[d+4>>2]|0;g=0;c:while(1){d=c[i+(g<<2)>>2]|0;if(!d)break b;e=c[(c[d+16>>2]|0)+196>>2]|0;d=0;while(1){f=c[e+(d<<2)>>2]|0;if(!f)break;l=c[f+16>>2]|0;if(c[l+96>>2]|0?(a[l+113>>0]|0)==0:0)break c;d=d+1|0}g=g+1|0}Ol(b)}while(0);Ei(b);e=0;d=(c[m>>2]|0)+192|0;while(1){d=c[d>>2]|0;if(!d)break;l=d+16|0;d=c[l>>2]|0;f=c[d+188>>2]|0;d:do if(f){k=0;while(1){g=c[f+(k<<2)>>2]|0;if(!g){k=0;break}i=c[g+16>>2]|0;j=c[i+96>>2]|0;do if(j)if(!(a[i+113>>0]|0)){Pl(g);f=c[l>>2]|0;e=1;d=f;f=c[f+188>>2]|0;break}else{h[i+136>>3]=+h[((c[(c[m>>2]|0)+116>>2]&1|0)==0?j+24|0:j+32|0)>>3];break}while(0);k=k+1|0}while(1){if((k|0)>=(c[d+208>>2]|0))break d;i=c[(c[d+204>>2]|0)+(k<<2)>>2]|0;j=c[i>>2]&3;g=c[((j|0)==3?i:i+48|0)+40>>2]|0;j=c[((j|0)==2?i:i+-48|0)+40>>2]|0;do if(!((g|0)==(j|0)?1:(c[(c[g+16>>2]|0)+232>>2]|0)!=(c[(c[j+16>>2]|0)+232>>2]|0))){f=i;do{j=c[f+16>>2]|0;f=c[j+172>>2]|0}while((f|0)!=0);f=a[j+113>>0]|0;g=c[i+16>>2]|0;a[g+113>>0]=f;g=c[g+96>>2]|0;if(g)if(!(f<<24>>24)){Pl(i);e=1;d=c[l>>2]|0;break}else{o=+h[((c[(c[m>>2]|0)+116>>2]&1|0)==0?g+24|0:g+32|0)>>3];j=j+136|0;n=+h[j>>3];h[j>>3]=o>n?o:n;break}}while(0);k=k+1|0}}while(0);d=d+164|0}if(e|0){xh(b);Lh(b)}return e|0}function Nl(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=c[b>>2]&3;i=c[((d|0)==3?b:b+48|0)+40>>2]|0;f=i+16|0;g=c[(c[f>>2]|0)+236>>2]|0;d=c[(c[(c[((d|0)==2?b:b+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;h=(g|0)<(d|0);e=h?d:g;i=c[(c[(dg(i)|0)+16>>2]|0)+196>>2]|0;f=i+(c[(c[f>>2]|0)+232>>2]<<6)+4|0;d=h?g:d;a:while(1){d=d+1|0;if((d|0)>=(e|0))break;g=c[(c[(c[f>>2]|0)+(d<<2)>>2]|0)+16>>2]|0;switch(a[g+156>>0]|0){case 0:break a;case 1:break;default:continue a}if(c[g+104>>2]|0)break}if((d|0)==(e|0))do{i=c[b+16>>2]|0;a[i+113>>0]=1;b=c[i+172>>2]|0}while((b|0)!=0);return} -function r3(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=l;l=l+256|0;e=h;a:do if((d|0)>=2?(g=b+(d<<2)|0,c[g>>2]=e,a|0):0)while(1){f=a>>>0<256?a:256;B6(e|0,c[b>>2]|0,f|0)|0;e=0;do{i=b+(e<<2)|0;e=e+1|0;B6(c[i>>2]|0,c[b+(e<<2)>>2]|0,f|0)|0;c[i>>2]=(c[i>>2]|0)+f}while((e|0)!=(d|0));a=a-f|0;if(!a)break a;e=c[g>>2]|0}while(0);l=h;return}function s3(b,e,f){b=b|0;e=e|0;f=f|0;var g=0.0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;switch(e|0){case 0:{l=-149;m=24;j=4;break}case 1:{l=-1074;m=53;j=4;break}case 2:{l=-1074;m=53;j=4;break}default:g=0.0}a:do if((j|0)==4){o=b+4|0;n=b+100|0;do{e=c[o>>2]|0;if(e>>>0<(c[n>>2]|0)>>>0){c[o>>2]=e+1;e=d[e>>0]|0}else e=W1(b)|0}while((X1(e)|0)!=0);b:do switch(e|0){case 43:case 45:{i=1-(((e|0)==45&1)<<1)|0;e=c[o>>2]|0;if(e>>>0<(c[n>>2]|0)>>>0){c[o>>2]=e+1;h=d[e>>0]|0;break b}else{h=W1(b)|0;break b}}default:{h=e;i=1}}while(0);e=0;do{if((h|32|0)!=(a[153600+e>>0]|0))break;do if(e>>>0<7){h=c[o>>2]|0;if(h>>>0<(c[n>>2]|0)>>>0){c[o>>2]=h+1;h=d[h>>0]|0;break}else{h=W1(b)|0;break}}while(0);e=e+1|0}while(e>>>0<8);c:do switch(e|0){case 8:break;case 3:{j=23;break}default:{k=(f|0)!=0;if(k&e>>>0>3)if((e|0)==8)break c;else{j=23;break c}d:do if(!e){e=0;do{if((h|32|0)!=(a[153609+e>>0]|0))break d;do if(e>>>0<2){h=c[o>>2]|0;if(h>>>0<(c[n>>2]|0)>>>0){c[o>>2]=h+1;h=d[h>>0]|0;break}else{h=W1(b)|0;break}}while(0);e=e+1|0}while(e>>>0<3)}while(0);switch(e|0){case 3:{e=c[o>>2]|0;if(e>>>0<(c[n>>2]|0)>>>0){c[o>>2]=e+1;e=d[e>>0]|0}else e=W1(b)|0;if((e|0)==40)e=1;else{if(!(c[n>>2]|0)){g=s;break a}c[o>>2]=(c[o>>2]|0)+-1;g=s;break a}while(1){h=c[o>>2]|0;if(h>>>0<(c[n>>2]|0)>>>0){c[o>>2]=h+1;h=d[h>>0]|0}else h=W1(b)|0;if(!((h+-48|0)>>>0<10|(h+-65|0)>>>0<26)?!((h|0)==95|(h+-97|0)>>>0<26):0)break;e=e+1|0}if((h|0)==41){g=s;break a}h=(c[n>>2]|0)==0;if(!h)c[o>>2]=(c[o>>2]|0)+-1;if(!k){c[(L1()|0)>>2]=22;U1(b,0);g=0.0;break a}if(!e){g=s;break a}while(1){e=e+-1|0;if(!h)c[o>>2]=(c[o>>2]|0)+-1;if(!e){g=s;break a}}}case 0:{if((h|0)==48){e=c[o>>2]|0;if(e>>>0<(c[n>>2]|0)>>>0){c[o>>2]=e+1;e=d[e>>0]|0}else e=W1(b)|0;if((e|32|0)==120){g=+t3(b,m,l,i,f);break a}if(!(c[n>>2]|0))e=48;else{c[o>>2]=(c[o>>2]|0)+-1;e=48}}else e=h;g=+u3(b,e,m,l,i,f);break a}default:{if(c[n>>2]|0)c[o>>2]=(c[o>>2]|0)+-1;c[(L1()|0)>>2]=22;U1(b,0);g=0.0;break a}}}}while(0);if((j|0)==23){h=(c[n>>2]|0)==0;if(!h)c[o>>2]=(c[o>>2]|0)+-1;if((f|0)!=0&e>>>0>3)do{if(!h)c[o>>2]=(c[o>>2]|0)+-1;e=e+-1|0}while(e>>>0>3)}g=+(i|0)*t}while(0);return +g}function t3(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0.0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=a+4|0;i=c[w>>2]|0;v=a+100|0;if(i>>>0<(c[v>>2]|0)>>>0){c[w>>2]=i+1;i=d[i>>0]|0;j=0}else{i=W1(a)|0;j=0}a:while(1){switch(i|0){case 46:{n=8;break a}case 48:break;default:{s=0;t=0;p=1.0;h=0.0;u=0;r=j;j=0;q=0;m=0;l=0;break a}}i=c[w>>2]|0;if(i>>>0<(c[v>>2]|0)>>>0){c[w>>2]=i+1;i=d[i>>0]|0;j=1;continue}else{i=W1(a)|0;j=1;continue}}if((n|0)==8){i=c[w>>2]|0;if(i>>>0<(c[v>>2]|0)>>>0){c[w>>2]=i+1;i=d[i>>0]|0}else i=W1(a)|0;if((i|0)==48){l=0;j=0;do{i=c[w>>2]|0;if(i>>>0<(c[v>>2]|0)>>>0){c[w>>2]=i+1;i=d[i>>0]|0}else i=W1(a)|0;l=w6(l|0,j|0,-1,-1)|0;j=D}while((i|0)==48);s=1;t=0;p=1.0;h=0.0;u=0;r=1;q=0;m=0}else{s=1;t=0;p=1.0;h=0.0;u=0;r=j;j=0;q=0;m=0;l=0}}while(1){n=i+-48|0;o=(i|0)==46;if(n>>>0>=10?!(o|((i|32)+-97|0)>>>0<6):0)break;if(o)if(!s){s=1;n=t;k=p;i=u;l=m;j=q}else{i=46;break}else{i=(i|0)>57?(i|32)+-87|0:n;do if(!((q|0)<0|(q|0)==0&m>>>0<8))if((q|0)<0|(q|0)==0&m>>>0<14){p=p*.0625;n=t;k=p;h=h+p*+(i|0);i=u;break}else{i=(t|0)!=0|(i|0)==0;n=i?t:1;k=p;h=i?h:h+p*.5;i=u;break}else{n=t;k=p;i=i+(u<<4)|0}while(0);m=w6(m|0,q|0,1,0)|0;r=1;q=D}o=c[w>>2]|0;if(o>>>0<(c[v>>2]|0)>>>0){c[w>>2]=o+1;t=n;p=k;u=i;i=d[o>>0]|0;continue}else{t=n;p=k;u=i;i=W1(a)|0;continue}}do if(!r){i=c[v>>2]|0;j=(i|0)!=0;if(j)c[w>>2]=(c[w>>2]|0)+-1;if(g){if(j)c[w>>2]=(c[w>>2]|0)+-1;if(!((s|0)==0|(i|0)==0))c[w>>2]=(c[w>>2]|0)+-1}else U1(a,0);h=+(f|0)*0.0}else{n=(s|0)==0;o=n?m:l;n=n?q:j;if((q|0)<0|(q|0)==0&m>>>0<8){j=u;l=q;do{j=j<<4;m=w6(m|0,l|0,1,0)|0;l=D}while((l|0)<0|(l|0)==0&m>>>0<8);m=j}else m=u;if((i|32|0)==112){j=v3(a,g)|0;i=D;if((j|0)==0&(i|0)==-2147483648){if(!g){U1(a,0);h=0.0;break}if(!(c[v>>2]|0)){j=0;i=0}else{c[w>>2]=(c[w>>2]|0)+-1;j=0;i=0}}}else if(!(c[v>>2]|0)){j=0;i=0}else{c[w>>2]=(c[w>>2]|0)+-1;j=0;i=0}l=v6(o|0,n|0,2)|0;l=w6(l|0,D|0,-32,-1)|0;l=w6(l|0,D|0,j|0,i|0)|0;i=D;if(!m){h=+(f|0)*0.0;break}w=0-e|0;g=((w|0)<0)<<31>>31;if((i|0)>(g|0)|(i|0)==(g|0)&l>>>0>w>>>0){c[(L1()|0)>>2]=34;h=+(f|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}w=e+-106|0;g=((w|0)<0)<<31>>31;if((i|0)<(g|0)|(i|0)==(g|0)&l>>>0>>0){c[(L1()|0)>>2]=34;h=+(f|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if((m|0)>-1){j=m;do{w=!(h>=.5);j=j<<1|(w^1)&1;h=h+(w?h:h+-1.0);l=w6(l|0,i|0,-1,-1)|0;i=D}while((j|0)>-1);p=h;m=j}else p=h;w=((b|0)<0)<<31>>31;e=t6(32,0,e|0,((e|0)<0)<<31>>31|0)|0;i=w6(e|0,D|0,l|0,i|0)|0;e=D;if((w|0)>(e|0)|(w|0)==(e|0)&b>>>0>i>>>0)if((i|0)>0)n=59;else{j=0;i=84;n=61}else{i=b;n=59}if((n|0)==59)if((i|0)<53){j=i;i=84-i|0;n=61}else{k=0.0;h=+(f|0)}if((n|0)==61){h=+(f|0);k=+x3(+w3(1.0,i),h);i=j}f=(m&1|0)==0&(p!=0.0&(i|0)<32);h=h*(f?0.0:p)+(k+h*+(((f&1)+m|0)>>>0))-k;if(!(h!=0.0))c[(L1()|0)>>2]=34;h=+z3(h,l)}while(0);return +h}function u3(a,b,e,f,g,h){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,G=0,H=0,I=0,J=0,K=0.0;J=l;l=l+512|0;G=J;H=f+e|0;I=0-H|0;B=a+4|0;C=a+100|0;k=0;a:while(1){switch(b|0){case 46:{z=6;break a}case 48:break;default:{v=0;p=k;q=0;o=0;break a}}b=c[B>>2]|0;if(b>>>0<(c[C>>2]|0)>>>0){c[B>>2]=b+1;b=d[b>>0]|0;k=1;continue}else{b=W1(a)|0;k=1;continue}}if((z|0)==6){b=c[B>>2]|0;if(b>>>0<(c[C>>2]|0)>>>0){c[B>>2]=b+1;b=d[b>>0]|0}else b=W1(a)|0;if((b|0)==48){k=0;b=0;while(1){k=w6(k|0,b|0,-1,-1)|0;o=D;b=c[B>>2]|0;if(b>>>0<(c[C>>2]|0)>>>0){c[B>>2]=b+1;b=d[b>>0]|0}else b=W1(a)|0;if((b|0)==48)b=o;else{v=1;p=1;q=k;break}}}else{v=1;p=k;q=0;o=0}}c[G>>2]=0;n=b+-48|0;m=(b|0)==46;b:do if(m|n>>>0<10){A=G+496|0;w=0;k=0;u=0;x=v;y=p;z=n;p=0;n=0;c:while(1){do if(m)if(!x){x=1;q=p;o=n}else break c;else{p=w6(p|0,n|0,1,0)|0;n=D;v=(b|0)!=48;if((k|0)>=125){if(!v)break;c[A>>2]=c[A>>2]|1;break}m=G+(k<<2)|0;if(!w)b=z;else b=b+-48+((c[m>>2]|0)*10|0)|0;c[m>>2]=b;w=w+1|0;y=(w|0)==9;w=y?0:w;k=(y&1)+k|0;u=v?p:u;y=1}while(0);b=c[B>>2]|0;if(b>>>0<(c[C>>2]|0)>>>0){c[B>>2]=b+1;b=d[b>>0]|0}else b=W1(a)|0;z=b+-48|0;m=(b|0)==46;if(!(m|z>>>0<10)){v=x;m=y;z=29;break b}}b=w;m=(y|0)!=0;z=37}else{w=0;k=0;u=0;m=p;p=0;n=0;z=29}while(0);do if((z|0)==29){A=(v|0)==0;q=A?p:q;o=A?n:o;m=(m|0)!=0;if(!(m&(b|32|0)==101))if((b|0)>-1){b=w;z=37;break}else{b=w;z=39;break}m=v3(a,h)|0;b=D;if((m|0)==0&(b|0)==-2147483648){if(!h){U1(a,0);i=0.0;break}if(!(c[C>>2]|0)){m=0;b=0}else{c[B>>2]=(c[B>>2]|0)+-1;m=0;b=0}}y=w6(m|0,b|0,q|0,o|0)|0;b=w;o=D;z=41}while(0);if((z|0)==37)if(c[C>>2]|0){c[B>>2]=(c[B>>2]|0)+-1;if(m){y=q;z=41}else z=40}else z=39;if((z|0)==39)if(m){y=q;z=41}else z=40;do if((z|0)==40){c[(L1()|0)>>2]=22;U1(a,0);i=0.0}else if((z|0)==41){m=c[G>>2]|0;if(!m){i=+(g|0)*0.0;break}if(((n|0)<0|(n|0)==0&p>>>0<10)&((y|0)==(p|0)&(o|0)==(n|0))?(e|0)>30|(m>>>e|0)==0:0){i=+(g|0)*+(m>>>0);break}a=(f|0)/-2|0;C=((a|0)<0)<<31>>31;if((o|0)>(C|0)|(o|0)==(C|0)&y>>>0>a>>>0){c[(L1()|0)>>2]=34;i=+(g|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}a=f+-106|0;C=((a|0)<0)<<31>>31;if((o|0)<(C|0)|(o|0)==(C|0)&y>>>0>>0){c[(L1()|0)>>2]=34;i=+(g|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if(b){if((b|0)<9){n=G+(k<<2)|0;m=c[n>>2]|0;do{m=m*10|0;b=b+1|0}while((b|0)!=9);c[n>>2]=m}k=k+1|0}if((u|0)<9?(u|0)<=(y|0)&(y|0)<18:0){b=c[G>>2]|0;if((y|0)==9){i=+(g|0)*+(b>>>0);break}if((y|0)<9){i=+(g|0)*+(b>>>0)/+(c[63704+(8-y<<2)>>2]|0);break}a=e+27+(S(y,-3)|0)|0;if((a|0)>30|(b>>>a|0)==0){i=+(g|0)*+(b>>>0)*+(c[63704+(y+-10<<2)>>2]|0);break}}b=(y|0)%9|0;if(!b){b=0;n=0}else{u=(y|0)>-1?b:b+9|0;p=c[63704+(8-u<<2)>>2]|0;if(k){q=1e9/(p|0)|0;n=0;o=0;m=y;b=0;do{B=G+(b<<2)|0;C=c[B>>2]|0;a=((C>>>0)/(p>>>0)|0)+n|0;c[B>>2]=a;n=S(q,(C>>>0)%(p>>>0)|0)|0;a=(b|0)==(o|0)&(a|0)==0;m=a?m+-9|0:m;o=a?o+1&127:o;b=b+1|0}while((b|0)!=(k|0));if(!n)n=o;else{c[G+(k<<2)>>2]=n;n=o;k=k+1|0}}else{n=0;k=0;m=y}b=0;y=9-u+m|0}d:while(1){u=(y|0)<18;v=(y|0)==18;w=G+(n<<2)|0;while(1){if(!u){if(!v){m=y;break d}if((c[w>>2]|0)>>>0>=9007199){m=18;break d}}m=0;x=k;k=k+127|0;while(1){o=k&127;p=G+(o<<2)|0;k=v6(c[p>>2]|0,0,29)|0;k=w6(k|0,D|0,m|0,0)|0;m=D;if(m>>>0>0|(m|0)==0&k>>>0>1e9){q=E6(k|0,m|0,1e9,0)|0;k=J6(k|0,m|0,1e9,0)|0}else q=0;c[p>>2]=k;a=(o|0)==(n|0);x=(k|0)==0&(((o|0)!=(x+127&127|0)|a)^1)?o:x;if(a)break;else{m=q;k=o+-1|0}}b=b+-29|0;if(q|0)break;else k=x}n=n+127&127;k=x+127&127;m=G+((x+126&127)<<2)|0;if((n|0)==(x|0))c[m>>2]=c[m>>2]|c[G+(k<<2)>>2];else k=x;c[G+(n<<2)>>2]=q;y=y+9|0}e:while(1){w=k+1&127;x=G+((k+127&127)<<2)|0;while(1){q=(m|0)==18;v=(m|0)>27?9:1;y=n;while(1){n=0;while(1){o=n+y&127;if((o|0)==(k|0)){E=2;z=88;break}o=c[G+(o<<2)>>2]|0;p=c[63736+(n<<2)>>2]|0;if(o>>>0

>>0){E=2;z=88;break}if(o>>>0>p>>>0)break;n=n+1|0;if((n|0)>=2){E=n;z=88;break}}if((z|0)==88?(z=0,q&(E|0)==2):0){i=0.0;o=0;break e}b=v+b|0;if((y|0)==(k|0))y=k;else break}q=(1<>>v;p=0;n=y;o=y;do{B=G+(o<<2)|0;C=c[B>>2]|0;a=(C>>>v)+p|0;c[B>>2]=a;p=S(C&q,u)|0;a=(o|0)==(n|0)&(a|0)==0;m=a?m+-9|0:m;n=a?n+1&127:n;o=o+1&127}while((o|0)!=(k|0));if(!p)continue;if((w|0)!=(n|0))break;c[x>>2]=c[x>>2]|1}c[G+(k<<2)>>2]=p;k=w}do{n=o+y&127;m=k+1&127;if((n|0)==(k|0)){c[G+(m+-1<<2)>>2]=0;k=m}i=i*1.0e9+ +((c[G+(n<<2)>>2]|0)>>>0);o=o+1|0}while((o|0)!=2);t=+(g|0);j=t*i;o=b+53|0;p=o-f|0;q=(p|0)<(e|0);n=q?((p|0)>0?p:0):e;if((n|0)<53){K=+x3(+w3(1.0,105-n|0),j);r=+y3(j,+w3(1.0,53-n|0));s=K;i=r;r=K+(j-r)}else{s=0.0;i=0.0;r=j}m=y+2&127;if((m|0)!=(k|0)){m=c[G+(m<<2)>>2]|0;do if(m>>>0>=5e8){if((m|0)!=5e8){i=t*.75+i;break}if((y+3&127|0)==(k|0)){i=t*.5+i;break}else{i=t*.75+i;break}}else{if((m|0)==0?(y+3&127|0)==(k|0):0)break;i=t*.25+i}while(0);if((53-n|0)>1?!(+y3(i,1.0)!=0.0):0)j=i+1.0;else j=i}else j=i;i=r+j-s;do if((o&2147483647|0)>(-2-H|0)){H=!(+F(+i)>=9007199254740992.0);b=((H^1)&1)+b|0;i=H?i:i*.5;if((b+50|0)<=(I|0)?!(j!=0.0&(q&((n|0)!=(p|0)|H))):0)break;c[(L1()|0)>>2]=34}while(0);i=+z3(i,b)}while(0);l=J;return +i}function v3(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=a+4|0;e=c[k>>2]|0;j=a+100|0;if(e>>>0<(c[j>>2]|0)>>>0){c[k>>2]=e+1;e=d[e>>0]|0}else e=W1(a)|0;switch(e|0){case 43:case 45:{f=(e|0)==45&1;e=c[k>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[k>>2]=e+1;e=d[e>>0]|0}else e=W1(a)|0;if((b|0)!=0&(e+-48|0)>>>0>9?(c[j>>2]|0)!=0:0)c[k>>2]=(c[k>>2]|0)+-1;break}default:f=0}if((e+-48|0)>>>0>9)if(!(c[j>>2]|0)){f=-2147483648;e=0}else{c[k>>2]=(c[k>>2]|0)+-1;f=-2147483648;e=0}else{g=0;do{g=e+-48+(g*10|0)|0;e=c[k>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[k>>2]=e+1;e=d[e>>0]|0}else e=W1(a)|0}while((e+-48|0)>>>0<10&(g|0)<214748364);b=((g|0)<0)<<31>>31;if((e+-48|0)>>>0<10){do{b=G6(g|0,b|0,10,0)|0;g=D;e=w6(e|0,((e|0)<0)<<31>>31|0,-48,-1)|0;g=w6(e|0,D|0,b|0,g|0)|0;b=D;e=c[k>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[k>>2]=e+1;e=d[e>>0]|0}else e=W1(a)|0}while((e+-48|0)>>>0<10&((b|0)<21474836|(b|0)==21474836&g>>>0<2061584302));h=e;i=g}else{h=e;i=g}e=c[j>>2]|0;if((h+-48|0)>>>0<10)do{g=c[k>>2]|0;if(g>>>0>>0){c[k>>2]=g+1;g=d[g>>0]|0}else{g=W1(a)|0;e=c[j>>2]|0}}while((g+-48|0)>>>0<10);if(e|0)c[k>>2]=(c[k>>2]|0)+-1;k=(f|0)!=0;e=t6(0,0,i|0,b|0)|0;f=k?D:b;e=k?e:i}D=f;return e|0}function w3(a,b){a=+a;b=b|0;var d=0,e=0;if((b|0)<=1023){if((b|0)<-1022){a=a*2.2250738585072014e-308;d=b+1022|0;e=(d|0)<-1022;b=b+2044|0;a=e?a*2.2250738585072014e-308:a;b=e?((b|0)>-1022?b:-1022):d}}else{a=a*8988465674311579538646525.0e283;e=b+-1023|0;d=(e|0)>1023;b=b+-2046|0;a=d?a*8988465674311579538646525.0e283:a;b=d?((b|0)<1023?b:1023):e}d=v6(b+1023|0,0,52)|0;e=D;c[j>>2]=d;c[j+4>>2]=e;return +(a*+h[j>>3])}function x3(a,b){a=+a;b=+b;return +(+e2(a,b))}function y3(a,b){a=+a;b=+b;return +(+A3(a,b))}function z3(a,b){a=+a;b=b|0;return +(+w3(a,b))}function A3(a,b){a=+a;b=+b;var d=0,e=0,f=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h[j>>3]=a;i=c[j>>2]|0;l=c[j+4>>2]|0;h[j>>3]=b;n=c[j>>2]|0;o=c[j+4>>2]|0;e=z6(i|0,l|0,52)|0;e=e&2047;m=z6(n|0,o|0,52)|0;m=m&2047;p=l&-2147483648;g=v6(n|0,o|0,1)|0;k=D;a:do if(!((g|0)==0&(k|0)==0)?(f=B3(b)|0,d=D&2147483647,!((e|0)==2047|(d>>>0>2146435072|(d|0)==2146435072&f>>>0>0))):0){d=v6(i|0,l|0,1)|0;f=D;if(!(f>>>0>k>>>0|(f|0)==(k|0)&d>>>0>g>>>0))return +((d|0)==(g|0)&(f|0)==(k|0)?a*0.0:a);if(!e){d=v6(i|0,l|0,12)|0;f=D;if((f|0)>-1|(f|0)==-1&d>>>0>4294967295){e=0;do{e=e+-1|0;d=v6(d|0,f|0,1)|0;f=D}while((f|0)>-1|(f|0)==-1&d>>>0>4294967295)}else e=0;i=v6(i|0,l|0,1-e|0)|0;g=D}else g=l&1048575|1048576;if(!m){f=v6(n|0,o|0,12)|0;k=D;if((k|0)>-1|(k|0)==-1&f>>>0>4294967295){d=0;do{d=d+-1|0;f=v6(f|0,k|0,1)|0;k=D}while((k|0)>-1|(k|0)==-1&f>>>0>4294967295)}else d=0;n=v6(n|0,o|0,1-d|0)|0;m=d;l=D}else l=o&1048575|1048576;f=t6(i|0,g|0,n|0,l|0)|0;d=D;k=(d|0)>-1|(d|0)==-1&f>>>0>4294967295;b:do if((e|0)>(m|0)){while(1){if(k){if((f|0)==0&(d|0)==0)break}else{f=i;d=g}i=v6(f|0,d|0,1)|0;g=D;e=e+-1|0;f=t6(i|0,g|0,n|0,l|0)|0;d=D;k=(d|0)>-1|(d|0)==-1&f>>>0>4294967295;if((e|0)<=(m|0))break b}b=a*0.0;break a}while(0);if(k){if((f|0)==0&(d|0)==0){b=a*0.0;break}}else{d=g;f=i}if(d>>>0<1048576|(d|0)==1048576&f>>>0<0)do{f=v6(f|0,d|0,1)|0;d=D;e=e+-1|0}while(d>>>0<1048576|(d|0)==1048576&f>>>0<0);if((e|0)>0){o=w6(f|0,d|0,0,-1048576)|0;d=D;e=v6(e|0,0,52)|0;d=d|D;e=o|e}else{e=z6(f|0,d|0,1-e|0)|0;d=D}c[j>>2]=e;c[j+4>>2]=d|p;b=+h[j>>3]}else q=3;while(0);if((q|0)==3){b=a*b;b=b/b}return +b}function B3(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;D=c[j+4>>2]|0;return b|0}function C3(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;f=a[b>>0]|0;e=f&255;a:do if(f<<24>>24){g=f;do{f=a[c>>0]|0;if(!(f<<24>>24))break a;if(g<<24>>24!=f<<24>>24?(g=R1(e)|0,(g|0)!=(R1(f&255)|0)):0)break a;b=b+1|0;c=c+1|0;g=a[b>>0]|0;e=g&255}while(g<<24>>24!=0)}while(0);g=R1(e)|0;return g-(R1(d[c>>0]|0)|0)|0}function D3(b){b=b|0;var d=0,e=0,f=0;f=b;a:do if(!(f&3))e=4;else{d=f;while(1){if(!(a[b>>0]|0)){b=d;break a}b=b+1|0;d=b;if(!(d&3)){e=4;break}}}while(0);if((e|0)==4){while(1){d=c[b>>2]|0;if(!((d&-2139062144^-2139062144)&d+-16843009))b=b+4|0;else break}if((d&255)<<24>>24)do b=b+1|0;while((a[b>>0]|0)!=0)}return b-f|0}function E3(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;H3();c[e>>2]=a;c[e+4>>2]=b;b=K1(Ma(91,e|0)|0)|0;l=d;return b|0}function F3(b,c){b=b|0;c=c|0;b=G3(b,c)|0;return ((a[b>>0]|0)==(c&255)<<24>>24?b:0)|0}function G3(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d&255;a:do if(!f)b=b+(D3(b)|0)|0;else{if(b&3){e=d&255;do{g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break a;b=b+1|0}while((b&3|0)!=0)}f=S(f,16843009)|0;e=c[b>>2]|0;b:do if(!((e&-2139062144^-2139062144)&e+-16843009))do{g=e^f;if((g&-2139062144^-2139062144)&g+-16843009|0)break b;b=b+4|0;e=c[b>>2]|0}while(!((e&-2139062144^-2139062144)&e+-16843009|0));while(0);e=d&255;while(1){g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break;else b=b+1|0}}while(0);return b|0}function H3(){return}function I3(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+16|0;g=k;i=(f|0)==0?190424:f;f=c[i>>2]|0;a:do if(!d)if(!f)f=0;else j=17;else{h=(b|0)==0?g:b;if(!e)f=-2;else{if(!f){f=a[d>>0]|0;if(f<<24>>24>-1){c[h>>2]=f&255;f=f<<24>>24!=0&1;break}g=(c[c[(J3()|0)+188>>2]>>2]|0)==0;f=a[d>>0]|0;if(g){c[h>>2]=f<<24>>24&57343;f=1;break}f=(f&255)+-194|0;if(f>>>0>50){j=17;break}f=c[62656+(f<<2)>>2]|0;g=e+-1|0;if(g){d=d+1|0;j=11}}else{g=e;j=11}b:do if((j|0)==11){b=a[d>>0]|0;m=(b&255)>>>3;if((m+-16|m+(f>>26))>>>0>7){j=17;break a}while(1){d=d+1|0;f=(b&255)+-128|f<<6;g=g+-1|0;if((f|0)>=0)break;if(!g)break b;b=a[d>>0]|0;if((b&-64)<<24>>24!=-128){j=17;break a}}c[i>>2]=0;c[h>>2]=f;f=e-g|0;break a}while(0);c[i>>2]=f;f=-2}}while(0);if((j|0)==17){c[i>>2]=0;c[(L1()|0)>>2]=84;f=-1}l=k;return f|0}function J3(){return N1()|0}function K3(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+272|0;n=p+8|0;o=p;do if(!(a[d>>0]|0)){d=Na(153613)|0;if(d|0?a[d>>0]|0:0)break;d=Na(153620+(b*12|0)|0)|0;if(d|0?a[d>>0]|0:0)break;d=Na(153692)|0;if(d|0?a[d>>0]|0:0)break;d=153697}while(0);e=0;a:do{switch(a[d+e>>0]|0){case 47:case 0:break a;default:{}}e=e+1|0}while(e>>>0<15);f=a[d>>0]|0;if(f<<24>>24!=46?(a[d+e>>0]|0)==0:0)if(f<<24>>24==67)m=15;else{k=d;m=16}else{d=153697;m=15}if((m|0)==15)if(!(a[d+1>>0]|0))m=18;else{k=d;m=16}b:do if((m|0)==16)if((f2(k,153697)|0)!=0?(f2(k,153705)|0)!=0:0){d=c[47607]|0;if(d|0)do{if(!(f2(k,d+8|0)|0))break b;d=c[d+24>>2]|0}while((d|0)!=0);Ua(190432);d=c[47607]|0;c:do if(d|0){while(1){if(!(f2(k,d+8|0)|0))break;d=c[d+24>>2]|0;if(!d)break c}Ra(190432);break b}while(0);d:do if(((c[47592]|0)==0?(g=Na(153711)|0,(g|0)!=0):0)?(a[g>>0]|0)!=0:0){i=254-e|0;j=e+1|0;f=g;while(1){h=G3(f,58)|0;d=a[h>>0]|0;g=((d<<24>>24!=0)<<31>>31)+(h-f)|0;if(g>>>0>>0){B6(n|0,f|0,g|0)|0;f=n+g|0;a[f>>0]=47;B6(f+1|0,k|0,e|0)|0;a[n+(j+g)>>0]=0;g=Oa(n|0,o|0)|0;if(g|0)break;d=a[h>>0]|0}f=h+(d<<24>>24!=0&1)|0;if(!(a[f>>0]|0)){m=41;break d}}d=k6(28)|0;f=c[o>>2]|0;if(!d){E3(g,f)|0;m=41;break}else{c[d>>2]=g;c[d+4>>2]=f;o=d+8|0;B6(o|0,k|0,e|0)|0;a[o+e>>0]=0;c[d+24>>2]=c[47607];c[47607]=d;break}}else m=41;while(0);if((m|0)==41){d=k6(28)|0;if(d){c[d>>2]=c[15652];c[d+4>>2]=c[15653];o=d+8|0;B6(o|0,k|0,e|0)|0;a[o+e>>0]=0;c[d+24>>2]=c[47607];c[47607]=d}}Ra(190432);d=(b|0)==0&(d|0)==0?62608:d}else{d=k;m=18}while(0);do if((m|0)==18){if((b|0)==0?(a[d+1>>0]|0)==46:0){d=62608;break}d=0}while(0);l=p;return d|0}function L3(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;do if(b>>>0>6)d=0;else{Ua(190440);if((b|0)!=6){d=M3(b,d)|0;Ra(190440);break}if(!d){d=197414;b=0}else{b=g;e=153724;f=b+16|0;do{a[b>>0]=a[e>>0]|0;b=b+1|0;e=e+1|0}while((b|0)<(f|0));f=0;do{b=G3(d,59)|0;e=b-d|0;if((e|0)<16){B6(g|0,d|0,e|0)|0;a[g+e>>0]=0;d=(a[b>>0]|0)==0?d:b+1|0}M3(f,g)|0;f=f+1|0}while((f|0)!=6);d=197414;b=0}do{f=c[190400+(b<<2)>>2]|0;f=f|0?f+8|0:153740;g=D3(f)|0;B6(d|0,f|0,g|0)|0;a[d+g>>0]=59;d=d+(g+1)|0;b=b+1|0}while((b|0)!=6);a[d+-1>>0]=0;Ra(190440);d=197414}while(0);l=h;return d|0}function M3(a,b){a=a|0;b=b|0;if(!b)a=c[190400+(a<<2)>>2]|0;else{b=K3(a,b)|0;c[190400+(a<<2)>>2]=b;a=b}return (a|0?a+8|0:153740)|0}function N3(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0;if(!e)f=0;else{g=a[b>>0]|0;f=g&255;a:do if(g<<24>>24){h=g;do{e=e+-1|0;g=a[c>>0]|0;if(!((e|0)!=0&g<<24>>24!=0))break a;if(h<<24>>24!=g<<24>>24?(h=R1(f)|0,(h|0)!=(R1(g&255)|0)):0)break a;b=b+1|0;c=c+1|0;h=a[b>>0]|0;f=h&255}while(h<<24>>24!=0)}while(0);f=R1(f)|0;f=f-(R1(d[c>>0]|0)|0)|0}return f|0}function O3(a,b){a=a|0;b=b|0;P3(a,b)|0;return a|0}function P3(b,d){b=b|0;d=d|0;var e=0,f=0;e=d;a:do if(!((e^b)&3)){if(e&3)do{e=a[d>>0]|0;a[b>>0]=e;if(!(e<<24>>24))break a;d=d+1|0;b=b+1|0}while((d&3|0)!=0);e=c[d>>2]|0;if(!((e&-2139062144^-2139062144)&e+-16843009)){f=b;while(1){d=d+4|0;b=f+4|0;c[f>>2]=e;e=c[d>>2]|0;if((e&-2139062144^-2139062144)&e+-16843009|0)break;else f=b}}f=8}else f=8;while(0);if((f|0)==8){f=a[d>>0]|0;a[b>>0]=f;if(f<<24>>24)do{d=d+1|0;b=b+1|0;f=a[d>>0]|0;a[b>>0]=f}while(f<<24>>24!=0)}return b|0}function Q3(a,b){a=+a;b=+b;var c=0.0,d=0.0,e=0.0,f=0.0;c=a*a;d=c*c;e=c*.5;f=1.0-e;return +(f+(1.0-f-e+(c*(c*(c*(c*2.480158728947673e-05+-.001388888888887411)+.0416666666666666)+d*d*(c*(2.087572321298175e-09-c*1.1359647557788195e-11)+-2.7557314351390663e-07))-a*b)))}function R3(a,b){a=+a;b=b|0;var d=0,e=0.0,f=0.0,g=0.0,i=0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;r=l;l=l+48|0;m=r+16|0;n=r;h[j>>3]=a;d=c[j>>2]|0;i=c[j+4>>2]|0;o=z6(d|0,i|0,63)|0;q=i&2147483647;do if(q>>>0<1074752123)if((i&1048575|0)!=598523){d=(o|0)!=0;if(q>>>0<1073928573)if(d){g=a+1.5707963267341256;k=g+6.077100506506192e-11;h[b>>3]=k;h[b+8>>3]=g-k+6.077100506506192e-11;d=-1;break}else{g=a+-1.5707963267341256;k=g+-6.077100506506192e-11;h[b>>3]=k;h[b+8>>3]=g-k+-6.077100506506192e-11;d=1;break}else if(d){g=a+3.1415926534682512;k=g+1.2154201013012384e-10;h[b>>3]=k;h[b+8>>3]=g-k+1.2154201013012384e-10;d=-2;break}else{g=a+-3.1415926534682512;k=g+-1.2154201013012384e-10;h[b>>3]=k;h[b+8>>3]=g-k+-1.2154201013012384e-10;d=2;break}}else p=21;else{if(q>>>0<1075594812)if(q>>>0<1075183037){if((q|0)==1074977148){p=21;break}if(!o){g=a+-4.712388980202377;k=g+-1.8231301519518578e-10;h[b>>3]=k;h[b+8>>3]=g-k+-1.8231301519518578e-10;d=3;break}else{g=a+4.712388980202377;k=g+1.8231301519518578e-10;h[b>>3]=k;h[b+8>>3]=g-k+1.8231301519518578e-10;d=-3;break}}else{if((q|0)==1075388923){p=21;break}if(!o){g=a+-6.2831853069365025;k=g+-2.430840202602477e-10;h[b>>3]=k;h[b+8>>3]=g-k+-2.430840202602477e-10;d=4;break}else{g=a+6.2831853069365025;k=g+2.430840202602477e-10;h[b>>3]=k;h[b+8>>3]=g-k+2.430840202602477e-10;d=-4;break}}if(q>>>0>=1094263291){if(q>>>0>2146435071){k=a-a;h[b+8>>3]=k;h[b>>3]=k;d=0;break}c[j>>2]=d;c[j+4>>2]=i&1048575|1096810496;a=+h[j>>3];d=0;do{k=+(~~a|0);h[m+(d<<3)>>3]=k;a=(a-k)*16777216.0;d=d+1|0}while((d|0)!=2);h[m+16>>3]=a;if(a==0.0){d=1;while(1)if(+h[m+(d<<3)>>3]==0.0)d=d+-1|0;else break}else d=2;d=S3(m,n,(q>>>20)+-1046|0,d+1|0,1)|0;e=+h[n>>3];a=+h[n+8>>3];if(!o){h[b>>3]=e;h[b+8>>3]=a;break}else{h[b>>3]=-e;h[b+8>>3]=-a;d=0-d|0;break}}else p=21}while(0);if((p|0)==21){g=a*.6366197723675814+6755399441055744.0+-6755399441055744.0;d=~~g;e=a-g*1.5707963267341256;f=g*6.077100506506192e-11;a=e-f;h[b>>3]=a;h[j>>3]=a;p=z6(c[j>>2]|0,c[j+4>>2]|0,52)|0;i=q>>>20;if((i-(p&2047)|0)>16){f=g*6.077100506303966e-11;k=e-f;f=g*2.0222662487959506e-21-(e-k-f);a=k-f;h[b>>3]=a;h[j>>3]=a;q=z6(c[j>>2]|0,c[j+4>>2]|0,52)|0;s=g*2.0222662487111665e-21;e=k-s;g=g*8.4784276603689e-32-(k-e-s);if((i-(q&2047)|0)>49){a=e-g;h[b>>3]=a;f=g}else e=k}h[b+8>>3]=e-a-f}l=r;return d|0}function S3(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,F=0,G=0,H=0,I=0;I=l;l=l+560|0;C=I+480|0;A=I+320|0;H=I+160|0;F=I;D=c[63744+(f<<2)>>2]|0;q=e+-1|0;z=(d+-3|0)/24|0;z=(z|0)>0?z:0;B=S(z,-24)|0;j=d+-24+B|0;if((D+q|0)>=0){o=D+e|0;m=z-q|0;n=0;while(1){if((m|0)<0)g=0.0;else g=+(c[63760+(m<<2)>>2]|0);h[A+(n<<3)>>3]=g;n=n+1|0;if((n|0)==(o|0))break;else m=m+1|0}}p=(e|0)>0;o=0;while(1){if(p){n=o+q|0;g=0.0;m=0;do{g=g+ +h[a+(m<<3)>>3]*+h[A+(n-m<<3)>>3];m=m+1|0}while((m|0)!=(e|0))}else g=0.0;h[F+(o<<3)>>3]=g;if((o|0)<(D|0))o=o+1|0;else break}u=(j|0)>0;v=24-j|0;w=23-j|0;x=(e|0)>0;y=(j|0)==0;m=D;a:while(1){g=+h[F+(m<<3)>>3];p=(m|0)>0;if(p){n=m;o=0;while(1){k=+(~~(g*5.9604644775390625e-08)|0);c[C+(o<<2)>>2]=~~(g-k*16777216.0);t=n;n=n+-1|0;g=k+ +h[F+(n<<3)>>3];if((t|0)<=1)break;else o=o+1|0}}g=+w3(g,j);g=g-+E(+(g*.125))*8.0;n=~~g;g=g-+(n|0);do if(!u)if(!y)if(!(g>=.5)){q=0;t=n;break}else{o=2;G=20;break}else{o=c[C+(m+-1<<2)>>2]>>23;G=19;break}else{t=C+(m+-1<<2)|0;o=c[t>>2]|0;G=o>>v;o=o-(G<>2]=o;o=o>>w;n=G+n|0;G=19}while(0);if((G|0)==19){G=0;if((o|0)>0)G=20;else{q=o;t=n}}if((G|0)==20){G=0;t=n+1|0;if(p){n=0;s=0;do{q=C+(s<<2)|0;r=c[q>>2]|0;if(!n)if(!r)n=0;else{n=1;p=16777216;G=23}else{p=16777215;G=23}if((G|0)==23){G=0;c[q>>2]=p-r}s=s+1|0}while((s|0)!=(m|0))}else n=0;b:do if(u){switch(j|0){case 1:{p=8388607;break}case 2:{p=4194303;break}default:break b}s=C+(m+-1<<2)|0;c[s>>2]=c[s>>2]&p}while(0);if((o|0)==2){g=1.0-g;if(!n)q=2;else{q=2;g=g-+w3(1.0,j)}}else q=o}if(!(g==0.0)){G=42;break}if((m|0)>(D|0)){n=0;o=m;do{o=o+-1|0;n=c[C+(o<<2)>>2]|n}while((o|0)>(D|0));if(n){G=41;break}else n=1}else n=1;while(1)if(!(c[C+(D-n<<2)>>2]|0))n=n+1|0;else break;p=n+m|0;if((n|0)<=0){m=p;continue}while(1){o=m+1|0;n=m+e|0;h[A+(n<<3)>>3]=+(c[63760+(o+z<<2)>>2]|0);if(x){g=0.0;m=0;do{g=g+ +h[a+(m<<3)>>3]*+h[A+(n-m<<3)>>3];m=m+1|0}while((m|0)!=(e|0))}else g=0.0;h[F+(o<<3)>>3]=g;if((o|0)<(p|0))m=o;else{m=p;continue a}}}if((G|0)==41)while(1){G=0;j=j+-24|0;m=m+-1|0;if(!(c[C+(m<<2)>>2]|0))G=41;else{p=m;break}}else if((G|0)==42){g=+w3(g,0-j|0);if(g>=16777216.0){k=+(~~(g*5.9604644775390625e-08)|0);c[C+(m<<2)>>2]=~~(g-k*16777216.0);j=B+d|0;m=m+1|0;g=k}c[C+(m<<2)>>2]=~~g;p=m}o=(p|0)>-1;if(o){g=+w3(1.0,j);j=p;while(1){h[F+(j<<3)>>3]=g*+(c[C+(j<<2)>>2]|0);if((j|0)>0){g=g*5.9604644775390625e-08;j=j+-1|0}else break}if(o){m=p;while(1){n=p-m|0;j=0;g=0.0;while(1){g=g+ +h[10952+(j<<3)>>3]*+h[F+(j+m<<3)>>3];if((j|0)>=(D|0)|(j|0)>=(n|0))break;else j=j+1|0}h[H+(n<<3)>>3]=g;if((m|0)>0)m=m+-1|0;else break}}}switch(f|0){case 0:{if(o){g=0.0;j=p;while(1){g=g+ +h[H+(j<<3)>>3];if((j|0)>0)j=j+-1|0;else break}}else g=0.0;i=(q|0)==0?g:-g;G=73;break}case 2:case 1:{if(o){g=0.0;j=p;while(1){g=g+ +h[H+(j<<3)>>3];if((j|0)>0)j=j+-1|0;else break}}else g=0.0;m=(q|0)==0;h[b>>3]=m?g:-g;g=+h[H>>3]-g;if((p|0)>=1){j=1;while(1){g=g+ +h[H+(j<<3)>>3];if((j|0)==(p|0))break;else j=j+1|0}}i=m?g:-g;b=b+8|0;G=73;break}case 3:{if((p|0)>0){j=p;g=+h[H+(p<<3)>>3];do{G=j;j=j+-1|0;F=H+(j<<3)|0;k=+h[F>>3];i=g;g=k+g;h[H+(G<<3)>>3]=i+(k-g);h[F>>3]=g}while((G|0)>1);m=(p|0)>1;if(m){j=p;g=+h[H+(p<<3)>>3];do{F=j;j=j+-1|0;G=H+(j<<3)|0;k=+h[G>>3];i=g;g=k+g;h[H+(F<<3)>>3]=i+(k-g);h[G>>3]=g}while((j|0)>1);if(m){j=p;i=0.0;do{i=i+ +h[H+(j<<3)>>3];j=j+-1|0}while((j|0)>1)}else i=0.0}else i=0.0}else i=0.0;k=+h[H>>3];g=+h[H+8>>3];if(!q)h[b>>3]=k;else{h[b>>3]=-k;i=-i;g=-g}h[b+8>>3]=g;b=b+16|0;G=73;break}default:{}}if((G|0)==73)h[b>>3]=i;l=I;return t&7|0}function T3(a,b,c){a=+a;b=+b;c=c|0;var d=0.0,e=0.0,f=0.0;f=a*a;d=f*(f*f)*(f*1.58969099521155e-10+-2.5050760253406863e-08)+(f*(f*2.7557313707070068e-06+-1.984126982985795e-04)+.00833333333332249);e=f*a;if(!c)a=e*(f*d+-.16666666666666632)+a;else a=a-(e*.16666666666666632+(f*(b*.5-e*d)-b));return +a}function U3(a){a=+a;var b=0,d=0,e=0,f=0.0,g=0.0;h[j>>3]=a;d=c[j+4>>2]|0;b=d&2147483647;do if(b>>>0>2146435071)a=a+a;else{if(b>>>0<1048576){h[j>>3]=a*18014398509481984.0;d=c[j+4>>2]|0;b=d&2147483647;if(!b)break;else e=696219795}else e=715094163;c[j>>2]=0;c[j+4>>2]=((b>>>0)/3|0)+e|d&-2147483648;g=+h[j>>3];f=g*g*(g/a);h[j>>3]=g*(f*(f*f)*(f*.14599619288661245+-.758397934778766)+(f*(f*1.6214297201053545+-1.8849797954337717)+1.87595182427177));d=w6(c[j>>2]|0,c[j+4>>2]|0,-2147483648,0)|0;e=D;c[j>>2]=d&-1073741824;c[j+4>>2]=e;f=+h[j>>3];a=a/(f*f);a=f+f*((a-f)/(f+f+a))}while(0);return +a}function V3(a){a=+a;var b=0,d=0,e=0,f=0,g=0.0,i=0.0,k=0.0,l=0.0,m=0.0;h[j>>3]=a;b=c[j>>2]|0;d=c[j+4>>2]|0;e=(d|0)<0;do if(e|d>>>0<1048576){if((b|0)==0&(d&2147483647|0)==0){a=-1.0/(a*a);break}if(e){a=(a-a)/0.0;break}else{h[j>>3]=a*18014398509481984.0;d=c[j+4>>2]|0;e=-1077;b=c[j>>2]|0;f=9;break}}else if(d>>>0<=2146435071)if((b|0)==0&0==0&(d|0)==1072693248)a=0.0;else{e=-1023;f=9}while(0);if((f|0)==9){f=d+614242|0;c[j>>2]=b;c[j+4>>2]=(f&1048575)+1072079006;k=+h[j>>3]+-1.0;i=k*(k*.5);l=k/(k+2.0);m=l*l;a=m*m;h[j>>3]=k-i;d=c[j+4>>2]|0;c[j>>2]=0;c[j+4>>2]=d;g=+h[j>>3];a=k-g-i+l*(i+(a*(a*(a*.15313837699209373+.22222198432149784)+.3999999999940942)+m*(a*(a*(a*.14798198605116586+.1818357216161805)+.2857142874366239)+.6666666666666735)));m=g*.4342944818781689;i=+(e+(f>>>20)|0);l=i*.30102999566361177;k=l+m;a=k+(m+(l-k)+(a*.4342944818781689+(i*3.694239077158931e-13+(g+a)*2.5082946711645275e-11)))}return +a}function W3(a){a=+a;var b=0,d=0,e=0,f=0,g=0.0,i=0.0,k=0.0,l=0.0,m=0.0;h[j>>3]=a;b=c[j>>2]|0;d=c[j+4>>2]|0;e=(d|0)<0;do if(e|d>>>0<1048576){if((b|0)==0&(d&2147483647|0)==0){a=-1.0/(a*a);break}if(e){a=(a-a)/0.0;break}else{h[j>>3]=a*18014398509481984.0;d=c[j+4>>2]|0;e=-1077;b=c[j>>2]|0;f=9;break}}else if(d>>>0<=2146435071)if((b|0)==0&0==0&(d|0)==1072693248)a=0.0;else{e=-1023;f=9}while(0);if((f|0)==9){f=d+614242|0;c[j>>2]=b;c[j+4>>2]=(f&1048575)+1072079006;m=+h[j>>3]+-1.0;k=m*(m*.5);i=m/(m+2.0);l=i*i;a=l*l;h[j>>3]=m-k;d=c[j+4>>2]|0;c[j>>2]=0;c[j+4>>2]=d;g=+h[j>>3];a=m-g-k+i*(k+(a*(a*(a*.15313837699209373+.22222198432149784)+.3999999999940942)+l*(a*(a*(a*.14798198605116586+.1818357216161805)+.2857142874366239)+.6666666666666735)));l=g*1.4426950407214463;k=+(e+(f>>>20)|0);i=k+l;a=i+(l+(k-i)+(a*1.4426950407214463+(g+a)*1.6751713164886512e-10))}return +a}function X3(a,b,d){a=+a;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0.0,k=0,m=0;k=l;l=l+16|0;g=k;h[j>>3]=a;f=c[j+4>>2]&2147483647;do if(f>>>0<1072243196)if(f>>>0<1044816030){h[b>>3]=a;h[d>>3]=1.0;break}else{h[b>>3]=+T3(a,0.0,0);h[d>>3]=+Q3(a,0.0);break}else{if(f>>>0>2146435071){i=a-a;h[d>>3]=i;h[b>>3]=i;break}f=R3(a,g)|0;m=g+8|0;e=+T3(+h[g>>3],+h[m>>3],1);a=+Q3(+h[g>>3],+h[m>>3]);switch(f&3){case 0:{h[b>>3]=e;i=a;break}case 1:{h[b>>3]=a;i=-e;break}case 2:{h[b>>3]=-e;i=-a;break}case 3:{h[b>>3]=-a;i=e;break}default:{}}h[d>>3]=i}while(0);l=k;return}function Y3(a){a=a|0;var b=0,c=0;c=(D3(a)|0)+1|0;b=k6(c)|0;if(!b)b=0;else B6(b|0,a|0,c|0)|0;return b|0}function Z3(a,b){a=a|0;b=b|0;var c=0;c=D3(a)|0;return ((_3(a,1,c,b)|0)!=(c|0))<<31>>31|0}function _3(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=S(d,b)|0;d=(b|0)==0?0:d;if((c[e+76>>2]|0)>-1){g=(n2(e)|0)==0;a=L2(a,f,e)|0;if(!g)o2(e)}else a=L2(a,f,e)|0;if((a|0)!=(f|0))d=(a>>>0)/(b>>>0)|0;return d|0}function $3(a){a=a|0;var b=0;if(c[a+68>>2]|0){b=c[a+116>>2]|0;a=a+112|0;if(b|0)c[b+112>>2]=c[a>>2];a=c[a>>2]|0;if(!a)a=(a4()|0)+232|0;else a=a+116|0;c[a>>2]=b}return}function a4(){return N1()|0}function b4(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;j=m;k=e&255;a[j>>0]=k;g=b+16|0;h=c[g>>2]|0;if(!h)if(!(M2(b)|0)){h=c[g>>2]|0;i=4}else f=-1;else i=4;do if((i|0)==4){i=b+20|0;g=c[i>>2]|0;if(g>>>0>>0?(f=e&255,(f|0)!=(a[b+75>>0]|0)):0){c[i>>2]=g+1;a[g>>0]=k;break}if((eb[c[b+36>>2]&63](b,j,1)|0)==1)f=d[j>>0]|0;else f=-1}while(0);l=m;return f|0}function c4(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+16|0;g=j;a:do if(!e)b=0;else{do if(f|0){i=(b|0)==0?g:b;b=a[e>>0]|0;if(b<<24>>24>-1){c[i>>2]=b&255;b=b<<24>>24!=0&1;break a}h=(c[c[(d4()|0)+188>>2]>>2]|0)==0;b=a[e>>0]|0;if(h){c[i>>2]=b<<24>>24&57343;b=1;break a}b=(b&255)+-194|0;if(b>>>0<=50){g=e+1|0;h=c[62656+(b<<2)>>2]|0;if(f>>>0<4?h&-2147483648>>>((f*6|0)+-6|0)|0:0)break;b=d[g>>0]|0;f=b>>>3;if((f+-16|f+(h>>26))>>>0<=7){b=b+-128|h<<6;if((b|0)>=0){c[i>>2]=b;b=2;break a}g=(d[e+2>>0]|0)+-128|0;if(g>>>0<=63){g=g|b<<6;if((g|0)>=0){c[i>>2]=g;b=3;break a}b=(d[e+3>>0]|0)+-128|0;if(b>>>0<=63){c[i>>2]=b|g<<6;b=4;break a}}}}}while(0);c[(L1()|0)>>2]=84;b=-1}while(0);l=j;return b|0}function d4(){return N1()|0}function e4(){var a=0,b=0;b=l;l=l+16|0;a=ya(20,b|0)|0;l=b;return a|0}function f4(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+48|0;h=i+32|0;g=i+16|0;e=i;if(w2(153742,a[d>>0]|0,4)|0){f=g4(d)|0;c[e>>2]=b;c[e+4>>2]=f|32768;c[e+8>>2]=438;e=K1(Wa(5,e|0)|0)|0;if((e|0)>=0){if(f&524288|0){c[g>>2]=e;c[g+4>>2]=2;c[g+8>>2]=1;ua(221,g|0)|0}b=h4(e,d)|0;if(!b){c[h>>2]=e;xa(6,h|0)|0;b=0}}else b=0}else{c[(L1()|0)>>2]=22;b=0}l=i;return b|0}function g4(b){b=b|0;var c=0,d=0,e=0;d=(F3(b,43)|0)==0;c=a[b>>0]|0;d=d?c<<24>>24!=114&1:2;e=(F3(b,120)|0)==0;d=e?d:d|128;b=(F3(b,101)|0)==0;b=b?d:d|524288;b=c<<24>>24==114?b:b|64;b=c<<24>>24==119?b|512:b;return (c<<24>>24==97?b|1024:b)|0}function h4(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+64|0;n=o+40|0;k=o+24|0;j=o+16|0;g=o;m=o+56|0;f=a[d>>0]|0;if(w2(153742,f<<24>>24,4)|0){e=k6(1156)|0;if(!e)e=0;else{h=e;i=h+124|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(i|0));if(!(F3(d,43)|0))c[e>>2]=f<<24>>24==114?8:4;if(F3(d,101)|0){c[g>>2]=b;c[g+4>>2]=2;c[g+8>>2]=1;ua(221,g|0)|0;f=a[d>>0]|0}if(f<<24>>24==97){c[j>>2]=b;c[j+4>>2]=3;f=ua(221,j|0)|0;if(!(f&1024)){c[k>>2]=b;c[k+4>>2]=4;c[k+8>>2]=f|1024;ua(221,k|0)|0}d=c[e>>2]|128;c[e>>2]=d}else d=c[e>>2]|0;c[e+60>>2]=b;c[e+44>>2]=e+132;c[e+48>>2]=1024;f=e+75|0;a[f>>0]=-1;if((d&8|0)==0?(c[n>>2]=b,c[n+4>>2]=21523,c[n+8>>2]=m,(Qa(54,n|0)|0)==0):0)a[f>>0]=10;c[e+32>>2]=20;c[e+36>>2]=18;c[e+40>>2]=19;c[e+12>>2]=17;if(!(c[47591]|0))c[e+76>>2]=-1;i4(e)|0}}else{c[(L1()|0)>>2]=22;e=0}l=o;return e|0}function i4(a){a=a|0;var b=0,d=0;b=j4()|0;c[a+56>>2]=c[b>>2];d=c[b>>2]|0;if(d|0)c[d+52>>2]=a;c[b>>2]=a;k4();return a|0}function j4(){Ua(190448);return 190456}function k4(){Ra(190448);return}function l4(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if((c[a+76>>2]|0)>-1)f=n2(a)|0;else f=0;$3(a);g=(c[a>>2]&1|0)!=0;if(!g){e=j4()|0;d=c[a+52>>2]|0;b=a+56|0;if(d|0)c[d+56>>2]=c[b>>2];b=c[b>>2]|0;if(b|0)c[b+52>>2]=d;if((c[e>>2]|0)==(a|0))c[e>>2]=b;k4()}b=m4(a)|0;b=pb[c[a+12>>2]&63](a)|0|b;d=c[a+92>>2]|0;if(d|0)l6(d);if(g){if(f|0)o2(a)}else l6(a);return b|0}function m4(a){a=a|0;var b=0,d=0;do if(a){if((c[a+76>>2]|0)<=-1){b=n4(a)|0;break}d=(n2(a)|0)==0;b=n4(a)|0;if(!d)o2(a)}else{if(!(c[15872]|0))b=0;else b=m4(c[15872]|0)|0;a=c[(j4()|0)>>2]|0;if(a)do{if((c[a+76>>2]|0)>-1)d=n2(a)|0;else d=0;if((c[a+20>>2]|0)>>>0>(c[a+28>>2]|0)>>>0)b=n4(a)|0|b;if(d|0)o2(a);a=c[a+56>>2]|0}while((a|0)!=0);k4()}while(0);return b|0}function n4(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+20|0;h=a+28|0;if((c[b>>2]|0)>>>0>(c[h>>2]|0)>>>0?(eb[c[a+36>>2]&63](a,0,0)|0,(c[b>>2]|0)==0):0)a=-1;else{d=a+4|0;e=c[d>>2]|0;f=a+8|0;g=c[f>>2]|0;if(e>>>0>>0)eb[c[a+40>>2]&63](a,e-g|0,1)|0;c[a+16>>2]=0;c[h>>2]=0;c[b>>2]=0;c[f>>2]=0;c[d>>2]=0;a=0}return a|0}function o4(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((c[f+76>>2]|0)>-1)l=n2(f)|0;else l=0;h=e+-1|0;g=(h|0)!=0;if((e|0)<2){m=f+74|0;k=a[m>>0]|0;a[m>>0]=k+255|k;if(l|0)o2(f);if(g)b=0;else a[b>>0]=0}else{a:do if(g){j=f+4|0;k=f+8|0;e=b;while(1){g=c[j>>2]|0;o=g;p=(c[k>>2]|0)-o|0;n=w2(g,10,p)|0;i=(n|0)==0;n=i?p:1-o+n|0;n=n>>>0>>0?n:h;B6(e|0,g|0,n|0)|0;g=(c[j>>2]|0)+n|0;c[j>>2]=g;e=e+n|0;h=h-n|0;if(!(i&(h|0)!=0)){m=17;break a}if(g>>>0>=(c[k>>2]|0)>>>0){g=Y1(f)|0;if((g|0)<0)break}else{c[j>>2]=g+1;g=d[g>>0]|0}h=h+-1|0;i=e+1|0;a[e>>0]=g;if(!((h|0)!=0&(g&255|0)!=10)){e=i;m=17;break a}else e=i}if((e|0)!=(b|0)?(c[f>>2]&16|0)!=0:0)m=17;else b=0}else{e=b;m=17}while(0);if((m|0)==17)if(!b)b=0;else a[e>>0]=0;if(l)o2(f)}return b|0}function p4(a){a=a|0;var b=0;if((c[a+76>>2]|0)>-1){b=(n2(a)|0)==0;a=(c[a>>2]|0)>>>4&1}else a=(c[a>>2]|0)>>>4&1;return a|0}function q4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=r4(a,b,f)|0;l=e;return d|0}function r4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+128|0;e=g;f=e;h=f+124|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));c[e+32>>2]=44;c[e+44>>2]=a;c[e+76>>2]=-1;c[e+84>>2]=a;h=t4(e,b,d)|0;l=g;return h|0}function s4(a,b,c){a=a|0;b=b|0;c=c|0;return x4(a,b,c)|0}function t4(b,e,f){b=b|0;e=e|0;f=f|0;var i=0,j=0,k=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;Q=l;l=l+288|0;K=Q+8|0;L=Q+17|0;M=Q;N=Q+16|0;if((c[b+76>>2]|0)>-1)P=n2(b)|0;else P=0;i=a[e>>0]|0;a:do if(i<<24>>24){z=b+4|0;A=b+100|0;B=b+108|0;C=b+8|0;E=L+10|0;F=L+33|0;y=K+4|0;G=L+46|0;H=L+94|0;I=L+1|0;J=L+1|0;m=e;u=0;e=0;k=0;j=0;b:while(1){c:do if(!(X1(i&255)|0)){i=i<<24>>24==37;d:do if(i){p=m+1|0;n=a[p>>0]|0;e:do switch(n<<24>>24){case 37:break d;case 42:{x=0;m=m+2|0;break}default:{i=(n&255)+-48|0;if(i>>>0<10?(a[m+2>>0]|0)==36:0){x=u4(f,i)|0;m=m+3|0;break e}m=(c[f>>2]|0)+(4-1)&~(4-1);x=c[m>>2]|0;c[f>>2]=m+4;m=p}}while(0);i=a[m>>0]|0;n=i&255;if((n+-48|0)>>>0<10){p=0;do{p=(p*10|0)+-48+n|0;m=m+1|0;i=a[m>>0]|0;n=i&255}while((n+-48|0)>>>0<10)}else p=0;i=i<<24>>24==109;w=(x|0)!=0;k=i?0:k;j=i?0:j;m=i?m+1|0:m;i=w&i;n=m+1|0;switch(a[m>>0]|0){case 104:{v=(a[n>>0]|0)==104;q=v?-2:-1;m=v?m+2|0:n;break}case 108:{v=(a[n>>0]|0)==108;q=v?3:1;m=v?m+2|0:n;break}case 106:{q=3;m=n;break}case 116:case 122:{q=1;m=n;break}case 76:{q=2;m=n;break}case 110:case 112:case 67:case 83:case 91:case 99:case 115:case 88:case 71:case 70:case 69:case 65:case 103:case 102:case 101:case 97:case 120:case 117:case 111:case 105:case 100:{q=0;break}default:{O=137;break b}}s=d[m>>0]|0;t=(s&47|0)==3;s=t?s|32:s;t=t?1:q;r=s&255;switch(r<<24>>24){case 99:{p=(p|0)>1?p:1;break}case 91:break;case 110:{v4(x,t,u,((u|0)<0)<<31>>31);n=u;break c}default:{U1(b,0);do{n=c[z>>2]|0;if(n>>>0<(c[A>>2]|0)>>>0){c[z>>2]=n+1;n=d[n>>0]|0}else n=W1(b)|0}while((X1(n)|0)!=0);if(!(c[A>>2]|0))n=c[z>>2]|0;else{n=(c[z>>2]|0)+-1|0;c[z>>2]=n}u=(c[B>>2]|0)+u+n-(c[C>>2]|0)|0}}U1(b,p);n=c[z>>2]|0;q=c[A>>2]|0;if(n>>>0>>0)c[z>>2]=n+1;else{if((W1(b)|0)<0){O=137;break b}q=c[A>>2]|0}if(q|0)c[z>>2]=(c[z>>2]|0)+-1;f:do switch(r<<24>>24){case 91:case 99:case 115:{v=(s|0)==99;g:do if((s|16|0)==115){u6(I|0,-1,256)|0;a[L>>0]=0;if((s|0)==115){a[F>>0]=0;a[E>>0]=0;a[E+1>>0]=0;a[E+2>>0]=0;a[E+3>>0]=0;a[E+4>>0]=0}}else{n=m+1|0;s=(a[n>>0]|0)==94;r=s&1;m=s?m+2|0:n;u6(J|0,s&1|0,256)|0;a[L>>0]=0;switch(a[m>>0]|0){case 45:{n=G;O=64;break}case 93:{n=H;O=64;break}default:s=(r^1)&255}if((O|0)==64){O=0;s=(r^1)&255;a[n>>0]=s;m=m+1|0}while(1){n=a[m>>0]|0;h:do switch(n<<24>>24){case 0:{O=137;break b}case 93:break g;case 45:{r=m+1|0;n=a[r>>0]|0;switch(n<<24>>24){case 93:case 0:{n=45;break h}default:{}}m=a[m+-1>>0]|0;if((m&255)<(n&255)){m=m&255;do{m=m+1|0;a[L+m>>0]=s;n=a[r>>0]|0}while((m|0)<(n&255|0));m=r}else m=r;break}default:{}}while(0);a[L+((n&255)+1)>>0]=s;m=m+1|0}}while(0);n=v?p+1|0:31;s=(t|0)==1;i:do if(s){if(i){j=k6(n<<2)|0;if(!j){k=0;j=0;i=1;O=137;break b}}else j=x;c[K>>2]=0;c[y>>2]=0;r=n;k=0;j:while(1){q=(j|0)==0;do{k:while(1){n=c[z>>2]|0;if(n>>>0<(c[A>>2]|0)>>>0){c[z>>2]=n+1;n=d[n>>0]|0}else n=W1(b)|0;if(!(a[L+(n+1)>>0]|0))break j;a[N>>0]=n;switch(I3(M,N,1,K)|0){case -1:{k=0;O=137;break b}case -2:break;default:break k}}if(!q){c[j+(k<<2)>>2]=c[M>>2];k=k+1|0}}while(!(i&(k|0)==(r|0)));k=r<<1|1;n=n6(j,k<<2)|0;if(!n){k=0;i=1;O=137;break b}else{t=r;r=k;j=n;k=t}}if(!(w4(K)|0)){k=0;O=137;break b}else{n=k;k=0;r=j}}else{if(i){k=k6(n)|0;if(!k){k=0;j=0;i=1;O=137;break b}else{q=n;j=0}while(1){do{n=c[z>>2]|0;if(n>>>0<(c[A>>2]|0)>>>0){c[z>>2]=n+1;n=d[n>>0]|0}else n=W1(b)|0;if(!(a[L+(n+1)>>0]|0)){n=j;r=0;j=0;break i}a[k+j>>0]=n;j=j+1|0}while((j|0)!=(q|0));j=q<<1|1;n=n6(k,j)|0;if(!n){j=0;i=1;O=137;break b}else{t=q;q=j;k=n;j=t}}}if(!x){k=q;while(1){j=c[z>>2]|0;if(j>>>0>>0){c[z>>2]=j+1;j=d[j>>0]|0}else j=W1(b)|0;if(!(a[L+(j+1)>>0]|0)){n=0;k=0;r=0;j=0;break i}k=c[A>>2]|0}}else{n=0;k=q;while(1){j=c[z>>2]|0;if(j>>>0>>0){c[z>>2]=j+1;j=d[j>>0]|0}else j=W1(b)|0;if(!(a[L+(j+1)>>0]|0)){k=x;r=0;j=0;break i}a[x+n>>0]=j;n=n+1|0;k=c[A>>2]|0}}}while(0);if(!(c[A>>2]|0))q=c[z>>2]|0;else{q=(c[z>>2]|0)+-1|0;c[z>>2]=q}q=q-(c[C>>2]|0)+(c[B>>2]|0)|0;if(!q){O=139;break b}if(!((q|0)==(p|0)|v^1)){O=139;break b}do if(i)if(s){c[x>>2]=r;break}else{c[x>>2]=k;break}while(0);if(!v){if(r|0)c[r+(n<<2)>>2]=0;if(!k){k=0;break f}a[k+n>>0]=0}break}case 120:case 88:case 112:{n=16;O=125;break}case 111:{n=8;O=125;break}case 117:case 100:{n=10;O=125;break}case 105:{n=0;O=125;break}case 71:case 103:case 70:case 102:case 69:case 101:case 65:case 97:{o=+s3(b,t,0);if((c[B>>2]|0)==((c[C>>2]|0)-(c[z>>2]|0)|0)){O=139;break b}if(x)switch(t|0){case 0:{g[x>>2]=o;break f}case 1:{h[x>>3]=o;break f}case 2:{h[x>>3]=o;break f}default:break f}break}default:{}}while(0);do if((O|0)==125){O=0;n=V1(b,n,0,-1,-1)|0;if((c[B>>2]|0)==((c[C>>2]|0)-(c[z>>2]|0)|0)){O=139;break b}if(w&(s|0)==112){c[x>>2]=n;break}else{v4(x,t,n,D);break}}while(0);e=(w&1)+e|0;n=(c[B>>2]|0)+u+(c[z>>2]|0)-(c[C>>2]|0)|0;break c}while(0);m=m+(i&1)|0;U1(b,0);i=c[z>>2]|0;if(i>>>0<(c[A>>2]|0)>>>0){c[z>>2]=i+1;i=d[i>>0]|0}else i=W1(b)|0;if((i|0)!=(d[m>>0]|0)){O=22;break b}n=u+1|0}else{while(1){i=m+1|0;if(!(X1(d[i>>0]|0)|0))break;else m=i}U1(b,0);do{i=c[z>>2]|0;if(i>>>0<(c[A>>2]|0)>>>0){c[z>>2]=i+1;i=d[i>>0]|0}else i=W1(b)|0}while((X1(i)|0)!=0);if(!(c[A>>2]|0))i=c[z>>2]|0;else{i=(c[z>>2]|0)+-1|0;c[z>>2]=i}n=(c[B>>2]|0)+u+i-(c[C>>2]|0)|0}while(0);m=m+1|0;i=a[m>>0]|0;if(!(i<<24>>24))break a;else u=n}if((O|0)==22){if(c[A>>2]|0)c[z>>2]=(c[z>>2]|0)+-1;if((e|0)!=0|(i|0)>-1)break;else{i=0;O=138}}else if((O|0)==137){i=i&1;if(!e)O=138}else if((O|0)==139)i=i&1;if((O|0)==138)e=-1;if(i){l6(k);l6(j)}}else e=0;while(0);if(P|0)o2(b);l=Q;return e|0}function u4(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=l;l=l+16|0;d=e;c[d>>2]=c[a>>2];while(1){f=(c[d>>2]|0)+(4-1)&~(4-1);a=c[f>>2]|0;c[d>>2]=f+4;if(b>>>0>1)b=b+-1|0;else break}l=e;return a|0}function v4(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;a:do if(d|0)switch(e|0){case -2:{a[d>>0]=f;break a}case -1:{b[d>>1]=f;break a}case 0:{c[d>>2]=f;break a}case 1:{c[d>>2]=f;break a}case 3:{e=d;c[e>>2]=f;c[e+4>>2]=g;break a}default:break a}while(0);return}function w4(a){a=a|0;if(!a)a=1;else a=(c[a>>2]|0)==0;return a&1|0}function x4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=a+84|0;g=c[e>>2]|0;h=d+256|0;f=w2(g,0,h)|0;f=(f|0)==0?h:f-g|0;d=f>>>0>>0?f:d;B6(b|0,g|0,d|0)|0;c[a+4>>2]=g+d;b=g+f|0;c[a+8>>2]=b;c[e>>2]=b;return d|0}function y4(a,b,c){a=a|0;b=b|0;c=c|0;return A4(a,b,c)|0}function z4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=l2(a,b,f)|0;l=e;return d|0}function A4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((c[a+76>>2]|0)>-1){e=(n2(a)|0)==0;b=B4(a,b,d)|0;if(!e)o2(a)}else b=B4(a,b,d)|0;return b|0}function B4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;if((d|0)==1)b=b-(c[a+8>>2]|0)+(c[a+4>>2]|0)|0;e=a+20|0;f=a+28|0;if((c[e>>2]|0)>>>0>(c[f>>2]|0)>>>0?(eb[c[a+36>>2]&63](a,0,0)|0,(c[e>>2]|0)==0):0)b=-1;else{c[a+16>>2]=0;c[f>>2]=0;c[e>>2]=0;if((eb[c[a+40>>2]&63](a,b,d)|0)<0)b=-1;else{c[a+8>>2]=0;c[a+4>>2]=0;c[a>>2]=c[a>>2]&-17;b=0}}return b|0}function C4(b,c){b=b|0;c=c|0;var d=0;d=a[c>>0]|0;do if(d<<24>>24){b=F3(b,d<<24>>24)|0;if(b){if(a[c+1>>0]|0)if(a[b+1>>0]|0){if(!(a[c+2>>0]|0)){b=D4(b,c)|0;break}if(a[b+2>>0]|0){if(!(a[c+3>>0]|0)){b=E4(b,c)|0;break}if(a[b+3>>0]|0)if(!(a[c+4>>0]|0)){b=F4(b,c)|0;break}else{b=G4(b,c)|0;break}else b=0}else b=0}else b=0}else b=0}while(0);return b|0}function D4(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;g=(d[c>>0]|0)<<8|(d[c+1>>0]|0);f=d[b>>0]|0;while(1){c=b+1|0;e=a[c>>0]|0;if(!(e<<24>>24)){b=0;break}f=e&255|f<<8&65280;if((f|0)==(g|0))break;else b=c}return b|0}function E4(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8;e=b+2|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(c&255)<<8;c=c<<24>>24!=0;if(!((b|0)==(f|0)|c^1))do{e=e+1|0;c=a[e>>0]|0;b=(c&255|b)<<8;c=c<<24>>24!=0}while(!((b|0)==(f|0)|c^1));return (c?e+-2|0:0)|0}function F4(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8|(d[c+3>>0]|0);c=b+3|0;g=a[c>>0]|0;e=g&255|((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8);b=g<<24>>24!=0;if(!((e|0)==(f|0)|b^1))do{c=c+1|0;b=a[c>>0]|0;e=b&255|e<<8;b=b<<24>>24!=0}while(!((e|0)==(f|0)|b^1));return (b?c+-3|0:0)|0}function G4(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+1056|0;t=v+1024|0;u=v;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;c[t+20>>2]=0;c[t+24>>2]=0;c[t+28>>2]=0;e=a[d>>0]|0;a:do if(e<<24>>24){s=0;f=e;e=e&255;while(1){if(!(a[b+s>>0]|0)){e=0;break a}r=t+(((f&255)>>>5&255)<<2)|0;c[r>>2]=c[r>>2]|1<<(f&31);s=s+1|0;c[u+(e<<2)>>2]=s;e=a[d+s>>0]|0;if(!(e<<24>>24))break;else{f=e;e=e&255}}m=s>>>0>1;if(m){f=0;k=-1;g=1;b:while(1){h=1;e=f;while(1){f=g;c:while(1){j=1;while(1){g=a[d+(j+k)>>0]|0;i=a[d+f>>0]|0;if(g<<24>>24!=i<<24>>24)break c;if((j|0)==(h|0))break;j=j+1|0;f=j+e|0;if(f>>>0>=s>>>0){n=h;e=k;break b}}e=h+e|0;f=e+1|0;if(f>>>0>=s>>>0){n=h;e=k;break b}}h=f-k|0;if((g&255)<=(i&255))break;g=f+1|0;if(g>>>0>=s>>>0){n=h;e=k;break b}else e=f}g=e+2|0;if(g>>>0>=s>>>0){n=1;break}else{f=e+1|0;k=e}}if(m){h=0;m=-1;i=1;while(1){f=1;g=h;while(1){h=i;d:while(1){k=1;while(1){i=a[d+(k+m)>>0]|0;j=a[d+h>>0]|0;if(i<<24>>24!=j<<24>>24)break d;if((k|0)==(f|0))break;k=k+1|0;h=k+g|0;if(h>>>0>=s>>>0){h=n;g=m;i=27;break a}}g=f+g|0;h=g+1|0;if(h>>>0>=s>>>0){h=n;g=m;i=27;break a}}f=h-m|0;if((i&255)>=(j&255))break;i=h+1|0;if(i>>>0>=s>>>0){h=n;g=m;i=27;break a}else g=h}i=g+2|0;if(i>>>0>=s>>>0){h=n;f=1;i=27;break}else{h=g+1|0;m=g}}}else{h=n;f=1;g=-1;i=27}}else{h=1;e=-1;f=1;g=-1;i=27}}else{h=1;e=-1;s=0;f=1;g=-1;i=27}while(0);e:do if((i|0)==27){q=(g+1|0)>>>0>(e+1|0)>>>0;f=q?f:h;q=q?g:e;r=q+1|0;if(!(g2(d,d+f|0,r)|0))p=s-f|0;else{f=s-q+-1|0;p=0;f=(q>>>0>f>>>0?q:f)+1|0}k=s|63;m=s+-1|0;n=(p|0)!=0;o=s-f|0;e=b;j=0;g=b;while(1){h=e;do if((g-h|0)>>>0>>0){i=w2(g,0,k)|0;if(i)if((i-h|0)>>>0>>0){e=0;break e}else break;else{i=g+k|0;break}}else i=g;while(0);g=a[e+m>>0]|0;f:do if(!(1<<(g&31)&c[t+(((g&255)>>>5&255)<<2)>>2])){h=0;g=s}else{g=s-(c[u+((g&255)<<2)>>2]|0)|0;if(g|0){h=0;g=n&(j|0)!=0&g>>>0>>0?o:g;break}g=r>>>0>j>>>0?r:j;h=a[d+g>>0]|0;g:do if(!(h<<24>>24))g=r;else{while(1){if(h<<24>>24!=(a[e+g>>0]|0))break;g=g+1|0;h=a[d+g>>0]|0;if(!(h<<24>>24)){g=r;break g}}h=0;g=g-q|0;break f}while(0);while(1){if(g>>>0<=j>>>0)break e;g=g+-1|0;if((a[d+g>>0]|0)!=(a[e+g>>0]|0)){h=p;g=f;break}}}while(0);e=e+g|0;j=h;g=i}}while(0);l=v;return e|0}function H4(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=a;c[e+4>>2]=b;b=K1(Pa(33,e|0)|0)|0;l=d;return b|0}function I4(a,b){a=a|0;b=b|0;return J4(a,b,(D3(a)|0)+1|0)|0}function J4(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;e=c&255;do{if(!d){c=0;break}d=d+-1|0;c=b+d|0}while((a[c>>0]|0)!=e<<24>>24);return c|0}function K4(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=l;l=l+32|0;i=j;h=((g|0)<0)<<31>>31;do if((g&4095|0)==0&(h&-4096|0)==0){if(b>>>0>2147483646){c[(L1()|0)>>2]=12;a=-1;break}if(e&16|0)H3();h=z6(g|0,h|0,12)|0;c[i>>2]=a;c[i+4>>2]=b;c[i+8>>2]=d;c[i+12>>2]=e;c[i+16>>2]=f;c[i+20>>2]=h;a=K1(Ga(192,i|0)|0)|0}else{c[(L1()|0)>>2]=22;a=-1}while(0);l=j;return a|0}function L4(a){a=a|0;return M4(a)|0}function M4(a){a=a|0;return L6(a|0)|0}function N4(a,b,c){a=a|0;b=b|0;c=c|0;O4(a,b,c)|0;return a|0}function O4(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=d;do if(!((g^b)&3)){f=(e|0)!=0;a:do if(f&(g&3|0)!=0)while(1){g=a[d>>0]|0;a[b>>0]=g;if(!(g<<24>>24))break a;e=e+-1|0;d=d+1|0;b=b+1|0;f=(e|0)!=0;if(!(f&(d&3|0)!=0)){h=5;break}}else h=5;while(0);if((h|0)==5)if(!f){e=0;break}if(a[d>>0]|0){b:do if(e>>>0>3){f=d;while(1){d=c[f>>2]|0;if((d&-2139062144^-2139062144)&d+-16843009|0){d=f;break b}c[b>>2]=d;e=e+-4|0;d=f+4|0;b=b+4|0;if(e>>>0>3)f=d;else break}}while(0);h=11}}else h=11;while(0);c:do if((h|0)==11)if(!e)e=0;else while(1){h=a[d>>0]|0;a[b>>0]=h;if(!(h<<24>>24))break c;e=e+-1|0;b=b+1|0;if(!e){e=0;break}else d=d+1|0}while(0);u6(b|0,0,e|0)|0;return b|0}function P4(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+32|0;f=g;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;e=a[d>>0]|0;do if(!(e<<24>>24))d=0;else{if(!(a[d+1>>0]|0)){d=b;while(1)if((a[d>>0]|0)==e<<24>>24)d=d+1|0;else break;d=d-b|0;break}do{h=f+(((e&255)>>>5&255)<<2)|0;c[h>>2]=c[h>>2]|1<<(e&31);d=d+1|0;e=a[d>>0]|0}while(e<<24>>24!=0);e=a[b>>0]|0;a:do if(!(e<<24>>24))d=b;else{d=b;do{if(!(c[f+(((e&255)>>>5&255)<<2)>>2]&1<<(e&31)))break a;d=d+1|0;e=a[d>>0]|0}while(e<<24>>24!=0)}while(0);d=d-b|0}while(0);l=g;return d|0}function Q4(a,c){a=a|0;c=c|0;var d=0,f=0,g=0;g=a+2|0;f=a+4|0;d=G6((e[c+2>>1]|0)<<16|(e[c>>1]|0)|0,e[c+4>>1]|0|0,(e[g>>1]|0)<<16|(e[a>>1]|0)|0,e[f>>1]|0|0)|0;c=w6(d|0,D|0,e[c+6>>1]|0|0,0)|0;d=D;b[a>>1]=c;a=z6(c|0,d|0,16)|0;b[g>>1]=a;b[f>>1]=d;D=d&65535;return c|0}function R4(a){a=a|0;var b=0;b=Q4(a,66122)|0;b=v6(b|0,D|0,4)|0;a=D|1072693248;c[j>>2]=b;c[j+4>>2]=a;return +(+h[j>>3]+-1.0)}function S4(){return +(+R4(66116))}function T4(a){a=a|0;var b=0;b=186776;c[b>>2]=a+-1;c[b+4>>2]=0;return}function U4(){var a=0,b=0,d=0;b=186776;b=G6(c[b>>2]|0,c[b+4>>2]|0,1284865837,1481765933)|0;b=w6(b|0,D|0,1,0)|0;a=D;d=186776;c[d>>2]=b;c[d+4>>2]=a;a=z6(b|0,a|0,33)|0;return a|0}function V4(a){a=a|0;b[97016]=b[33058]|0;b[97017]=b[33059]|0;b[97018]=b[33060]|0;b[33058]=b[a>>1]|0;b[33059]=b[a+2>>1]|0;b[33060]=b[a+4>>1]|0;return 194032}function W4(a){a=a|0;var c=0,d=0;c=l;l=l+16|0;d=c;b[d>>1]=13070;b[d+2>>1]=a;b[d+4>>1]=a>>>16;V4(d)|0;l=c;return}function X4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;v=l;l=l+48|0;i=v;t=Y4()|0;a:do if(!t)b=12;else{u=Z4(0,0)|0;if(!u){_4(t);b=12;break}e=i+8|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[i>>2]=u;c[i+4>>2]=t;c[i+16>>2]=b;c[i+32>>2]=d;e=i+28|0;c[e>>2]=-1;b=$4(i)|0;b:do if(!b){h=i+20|0;f=c[h>>2]|0;c[a>>2]=f+-1;j=c[i+8>>2]|0;b=c[e>>2]|0;if((b|0)<(f|0)){g=m6(1,68)|0;if(g){r=b>>>31^1;c[g+60>>2]=r;c[g+28>>2]=f;if((d&8|0)==0|(r|0)!=0){b=a5(0,t,j,g)|0;if(b|0){h=0;i=0;f=0;e=0;break}f=c[g+40>>2]|0;if((f|0)>0){b=(f<<2)+4|0;e=k6(b)|0;if(!e){h=0;i=0;b=12;f=0;e=0;break}c[g+32>>2]=e;u6(e|0,-1,b|0)|0}else e=0;r=m6(f<<1|1,4)|0;c[g+36>>2]=r;if(!r){h=0;i=0;b=12;f=0;e=0;break}b=m6(c[h>>2]|0,12)|0;if(!b){h=0;i=0;b=12;f=0;e=0;break}c[g+16>>2]=b;b=a5(u,t,j,g)|0;if(!b)b=e;else{h=0;i=0;f=0;e=0;break}}else b=0;r=i+24|0;b=b5(u,t,j,r,b)|0;if(!b){b=c[r>>2]|0;c[r>>2]=b+1;b=c5(u,0,0,b)|0;if((b|0)!=0?(s=d5(u,j,b)|0,(s|0)!=0):0){b=e5(u,t,s)|0;if(!b){e=c[r>>2]|0;b=e<<2;p=k6(b)|0;if(p){q=k6(b)|0;if(q){if((e|0)>0)u6(p|0,0,e<<2|0)|0;f5(s,0,p,0)|0;f=c[r>>2]|0;if((f|0)>0){b=0;e=0;do{c[q+(e<<2)>>2]=b;o=p+(e<<2)|0;b=b+1+(c[o>>2]|0)|0;c[o>>2]=0;e=e+1|0}while((e|0)<(f|0));m=b}else m=0;n=m6(m+1|0,32)|0;if(n){c[g>>2]=n;o=g+4|0;c[o>>2]=m;b=f5(s,n,p,q)|0;if(!b){c[g+20>>2]=0;f=s+24|0;b=c[f>>2]|0;e=0;while(1){e=e+1|0;if((c[b>>2]|0)<=-1)break;else b=b+32|0}k=m6(e,32)|0;if(!k){h=p;i=q;b=12;f=p;e=q}else{c[g+8>>2]=k;b=c[f>>2]|0;e=c[b>>2]|0;if((e|0)>-1){j=b;b=0;do{c[k+(b<<5)+8>>2]=n+(c[q+(e<<2)>>2]<<5);c[k+(b<<5)+12>>2]=e;h=k+(b<<5)+16|0;c[h>>2]=0;i=j+12|0;f=c[i>>2]|0;if(f|0){e=0;do{w=e;e=e+1|0}while((c[f+(w<<2)>>2]|0)>-1);e=e<<2;f=k6(e)|0;c[h>>2]=f;if(!f){h=p;i=q;b=12;f=p;e=q;break b}B6(f|0,c[i>>2]|0,e|0)|0}c[k+(b<<5)+20>>2]=c[j+16>>2];b=b+1|0;j=j+32|0;e=c[j>>2]|0}while((e|0)>-1)}else b=0;c[k+(b<<5)+8>>2]=0;c[o>>2]=m;c[g+12>>2]=n+(c[q+(c[c[s+28>>2]>>2]<<2)>>2]<<5);c[g+52>>2]=c[r>>2];c[g+56>>2]=d;g5(u);_4(t);l6(p);l6(q);c[a+4>>2]=g;b=0;break a}}else{h=p;i=q;f=p;e=q}}else{h=p;i=q;b=12;f=p;e=q}}else{h=p;i=q;b=12;f=p;e=0}}else{h=p;i=0;b=12;f=0;e=0}}else{h=0;i=0;f=0;e=0}}else{h=0;i=0;b=12;f=0;e=0}}else{h=0;i=0;f=0;e=0}}else{h=0;i=0;b=12;f=0;e=0}}else{g=0;h=0;i=0;b=6;f=0;e=0}}else{g=0;h=0;i=0;f=0;e=0}while(0);g5(u);_4(t);if(h|0)l6(f);if(i|0)l6(e);c[a+4>>2]=g;h5(a)}while(0);l=v;return b|0}function Y4(){var a=0,b=0;a=k6(20)|0;do if(a){b=k6(2048)|0;c[a+16>>2]=b;if(!b){l6(a);a=0;break}else{c[a>>2]=512;c[a+4>>2]=1024e3;c[a+8>>2]=128;c[a+12>>2]=0;break}}while(0);return a|0}function Z4(a,b){a=a|0;b=b|0;if(!a)b=m6(1,24)|0;else{c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[b+20>>2]=0}return b|0}function _4(a){a=a|0;l6(c[a+16>>2]|0);l6(a);return}function $4(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+16|0;q=v+4|0;r=v;s=c[b+32>>2]&1;t=b+16|0;e=c[t>>2]|0;u=c[b+4>>2]|0;d=l5(u,0)|0;a:do if(!d){n=(s|0)!=0;o=b+8|0;p=b+12|0;m=n^1;d=0;k=1;b:while(1){g=0;h=d;f=0;c:while(1){d=a[e>>0]|0;if(n){if(d<<24>>24==40)break;if((h|0)!=0&d<<24>>24==41)j=13;else j=14}else if(d<<24>>24==92)switch(a[e+1>>0]|0){case 40:break c;case 41:{j=13;break}default:j=14}else j=14;if((j|0)==13){j=0;i=c5(c[b>>2]|0,-1,-1,-1)|0;c[o>>2]=i;if(!i){d=12;break a}else i=f}else if((j|0)==14){j=0;d=B5(b,e)|0;if(d|0)break a;i=f;e=c[p>>2]|0}while(1){d:while(1){d=a[e>>0]|0;switch(d<<24>>24){case 42:case 92:break;default:{if(!n)break d;switch(d<<24>>24){case 123:case 63:case 43:break;default:break d}}}d=d<<24>>24==92;if(n&d)break;f=e+1|0;if(d)switch(a[f>>0]|0){case 123:case 63:case 43:break;default:break d}e=d?f:e;if((!n?(e|0)==((c[t>>2]|0)+1|0):0)?(a[e+-1>>0]|0)==94:0)break;if((a[e>>0]|0)==123){e=C5(e+1|0,s,q,r)|0;if(!e){j=28;break b}d=c[r>>2]|0;f=c[b>>2]|0;if(!d)d=c5(f,-1,-1,-1)|0;else j=36}else{c[q>>2]=0;c[r>>2]=-1;d=a[e>>0]|0;if(d<<24>>24==43){c[q>>2]=1;d=a[e>>0]|0}if(d<<24>>24==63){c[r>>2]=1;d=1}else d=-1;e=e+1|0;f=c[b>>2]|0;j=36}if((j|0)==36){j=0;d=w5(f,c[o>>2]|0,c[q>>2]|0,d,0)|0}c[o>>2]=d;if(!d){d=12;break a}}g=d5(c[b>>2]|0,g,c[o>>2]|0)|0;f=a[e>>0]|0;do if(!n)if(f<<24>>24==92)if((a[e+1>>0]|0)==41){d=x5(c[b>>2]|0,i,g)|0;j=49}else{d=92;j=44}else{d=f;j=46}else{if(f<<24>>24!=124)if((h|0)!=0&f<<24>>24==41)f=41;else{d=f;j=44;break}else f=124;d=x5(c[b>>2]|0,i,g)|0;j=50}while(0);if((j|0)==44)if(d<<24>>24==92&m)if((a[e+1>>0]|0)==124)j=48;else{f=i;continue c}else j=46;if((j|0)==46)if(!(d<<24>>24))j=48;else{f=i;continue c}if((j|0)==48){d=x5(c[b>>2]|0,i,g)|0;if(f<<24>>24==92)j=49;else j=50}if((j|0)==49){j=0;if((a[e+1>>0]|0)==124){f=2;break}if(!h){d=8;break a}e=e+2|0;f=92}else if((j|0)==50){j=0;if(f<<24>>24==124){f=1;break}e=f<<24>>24==41?e+1|0:e}d=D5(b,d,m5(u)|0)|0;if(d|0)break a;d=f<<24>>24==0;f=(h|0)<1;if(f&d){j=56;break b}if(f|d){d=8;break a}g=n5(u)|0;h=h+-1|0;i=n5(u)|0}g=0;e=e+f|0;f=d}d=k5(u,f)|0;if(d|0)break a;d=k5(u,g)|0;if(d|0)break a;d=l5(u,k)|0;if(d|0)break a;d=h+1|0;k=k+1|0;e=n?e+1|0:e+2|0}if((j|0)==28){d=10;break}else if((j|0)==56){c[b+20>>2]=k;d=0;break}}while(0);l=v;return d|0}function a5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;x=j5(d)|0;y=(b|0)==0|(f|0)==0;if(!y){c[f+48>>2]=0;c[c[f+36>>2]>>2]=-1}h=c[f+28>>2]|0;z=k6((h<<3)+8|0)|0;do if(!z)g=12;else{c[z>>2]=-1;A=k6((h<<2)+4|0)|0;if(!A){l6(z);g=12;break}c[A>>2]=-1;g=0;while(1)if(g>>>0>h>>>0)break;else g=g+1|0;k5(d,e)|0;g=l5(d,0)|0;a:do if((g|0)!=0|(j5(d)|0)<=(x|0)){e=z;n=0;h=0;m=0;l=-1}else{u=f+32|0;v=f+36|0;w=f+16|0;e=z;n=0;h=0;m=0;t=1;l=-1;s=0;while(1){b:do switch(m5(d)|0){case 6:{i=m5(d)|0;g=0;do{j=e+(g<<2)|0;g=g+1|0}while((c[j>>2]|0)>-1);c[j>>2]=i<<1|1;c[e+(g<<2)>>2]=-1;g=0;while(1)if((c[A+(g<<2)>>2]|0)>-1)g=g+1|0;else break;c[A+(g+-1<<2)>>2]=-1;g=0;j=t;i=s;break}case 0:{q=n5(d)|0;r=q+12|0;j=c[r>>2]|0;if((j|0)>-1){g=0;do{i=e+(g<<2)|0;g=g+1|0}while((c[i>>2]|0)>-1);c[i>>2]=j<<1;c[e+(g<<2)>>2]=-1;if(!y){g=0;while(1)if((c[A+(g<<2)>>2]|0)>-1)g=g+1|0;else break;i=(c[w>>2]|0)+(j*12|0)+8|0;c[i>>2]=0;if((g|0)>0){g=k6((g<<2)+4|0)|0;if(!g){g=12;j=t;i=s;break b}c[i>>2]=g;i=c[A>>2]|0;if((i|0)>-1){k=0;j=g;do{c[j>>2]=i;k=k+1|0;i=c[A+(k<<2)>>2]|0;j=g+(k<<2)|0}while((i|0)>-1);g=j}c[g>>2]=-1}}g=l5(d,c[r>>2]|0)|0;if(g|0){j=t;i=s;break b}g=l5(d,6)|0;if(g|0){j=t;i=s;break b}}c:do switch(c[q>>2]|0){case 0:{p=c[c[q+4>>2]>>2]|0;if((p|0)>-1|(p|0)==-4?(c[e>>2]|0)>-1:0){if(y){c[q+20>>2]=1;g=0}else{g=y5(b,q,m)|0;c[(c[u>>2]|0)+(m<<2)>>2]=s;if((l|0)>-1){j=c[v>>2]|0;i=0;while(1){k=j+(i<<2)|0;o=i+1|0;if((c[k>>2]|0)>-1)i=o;else break}c[k>>2]=m;c[j+(o<<2)>>2]=l;c[j+(i+2<<2)>>2]=-1;h=h+1|0;l=-1}z5(e,f,m)}c[e>>2]=-1;p=t+1|0;o=s;n=n+1|0;m=t}else{p=t;g=0;o=s}break}case 1:{j=c[q+4>>2]|0;k=c[j>>2]|0;j=c[j+4>>2]|0;g=k5(d,q)|0;if(!g){g=l5(d,5)|0;if(!g){g=k5(d,j)|0;if(!g){g=l5(d,0)|0;if(!g){i=k+20|0;g=l5(d,(c[i>>2]|0)+t|0)|0;if(!g){if((c[i>>2]|0)>0){i=(c[j+20>>2]|0)>0;g=i?t:-1;i=(i&1)+t|0}else{g=-1;i=t}g=l5(d,g)|0;if(!g){g=l5(d,4)|0;if(!g){g=k5(d,k)|0;if(!g){p=i;g=l5(d,0)|0;o=s}else{p=i;o=s}}else{p=i;o=s}}else{p=i;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}break}case 2:{i=c[q+4>>2]|0;if(y){if((c[e>>2]|0)>-1)g=1;else g=(a[i+12>>0]&1)!=0;g=l5(d,g&1)|0;if(g|0){p=t;o=s;break c}}else{g=l5(d,m)|0;if(g|0){p=t;o=s;break c}g=l5(d,a[i+12>>0]&1)|0;if(g|0){p=t;o=s;break c}}g=k5(d,q)|0;if(!g){g=l5(d,1)|0;if(!g){g=k5(d,c[i>>2]|0)|0;if(!g){g=l5(d,0)|0;if(!g){if((c[e>>2]|0)<=-1?(a[i+12>>0]&1)==0:0){p=t;g=0;o=0;break c}if(y)g=0;else{g=y5(b,q,m)|0;c[(c[u>>2]|0)+(m<<2)>>2]=(a[i+12>>0]&1)==0?s:1;if((l|0)>-1){j=c[v>>2]|0;i=0;while(1){k=j+(i<<2)|0;o=i+1|0;if((c[k>>2]|0)>-1)i=o;else break}c[k>>2]=m;c[j+(o<<2)>>2]=l;c[j+(i+2<<2)>>2]=-1;h=h+1|0;l=-1}z5(e,f,m)}c[e>>2]=-1;p=t+1|0;o=0;n=n+1|0;m=t}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}break}case 3:{j=c[q+4>>2]|0;k=c[j>>2]|0;j=c[j+4>>2]|0;i=(c[e>>2]|0)>-1;p=t+1|0;g=l5(d,i?p:t)|0;if(!g){g=l5(d,i?t:m)|0;if(!g){g=k5(d,e)|0;if(!g){g=l5(d,(c[e>>2]|0)>>>31^1)|0;if(!g){g=k5(d,q)|0;if(!g){g=k5(d,j)|0;if(!g){g=k5(d,k)|0;if(!g){g=l5(d,3)|0;if(!g){g=k5(d,j)|0;if(!g){g=l5(d,0)|0;if(!g){g=l5(d,2)|0;if(g|0){p=t;o=s;break c}g=k5(d,k)|0;if(g|0){p=t;o=s;break c}g=l5(d,0)|0;if(g|0){p=t;o=s;break c}if((c[e>>2]|0)>-1){if(y)g=0;else{g=y5(b,q,m)|0;c[(c[u>>2]|0)+(m<<2)>>2]=s;if((l|0)>-1){j=c[v>>2]|0;i=0;while(1){k=j+(i<<2)|0;o=i+1|0;if((c[k>>2]|0)>-1)i=o;else break}c[k>>2]=m;c[j+(o<<2)>>2]=l;c[j+(i+2<<2)>>2]=-1;h=h+1|0;l=-1}z5(e,f,m)}c[e>>2]=-1;n=n+1|0;m=t;i=p}else{g=0;i=t}t=(c[q+16>>2]|0)>0;p=t?i+2|0:i;o=s;m=t?i+1|0:m}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}break}default:{p=t;g=0;o=s}}while(0);j=c[r>>2]|0;if((j|0)>-1){i=0;do{k=A+(i<<2)|0;i=i+1|0}while((c[k>>2]|0)>-1);c[k>>2]=j;c[A+(i<<2)>>2]=-1;j=p;i=o}else{j=p;i=o}break}case 1:{g=n5(d)|0;if(y){i=c[(c[c[g+4>>2]>>2]|0)+20>>2]|0;c[g+20>>2]=(m5(d)|0)+i;i=0;l=-1}else{q=m5(d)|0;r=m5(d)|0;i=q;l=(q|0)==0?l:r}g=0;j=t;i=y?s:(i|0)==0&1;break}case 4:{i=m5(d)|0;j=m5(d)|0;g=0;m=(i|0)>-1?i:m;i=s;break}case 5:{g=n5(d)|0;if(y){j=c[g+4>>2]|0;c[g+20>>2]=(c[(c[j+4>>2]|0)+20>>2]|0)+(c[(c[j>>2]|0)+20>>2]|0);g=0;j=t;i=s}else{g=0;j=t;i=s}break}case 2:{while(1)if((c[e>>2]|0)>-1)e=e+4|0;else{g=0;j=t;i=s;break}break}case 3:{j=n5(d)|0;o=n5(d)|0;g=n5(d)|0;e=m5(d)|0;if(y){r=c[g+4>>2]|0;s=g+16|0;c[g+20>>2]=(c[(c[r>>2]|0)+20>>2]|0)+e+(c[(c[r+4>>2]|0)+20>>2]|0)+((c[s>>2]|0)>0?2:0);g=s}else g=g+16|0;e=n5(d)|0;i=m5(d)|0;k=m5(d)|0;if((c[g>>2]|0)>0){if(y)g=0;else{g=A5(b,j,i)|0;c[(c[u>>2]|0)+(i<<2)>>2]=1;if(!g)g=A5(b,o,k)|0;c[(c[u>>2]|0)+(k<<2)>>2]=1}n=n+2|0;j=t;i=1}else{g=0;j=t;i=1}break}default:{g=0;j=t;i=s}}while(0);if((g|0)!=0|(j5(d)|0)<=(x|0))break a;else{t=j;s=i}}}while(0);if(!y?(z5(e,f,m),(l|0)>-1):0){i=c[f+36>>2]|0;e=0;while(1){j=i+(e<<2)|0;k=e+1|0;if((c[j>>2]|0)>-1)e=k;else break}c[j>>2]=m;c[i+(k<<2)>>2]=l;c[i+(e+2<<2)>>2]=-1;h=h+1|0}c[f+48>>2]=n;c[f+40>>2]=n;c[f+44>>2]=h;l6(z);l6(A)}while(0);return g|0}function b5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=l;l=l+16|0;t=y+12|0;w=y+8|0;x=y+4|0;u=y;v=j5(b)|0;c[t>>2]=0;c[w>>2]=0;d=k5(b,d)|0;a:do if(!d){d=l5(b,0)|0;if(!d){b:do if((j5(b)|0)>(v|0)){g=0;i=0;j=0;c:while(1){q=m5(b)|0;r=n5(b)|0;d:do switch(q|0){case 0:{switch(c[r>>2]|0){case 0:{d=c[r+4>>2]|0;r=c[d>>2]|0;if(!((r|0)>-1|(r|0)==-4)){d=j;break d}r=d+8|0;d=(c[r>>2]|0)+j|0;c[r>>2]=d;if((d|0)<=(c[w>>2]|0)){d=j;break d}c[w>>2]=d;d=j;break d}case 3:{h=c[r+4>>2]|0;d=k5(b,c[h+4>>2]|0)|0;if(d|0)break b;d=l5(b,0)|0;if(d|0)break b;d=k5(b,c[h>>2]|0)|0;if(d|0)break b;break}case 1:{h=c[r+4>>2]|0;d=k5(b,c[h+4>>2]|0)|0;if(d|0)break b;d=l5(b,0)|0;if(d|0)break b;d=k5(b,c[h>>2]|0)|0;if(d|0)break b;break}case 2:{h=c[r+4>>2]|0;d=l5(b,j)|0;if(d|0)break b;d=k5(b,r)|0;if(d|0)break b;d=l5(b,1)|0;if(d|0)break b;d=k5(b,c[h>>2]|0)|0;if(d|0)break b;d=l5(b,0)|0;if(d|0)break b;if((c[h+4>>2]|0)<=1?(c[h+8>>2]|0)<=1:0)d=j;else{c[t>>2]=0;d=0}i=i+1|0;break d}default:{d=j;break d}}d=l5(b,0)|0;if(!d)d=j;else break b;break}case 1:{p=r+4|0;o=c[p>>2]|0;q=m5(b)|0;c[t>>2]=q;n=o+4|0;j=c[n>>2]|0;if((j|0)<=1)if((c[o+8>>2]|0)>1){c[x>>2]=0;if((j|0)>0)s=30;else{d=q;h=0;s=37}}else d=q;else{c[x>>2]=0;s=30}e:do if((s|0)==30){d=v5(a,b,c[o>>2]|0,(j|0)>1?1:2,t,f,u,w)|0;if(!d){h=0;k=q;m=1}else{s=34;break c}while(1){d=c[u>>2]|0;if(!h)h=d;else h=d5(a,h,d)|0;if(!h){d=12;s=34;break c}j=c[n>>2]|0;if((m|0)>=(j|0)){d=k;s=37;break e}k=c[t>>2]|0;m=m+1|0;d=v5(a,b,c[o>>2]|0,(m|0)<(j|0)?1:2,t,f,u,w)|0;if(d|0){s=34;break c}}}while(0);if((s|0)==37){s=0;n=o+8|0;k=c[n>>2]|0;if((k|0)==-1){k=c[t>>2]|0;d=v5(a,b,c[o>>2]|0,0,t,0,x,w)|0;if(d|0)break c;j=w5(a,c[x>>2]|0,0,-1,0)|0;c[x>>2]=j;if(!j){d=12;break c}else d=k}else if((j|0)<(k|0)){k=j;j=0;do{m=c[t>>2]|0;d=v5(a,b,c[o>>2]|0,0,t,0,u,w)|0;if(d|0){g=j;s=48;break c}d=c[u>>2]|0;if(!j)j=d;else j=d5(a,d,j)|0;if(!j){d=12;g=0;s=48;break c}d=c5(a,-1,-1,-1)|0;if(!d){d=12;g=j;s=48;break c}j=x5(a,d,j)|0;if(!j){d=12;g=0;s=48;break c}k=k+1|0}while((k|0)<(c[n>>2]|0));c[x>>2]=j;d=m}else j=0;c[t>>2]=d;if(h){if(j){h=d5(a,h,j)|0;s=54}}else{h=j;s=54}if((s|0)==54){s=0;if(!h){d=12;break c}}c[p>>2]=c[h+4>>2];c[r>>2]=c[h>>2]}i=i+-1|0;h=d-q+g|0;if(!i){c[t>>2]=h;g=h;i=0;d=h}else g=h;break}default:d=j}while(0);if((j5(b)|0)>(v|0))j=d;else{d=0;break b}}if((s|0)!=34)if((s|0)==48)c[x>>2]=g;break a}else{d=0;g=0}while(0);x=(c[e>>2]|0)+g|0;w=c[w>>2]|0;c[e>>2]=(w|0)>(x|0)?w:x}}while(0);l=y;return d|0}function c5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=s5(a,0,0,1,20)|0;a=u5(a,0,f)|0;if(!a)a=0;else{c[f>>2]=b;c[f+4>>2]=d;c[f+8>>2]=e}return a|0}function d5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if(b){e=s5(a,0,0,1,8)|0;a=u5(a,1,e)|0;if(!a)d=0;else{c[e>>2]=b;c[e+4>>2]=d;c[a+16>>2]=(c[d+16>>2]|0)+(c[b+16>>2]|0);d=a}}return d|0}function e5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;j=o+4|0;k=o;m=j5(b)|0;d=k5(b,d)|0;a:do if(!d){d=l5(b,0)|0;if(!d)if((j5(b)|0)>(m|0)){b:while(1){h=m5(b)|0;i=n5(b)|0;c:do switch(h|0){case 0:switch(c[i>>2]|0){case 0:{g=c[i+4>>2]|0;f=c[g>>2]|0;if((f|0)==-4){c[i+8>>2]=0;d=g+8|0;h=o5(a,c[d>>2]|0,0,1114111,0,0,-1)|0;c[i+24>>2]=h;if(!h){d=12;break a}h=o5(a,c[d>>2]|0,0,1114111,0,0,c[g+4>>2]|0)|0;c[i+28>>2]=h;if(!h){d=12;break a}else break c}d=i+8|0;if((f|0)<0){c[d>>2]=1;h=p5(a)|0;c[i+24>>2]=h;if(!h){d=12;break a}h=p5(a)|0;c[i+28>>2]=h;if(!h){d=12;break a}else break c}else{c[d>>2]=0;d=g+8|0;e=g+4|0;h=o5(a,c[d>>2]|0,f,c[e>>2]|0,0,0,-1)|0;c[i+24>>2]=h;if(!h){d=12;break a}h=o5(a,c[d>>2]|0,c[g>>2]|0,c[e>>2]|0,c[g+12>>2]|0,c[g+16>>2]|0,-1)|0;c[i+28>>2]=h;if(!h){d=12;break a}else break c}}case 3:{d=k5(b,i)|0;if(d|0)break a;d=l5(b,1)|0;if(d|0)break a;e=i+4|0;d=k5(b,c[(c[e>>2]|0)+4>>2]|0)|0;if(d|0)break a;d=l5(b,0)|0;if(d|0)break a;d=k5(b,c[c[e>>2]>>2]|0)|0;if(d|0)break a;d=l5(b,0)|0;if(!d)break c;else break a}case 1:{d=k5(b,i)|0;if(d|0)break a;d=l5(b,2)|0;if(d|0)break a;e=i+4|0;d=k5(b,c[(c[e>>2]|0)+4>>2]|0)|0;if(d|0)break a;d=l5(b,0)|0;if(d|0)break a;d=k5(b,c[c[e>>2]>>2]|0)|0;if(d|0)break a;d=l5(b,0)|0;if(!d)break c;else break a}case 2:{d=k5(b,i)|0;if(d|0)break a;d=l5(b,3)|0;if(d|0)break a;d=k5(b,c[c[i+4>>2]>>2]|0)|0;if(d|0)break a;d=l5(b,0)|0;if(!d)break c;else break a}default:break c}case 1:{d=c[i+4>>2]|0;e=c[d>>2]|0;f=d+4|0;g=c[f>>2]|0;if(!(c[e+8>>2]|0))h=(c[g+8>>2]|0)!=0;else h=1;c[i+8>>2]=h&1;h=q5(a,c[e+24>>2]|0,c[g+24>>2]|0,0,0)|0;c[i+24>>2]=h;if(!h){d=12;break a}h=q5(a,c[(c[d>>2]|0)+28>>2]|0,c[(c[f>>2]|0)+28>>2]|0,0,0)|0;c[i+28>>2]=h;if(!h){d=12;break a}break}case 3:{h=c[i+4>>2]|0;d=c[h>>2]|0;if(!(c[h+4>>2]|0))e=1;else e=(c[d+8>>2]|0)!=0&1;c[i+8>>2]=e;c[i+24>>2]=c[d+24>>2];c[i+28>>2]=c[d+28>>2];break}case 2:{g=c[i+4>>2]|0;d=c[g>>2]|0;e=d+8|0;if(!(c[e>>2]|0))f=0;else f=(c[(c[g+4>>2]|0)+8>>2]|0)!=0;c[i+8>>2]=f&1;if(c[e>>2]|0){d=r5(b,d,0,0,j)|0;if(d|0)break b;e=k6((c[j>>2]<<2)+4|0)|0;if(!e){d=12;break b}c[e>>2]=-1;c[k>>2]=0;d=r5(b,c[g>>2]|0,e,k,0)|0;if(d|0){n=45;break b}d=g+4|0;h=i+24|0;c[h>>2]=q5(a,c[(c[d>>2]|0)+24>>2]|0,c[(c[g>>2]|0)+24>>2]|0,e,c[k>>2]|0)|0;l6(e);if(!(c[h>>2]|0)){d=12;break b}else f=d}else{c[i+24>>2]=c[d+24>>2];f=g+4|0}d=c[f>>2]|0;if(c[d+8>>2]|0){d=r5(b,d,0,0,j)|0;if(d|0)break b;e=k6((c[j>>2]<<2)+4|0)|0;if(!e){d=12;break b}c[e>>2]=-1;c[k>>2]=0;d=r5(b,c[f>>2]|0,e,k,0)|0;if(d|0){n=52;break b}i=i+28|0;c[i>>2]=q5(a,c[(c[g>>2]|0)+28>>2]|0,c[(c[f>>2]|0)+28>>2]|0,e,c[k>>2]|0)|0;l6(e);if(!(c[i>>2]|0)){d=12;break b}}else c[i+28>>2]=c[d+28>>2];break}default:{}}while(0);if((j5(b)|0)<=(m|0)){d=0;break a}}if((n|0)==45)l6(e);else if((n|0)==52)l6(e)}else d=0}while(0);l=o;return d|0}function f5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;a:while(1){switch(c[a>>2]|0){case 2:{a=c[a+4>>2]|0;if((c[a+8>>2]|0)==-1?(h=c[a>>2]|0,h=i5(c[h+28>>2]|0,c[h+24>>2]|0,b,d,e)|0,(h|0)!=0):0){a=h;break a}break}case 3:{f=c[a+4>>2]|0;a=f5(c[f>>2]|0,b,d,e)|0;if(a|0)break a;a=f+4|0;break}case 1:{f=c[a+4>>2]|0;g=f+4|0;a=i5(c[(c[f>>2]|0)+28>>2]|0,c[(c[g>>2]|0)+24>>2]|0,b,d,e)|0;if(a|0)break a;a=f5(c[f>>2]|0,b,d,e)|0;if(!a)a=g;else break a;break}default:{a=0;break a}}a=c[a>>2]|0}return a|0}function g5(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;if(b|0)do{l6(c[b>>2]|0);d=b;b=c[b+4>>2]|0;l6(d)}while((b|0)!=0);l6(a);return}function h5(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=c[a+4>>2]|0;if(h|0){e=h+4|0;a=c[h>>2]|0;if(c[e>>2]|0){d=0;do{if(c[a+(d<<5)+8>>2]|0){b=c[a+(d<<5)+16>>2]|0;if(b){l6(b);a=c[h>>2]|0}b=c[a+(d<<5)+28>>2]|0;if(b){l6(b);a=c[h>>2]|0}}d=d+1|0}while(d>>>0<(c[e>>2]|0)>>>0)}if(a|0)l6(a);d=h+8|0;a=c[d>>2]|0;if(a|0){if(c[a+8>>2]|0){while(1){b=c[a+16>>2]|0;if(b|0)l6(b);if(!(c[a+40>>2]|0))break;else a=a+32|0}a=c[d>>2]|0}l6(a)}f=h+16|0;a=c[f>>2]|0;if(a|0){g=h+28|0;b=c[g>>2]|0;if(b){e=0;do{d=c[a+(e*12|0)+8>>2]|0;if(d){l6(d);b=c[g>>2]|0;a=c[f>>2]|0}e=e+1|0}while(e>>>0>>0)}l6(a)}a=c[h+32>>2]|0;if(a|0)l6(a);a=c[h+20>>2]|0;if(a|0)l6(a);a=c[h+36>>2]|0;if(a|0)l6(a);l6(h)}return}function i5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=c[a>>2]|0;h=(g|0)>-1;a:do if(!d)if(h){h=b+32|0;do{if((c[b>>2]|0)>-1?(y=e+(g<<2)|0,c[y>>2]=(c[y>>2]|0)+1,(c[h>>2]|0)>-1):0){g=h;do{y=e+(c[a>>2]<<2)|0;c[y>>2]=(c[y>>2]|0)+1;g=g+32|0}while((c[g>>2]|0)>-1)}a=a+32|0;g=c[a>>2]|0}while((g|0)>-1);g=0}else g=0;else if(h)while(1){h=c[b>>2]|0;b:do if((h|0)>-1){p=a+4|0;q=a+8|0;r=a+16|0;s=a+20|0;t=a+24|0;u=a+28|0;v=a+12|0;e=-1;g=b;while(1){o=h;while(1){if((o|0)!=(e|0))break;g=g+32|0;h=c[g>>2]|0;if((h|0)>-1)o=h;else break b}n=d+(c[f+(c[a>>2]<<2)>>2]<<5)|0;while(1){h=n+8|0;if(!(c[h>>2]|0))break;else n=n+32|0}c[n+40>>2]=0;c[n>>2]=c[p>>2];c[n+4>>2]=c[q>>2];c[h>>2]=d+(c[f+(o<<2)>>2]<<5);c[n+12>>2]=o;h=c[s>>2]|0;m=c[t>>2]|0;e=(m|0)!=0;i=c[g+16>>2]|c[r>>2]|(h|0?4:0)|(e?8:0);j=n+20|0;c[j>>2]=i;k=c[u>>2]|0;l=n+24|0;if((k|0)>-1){c[l>>2]=k;c[j>>2]=i|256}else c[l>>2]=h;if(e){h=0;do{l=h;h=h+1|0}while((c[m+(l<<2)>>2]|0)!=0);h=k6(h<<2)|0;c[n+28>>2]=h;if(!h){g=12;break a}k=c[t>>2]|0;e=c[k>>2]|0;if(e){j=0;i=h;do{c[i>>2]=e;j=j+1|0;e=c[k+(j<<2)>>2]|0;i=h+(j<<2)|0}while((e|0)!=0);h=i}c[h>>2]=0}else c[n+28>>2]=0;e=c[v>>2]|0;if(!e)h=0;else{h=0;while(1)if((c[e+(h<<2)>>2]|0)>-1)h=h+1|0;else break}k=g+12|0;i=c[k>>2]|0;if(!i)e=0;else{e=0;while(1)if((c[i+(e<<2)>>2]|0)>-1)e=e+1|0;else break}j=n+16|0;i=c[j>>2]|0;if(i|0)l6(i);c[j>>2]=0;h=e+h|0;if((h|0)>0){n=k6((h<<2)+4|0)|0;c[j>>2]=n;if(!n){g=12;break a}i=c[v>>2]|0;if((i|0)!=0?(w=c[i>>2]|0,(w|0)>-1):0){h=0;e=w;do{c[n+(h<<2)>>2]=e;h=h+1|0;e=c[i+(h<<2)>>2]|0}while((e|0)>-1);m=h}else m=0;j=c[k>>2]|0;if((j|0)!=0?(x=c[j>>2]|0,(x|0)>-1):0){k=(m|0)>0;h=m;i=0;l=x;do{c:do if(k){e=0;while(1){if((c[n+(e<<2)>>2]|0)==(l|0))break c;e=e+1|0;if((e|0)>=(m|0)){y=40;break}}}else y=40;while(0);if((y|0)==40){y=0;c[n+(h<<2)>>2]=l;h=h+1|0}i=i+1|0;l=c[j+(i<<2)>>2]|0}while((l|0)>-1)}else h=m;c[n+(h<<2)>>2]=-1}g=g+32|0;h=c[g>>2]|0;if((h|0)<=-1)break;else e=o}}while(0);a=a+32|0;if((c[a>>2]|0)<=-1){g=0;break}}else g=0;while(0);return g|0}function j5(a){a=a|0;return c[a+12>>2]|0}function k5(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[f>>2]=b;c[e>>2]=c[f>>2];b=t5(a,e)|0;l=d;return b|0}function l5(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[f>>2]=b;c[e>>2]=c[f>>2];b=t5(a,e)|0;l=d;return b|0}function m5(a){a=a|0;var b=0,d=0;b=c[a+16>>2]|0;d=a+12|0;a=(c[d>>2]|0)+-1|0;c[d>>2]=a;return c[b+(a<<2)>>2]|0}function n5(a){a=a|0;var b=0,d=0;b=c[a+16>>2]|0;d=a+12|0;a=(c[d>>2]|0)+-1|0;c[d>>2]=a;return c[b+(a<<2)>>2]|0}function o5(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;a=s5(a,0,0,1,64)|0;if(!a)a=0;else{c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=e;c[a+20>>2]=f;c[a+24>>2]=g;c[a+28>>2]=h;c[a+32>>2]=-1;c[a+36>>2]=-1;c[a+40>>2]=-1}return a|0}function p5(a){a=a|0;a=s5(a,0,0,1,32)|0;if(!a)a=0;else{c[a>>2]=-1;c[a+4>>2]=-1;c[a+8>>2]=-1}return a|0}function q5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=(e|0)==0;if(o)n=0;else{g=0;while(1)if((c[e+(g<<2)>>2]|0)>-1)g=g+1|0;else{n=g;break}}h=0;while(1)if((c[b+(h<<5)>>2]|0)>-1)h=h+1|0;else{g=0;break}while(1)if((c[d+(g<<5)>>2]|0)>-1)g=g+1|0;else break;g=s5(a,0,0,1,(g+h<<5)+32|0)|0;a:do if(!g)g=0;else{h=c[b>>2]|0;if((h|0)>-1){m=(n|0)>0;i=0;while(1){c[g+(i<<5)>>2]=h;c[g+(i<<5)+4>>2]=c[b+(i<<5)+4>>2];c[g+(i<<5)+8>>2]=c[b+(i<<5)+8>>2];c[g+(i<<5)+16>>2]=c[b+(i<<5)+16>>2]|f;c[g+(i<<5)+20>>2]=c[b+(i<<5)+20>>2];c[g+(i<<5)+24>>2]=c[b+(i<<5)+24>>2];c[g+(i<<5)+28>>2]=c[b+(i<<5)+28>>2];l=b+(i<<5)+12|0;k=c[l>>2]|0;h=(k|0)==0;if(o&h)h=0;else{if(h)j=0;else{j=0;while(1)if((c[k+(j<<2)>>2]|0)>-1)j=j+1|0;else break}h=s5(a,0,0,0,(j+n<<2)+4|0)|0;if(!h){g=0;break a}if((j|0)>0){l=c[l>>2]|0;k=0;do{c[h+(k<<2)>>2]=c[l+(k<<2)>>2];k=k+1|0}while((k|0)!=(j|0))}else j=0;if(m){l=0;k=j;while(1){c[h+(k<<2)>>2]=c[e+(l<<2)>>2];k=l+1|0;if((k|0)==(n|0))break;else{l=k;k=k+j|0}}j=n+j|0}c[h+(j<<2)>>2]=-1}c[g+(i<<5)+12>>2]=h;i=i+1|0;h=c[b+(i<<5)>>2]|0;if((h|0)<=-1){n=i;break}}}else n=0;i=c[d>>2]|0;h=g+(n<<5)|0;if((i|0)>-1){m=0;l=n;do{c[h>>2]=i;c[g+(l<<5)+4>>2]=c[d+(m<<5)+4>>2];c[g+(l<<5)+8>>2]=c[d+(m<<5)+8>>2];c[g+(l<<5)+16>>2]=c[d+(m<<5)+16>>2];c[g+(l<<5)+20>>2]=c[d+(m<<5)+20>>2];c[g+(l<<5)+24>>2]=c[d+(m<<5)+24>>2];c[g+(l<<5)+28>>2]=c[d+(m<<5)+28>>2];k=d+(m<<5)+12|0;h=c[k>>2]|0;if(!h)h=0;else{i=0;while(1){j=i+1|0;if((c[h+(i<<2)>>2]|0)>-1)i=j;else break}h=s5(a,0,0,0,j<<2)|0;if(!h){g=0;break a}if((i|0)>0){k=c[k>>2]|0;j=0;do{c[h+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}else i=0;c[h+(i<<2)>>2]=-1}c[g+(l<<5)+12>>2]=h;m=m+1|0;i=c[d+(m<<5)>>2]|0;l=m+n|0;h=g+(l<<5)|0}while((i|0)>-1)}c[h>>2]=-1}while(0);return g|0}function r5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=j5(a)|0;p=(f|0)!=0;if(p)c[f>>2]=0;b=k5(a,b)|0;a:do if(!b){m=(d|0)==0;l=(e|0)==0;if((j5(a)|0)>(o|0))while(1){b=n5(a)|0;b:do switch(c[b>>2]|0){case 0:{b=c[b+4>>2]|0;switch(c[b>>2]|0){case -3:break;case -2:{if(l)break b;c[e>>2]=c[e>>2]|c[b+4>>2];break b}default:break b}h=c[b+4>>2]|0;if((h|0)>-1){c:do if(!m){b=0;while(1){i=d+(b<<2)|0;j=c[i>>2]|0;if((j|0)<=-1)break;if((j|0)==(h|0))break c;else b=b+1|0}c[i>>2]=h;c[d+(b+1<<2)>>2]=-1}while(0);if(p)c[f>>2]=(c[f>>2]|0)+1}break}case 3:{b=c[b+4>>2]|0;h=c[b>>2]|0;if(c[h+8>>2]|0){k=h;n=6;break b}b=c[b+4>>2]|0;if(c[b+8>>2]|0){k=b;n=6}break}case 1:{b=c[b+4>>2]|0;h=k5(a,c[b>>2]|0)|0;if(h|0){g=h;break a}k=c[b+4>>2]|0;n=6;break}case 2:{b=c[c[b+4>>2]>>2]|0;if(c[b+8>>2]|0){k=b;n=6}break}default:{}}while(0);if((n|0)==6?(n=0,g=k5(a,k)|0,g|0):0)break a;if((j5(a)|0)<=(o|0)){g=0;break a}}else g=0}else g=b;while(0);return g|0}function s5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;h=a+16|0;a:do if(!(c[h>>2]|0)){j=a+12|0;g=c[j>>2]|0;if(g>>>0>>0){do if(b)if(!d){c[h>>2]=1;d=0;break a}else{b=a+8|0;c[b>>2]=d;g=1024;break}else{g=f<<3;g=g>>>0>1024?g:1024;i=k6(8)|0;if(!i){c[h>>2]=1;d=0;break a}d=k6(g)|0;c[i>>2]=d;if(!d){l6(i);c[h>>2]=1;d=0;break a}c[i+4>>2]=0;b=a+4|0;h=c[b>>2]|0;if(h|0)c[h+4>>2]=i;if(!(c[a>>2]|0))c[a>>2]=i;c[b>>2]=i;b=a+8|0;c[b>>2]=d}while(0);c[j>>2]=g;h=b}else{d=a+8|0;h=d;d=c[d>>2]|0}b=d+f&3;b=((b|0)==0?0:4-b|0)+f|0;c[h>>2]=d+b;c[j>>2]=g-b;if(e)u6(d|0,0,b|0)|0}else d=0;while(0);return d|0}function t5(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;g=k;d=a+12|0;e=c[d>>2]|0;j=c[a>>2]|0;if((e|0)>=(j|0)){d=c[a+4>>2]|0;if((j|0)<(d|0)?(f=(c[a+8>>2]|0)+j|0,f=(f|0)>(d|0)?d:f,h=a+16|0,i=n6(c[h>>2]|0,f<<2)|0,(i|0)!=0):0){c[a>>2]=f;c[h>>2]=i;c[g>>2]=c[b>>2];t5(a,g)|0;d=0}else d=12}else{c[(c[a+16>>2]|0)+(e<<2)>>2]=c[b>>2];c[d>>2]=(c[d>>2]|0)+1;d=0}l=k;return d|0}function u5(a,b,d){a=a|0;b=b|0;d=d|0;a=s5(a,0,0,1,32)|0;if((d|0)!=0&(a|0)!=0){c[a+4>>2]=d;c[a>>2]=b;c[a+8>>2]=-1;c[a+12>>2]=-1}else a=0;return a|0}function v5(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=j5(d)|0;k5(d,e)|0;e=l5(d,0)|0;a:do if(!e){r=(f&1|0)==0;q=(f&2|0)!=0;o=0;p=1;e=i;while(1){if((j5(d)|0)>(s|0))n=e;else{f=o;e=0;break a}b:while(1){c:while(1){switch(m5(d)|0){case 1:{i=7;break c}case 0:{e=n5(d)|0;switch(c[e>>2]|0){case 0:{i=9;break b}case 3:{i=19;break b}case 1:{i=26;break b}case 2:{i=33;break c}default:{}}break}default:{}}if((j5(d)|0)<=(s|0)){f=o;e=0;break a}}if((i|0)==7)e=n5(d)|0;else if((i|0)==33){f=c[e+4>>2]|0;e=k5(d,c[f>>2]|0)|0;if(e|0){f=o;break a}e=l5(d,0)|0;if(e|0){f=o;break a}e=w5(b,c[f>>2]|0,c[f+4>>2]|0,c[f+8>>2]|0,a[f+12>>0]&1)|0;c[n>>2]=e;if(!e){f=o;e=12;break a}e=c[e+4>>2]|0}if((j5(d)|0)>(s|0))n=e;else{f=o;e=0;break a}}if((i|0)==9){m=c[e+4>>2]|0;k=c[m+8>>2]|0;i=c[m>>2]|0;e=c[m+4>>2]|0;if(!((i|0)>-1|(i|0)==-4)){f=(i|0)==-3;if(r|f^1)if(f)if(q&(p|0)!=0){c[h+(e<<2)>>2]=1;i=-3;l=k;f=o;k=0}else{i=-3;l=k;f=o;k=p}else{l=k;f=o;k=p}else{e=-1;i=-1;l=-1;f=o;k=p}}else{l=(c[g>>2]|0)+k|0;f=o+1|0;k=p}e=c5(b,i,e,l)|0;c[n>>2]=e;if(!e)e=12;else{e=c[e+4>>2]|0;c[e+12>>2]=c[m+12>>2];c[e+16>>2]=c[m+16>>2];e=0}if((l|0)>(c[j>>2]|0)){c[j>>2]=l;l=f;f=n}else{l=f;f=n}}else if((i|0)==19){i=c[e+4>>2]|0;f=i+4|0;e=x5(b,c[i>>2]|0,c[f>>2]|0)|0;c[n>>2]=e;if(!e){f=o;e=12;break a}m=c[e+4>>2]|0;e=k5(d,c[f>>2]|0)|0;if(e|0){f=o;break a}e=l5(d,0)|0;if(e|0){f=o;break a}e=k5(d,m+4|0)|0;if(e|0){f=o;break a}e=l5(d,1)|0;if(e|0){f=o;break a}e=k5(d,c[i>>2]|0)|0;if(e|0){f=o;break a}l=o;k=p;f=m;e=l5(d,0)|0}else if((i|0)==26){l=c[e+4>>2]|0;i=l+4|0;e=d5(b,c[l>>2]|0,c[i>>2]|0)|0;c[n>>2]=e;if(!e){f=o;e=12;break a}f=c[e+4>>2]|0;c[f>>2]=0;k=f+4|0;c[k>>2]=0;e=k5(d,c[i>>2]|0)|0;if(e|0){f=o;break a}e=l5(d,0)|0;if(e|0){f=o;break a}e=k5(d,k)|0;if(e|0){f=o;break a}e=l5(d,1)|0;if(e|0){f=o;break a}e=k5(d,c[l>>2]|0)|0;if(e|0){f=o;break a}l=o;k=p;e=l5(d,0)|0}if(!e){o=l;p=k;e=f}else{f=l;break}}}else f=0;while(0);c[g>>2]=(c[g>>2]|0)+f;return e|0}function w5(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=s5(b,0,0,1,16)|0;b=u5(b,2,h)|0;if(!b)b=0;else{c[h>>2]=d;c[h+4>>2]=e;c[h+8>>2]=f;h=h+12|0;a[h>>0]=a[h>>0]&-2|g&1;c[b+16>>2]=c[d+16>>2]}return b|0}function x5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if(b){e=s5(a,0,0,1,8)|0;a=u5(a,3,e)|0;if((d|0)!=0&(a|0)!=0){c[e>>2]=b;c[e+4>>2]=d;c[a+16>>2]=(c[d+16>>2]|0)+(c[b+16>>2]|0);d=a}else d=0}return d|0}function y5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=s5(a,0,0,0,8)|0;if(((e|0)!=0?(d=c5(a,-3,d,-1)|0,c[e>>2]=d,(d|0)!=0):0)?(f=s5(a,0,0,0,32)|0,c[e+4>>2]=f,(f|0)!=0):0){a=b+4|0;c[f+4>>2]=c[a>>2];c[f>>2]=c[b>>2];c[f+8>>2]=-1;c[f+12>>2]=-1;f=f+16|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[a>>2]=e;c[b>>2]=1;a=0}else a=12;return a|0}function z5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a>>2]|0;if((f|0)>-1){g=c[b+16>>2]|0;e=0;b=f;do{f=b>>>1;c[((b&1|0)==0?g+(f*12|0)|0:g+(f*12|0)+4|0)>>2]=d;e=e+1|0;b=c[a+(e<<2)>>2]|0}while((b|0)>-1)}c[a>>2]=-1;return}function A5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=s5(a,0,0,0,8)|0;if(((e|0)!=0?(d=c5(a,-3,d,-1)|0,c[e+4>>2]=d,(d|0)!=0):0)?(f=s5(a,0,0,0,32)|0,c[e>>2]=f,(f|0)!=0):0){a=b+4|0;c[f+4>>2]=c[a>>2];c[f>>2]=c[b>>2];c[f+8>>2]=-1;c[f+12>>2]=-1;f=f+16|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[a>>2]=e;c[b>>2]=1;a=0}else a=12;return a|0}function B5(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;j=m;i=b+32|0;h=c[i>>2]|0;g=h&1;a:do switch(a[d>>0]|0){case 91:{e=F5(b,d+1|0)|0;break}case 92:{e=d+1|0;f=G5(e)|0;if(f|0){e=B5(b,f)|0;c[b+12>>2]=d+2;break a}f=a[e>>0]|0;switch(f|0){case 0:{e=5;break a}case 98:{f=c5(c[b>>2]|0,-2,64,-1)|0;break}case 66:{f=c5(c[b>>2]|0,-2,128,-1)|0;break}case 60:{f=c5(c[b>>2]|0,-2,16,-1)|0;break}case 62:{f=c5(c[b>>2]|0,-2,32,-1)|0;break}case 120:{h=d+2|0;i=(a[h>>0]|0)==123;g=i?8:2;h=i?d+3|0:h;e=0;f=0;do{d=H5(a[h+e>>0]|0)|0;if((d|0)<0)break;f=d+(f<<4)|0;e=e+1|0}while((f|0)<1114112&(e|0)<(g|0));e=h+e|0;if(i){if((a[e>>0]|0)!=125){e=9;break a}e=e+1|0}j=c[b>>2]|0;i=b+24|0;k=c[i>>2]|0;c[i>>2]=k+1;f=c5(j,f,f,k)|0;e=e+-1|0;break}case 63:case 43:case 123:if(!g){e=13;break a}else{k=37;break a}case 124:{if(g|0){k=37;break a}e=c5(c[b>>2]|0,-1,-1,-1)|0;k=45;break a}default:{if(!((g|0)==0&(f+-49|0)>>>0<9)){k=37;break a}j=f+-48|0;k=c[b>>2]|0;i=b+24|0;f=c[i>>2]|0;c[i>>2]=f+1;f=c5(k,-4,j,f)|0;k=b+28|0;i=c[k>>2]|0;c[k>>2]=(j|0)<(i|0)?i:j}}d=e+1|0;e=f;k=45;break}case 46:{g=b+24|0;e=c[g>>2]|0;c[g>>2]=e+1;f=c[b>>2]|0;if(h&4){f=c5(f,0,9,e)|0;k=c[b>>2]|0;e=c[g>>2]|0;c[g>>2]=e+1;e=c5(k,11,1114111,e)|0;if((f|0)!=0&(e|0)!=0)e=x5(c[b>>2]|0,f,e)|0;else e=0}else e=c5(f,0,1114111,e)|0;d=d+1|0;k=45;break}case 94:{if((g|0)==0?(c[b+16>>2]|0)!=(d|0):0){e=d;k=37;break a}d=d+1|0;e=c5(c[b>>2]|0,-2,1,-1)|0;k=45;break}case 36:{e=d+1|0;if((g|0)==0?a[e>>0]|0:0){e=d;k=37;break a}d=e;e=c5(c[b>>2]|0,-2,2,-1)|0;k=45;break}case 63:case 43:case 123:case 42:{if(!g){e=d;k=37}else e=13;break}case 124:{if(!g){e=d;k=37}else k=36;break}case 0:{k=36;break}default:{e=d;k=37}}while(0);if((k|0)==36){e=c5(c[b>>2]|0,-1,-1,-1)|0;k=45}else if((k|0)==37){h=c4(j,e,-1)|0;if((h|0)<0)e=2;else{do if(c[i>>2]&2){if((a3(c[j>>2]|0)|0)==0?(Y2(c[j>>2]|0)|0)==0:0){k=43;break}i=c[b>>2]|0;n=g3(c[j>>2]|0)|0;g=g3(c[j>>2]|0)|0;f=b+24|0;g=c5(i,n,g,c[f>>2]|0)|0;n=c[b>>2]|0;i=c3(c[j>>2]|0)|0;d=c3(c[j>>2]|0)|0;d=c5(n,i,d,c[f>>2]|0)|0;if((g|0)!=0&(d|0)!=0)g=x5(c[b>>2]|0,g,d)|0;else g=0}else k=43;while(0);if((k|0)==43){g=c[j>>2]|0;f=b+24|0;g=c5(c[b>>2]|0,g,g,c[f>>2]|0)|0}c[f>>2]=(c[f>>2]|0)+1;d=e+h|0;e=g;k=45}}if((k|0)==45)if(!e)e=12;else{c[b+8>>2]=e;c[b+12>>2]=d;e=0}l=m;return e|0}function C5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j+4|0;g=j;b=E5(b,i)|0;if((a[b>>0]|0)==44){b=E5(b+1|0,g)|0;h=c[g>>2]|0;g=c[i>>2]|0}else{i=c[i>>2]|0;c[g>>2]=i;h=i;g=i}do if(!(g>>>0>255|((h|0)>255|(h|0)>-1&(h|0)<(g|0)))){if(!d)if((a[b>>0]|0)==92)b=b+1|0;else{b=0;break}if((a[b>>0]|0)==125){c[e>>2]=g;c[f>>2]=h;b=b+1|0}else b=0}else b=0;while(0);l=j;return b|0}function D5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((c[b+12>>2]|0)>-1){e=c5(c[a>>2]|0,-1,-1,-1)|0;if((e|0)!=0?(f=d5(c[a>>2]|0,e,b)|0,(f|0)!=0):0){e=c[b+16>>2]|0;c[f+16>>2]=e;g=6}else e=12}else{f=b;e=c[b+16>>2]|0;g=6}if((g|0)==6){c[f+12>>2]=d;c[f+16>>2]=e+1;c[a+8>>2]=f;e=0}return e|0}function E5(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;c[d>>2]=-1;if(((a[b>>0]|0)+-48|0)>>>0<10){c[d>>2]=0;e=b;g=0;f=a[b>>0]|0;while(1){g=(g*10|0)+-48+(f<<24>>24)|0;c[d>>2]=g;b=e+1|0;f=a[b>>0]|0;if((g|0)>255|((f<<24>>24)+-48|0)>>>0>9)break;else e=b}}return b|0}function F5(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+288|0;e=s+264|0;g=s;c[e>>2]=c[b>>2];h=e+8|0;c[h>>2]=0;c[e+12>>2]=32;p=k6(128)|0;r=e+4|0;c[r>>2]=p;if(!p)d=12;else{f=g+4|0;c[f>>2]=0;p=(a[d>>0]|0)==94;c[g>>2]=p&1;d=I5(b,p?d+1|0:d,e,g)|0;a:do if(!d){p=(c[g>>2]|0)==0;if(!p){k3(c[r>>2]|0,c[h>>2]|0,4,111);d=K5(e)|0;if(!d){d=12;e=0;break}c[d>>2]=1114112;c[d+4>>2]=1114112;c[d+8>>2]=-1;d=c[f>>2]|0;if(d){e=d<<2;f=s5(c[b>>2]|0,0,0,0,e+4|0)|0;if(!f){d=12;e=0;break}B6(f|0,g+8|0,e|0)|0;c[f+(d<<2)>>2]=0}else f=0}else f=0;m=c[h>>2]|0;if((m|0)>0){n=c[r>>2]|0;o=b+24|0;e=0;d=0;k=0;while(1){i=c[n+(k<<2)>>2]|0;g=c[i>>2]|0;h=i+4|0;do if(!p){j=(c[h>>2]|0)+1|0;if((g|0)>(d|0)){c[i>>2]=d;c[h>>2]=g+-1;d=j;q=14;break}else{d=(j|0)>=(d|0)?j:d;break}}else q=14;while(0);if((q|0)==14){q=0;c[i+8>>2]=c[o>>2];c[i+16>>2]=f;j=u5(c[b>>2]|0,0,i)|0;e=x5(c[b>>2]|0,e,j)|0;if(!e){d=12;e=0;break a}}k=k+1|0;if((k|0)>=(m|0)){d=0;break}}}else{d=0;e=0}}else e=0;while(0);l6(c[r>>2]|0);r=b+24|0;c[r>>2]=(c[r>>2]|0)+1;c[b+8>>2]=e}l=s;return d|0}function G5(b){b=b|0;var d=0;d=a[b>>0]|0;b=0;while(1){if((a[64024+(b<<3)>>0]|0)==d<<24>>24)break;b=b+1|0;if((b|0)==12){b=12;break}}return c[64024+(b<<3)+4>>2]|0}function H5(a){a=a|0;var b=0;b=a+-48|0;if(b>>>0<10)return b|0;else{b=a|32;return ((b+-97|0)>>>0<6?b+-87|0:-1)|0}return 0}function I5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+32|0;o=t;q=t+4|0;i=c4(o,d,-1)|0;g=a[d>>0]|0;a:do if((i|0)>=1){r=f+4|0;n=b+32|0;h=d;j=i;b:while(1){i=(h|0)==(d|0);if(!(i|g<<24>>24!=93)){s=5;break}c:do if(!(i|g<<24>>24!=45)){switch(a[h+1>>0]|0){case 93:break c;case 45:break;default:{g=11;break a}}if((a[h+2>>0]|0)==93){g=11;break a}}while(0);d:do if(g<<24>>24==91){switch(a[h+1>>0]|0){case 61:case 46:{g=3;break a}case 58:break;default:{s=17;break d}}i=h+2|0;g=0;e:while(1){switch(a[i+g>>0]|0){case 0:{s=16;break b}case 58:break e;default:{}}g=g+1|0;if((g|0)>=14){s=16;break b}}B6(q|0,i|0,g|0)|0;a[q+g>>0]=0;j=h3(q)|0;if(!j){s=16;break b}h=i+(g+2)|0;if((a[i+(g+1)>>0]|0)!=93){s=16;break b}if(!(c[f>>2]|0)){g=1114111;m=0;k=1;s=25}else{g=c[r>>2]|0;if((g|0)>63){g=12;break a}c[r>>2]=g+1;c[f+8+(g<<2)>>2]=j}}else s=17;while(0);if((s|0)==17){s=0;i=c[o>>2]|0;h=h+j|0;if((a[h>>0]|0)==45?(p=h+1|0,(a[p>>0]|0)!=93):0){h=c4(o,p,-1)|0;g=c[o>>2]|0;if((h|0)<1|(i|0)>(g|0)){g=11;break a}j=0;m=i;h=p+h|0;k=0;s=25}else{j=0;g=i;m=i;k=0;s=25}}if((s|0)==25){s=0;i=K5(e)|0;if(!i){g=12;break a}c[i>>2]=m;c[i+4>>2]=g;c[i+12>>2]=j;c[i+8>>2]=-1;if(!(k|(c[n>>2]&2|0)==0)?(L5(e,m,g)|0)!=0:0){g=12;break a}}j=c4(o,h,-1)|0;g=a[h>>0]|0;if((j|0)<1){s=3;break a}}if((s|0)==5){c[b+12>>2]=h+1;g=0;break}else if((s|0)==16){g=4;break}}else s=3;while(0);if((s|0)==3)g=g<<24>>24?2:7;l=t;return g|0}function J5(a,b){a=a|0;b=b|0;return (c[c[a>>2]>>2]|0)-(c[c[b>>2]>>2]|0)|0}function K5(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;h=a+8|0;d=c[h>>2]|0;e=a+12|0;f=c[e>>2]|0;if((d|0)>=(f|0))if((f|0)<=32767?(c[e>>2]=f<<1,g=a+4|0,b=n6(c[g>>2]|0,f<<3)|0,(b|0)!=0):0){c[g>>2]=b;d=c[h>>2]|0;i=6}else b=0;else{b=c[a+4>>2]|0;i=6}if((i|0)==6){c[h>>2]=d+1;i=s5(c[a>>2]|0,0,0,1,20)|0;c[b+(d<<2)>>2]=i;b=i}return b|0}function L5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a:do if((b|0)>(d|0))b=0;else while(1){b:do if(!(Y2(b)|0)){if(!(a3(b)|0)){b=b+1|0;break}f=c3(b)|0;e=f;while(1){g=b+1|0;e=e+1|0;if((b|0)>=(d|0)){h=f;b=g;g=12;break b}if((c3(g)|0)==(e|0))b=g;else{h=f;b=g;g=12;break}}}else{f=g3(b)|0;e=f;while(1){g=b+1|0;e=e+1|0;if((b|0)>=(d|0)){h=f;b=g;g=12;break b}if((g3(g)|0)==(e|0))b=g;else{h=f;b=g;g=12;break}}}while(0);if((g|0)==12){g=0;f=K5(a)|0;if(!f){b=-1;break a}c[f>>2]=h;c[f+4>>2]=e+-1;c[f+8>>2]=-1}if((b|0)>(d|0)){b=0;break}}while(0);return b|0}function M5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;k=n;i=c[a+4>>2]|0;j=i+56|0;h=(c[j>>2]&8|0)==0?d:0;a=c[i+40>>2]|0;if((a|0)>0&(h|0)!=0){a=k6(a<<2)|0;if(!a)a=12;else{g=a;d=a;m=3}}else{g=0;d=0;m=3}if((m|0)==3){if(!(c[i+60>>2]|0))a=O5(i,b,g,f,k)|0;else a=N5(i,b,g,f,k)|0;if(!a)P5(h,e,c[j>>2]|0,i,g,c[k>>2]|0);if(g)l6(d)}l=n;return a|0}function N5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;W=l;l=l+16|0;U=W;c[U>>2]=0;o=e&1;S=e&2;T=a+56|0;n=c[T>>2]&4;V=Z4(0,0)|0;a:do if(V){p=s5(V,0,0,0,32)|0;if(!p){g5(V);e=12;break}c[p+24>>2]=0;c[p+28>>2]=0;R=a+40|0;q=c[R>>2]|0;if(q){e=k6(q<<2)|0;if(!e){m=0;k=0;j=e;e=12;i=0;h=0;g=0}else{j=e;i=e;C=6}}else{j=0;i=0;C=6}b:do if((C|0)==6){e=c[a+28>>2]|0;if(e){e=k6(e<<3)|0;if(!e){m=e;k=0;e=12;h=0;g=0;break}else{m=e;h=e}}else{m=0;h=0}Q=a+52|0;e=c[Q>>2]|0;if(e){e=k6(e<<2)|0;if(!e){k=e;e=12;g=0;break}else{k=e;g=e}}else{k=0;g=0}M=a+8|0;N=a+12|0;O=(d|0)!=0;P=a+32|0;J=(n|0)!=0;K=(d|0)==0;L=(o|0)==0;I=(o|0)==0;s=b;e=1;r=-1;v=-1;n=q;B=0;c:while(1){if((n|0)>0){o=0;do{c[j+(o<<2)>>2]=-1;if(!K){c[d+(o<<2)>>2]=-1;n=c[R>>2]|0}o=o+1|0}while((o|0)<(n|0))}n=c[Q>>2]|0;if((n|0)>0)u6(g|0,0,n<<2|0)|0;G=e+r|0;e=c4(U,s,4)|0;if((e|0)<1)if((e|0)<0){e=1;break b}else e=1;F=s+e|0;H=c[U>>2]|0;n=c[M>>2]|0;o=n+8|0;if(c[o>>2]|0){w=(G|0)!=0;x=(B|0)==95;y=(G|0)==0;A=J&(B|0)==10;z=(G|0)<1&I;u=n;n=0;t=0;s=o;while(1){r=u+20|0;o=c[r>>2]|0;d:do if(o)if((o&1|0)==0|z|A){if(o&2|0?(E=c[U>>2]|0,!((E|S|0)==0|J&(E|0)==10)):0){q=t;break}do if(o&16|0){if(x){q=t;break d}if(R2(B)|0){q=t;break d}o=c[U>>2]|0;if((o|0)==95)break;if(!(R2(o)|0)){q=t;break d}}while(0);o=c[r>>2]|0;if(o&32){if(x){o=c[U>>2]|0;if((o|0)==95){q=t;break}}else{E=(R2(B)|0)==0;o=c[U>>2]|0;if(E|(o|0)==95){q=t;break}}if(R2(o)|0){q=t;break}o=c[r>>2]|0}q=c[U>>2]|0;do if((q|0)!=0&(w&(o&64|0)!=0)){if(x){o=q;q=1}else{q=(R2(B)|0)!=0;o=c[U>>2]|0}if((o|0)==95)if(q){q=t;break d}else break;else if(q^(R2(o)|0)!=0)break;else{q=t;break d}}while(0);if(!(c[r>>2]&128)){C=49;break}o=c[U>>2]|0;if(y|(o|0)==0){q=t;break}if(x)q=1;else{q=(R2(B)|0)!=0;o=c[U>>2]|0}if((o|0)==95)if(q){C=49;break}else{q=t;break}else if(q^(R2(o)|0)!=0){q=t;break}else{C=49;break}}else q=t;else C=49;while(0);do if((C|0)==49){C=0;if(!t){n=c[u+16>>2]|0;q=c[s>>2]|0;break}q=p+28|0;o=c[q>>2]|0;if(!o){o=s5(V,0,0,0,32)|0;if(!o){C=53;break c}c[o+24>>2]=p;c[o+28>>2]=0;E=s5(V,0,0,0,c[R>>2]<<2)|0;c[o+20>>2]=E;if(!E){C=60;break c}c[q>>2]=o;p=o}else p=o;c[p>>2]=G;c[p+4>>2]=F;c[p+8>>2]=c[s>>2];c[p+12>>2]=c[u+12>>2];c[p+16>>2]=c[U>>2];if((c[R>>2]|0)>0){q=c[p+20>>2]|0;o=0;do{c[q+(o<<2)>>2]=c[j+(o<<2)>>2];o=o+1|0}while((o|0)<(c[R>>2]|0))}o=c[u+16>>2]|0;if(!o)q=t;else{q=c[o>>2]|0;if((q|0)<=-1){q=t;break}r=c[p+20>>2]|0;do{o=o+4|0;c[r+(q<<2)>>2]=G;q=c[o>>2]|0}while((q|0)>-1);q=t}}while(0);s=u+40|0;if(!(c[s>>2]|0))break;else{u=u+32|0;t=q}}if(n){o=c[n>>2]|0;if((o|0)>-1)do{c[j+(o<<2)>>2]=G;n=n+4|0;o=c[n>>2]|0}while((o|0)>-1)}else n=0;if(!q)C=170;else{s=G;r=F;w=q;x=n;C=79}}else{n=0;C=170}e:while(1){if((C|0)==79){if((w|0)==(c[N>>2]|0)){if((v|0)>=(s|0)){if(!(O&(v|0)==(s|0))){n=x;C=170;continue}if(!(R5(c[R>>2]|0,c[P>>2]|0,j,d)|0)){n=x;C=170;continue}}if(!O){v=s;n=x;C=170;continue}if((c[R>>2]|0)>0)n=0;else{v=s;n=x;C=170;continue}while(1){c[d+(n<<2)>>2]=c[j+(n<<2)>>2];n=n+1|0;if((n|0)>=(c[R>>2]|0)){v=s;n=x;C=170;continue e}}}u=w+8|0;if((c[u>>2]|0)!=0?(c[w+20>>2]&256|0)!=0:0){o=c[w+24>>2]|0;P5(o+1|0,m,c[T>>2]&-9,a,j,s);E=c[m+(o<<3)>>2]|0;o=(c[m+(o<<3)+4>>2]|0)-E|0;if(h2(b+E|0,r+-1|0,o)|0){n=x;C=170;continue}E=(o|0)==0;n=E&1;q=k+(c[w+12>>2]<<2)|0;if(E?c[q>>2]|0:0){n=x;C=170;continue}c[q>>2]=n;o=o+-1|0;r=r+o|0;o=o+s|0;q=c[U>>2]|0;n=c4(U,r,4)|0;if((n|0)<1)if((n|0)<0){e=1;break b}else n=1;D=r+n|0;E=n}else{q=c[U>>2]|0;if(!q){n=x;C=170;continue}n=c4(U,r,4)|0;if((n|0)<1)if((n|0)<0){e=1;break b}else n=1;o=s;D=r+n|0;E=n}s=o+e|0;if(!(c[u>>2]|0)){e=E;n=x;C=170;continue}y=(s|0)!=0;z=(q|0)==95;A=(s|0)==0;C=J&(q|0)==10;B=(s|0)<1&L;t=0;n=x;while(1){f:do if((c[w>>2]|0)>>>0<=q>>>0){if((c[w+4>>2]|0)>>>0>>0)break;r=w+20|0;e=c[r>>2]|0;do if(e|0){if(!((e&1|0)==0|B|C))break f;if(e&2|0?(x=c[U>>2]|0,!((x|S|0)==0|J&(x|0)==10)):0)break f;do if(e&16|0){if(z)break f;if(R2(q)|0)break f;e=c[U>>2]|0;if((e|0)==95)break;if(!(R2(e)|0))break f}while(0);e=c[r>>2]|0;if(e&32){if(z){e=c[U>>2]|0;if((e|0)==95)break f}else{x=(R2(q)|0)==0;e=c[U>>2]|0;if(x|(e|0)==95)break f}if(R2(e)|0)break f;e=c[r>>2]|0}o=c[U>>2]|0;do if((o|0)!=0&(y&(e&64|0)!=0)){if(z)e=1;else{e=(R2(q)|0)!=0;o=c[U>>2]|0}if((o|0)==95)if(e)break f;else break;else if(e^(R2(o)|0)!=0)break;else break f}while(0);do if(c[r>>2]&128|0){e=c[U>>2]|0;if(A|(e|0)==0)break f;if(z)o=1;else{o=(R2(q)|0)!=0;e=c[U>>2]|0}if((e|0)==95)if(o)break;else break f;else if(o^(R2(e)|0)!=0)break f;else break}while(0);e=c[r>>2]|0;do if(e&4){if(c[T>>2]&2|0)break;if(!(W2(q,c[w+24>>2]|0)|0))break f;e=c[r>>2]|0}while(0);do if(e&4|0){if(!(c[T>>2]&2))break;x=c3(q)|0;e=w+24|0;if(W2(x,c[e>>2]|0)|0)break;x=g3(q)|0;if(!(W2(x,c[e>>2]|0)|0))break f}while(0);if(!(c[r>>2]&8))break;if(Q5(c[w+28>>2]|0,q,c[T>>2]&2)|0)break f}while(0);if(!t){t=c[u>>2]|0;n=c[w+16>>2]|0;break}o=p+28|0;e=c[o>>2]|0;if(!e){e=s5(V,0,0,0,32)|0;if(!e){C=144;break c}c[e+24>>2]=p;c[e+28>>2]=0;x=s5(V,0,0,0,c[R>>2]<<2)|0;c[e+20>>2]=x;if(!x){C=151;break c}c[o>>2]=e;p=e}else p=e;c[p>>2]=s;c[p+4>>2]=D;c[p+8>>2]=c[u>>2];c[p+12>>2]=c[w+12>>2];c[p+16>>2]=c[U>>2];if((c[R>>2]|0)>0){o=c[p+20>>2]|0;e=0;do{c[o+(e<<2)>>2]=c[j+(e<<2)>>2];e=e+1|0}while((e|0)<(c[R>>2]|0))}e=c[w+16>>2]|0;if(!e)break;o=c[e>>2]|0;if((o|0)<=-1)break;r=c[p+20>>2]|0;do{c[r+(o<<2)>>2]=s;e=e+4|0;o=c[e>>2]|0}while((o|0)>-1)}while(0);u=w+40|0;if(!(c[u>>2]|0))break;else w=w+32|0}if(!t){e=E;C=170;continue}if(n){e=c[n>>2]|0;if((e|0)>-1){do{n=n+4|0;c[j+(e<<2)>>2]=s;e=c[n>>2]|0}while((e|0)>-1);q=v;o=D;e=E}else{q=v;o=D;e=E}}else{q=v;o=D;e=E;n=0}}else if((C|0)==170){C=0;r=c[p+24>>2]|0;if(!r)break;t=c[p+8>>2]|0;if(c[t+20>>2]&256|0)c[k+(c[p+12>>2]<<2)>>2]=0;s=c[p>>2]|0;u=c[p+4>>2]|0;c[U>>2]=c[p+16>>2];q=c[R>>2]|0;if((q|0)>0){p=c[p+20>>2]|0;o=0;do{c[j+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)<(q|0));p=r;q=v;o=u}else{p=r;q=v;o=u}}r=o;v=q;w=t;x=n;C=79}n=(v|0)>-1;if(n|(c[U>>2]|0)==0){C=179;break}c[U>>2]=H;s=F;r=G;n=c[R>>2]|0;B=H}if((C|0)==53){g5(V);if(j|0)l6(i);if(m|0)l6(h);if(!k){e=12;break a}l6(g);e=12;break a}else if((C|0)==60){g5(V);if(j|0)l6(i);if(m|0)l6(h);if(!k){e=12;break a}l6(g);e=12;break a}else if((C|0)==144){g5(V);if(j|0)l6(i);if(m|0)l6(h);if(!k){e=12;break a}l6(g);e=12;break a}else if((C|0)==151){g5(V);if(j|0)l6(i);if(m|0)l6(h);if(!k){e=12;break a}l6(g);e=12;break a}else if((C|0)==179){c[f>>2]=v;e=(n^1)&1;break}}while(0);g5(V);if(j|0)l6(i);if(m|0)l6(h);if(k)l6(g)}else e=12;while(0);l=W;return e|0}function O5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0;X=l;l=l+16|0;U=X;c[U>>2]=0;k=e&1;Q=e&2;R=a+56|0;j=c[R>>2]&4;if(!d)O=0;else O=c[a+40>>2]|0;P=O<<2;i=c[a+52>>2]|0;h=i<<3;g=h+8|0;e=P+12+h+(g+(S(P,i)|0)<<1)|0;V=k6(e)|0;if(!V)e=12;else{u6(V|0,0,e|0)|0;e=V+P|0;m=e&3;m=e+((m|0)==0?0:4-m|0)|0;e=m+g|0;n=e&3;n=e+((n|0)==0?0:4-n|0)|0;e=n+g|0;N=e&3;N=e+((N|0)==0?0:4-N|0)|0;e=N+h|0;g=e&3;h=(i|0)>0;if(h){e=e+((g|0)==0?0:4-g|0)|0;g=0;while(1){c[n+(g<<3)+4>>2]=e;e=e+P|0;c[m+(g<<3)+4>>2]=e;g=g+1|0;if((g|0)>=(i|0))break;else e=e+P|0}if(h){e=0;do{c[N+(e<<3)>>2]=-1;e=e+1|0}while((e|0)<(i|0))}}e=c4(U,b,4)|0;if((e|0)<1)if((e|0)<0)e=1;else{i=1;W=11}else{i=e;W=11}a:do if((W|0)==11){M=a+8|0;H=(j|0)!=0;I=(O|0)>0;J=a+12|0;K=a+44|0;L=a+32|0;E=a+36|0;F=(O|0)==0;G=(k|0)==0;D=(O|0)<1;C=(k|0)==0;h=0;v=b+i|0;u=0;j=0;e=-1;g=m;A=V;x=m;w=n;while(1){if((e|0)<0){k=c[M>>2]|0;a=k+8|0;b:do if(c[a>>2]|0){p=(u|0)!=0;q=(h|0)==95;r=(u|0)==0;t=H&(h|0)==10;s=(u|0)<1&G;while(1){c:while(1){o=k+12|0;if((c[N+(c[o>>2]<<3)>>2]|0)>=(u|0))break;n=k+20|0;b=c[n>>2]|0;if(!b){W=46;break}d:do if((b&1|0)==0|s|t){if(b&2|0?(B=c[U>>2]|0,!((B|Q|0)==0|H&(B|0)==10)):0)break;do if(b&16|0){if(q)break d;if(R2(h)|0)break d;b=c[U>>2]|0;if((b|0)==95)break;if(!(R2(b)|0))break d}while(0);b=c[n>>2]|0;if(b&32){if(q){b=c[U>>2]|0;if((b|0)==95)break}else{B=(R2(h)|0)==0;b=c[U>>2]|0;if(B|(b|0)==95)break}if(R2(b)|0)break;b=c[n>>2]|0}m=c[U>>2]|0;do if((m|0)!=0&(p&(b&64|0)!=0)){if(q)b=1;else{b=(R2(h)|0)!=0;m=c[U>>2]|0}if((m|0)==95)if(b)break d;else break;else if(b^(R2(m)|0)!=0)break;else break d}while(0);if(!(c[n>>2]&128)){W=46;break c}b=c[U>>2]|0;if(r|(b|0)==0)break;if(q)m=1;else{m=(R2(h)|0)!=0;b=c[U>>2]|0}if((b|0)==95)if(m){W=46;break c}else break;else if(m^(R2(b)|0)!=0)break;else{W=46;break c}}while(0);a=k+40|0;if(!(c[a>>2]|0))break b;else k=k+32|0}if((W|0)==46){W=0;c[g>>2]=c[a>>2];if(I)u6(c[g+4>>2]|0,-1,P|0)|0;a=c[k+16>>2]|0;if(a|0?(T=c[a>>2]|0,(T|0)>-1):0){m=g+4|0;b=T;do{if((b|0)<(O|0))c[(c[m>>2]|0)+(b<<2)>>2]=u;a=a+4|0;b=c[a>>2]|0}while((b|0)>-1)}a=(c[g>>2]|0)!=(c[J>>2]|0);if(a|D){j=a?j:1;e=a?e:u;a=g+4|0}else{a=g+4|0;j=c[a>>2]|0;e=0;do{c[d+(e<<2)>>2]=c[j+(e<<2)>>2];e=e+1|0}while((e|0)!=(O|0));j=1;e=u}B=c[o>>2]|0;c[N+(B<<3)>>2]=u;c[N+(B<<3)+4>>2]=a;g=g+8|0}a=k+40|0;if(!(c[a>>2]|0))break;else k=k+32|0}}while(0);c[g>>2]=0;g=c[U>>2]|0;if(!g)break;else h=g}else{if(F)break;h=c[U>>2]|0;if(!((g|0)!=(x|0)&(h|0)!=0))break}B=u+i|0;g=c4(U,v,4)|0;if((g|0)<1)if((g|0)<0){e=1;break a}else i=1;else i=g;z=v+i|0;if((j|0)!=0&(c[K>>2]|0)!=0){if(!(c[x>>2]|0))g=w;else{o=c[E>>2]|0;p=c[o>>2]|0;q=(p|0)>-1;n=x;g=w;do{m=n+4|0;e:do if(q){a=0;b=p;do{k=c[o+((a|1)<<2)>>2]|0;if((b|0)>=(O|0))break e;j=c[m>>2]|0;if((c[j+(k<<2)>>2]|0)==(c[d+(k<<2)>>2]|0)?(c[j+(b<<2)>>2]|0)<(c[d+(b<<2)>>2]|0):0)break e;a=a+2|0;b=c[o+(a<<2)>>2]|0}while((b|0)>-1);a=m;W=75}else{a=m;j=c[m>>2]|0;W=75}while(0);if((W|0)==75){W=0;c[g>>2]=c[n>>2];v=g+4|0;y=c[v>>2]|0;c[v>>2]=j;c[a>>2]=y;g=g+8|0}n=n+8|0}while((c[n>>2]|0)!=0)}c[g>>2]=0;y=x;j=0}else{y=w;w=x}a=c[w>>2]|0;if(!a){a=A;g=y}else{r=(B|0)!=0;s=(h|0)==95;t=(B|0)==0;v=H&(h|0)==10;u=(B|0)<1&C;q=w;k=A;g=y;while(1){b=a+8|0;if(c[b>>2]|0){p=q+4|0;o=k;n=b;while(1){f:do if((c[a>>2]|0)>>>0<=h>>>0?(c[a+4>>2]|0)>>>0>=h>>>0:0){m=a+20|0;k=c[m>>2]|0;do if(k|0){if(!((k&1|0)==0|u|v)){k=o;break f}if(k&2|0?(A=c[U>>2]|0,!((A|Q|0)==0|H&(A|0)==10)):0){k=o;break f}do if(k&16|0){if(s){k=o;break f}if(R2(h)|0){k=o;break f}k=c[U>>2]|0;if((k|0)==95)break;if(!(R2(k)|0)){k=o;break f}}while(0);k=c[m>>2]|0;if(k&32){if(s){k=c[U>>2]|0;if((k|0)==95){k=o;break f}}else{A=(R2(h)|0)==0;k=c[U>>2]|0;if(A|(k|0)==95){k=o;break f}}if(R2(k)|0){k=o;break f}k=c[m>>2]|0}b=c[U>>2]|0;do if((b|0)!=0&(r&(k&64|0)!=0)){if(s)k=1;else{k=(R2(h)|0)!=0;b=c[U>>2]|0}if((b|0)==95)if(k){k=o;break f}else break;else if(k^(R2(b)|0)!=0)break;else{k=o;break f}}while(0);do if(c[m>>2]&128|0){k=c[U>>2]|0;if(t|(k|0)==0){k=o;break f}if(s)b=1;else{b=(R2(h)|0)!=0;k=c[U>>2]|0}if((k|0)==95)if(b)break;else{k=o;break f}else if(b^(R2(k)|0)!=0){k=o;break f}else break}while(0);k=c[m>>2]|0;do if(k&4){if(c[R>>2]&2|0)break;if(!(W2(h,c[a+24>>2]|0)|0)){k=o;break f}k=c[m>>2]|0}while(0);do if(k&4|0){if(!(c[R>>2]&2))break;A=c3(h)|0;k=a+24|0;if(W2(A,c[k>>2]|0)|0)break;A=g3(h)|0;if(!(W2(A,c[k>>2]|0)|0)){k=o;break f}}while(0);if(!(c[m>>2]&8))break;if(Q5(c[a+28>>2]|0,h,c[R>>2]&2)|0){k=o;break f}}while(0);if(I){b=c[p>>2]|0;k=0;do{c[o+(k<<2)>>2]=c[b+(k<<2)>>2];k=k+1|0}while((k|0)!=(O|0))}k=c[a+16>>2]|0;do if(k|0){b=c[k>>2]|0;if((b|0)<=-1)break;do{if((b|0)<(O|0))c[o+(b<<2)>>2]=B;k=k+4|0;b=c[k>>2]|0}while((b|0)>-1)}while(0);k=c[a+12>>2]|0;b=N+(k<<3)|0;if((c[b>>2]|0)>=(B|0)){k=c[N+(k<<3)+4>>2]|0;b=c[k>>2]|0;if(!(R5(O,c[L>>2]|0,o,b)|0)){k=o;break}c[k>>2]=o;if((c[n>>2]|0)!=(c[J>>2]|0)){k=b;break}if(I)e=0;else{j=1;k=b;e=B;break}while(1){c[d+(e<<2)>>2]=c[o+(e<<2)>>2];e=e+1|0;if((e|0)==(O|0)){j=1;k=b;e=B;break f}}}A=c[n>>2]|0;c[g>>2]=A;x=g+4|0;m=c[x>>2]|0;c[x>>2]=o;c[b>>2]=B;c[N+(k<<3)+4>>2]=x;do if((A|0)==(c[J>>2]|0)){if((e|0)==-1)if(I)e=0;else{e=B;j=1;break}else{if(!I)break;if((c[o>>2]|0)>(c[d>>2]|0))break;else e=0}do{c[d+(e<<2)>>2]=c[o+(e<<2)>>2];e=e+1|0}while((e|0)<(O|0));e=B;j=1}while(0);k=m;g=g+8|0}else k=o;while(0);n=a+40|0;if(!(c[n>>2]|0))break;else{a=a+32|0;o=k}}}q=q+8|0;a=c[q>>2]|0;if(!a){a=k;break}}}c[g>>2]=0;v=z;u=B;A=a;x=y}c[f>>2]=e;e=e>>>31}while(0);l6(V)}l=X;return e|0}function P5(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((d&8|0)==0&(g|0)>-1?(m=c[e+16>>2]|0,n=c[e+28>>2]|0,l=(a|0)!=0&(n|0)!=0,l):0){k=c[e+48>>2]|0;j=0;do{d=c[m+(j*12|0)>>2]|0;if((d|0)==(k|0))i=g;else i=c[f+(d<<2)>>2]|0;h=b+(j<<3)|0;c[h>>2]=i;d=c[m+(j*12|0)+4>>2]|0;if((d|0)==(k|0))d=g;else d=c[f+(d<<2)>>2]|0;e=b+(j<<3)+4|0;c[e>>2]=d;if((d|0)==-1|(i|0)==-1){c[e>>2]=-1;c[h>>2]=-1}j=j+1|0}while(j>>>0>>0&j>>>0>>0);if(l){d=0;do{i=b+(d<<3)+4|0;j=c[m+(d*12|0)+8>>2]|0;if(j|0?(o=c[j>>2]|0,(o|0)>-1):0){k=b+(d<<3)|0;h=0;f=o;e=c[k>>2]|0;do{if(!((e|0)>=(c[b+(f<<3)>>2]|0)?(c[i>>2]|0)<=(c[b+(f<<3)+4>>2]|0):0)){c[i>>2]=-1;c[k>>2]=-1;e=-1}h=h+1|0;f=c[j+(h<<2)>>2]|0}while((f|0)>-1)}d=d+1|0}while(d>>>0>>0&d>>>0>>0)}else d=0}else d=0;if(d>>>0>>0)u6(b+(d<<3)|0,-1,a-d<<3|0)|0;return}function Q5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=c[a>>2]|0;a:do if(!e)d=0;else{f=(d|0)==0;d=e;while(1){if(f){if(W2(b,d)|0){d=1;break a}}else{e=g3(b)|0;if(W2(e,c[a>>2]|0)|0){d=1;break a}e=c3(b)|0;if(W2(e,c[a>>2]|0)|0){d=1;break a}}a=a+4|0;d=c[a>>2]|0;if(!d){d=0;break}}}while(0);return d|0}function R5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;a:do if((a|0)>0){f=0;while(1){h=c[d+(f<<2)>>2]|0;g=c[e+(f<<2)>>2]|0;if(!(c[b+(f<<2)>>2]|0)){if((h|0)<(g|0)){f=1;break a}if((h|0)>(g|0)){f=0;break a}}else{if((h|0)>(g|0)){f=1;break a}if((h|0)<(g|0)){f=0;break a}}f=f+1|0;if((f|0)>=(a|0)){f=0;break}}}else f=0;while(0);return f|0}function S5(a){a=a|0;var b=0,e=0,f=0;if((c[a+76>>2]|0)>=0?(n2(a)|0)!=0:0){b=a+4|0;e=c[b>>2]|0;if(e>>>0<(c[a+8>>2]|0)>>>0){c[b>>2]=e+1;b=d[e>>0]|0}else b=Y1(a)|0}else f=3;do if((f|0)==3){b=a+4|0;e=c[b>>2]|0;if(e>>>0<(c[a+8>>2]|0)>>>0){c[b>>2]=e+1;b=d[e>>0]|0;break}else{b=Y1(a)|0;break}}while(0);return b|0}function T5(a){a=a|0;var b=0;if((c[a+76>>2]|0)>-1){b=(n2(a)|0)==0;a=U5(a)|0}else a=U5(a)|0;return a|0}function U5(a){a=a|0;var b=0;if(!(c[a>>2]&128))b=1;else b=(c[a+20>>2]|0)>>>0>(c[a+28>>2]|0)>>>0?2:1;b=eb[c[a+40>>2]&63](a,0,b)|0;if((b|0)>=0)b=b-(c[a+8>>2]|0)+(c[a+4>>2]|0)+(c[a+20>>2]|0)-(c[a+28>>2]|0)|0;return b|0}function V5(a){a=a|0;(c[a+76>>2]|0)>-1?n2(a)|0:0;return c[a+60>>2]|0}function W5(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=b&255;e=b&255;if((c[d+76>>2]|0)>=0?(n2(d)|0)!=0:0){if((e|0)!=(a[d+75>>0]|0)?(h=d+20|0,i=c[h>>2]|0,i>>>0<(c[d+16>>2]|0)>>>0):0){c[h>>2]=i+1;a[i>>0]=j}else e=b4(d,b)|0;o2(d)}else k=3;do if((k|0)==3){if((e|0)!=(a[d+75>>0]|0)?(f=d+20|0,g=c[f>>2]|0,g>>>0<(c[d+16>>2]|0)>>>0):0){c[f>>2]=g+1;a[g>>0]=j;break}e=b4(d,b)|0}while(0);return e|0}function X5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=S(e,d)|0;e=(d|0)==0?0:e;if((c[f+76>>2]|0)>-1)j=n2(f)|0;else j=0;g=f+74|0;h=a[g>>0]|0;a[g>>0]=h+255|h;g=f+4|0;h=c[g>>2]|0;m=(c[f+8>>2]|0)-h|0;i=m>>>0>>0?m:k;if((m|0)>0){B6(b|0,h|0,i|0)|0;c[g>>2]=h+i;g=k-i|0;b=b+i|0}else g=k;a:do if(!g)l=13;else{i=f+32|0;while(1){if(Z1(f)|0)break;h=eb[c[i>>2]&63](f,b,g)|0;if((h+1|0)>>>0<2)break;g=g-h|0;if(!g){l=13;break a}else b=b+h|0}if(j|0)o2(f);e=((k-g|0)>>>0)/(d>>>0)|0}while(0);if((l|0)==13)if(j)o2(f);return e|0}function Y5(a){a=a|0;return T5(a)|0}function Z5(b){b=b|0;var d=0,e=0,f=0,g=0;f=c[15840]|0;if((c[f+76>>2]|0)>-1)g=n2(f)|0;else g=0;do if((Z3(b,f)|0)<0)b=1;else{if((a[f+75>>0]|0)!=10?(d=f+20|0,e=c[d>>2]|0,e>>>0<(c[f+16>>2]|0)>>>0):0){c[d>>2]=e+1;a[e>>0]=10;b=0;break}b=(b4(f,10)|0)<0}while(0);if(g|0)o2(f);return b<<31>>31|0}function _5(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;Xa(0,e|0)|0;d=0;e=(c[e+4>>2]|0)*65537^(e>>>4)+b;while(1){a[b+d>>0]=(e&15)+65|e<<1&32;d=d+1|0;if((d|0)==6)break;else e=e>>>5}l=f;return b|0}function $5(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+48|0;i=k+24|0;h=k+16|0;g=k;d=k+28|0;b=d;e=153835;f=b+20|0;do{a[b>>0]=a[e>>0]|0;b=b+1|0;e=e+1|0}while((b|0)<(f|0));e=d+13|0;b=0;while(1){_5(e)|0;c[g>>2]=d;c[g+4>>2]=32962;c[g+8>>2]=384;f=K1(Wa(5,g|0)|0)|0;b=b+1|0;if((f|0)>-1){j=4;break}if((b|0)>=100){b=0;break}}if((j|0)==4){c[h>>2]=d;Ta(10,h|0)|0;b=h4(f,153855)|0;if(!b){c[i>>2]=f;xa(6,i|0)|0;b=0}}l=k;return b|0}function a6(a){a=a|0;return +(+b6(a,0))}function b6(a,b){a=a|0;b=b|0;return +(+c6(a,b,1))}function c6(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,h=0,i=0;i=l;l=l+128|0;h=i;f=h;g=f+124|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));f=h+4|0;c[f>>2]=a;g=h+8|0;c[g>>2]=-1;c[h+44>>2]=a;c[h+76>>2]=-1;U1(h,0);e=+s3(h,d,1);d=(c[f>>2]|0)-(c[g>>2]|0)+(c[h+108>>2]|0)|0;if(b|0)c[b>>2]=d|0?a+d|0:a;l=i;return +e}function d6(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;while(1){e=a[b>>0]|0;c=e<<24>>24;f=b+1|0;if(!(X1(c)|0))break;else b=f}switch(c|0){case 45:{b=1;g=5;break}case 43:{b=0;g=5;break}default:{h=0;d=b;b=e}}if((g|0)==5){h=b;d=f;b=a[f>>0]|0}c=(b<<24>>24)+-48|0;if(c>>>0<10){b=0;do{d=d+1|0;b=(b*10|0)-c|0;c=(a[d>>0]|0)+-48|0}while(c>>>0<10)}else b=0;return (h|0?b:0-b|0)|0}function e6(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;a:do if(!c)b=0;else{h=b;while(1){g=c>>>1;b=h+(S(g,d)|0)|0;f=vb[e&127](a,b)|0;if(!f)break a;if((c|0)==1){b=0;break a}f=(f|0)<0;c=f?g:c-g|0;if(!c){b=0;break}else h=f?h:b}}while(0);return b|0}function f6(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=l;l=l+32|0;f=h;e=a[d>>0]|0;a:do if(e<<24>>24!=0?(a[d+1>>0]|0)!=0:0){c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;do{i=f+(((e&255)>>>5&255)<<2)|0;c[i>>2]=c[i>>2]|1<<(e&31);d=d+1|0;e=a[d>>0]|0}while(e<<24>>24!=0);e=a[b>>0]|0;if(!(e<<24>>24))d=b;else{d=b;do{if(c[f+(((e&255)>>>5&255)<<2)>>2]&1<<(e&31)|0)break a;d=d+1|0;e=a[d>>0]|0}while(e<<24>>24!=0)}}else g=3;while(0);if((g|0)==3)d=G3(b,e<<24>>24)|0;l=h;return d-b|0}function g6(a,b){a=a|0;b=b|0;O3(a+(D3(a)|0)|0,b)|0;return a|0}function h6(b,c){b=b|0;c=c|0;c=b+(f6(b,c)|0)|0;return (a[c>>0]|0?c:0)|0}function i6(b,d){b=b|0;d=d|0;var e=0;if(!b){b=c[47615]|0;if(!b)b=0;else e=3}else e=3;do if((e|0)==3){b=b+(P4(b,d)|0)|0;if(!(a[b>>0]|0)){c[47615]=0;b=0;break}d=b+(f6(b,d)|0)|0;c[47615]=d;if(!(a[d>>0]|0)){c[47615]=0;break}else{c[47615]=d+1;a[d>>0]=0;break}}while(0);return b|0}function j6(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if(!b){b=c[e>>2]|0;if(!b)b=0;else f=3}else f=3;do if((f|0)==3){b=b+(P4(b,d)|0)|0;if(!(a[b>>0]|0)){c[e>>2]=0;b=0;break}d=b+(f6(b,d)|0)|0;c[e>>2]=d;if(!(a[d>>0]|0)){c[e>>2]=0;break}else{c[e>>2]=d+1;a[d>>0]=0;break}}while(0);return b|0}function k6(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;K=l;l=l+16|0;o=K;do if(a>>>0<245){p=a>>>0<11?16:a+11&-8;a=p>>>3;t=c[47616]|0;d=t>>>a;if(d&3|0){a=(d&1^1)+a|0;d=190504+(a<<1<<2)|0;e=d+8|0;f=c[e>>2]|0;g=f+8|0;h=c[g>>2]|0;do if((d|0)!=(h|0)){if(h>>>0<(c[47620]|0)>>>0)Va();b=h+12|0;if((c[b>>2]|0)==(f|0)){c[b>>2]=d;c[e>>2]=h;break}else Va()}else c[47616]=t&~(1<>2]=J|3;J=f+J+4|0;c[J>>2]=c[J>>2]|1;J=g;l=K;return J|0}s=c[47618]|0;if(p>>>0>s>>>0){if(d|0){i=2<>>12&16;a=a>>>i;e=a>>>5&8;a=a>>>e;g=a>>>2&4;a=a>>>g;d=a>>>1&2;a=a>>>d;b=a>>>1&1;b=(e|i|g|d|b)+(a>>>b)|0;a=190504+(b<<1<<2)|0;d=a+8|0;g=c[d>>2]|0;i=g+8|0;e=c[i>>2]|0;do if((a|0)!=(e|0)){if(e>>>0<(c[47620]|0)>>>0)Va();f=e+12|0;if((c[f>>2]|0)==(g|0)){c[f>>2]=a;c[d>>2]=e;j=t;break}else Va()}else{j=t&~(1<>2]=p|3;e=g+p|0;c[e+4>>2]=h|1;c[e+h>>2]=h;if(s|0){f=c[47621]|0;b=s>>>3;d=190504+(b<<1<<2)|0;b=1<>2]|0;if(a>>>0<(c[47620]|0)>>>0)Va();else{k=a;m=b}}else{c[47616]=j|b;k=d;m=d+8|0}c[m>>2]=f;c[k+12>>2]=f;c[f+8>>2]=k;c[f+12>>2]=d}c[47618]=h;c[47621]=e;J=i;l=K;return J|0}k=c[47617]|0;if(k){a=(k&0-k)+-1|0;I=a>>>12&16;a=a>>>I;H=a>>>5&8;a=a>>>H;J=a>>>2&4;a=a>>>J;d=a>>>1&2;a=a>>>d;b=a>>>1&1;b=c[190768+((H|I|J|d|b)+(a>>>b)<<2)>>2]|0;a=(c[b+4>>2]&-8)-p|0;d=c[b+16+(((c[b+16>>2]|0)==0&1)<<2)>>2]|0;if(!d){j=b;h=a}else{do{I=(c[d+4>>2]&-8)-p|0;J=I>>>0>>0;a=J?I:a;b=J?d:b;d=c[d+16+(((c[d+16>>2]|0)==0&1)<<2)>>2]|0}while((d|0)!=0);j=b;h=a}f=c[47620]|0;if(j>>>0>>0)Va();i=j+p|0;if(j>>>0>=i>>>0)Va();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){n=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0>>0)Va();else{c[a>>2]=0;n=b;break}}else{e=c[j+8>>2]|0;if(e>>>0>>0)Va();b=e+12|0;if((c[b>>2]|0)!=(j|0))Va();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;n=d;break}else Va()}while(0);a:do if(g|0){b=c[j+28>>2]|0;a=190768+(b<<2)|0;do if((j|0)==(c[a>>2]|0)){c[a>>2]=n;if(!n){c[47617]=k&~(1<>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=n;if(!n)break a;else break}else Va();while(0);a=c[47620]|0;if(n>>>0>>0)Va();c[n+24>>2]=g;b=c[j+16>>2]|0;do if(b|0)if(b>>>0>>0)Va();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);b=c[j+20>>2]|0;if(b|0)if(b>>>0<(c[47620]|0)>>>0)Va();else{c[n+20>>2]=b;c[b+24>>2]=n;break}}while(0);if(h>>>0<16){J=h+p|0;c[j+4>>2]=J|3;J=j+J+4|0;c[J>>2]=c[J>>2]|1}else{c[j+4>>2]=p|3;c[i+4>>2]=h|1;c[i+h>>2]=h;if(s|0){e=c[47621]|0;b=s>>>3;d=190504+(b<<1<<2)|0;b=1<>2]|0;if(a>>>0<(c[47620]|0)>>>0)Va();else{q=a;r=b}}else{c[47616]=t|b;q=d;r=d+8|0}c[r>>2]=e;c[q+12>>2]=e;c[e+8>>2]=q;c[e+12>>2]=d}c[47618]=h;c[47621]=i}J=j+8|0;l=K;return J|0}}}else if(a>>>0<=4294967231){a=a+11|0;p=a&-8;k=c[47617]|0;if(k){e=0-p|0;a=a>>>8;if(a)if(p>>>0>16777215)i=31;else{r=(a+1048320|0)>>>16&8;C=a<>>16&4;C=C<>>16&2;i=14-(q|r|i)+(C<>>15)|0;i=p>>>(i+7|0)&1|i<<1}else i=0;d=c[190768+(i<<2)>>2]|0;b:do if(!d){d=0;a=0;C=81}else{a=0;h=p<<((i|0)==31?0:25-(i>>>1)|0);g=0;while(1){f=(c[d+4>>2]&-8)-p|0;if(f>>>0>>0)if(!f){a=d;e=0;f=d;C=85;break b}else{a=d;e=f}f=c[d+20>>2]|0;d=c[d+16+(h>>>31<<2)>>2]|0;g=(f|0)==0|(f|0)==(d|0)?g:f;f=(d|0)==0;if(f){d=g;C=81;break}else h=h<<((f^1)&1)}}while(0);if((C|0)==81){if((d|0)==0&(a|0)==0){a=2<>>12&16;r=r>>>m;j=r>>>5&8;r=r>>>j;n=r>>>2&4;r=r>>>n;q=r>>>1&2;r=r>>>q;d=r>>>1&1;a=0;d=c[190768+((j|m|n|q|d)+(r>>>d)<<2)>>2]|0}if(!d){j=a;i=e}else{f=d;C=85}}if((C|0)==85)while(1){C=0;d=(c[f+4>>2]&-8)-p|0;r=d>>>0>>0;d=r?d:e;a=r?f:a;f=c[f+16+(((c[f+16>>2]|0)==0&1)<<2)>>2]|0;if(!f){j=a;i=d;break}else{e=d;C=85}}if((j|0)!=0?i>>>0<((c[47618]|0)-p|0)>>>0:0){f=c[47620]|0;if(j>>>0>>0)Va();h=j+p|0;if(j>>>0>=h>>>0)Va();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){s=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0>>0)Va();else{c[a>>2]=0;s=b;break}}else{e=c[j+8>>2]|0;if(e>>>0>>0)Va();b=e+12|0;if((c[b>>2]|0)!=(j|0))Va();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;s=d;break}else Va()}while(0);c:do if(g){b=c[j+28>>2]|0;a=190768+(b<<2)|0;do if((j|0)==(c[a>>2]|0)){c[a>>2]=s;if(!s){t=k&~(1<>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=s;if(!s){t=k;break c}else break}else Va();while(0);a=c[47620]|0;if(s>>>0>>0)Va();c[s+24>>2]=g;b=c[j+16>>2]|0;do if(b|0)if(b>>>0>>0)Va();else{c[s+16>>2]=b;c[b+24>>2]=s;break}while(0);b=c[j+20>>2]|0;if(b)if(b>>>0<(c[47620]|0)>>>0)Va();else{c[s+20>>2]=b;c[b+24>>2]=s;t=k;break}else t=k}else t=k;while(0);do if(i>>>0>=16){c[j+4>>2]=p|3;c[h+4>>2]=i|1;c[h+i>>2]=i;b=i>>>3;if(i>>>0<256){d=190504+(b<<1<<2)|0;a=c[47616]|0;b=1<>2]|0;if(a>>>0<(c[47620]|0)>>>0)Va();else{x=a;y=b}}else{c[47616]=a|b;x=d;y=d+8|0}c[y>>2]=h;c[x+12>>2]=h;c[h+8>>2]=x;c[h+12>>2]=d;break}b=i>>>8;if(b)if(i>>>0>16777215)b=31;else{I=(b+1048320|0)>>>16&8;J=b<>>16&4;J=J<>>16&2;b=14-(H|I|b)+(J<>>15)|0;b=i>>>(b+7|0)&1|b<<1}else b=0;d=190768+(b<<2)|0;c[h+28>>2]=b;a=h+16|0;c[a+4>>2]=0;c[a>>2]=0;a=1<>2]=h;c[h+24>>2]=d;c[h+12>>2]=h;c[h+8>>2]=h;break}a=i<<((b|0)==31?0:25-(b>>>1)|0);e=c[d>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(i|0)){C=139;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=136;break}else{a=a<<1;e=b}}if((C|0)==136)if(d>>>0<(c[47620]|0)>>>0)Va();else{c[d>>2]=h;c[h+24>>2]=e;c[h+12>>2]=h;c[h+8>>2]=h;break}else if((C|0)==139){b=e+8|0;a=c[b>>2]|0;J=c[47620]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=h;c[b>>2]=h;c[h+8>>2]=a;c[h+12>>2]=e;c[h+24>>2]=0;break}else Va()}}else{J=i+p|0;c[j+4>>2]=J|3;J=j+J+4|0;c[J>>2]=c[J>>2]|1}while(0);J=j+8|0;l=K;return J|0}}}else p=-1;while(0);d=c[47618]|0;if(d>>>0>=p>>>0){b=d-p|0;a=c[47621]|0;if(b>>>0>15){J=a+p|0;c[47621]=J;c[47618]=b;c[J+4>>2]=b|1;c[J+b>>2]=b;c[a+4>>2]=p|3}else{c[47618]=0;c[47621]=0;c[a+4>>2]=d|3;J=a+d+4|0;c[J>>2]=c[J>>2]|1}J=a+8|0;l=K;return J|0}h=c[47619]|0;if(h>>>0>p>>>0){H=h-p|0;c[47619]=H;J=c[47622]|0;I=J+p|0;c[47622]=I;c[I+4>>2]=H|1;c[J+4>>2]=p|3;J=J+8|0;l=K;return J|0}if(!(c[47734]|0)){c[47736]=4096;c[47735]=4096;c[47737]=-1;c[47738]=-1;c[47739]=0;c[47727]=0;a=o&-16^1431655768;c[o>>2]=a;c[47734]=a;a=4096}else a=c[47736]|0;i=p+48|0;j=p+47|0;g=a+j|0;f=0-a|0;k=g&f;if(k>>>0<=p>>>0){J=0;l=K;return J|0}a=c[47726]|0;if(a|0?(x=c[47724]|0,y=x+k|0,y>>>0<=x>>>0|y>>>0>a>>>0):0){J=0;l=K;return J|0}d:do if(!(c[47727]&4)){d=c[47622]|0;e:do if(d){e=190912;while(1){a=c[e>>2]|0;if(a>>>0<=d>>>0?(w=e+4|0,(a+(c[w>>2]|0)|0)>>>0>d>>>0):0)break;a=c[e+8>>2]|0;if(!a){C=163;break e}else e=a}b=g-h&f;if(b>>>0<2147483647){a=H6(b|0)|0;if((a|0)==((c[e>>2]|0)+(c[w>>2]|0)|0)){if((a|0)!=(-1|0)){h=b;g=a;C=180;break d}}else{e=a;C=171}}else b=0}else C=163;while(0);do if((C|0)==163){d=H6(0)|0;if((d|0)!=(-1|0)?(b=d,u=c[47735]|0,v=u+-1|0,b=((v&b|0)==0?0:(v+b&0-u)-b|0)+k|0,u=c[47724]|0,v=b+u|0,b>>>0>p>>>0&b>>>0<2147483647):0){y=c[47726]|0;if(y|0?v>>>0<=u>>>0|v>>>0>y>>>0:0){b=0;break}a=H6(b|0)|0;if((a|0)==(d|0)){h=b;g=d;C=180;break d}else{e=a;C=171}}else b=0}while(0);do if((C|0)==171){d=0-b|0;if(!(i>>>0>b>>>0&(b>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){b=0;break}else{h=b;g=e;C=180;break d}a=c[47736]|0;a=j-b+a&0-a;if(a>>>0>=2147483647){h=b;g=e;C=180;break d}if((H6(a|0)|0)==(-1|0)){H6(d|0)|0;b=0;break}else{h=a+b|0;g=e;C=180;break d}}while(0);c[47727]=c[47727]|4;C=178}else{b=0;C=178}while(0);if(((C|0)==178?k>>>0<2147483647:0)?(B=H6(k|0)|0,y=H6(0)|0,z=y-B|0,A=z>>>0>(p+40|0)>>>0,!((B|0)==(-1|0)|A^1|B>>>0>>0&((B|0)!=(-1|0)&(y|0)!=(-1|0))^1)):0){h=A?z:b;g=B;C=180}if((C|0)==180){b=(c[47724]|0)+h|0;c[47724]=b;if(b>>>0>(c[47725]|0)>>>0)c[47725]=b;k=c[47622]|0;do if(k){b=190912;while(1){a=c[b>>2]|0;d=b+4|0;e=c[d>>2]|0;if((g|0)==(a+e|0)){C=190;break}f=c[b+8>>2]|0;if(!f)break;else b=f}if(((C|0)==190?(c[b+12>>2]&8|0)==0:0)?k>>>0>>0&k>>>0>=a>>>0:0){c[d>>2]=e+h;J=k+8|0;J=(J&7|0)==0?0:0-J&7;I=k+J|0;J=(c[47619]|0)+(h-J)|0;c[47622]=I;c[47619]=J;c[I+4>>2]=J|1;c[I+J+4>>2]=40;c[47623]=c[47738];break}b=c[47620]|0;if(g>>>0>>0){c[47620]=g;i=g}else i=b;d=g+h|0;b=190912;while(1){if((c[b>>2]|0)==(d|0)){C=198;break}a=c[b+8>>2]|0;if(!a)break;else b=a}if((C|0)==198?(c[b+12>>2]&8|0)==0:0){c[b>>2]=g;n=b+4|0;c[n>>2]=(c[n>>2]|0)+h;n=g+8|0;n=g+((n&7|0)==0?0:0-n&7)|0;b=d+8|0;b=d+((b&7|0)==0?0:0-b&7)|0;m=n+p|0;j=b-n-p|0;c[n+4>>2]=p|3;do if((b|0)!=(k|0)){if((b|0)==(c[47621]|0)){J=(c[47618]|0)+j|0;c[47618]=J;c[47621]=m;c[m+4>>2]=J|1;c[m+J>>2]=J;break}a=c[b+4>>2]|0;if((a&3|0)==1){h=a&-8;f=a>>>3;f:do if(a>>>0>=256){g=c[b+24>>2]|0;e=c[b+12>>2]|0;do if((e|0)==(b|0)){e=b+16|0;d=e+4|0;a=c[d>>2]|0;if(!a){a=c[e>>2]|0;if(!a){H=0;break}else d=e}while(1){e=a+20|0;f=c[e>>2]|0;if(f|0){a=f;d=e;continue}e=a+16|0;f=c[e>>2]|0;if(!f)break;else{a=f;d=e}}if(d>>>0>>0)Va();else{c[d>>2]=0;H=a;break}}else{f=c[b+8>>2]|0;if(f>>>0>>0)Va();a=f+12|0;if((c[a>>2]|0)!=(b|0))Va();d=e+8|0;if((c[d>>2]|0)==(b|0)){c[a>>2]=e;c[d>>2]=f;H=e;break}else Va()}while(0);if(!g)break;a=c[b+28>>2]|0;d=190768+(a<<2)|0;do if((b|0)!=(c[d>>2]|0))if(g>>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(b|0)&1)<<2)>>2]=H;if(!H)break f;else break}else Va();else{c[d>>2]=H;if(H|0)break;c[47617]=c[47617]&~(1<>>0>>0)Va();c[H+24>>2]=g;a=b+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0>>0)Va();else{c[H+16>>2]=d;c[d+24>>2]=H;break}while(0);a=c[a+4>>2]|0;if(!a)break;if(a>>>0<(c[47620]|0)>>>0)Va();else{c[H+20>>2]=a;c[a+24>>2]=H;break}}else{d=c[b+8>>2]|0;e=c[b+12>>2]|0;a=190504+(f<<1<<2)|0;do if((d|0)!=(a|0)){if(d>>>0>>0)Va();if((c[d+12>>2]|0)==(b|0))break;Va()}while(0);if((e|0)==(d|0)){c[47616]=c[47616]&~(1<>>0>>0)Va();a=e+8|0;if((c[a>>2]|0)==(b|0)){E=a;break}Va()}while(0);c[d+12>>2]=e;c[E>>2]=d}while(0);b=b+h|0;f=h+j|0}else f=j;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[m+4>>2]=f|1;c[m+f>>2]=f;b=f>>>3;if(f>>>0<256){d=190504+(b<<1<<2)|0;a=c[47616]|0;b=1<>2]|0;if(a>>>0>=(c[47620]|0)>>>0){I=a;J=b;break}Va()}while(0);c[J>>2]=m;c[I+12>>2]=m;c[m+8>>2]=I;c[m+12>>2]=d;break}b=f>>>8;do if(!b)b=0;else{if(f>>>0>16777215){b=31;break}I=(b+1048320|0)>>>16&8;J=b<>>16&4;J=J<>>16&2;b=14-(H|I|b)+(J<>>15)|0;b=f>>>(b+7|0)&1|b<<1}while(0);e=190768+(b<<2)|0;c[m+28>>2]=b;a=m+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[47617]|0;d=1<>2]=m;c[m+24>>2]=e;c[m+12>>2]=m;c[m+8>>2]=m;break}a=f<<((b|0)==31?0:25-(b>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){C=265;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=262;break}else{a=a<<1;e=b}}if((C|0)==262)if(d>>>0<(c[47620]|0)>>>0)Va();else{c[d>>2]=m;c[m+24>>2]=e;c[m+12>>2]=m;c[m+8>>2]=m;break}else if((C|0)==265){b=e+8|0;a=c[b>>2]|0;J=c[47620]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=m;c[b>>2]=m;c[m+8>>2]=a;c[m+12>>2]=e;c[m+24>>2]=0;break}else Va()}}else{J=(c[47619]|0)+j|0;c[47619]=J;c[47622]=m;c[m+4>>2]=J|1}while(0);J=n+8|0;l=K;return J|0}b=190912;while(1){a=c[b>>2]|0;if(a>>>0<=k>>>0?(D=a+(c[b+4>>2]|0)|0,D>>>0>k>>>0):0)break;b=c[b+8>>2]|0}f=D+-47|0;a=f+8|0;a=f+((a&7|0)==0?0:0-a&7)|0;f=k+16|0;a=a>>>0>>0?k:a;b=a+8|0;d=g+8|0;d=(d&7|0)==0?0:0-d&7;J=g+d|0;d=h+-40-d|0;c[47622]=J;c[47619]=d;c[J+4>>2]=d|1;c[J+d+4>>2]=40;c[47623]=c[47738];d=a+4|0;c[d>>2]=27;c[b>>2]=c[47728];c[b+4>>2]=c[47729];c[b+8>>2]=c[47730];c[b+12>>2]=c[47731];c[47728]=g;c[47729]=h;c[47731]=0;c[47730]=b;b=a+24|0;do{J=b;b=b+4|0;c[b>>2]=7}while((J+8|0)>>>0>>0);if((a|0)!=(k|0)){g=a-k|0;c[d>>2]=c[d>>2]&-2;c[k+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){d=190504+(b<<1<<2)|0;a=c[47616]|0;b=1<>2]|0;if(a>>>0<(c[47620]|0)>>>0)Va();else{F=a;G=b}}else{c[47616]=a|b;F=d;G=d+8|0}c[G>>2]=k;c[F+12>>2]=k;c[k+8>>2]=F;c[k+12>>2]=d;break}b=g>>>8;if(b)if(g>>>0>16777215)d=31;else{I=(b+1048320|0)>>>16&8;J=b<>>16&4;J=J<>>16&2;d=14-(H|I|d)+(J<>>15)|0;d=g>>>(d+7|0)&1|d<<1}else d=0;e=190768+(d<<2)|0;c[k+28>>2]=d;c[k+20>>2]=0;c[f>>2]=0;b=c[47617]|0;a=1<>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}a=g<<((d|0)==31?0:25-(d>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(g|0)){C=292;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=289;break}else{a=a<<1;e=b}}if((C|0)==289)if(d>>>0<(c[47620]|0)>>>0)Va();else{c[d>>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}else if((C|0)==292){b=e+8|0;a=c[b>>2]|0;J=c[47620]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=k;c[b>>2]=k;c[k+8>>2]=a;c[k+12>>2]=e;c[k+24>>2]=0;break}else Va()}}}else{J=c[47620]|0;if((J|0)==0|g>>>0>>0)c[47620]=g;c[47728]=g;c[47729]=h;c[47731]=0;c[47625]=c[47734];c[47624]=-1;b=0;do{J=190504+(b<<1<<2)|0;c[J+12>>2]=J;c[J+8>>2]=J;b=b+1|0}while((b|0)!=32);J=g+8|0;J=(J&7|0)==0?0:0-J&7;I=g+J|0;J=h+-40-J|0;c[47622]=I;c[47619]=J;c[I+4>>2]=J|1;c[I+J+4>>2]=40;c[47623]=c[47738]}while(0);b=c[47619]|0;if(b>>>0>p>>>0){H=b-p|0;c[47619]=H;J=c[47622]|0;I=J+p|0;c[47622]=I;c[I+4>>2]=H|1;c[J+4>>2]=p|3;J=J+8|0;l=K;return J|0}}c[(L1()|0)>>2]=12;J=0;l=K;return J|0}function l6(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if(!a)return;d=a+-8|0;h=c[47620]|0;if(d>>>0>>0)Va();a=c[a+-4>>2]|0;b=a&3;if((b|0)==1)Va();e=a&-8;o=d+e|0;a:do if(!(a&1)){a=c[d>>2]|0;if(!b)return;k=d+(0-a)|0;j=a+e|0;if(k>>>0>>0)Va();if((k|0)==(c[47621]|0)){a=o+4|0;b=c[a>>2]|0;if((b&3|0)!=3){r=k;f=j;m=k;break}c[47618]=j;c[a>>2]=b&-2;c[k+4>>2]=j|1;c[k+j>>2]=j;return}e=a>>>3;if(a>>>0<256){b=c[k+8>>2]|0;d=c[k+12>>2]|0;a=190504+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0>>0)Va();if((c[b+12>>2]|0)!=(k|0))Va()}if((d|0)==(b|0)){c[47616]=c[47616]&~(1<>>0>>0)Va();a=d+8|0;if((c[a>>2]|0)==(k|0))g=a;else Va()}else g=d+8|0;c[b+12>>2]=d;c[g>>2]=b;r=k;f=j;m=k;break}g=c[k+24>>2]|0;d=c[k+12>>2]|0;do if((d|0)==(k|0)){d=k+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){i=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0>>0)Va();else{c[b>>2]=0;i=a;break}}else{e=c[k+8>>2]|0;if(e>>>0>>0)Va();a=e+12|0;if((c[a>>2]|0)!=(k|0))Va();b=d+8|0;if((c[b>>2]|0)==(k|0)){c[a>>2]=d;c[b>>2]=e;i=d;break}else Va()}while(0);if(g){a=c[k+28>>2]|0;b=190768+(a<<2)|0;do if((k|0)==(c[b>>2]|0)){c[b>>2]=i;if(!i){c[47617]=c[47617]&~(1<>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(k|0)&1)<<2)>>2]=i;if(!i){r=k;f=j;m=k;break a}else break}else Va();while(0);d=c[47620]|0;if(i>>>0>>0)Va();c[i+24>>2]=g;a=k+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0>>0)Va();else{c[i+16>>2]=b;c[b+24>>2]=i;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[47620]|0)>>>0)Va();else{c[i+20>>2]=a;c[a+24>>2]=i;r=k;f=j;m=k;break}else{r=k;f=j;m=k}}else{r=k;f=j;m=k}}else{r=d;f=e;m=d}while(0);if(m>>>0>=o>>>0)Va();a=o+4|0;b=c[a>>2]|0;if(!(b&1))Va();if(!(b&2)){a=c[47621]|0;if((o|0)==(c[47622]|0)){q=(c[47619]|0)+f|0;c[47619]=q;c[47622]=r;c[r+4>>2]=q|1;if((r|0)!=(a|0))return;c[47621]=0;c[47618]=0;return}if((o|0)==(a|0)){q=(c[47618]|0)+f|0;c[47618]=q;c[47621]=m;c[r+4>>2]=q|1;c[m+q>>2]=q;return}f=(b&-8)+f|0;e=b>>>3;b:do if(b>>>0>=256){g=c[o+24>>2]|0;a=c[o+12>>2]|0;do if((a|0)==(o|0)){d=o+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){n=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<(c[47620]|0)>>>0)Va();else{c[b>>2]=0;n=a;break}}else{b=c[o+8>>2]|0;if(b>>>0<(c[47620]|0)>>>0)Va();d=b+12|0;if((c[d>>2]|0)!=(o|0))Va();e=a+8|0;if((c[e>>2]|0)==(o|0)){c[d>>2]=a;c[e>>2]=b;n=a;break}else Va()}while(0);if(g|0){a=c[o+28>>2]|0;b=190768+(a<<2)|0;do if((o|0)==(c[b>>2]|0)){c[b>>2]=n;if(!n){c[47617]=c[47617]&~(1<>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(o|0)&1)<<2)>>2]=n;if(!n)break b;else break}else Va();while(0);d=c[47620]|0;if(n>>>0>>0)Va();c[n+24>>2]=g;a=o+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0>>0)Va();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a|0)if(a>>>0<(c[47620]|0)>>>0)Va();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{b=c[o+8>>2]|0;d=c[o+12>>2]|0;a=190504+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<(c[47620]|0)>>>0)Va();if((c[b+12>>2]|0)!=(o|0))Va()}if((d|0)==(b|0)){c[47616]=c[47616]&~(1<>>0<(c[47620]|0)>>>0)Va();a=d+8|0;if((c[a>>2]|0)==(o|0))l=a;else Va()}else l=d+8|0;c[b+12>>2]=d;c[l>>2]=b}while(0);c[r+4>>2]=f|1;c[m+f>>2]=f;if((r|0)==(c[47621]|0)){c[47618]=f;return}}else{c[a>>2]=b&-2;c[r+4>>2]=f|1;c[m+f>>2]=f}a=f>>>3;if(f>>>0<256){d=190504+(a<<1<<2)|0;b=c[47616]|0;a=1<>2]|0;if(b>>>0<(c[47620]|0)>>>0)Va();else{p=b;q=a}}else{c[47616]=b|a;p=d;q=d+8|0}c[q>>2]=r;c[p+12>>2]=r;c[r+8>>2]=p;c[r+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{p=(a+1048320|0)>>>16&8;q=a<>>16&4;q=q<>>16&2;a=14-(o|p|a)+(q<>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=190768+(a<<2)|0;c[r+28>>2]=a;c[r+20>>2]=0;c[r+16>>2]=0;b=c[47617]|0;d=1<>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=124;break}d=e+16+(b>>>31<<2)|0;a=c[d>>2]|0;if(!a){a=121;break}else{b=b<<1;e=a}}if((a|0)==121)if(d>>>0<(c[47620]|0)>>>0)Va();else{c[d>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;break}else if((a|0)==124){a=e+8|0;b=c[a>>2]|0;q=c[47620]|0;if(b>>>0>=q>>>0&e>>>0>=q>>>0){c[b+12>>2]=r;c[a>>2]=r;c[r+8>>2]=b;c[r+12>>2]=e;c[r+24>>2]=0;break}else Va()}}else{c[47617]=b|d;c[e>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r}while(0);r=(c[47624]|0)+-1|0;c[47624]=r;if(!r)a=190920;else return;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[47624]=-1;return}function m6(a,b){a=a|0;b=b|0;var d=0;if(a){d=S(b,a)|0;if((b|a)>>>0>65535)d=((d>>>0)/(a>>>0)|0|0)==(b|0)?d:-1}else d=0;a=k6(d)|0;if(!a)return a|0;if(!(c[a+-4>>2]&3))return a|0;u6(a|0,0,d|0)|0;return a|0}function n6(a,b){a=a|0;b=b|0;var d=0,e=0;if(!a){b=k6(b)|0;return b|0}if(b>>>0>4294967231){c[(L1()|0)>>2]=12;b=0;return b|0}d=o6(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(d|0){b=d+8|0;return b|0}d=k6(b)|0;if(!d){b=0;return b|0}e=c[a+-4>>2]|0;e=(e&-8)-((e&3|0)==0?8:4)|0;B6(d|0,a|0,(e>>>0>>0?e:b)|0)|0;l6(a);b=d;return b|0} -function o6(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=a+4|0;n=c[o>>2]|0;d=n&-8;k=a+d|0;i=c[47620]|0;e=n&3;if(!((e|0)!=1&a>>>0>=i>>>0&a>>>0>>0))Va();f=c[k+4>>2]|0;if(!(f&1))Va();if(!e){if(b>>>0<256){a=0;return a|0}if(d>>>0>=(b+4|0)>>>0?(d-b|0)>>>0<=c[47736]<<1>>>0:0)return a|0;a=0;return a|0}if(d>>>0>=b>>>0){d=d-b|0;if(d>>>0<=15)return a|0;m=a+b|0;c[o>>2]=n&1|b|2;c[m+4>>2]=d|3;o=m+d+4|0;c[o>>2]=c[o>>2]|1;p6(m,d);return a|0}if((k|0)==(c[47622]|0)){m=(c[47619]|0)+d|0;d=m-b|0;e=a+b|0;if(m>>>0<=b>>>0){a=0;return a|0}c[o>>2]=n&1|b|2;c[e+4>>2]=d|1;c[47622]=e;c[47619]=d;return a|0}if((k|0)==(c[47621]|0)){f=(c[47618]|0)+d|0;if(f>>>0>>0){a=0;return a|0}d=f-b|0;e=n&1;if(d>>>0>15){n=a+b|0;m=n+d|0;c[o>>2]=e|b|2;c[n+4>>2]=d|1;c[m>>2]=d;e=m+4|0;c[e>>2]=c[e>>2]&-2;e=n}else{c[o>>2]=e|f|2;e=a+f+4|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[47618]=d;c[47621]=e;return a|0}if(f&2|0){a=0;return a|0}l=(f&-8)+d|0;if(l>>>0>>0){a=0;return a|0}m=l-b|0;g=f>>>3;a:do if(f>>>0>=256){h=c[k+24>>2]|0;f=c[k+12>>2]|0;do if((f|0)==(k|0)){f=k+16|0;e=f+4|0;d=c[e>>2]|0;if(!d){d=c[f>>2]|0;if(!d){j=0;break}else e=f}while(1){f=d+20|0;g=c[f>>2]|0;if(g|0){d=g;e=f;continue}f=d+16|0;g=c[f>>2]|0;if(!g)break;else{d=g;e=f}}if(e>>>0>>0)Va();else{c[e>>2]=0;j=d;break}}else{g=c[k+8>>2]|0;if(g>>>0>>0)Va();d=g+12|0;if((c[d>>2]|0)!=(k|0))Va();e=f+8|0;if((c[e>>2]|0)==(k|0)){c[d>>2]=f;c[e>>2]=g;j=f;break}else Va()}while(0);if(h|0){d=c[k+28>>2]|0;e=190768+(d<<2)|0;do if((k|0)==(c[e>>2]|0)){c[e>>2]=j;if(!j){c[47617]=c[47617]&~(1<>>0>=(c[47620]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(k|0)&1)<<2)>>2]=j;if(!j)break a;else break}else Va();while(0);f=c[47620]|0;if(j>>>0>>0)Va();c[j+24>>2]=h;d=k+16|0;e=c[d>>2]|0;do if(e|0)if(e>>>0>>0)Va();else{c[j+16>>2]=e;c[e+24>>2]=j;break}while(0);d=c[d+4>>2]|0;if(d|0)if(d>>>0<(c[47620]|0)>>>0)Va();else{c[j+20>>2]=d;c[d+24>>2]=j;break}}}else{e=c[k+8>>2]|0;f=c[k+12>>2]|0;d=190504+(g<<1<<2)|0;if((e|0)!=(d|0)){if(e>>>0>>0)Va();if((c[e+12>>2]|0)!=(k|0))Va()}if((f|0)==(e|0)){c[47616]=c[47616]&~(1<>>0>>0)Va();d=f+8|0;if((c[d>>2]|0)==(k|0))h=d;else Va()}else h=f+8|0;c[e+12>>2]=f;c[h>>2]=e}while(0);d=n&1;if(m>>>0<16){c[o>>2]=l|d|2;o=a+l+4|0;c[o>>2]=c[o>>2]|1;return a|0}else{n=a+b|0;c[o>>2]=d|b|2;c[n+4>>2]=m|3;o=n+m+4|0;c[o>>2]=c[o>>2]|1;p6(n,m);return a|0}return 0}function p6(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;o=a+b|0;d=c[a+4>>2]|0;a:do if(!(d&1)){g=c[a>>2]|0;if(!(d&3))return;l=a+(0-g)|0;k=g+b|0;i=c[47620]|0;if(l>>>0>>0)Va();if((l|0)==(c[47621]|0)){a=o+4|0;d=c[a>>2]|0;if((d&3|0)!=3){r=l;f=k;break}c[47618]=k;c[a>>2]=d&-2;c[l+4>>2]=k|1;c[l+k>>2]=k;return}e=g>>>3;if(g>>>0<256){d=c[l+8>>2]|0;b=c[l+12>>2]|0;a=190504+(e<<1<<2)|0;if((d|0)!=(a|0)){if(d>>>0>>0)Va();if((c[d+12>>2]|0)!=(l|0))Va()}if((b|0)==(d|0)){c[47616]=c[47616]&~(1<>>0>>0)Va();a=b+8|0;if((c[a>>2]|0)==(l|0))h=a;else Va()}else h=b+8|0;c[d+12>>2]=b;c[h>>2]=d;r=l;f=k;break}g=c[l+24>>2]|0;b=c[l+12>>2]|0;do if((b|0)==(l|0)){b=l+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){j=0;break}else d=b}while(1){b=a+20|0;e=c[b>>2]|0;if(e|0){a=e;d=b;continue}b=a+16|0;e=c[b>>2]|0;if(!e)break;else{a=e;d=b}}if(d>>>0>>0)Va();else{c[d>>2]=0;j=a;break}}else{e=c[l+8>>2]|0;if(e>>>0>>0)Va();a=e+12|0;if((c[a>>2]|0)!=(l|0))Va();d=b+8|0;if((c[d>>2]|0)==(l|0)){c[a>>2]=b;c[d>>2]=e;j=b;break}else Va()}while(0);if(g){a=c[l+28>>2]|0;d=190768+(a<<2)|0;do if((l|0)==(c[d>>2]|0)){c[d>>2]=j;if(!j){c[47617]=c[47617]&~(1<>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(l|0)&1)<<2)>>2]=j;if(!j){r=l;f=k;break a}else break}else Va();while(0);b=c[47620]|0;if(j>>>0>>0)Va();c[j+24>>2]=g;a=l+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0>>0)Va();else{c[j+16>>2]=d;c[d+24>>2]=j;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[47620]|0)>>>0)Va();else{c[j+20>>2]=a;c[a+24>>2]=j;r=l;f=k;break}else{r=l;f=k}}else{r=l;f=k}}else{r=a;f=b}while(0);h=c[47620]|0;if(o>>>0>>0)Va();a=o+4|0;d=c[a>>2]|0;if(!(d&2)){a=c[47621]|0;if((o|0)==(c[47622]|0)){q=(c[47619]|0)+f|0;c[47619]=q;c[47622]=r;c[r+4>>2]=q|1;if((r|0)!=(a|0))return;c[47621]=0;c[47618]=0;return}if((o|0)==(a|0)){q=(c[47618]|0)+f|0;c[47618]=q;c[47621]=r;c[r+4>>2]=q|1;c[r+q>>2]=q;return}f=(d&-8)+f|0;e=d>>>3;b:do if(d>>>0>=256){g=c[o+24>>2]|0;b=c[o+12>>2]|0;do if((b|0)==(o|0)){b=o+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){n=0;break}else d=b}while(1){b=a+20|0;e=c[b>>2]|0;if(e|0){a=e;d=b;continue}b=a+16|0;e=c[b>>2]|0;if(!e)break;else{a=e;d=b}}if(d>>>0>>0)Va();else{c[d>>2]=0;n=a;break}}else{e=c[o+8>>2]|0;if(e>>>0>>0)Va();a=e+12|0;if((c[a>>2]|0)!=(o|0))Va();d=b+8|0;if((c[d>>2]|0)==(o|0)){c[a>>2]=b;c[d>>2]=e;n=b;break}else Va()}while(0);if(g|0){a=c[o+28>>2]|0;d=190768+(a<<2)|0;do if((o|0)==(c[d>>2]|0)){c[d>>2]=n;if(!n){c[47617]=c[47617]&~(1<>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(o|0)&1)<<2)>>2]=n;if(!n)break b;else break}else Va();while(0);b=c[47620]|0;if(n>>>0>>0)Va();c[n+24>>2]=g;a=o+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0>>0)Va();else{c[n+16>>2]=d;c[d+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a|0)if(a>>>0<(c[47620]|0)>>>0)Va();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{d=c[o+8>>2]|0;b=c[o+12>>2]|0;a=190504+(e<<1<<2)|0;if((d|0)!=(a|0)){if(d>>>0>>0)Va();if((c[d+12>>2]|0)!=(o|0))Va()}if((b|0)==(d|0)){c[47616]=c[47616]&~(1<>>0>>0)Va();a=b+8|0;if((c[a>>2]|0)==(o|0))m=a;else Va()}else m=b+8|0;c[d+12>>2]=b;c[m>>2]=d}while(0);c[r+4>>2]=f|1;c[r+f>>2]=f;if((r|0)==(c[47621]|0)){c[47618]=f;return}}else{c[a>>2]=d&-2;c[r+4>>2]=f|1;c[r+f>>2]=f}a=f>>>3;if(f>>>0<256){b=190504+(a<<1<<2)|0;d=c[47616]|0;a=1<>2]|0;if(d>>>0<(c[47620]|0)>>>0)Va();else{p=d;q=a}}else{c[47616]=d|a;p=b;q=b+8|0}c[q>>2]=r;c[p+12>>2]=r;c[r+8>>2]=p;c[r+12>>2]=b;return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{p=(a+1048320|0)>>>16&8;q=a<>>16&4;q=q<>>16&2;a=14-(o|p|a)+(q<>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=190768+(a<<2)|0;c[r+28>>2]=a;c[r+20>>2]=0;c[r+16>>2]=0;d=c[47617]|0;b=1<>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}d=f<<((a|0)==31?0:25-(a>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=121;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){a=118;break}else{d=d<<1;e=a}}if((a|0)==118){if(b>>>0<(c[47620]|0)>>>0)Va();c[b>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}else if((a|0)==121){a=e+8|0;d=c[a>>2]|0;q=c[47620]|0;if(!(d>>>0>=q>>>0&e>>>0>=q>>>0))Va();c[d+12>>2]=r;c[a>>2]=r;c[r+8>>2]=d;c[r+12>>2]=e;c[r+24>>2]=0;return}}function q6(a,b){a=a|0;b=b|0;if(a>>>0<9){b=k6(b)|0;return b|0}else{b=r6(a,b)|0;return b|0}return 0}function r6(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;a=a>>>0>16?a:16;if(a+-1&a){d=16;while(1)if(d>>>0>>0)d=d<<1;else{a=d;break}}if((-64-a|0)>>>0<=b>>>0){c[(L1()|0)>>2]=12;h=0;return h|0}g=b>>>0<11?16:b+11&-8;d=k6(g+12+a|0)|0;if(!d){h=0;return h|0}f=d+-8|0;do if(d&a+-1){e=(d+a+-1&0-a)+-8|0;b=f;e=(e-b|0)>>>0>15?e:e+a|0;b=e-b|0;a=d+-4|0;i=c[a>>2]|0;d=(i&-8)-b|0;if(!(i&3)){c[e>>2]=(c[f>>2]|0)+b;c[e+4>>2]=d;a=e;b=e;break}else{i=e+4|0;c[i>>2]=d|c[i>>2]&1|2;d=e+d+4|0;c[d>>2]=c[d>>2]|1;c[a>>2]=b|c[a>>2]&1|2;c[i>>2]=c[i>>2]|1;p6(f,b);a=e;b=e;break}}else{a=f;b=f}while(0);a=a+4|0;d=c[a>>2]|0;if(d&3|0?(h=d&-8,h>>>0>(g+16|0)>>>0):0){i=h-g|0;h=b+g|0;c[a>>2]=g|d&1|2;c[h+4>>2]=i|3;g=h+i+4|0;c[g>>2]=c[g>>2]|1;p6(h,i)}i=b+8|0;return i|0}function s6(){}function t6(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (D=d,a-c>>>0|0)|0}function u6(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}f=h&-4|0;g=f-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(g|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(f|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}return h-e|0}function v6(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b<>>32-c;return a<>>0;return (D=b+d+(c>>>0>>0|0)>>>0,c|0)|0}function x6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;q=q+1|0;c[a>>2]=q;while((f|0)<(e|0)){if(!(c[d+(f<<3)>>2]|0)){c[d+(f<<3)>>2]=q;c[d+((f<<3)+4)>>2]=b;c[d+((f<<3)+8)>>2]=0;D=e;return d|0}f=f+1|0}e=e*2|0;d=n6(d|0,8*(e+1|0)|0)|0;d=x6(a|0,b|0,d|0,e|0)|0;D=e;return d|0}function y6(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>c;return a>>>c|(b&(1<>c-32|0}function z6(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>>c;return a>>>c|(b&(1<>>c-32|0}function A6(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;while((f|0)<(d|0)){e=c[b+(f<<3)>>2]|0;if(!e)break;if((e|0)==(a|0))return c[b+((f<<3)+4)>>2]|0;f=f+1|0}return 0}function B6(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return La(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function C6(b){b=b|0;var c=0;c=a[n+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[n+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[n+(b>>>24)>>0]|0)+24|0}function D6(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (D=n,f)|0}else{if(!g){n=0;f=0;return (D=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return (D=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(V(i|0)|0)-(V(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<>>(m>>>0)&b;g=0;i=l<>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return (D=n,f)|0}g=h-1|0;if(g&h|0){i=(V(h|0)|0)+33-(V(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<>>(o>>>0))&j|l<>31;break}if(f|0){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return (D=o,p)|0}else{p=C6(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (D=o,p)|0}}else{if(g){if(f|0){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (D=o,p)|0}if(!l){if(f|0){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (D=o,p)|0}g=i-1|0;if(!(g&i)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((C6(i|0)|0)>>>0);return (D=o,p)|0}g=(V(i|0)|0)-(V(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return (D=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=w6(m|0,l|0,-1,-1)|0;d=D;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;t6(k|0,d|0,e|0,n|0)|0;p=D;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=t6(e|0,n|0,o&m|0,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l|0)|0;b=D;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f|0){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (D=o,p)|0}function E6(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return D6(a,b,c,d,0)|0}function F6(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=S(e,f)|0;d=a>>>16;a=(c>>>16)+(S(e,d)|0)|0;e=b>>>16;b=S(e,f)|0;return (D=(a>>>16)+(S(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function G6(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=F6(e,f)|0;a=D;return (D=(S(b,f)|0)+(S(d,e)|0)+a|a&0,c|0|0)|0}function H6(a){a=a|0;var b=0,d=0;d=a+15&-16|0;b=c[i>>2]|0;a=b+d|0;if((d|0)>0&(a|0)<(b|0)|(a|0)<0){_()|0;Fa(12);return -1}c[i>>2]=a;if((a|0)>(Z()|0)?(Y()|0)==0:0){Fa(12);c[i>>2]=b;return -1}return b|0}function I6(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else B6(b,c,d)|0;return b|0}function J6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g|0;D6(a,b,d,e,f)|0;l=g;return (D=c[f+4>>2]|0,c[f>>2]|0)|0}function K6(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function L6(a){a=a|0;return (a&255)<<8|a>>8&255|0}function M6(a,b){a=a|0;b=b|0;db[a&127](b|0)}function N6(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return eb[a&63](b|0,c|0,d|0)|0}function O6(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;fb[a&31](b|0,c|0,d|0,e|0,f|0)}function P6(a){a=a|0;return +gb[a&1]()}function Q6(a,b){a=a|0;b=b|0;return +hb[a&1](b|0)}function R6(a){a=a|0;return ib[a&3]()|0}function S6(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return jb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)|0}function T6(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=+e;return kb[a&3](b|0,c|0,+d,+e)|0}function U6(a,b,c){a=a|0;b=b|0;c=c|0;lb[a&63](b|0,c|0)}function V6(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return mb[a&1](b|0,c|0,d|0,e|0,f|0,g|0)|0}function W6(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=g|0;nb[a&15](b|0,c|0,d|0,+e,+f,g|0)}function X6(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;ob[a&0](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function Y6(a,b){a=a|0;b=b|0;return pb[a&63](b|0)|0}function Z6(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;return +qb[a&7](+b,+c,+d)}function _6(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;rb[a&127](b|0,c|0,d|0)}function $6(a){a=a|0;sb[a&15]()}function a7(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return tb[a&127](b|0,c|0,d|0,e|0)|0}function b7(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;ub[a&15](b|0,c|0,d|0,e|0,f|0,g|0)}function c7(a,b,c){a=a|0;b=b|0;c=c|0;return vb[a&127](b|0,c|0)|0}function d7(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return wb[a&63](b|0,c|0,d|0,e|0,f|0)|0}function e7(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;xb[a&31](b|0,c|0,d|0,e|0)}function f7(a){a=a|0;W(0)}function g7(a,b,c){a=a|0;b=b|0;c=c|0;W(1);return 0}function h7(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;W(2)}function i7(){W(3);return 0.0}function j7(a){a=a|0;W(4);return 0.0}function k7(){W(5);return 0}function l7(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;W(6);return 0}function m7(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;W(7);return 0}function n7(a,b){a=a|0;b=b|0;W(8)}function o7(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;W(9);return 0}function p7(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=+e;f=f|0;W(10)}function q7(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;W(11)}function r7(a){a=a|0;W(12);return 0}function s7(a,b,c){a=+a;b=+b;c=+c;W(13);return 0.0}function t7(a,b,c){a=a|0;b=b|0;c=c|0;W(14)}function u7(){W(15)}function v7(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;W(16);return 0}function w7(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;W(17)}function x7(a,b){a=a|0;b=b|0;W(18);return 0}function y7(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;W(19);return 0}function z7(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;W(20)} - -// EMSCRIPTEN_END_FUNCS -var db=[f7,Jb,Kb,Ob,Pb,Qb,ic,jc,Hc,Ic,Jc,Kc,Lc,Mc,Nc,Zc,_c,bd,cd,dd,ed,fd,gd,hd,td,ud,vd,xd,yd,zd,Ad,Bd,Cd,Dd,Ed,Pd,Qd,Rd,Td,Ud,Vd,Wd,Xd,Yd,Zd,_d,$d,be,oe,pe,qe,re,Ce,De,Ee,Ge,Te,Ue,Ve,Xe,Ye,Ze,_e,$e,af,bf,cf,df,nf,of,pf,qf,Tf,Of,mm,Yl,ap,Bo,Lp,Up,Xn,Zn,Ip,Jp,Ul,Vl,$n,io,ko,vo,CB,VM,lN,XM,WM,HN,sM,vM,FS,KS,Hf,Al,Fo,Jo,bp,l6,Uv,qA,wG,pI,TU,yR,zQ,LL,lV,OX,hY,iY,oY,f7,f7,f7,f7,f7,f7,f7,f7,f7];var eb=[g7,Em,Jv,Az,Iz,Rz,Wz,TB,XB,UL,NP,OU,w_,C_,W$,a0,k$,q$,I1,J1,P1,Q1,N2,dA,Um,xv,op,kt,Sx,Ux,Xx,Yz,rG,i2,LD,z4,OO,QL,FR,jY,C0,K$,w0,G0,s4,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7];var fb=[h7,$c,Fd,Md,ae,Fe,F_,G_,W_,X_,t0,d0,e0,t$,u$,xl,uG,AQ,o_,p_,h7,h7,h7,h7,h7,h7,h7,h7,h7,h7,h7,h7];var gb=[i7,SO];var hb=[j7,ZO];var ib=[k7,Yq,RK,IL];var jb=[l7,F0,v0,l7];var kb=[m7,su,nu,m7];var lb=[n7,Pc,Uc,jd,od,Ld,he,xe,Me,kf,wf,$B,pN,TN,LN,GN,jN,kN,PN,QN,IS,MS,aM,gA,sG,TK,qQ,PW,NX,kY,lY,pY,rY,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7];var mb=[o7,PX];var nb=[p7,KH,LH,MH,NH,OH,PH,QH,RH,p7,p7,p7,p7,p7,p7,p7];var ob=[q7];var pb=[r7,$g,ug,Im,Jm,VB,YB,FQ,GQ,xS,yS,zS,AS,BS,CS,DS,ES,H1,Fb,oF,vl,yl,Xm,IK,qB,gC,pB,NK,SK,rB,rQ,HK,wQ,xQ,qY,k6,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7];var qb=[s7,bJ,cJ,dJ,eJ,s7,s7,s7];var rb=[t7,Rb,Sb,Vb,Gc,Oc,Qc,Tc,id,kd,nd,Gd,Hd,Kd,ce,de,ge,se,te,we,He,Ie,Le,ef,ff,jf,rf,sf,vf,lk,mk,nk,Fm,Bz,Jz,nA,DB,dC,NC,RD,jG,OJ,JL,VL,uM,OP,RP,fR,dR,GS,HS,JS,LS,NS,PU,CW,BW,GA,gB,rC,VC,YC,MK,PO,OL,uQ,yQ,DW,FW,GW,OW,QW,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7];var sb=[u7,RO,OK,PK,QK,UK,VK,WK,UU,u7,u7,u7,u7,u7,u7,u7];var tb=[v7,Gm,Or,Kv,Cz,Kz,SA,QD,TA,kB,zB,BB,MB,LB,_B,cC,eC,KL,PP,gR,eR,cT,QU,kV,jV,q_,r_,s_,t_,u_,v_,x_,A_,E_,Q$,R$,S$,T$,U$,V$,X$,_$,c0,e$,f$,g$,h$,i$,j$,l$,o$,s$,$z,RC,vG,QO,dZ,hZ,oZ,yZ,HZ,MZ,KZ,NZ,H0,j_,a_,M$,N$,D0,E0,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7];var ub=[w7,Ub,Sc,md,Jd,fe,ve,Ke,hf,uf,BQ,w7,w7,w7,w7,w7];var vb=[x7,xB,UB,ZB,RN,SN,JN,FN,nN,ZW,_W,$W,aX,bX,cX,eX,fX,gX,hX,iX,jX,kX,lX,mX,nX,oX,pX,qX,rX,sX,tX,uX,vX,wX,xX,yX,zX,AX,BX,CX,y_,z_,B_,Y_,Z_,__,$_,a$,b$,c$,d$,Y$,Z$,$$,m$,n$,p$,mF,kg,_g,Bh,di,vi,Gk,Ek,wl,zl,Wo,eq,gr,Cr,Er,Gr,Hr,Jr,Ir,Ur,et,jt,lt,qv,px,CE,BE,AE,tG,hC,KK,GG,WG,RG,SG,TH,Z3,W5,MO,_P,NA,cV,UA,WA,sQ,f2,DT,YW,mY,nY,n6,l_,m_,n_,J5,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7];var wb=[y7,yB,oN,KN,J0,K0,L0,M0,O0,P0,Q0,R0,S0,U0,V0,W0,X0,Y0,T0,w1,x1,n1,g1,Z0,_0,$0,b1,a1,c1,d1,e1,f1,h1,i1,j1,k1,l1,m1,o1,p1,q1,r1,v1,t1,s1,u1,C1,y1,z1,A1,B1,D1,E1,F1,y7,y7,y7,y7,y7,y7,y7,y7,y7,y7];var xb=[z7,Tb,Rc,ld,wd,Id,Sd,ee,ue,Je,We,gf,tf,Kf,Jf,If,Gf,Ff,Ef,hc,Df,Cf,AB,mN,IN,D_,b0,r$,k3,tQ,vQ,O$];return{_i64Subtract:t6,_memset:u6,_bitshift64Lshr:z6,_bitshift64Shl:v6,_fflush:m4,_bitshift64Ashr:y6,_vizLastErrorMessage:Gb,_sbrk:H6,_memcpy:B6,_llvm_bswap_i32:K6,___muldi3:G6,___uremdi3:J6,_testSetjmp:A6,_llvm_cttz_i32:C6,_vizCreateFile:Hb,___udivmoddi4:D6,_realloc:n6,_i64Add:w6,_llvm_bswap_i16:L6,_emscripten_get_global_libc:G1,_htons:L4,___udivdi3:E6,___errno_location:L1,___muldsi3:F6,_vizRenderFromString:Ib,_saveSetjmp:x6,_free:l6,_dtextract:Pz,_memmove:I6,_malloc:k6,_memalign:q6,runPostSets:s6,stackAlloc:yb,stackSave:zb,stackRestore:Ab,establishStackSpace:Bb,setTempRet0:Db,getTempRet0:Eb,setThrew:Cb,stackAlloc:yb,stackSave:zb,stackRestore:Ab,establishStackSpace:Bb,setThrew:Cb,setTempRet0:Db,getTempRet0:Eb,dynCall_vi:M6,dynCall_iiii:N6,dynCall_viiiii:O6,dynCall_d:P6,dynCall_di:Q6,dynCall_i:R6,dynCall_iiiiiiiiiii:S6,dynCall_iiidd:T6,dynCall_vii:U6,dynCall_iiiiiii:V6,dynCall_viiiddi:W6,dynCall_viiiiiiiii:X6,dynCall_ii:Y6,dynCall_dddd:Z6,dynCall_viii:_6,dynCall_v:$6,dynCall_iiiii:a7,dynCall_viiiiii:b7,dynCall_iii:c7,dynCall_iiiiii:d7,dynCall_viiii:e7}}) - - -// EMSCRIPTEN_END_ASM -(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var stackSave=Module["stackSave"]=asm["stackSave"];var _vizCreateFile=Module["_vizCreateFile"]=asm["_vizCreateFile"];var _vizLastErrorMessage=Module["_vizLastErrorMessage"]=asm["_vizLastErrorMessage"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var _vizRenderFromString=Module["_vizRenderFromString"]=asm["_vizRenderFromString"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _fflush=Module["_fflush"]=asm["_fflush"];var _bitshift64Ashr=Module["_bitshift64Ashr"]=asm["_bitshift64Ashr"];var _memset=Module["_memset"]=asm["_memset"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var ___uremdi3=Module["___uremdi3"]=asm["___uremdi3"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var _llvm_cttz_i32=Module["_llvm_cttz_i32"]=asm["_llvm_cttz_i32"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var ___udivmoddi4=Module["___udivmoddi4"]=asm["___udivmoddi4"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var _realloc=Module["_realloc"]=asm["_realloc"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _llvm_bswap_i16=Module["_llvm_bswap_i16"]=asm["_llvm_bswap_i16"];var _emscripten_get_global_libc=Module["_emscripten_get_global_libc"]=asm["_emscripten_get_global_libc"];var _htons=Module["_htons"]=asm["_htons"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var ___muldsi3=Module["___muldsi3"]=asm["___muldsi3"];var _testSetjmp=Module["_testSetjmp"]=asm["_testSetjmp"];var _saveSetjmp=Module["_saveSetjmp"]=asm["_saveSetjmp"];var _free=Module["_free"]=asm["_free"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var setThrew=Module["setThrew"]=asm["setThrew"];var _dtextract=Module["_dtextract"]=asm["_dtextract"];var _memmove=Module["_memmove"]=asm["_memmove"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var _malloc=Module["_malloc"]=asm["_malloc"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var _memalign=Module["_memalign"]=asm["_memalign"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_d=Module["dynCall_d"]=asm["dynCall_d"];var dynCall_di=Module["dynCall_di"]=asm["dynCall_di"];var dynCall_i=Module["dynCall_i"]=asm["dynCall_i"];var dynCall_iiiiiiiiiii=Module["dynCall_iiiiiiiiiii"]=asm["dynCall_iiiiiiiiiii"];var dynCall_iiidd=Module["dynCall_iiidd"]=asm["dynCall_iiidd"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_viiiddi=Module["dynCall_viiiddi"]=asm["dynCall_viiiddi"];var dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=asm["dynCall_viiiiiiiii"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_dddd=Module["dynCall_dddd"]=asm["dynCall_dddd"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiiiii=Module["dynCall_iiiiii"]=asm["dynCall_iiiiii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=Module["stackAlloc"];Runtime.stackSave=Module["stackSave"];Runtime.stackRestore=Module["stackRestore"];Runtime.establishStackSpace=Module["establishStackSpace"];Runtime.setTempRet0=Module["setTempRet0"];Runtime.getTempRet0=Module["getTempRet0"];Module["asm"]=asm;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["exit"](status)}Module["quit"](status,new ExitStatus(status))}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run() - - - - - - return Module; -}; -function Viz(src) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - var format = options.format === undefined ? "svg" : options.format; - var engine = options.engine === undefined ? "dot" : options.engine; - var scale = options.scale; - var totalMemory = options.totalMemory; - var files = options.files === undefined ? [] : options.files; - var images = options.images === undefined ? [] : options.images; - var i; - - for (i = 0; i < images.length; i++) { - files.push({ path: images[i].path, data: "\n\n" }); - } - - if (format == "png-image-element") { - return Viz.svgXmlToPngImageElement(render(src, "svg", engine, totalMemory, files), scale); - } else { - return render(src, format, engine, totalMemory, files); - } -} - -function render(src, format, engine, totalMemory, files) { - var graphviz = Module({ TOTAL_MEMORY: totalMemory }); - var i; - - for (i = 0; i < files.length; i++) { - graphviz["ccall"]("vizCreateFile", "number", ["string", "string"], [files[i].path, files[i].data]); - } - - var resultPointer = graphviz["ccall"]("vizRenderFromString", "number", ["string", "string", "string"], [src, format, engine]); - var resultString = graphviz["Pointer_stringify"](resultPointer); - - var errorMessagePointer = graphviz["ccall"]("vizLastErrorMessage", "number", [], []); - var errorMessageString = graphviz["Pointer_stringify"](errorMessagePointer); - - if (errorMessageString != "") { - throw new Error(errorMessageString); - } - - return resultString; -} - -// https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding -function b64EncodeUnicode(str) { - return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) { - return String.fromCharCode('0x' + p1); - })); -} - -Viz.svgXmlToPngImageElement = function(svgXml, scale, callback) { - if (scale === undefined) { - if ("devicePixelRatio" in window && window.devicePixelRatio > 1) { - scale = window.devicePixelRatio; - } else { - scale = 1; - } - } - - var pngImage = new Image(); - - try { - if (typeof fabric === "object" && fabric.loadSVGFromString) { - fabric.loadSVGFromString(svgXml, function(objects, options) { - // If there's something wrong with the SVG, Fabric may return an empty array of objects. Graphviz appears to give us at least one element back even given an empty graph, so we will assume an error in this case. - if (objects.length == 0) { - if (callback !== undefined) { - callback(new Error("Error loading SVG with Fabric")); - return; - } else { - throw new Error("Error loading SVG with Fabric"); - } - } - - var element = document.createElement("canvas"); - element.width = options.width; - element.height = options.height; - - var canvas = new fabric.Canvas(element, { enableRetinaScaling: false }); - var obj = fabric.util.groupSVGElements(objects, options); - canvas.add(obj).renderAll(); - - pngImage.src = canvas.toDataURL({ multiplier: scale }); - pngImage.width = options.width; - pngImage.height = options.height; - - if (callback !== undefined) { - callback(null, pngImage); - } - }); - } else { - var svgImage = new Image(); - - svgImage.onload = function() { - var canvas = document.createElement("canvas"); - canvas.width = svgImage.width * scale; - canvas.height = svgImage.height * scale; - - var context = canvas.getContext("2d"); - context.drawImage(svgImage, 0, 0, canvas.width, canvas.height); - - pngImage.src = canvas.toDataURL("image/png"); - pngImage.width = svgImage.width; - pngImage.height = svgImage.height; - - if (callback !== undefined) { - callback(null, pngImage); - } - } - - svgImage.onerror = function(e) { - var error; - - if ('error' in e) { - error = e.error; - } else { - error = new Error('Error loading SVG'); - } - - if (callback !== undefined) { - callback(error); - } else { - throw error; - } - } - - svgImage.src = "data:image/svg+xml;base64," + b64EncodeUnicode(svgXml); - } - } catch (e) { - if (callback !== undefined) { - callback(e); - } else { - throw e; - } - } - - if (callback === undefined) { - return pngImage; - } -} - -Viz.svgXmlToPngBase64 = function(svgXml, scale, callback) { - Viz.svgXmlToPngImageElement(svgXml, scale, function(err, image) { - if (err) { - callback(err); - } else { - callback(null, image.src.slice("data:image/png;base64,".length)); - } - }); -} -if (typeof module === "object" && module.exports) { - module.exports = Viz; -} else { - global.Viz = Viz; -} - -})(this); diff --git a/pkg/ui/v1alpha3/frontend/scripts/build.js b/pkg/ui/v1alpha3/frontend/scripts/build.js deleted file mode 100644 index e01b7a5ee2f..00000000000 --- a/pkg/ui/v1alpha3/frontend/scripts/build.js +++ /dev/null @@ -1,192 +0,0 @@ -'use strict'; - -// Do this as the first thing so that any code reading it knows the right env. -process.env.BABEL_ENV = 'production'; -process.env.NODE_ENV = 'production'; - -// Makes the script crash on unhandled rejections instead of silently -// ignoring them. In the future, promise rejections that are not handled will -// terminate the Node.js process with a non-zero exit code. -process.on('unhandledRejection', err => { - throw err; -}); - -// Ensure environment variables are read. -require('../config/env'); - - -const path = require('path'); -const chalk = require('react-dev-utils/chalk'); -const fs = require('fs-extra'); -const webpack = require('webpack'); -const bfj = require('bfj'); -const configFactory = require('../config/webpack.config'); -const paths = require('../config/paths'); -const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); -const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages'); -const printHostingInstructions = require('react-dev-utils/printHostingInstructions'); -const FileSizeReporter = require('react-dev-utils/FileSizeReporter'); -const printBuildError = require('react-dev-utils/printBuildError'); - -const measureFileSizesBeforeBuild = - FileSizeReporter.measureFileSizesBeforeBuild; -const printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild; -const useYarn = fs.existsSync(paths.yarnLockFile); - -// These sizes are pretty large. We'll warn for bundles exceeding them. -const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024; -const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024; - -const isInteractive = process.stdout.isTTY; - -// Warn and crash if required files are missing -if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { - process.exit(1); -} - -// Process CLI arguments -const argv = process.argv.slice(2); -const writeStatsJson = argv.indexOf('--stats') !== -1; - -// Generate configuration -const config = configFactory('production'); - -// We require that you explicitly set browsers and do not fall back to -// browserslist defaults. -const { checkBrowsers } = require('react-dev-utils/browsersHelper'); -checkBrowsers(paths.appPath, isInteractive) - .then(() => { - // First, read the current file sizes in build directory. - // This lets us display how much they changed later. - return measureFileSizesBeforeBuild(paths.appBuild); - }) - .then(previousFileSizes => { - // Remove all content but keep the directory so that - // if you're in it, you don't end up in Trash - fs.emptyDirSync(paths.appBuild); - // Merge with the public folder - copyPublicFolder(); - // Start the webpack build - return build(previousFileSizes); - }) - .then( - ({ stats, previousFileSizes, warnings }) => { - if (warnings.length) { - console.log(chalk.yellow('Compiled with warnings.\n')); - console.log(warnings.join('\n\n')); - console.log( - '\nSearch for the ' + - chalk.underline(chalk.yellow('keywords')) + - ' to learn more about each warning.' - ); - console.log( - 'To ignore, add ' + - chalk.cyan('// eslint-disable-next-line') + - ' to the line before.\n' - ); - } else { - console.log(chalk.green('Compiled successfully.\n')); - } - - console.log('File sizes after gzip:\n'); - printFileSizesAfterBuild( - stats, - previousFileSizes, - paths.appBuild, - WARN_AFTER_BUNDLE_GZIP_SIZE, - WARN_AFTER_CHUNK_GZIP_SIZE - ); - console.log(); - - const appPackage = require(paths.appPackageJson); - const publicUrl = paths.publicUrl; - const publicPath = config.output.publicPath; - const buildFolder = path.relative(process.cwd(), paths.appBuild); - printHostingInstructions( - appPackage, - publicUrl, - publicPath, - buildFolder, - useYarn - ); - }, - err => { - console.log(chalk.red('Failed to compile.\n')); - printBuildError(err); - process.exit(1); - } - ) - .catch(err => { - if (err && err.message) { - console.log(err.message); - } - process.exit(1); - }); - -// Create the production build and print the deployment instructions. -function build(previousFileSizes) { - console.log('Creating an optimized production build...'); - - let compiler = webpack(config); - return new Promise((resolve, reject) => { - compiler.run((err, stats) => { - let messages; - if (err) { - if (!err.message) { - return reject(err); - } - messages = formatWebpackMessages({ - errors: [err.message], - warnings: [], - }); - } else { - messages = formatWebpackMessages( - stats.toJson({ all: false, warnings: true, errors: true }) - ); - } - if (messages.errors.length) { - // Only keep the first error. Others are often indicative - // of the same problem, but confuse the reader with noise. - if (messages.errors.length > 1) { - messages.errors.length = 1; - } - return reject(new Error(messages.errors.join('\n\n'))); - } - if ( - process.env.CI && - (typeof process.env.CI !== 'string' || - process.env.CI.toLowerCase() !== 'false') && - messages.warnings.length - ) { - console.log( - chalk.yellow( - '\nTreating warnings as errors because process.env.CI = true.\n' + - 'Most CI servers set it automatically.\n' - ) - ); - return reject(new Error(messages.warnings.join('\n\n'))); - } - - const resolveArgs = { - stats, - previousFileSizes, - warnings: messages.warnings, - }; - if (writeStatsJson) { - return bfj - .write(paths.appBuild + '/bundle-stats.json', stats.toJson()) - .then(() => resolve(resolveArgs)) - .catch(error => reject(new Error(error))); - } - - return resolve(resolveArgs); - }); - }); -} - -function copyPublicFolder() { - fs.copySync(paths.appPublic, paths.appBuild, { - dereference: true, - filter: file => file !== paths.appHtml, - }); -} diff --git a/pkg/ui/v1alpha3/frontend/scripts/check-format-error.js b/pkg/ui/v1alpha3/frontend/scripts/check-format-error.js deleted file mode 100644 index 476196e26a3..00000000000 --- a/pkg/ui/v1alpha3/frontend/scripts/check-format-error.js +++ /dev/null @@ -1,6 +0,0 @@ -console.error(); -console.error('-----------------------------------------------'); -console.error('Please run `npm run format:write` to format your code.'); -console.error('-----------------------------------------------'); -console.error(); -process.exit(1); diff --git a/pkg/ui/v1alpha3/frontend/scripts/start.js b/pkg/ui/v1alpha3/frontend/scripts/start.js deleted file mode 100644 index 06bfbb12110..00000000000 --- a/pkg/ui/v1alpha3/frontend/scripts/start.js +++ /dev/null @@ -1,133 +0,0 @@ -'use strict'; - -// Do this as the first thing so that any code reading it knows the right env. -process.env.BABEL_ENV = 'development'; -process.env.NODE_ENV = 'development'; - -// Makes the script crash on unhandled rejections instead of silently -// ignoring them. In the future, promise rejections that are not handled will -// terminate the Node.js process with a non-zero exit code. -process.on('unhandledRejection', err => { - throw err; -}); - -// Ensure environment variables are read. -require('../config/env'); - - -const fs = require('fs'); -const chalk = require('react-dev-utils/chalk'); -const webpack = require('webpack'); -const WebpackDevServer = require('webpack-dev-server'); -const clearConsole = require('react-dev-utils/clearConsole'); -const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); -const { - choosePort, - createCompiler, - prepareProxy, - prepareUrls, -} = require('react-dev-utils/WebpackDevServerUtils'); -const openBrowser = require('react-dev-utils/openBrowser'); -const paths = require('../config/paths'); -const configFactory = require('../config/webpack.config'); -const createDevServerConfig = require('../config/webpackDevServer.config'); - -const useYarn = fs.existsSync(paths.yarnLockFile); -const isInteractive = process.stdout.isTTY; - -// Warn and crash if required files are missing -if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { - process.exit(1); -} - -// Tools like Cloud9 rely on this. -const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3000; -const HOST = process.env.HOST || '0.0.0.0'; - -if (process.env.HOST) { - console.log( - chalk.cyan( - `Attempting to bind to HOST environment variable: ${chalk.yellow( - chalk.bold(process.env.HOST) - )}` - ) - ); - console.log( - `If this was unintentional, check that you haven't mistakenly set it in your shell.` - ); - console.log( - `Learn more here: ${chalk.yellow('https://bit.ly/CRA-advanced-config')}` - ); - console.log(); -} - -// We require that you explictly set browsers and do not fall back to -// browserslist defaults. -const { checkBrowsers } = require('react-dev-utils/browsersHelper'); -checkBrowsers(paths.appPath, isInteractive) - .then(() => { - // We attempt to use the default port but if it is busy, we offer the user to - // run on a different port. `choosePort()` Promise resolves to the next free port. - return choosePort(HOST, DEFAULT_PORT); - }) - .then(port => { - if (port == null) { - // We have not found a port. - return; - } - const config = configFactory('development'); - const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; - const appName = require(paths.appPackageJson).name; - const useTypeScript = fs.existsSync(paths.appTsConfig); - const urls = prepareUrls(protocol, HOST, port); - const devSocket = { - warnings: warnings => - devServer.sockWrite(devServer.sockets, 'warnings', warnings), - errors: errors => - devServer.sockWrite(devServer.sockets, 'errors', errors), - }; - // Create a webpack compiler that is configured with custom messages. - const compiler = createCompiler({ - appName, - config, - devSocket, - urls, - useYarn, - useTypeScript, - webpack, - }); - // Load proxy config - const proxySetting = require(paths.appPackageJson).proxy; - const proxyConfig = prepareProxy(proxySetting, paths.appPublic); - // Serve webpack assets generated by the compiler over a web server. - const serverConfig = createDevServerConfig( - proxyConfig, - urls.lanUrlForConfig - ); - const devServer = new WebpackDevServer(compiler, serverConfig); - // Launch WebpackDevServer. - devServer.listen(port, HOST, err => { - if (err) { - return console.log(err); - } - if (isInteractive) { - clearConsole(); - } - console.log(chalk.cyan(`Starting the development server on ${HOST}:${port}...\n`)); - openBrowser(urls.localUrlForBrowser); - }); - - ['SIGINT', 'SIGTERM', 'SIGQUIT'].forEach(function(sig) { - process.on(sig, function() { - console.log("Terminating"); - devServer.close(); - process.exit(); - }); - }); - }) - .catch(err => { - if (err && err.message) { - console.log(err.message); - } - process.exit(1); - }); diff --git a/pkg/ui/v1alpha3/frontend/scripts/test.js b/pkg/ui/v1alpha3/frontend/scripts/test.js deleted file mode 100644 index 4172e422c75..00000000000 --- a/pkg/ui/v1alpha3/frontend/scripts/test.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; - -// Do this as the first thing so that any code reading it knows the right env. -process.env.BABEL_ENV = 'test'; -process.env.NODE_ENV = 'test'; -process.env.PUBLIC_URL = ''; - -// Makes the script crash on unhandled rejections instead of silently -// ignoring them. In the future, promise rejections that are not handled will -// terminate the Node.js process with a non-zero exit code. -process.on('unhandledRejection', err => { - throw err; -}); - -// Ensure environment variables are read. -require('../config/env'); - - -const jest = require('jest'); -const execSync = require('child_process').execSync; -let argv = process.argv.slice(2); - -function isInGitRepository() { - try { - execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore' }); - return true; - } catch (e) { - return false; - } -} - -function isInMercurialRepository() { - try { - execSync('hg --cwd . root', { stdio: 'ignore' }); - return true; - } catch (e) { - return false; - } -} - -// Watch unless on CI, in coverage mode, explicitly adding `--no-watch`, -// or explicitly running all tests -if ( - !process.env.CI && - argv.indexOf('--coverage') === -1 && - argv.indexOf('--no-watch') === -1 && - argv.indexOf('--watchAll') === -1 -) { - // https://github.com/facebook/create-react-app/issues/5210 - const hasSourceControl = isInGitRepository() || isInMercurialRepository(); - argv.push(hasSourceControl ? '--watch' : '--watchAll'); -} - -// Jest doesn't have this option so we'll remove it -if (argv.indexOf('--no-watch') !== -1) { - argv = argv.filter(arg => arg !== '--no-watch'); -} - - -jest.run(argv); diff --git a/pkg/ui/v1alpha3/frontend/src/actions/generalActions.js b/pkg/ui/v1alpha3/frontend/src/actions/generalActions.js deleted file mode 100644 index bc4da0497c5..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/actions/generalActions.js +++ /dev/null @@ -1,114 +0,0 @@ -export const TOGGLE_MENU = 'TOGGLE_MENU'; - -export const toggleMenu = state => { - return { - type: TOGGLE_MENU, - state, - }; -}; - -export const CLOSE_SNACKBAR = 'CLOSE_SNACKBAR'; - -export const closeSnackbar = () => { - return { - type: CLOSE_SNACKBAR, - }; -}; - -export const SUBMIT_YAML_REQUEST = 'SUBMIT_YAML_REQUEST'; -export const SUBMIT_YAML_FAILURE = 'SUBMIT_YAML_FAILURE'; -export const SUBMIT_YAML_SUCCESS = 'SUBMIT_YAML_SUCCESS'; - -export const submitYaml = (yaml, globalNamespace) => ({ - type: SUBMIT_YAML_REQUEST, - yaml, - globalNamespace, -}); - -export const DELETE_EXPERIMENT_REQUEST = 'DELETE_EXPERIMENT_REQUEST'; -export const DELETE_EXPERIMENT_FAILURE = 'DELETE_EXPERIMENT_FAILURE'; -export const DELETE_EXPERIMENT_SUCCESS = 'DELETE_EXPERIMENT_SUCCESS'; - -export const deleteExperiment = (name, namespace) => ({ - type: DELETE_EXPERIMENT_REQUEST, - name, - namespace, -}); - -export const OPEN_DELETE_EXPERIMENT_DIALOG = 'OPEN_DELETE_EXPERIMENT_DIALOG'; - -export const openDeleteExperimentDialog = (name, namespace) => ({ - type: OPEN_DELETE_EXPERIMENT_DIALOG, - name, - namespace, -}); - -export const CLOSE_DELETE_EXPERIMENT_DIALOG = 'CLOSE_DELETE_EXPERIMENT_DIALOG'; - -export const closeDeleteExperimentDialog = () => ({ - type: CLOSE_DELETE_EXPERIMENT_DIALOG, -}); - -export const FETCH_NAMESPACES_REQUEST = 'FETCH_NAMESPACES_REQUEST'; -export const FETCH_NAMESPACES_SUCCESS = 'FETCH_NAMESPACES_SUCCESS'; -export const FETCH_NAMESPACES_FAILURE = 'FETCH_NAMESPACES_FAILURE'; - -export const fetchNamespaces = () => ({ - type: FETCH_NAMESPACES_REQUEST, -}); - -export const CHANGE_GLOBAL_NAMESPACE = 'CHANGE_GLOBAL_NAMESPACE'; - -export const FETCH_EXPERIMENT_REQUEST = 'FETCH_EXPERIMENT_REQUEST'; -export const FETCH_EXPERIMENT_SUCCESS = 'FETCH_EXPERIMENT_SUCCESS'; -export const FETCH_EXPERIMENT_FAILURE = 'FETCH_EXPERIMENT_FAILURE'; - -export const fetchExperiment = (name, namespace) => ({ - type: FETCH_EXPERIMENT_REQUEST, - name, - namespace, -}); - -export const CLOSE_DIALOG_EXPERIMENT = 'CLOSE_DIALOG_EXPERIMENT'; - -export const closeDialogExperiment = () => ({ - type: CLOSE_DIALOG_EXPERIMENT, -}); - -export const FETCH_SUGGESTION_REQUEST = 'FETCH_SUGGESTION_REQUEST'; -export const FETCH_SUGGESTION_SUCCESS = 'FETCH_SUGGESTION_SUCCESS'; -export const FETCH_SUGGESTION_FAILURE = 'FETCH_SUGGESTION_FAILURE'; - -export const fetchSuggestion = (name, namespace) => ({ - type: FETCH_SUGGESTION_REQUEST, - name, - namespace, -}); - -export const CLOSE_DIALOG_SUGGESTION = 'CLOSE_DIALOG_SUGGESTION'; - -export const closeDialogSuggestion = () => ({ - type: CLOSE_DIALOG_SUGGESTION, -}); - -export const FILTER_TEMPLATES_EXPERIMENT = 'FILTER_TEMPLATES_EXPERIMENT'; - -export const filterTemplatesExperiment = (trialNamespace, trialConfigMapName) => ({ - type: FILTER_TEMPLATES_EXPERIMENT, - trialNamespace, - trialConfigMapName, -}); - -export const CHANGE_TEMPLATE_NAME = 'CHANGE_TEMPLATE_NAME'; - -export const changeTemplateName = templateName => ({ - type: CHANGE_TEMPLATE_NAME, - templateName, -}); - -export const VALIDATION_ERROR = 'VALIDATION_ERROR'; - -export const validationError = message => ({ - type: VALIDATION_ERROR, - message, -}); diff --git a/pkg/ui/v1alpha3/frontend/src/actions/hpCreateActions.js b/pkg/ui/v1alpha3/frontend/src/actions/hpCreateActions.js deleted file mode 100644 index bd1b1260323..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/actions/hpCreateActions.js +++ /dev/null @@ -1,209 +0,0 @@ -export const CHANGE_YAML_HP = 'CHANGE_YAML_HP'; - -export const changeYaml = yaml => ({ - type: CHANGE_YAML_HP, - payload: yaml, -}); - -export const CHANGE_META_HP = 'CHANGE_META_HP'; - -export const changeMeta = (name, value) => ({ - type: CHANGE_META_HP, - name, - value, -}); - -export const CHANGE_SPEC_HP = 'CHANGE_SPEC_HP'; - -export const changeSpec = (name, value) => ({ - type: CHANGE_SPEC_HP, - name, - value, -}); - -export const CHANGE_OBJECTIVE_HP = 'CHANGE_OBJECTIVE_HP'; - -export const changeObjective = (name, value) => ({ - type: CHANGE_OBJECTIVE_HP, - name, - value, -}); -export const ADD_METRICS_HP = 'ADD_METRICS_HP'; - -export const addMetrics = () => ({ - type: ADD_METRICS_HP, -}); - -export const DELETE_METRICS_HP = 'DELETE_METRICS_HP'; - -export const deleteMetrics = index => ({ - type: DELETE_METRICS_HP, - index, -}); - -export const EDIT_METRICS_HP = 'EDIT_METRICS_HP'; - -export const editMetrics = (index, value) => ({ - type: EDIT_METRICS_HP, - index, - value, -}); - -export const CHANGE_ALGORITHM_NAME_HP = 'CHANGE_ALGORITHM_NAME_HP'; - -export const changeAlgorithmName = algorithmName => ({ - type: CHANGE_ALGORITHM_NAME_HP, - algorithmName, -}); - -export const ADD_ALGORITHM_SETTING_HP = 'ADD_ALGORITHM_SETTING_HP'; - -export const addAlgorithmSetting = () => ({ - type: ADD_ALGORITHM_SETTING_HP, -}); - -export const CHANGE_ALGORITHM_SETTING_HP = 'CHANGE_ALGORITHM_SETTING_HP'; - -export const changeAlgorithmSetting = (index, field, value) => ({ - type: CHANGE_ALGORITHM_SETTING_HP, - field, - value, - index, -}); - -export const DELETE_ALGORITHM_SETTING_HP = 'DELETE_ALGORITHM_SETTING_HP'; - -export const deleteAlgorithmSetting = index => ({ - type: DELETE_ALGORITHM_SETTING_HP, - index, -}); - -export const ADD_PARAMETER_HP = 'CHANGE_PARAMETER_HP'; - -export const addParameter = () => ({ - type: ADD_PARAMETER_HP, -}); - -export const EDIT_PARAMETER_HP = 'EDIT_PARAMTER_HP'; - -export const editParameter = (index, field, value) => ({ - type: EDIT_PARAMETER_HP, - index, - field, - value, -}); - -export const DELETE_PARAMETER_HP = 'DELETE_PARAMETER_HP'; - -export const deleteParameter = index => ({ - type: DELETE_PARAMETER_HP, - index, -}); - -export const ADD_LIST_PARAMETER_HP = 'ADD_LIST_PARAMETER_HP'; - -export const addListParameter = paramIndex => ({ - type: ADD_LIST_PARAMETER_HP, - paramIndex, -}); - -export const EDIT_LIST_PARAMETER_HP = 'EDIT_LIST_PARAMETER_HP'; - -export const editListParameter = (paramIndex, index, value) => ({ - type: EDIT_LIST_PARAMETER_HP, - paramIndex, - index, - value, -}); - -export const DELETE_LIST_PARAMETER_HP = 'DELETE_LIST_PARAMETER_HP'; - -export const deleteListParameter = (paramIndex, index) => ({ - type: DELETE_LIST_PARAMETER_HP, - paramIndex, - index, -}); - -export const SUBMIT_HP_JOB_REQUEST = 'SUBMIT_HP_JOB_REQUEST'; -export const SUBMIT_HP_JOB_SUCCESS = 'SUBMIT_HP_JOB_SUCCESS'; -export const SUBMIT_HP_JOB_FAILURE = 'SUBMIT_HP_JOB_FAILURE'; - -export const submitHPJob = data => ({ - type: SUBMIT_HP_JOB_REQUEST, - data, -}); - -export const CHANGE_MC_KIND_HP = 'CHANGE_MC_KIND_HP'; - -export const changeMCKindHP = kind => ({ - type: CHANGE_MC_KIND_HP, - kind, -}); - -export const CHANGE_MC_FILE_SYSTEM_HP = 'CHANGE_MC_FILE_SYSTEM_HP'; - -export const changeMCFileSystemHP = (kind, path) => ({ - type: CHANGE_MC_FILE_SYSTEM_HP, - kind, - path, -}); - -export const CHANGE_MC_HTTP_GET_HP = 'CHANGE_MC_HTTP_GET_HP'; - -export const changeMCHttpGetHP = (port, path, scheme, host) => ({ - type: CHANGE_MC_HTTP_GET_HP, - port, - path, - scheme, - host, -}); - -export const ADD_MC_HTTP_GET_HEADER_HP = 'ADD_MC_HTTP_GET_HEADER_HP'; - -export const addMCHttpGetHeaderHP = () => ({ - type: ADD_MC_HTTP_GET_HEADER_HP, -}); - -export const CHANGE_MC_HTTP_GET_HEADER_HP = 'CHANGE_MC_HTTP_GET_HEADER_HP'; - -export const changeMCHttpGetHeaderHP = (fieldName, value, index) => ({ - type: CHANGE_MC_HTTP_GET_HEADER_HP, - fieldName, - value, - index, -}); - -export const DELETE_MC_HTTP_GET_HEADER_HP = 'DELETE_MC_HTTP_GET_HEADER_HP'; - -export const deleteMCHttpGetHeaderHP = index => ({ - type: DELETE_MC_HTTP_GET_HEADER_HP, - index, -}); - -export const ADD_MC_METRICS_FORMAT_HP = 'ADD_MC_METRICS_FORMAT_HP'; - -export const addMCMetricsFormatHP = () => ({ - type: ADD_MC_METRICS_FORMAT_HP, -}); - -export const CHANGE_MC_METRIC_FORMAT_HP = 'CHANGE_MC_METRIC_FORMAT_HP'; - -export const changeMCMetricsFormatHP = (format, index) => ({ - type: CHANGE_MC_METRIC_FORMAT_HP, - format, - index, -}); - -export const DELETE_MC_METRIC_FORMAT_HP = 'DELETE_MC_METRIC_FORMAT_HP'; - -export const deleteMCMetricsFormatHP = index => ({ - type: DELETE_MC_METRIC_FORMAT_HP, - index, -}); - -export const CHANGE_MC_CUSTOM_CONTAINER_HP = 'CHANGE_MC_CUSTOM_CONTAINER_HP'; - -export const changeMCCustomContainerHP = yamlContainer => ({ - type: CHANGE_MC_CUSTOM_CONTAINER_HP, - yamlContainer, -}); diff --git a/pkg/ui/v1alpha3/frontend/src/actions/hpMonitorActions.js b/pkg/ui/v1alpha3/frontend/src/actions/hpMonitorActions.js deleted file mode 100644 index 3df7803c9ae..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/actions/hpMonitorActions.js +++ /dev/null @@ -1,49 +0,0 @@ -export const FILTER_JOBS = 'FILTER_JOBS'; - -export const filterJobs = (experimentName, experimentNamespace) => ({ - type: FILTER_JOBS, - experimentName, - experimentNamespace, -}); - -export const CHANGE_TYPE = 'CHANGE_TYPE'; - -export const changeType = (filter, checked) => ({ - type: CHANGE_TYPE, - filter, - checked, -}); - -export const FETCH_HP_JOBS_REQUEST = 'FETCH_HP_JOBS_REQUEST'; -export const FETCH_HP_JOBS_SUCCESS = 'FETCH_HP_JOBS_SUCCESS'; -export const FETCH_HP_JOBS_FAILURE = 'FETCH_HP_JOBS_FAILURE'; - -export const fetchHPJobs = () => ({ - type: FETCH_HP_JOBS_REQUEST, -}); - -export const FETCH_HP_JOB_INFO_REQUEST = 'FETCH_HP_JOB_INFO_REQUEST'; -export const FETCH_HP_JOB_INFO_SUCCESS = 'FETCH_HP_JOB_INFO_SUCCESS'; -export const FETCH_HP_JOB_INFO_FAILURE = 'FETCH_HP_JOB_INFO_FAILURE'; - -export const fetchHPJobInfo = (name, namespace) => ({ - type: FETCH_HP_JOB_INFO_REQUEST, - name, - namespace, -}); - -export const FETCH_HP_JOB_TRIAL_INFO_REQUEST = 'FETCH_HP_JOB_TRIAL_INFO_REQUEST'; -export const FETCH_HP_JOB_TRIAL_INFO_SUCCESS = 'FETCH_HP_JOB_TRIAL_INFO_SUCCESS'; -export const FETCH_HP_JOB_TRIAL_INFO_FAILURE = 'FETCH_HP_JOB_TRIAL_INFO_FAILURE'; - -export const fetchHPJobTrialInfo = (trialName, namespace) => ({ - type: FETCH_HP_JOB_TRIAL_INFO_REQUEST, - trialName, - namespace, -}); - -export const CLOSE_DIALOG_TRIAL = 'CLOSE_DIALOG_TRIAL'; - -export const closeDialogTrial = () => ({ - type: CLOSE_DIALOG_TRIAL, -}); diff --git a/pkg/ui/v1alpha3/frontend/src/actions/nasCreateActions.js b/pkg/ui/v1alpha3/frontend/src/actions/nasCreateActions.js deleted file mode 100644 index 3ac2429645e..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/actions/nasCreateActions.js +++ /dev/null @@ -1,274 +0,0 @@ -export const CHANGE_YAML_NAS = 'CHANGE_YAML_NAS'; - -export const changeYaml = yaml => ({ - type: CHANGE_YAML_NAS, - payload: yaml, -}); - -export const CHANGE_META_NAS = 'CHANGE_META_NAS'; - -export const changeMeta = (name, value) => ({ - type: CHANGE_META_NAS, - name, - value, -}); - -export const CHANGE_SPEC_NAS = 'CHANGE_SPEC_NAS'; - -export const changeSpec = (name, value) => ({ - type: CHANGE_SPEC_NAS, - name, - value, -}); - -export const CHANGE_OBJECTIVE_NAS = 'CHANGE_OBJECTIVE_NAS'; - -export const changeObjective = (name, value) => ({ - type: CHANGE_OBJECTIVE_NAS, - name, - value, -}); - -export const ADD_METRICS_NAS = 'ADD_METRICS_NAS'; - -export const addMetrics = () => ({ - type: ADD_METRICS_NAS, -}); - -export const DELETE_METRICS_NAS = 'DELETE_METRICS_NAS'; - -export const deleteMetrics = index => ({ - type: DELETE_METRICS_NAS, - index, -}); - -export const EDIT_METRICS_NAS = 'EDIT_METRICS_NAS'; - -export const editMetrics = (index, value) => ({ - type: EDIT_METRICS_NAS, - index, - value, -}); - -export const CHANGE_ALGORITHM_NAME_NAS = 'CHANGE_ALGORITHM_NAME_NAS'; - -export const changeAlgorithmName = algorithmName => ({ - type: CHANGE_ALGORITHM_NAME_NAS, - algorithmName, -}); - -export const ADD_ALGORITHM_SETTING_NAS = 'ADD_ALGORITHM_SETTING_NAS'; - -export const addAlgorithmSetting = () => ({ - type: ADD_ALGORITHM_SETTING_NAS, -}); - -export const CHANGE_ALGORITHM_SETTING_NAS = 'CHANGE_ALGORITHM_SETTING_NAS'; - -export const changeAlgorithmSetting = (index, field, value) => ({ - type: CHANGE_ALGORITHM_SETTING_NAS, - field, - value, - index, -}); - -export const DELETE_ALGORITHM_SETTING_NAS = 'DELETE_ALGORITHM_SETTING_NAS'; - -export const deleteAlgorithmSetting = index => ({ - type: DELETE_ALGORITHM_SETTING_NAS, - index, -}); - -export const EDIT_NUM_LAYERS = 'EDIT_NUM_LAYERS'; - -export const editNumLayers = value => ({ - type: EDIT_NUM_LAYERS, - value, -}); - -export const ADD_SIZE = 'ADD_SIZE'; - -export const addSize = sizeType => ({ - type: ADD_SIZE, - sizeType, -}); - -export const EDIT_SIZE = 'EDIT_SIZE'; - -export const editSize = (sizeType, index, value) => ({ - type: EDIT_SIZE, - sizeType, - index, - value, -}); - -export const DELETE_SIZE = 'DELETE_SIZE'; - -export const deleteSize = (sizeType, index) => ({ - type: DELETE_SIZE, - sizeType, - index, -}); - -export const ADD_OPERATION = 'ADD_OPERATION'; - -export const addOperation = () => ({ - type: ADD_OPERATION, -}); - -export const DELETE_OPERATION = 'DELETE_OPERATION'; - -export const deleteOperation = index => ({ - type: DELETE_OPERATION, - index, -}); - -export const CHANGE_OPERATION = 'CHANGE_OPERATION'; - -export const changeOperation = (index, value) => ({ - type: CHANGE_OPERATION, - index, - value, -}); - -export const ADD_PARAMETER_NAS = 'ADD_PARAMETER_NAS'; - -export const addParameter = opIndex => ({ - type: ADD_PARAMETER_NAS, - opIndex, -}); - -export const CHANGE_PARAMETER_NAS = 'CHANGE_PARAMETER_NAS'; - -export const changeParameter = (opIndex, paramIndex, field, value) => ({ - type: CHANGE_PARAMETER_NAS, - opIndex, - paramIndex, - field, - value, -}); - -export const DELETE_PARAMETER_NAS = 'DELETE_PARAMETER_NAS'; - -export const deleteParameter = (opIndex, paramIndex) => ({ - type: DELETE_PARAMETER_NAS, - opIndex, - paramIndex, -}); - -export const ADD_LIST_PARAMETER_NAS = 'ADD_LIST_PARAMETER_NAS'; - -export const addListParameter = (opIndex, paramIndex) => ({ - type: ADD_LIST_PARAMETER_NAS, - opIndex, - paramIndex, -}); - -export const EDIT_LIST_PARAMETER_NAS = 'EDIT_LIST_PARAMETER_NAS'; - -export const editListParameter = (opIndex, paramIndex, listIndex, value) => ({ - type: EDIT_LIST_PARAMETER_NAS, - opIndex, - paramIndex, - listIndex, - value, -}); - -export const DELETE_LIST_PARAMETER_NAS = 'DELETE_LIST_PARAMETER_NAS'; - -export const deleteListParameter = (opIndex, paramIndex, listIndex) => ({ - type: DELETE_LIST_PARAMETER_NAS, - opIndex, - paramIndex, - listIndex, -}); - -export const SUBMIT_NAS_JOB_REQUEST = 'SUBMIT_NAS_JOB_REQUEST'; -export const SUBMIT_NAS_JOB_SUCCESS = 'SUBMIT_NAS_JOB_SUCCESS'; -export const SUBMIT_NAS_JOB_FAILURE = 'SUBMIT_NAS_JOB_FAILURE'; - -export const submitNASJob = data => ({ - type: SUBMIT_NAS_JOB_REQUEST, - data, -}); - -export const CLOSE_SNACKBAR = 'CLOSE_SNACKBAR'; - -export const closeSnackbar = () => ({ - type: CLOSE_SNACKBAR, -}); - -export const CHANGE_MC_KIND_NAS = 'CHANGE_MC_KIND_NAS'; - -export const changeMCKindNAS = kind => ({ - type: CHANGE_MC_KIND_NAS, - kind, -}); - -export const CHANGE_MC_FILE_SYSTEM_NAS = 'CHANGE_MC_FILE_SYSTEM_NAS'; - -export const changeMCFileSystemNAS = (kind, path) => ({ - type: CHANGE_MC_FILE_SYSTEM_NAS, - kind, - path, -}); - -export const CHANGE_MC_HTTP_GET_NAS = 'CHANGE_MC_HTTP_GET_NAS'; - -export const changeMCHttpGetNAS = (port, path, scheme, host) => ({ - type: CHANGE_MC_HTTP_GET_NAS, - port, - path, - scheme, - host, -}); - -export const ADD_MC_HTTP_GET_HEADER_NAS = 'ADD_MC_HTTP_GET_HEADER_NAS'; - -export const addMCHttpGetHeaderNAS = () => ({ - type: ADD_MC_HTTP_GET_HEADER_NAS, -}); - -export const CHANGE_MC_HTTP_GET_HEADER_NAS = 'CHANGE_MC_HTTP_GET_HEADER_NAS'; - -export const changeMCHttpGetHeaderNAS = (fieldName, value, index) => ({ - type: CHANGE_MC_HTTP_GET_HEADER_NAS, - fieldName, - value, - index, -}); - -export const DELETE_MC_HTTP_GET_HEADER_NAS = 'DELETE_MC_HTTP_GET_HEADER_NAS'; - -export const deleteMCHttpGetHeaderNAS = index => ({ - type: DELETE_MC_HTTP_GET_HEADER_NAS, - index, -}); - -export const ADD_MC_METRICS_FORMAT_NAS = 'ADD_MC_METRICS_FORMAT_NAS'; - -export const addMCMetricsFormatNAS = () => ({ - type: ADD_MC_METRICS_FORMAT_NAS, -}); - -export const CHANGE_MC_METRIC_FORMAT_NAS = 'CHANGE_MC_METRIC_FORMAT_NAS'; - -export const changeMCMetricsFormatNAS = (format, index) => ({ - type: CHANGE_MC_METRIC_FORMAT_NAS, - format, - index, -}); - -export const DELETE_MC_METRIC_FORMAT_NAS = 'DELETE_MC_METRIC_FORMAT_NAS'; - -export const deleteMCMetricsFormatNAS = index => ({ - type: DELETE_MC_METRIC_FORMAT_NAS, - index, -}); - -export const CHANGE_MC_CUSTOM_CONTAINER_NAS = 'CHANGE_MC_CUSTOM_CONTAINER_NAS'; - -export const changeMCCustomContainerNAS = yamlContainer => ({ - type: CHANGE_MC_CUSTOM_CONTAINER_NAS, - yamlContainer, -}); diff --git a/pkg/ui/v1alpha3/frontend/src/actions/nasMonitorActions.js b/pkg/ui/v1alpha3/frontend/src/actions/nasMonitorActions.js deleted file mode 100644 index d965b2e0f8a..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/actions/nasMonitorActions.js +++ /dev/null @@ -1,33 +0,0 @@ -export const FILTER_JOBS = 'FILTER_JOBS'; - -export const filterJobs = (experimentName, experimentNamespace) => ({ - type: FILTER_JOBS, - experimentName, - experimentNamespace, -}); - -export const CHANGE_TYPE = 'CHANGE_TYPE'; - -export const changeType = (filter, checked) => ({ - type: CHANGE_TYPE, - filter, - checked, -}); - -export const FETCH_NAS_JOBS_REQUEST = 'FETCH_NAS_JOBS_REQUEST'; -export const FETCH_NAS_JOBS_SUCCESS = 'FETCH_NAS_JOBS_SUCCESS'; -export const FETCH_NAS_JOBS_FAILURE = 'FETCH_NAS_JOBS_FAILURE'; - -export const fetchNASJobs = () => ({ - type: FETCH_NAS_JOBS_REQUEST, -}); - -export const FETCH_NAS_JOB_INFO_REQUEST = 'FETCH_NAS_JOB_INFO_REQUEST'; -export const FETCH_NAS_JOB_INFO_SUCCESS = 'FETCH_NAS_JOB_INFO_SUCCESS'; -export const FETCH_NAS_JOB_INFO_FAILURE = 'FETCH_NAS_JOB_INFO_FAILURE'; - -export const fetchNASJobInfo = (experimentName, namespace) => ({ - type: FETCH_NAS_JOB_INFO_REQUEST, - experimentName, - namespace, -}); diff --git a/pkg/ui/v1alpha3/frontend/src/actions/templateActions.js b/pkg/ui/v1alpha3/frontend/src/actions/templateActions.js deleted file mode 100644 index bbbd8a99b9e..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/actions/templateActions.js +++ /dev/null @@ -1,97 +0,0 @@ -export const CLOSE_DIALOG = 'CLOSE_DIALOG'; - -export const closeDialog = () => ({ - type: CLOSE_DIALOG, -}); - -export const OPEN_DIALOG = 'OPEN_DIALOG'; - -export const openDialog = ( - dialogType, - namespace = '', - configMapName = '', - templateName = '', - templateYaml = '', -) => ({ - type: OPEN_DIALOG, - dialogType, - namespace, - configMapName, - templateName, - templateYaml, -}); - -export const FETCH_TRIAL_TEMPLATES_REQUEST = 'FETCH_TRIAL_TEMPLATES_REQUEST'; -export const FETCH_TRIAL_TEMPLATES_SUCCESS = 'FETCH_TRIAL_TEMPLATES_SUCCESS'; -export const FETCH_TRIAL_TEMPLATES_FAILURE = 'FETCH_TRIAL_TEMPLATES_FAILURE'; - -export const fetchTrialTemplates = () => ({ - type: FETCH_TRIAL_TEMPLATES_REQUEST, -}); - -export const ADD_TEMPLATE_REQUEST = 'ADD_TEMPLATE_REQUEST'; -export const ADD_TEMPLATE_SUCCESS = 'ADD_TEMPLATE_SUCCESS'; -export const ADD_TEMPLATE_FAILURE = 'ADD_TEMPLATE_FAILURE'; - -export const addTemplate = (edittedNamespace, edittedConfigMapName, edittedName, edittedYaml) => ({ - type: ADD_TEMPLATE_REQUEST, - edittedNamespace, - edittedConfigMapName, - edittedName, - edittedYaml, -}); - -export const EDIT_TEMPLATE_REQUEST = 'EDIT_TEMPLATE_REQUEST'; -export const EDIT_TEMPLATE_SUCCESS = 'EDIT_TEMPLATE_SUCCESS'; -export const EDIT_TEMPLATE_FAILURE = 'EDIT_TEMPLATE_FAILURE'; - -export const editTemplate = ( - edittedNamespace, - edittedConfigMapName, - currentName, - edittedName, - edittedYaml, -) => ({ - type: EDIT_TEMPLATE_REQUEST, - edittedNamespace, - edittedConfigMapName, - currentName, - edittedName, - edittedYaml, -}); - -export const DELETE_TEMPLATE_REQUEST = 'DELETE_TEMPLATE_REQUEST'; -export const DELETE_TEMPLATE_SUCCESS = 'DELETE_TEMPLATE_SUCCESS'; -export const DELETE_TEMPLATE_FAILURE = 'DELETE_TEMPLATE_FAILURE'; - -export const deleteTemplate = (edittedNamespace, edittedConfigMapName, edittedName) => ({ - type: DELETE_TEMPLATE_REQUEST, - edittedNamespace, - edittedConfigMapName, - edittedName, -}); - -export const CHANGE_TEMPLATE = 'CHANGE_TEMPLATE'; - -export const changeTemplate = ( - edittedTemplateNamespace, - edittedTemplateConfigMapName, - edittedTemplateName, - edittedTemplateYaml, - edittedTemplateConfigMapSelectList, -) => ({ - type: CHANGE_TEMPLATE, - edittedTemplateNamespace, - edittedTemplateConfigMapName, - edittedTemplateName, - edittedTemplateYaml, - edittedTemplateConfigMapSelectList, -}); - -export const FILTER_TEMPLATES = 'FILTER_TEMPLATES'; - -export const filterTemplates = (filteredNamespace, filteredConfigMapName) => ({ - type: FILTER_TEMPLATES, - filteredNamespace, - filteredConfigMapName, -}); diff --git a/pkg/ui/v1alpha3/frontend/src/components/App.jsx b/pkg/ui/v1alpha3/frontend/src/components/App.jsx deleted file mode 100644 index 3d361f7b36a..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/App.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react'; -import { Route } from 'react-router-dom'; - -import { makeStyles } from '@material-ui/styles'; - -import Main from './Menu/Main'; -import HPJobMonitor from './HP/Monitor/HPJobMonitor'; -import HPJobInfo from './HP/Monitor/HPJobInfo'; -import NASJobMonitor from './NAS/Monitor/NASJobMonitor'; -import NASJobInfo from './NAS/Monitor/NASJobInfo'; -import Trial from './Templates/Trial'; -import Header from './Menu/Header'; -import Snack from './Menu/Snack'; -import TabPanel from './Common/Create/TabPanel'; - -import * as constants from '../constants/constants'; - -const useStyles = makeStyles({ - root: { - width: '90%', - margin: '0 auto', - paddingTop: 20, - }, -}); - -const App = props => { - const classes = useStyles(); - return ( -

- ); -}; - -export default App; diff --git a/pkg/ui/v1alpha3/frontend/src/components/Common/Create/Params/MetricsCollector.jsx b/pkg/ui/v1alpha3/frontend/src/components/Common/Create/Params/MetricsCollector.jsx deleted file mode 100644 index f900967f181..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Common/Create/Params/MetricsCollector.jsx +++ /dev/null @@ -1,656 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import AceEditor from 'react-ace'; -import 'ace-builds/src-noconflict/theme-sqlserver'; -import 'ace-builds/src-noconflict/mode-yaml'; - -import withStyles from '@material-ui/styles/withStyles'; -import Grid from '@material-ui/core/Grid'; -import Typography from '@material-ui/core/Typography'; -import Tooltip from '@material-ui/core/Tooltip'; -import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; -import FormControl from '@material-ui/core/FormControl'; -import InputLabel from '@material-ui/core/InputLabel'; -import Select from '@material-ui/core/Select'; -import OutlinedInput from '@material-ui/core/OutlinedInput'; -import MenuItem from '@material-ui/core/MenuItem'; -import TextField from '@material-ui/core/TextField'; -import Button from '@material-ui/core/Button'; -import IconButton from '@material-ui/core/IconButton'; -import DeleteIcon from '@material-ui/icons/Delete'; -import Divider from '@material-ui/core/Divider'; - -import * as constants from '../../../../constants/constants'; -import { - changeMCKindHP, - changeMCFileSystemHP, - addMCMetricsFormatHP, - changeMCMetricsFormatHP, - deleteMCMetricsFormatHP, - changeMCHttpGetHP, - addMCHttpGetHeaderHP, - changeMCHttpGetHeaderHP, - deleteMCHttpGetHeaderHP, - changeMCCustomContainerHP, -} from '../../../../actions/hpCreateActions'; - -import { - changeMCKindNAS, - changeMCFileSystemNAS, - addMCMetricsFormatNAS, - changeMCMetricsFormatNAS, - deleteMCMetricsFormatNAS, - changeMCHttpGetNAS, - addMCHttpGetHeaderNAS, - changeMCHttpGetHeaderNAS, - deleteMCHttpGetHeaderNAS, - changeMCCustomContainerNAS, -} from '../../../../actions/nasCreateActions'; - -const module = 'general'; -const hpModule = 'hpCreate'; -const nasModule = 'nasCreate'; - -const styles = theme => ({ - help: { - padding: 4 / 2, - verticalAlign: 'middle', - marginRight: 5, - }, - formSelect: { - width: '70%', - }, - textField: { - width: '95%', - }, - grid: { - marginTop: 20, - marginBottom: 30, - }, - textsList: { - marginBottom: 15, - }, - headerButton: { - marginTop: 10, - }, -}); - -class MetricsCollectorSpec extends React.Component { - onMCKindChange = event => { - this.props.jobType === constants.JOB_TYPE_HP - ? this.props.changeMCKindHP(event.target.value) - : this.props.changeMCKindNAS(event.target.value); - }; - - onMCFileSystemKindChange = event => { - this.props.jobType === constants.JOB_TYPE_HP - ? this.props.changeMCFileSystemHP( - event.target.value, - this.props.mcSpecHP.source.fileSystemPath.path, - ) - : this.props.changeMCFileSystemNAS( - event.target.value, - this.props.mcSpecNAS.source.fileSystemPath.path, - ); - }; - - onMCFileSystemPathChange = event => { - this.props.jobType === constants.JOB_TYPE_HP - ? this.props.changeMCFileSystemHP( - this.props.mcSpecHP.source.fileSystemPath.kind, - event.target.value, - ) - : this.props.changeMCFileSystemNAS( - this.props.mcSpecNAS.source.fileSystemPath.kind, - event.target.value, - ); - }; - - onMCMetricsFormatAdd = () => { - this.props.jobType === constants.JOB_TYPE_HP - ? this.props.addMCMetricsFormatHP() - : this.props.addMCMetricsFormatNAS(); - }; - - onMCMetricsFormatChange = index => event => { - this.props.jobType == constants.JOB_TYPE_HP - ? this.props.changeMCMetricsFormatHP(event.target.value, index) - : this.props.changeMCMetricsFormatNAS(event.target.value, index); - }; - - onMCMetricsFormatDelete = index => event => { - this.props.jobType === constants.JOB_TYPE_HP - ? this.props.deleteMCMetricsFormatHP(index) - : this.props.deleteMCMetricsFormatNAS(index); - }; - - onMCHttpGetPortChange = event => { - this.props.jobType === constants.JOB_TYPE_HP - ? this.props.changeMCHttpGetHP( - event.target.value, - this.props.mcSpecHP.source.httpGet.path, - this.props.mcSpecHP.source.httpGet.scheme, - this.props.mcSpecHP.source.httpGet.host, - ) - : this.props.changeMCHttpGetNAS( - event.target.value, - this.props.mcSpecNAS.source.httpGet.path, - this.props.mcSpecNAS.source.httpGet.scheme, - this.props.mcSpecNAS.source.httpGet.host, - ); - }; - - onMCHttpGetPathChange = event => { - this.props.jobType === constants.JOB_TYPE_HP - ? this.props.changeMCHttpGetHP( - this.props.mcSpecHP.source.httpGet.port, - event.target.value, - this.props.mcSpecHP.source.httpGet.scheme, - this.props.mcSpecHP.source.httpGet.host, - ) - : this.props.changeMCHttpGetNAS( - this.props.mcSpecNAS.source.httpGet.port, - event.target.value, - this.props.mcSpecNAS.source.httpGet.scheme, - this.props.mcSpecNAS.source.httpGet.host, - ); - }; - - onMCHttpGetSchemeChange = event => { - this.props.jobType === constants.JOB_TYPE_HP - ? this.props.changeMCHttpGetHP( - this.props.mcSpecHP.source.httpGet.port, - this.props.mcSpecHP.source.httpGet.path, - event.target.value, - this.props.mcSpecHP.source.httpGet.host, - ) - : this.props.changeMCHttpGetNAS( - this.props.mcSpecNAS.source.httpGet.port, - this.props.mcSpecNAS.source.httpGet.path, - event.target.value, - this.props.mcSpecNAS.source.httpGet.host, - ); - }; - - onMCHttpGetHostChange = event => { - this.props.jobType === constants.JOB_TYPE_HP - ? this.props.changeMCHttpGetHP( - this.props.mcSpecHP.source.httpGet.port, - this.props.mcSpecHP.source.httpGet.path, - this.props.mcSpecHP.source.httpGet.scheme, - event.target.value, - ) - : this.props.changeMCHttpGetNAS( - this.props.mcSpecNAS.source.httpGet.port, - this.props.mcSpecNAS.source.httpGet.path, - this.props.mcSpecNAS.source.httpGet.scheme, - event.target.value, - ); - }; - - onMCHttpGetHeaderAdd = () => { - this.props.jobType === constants.JOB_TYPE_HP - ? this.props.addMCHttpGetHeaderHP() - : this.props.addMCHttpGetHeaderNAS(); - }; - - onMCHttpGetHeaderChange = (fieldName, index) => event => { - this.props.jobType === constants.JOB_TYPE_HP - ? this.props.changeMCHttpGetHeaderHP(fieldName, event.target.value, index) - : this.props.changeMCHttpGetHeaderNAS(fieldName, event.target.value, index); - }; - - onMCHttpGetHeaderDelete = index => event => { - this.props.jobType === constants.JOB_TYPE_HP - ? this.props.deleteMCHttpGetHeaderHP(index) - : this.props.deleteMCHttpGetHeaderNAS(index); - }; - - onMCCustomContainerChange = yamlContainer => { - this.props.jobType === constants.JOB_TYPE_HP - ? this.props.changeMCCustomContainerHP(yamlContainer) - : this.props.changeMCCustomContainerNAS(yamlContainer); - }; - render() { - const { classes } = this.props; - return ( -
- - - - - - - {'Kind'} - - - - - Kind - - - - - {((this.props.jobType === constants.JOB_TYPE_HP && - (this.props.mcSpecHP.collector.kind === constants.MC_KIND_FILE || - this.props.mcSpecHP.collector.kind === constants.MC_KIND_TENSORFLOW_EVENT || - this.props.mcSpecHP.collector.kind === constants.MC_KIND_CUSTOM)) || - (this.props.jobType === constants.JOB_TYPE_NAS && - (this.props.mcSpecNAS.collector.kind === constants.MC_KIND_FILE || - this.props.mcSpecNAS.collector.kind === constants.MC_KIND_TENSORFLOW_EVENT || - this.props.mcSpecNAS.collector.kind === constants.MC_KIND_CUSTOM))) && ( - - - - - - - {'File System Kind and Path'} - - - - - File System Kind - - - - {((this.props.jobType === constants.JOB_TYPE_HP && - this.props.mcSpecHP.source.fileSystemPath.kind != constants.MC_FILE_SYSTEM_NO_KIND) || - (this.props.jobType === constants.JOB_TYPE_NAS && - this.props.mcSpecNAS.source.fileSystemPath.kind != - constants.MC_FILE_SYSTEM_NO_KIND)) && ( - - - - )} - - )} - {((this.props.jobType === constants.JOB_TYPE_HP && - this.props.mcSpecHP.collector.kind === constants.MC_KIND_PROMETHEUS) || - (this.props.jobType === constants.JOB_TYPE_NAS && - this.props.mcSpecNAS.collector.kind === constants.MC_KIND_PROMETHEUS)) && ( -
- - - - - - - {'HttpGet Port and Path'} - - - - - - - - - - - - - - - - {'HttpGet Scheme and Host (optional)'} - - - - - Scheme - - - - - - - - - - - - - - {'HttpGet Headers (optional)'} - - - - - {this.props.jobType === constants.JOB_TYPE_HP - ? this.props.mcSpecHP.source.httpGet.httpHeaders.map((header, index) => { - return ( -
- - - - - - - - - - - - - - -
- ); - }) - : this.props.mcSpecNAS.source.httpGet.httpHeaders.map((header, index) => { - return ( -
- - - - - - - - - - - - - - -
- ); - })} -
- )} - {((this.props.jobType === constants.JOB_TYPE_HP && - this.props.mcSpecHP.collector.kind === constants.MC_KIND_CUSTOM) || - (this.props.jobType === constants.JOB_TYPE_NAS && - this.props.mcSpecNAS.collector.kind === constants.MC_KIND_CUSTOM)) && ( - - - - - - - {'Yaml for the Custom Container'} - - - - - - - )} - - - - - - - - {this.props.jobType === constants.JOB_TYPE_HP && - this.props.mcSpecHP.source != undefined && - this.props.mcSpecHP.source.filter != undefined && - this.props.mcSpecHP.source.filter.metricsFormat.map((format, index) => { - return ( -
- - - - - - - - - - - -
- ); - })} - {this.props.jobType === constants.JOB_TYPE_NAS && - this.props.mcSpecNAS.source != undefined && - this.props.mcSpecNAS.source.filter != undefined && - this.props.mcSpecNAS.source.filter.metricsFormat.map((format, index) => { - return ( -
- - - - - - - - - - - -
- ); - })} -
- ); - } -} - -const mapStateToProps = state => { - return { - mcSpecHP: state[hpModule].mcSpec, - mcSpecNAS: state[nasModule].mcSpec, - mcCustomContainerYamlHP: state[hpModule].mcCustomContainerYaml, - mcCustomContainerYamlNAS: state[nasModule].mcCustomContainerYaml, - mcKindsList: state[module].mcKindsList, - mcFileSystemKindsList: state[module].mcFileSystemKindsList, - mcURISchemesList: state[module].mcURISchemesList, - }; -}; - -export default connect(mapStateToProps, { - changeMCKindHP, - changeMCFileSystemHP, - addMCMetricsFormatHP, - changeMCMetricsFormatHP, - deleteMCMetricsFormatHP, - changeMCHttpGetHP, - addMCHttpGetHeaderHP, - changeMCHttpGetHeaderHP, - deleteMCHttpGetHeaderHP, - changeMCCustomContainerHP, - changeMCKindNAS, - changeMCFileSystemNAS, - addMCMetricsFormatNAS, - changeMCMetricsFormatNAS, - deleteMCMetricsFormatNAS, - changeMCHttpGetNAS, - addMCHttpGetHeaderNAS, - changeMCHttpGetHeaderNAS, - deleteMCHttpGetHeaderNAS, - changeMCCustomContainerNAS, -})(withStyles(styles)(MetricsCollectorSpec)); diff --git a/pkg/ui/v1alpha3/frontend/src/components/Common/Create/TabPanel.jsx b/pkg/ui/v1alpha3/frontend/src/components/Common/Create/TabPanel.jsx deleted file mode 100644 index 18b4b974f76..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Common/Create/TabPanel.jsx +++ /dev/null @@ -1,81 +0,0 @@ -import React from 'react'; - -import { withStyles } from '@material-ui/core/styles'; -import makeStyles from '@material-ui/styles/makeStyles'; -import Tabs from '@material-ui/core/Tabs'; -import Tab from '@material-ui/core/Tab'; - -import HPYAML from '../../HP/Create/YAML'; -import HPParameters from '../../HP/Create/HPParameters'; -import NASYAML from '../../NAS/Create/YAML'; -import NASParameters from '../../NAS/Create/NASParameters'; - -import * as constants from '../../../constants/constants'; - -const useStyles = makeStyles({ - root: { - marginTop: 40, - }, -}); - -const MyTabs = withStyles({ - root: { - borderBottom: '1px solid #e8e8e8', - marginBottom: 15, - }, - indicator: { - backgroundColor: '#1890ff', - }, -})(Tabs); - -const MyTab = withStyles(theme => ({ - root: { - textTransform: 'none', - marginRight: 40, - minWidth: 40, - fontWeight: theme.typography.fontWeightRegular, - fontSize: 14, - opacity: 1, - '&:hover': { - color: '#40a9ff', - }, - '&$selected': { - color: '#1890ff', - fontWeight: theme.typography.fontWeightMedium, - }, - '&:focus': { - color: '#1890ff', - }, - }, - selected: {}, -}))(props => ); - -const TabsPanel = props => { - const [tabIndex, setTabIndex] = React.useState(0); - - const onTabChange = (event, newIndex) => { - setTabIndex(newIndex); - }; - const classes = useStyles(); - return ( -
- - - - - {props.match.path === constants.LINK_HP_CREATE ? ( - tabIndex === 0 ? ( - - ) : ( - - ) - ) : tabIndex === 0 ? ( - - ) : ( - - )} -
- ); -}; - -export default TabsPanel; diff --git a/pkg/ui/v1alpha3/frontend/src/components/Common/ExperimentInfoDialog.jsx b/pkg/ui/v1alpha3/frontend/src/components/Common/ExperimentInfoDialog.jsx deleted file mode 100644 index 9e4b8b9828b..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Common/ExperimentInfoDialog.jsx +++ /dev/null @@ -1,69 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import { withStyles } from '@material-ui/styles'; -import Dialog from '@material-ui/core/Dialog'; -import DialogTitle from '@material-ui/core/DialogTitle'; -import DialogContent from '@material-ui/core/DialogContent'; - -import AceEditor from 'react-ace'; -import 'ace-builds/src-noconflict/theme-xcode'; -import 'ace-builds/src-noconflict/mode-json'; - -import { closeDialogExperiment } from '../../actions/generalActions'; - -const module = 'general'; - -const styles = theme => ({ - header: { - textAlign: 'center', - width: 900, - }, -}); - -const ExperimentInfoDialog = props => { - const { classes } = props; - - return ( - - - {props.experiment.metadata && props.experiment.metadata.name - ? 'Experiment ' + JSON.stringify(props.experiment.metadata.name, null, 2) - : ''} - - - - - - ); -}; - -const mapStateToProps = state => { - return { - dialogExperimentOpen: state[module].dialogExperimentOpen, - experiment: state[module].experiment, - }; -}; - -export default connect(mapStateToProps, { closeDialogExperiment })( - withStyles(styles)(ExperimentInfoDialog), -); diff --git a/pkg/ui/v1alpha3/frontend/src/components/Common/SuggestionInfoDialog.jsx b/pkg/ui/v1alpha3/frontend/src/components/Common/SuggestionInfoDialog.jsx deleted file mode 100644 index 5b6614b80d5..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Common/SuggestionInfoDialog.jsx +++ /dev/null @@ -1,92 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import { withStyles } from '@material-ui/styles'; - -import AceEditor from 'react-ace'; -import 'ace-builds/src-noconflict/theme-xcode'; -import 'ace-builds/src-noconflict/mode-json'; - -import Dialog from '@material-ui/core/Dialog'; -import DialogTitle from '@material-ui/core/DialogTitle'; -import DialogContent from '@material-ui/core/DialogContent'; - -import { closeDialogSuggestion } from '../../actions/generalActions'; - -const module = 'general'; - -const styles = theme => ({ - header: { - textAlign: 'center', - width: 900, - }, - aceMarker: { - position: 'absolute', - backgroundColor: '#FFFF00', - }, -}); - -const SuggestionStatusFailed = '"type": "Failed",'; - -const SuggestionInfoDialog = props => { - const { classes } = props; - - let markers = []; - let failedSuggestion = ''; - if (props.dialogSuggestionOpen) { - let jsonString = JSON.stringify(props.suggestion, null, 2); - let jsonSplit = jsonString.split(/\n/); - for (var i = jsonSplit.length - 1; i >= 0; i--) { - if (jsonSplit[i].trim() === SuggestionStatusFailed) { - markers.push({ - startRow: i - 1, - endRow: i + 7, - className: classes.aceMarker, - fullLine: true, - }); - failedSuggestion = ' failed, check conditions'; - break; - } - } - } - - return ( - - - {props.suggestion.metadata && props.suggestion.metadata.name - ? 'Suggestion ' + - JSON.stringify(props.suggestion.metadata.name, null, 2) + - failedSuggestion - : ''} - - - - - - ); -}; - -const mapStateToProps = state => { - return { - dialogSuggestionOpen: state[module].dialogSuggestionOpen, - suggestion: state[module].suggestion, - }; -}; - -export default connect(mapStateToProps, { closeDialogSuggestion })( - withStyles(styles)(SuggestionInfoDialog), -); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/HPParameters.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Create/HPParameters.jsx deleted file mode 100644 index 75401ed04dd..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/HPParameters.jsx +++ /dev/null @@ -1,275 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import jsyaml from 'js-yaml'; - -import withStyles from '@material-ui/styles/withStyles'; -import Button from '@material-ui/core/Button'; -import Grid from '@material-ui/core/Grid'; -import Typography from '@material-ui/core/Typography'; - -import CommonParametersMeta from './Params/CommonMeta'; -import CommonParametersSpec from './Params/CommonSpec'; -import Objective from './Params/Objective'; -import TrialSpecParam from './Params/Trial'; -import Parameters from './Params/Parameters'; -import Algorithm from './Params/Algorithm'; - -import { submitHPJob } from '../../../actions/hpCreateActions'; -import MetricsCollectorSpec from '../../Common/Create/Params/MetricsCollector'; - -import { validationError } from '../../../actions/generalActions'; -import * as constants from '../../../constants/constants'; - -const module = 'hpCreate'; -const generalModule = 'general'; - -const styles = theme => ({ - root: { - width: '90%', - margin: '0 auto', - }, - submit: { - textAlign: 'center', - marginTop: 10, - }, - textField: { - marginLeft: 4, - marginRight: 4, - width: '100%', - }, - help: { - padding: 4 / 2, - verticalAlign: 'middle', - }, - section: { - padding: 4, - }, - parameter: { - padding: 2, - }, - formControl: { - margin: 4, - width: '100%', - }, - selectEmpty: { - marginTop: 10, - }, - button: { - margin: 10, - }, -}); - -const SectionInTypography = (name, classes) => { - return ( -
- - - {name} -
-
-
-
- ); -}; - -// probably get render into a function -const deCapitalizeFirstLetterAndAppend = (source, destination) => { - source.map((parameter, i) => { - let value = Number(parameter.value); - let name = parameter.name.charAt(0).toLowerCase() + parameter.name.slice(1); - destination[name] = isNaN(value) ? parameter.value : value; - }); -}; - -const addAlgorithmSettings = (spec, destination) => { - spec.map((parameter, i) => { - destination.push(parameter); - }); -}; - -const addParameter = (source, destination) => { - source.map((param, i) => { - let tempParam = {}; - tempParam.name = param.name; - tempParam.parameterType = param.parameterType; - tempParam.feasibleSpace = {}; - if (param.feasibleSpace === 'list') { - tempParam.feasibleSpace.list = param.list.map((param, i) => param.value); - } else { - tempParam.feasibleSpace.min = param.min; - tempParam.feasibleSpace.max = param.max; - if (param.step != '') { - tempParam.feasibleSpace.step = param.step; - } - } - destination.push(tempParam); - }); -}; - -const HPParameters = props => { - const submitJob = () => { - let data = {}; - data.metadata = {}; - deCapitalizeFirstLetterAndAppend(props.commonParametersMetadata, data.metadata); - data.spec = {}; - deCapitalizeFirstLetterAndAppend(props.commonParametersSpec, data.spec); - data.spec.objective = {}; - deCapitalizeFirstLetterAndAppend(props.objective, data.spec.objective); - data.spec.objective.additionalMetricNames = props.additionalMetricNames.map( - (metrics, i) => metrics.value, - ); - - data.spec.algorithm = {}; - data.spec.algorithm.algorithmName = props.algorithmName; - data.spec.algorithm.algorithmSettings = []; - addAlgorithmSettings(props.algorithmSettings, data.spec.algorithm.algorithmSettings); - - data.spec.parameters = []; - addParameter(props.parameters, data.spec.parameters); - - // Metrics Collector - let newMCSpec = JSON.parse(JSON.stringify(props.mcSpec)); - - // Delete empty metrics format - if ( - newMCSpec.source.filter.metricsFormat.length === 0 || - newMCSpec.collector.kind === constants.MC_KIND_NONE - ) { - delete newMCSpec.source.filter; - } - - if ( - newMCSpec.collector.kind === constants.MC_KIND_STDOUT || - newMCSpec.collector.kind === constants.MC_KIND_NONE - ) { - // Delete fileSystemPath and httpGet - delete newMCSpec.source.fileSystemPath; - delete newMCSpec.source.httpGet; - } - - if ( - newMCSpec.collector.kind === constants.MC_KIND_FILE || - newMCSpec.collector.kind === constants.MC_KIND_TENSORFLOW_EVENT || - newMCSpec.collector.kind === constants.MC_KIND_CUSTOM - ) { - // Delete httpGet - delete newMCSpec.source.httpGet; - // Delete empty fileSystemPath - if (newMCSpec.source.fileSystemPath.kind === constants.MC_FILE_SYSTEM_NO_KIND) { - delete newMCSpec.source.fileSystemPath; - } - } - - if (newMCSpec.collector.kind === constants.MC_KIND_PROMETHEUS) { - // Delete file System Path - delete newMCSpec.source.fileSystemPath; - // Delete empty host - if (newMCSpec.source.httpGet.host === '') { - delete newMCSpec.source.httpGet.host; - } - // Delete empty headers - if (newMCSpec.source.httpGet.httpHeaders.length === 0) { - delete newMCSpec.source.httpGet.httpHeaders; - } - } - - // Delete empty source - if (newMCSpec.source != undefined && Object.keys(newMCSpec.source).length === 0) { - delete newMCSpec.source; - } - - // Add Custom Container YAML to the Metrics Collector - if ( - newMCSpec.collector.kind === constants.MC_KIND_CUSTOM && - props.mcCustomContainerYaml != '' - ) { - try { - let mcCustomContainerJson = jsyaml.load(props.mcCustomContainerYaml); - newMCSpec.collector.customCollector = mcCustomContainerJson; - } catch { - props.validationError('Metrics Collector Custom Container is not valid YAML!'); - return; - } - } - - data.spec.metricsCollectorSpec = newMCSpec; - - data.spec.trialTemplate = { - goTemplate: { - templateSpec: { - configMapName: props.templateConfigMapName, - configMapNamespace: props.templateNamespace, - templatePath: props.templateName, - }, - }, - }; - - props.submitHPJob(data); - }; - - const { classes } = props; - - return ( -
- {/* Common Metadata */} - {SectionInTypography('Metadata', classes)} -
- - {SectionInTypography('Common Parameters', classes)} - - {SectionInTypography('Objective', classes)} - - {SectionInTypography('Algorithm', classes)} - - - {SectionInTypography('Parameters', classes)} - - {SectionInTypography('Metrics Collector Spec', classes)} - - {SectionInTypography('Trial Spec', classes)} - - -
- -
-
- ); -}; - -// TODO: think of a better way of passing those -const mapStateToProps = state => ({ - commonParametersMetadata: state[module].commonParametersMetadata, - commonParametersSpec: state[module].commonParametersSpec, - objective: state[module].objective, - additionalMetricNames: state[module].additionalMetricNames, - algorithmName: state[module].algorithmName, - algorithmSettings: state[module].algorithmSettings, - parameters: state[module].parameters, - templateNamespace: state[generalModule].templateNamespace, - templateConfigMapName: state[generalModule].templateConfigMapName, - templateName: state[generalModule].templateName, - trial: state[module].trial, - trialNamespace: state[module].trialNamespace, - mcSpec: state[module].mcSpec, - mcCustomContainerYaml: state[module].mcCustomContainerYaml, -}); - -//TODO: Added validation and remove it -// HPParameters.propTypes = { -// trial: PropTypes.string, -// requestNumber: PropTypes.number, -// suggestionAlgorithm: PropTypes.string, -// metricsName: PropTypes.arrayOf(PropTypes.string), -// } - -export default connect(mapStateToProps, { submitHPJob, validationError })( - withStyles(styles)(HPParameters), -); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Algorithm.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Algorithm.jsx deleted file mode 100644 index a6e3ebc6c7d..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Algorithm.jsx +++ /dev/null @@ -1,170 +0,0 @@ -import React from 'react'; -import makeStyles from '@material-ui/styles/makeStyles'; -import Button from '@material-ui/core/Button'; -import Grid from '@material-ui/core/Grid'; -import Tooltip from '@material-ui/core/Tooltip'; -import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; -import Typography from '@material-ui/core/Typography'; -import OutlinedInput from '@material-ui/core/OutlinedInput'; -import MenuItem from '@material-ui/core/MenuItem'; -import FormControl from '@material-ui/core/FormControl'; -import Select from '@material-ui/core/Select'; -import InputLabel from '@material-ui/core/InputLabel'; -import TextField from '@material-ui/core/TextField'; -import IconButton from '@material-ui/core/IconButton'; - -import DeleteIcon from '@material-ui/icons/Delete'; - -import { connect } from 'react-redux'; -import { - changeAlgorithmName, - addAlgorithmSetting, - changeAlgorithmSetting, - deleteAlgorithmSetting, -} from '../../../../actions/hpCreateActions'; - -const module = 'hpCreate'; - -const useStyles = makeStyles({ - textField: { - marginLeft: 4, - marginRight: 4, - width: '80%', - }, - help: { - padding: 4 / 2, - verticalAlign: 'middle', - marginRight: 5, - }, - parameter: { - padding: 2, - marginBottom: 10, - }, - icon: { - padding: 4, - margin: '0 auto', - verticalAlign: 'middle !important', - }, - formControl: { - margin: 4, - width: '100%', - }, - addButton: { - margin: 10, - }, -}); - -const Algorithm = props => { - const classes = useStyles(); - - const onAlgorithmNameChange = event => { - props.changeAlgorithmName(event.target.value); - }; - - const onAddAlgorithmSetting = () => { - props.addAlgorithmSetting(); - }; - - const onChangeAlgorithmSetting = (name, index) => event => { - props.changeAlgorithmSetting(index, name, event.target.value); - }; - - const onDeleteAlgorithmSetting = index => event => { - props.deleteAlgorithmSetting(index); - }; - return ( -
- -
- - - - - - - {'Algorithm Name'} - - - - - Algorithm Name - - - - -
-
- {props.algorithmSettings.map((param, i) => { - return ( -
- - - - - - - - - - - - - - -
- ); - })} -
- ); -}; - -const mapStateToProps = state => { - return { - algorithmName: state[module].algorithmName, - allAlgorithms: state[module].allAlgorithms, - algorithmSettings: state[module].algorithmSettings, - }; -}; - -export default connect(mapStateToProps, { - changeAlgorithmName, - addAlgorithmSetting, - changeAlgorithmSetting, - deleteAlgorithmSetting, -})(Algorithm); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/CommonMeta.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/CommonMeta.jsx deleted file mode 100644 index d4a0cfeb24c..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/CommonMeta.jsx +++ /dev/null @@ -1,95 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import Grid from '@material-ui/core/Grid'; -import Tooltip from '@material-ui/core/Tooltip'; -import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; -import Typography from '@material-ui/core/Typography'; -import TextField from '@material-ui/core/TextField'; - -import { changeMeta } from '../../../../actions/hpCreateActions'; -import { withStyles } from '@material-ui/core'; - -const module = 'hpCreate'; -const generalModule = 'general'; - -const styles = () => ({ - textField: { - marginLeft: 4, - marginRight: 4, - width: '100%', - }, - help: { - padding: 4 / 2, - verticalAlign: 'middle', - marginRight: 5, - }, - parameter: { - padding: 2, - marginBottom: 10, - }, -}); - -class CommonParametersMeta extends React.Component { - componentDidMount() { - if (this.props.globalNamespace != '') { - this.props.changeMeta('Namespace', this.props.globalNamespace); - } - } - - onMetaChange = param => event => { - this.props.changeMeta(param, event.target.value); - }; - - render() { - const { classes } = this.props; - - return ( -
- {this.props.commonParametersMetadata.map((param, i) => { - return ( -
- - - - - - - {param.name} - - - - {param.name == 'Namespace' && this.props.globalNamespace == '' && ( - - )} - {param.name == 'Namespace' && this.props.globalNamespace != '' && ( - - )} - {param.name != 'Namespace' && ( - - )} - - -
- ); - })} -
- ); - } -} - -const mapStateToProps = state => { - return { - commonParametersMetadata: state[module].commonParametersMetadata, - globalNamespace: state[generalModule].globalNamespace, - }; -}; - -export default connect(mapStateToProps, { changeMeta })(withStyles(styles)(CommonParametersMeta)); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/CommonSpec.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/CommonSpec.jsx deleted file mode 100644 index 61ed545ff0c..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/CommonSpec.jsx +++ /dev/null @@ -1,73 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import makeStyles from '@material-ui/styles/makeStyles'; -import Grid from '@material-ui/core/Grid'; -import Tooltip from '@material-ui/core/Tooltip'; -import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; -import Typography from '@material-ui/core/Typography'; -import TextField from '@material-ui/core/TextField'; - -import { changeSpec } from '../../../../actions/hpCreateActions'; - -const module = 'hpCreate'; - -const useStyles = makeStyles({ - textField: { - marginLeft: 4, - marginRight: 4, - width: '100%', - }, - help: { - padding: 4 / 2, - verticalAlign: 'middle', - marginRight: 5, - }, - parameter: { - padding: 2, - marginBottom: 10, - }, -}); - -const CommonParametersSpec = props => { - const classes = useStyles(); - - const onSpecChange = name => event => { - props.changeSpec(name, event.target.value); - }; - - return ( -
- {props.commonParametersSpec.map((param, i) => { - return ( -
- - - - - - - {param.name} - - - - - - -
- ); - })} -
- ); -}; - -const mapStateToProps = state => { - return { - commonParametersSpec: state[module].commonParametersSpec, - }; -}; - -export default connect(mapStateToProps, { changeSpec })(CommonParametersSpec); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Objective.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Objective.jsx deleted file mode 100644 index fa131373416..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Objective.jsx +++ /dev/null @@ -1,180 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import makeStyles from '@material-ui/styles/makeStyles'; -import Grid from '@material-ui/core/Grid'; -import Tooltip from '@material-ui/core/Tooltip'; -import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; -import Typography from '@material-ui/core/Typography'; -import TextField from '@material-ui/core/TextField'; -import IconButton from '@material-ui/core/IconButton'; -import DeleteIcon from '@material-ui/icons/Delete'; -import Fab from '@material-ui/core/Fab'; -import AddIcon from '@material-ui/icons/Add'; -import FormControl from '@material-ui/core/FormControl'; -import Select from '@material-ui/core/Select'; -import InputLabel from '@material-ui/core/InputLabel'; -import OutlinedInput from '@material-ui/core/OutlinedInput'; -import MenuItem from '@material-ui/core/MenuItem'; - -import { - changeObjective, - addMetrics, - editMetrics, - deleteMetrics, -} from '../../../../actions/hpCreateActions'; - -const module = 'hpCreate'; - -const useStyles = makeStyles({ - textField: { - marginLeft: 4, - marginRight: 4, - width: '100%', - }, - help: { - padding: 4 / 2, - verticalAlign: 'middle', - marginRight: 5, - }, - parameter: { - padding: 2, - marginBottom: 10, - }, - selectBox: { - width: 150, - }, -}); - -const Objective = props => { - const classes = useStyles(); - - const onObjectiveChange = name => event => { - props.changeObjective(name, event.target.value); - }; - - const onMetricsEdit = index => event => { - props.editMetrics(index, event.target.value); - }; - - const onMetricsDelete = index => event => { - props.deleteMetrics(index); - }; - - return ( -
- {props.objective.map((param, i) => { - return param.name === 'Type' ? ( -
- - - - - - - {param.name} - - - - - Objective Type - - - - -
- ) : ( -
- - - - - - - {param.name} - - - - - - -
- ); - })} -
- - - - - - - AdditionalMetricNames - - - - {props.additionalMetricNames.map((metrics, mIndex) => { - return ( - - - - - - - - - - - ); - })} - - - - - - - -
-
- ); -}; - -const mapStateToProps = state => { - return { - allObjectiveTypes: state[module].allObjectiveTypes, - objective: state[module].objective, - additionalMetricNames: state[module].additionalMetricNames, - }; -}; - -export default connect(mapStateToProps, { - changeObjective, - addMetrics, - editMetrics, - deleteMetrics, -})(Objective); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Parameters.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Parameters.jsx deleted file mode 100644 index 2e80e556221..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Parameters.jsx +++ /dev/null @@ -1,242 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import makeStyles from '@material-ui/styles/makeStyles'; -import Button from '@material-ui/core/Button'; -import Grid from '@material-ui/core/Grid'; -import TextField from '@material-ui/core/TextField'; -import OutlinedInput from '@material-ui/core/OutlinedInput'; -import InputLabel from '@material-ui/core/InputLabel'; -import MenuItem from '@material-ui/core/MenuItem'; -import FormControl from '@material-ui/core/FormControl'; -import Select from '@material-ui/core/Select'; -import IconButton from '@material-ui/core/IconButton'; -import DeleteIcon from '@material-ui/icons/Delete'; -import Radio from '@material-ui/core/Radio'; -import RadioGroup from '@material-ui/core/RadioGroup'; -import FormControlLabel from '@material-ui/core/FormControlLabel'; -import Divider from '@material-ui/core/Divider'; -import Fab from '@material-ui/core/Fab'; -import AddIcon from '@material-ui/icons/Add'; - -import { - addParameter, - editParameter, - deleteParameter, - addListParameter, - editListParameter, - deleteListParameter, -} from '../../../../actions/hpCreateActions'; - -const module = 'hpCreate'; - -const useStyles = makeStyles({ - textField: { - marginLeft: 4, - marginRight: 4, - width: '80%', - }, - help: { - padding: 4 / 2, - verticalAlign: 'middle', - marginRight: 5, - }, - parameter: { - padding: 2, - marginBottom: 10, - }, - formControl: { - margin: 4, - width: '100%', - }, - selectEmpty: { - marginTop: 10, - }, - group: { - flexDirection: 'row', - justifyContent: 'space-around', - }, - divider: { - margin: 5, - }, - addButton: { - margin: 10, - }, - fab: { - margin: 2, - }, -}); - -const Parameters = props => { - const classes = useStyles(); - - const onDelete = index => event => { - props.deleteParameter(index); - }; - - const onGeneralEdit = (index, field) => event => { - props.editParameter(index, field, event.target.value); - }; - - const onParamAdd = index => event => { - props.addListParameter(index); - }; - - const onParamEdit = (paramIndex, index) => event => { - props.editListParameter(paramIndex, index, event.target.value); - }; - - const onParamDelete = (paramIndex, index) => event => { - props.deleteListParameter(paramIndex, index); - }; - - return ( -
- - {props.parameters.map((param, i) => { - return ( -
- - - - - - - Parameter Type - - - - - - } - label="FeasibleSpace" - /> - } - label="List" - /> - - - - {param.feasibleSpace === 'list' && - param.list.map((element, elIndex) => { - return ( -
- - - - -
- ); - })} - {param.feasibleSpace === 'feasibleSpace' && ( -
- - - {props.algorithmName === 'grid' && param.parameterType === 'double' && ( - - )} -
- )} -
- - {param.feasibleSpace === 'list' && ( - - - - )} - - - - - - -
- -
- ); - })} -
- ); -}; - -const mapStateToProps = state => { - return { - parameters: state[module].parameters, - allParameterTypes: state[module].allParameterTypes, - algorithmName: state[module].algorithmName, - }; -}; - -export default connect(mapStateToProps, { - addParameter, - editParameter, - deleteParameter, - addListParameter, - editListParameter, - deleteListParameter, -})(Parameters); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Trial.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Trial.jsx deleted file mode 100644 index 4f038ba4ff0..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/Params/Trial.jsx +++ /dev/null @@ -1,165 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import withStyles from '@material-ui/styles/withStyles'; -import Grid from '@material-ui/core/Grid'; -import Tooltip from '@material-ui/core/Tooltip'; -import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; -import Typography from '@material-ui/core/Typography'; -import OutlinedInput from '@material-ui/core/OutlinedInput'; -import InputLabel from '@material-ui/core/InputLabel'; -import MenuItem from '@material-ui/core/MenuItem'; -import FormControl from '@material-ui/core/FormControl'; -import Select from '@material-ui/core/Select'; - -import { filterTemplatesExperiment, changeTemplateName } from '../../../../actions/generalActions'; -import { fetchTrialTemplates } from '../../../../actions/templateActions'; - -const module = 'hpCreate'; -const generalModule = 'general'; - -const styles = theme => ({ - help: { - padding: 4 / 2, - verticalAlign: 'middle', - marginRight: 5, - }, - section: { - padding: 4, - }, - parameter: { - padding: 2, - marginBottom: 10, - }, - trialForm: { - margin: 4, - width: '100%', - }, - selectForm: { - margin: 4, - width: '20%', - }, - selectNS: { - marginRight: 10, - }, -}); - -class TrialSpecParam extends React.Component { - componentDidMount() { - this.props.fetchTrialTemplates(); - } - - onTrialNamespaceChange = event => { - this.props.filterTemplatesExperiment(event.target.value, ''); - }; - - onTrialConfigMapChange = event => { - this.props.filterTemplatesExperiment(this.props.templateNamespace, event.target.value); - }; - - onTrialTemplateChange = event => { - this.props.changeTemplateName(event.target.value); - }; - - render() { - const { classes } = this.props; - return ( -
-
- - - - - - - {'Namespace and ConfigMapName'} - - - - - Namespace - - - - ConfigMap - - - - -
-
- - - - - - - {'Trial Template Name'} - - - - - Trial Template - - - - -
-
- ); - } -} - -const mapStateToProps = state => { - return { - trialTemplatesList: state[generalModule].trialTemplatesList, - templateNamespace: state[generalModule].templateNamespace, - templateConfigMapName: state[generalModule].templateConfigMapName, - currentTemplateConfigMapsList: state[generalModule].currentTemplateConfigMapsList, - templateName: state[generalModule].templateName, - currentTemplateNamesList: state[generalModule].currentTemplateNamesList, - }; -}; - -export default connect(mapStateToProps, { - filterTemplatesExperiment, - changeTemplateName, - fetchTrialTemplates, -})(withStyles(styles)(TrialSpecParam)); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/YAML.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Create/YAML.jsx deleted file mode 100644 index c897eb845f9..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Create/YAML.jsx +++ /dev/null @@ -1,81 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import makeStyles from '@material-ui/styles/makeStyles'; - -import AceEditor from 'react-ace'; -import 'ace-builds/src-noconflict/theme-sqlserver'; -import 'ace-builds/src-noconflict/mode-yaml'; - -import Button from '@material-ui/core/Button'; -import Typography from '@material-ui/core/Typography'; - -import { changeYaml } from '../../../actions/hpCreateActions'; -import { submitYaml } from '../../../actions/generalActions'; - -const module = 'hpCreate'; -const generalModule = 'general'; - -const useStyles = makeStyles({ - editor: { - margin: '0 auto', - }, - submit: { - textAlign: 'center', - marginTop: 10, - }, - button: { - margin: 15, - }, -}); - -const YAML = props => { - const onYamlChange = value => { - props.changeYaml(value); - }; - - const submitWholeYaml = () => { - props.submitYaml(props.currentYaml, props.globalNamespace); - }; - - const classes = useStyles(); - return ( -
- {'Generate'} -
-
- -
-
- -
-
- ); -}; - -const mapStateToProps = state => { - return { - currentYaml: state[module].currentYaml, - globalNamespace: state[generalModule].globalNamespace, - }; -}; - -export default connect(mapStateToProps, { changeYaml, submitYaml })(YAML); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/FilterPanel.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/FilterPanel.jsx deleted file mode 100644 index 66880bb302b..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/FilterPanel.jsx +++ /dev/null @@ -1,137 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { withStyles } from '@material-ui/core/styles'; - -import TextField from '@material-ui/core/TextField'; -import FormGroup from '@material-ui/core/FormGroup'; -import FormControlLabel from '@material-ui/core/FormControlLabel'; -import Switch from '@material-ui/core/Switch'; -import Button from '@material-ui/core/Button'; -import Select from '@material-ui/core/Select'; -import InputLabel from '@material-ui/core/InputLabel'; -import MenuItem from '@material-ui/core/MenuItem'; -import FormControl from '@material-ui/core/FormControl'; - -import { filterJobs, changeType, fetchHPJobs } from '../../../actions/hpMonitorActions'; -import { fetchNamespaces } from '../../../actions/generalActions'; - -const module = 'hpMonitor'; -const generalModule = 'general'; - -const styles = theme => ({ - textField: { - marginLeft: theme.spacing.unit, - marginRight: theme.spacing.unit, - }, - filter: { - margin: '0 auto', - textAlign: 'center', - }, - selectBox: { - marginLeft: theme.spacing.unit, - marginRight: theme.spacing.unit, - width: 200, - height: 56, - textAlign: 'left', - }, -}); - -class FilterPanel extends React.Component { - componentDidMount() { - if (this.props.globalNamespace != '') { - this.props.filterJobs(this.props.experimentName, this.props.globalNamespace); - } else { - this.props.fetchNamespaces(); - this.props.filterJobs(this.props.experimentName, this.props.experimentNamespace); - } - } - - handleType = name => event => { - this.props.changeType(name, event.target.checked); - }; - - onNameChange = event => { - this.props.filterJobs(event.target.value, this.props.experimentNamespace); - }; - - onNamespaceChange = event => { - this.props.filterJobs(this.props.experimentName, event.target.value); - }; - - render() { - const { classes } = this.props; - - return ( -
- - - Namespace - {this.props.globalNamespace === '' ? ( - - ) : ( - - )} - - - {Object.keys(this.props.filterType).map((filter, i) => { - return ( - - } - label={filter} - /> - ); - })} - - -
- ); - } -} - -const mapStateToProps = state => { - return { - experimentName: state[module].experimentName, - experimentNamespace: state[module].experimentNamespace, - filterType: state[module].filterType, - namespaces: state[generalModule].namespaces, - globalNamespace: state[generalModule].globalNamespace, - }; -}; - -export default connect(mapStateToProps, { filterJobs, changeType, fetchHPJobs, fetchNamespaces })( - withStyles(styles)(FilterPanel), -); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobInfo.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobInfo.jsx deleted file mode 100644 index 164d096d125..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobInfo.jsx +++ /dev/null @@ -1,120 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import { withStyles } from '@material-ui/core'; -import Typography from '@material-ui/core/Typography'; -import Button from '@material-ui/core/Button'; -import { Link } from 'react-router-dom'; -import LinearProgress from '@material-ui/core/LinearProgress'; -import Grid from '@material-ui/core/Grid'; - -import { fetchHPJobInfo } from '../../../actions/hpMonitorActions'; -import { fetchExperiment, fetchSuggestion } from '../../../actions/generalActions'; - -import HPJobPlot from './HPJobPlot'; -import HPJobTable from './HPJobTable'; -import TrialInfoDialog from './TrialInfoDialog'; -import ExperimentInfoDialog from '../../Common/ExperimentInfoDialog'; -import SuggestionInfoDialog from '../../Common/SuggestionInfoDialog'; - -const module = 'hpMonitor'; - -const styles = theme => ({ - root: { - width: '90%', - margin: '0 auto', - padding: 20, - }, - loading: { - marginTop: 30, - }, - header: { - marginTop: 10, - textAlign: 'center', - marginBottom: 15, - }, - link: { - textDecoration: 'none', - }, - grid: { - marginBottom: 10, - }, -}); - -class HPJobInfo extends React.Component { - componentDidMount() { - this.props.fetchHPJobInfo(this.props.match.params.name, this.props.match.params.namespace); - } - - fetchAndOpenDialogExperiment = (experimentName, experimentNamespace) => event => { - this.props.fetchExperiment(experimentName, experimentNamespace); - }; - - fetchAndOpenDialogSuggestion = (suggestionName, suggestionNamespace) => event => { - this.props.fetchSuggestion(suggestionName, suggestionNamespace); - }; - - render() { - const { classes } = this.props; - return ( -
- - - - {this.props.loading ? ( - - ) : ( -
- - Experiment Name: {this.props.match.params.name} - - - Experiment Namespace: {this.props.match.params.namespace} - - - - - - - - - - - - - - -
- )} -
- ); - } -} - -const mapStateToProps = state => ({ - loading: state[module].loading, -}); - -export default connect(mapStateToProps, { fetchHPJobInfo, fetchExperiment, fetchSuggestion })( - withStyles(styles)(HPJobInfo), -); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobList.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobList.jsx deleted file mode 100644 index adbdd079415..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobList.jsx +++ /dev/null @@ -1,98 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { withStyles } from '@material-ui/core/styles'; -import List from '@material-ui/core/List'; -import ListItem from '@material-ui/core/ListItem'; -import ListItemIcon from '@material-ui/core/ListItemIcon'; -import ListItemText from '@material-ui/core/ListItemText'; -import { Link } from 'react-router-dom'; -import { ListItemSecondaryAction, IconButton } from '@material-ui/core'; - -import { openDeleteExperimentDialog } from '../../../actions/generalActions'; -import DeleteDialog from '../../Menu/DeleteDialog'; - -import ScheduleIcon from '@material-ui/icons/Schedule'; -import RestoreIcon from '@material-ui/icons/Restore'; -import HighlightOffIcon from '@material-ui/icons/HighlightOff'; -import DoneIcon from '@material-ui/icons/Done'; -import DeleteIcon from '@material-ui/icons/Delete'; -import HourglassFullIcon from '@material-ui/icons/HourglassFull'; - -const module = 'hpMonitor'; - -const styles = theme => ({ - created: { - color: theme.colors.created, - }, - running: { - color: theme.colors.running, - }, - restarting: { - color: theme.colors.restarting, - }, - succeeded: { - color: theme.colors.succeeded, - }, - failed: { - color: theme.colors.failed, - }, -}); - -const HPJobList = props => { - const { classes } = props; - - const onDeleteExperiment = (name, namespace) => event => { - props.openDeleteExperimentDialog(name, namespace); - }; - - return ( -
- - {props.filteredJobsList.map((job, i) => { - let icon; - if (job.status === 'Created') { - icon = ; - } else if (job.status === 'Running') { - icon = ; - } else if (job.status === 'Restarting') { - icon = ; - } else if (job.status === 'Succeeded') { - icon = ; - } else if (job.status === 'Failed') { - icon = ; - } - return ( - - {icon} - - - - - - - - ); - })} - - -
- ); -}; - -const mapStateToProps = state => { - return { - filteredJobsList: state[module].filteredJobsList, - }; -}; - -export default connect(mapStateToProps, { openDeleteExperimentDialog })( - withStyles(styles)(HPJobList), -); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobMonitor.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobMonitor.jsx deleted file mode 100644 index 7c197d925a4..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobMonitor.jsx +++ /dev/null @@ -1,43 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import { withStyles } from '@material-ui/core/styles'; -import Typography from '@material-ui/core/Typography'; - -import FilterPanel from './FilterPanel'; -import HPJobList from './HPJobList'; - -import { fetchHPJobs } from '../../../actions/hpMonitorActions'; - -const styles = theme => ({ - root: { - width: '90%', - margin: '0 auto', - marginTop: 10, - }, - text: { - marginBottom: 20, - }, -}); - -class HPJobMonitor extends React.Component { - componentDidMount() { - this.props.fetchHPJobs(); - } - - render() { - const { classes } = this.props; - - return ( -
- - {'Experiment Monitor'} - - - -
- ); - } -} - -export default connect(null, { fetchHPJobs })(withStyles(styles)(HPJobMonitor)); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobPlot.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobPlot.jsx deleted file mode 100644 index 2e5d8f1a62f..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobPlot.jsx +++ /dev/null @@ -1,97 +0,0 @@ -import React from 'react'; -import makeStyles from '@material-ui/styles/makeStyles'; - -import { connect } from 'react-redux'; -import Plot from 'react-plotly.js'; - -const module = 'hpMonitor'; - -const useStyles = makeStyles({ - root: { - textAlign: 'center', - }, -}); - -const HPJobPlot = props => { - const classes = useStyles(); - let dimensions = []; - let isShowPlot = false; - - if (props.jobData && props.jobData.length > 1) { - // everything for the third column - let header = props.jobData[0]; - let data = props.jobData.slice(1); - for (let i = 2; i < data[0].length; i++) { - if (header[i] !== '') { - let track = { - label: header[i], - }; - let flag = 'number'; - let values = []; - for (let j = 0; j < data.length; j++) { - if (data[j][1] == 'Succeeded') { - isShowPlot = true; - let number = Number(data[j][i]); - if (isNaN(number)) { - flag = 'string'; - values.push(data[j][i]); - } else { - values.push(number); - } - } - } - track.values = values; - if (flag === 'number' && flag !== 'string') { - track.range = [Math.min.apply(null, values), Math.max.apply(null, values)]; - if (Math.min.apply(null, values) < 1) { - track.tickformat = '.3f'; - } else { - track.tickformat = 'd'; - } - } else { - // check logic - // track.ticktext = values; - let options = new Set(values); - options = [...options]; - let mapping = {}; - for (let k = 0; k < options.length; k++) { - mapping[options[k]] = k; - } - track.tickvals = options.map((option, index) => index); - track.ticktext = options.map((option, index) => option); - track.values = values.map((value, index) => mapping[value]); - track.constraintrange = [0, values.length]; - } - dimensions.push(track); - } - } - } - - return ( -
- {props.jobData.length > 1 && isShowPlot && ( - - )} -
- ); -}; - -const mapStateToProps = state => ({ - jobData: state[module].jobData, -}); - -export default connect(mapStateToProps, null)(HPJobPlot); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobTable.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobTable.jsx deleted file mode 100644 index d41a5db98b1..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/HPJobTable.jsx +++ /dev/null @@ -1,127 +0,0 @@ -import React from 'react'; -import { withStyles } from '@material-ui/core/styles'; -import Table from '@material-ui/core/Table'; -import TableBody from '@material-ui/core/TableBody'; -import TableCell from '@material-ui/core/TableCell'; -import TableHead from '@material-ui/core/TableHead'; -import TableRow from '@material-ui/core/TableRow'; -import Paper from '@material-ui/core/Paper'; - -import { connect } from 'react-redux'; -import { fetchHPJobTrialInfo } from '../../../actions/hpMonitorActions'; - -const module = 'hpMonitor'; - -const styles = theme => ({ - root: { - width: '100%', - marginTop: theme.spacing.unit * 3, - overflowX: 'auto', - }, - table: { - minWidth: 700, - }, - hover: { - '&:hover': { - cursor: 'pointer', - }, - }, - created: { - color: theme.colors.created, - }, - running: { - color: theme.colors.running, - }, - succeeded: { - color: theme.colors.succeeded, - }, - killed: { - color: theme.colors.killed, - }, - failed: { - color: theme.colors.failed, - }, -}); - -class HPJobTable extends React.Component { - fetchAndOpenDialogTrial = trialName => event => { - this.props.fetchHPJobTrialInfo(trialName, this.props.namespace); - }; - - render() { - const { classes } = this.props; - - let header = []; - let data = []; - if (this.props.jobData && this.props.jobData.length > 1) { - header = this.props.jobData[0]; - // TODO: Add sorting by each table column - // Sort jobData by Trial Status - data = this.props.jobData.slice(1).sort(function(a, b) { - if (a[1] < b[1]) { - return -1; - } - if (a[1] > b[1]) { - return 1; - } - return 0; - }); - } - return ( - - {this.props.jobData.length > 1 && ( - - - - {header.map(header => ( - {header} - ))} - - - - {data.map((row, id) => ( - - {row.map((element, index) => { - if (index === 0 && row[1] == 'Succeeded') { - return ( - - {element} - - ); - } else if (index === 1) { - if (element === 'Created') { - return {element}; - } else if (element === 'Running') { - return {element}; - } else if (element === 'Succeeded') { - return {element}; - } else if (element === 'Killed') { - return {element}; - } else if (element === 'Failed') { - return {element}; - } - } else { - return {element}; - } - })} - - ))} - -
- )} -
- ); - } -} - -const mapStateToProps = state => ({ - jobData: state[module].jobData, -}); - -export default connect(mapStateToProps, { fetchHPJobTrialInfo })(withStyles(styles)(HPJobTable)); diff --git a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/TrialInfoDialog.jsx b/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/TrialInfoDialog.jsx deleted file mode 100644 index 64837c2b8e5..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/HP/Monitor/TrialInfoDialog.jsx +++ /dev/null @@ -1,94 +0,0 @@ -import React from 'react'; -import { withStyles } from '@material-ui/styles'; -import Dialog from '@material-ui/core/Dialog'; -import DialogContent from '@material-ui/core/DialogContent'; -import DialogTitle from '@material-ui/core/DialogTitle'; -import { connect } from 'react-redux'; - -import { closeDialogTrial } from '../../../actions/hpMonitorActions'; -import Plot from 'react-plotly.js'; - -const module = 'hpMonitor'; - -const styles = theme => ({ - header: { - textAlign: 'center', - }, -}); - -const TrialInfoDialog = props => { - const { classes } = props; - - let dataToPlot = []; - if (props.trialData.length !== 0) { - let data = props.trialData.slice(1); - let tracks = {}; - for (let i = 0; i < data.length; i++) { - // Data format should be ["metricName", "time", "value"] - if (data[i].length == 3) { - if (typeof tracks[data[i][0]] !== 'undefined') { - tracks[data[i][0]].x.push(data[i][1]); - tracks[data[i][0]].y.push(Number(data[i][2])); - } else { - tracks[data[i][0]] = {}; - tracks[data[i][0]].x = [data[i][1]]; - tracks[data[i][0]].y = [Number(data[i][2])]; - } - } - } - - //For plot legend - let keys = Object.keys(tracks); - keys.map((key, i) => { - if (key !== '') { - dataToPlot.push({ - x: tracks[key].x, - y: tracks[key].y, - type: 'scatter', - mode: 'line', - name: key, - showlegend: true, - hoverinfo: 'x+y', - }); - } - }); - } - return ( - - - {'Trial Name: ' + props.trialName} - - - - - - ); -}; - -const mapStateToProps = state => { - return { - open: state[module].dialogTrialOpen, - trialData: state[module].trialData, - trialName: state[module].trialName, - }; -}; - -export default connect(mapStateToProps, { closeDialogTrial })(withStyles(styles)(TrialInfoDialog)); diff --git a/pkg/ui/v1alpha3/frontend/src/components/KubeflowDashboard.jsx b/pkg/ui/v1alpha3/frontend/src/components/KubeflowDashboard.jsx deleted file mode 100644 index bb51b6870d1..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/KubeflowDashboard.jsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import { CHANGE_GLOBAL_NAMESPACE } from '../actions/generalActions'; -import generalReducer from '../reducers/general'; - -// TODO: Think about better way of update namespace -// Right now, after updating namespace in select list -// user must go to Kubeflow dashboard home page to update Global Namespace in Katib UI -function onGlobalNamespaceChange(namespace) { - generalReducer(undefined, { type: CHANGE_GLOBAL_NAMESPACE, globalNamespace: namespace }); -} - -class KubeflowDashboard extends React.Component { - componentDidMount() { - window.addEventListener('DOMContentLoaded', function(event) { - if (window.centraldashboard && window.centraldashboard.CentralDashboardEventHandler) { - // Init method will invoke the callback with the event handler instance - // and a boolean indicating whether the page is iframed or not - window.centraldashboard.CentralDashboardEventHandler.init(function(cdeh) { - // Binds a callback that gets invoked anytime the Dashboard's - // namespace is changed - cdeh.onNamespaceSelected = namespace => { - onGlobalNamespaceChange(namespace); - }; - }); - } - }); - } - - render() { - return
; - } -} - -export default KubeflowDashboard; diff --git a/pkg/ui/v1alpha3/frontend/src/components/Menu/DeleteDialog.jsx b/pkg/ui/v1alpha3/frontend/src/components/Menu/DeleteDialog.jsx deleted file mode 100644 index 23a91759420..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Menu/DeleteDialog.jsx +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react'; -import Button from '@material-ui/core/Button'; -import Dialog from '@material-ui/core/Dialog'; -import DialogActions from '@material-ui/core/DialogActions'; -import DialogContent from '@material-ui/core/DialogContent'; -import DialogContentText from '@material-ui/core/DialogContentText'; -import DialogTitle from '@material-ui/core/DialogTitle'; -import makeStyles from '@material-ui/styles/makeStyles'; - -import { connect } from 'react-redux'; -import { deleteExperiment, closeDeleteExperimentDialog } from '../../actions/generalActions'; - -const module = 'general'; - -const useStyles = makeStyles({ - root: {}, -}); - -const DeleteDialog = props => { - const classes = useStyles(); - - const onDelete = () => { - props.deleteExperiment(props.deleteExperimentName, props.deleteExperimentNamespace); - }; - - return ( - - {'Delete Experiment?'} - - - Are you sure you want to delete this experiment? - - - - - - - - ); -}; - -const mapStateToProps = state => ({ - open: state[module].deleteDialog, - deleteExperimentName: state[module].deleteExperimentName, - deleteExperimentNamespace: state[module].deleteExperimentNamespace, -}); - -export default connect(mapStateToProps, { closeDeleteExperimentDialog, deleteExperiment })( - DeleteDialog, -); diff --git a/pkg/ui/v1alpha3/frontend/src/components/Menu/Header.jsx b/pkg/ui/v1alpha3/frontend/src/components/Menu/Header.jsx deleted file mode 100644 index 6bbd813887a..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Menu/Header.jsx +++ /dev/null @@ -1,63 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { Link } from 'react-router-dom'; - -import makeStyles from '@material-ui/styles/makeStyles'; -import { withStyles } from '@material-ui/core/styles'; - -import AppBar from '@material-ui/core/AppBar'; -import Toolbar from '@material-ui/core/Toolbar'; -import Typography from '@material-ui/core/Typography'; -import IconButton from '@material-ui/core/IconButton'; -import MenuIcon from '@material-ui/icons/Menu'; - -import Menu from './Menu'; - -import { toggleMenu } from '../../actions/generalActions'; - -const useStyles = makeStyles({ - menuButton: { - marginLeft: -12, - marginRight: 20, - }, -}); - -const KatibLink = withStyles({ - root: { - textDecoration: 'none', - '&:hover': { - color: '#40a9ff', - }, - }, -})(Typography); - -const Header = props => { - const classes = useStyles(); - - const toggleMenu = event => { - props.toggleMenu(true); - }; - - return ( -
- - - - - - - Katib - - - - -
- ); -}; - -export default connect(null, { toggleMenu })(Header); diff --git a/pkg/ui/v1alpha3/frontend/src/components/Menu/Main.jsx b/pkg/ui/v1alpha3/frontend/src/components/Menu/Main.jsx deleted file mode 100644 index 39fd6ee30ca..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Menu/Main.jsx +++ /dev/null @@ -1,84 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; - -import { makeStyles } from '@material-ui/styles'; -import Paper from '@material-ui/core/Paper'; -import Typography from '@material-ui/core/Typography'; -import Grid from '@material-ui/core/Grid'; - -import * as constants from '../../constants/constants'; - -const useStyles = makeStyles({ - root: { - margin: '0 auto', - marginTop: 50, - flexGrow: 1, - width: '50%', - height: 400, - textAlign: 'center', - }, - item: { - padding: '40px !important', - textDecoration: 'none !important', - }, - block: { - backgroundColor: '#4e4e4e', - height: '100%', - width: '100%', - padding: 40, - '&:hover': { - backgroundColor: 'black', - }, - }, - link: { - textDecoration: 'none', - color: '#1890ff', - }, -}); - -const Main = props => { - const classes = useStyles(); - - return ( - - Welcome to Katib - Choose type of experiment -
- - - - - Hyperparameter Tuning - - - - - - - Neural Architecture Search - - - - -
- - For usage instructions, see the{' '} -
- Kubeflow docs - - - - To contribute to Katib, visit{' '} - - GitHub - - - - ); -}; - -export default Main; diff --git a/pkg/ui/v1alpha3/frontend/src/components/Menu/Menu.jsx b/pkg/ui/v1alpha3/frontend/src/components/Menu/Menu.jsx deleted file mode 100644 index 8b76a801467..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Menu/Menu.jsx +++ /dev/null @@ -1,184 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { Link } from 'react-router-dom'; - -import makeStyles from '@material-ui/styles/makeStyles'; -import Drawer from '@material-ui/core/Drawer'; -import List from '@material-ui/core/List'; -import Typography from '@material-ui/core/Typography'; -import Divider from '@material-ui/core/Divider'; -import ListItem from '@material-ui/core/ListItem'; -import ListItemIcon from '@material-ui/core/ListItemIcon'; -import ListItemText from '@material-ui/core/ListItemText'; -import Collapse from '@material-ui/core/Collapse'; -import TuneIcon from '@material-ui/icons/Tune'; -import NoteAddIcon from '@material-ui/icons/NoteAdd'; -import WatchLaterIcon from '@material-ui/icons/WatchLater'; -import SearchIcon from '@material-ui/icons/Search'; -import SettingsIcon from '@material-ui/icons/Settings'; -import ExpandLess from '@material-ui/icons/ExpandLess'; -import ExpandMore from '@material-ui/icons/ExpandMore'; -import InfoIcon from '@material-ui/icons/Info'; - -import { toggleMenu } from '../../actions/generalActions'; - -const module = 'general'; - -const useStyles = makeStyles({ - list: { - width: 250, - }, - nested: { - paddingLeft: 10 * 4, - }, -}); - -const Menu = props => { - const [hp, setHP] = React.useState(false); - const [nas, setNAS] = React.useState(false); - - const toggleHP = () => { - setHP(!hp); - }; - - const toggleNAS = () => { - setNAS(!nas); - }; - - const classes = useStyles(); - - const onCloseMenu = () => { - props.toggleMenu(false); - }; - - // Add links - const color = 'primary'; - const iconColor = 'primary'; - const variant = 'title'; - return ( -
- - - {/* HP */} - - - - - - - HP - - - {hp ? : } - - - - - - - - - - Submit - - - - - - - - - - Monitor - - - - - - - {/* NAS */} - - - - - - - NAS - - - {hp ? : } - - - - - - - - - - Submit - - - - - - - - - - Monitor - - - - - - - {/* TRIAL MANIFESTS */} - - - - - - - Trial Manifests - - - - - - -
- ); -}; - -const mapStateToProps = state => { - return { - menuOpen: state[module].menuOpen, - }; -}; - -export default connect(mapStateToProps, { toggleMenu })(Menu); diff --git a/pkg/ui/v1alpha3/frontend/src/components/Menu/Snack.jsx b/pkg/ui/v1alpha3/frontend/src/components/Menu/Snack.jsx deleted file mode 100644 index 474a52dee6f..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Menu/Snack.jsx +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react'; -import makeStyles from '@material-ui/styles/makeStyles'; -import Snackbar from '@material-ui/core/Snackbar'; -import IconButton from '@material-ui/core/IconButton'; - -import CloseIcon from '@material-ui/icons/Close'; - -import { connect } from 'react-redux'; -import { closeSnackbar } from '../../actions/generalActions'; - -const module = 'general'; - -const useStyles = makeStyles({ - close: { - padding: 4, - }, -}); - -const Snack = props => { - const classes = useStyles(); - - const vertical = 'top'; - const horizontal = 'center'; - return ( - {props.snackText}} - action={[ - - - , - ]} - /> - ); -}; - -const mapStateToProps = state => { - return { - snackText: state[module].snackText, - snackOpen: state[module].snackOpen, - }; -}; - -export default connect(mapStateToProps, { closeSnackbar })(Snack); diff --git a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/NASParameters.jsx b/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/NASParameters.jsx deleted file mode 100644 index 2b723d9bc25..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/NASParameters.jsx +++ /dev/null @@ -1,290 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import jsyaml from 'js-yaml'; - -import withStyles from '@material-ui/styles/withStyles'; -import Button from '@material-ui/core/Button'; -import Grid from '@material-ui/core/Grid'; -import Typography from '@material-ui/core/Typography'; - -import CommonParametersMeta from './Params/CommonMeta'; -import CommonParametersSpec from './Params/CommonSpec'; -import Objective from './Params/Objective'; -import Algorithm from './Params/Algorithm'; -import TrialSpecParam from './Params/Trial'; -import NASConfig from './Params/NASConfig'; - -import { submitNASJob } from '../../../actions/nasCreateActions'; -import MetricsCollectorSpec from '../../Common/Create/Params/MetricsCollector'; - -import { validationError } from '../../../actions/generalActions'; -import * as constants from '../../../constants/constants'; - -const module = 'nasCreate'; -const generalModule = 'general'; - -const styles = theme => ({ - root: { - width: '90%', - margin: '0 auto', - }, - submit: { - textAlign: 'center', - marginTop: 10, - }, - textField: { - marginLeft: 4, - marginRight: 4, - width: '100%', - }, - help: { - padding: 4 / 2, - verticalAlign: 'middle', - }, - section: { - padding: 4, - }, - parameter: { - padding: 2, - }, - formControl: { - margin: 4, - width: '100%', - }, - selectEmpty: { - marginTop: 10, - }, - addButton: { - margin: 10, - }, -}); - -const SectionInTypography = (name, classes) => { - return ( -
- - - {name} -
-
-
-
- ); -}; - -// probably get render into a function -const deCapitalizeFirstLetterAndAppend = (source, destination) => { - source.map((parameter, i) => { - let value = Number(parameter.value); - let name = parameter.name.charAt(0).toLowerCase() + parameter.name.slice(1); - destination[name] = isNaN(value) ? parameter.value : value; - }); -}; - -const addAlgorithmSettings = (spec, destination) => { - spec.map((parameter, i) => { - destination.push(parameter); - }); -}; - -const addOperations = (source, destination) => { - source.map((operation, index) => { - let parameters = []; - operation.parameters.map((param, i) => { - let tempParam = {}; - tempParam.name = param.name; - tempParam.parametertype = param.parameterType; - tempParam.feasibleSpace = {}; - if (param.feasibleSpace === 'list') { - tempParam.feasibleSpace.list = param.list.map((param, i) => param.value); - } else { - tempParam.feasibleSpace.min = param.min; - tempParam.feasibleSpace.max = param.max; - tempParam.feasibleSpace.step = param.step; - } - parameters.push(tempParam); - }); - destination.push({ - operationType: operation.operationType, - parameters: parameters, - }); - }); -}; - -const NASParameters = props => { - const submitNASJob = () => { - let data = {}; - - data.metadata = {}; - deCapitalizeFirstLetterAndAppend(props.commonParametersMetadata, data.metadata); - - data.spec = {}; - deCapitalizeFirstLetterAndAppend(props.commonParametersSpec, data.spec); - - data.spec.objective = {}; - deCapitalizeFirstLetterAndAppend(props.objective, data.spec.objective); - data.spec.objective.additionalMetricNames = props.additionalMetricNames.map( - (metrics, i) => metrics.value, - ); - - data.spec.algorithm = {}; - data.spec.algorithm.algorithmName = props.algorithmName; - data.spec.algorithm.algorithmSettings = []; - addAlgorithmSettings(props.algorithmSettings, data.spec.algorithm.algorithmSettings); - - data.spec.nasConfig = {}; - data.spec.nasConfig.graphConfig = { - numLayers: Number(props.numLayers), - inputSizes: props.inputSize.map(size => Number(size)), - outputSizes: props.outputSize.map(size => Number(size)), - }; - data.spec.nasConfig.operations = []; - addOperations(props.operations, data.spec.nasConfig.operations); - - // Metrics Collector - let newMCSpec = JSON.parse(JSON.stringify(props.mcSpec)); - - // Delete empty metrics format - if ( - newMCSpec.source.filter.metricsFormat.length === 0 || - newMCSpec.collector.kind === constants.MC_KIND_NONE - ) { - delete newMCSpec.source.filter; - } - - if ( - newMCSpec.collector.kind === constants.MC_KIND_STDOUT || - newMCSpec.collector.kind === constants.MC_KIND_NONE - ) { - // Delete fileSystemPath and httpGet - delete newMCSpec.source.fileSystemPath; - delete newMCSpec.source.httpGet; - } - - if ( - newMCSpec.collector.kind === constants.MC_KIND_FILE || - newMCSpec.collector.kind === constants.MC_KIND_TENSORFLOW_EVENT || - newMCSpec.collector.kind === constants.MC_KIND_CUSTOM - ) { - // Delete httpGet - delete newMCSpec.source.httpGet; - // Delete empty fileSystemPath - if (newMCSpec.source.fileSystemPath.kind === constants.MC_FILE_SYSTEM_NO_KIND) { - delete newMCSpec.source.fileSystemPath; - } - } - - if (newMCSpec.collector.kind === constants.MC_KIND_PROMETHEUS) { - // Delete file System Path - delete newMCSpec.source.fileSystemPath; - // Delete empty host - if (newMCSpec.source.httpGet.host === '') { - delete newMCSpec.source.httpGet.host; - } - // Delete empty headers - if (newMCSpec.source.httpGet.httpHeaders.length === 0) { - delete newMCSpec.source.httpGet.httpHeaders; - } - } - - // Delete empty source - if (newMCSpec.source != undefined && Object.keys(newMCSpec.source).length === 0) { - delete newMCSpec.source; - } - - // Add Custom Container YAML to the Metrics Collector - if ( - newMCSpec.collector.kind === constants.MC_KIND_CUSTOM && - props.mcCustomContainerYaml != '' - ) { - try { - let mcCustomContainerJson = jsyaml.load(props.mcCustomContainerYaml); - newMCSpec.collector.customCollector = mcCustomContainerJson; - } catch { - props.validationError('Metrics Collector Custom Container is not valid YAML!'); - return; - } - } - - data.spec.metricsCollectorSpec = newMCSpec; - - data.spec.trialTemplate = { - goTemplate: { - templateSpec: { - configMapName: props.templateConfigMapName, - configMapNamespace: props.templateNamespace, - templatePath: props.templateName, - }, - }, - }; - - props.submitNASJob(data); - }; - - const { classes } = props; - - return ( -
- {/* Common Metadata */} - {SectionInTypography('Metadata', classes)} - - {SectionInTypography('Common Parameters', classes)} - - {SectionInTypography('Objective', classes)} - - {SectionInTypography('Algorithm', classes)} - - {SectionInTypography('NAS Config', classes)} - - {SectionInTypography('Metrics Collector Spec', classes)} - - {SectionInTypography('Trial Spec', classes)} - -
- -
-
- ); -}; - -// TODO: think of a better way of passing those -const mapStateToProps = state => ({ - commonParametersMetadata: state[module].commonParametersMetadata, - commonParametersSpec: state[module].commonParametersSpec, - objective: state[module].objective, - additionalMetricNames: state[module].additionalMetricNames, - algorithmName: state[module].algorithmName, - algorithmSettings: state[module].algorithmSettings, - numLayers: state[module].numLayers, - inputSize: state[module].inputSize, - outputSize: state[module].outputSize, - operations: state[module].operations, - templateNamespace: state[generalModule].templateNamespace, - templateConfigMapName: state[generalModule].templateConfigMapName, - templateName: state[generalModule].templateName, - trial: state[module].trial, - trialNamespace: state[module].trialNamespace, - mcSpec: state[module].mcSpec, - mcCustomContainerYaml: state[module].mcCustomContainerYaml, -}); - -//TODO: Added validation and remove it -// NASParameters.propTypes = { -// numLayers: PropTypes.number, -// trial: PropTypes.string, -// requestNumber: PropTypes.number, -// suggestionAlgorithm: PropTypes.string, -// metricsName: PropTypes.arrayOf(PropTypes.string), -// } - -export default connect(mapStateToProps, { submitNASJob, validationError })( - withStyles(styles)(NASParameters), -); diff --git a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/Algorithm.jsx b/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/Algorithm.jsx deleted file mode 100644 index c54dfeaa2b3..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/Algorithm.jsx +++ /dev/null @@ -1,171 +0,0 @@ -import React from 'react'; -import makeStyles from '@material-ui/styles/makeStyles'; -import Button from '@material-ui/core/Button'; -import Grid from '@material-ui/core/Grid'; -import Tooltip from '@material-ui/core/Tooltip'; -import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; -import Typography from '@material-ui/core/Typography'; -import OutlinedInput from '@material-ui/core/OutlinedInput'; -import MenuItem from '@material-ui/core/MenuItem'; -import FormControl from '@material-ui/core/FormControl'; -import Select from '@material-ui/core/Select'; -import InputLabel from '@material-ui/core/InputLabel'; -import TextField from '@material-ui/core/TextField'; -import IconButton from '@material-ui/core/IconButton'; - -import DeleteIcon from '@material-ui/icons/Delete'; - -import { connect } from 'react-redux'; -import { - changeAlgorithmName, - addAlgorithmSetting, - changeAlgorithmSetting, - deleteAlgorithmSetting, -} from '../../../../actions/nasCreateActions'; - -const module = 'nasCreate'; - -const useStyles = makeStyles({ - textField: { - marginLeft: 4, - marginRight: 4, - width: '80%', - }, - help: { - padding: 4 / 2, - verticalAlign: 'middle', - marginRight: 5, - }, - parameter: { - padding: 2, - marginBottom: 10, - }, - icon: { - padding: 4, - margin: '0 auto', - verticalAlign: 'middle !important', - }, - formControl: { - margin: 4, - width: '100%', - }, - addButton: { - margin: 10, - }, -}); - -const Algorithm = props => { - const classes = useStyles(); - - const onAlgorithmNameChange = event => { - props.changeAlgorithmName(event.target.value); - }; - - const onAddAlgorithmSetting = () => { - props.addAlgorithmSetting(); - }; - - const onChangeAlgorithmSetting = (name, index) => event => { - props.changeAlgorithmSetting(index, name, event.target.value); - }; - - const onDeleteAlgorithmSetting = index => event => { - props.deleteAlgorithmSetting(index); - }; - - return ( -
- -
- - - - - - - {'Algorithm Name'} - - - - - Algorithm Name - - - - -
-
- {props.algorithmSettings.map((param, i) => { - return ( -
- - - - - - - - - - - - - - -
- ); - })} -
- ); -}; - -const mapStateToProps = state => { - return { - algorithmName: state[module].algorithmName, - allAlgorithms: state[module].allAlgorithms, - algorithmSettings: state[module].algorithmSettings, - }; -}; - -export default connect(mapStateToProps, { - changeAlgorithmName, - addAlgorithmSetting, - changeAlgorithmSetting, - deleteAlgorithmSetting, -})(Algorithm); diff --git a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/CommonMeta.jsx b/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/CommonMeta.jsx deleted file mode 100644 index dfd5302b182..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/CommonMeta.jsx +++ /dev/null @@ -1,95 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import Grid from '@material-ui/core/Grid'; -import Tooltip from '@material-ui/core/Tooltip'; -import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; -import Typography from '@material-ui/core/Typography'; -import TextField from '@material-ui/core/TextField'; - -import { changeMeta } from '../../../../actions/nasCreateActions'; -import { withStyles } from '@material-ui/core'; - -const module = 'nasCreate'; -const generalModule = 'general'; - -const styles = () => ({ - textField: { - marginLeft: 4, - marginRight: 4, - width: '100%', - }, - help: { - padding: 4 / 2, - verticalAlign: 'middle', - marginRight: 5, - }, - parameter: { - padding: 2, - marginBottom: 10, - }, -}); - -class CommonParametersMeta extends React.Component { - componentDidMount() { - if (this.props.globalNamespace != '') { - this.props.changeMeta('Namespace', this.props.globalNamespace); - } - } - - onMetaChange = param => event => { - this.props.changeMeta(param, event.target.value); - }; - - render() { - const { classes } = this.props; - - return ( -
- {this.props.commonParametersMetadata.map((param, i) => { - return ( -
- - - - - - - {param.name} - - - - {param.name == 'Namespace' && this.props.globalNamespace == '' && ( - - )} - {param.name == 'Namespace' && this.props.globalNamespace != '' && ( - - )} - {param.name != 'Namespace' && ( - - )} - - -
- ); - })} -
- ); - } -} - -const mapStateToProps = state => { - return { - commonParametersMetadata: state[module].commonParametersMetadata, - globalNamespace: state[generalModule].globalNamespace, - }; -}; - -export default connect(mapStateToProps, { changeMeta })(withStyles(styles)(CommonParametersMeta)); diff --git a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/CommonSpec.jsx b/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/CommonSpec.jsx deleted file mode 100644 index 97b396c3135..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/CommonSpec.jsx +++ /dev/null @@ -1,73 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import makeStyles from '@material-ui/styles/makeStyles'; -import Grid from '@material-ui/core/Grid'; -import Tooltip from '@material-ui/core/Tooltip'; -import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; -import Typography from '@material-ui/core/Typography'; -import TextField from '@material-ui/core/TextField'; - -import { changeSpec } from '../../../../actions/nasCreateActions'; - -const module = 'nasCreate'; - -const useStyles = makeStyles({ - textField: { - marginLeft: 4, - marginRight: 4, - width: '100%', - }, - help: { - padding: 4 / 2, - verticalAlign: 'middle', - marginRight: 5, - }, - parameter: { - padding: 2, - marginBottom: 10, - }, -}); - -const CommonParametersSpec = props => { - const classes = useStyles(); - - const onSpecChange = name => event => { - props.changeSpec(name, event.target.value); - }; - - return ( -
- {props.commonParametersSpec.map((param, i) => { - return ( -
- - - - - - - {param.name} - - - - - - -
- ); - })} -
- ); -}; - -const mapStateToProps = state => { - return { - commonParametersSpec: state[module].commonParametersSpec, - }; -}; - -export default connect(mapStateToProps, { changeSpec })(CommonParametersSpec); diff --git a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/NASConfig.jsx b/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/NASConfig.jsx deleted file mode 100644 index 56f2f0e5a51..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/NASConfig.jsx +++ /dev/null @@ -1,457 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import makeStyles from '@material-ui/styles/makeStyles'; -import Button from '@material-ui/core/Button'; -import Grid from '@material-ui/core/Grid'; -import Tooltip from '@material-ui/core/Tooltip'; -import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; -import Typography from '@material-ui/core/Typography'; -import TextField from '@material-ui/core/TextField'; -import IconButton from '@material-ui/core/IconButton'; -import AddIcon from '@material-ui/icons/Add'; -import DeleteIcon from '@material-ui/icons/Delete'; -import Fab from '@material-ui/core/Fab'; -import Divider from '@material-ui/core/Divider'; -import Select from '@material-ui/core/Select'; -import OutlinedInput from '@material-ui/core/OutlinedInput'; -import InputLabel from '@material-ui/core/InputLabel'; -import MenuItem from '@material-ui/core/MenuItem'; -import FormControl from '@material-ui/core/FormControl'; - -import Radio from '@material-ui/core/Radio'; -import RadioGroup from '@material-ui/core/RadioGroup'; -import FormControlLabel from '@material-ui/core/FormControlLabel'; - -import { - editNumLayers, - addSize, - editSize, - deleteSize, - addOperation, - deleteOperation, - changeOperation, - addParameter, - changeParameter, - deleteParameter, - addListParameter, - editListParameter, - deleteListParameter, -} from '../../../../actions/nasCreateActions'; - -const module = 'nasCreate'; - -const useStyles = makeStyles({ - textField: { - marginLeft: 4, - marginRight: 4, - width: '80%', - }, - numLayers: { - padding: 2, - marginBottom: 30, - }, - help: { - padding: 4 / 2, - verticalAlign: 'middle', - marginRight: 5, - }, - parameter: { - padding: 2, - marginBottom: 10, - }, - formControl: { - margin: 4, - width: '100%', - }, - selectEmpty: { - marginTop: 10, - }, - group: { - flexDirection: 'row', - justifyContent: 'space-around', - }, - divider: { - margin: 5, - }, - addButton: { - margin: 10, - }, - fab: { - margin: 2, - }, - section: { - marginTop: 20, - }, -}); - -const SectionInTypography = (name, classes, variant) => { - return ( -
- - - {name} -
-
-
-
- ); -}; - -const NASConfig = props => { - const classes = useStyles(); - - const onEditNumLayers = () => event => { - props.editNumLayers(event.target.value); - }; - const onAddSize = type => event => { - props.addSize(type); - }; - - const onEditSize = (index, type) => event => { - props.editSize(type, index, event.target.value); - }; - - const onDeleteSize = (index, type) => event => { - props.deleteSize(type, index); - }; - - const onDeleteOperation = index => event => { - props.deleteOperation(index); - }; - - const onChangeOperation = index => event => { - props.changeOperation(index, event.target.value); - }; - - const onAddParameter = opIndex => event => { - props.addParameter(opIndex); - }; - - const onChangeParameter = (opIndex, paramIndex, name) => event => { - props.changeParameter(opIndex, paramIndex, name, event.target.value); - }; - - const onDeleteParameter = (opIndex, paramIndex) => event => { - props.deleteParameter(opIndex, paramIndex); - }; - - const onAddListParameter = (opIndex, paramIndex) => event => { - props.addListParameter(opIndex, paramIndex); - }; - - const onDeleteListParameter = (opIndex, paramIndex, listIndex) => event => { - props.deleteListParameter(opIndex, paramIndex, listIndex); - }; - - const onEditListParameter = (opIndex, paramIndex, listIndex) => event => { - props.editListParameter(opIndex, paramIndex, listIndex, event.target.value); - }; - - return ( -
- {/* NUM LAYERS */} -
- - - - - - - {'NumLayers'} - - - - - - -
- {/* INPUT SIZE */} -
- - - - - - - {'InputSizes'} - - - - {props.inputSize.map((size, index) => { - return ( -
- - - - -
- ); - })} -
- - - - - -
-
- {/* OUTPUT SIZE */} -
- - - - - - - {'OutputSizes'} - - - - {props.outputSize.map((size, index) => { - return ( -
- - - - -
- ); - })} -
- - - - - -
-
- {/* OPERATIONS */} - {SectionInTypography('Operations', classes, 'h6')} -
- -
- {props.operations.map((operation, opIndex) => { - return ( -
-
- - - OperationType - - - - - - - - - -
-
-
- -
-
- {operation.parameters.map((param, paramIndex) => { - return ( -
- - - - - - - Parameter Type - - - - - - } - label="FeasibleSpace" - /> - } - label="List" - /> - - - - {param.feasibleSpace === 'list' && - param.list.map((element, elIndex) => { - return ( -
- - - - -
- ); - })} - {param.feasibleSpace === 'feasibleSpace' && ( -
- - - -
- )} -
- - {param.feasibleSpace === 'list' && ( - - - - )} - - - - - - -
-
- ); - })} - -
- ); - })} -
- ); -}; - -const mapStateToProps = state => { - return { - numLayers: state[module].numLayers, - inputSize: state[module].inputSize, - outputSize: state[module].outputSize, - operations: state[module].operations, - allParameterTypes: state[module].allParameterTypes, - }; -}; - -export default connect(mapStateToProps, { - editNumLayers, - addSize, - editSize, - deleteSize, - addOperation, - deleteOperation, - changeOperation, - addParameter, - changeParameter, - deleteParameter, - addListParameter, - editListParameter, - deleteListParameter, -})(NASConfig); diff --git a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/Objective.jsx b/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/Objective.jsx deleted file mode 100644 index 76ca9325058..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/Objective.jsx +++ /dev/null @@ -1,180 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import makeStyles from '@material-ui/styles/makeStyles'; -import Grid from '@material-ui/core/Grid'; -import Tooltip from '@material-ui/core/Tooltip'; -import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; -import Typography from '@material-ui/core/Typography'; -import TextField from '@material-ui/core/TextField'; -import IconButton from '@material-ui/core/IconButton'; -import DeleteIcon from '@material-ui/icons/Delete'; -import Fab from '@material-ui/core/Fab'; -import AddIcon from '@material-ui/icons/Add'; -import FormControl from '@material-ui/core/FormControl'; -import Select from '@material-ui/core/Select'; -import InputLabel from '@material-ui/core/InputLabel'; -import OutlinedInput from '@material-ui/core/OutlinedInput'; -import MenuItem from '@material-ui/core/MenuItem'; - -import { - changeObjective, - addMetrics, - editMetrics, - deleteMetrics, -} from '../../../../actions/nasCreateActions'; - -const module = 'nasCreate'; - -const useStyles = makeStyles({ - textField: { - marginLeft: 4, - marginRight: 4, - width: '100%', - }, - help: { - padding: 4 / 2, - verticalAlign: 'middle', - marginRight: 5, - }, - parameter: { - padding: 2, - marginBottom: 10, - }, - selectBox: { - width: 150, - }, -}); - -const Objective = props => { - const classes = useStyles(); - - const onObjectiveChange = name => event => { - props.changeObjective(name, event.target.value); - }; - - const onMetricsEdit = index => event => { - props.editMetrics(index, event.target.value); - }; - - const onMetricsDelete = index => event => { - props.deleteMetrics(index); - }; - - return ( -
- {props.objective.map((param, i) => { - return param.name === 'Type' ? ( -
- - - - - - - {param.name} - - - - - Objective Type - - - - -
- ) : ( -
- - - - - - - {param.name} - - - - - - -
- ); - })} -
- - - - - - - AdditionalMetricNames - - - - {props.additionalMetricNames.map((metrics, mIndex) => { - return ( - - - - - - - - - - - ); - })} - - - - - - - -
-
- ); -}; - -const mapStateToProps = state => { - return { - allObjectiveTypes: state[module].allObjectiveTypes, - objective: state[module].objective, - additionalMetricNames: state[module].additionalMetricNames, - }; -}; - -export default connect(mapStateToProps, { - changeObjective, - addMetrics, - editMetrics, - deleteMetrics, -})(Objective); diff --git a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/Trial.jsx b/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/Trial.jsx deleted file mode 100644 index 489cfd5e32a..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/Params/Trial.jsx +++ /dev/null @@ -1,165 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import withStyles from '@material-ui/styles/withStyles'; -import Grid from '@material-ui/core/Grid'; -import Tooltip from '@material-ui/core/Tooltip'; -import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; -import Typography from '@material-ui/core/Typography'; -import OutlinedInput from '@material-ui/core/OutlinedInput'; -import InputLabel from '@material-ui/core/InputLabel'; -import MenuItem from '@material-ui/core/MenuItem'; -import FormControl from '@material-ui/core/FormControl'; -import Select from '@material-ui/core/Select'; - -import { filterTemplatesExperiment, changeTemplateName } from '../../../../actions/generalActions'; -import { fetchTrialTemplates } from '../../../../actions/templateActions'; - -const module = 'nasCreate'; -const generalModule = 'general'; - -const styles = theme => ({ - help: { - padding: 4 / 2, - verticalAlign: 'middle', - marginRight: 5, - }, - section: { - padding: 4, - }, - parameter: { - padding: 2, - marginBottom: 10, - }, - trialForm: { - margin: 4, - width: '100%', - }, - selectForm: { - margin: 4, - width: '20%', - }, - selectNS: { - marginRight: 10, - }, -}); - -class TrialSpecParam extends React.Component { - componentDidMount() { - this.props.fetchTrialTemplates(); - } - - onTrialNamespaceChange = event => { - this.props.filterTemplatesExperiment(event.target.value, ''); - }; - - onTrialConfigMapChange = event => { - this.props.filterTemplatesExperiment(this.props.templateNamespace, event.target.value); - }; - - onTrialTemplateChange = event => { - this.props.changeTemplateName(event.target.value); - }; - - render() { - const { classes } = this.props; - return ( -
-
- - - - - - - {'Namespace and ConfigMapName'} - - - - - Namespace - - - - ConfigMap - - - - -
-
- - - - - - - {'Trial Template Name'} - - - - - Trial Template - - - - -
-
- ); - } -} - -const mapStateToProps = state => { - return { - trialTemplatesList: state[generalModule].trialTemplatesList, - templateNamespace: state[generalModule].templateNamespace, - templateConfigMapName: state[generalModule].templateConfigMapName, - currentTemplateConfigMapsList: state[generalModule].currentTemplateConfigMapsList, - templateName: state[generalModule].templateName, - currentTemplateNamesList: state[generalModule].currentTemplateNamesList, - }; -}; - -export default connect(mapStateToProps, { - filterTemplatesExperiment, - changeTemplateName, - fetchTrialTemplates, -})(withStyles(styles)(TrialSpecParam)); diff --git a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/YAML.jsx b/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/YAML.jsx deleted file mode 100644 index 8b980e3b82c..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/NAS/Create/YAML.jsx +++ /dev/null @@ -1,81 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import makeStyles from '@material-ui/styles/makeStyles'; - -import AceEditor from 'react-ace'; -import 'ace-builds/src-noconflict/theme-sqlserver'; -import 'ace-builds/src-noconflict/mode-yaml'; - -import Button from '@material-ui/core/Button'; -import Typography from '@material-ui/core/Typography'; - -import { changeYaml } from '../../../actions/nasCreateActions'; -import { submitYaml } from '../../../actions/generalActions'; - -const module = 'nasCreate'; -const generalModule = 'general'; - -const useStyles = makeStyles({ - editor: { - margin: '0 auto', - }, - submit: { - textAlign: 'center', - marginTop: 10, - }, - button: { - margin: 15, - }, -}); - -const YAML = props => { - const onYamlChange = value => { - props.changeYaml(value); - }; - - const submitWholeYaml = () => { - props.submitYaml(props.currentYaml, props.globalNamespace); - }; - - const classes = useStyles(); - return ( -
- {'Generate'} -
-
- -
-
- -
-
- ); -}; - -const mapStateToProps = state => { - return { - currentYaml: state[module].currentYaml, - globalNamespace: state[generalModule].globalNamespace, - }; -}; - -export default connect(mapStateToProps, { changeYaml, submitYaml })(YAML); diff --git a/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/FilterPanel.jsx b/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/FilterPanel.jsx deleted file mode 100644 index f6498c74360..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/FilterPanel.jsx +++ /dev/null @@ -1,137 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { withStyles } from '@material-ui/core/styles'; - -import TextField from '@material-ui/core/TextField'; -import FormGroup from '@material-ui/core/FormGroup'; -import FormControlLabel from '@material-ui/core/FormControlLabel'; -import Switch from '@material-ui/core/Switch'; -import Button from '@material-ui/core/Button'; -import Select from '@material-ui/core/Select'; -import InputLabel from '@material-ui/core/InputLabel'; -import MenuItem from '@material-ui/core/MenuItem'; -import FormControl from '@material-ui/core/FormControl'; - -import { filterJobs, changeType, fetchNASJobs } from '../../../actions/nasMonitorActions'; -import { fetchNamespaces } from '../../../actions/generalActions'; - -const module = 'nasMonitor'; -const generalModule = 'general'; - -const styles = theme => ({ - textField: { - marginLeft: theme.spacing.unit, - marginRight: theme.spacing.unit, - }, - filter: { - margin: '0 auto', - textAlign: 'center', - }, - selectBox: { - marginLeft: theme.spacing.unit, - marginRight: theme.spacing.unit, - width: 200, - height: 56, - textAlign: 'left', - }, -}); - -class FilterPanel extends React.Component { - componentDidMount() { - if (this.props.globalNamespace != '') { - this.props.filterJobs(this.props.experimentName, this.props.globalNamespace); - } else { - this.props.fetchNamespaces(); - this.props.filterJobs(this.props.experimentName, this.props.experimentNamespace); - } - } - - handleType = name => event => { - this.props.changeType(name, event.target.checked); - }; - - onNameChange = event => { - this.props.filterJobs(event.target.value, this.props.experimentNamespace); - }; - - onNamespaceChange = event => { - this.props.filterJobs(this.props.experimentName, event.target.value); - }; - - render() { - const { classes } = this.props; - - return ( -
- - - Namespace - {this.props.globalNamespace === '' ? ( - - ) : ( - - )} - - - {Object.keys(this.props.filterType).map((filter, i) => { - return ( - - } - label={filter} - /> - ); - })} - - -
- ); - } -} - -const mapStateToProps = state => { - return { - experimentName: state[module].experimentName, - experimentNamespace: state[module].experimentNamespace, - filterType: state[module].filterType, - namespaces: state[generalModule].namespaces, - globalNamespace: state[generalModule].globalNamespace, - }; -}; - -export default connect(mapStateToProps, { filterJobs, changeType, fetchNASJobs, fetchNamespaces })( - withStyles(styles)(FilterPanel), -); diff --git a/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobInfo.jsx b/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobInfo.jsx deleted file mode 100644 index 9249b5814c8..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobInfo.jsx +++ /dev/null @@ -1,142 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import { withStyles } from '@material-ui/core'; -import Button from '@material-ui/core/Button'; -import { Link } from 'react-router-dom'; -import ExpansionPanel from '@material-ui/core/ExpansionPanel'; -import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary'; -import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails'; -import Typography from '@material-ui/core/Typography'; -import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import LinearProgress from '@material-ui/core/LinearProgress'; -import Grid from '@material-ui/core/Grid'; - -import { fetchNASJobInfo } from '../../../actions/nasMonitorActions'; -import { fetchExperiment, fetchSuggestion } from '../../../actions/generalActions'; - -import NASJobStepInfo from './NASJobStepInfo'; -import ExperimentInfoDialog from '../../Common/ExperimentInfoDialog'; -import SuggestionInfoDialog from '../../Common/SuggestionInfoDialog'; - -const module = 'nasMonitor'; - -const styles = theme => ({ - root: { - width: '90%', - margin: '0 auto', - padding: 20, - }, - loading: { - marginTop: 30, - }, - heading: { - fontSize: theme.typography.pxToRem(15), - fontWeight: theme.typography.fontWeightRegular, - }, - panel: { - width: '100%', - }, - header: { - marginTop: 10, - textAlign: 'center', - marginBottom: 15, - }, - link: { - textDecoration: 'none', - }, - grid: { - marginBottom: 10, - }, -}); - -class NASJobInfo extends React.Component { - componentDidMount() { - this.props.fetchNASJobInfo(this.props.match.params.name, this.props.match.params.namespace); - } - - fetchAndOpenDialogExperiment = (experimentName, experimentNamespace) => event => { - this.props.fetchExperiment(experimentName, experimentNamespace); - }; - - fetchAndOpenDialogSuggestion = (suggestionName, suggestionNamespace) => event => { - this.props.fetchSuggestion(suggestionName, suggestionNamespace); - }; - - render() { - const { classes } = this.props; - return ( -
- - - - {this.props.loading ? ( - - ) : ( -
- - Experiment Name: {this.props.match.params.name} - - - Experiment Namespace: {this.props.match.params.namespace} - - - - - - - - - - - {this.props.steps.map((step, i) => { - return ( - - }> - {step.name} - - - - - - ); - })} - - -
- )} -
- ); - } -} - -const mapStateToProps = state => { - return { - steps: state[module].steps, - loading: state[module].loading, - }; -}; - -export default connect(mapStateToProps, { fetchNASJobInfo, fetchExperiment, fetchSuggestion })( - withStyles(styles)(NASJobInfo), -); diff --git a/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobList.jsx b/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobList.jsx deleted file mode 100644 index 9764b02f5c0..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobList.jsx +++ /dev/null @@ -1,97 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { withStyles } from '@material-ui/core/styles'; -import List from '@material-ui/core/List'; -import ListItem from '@material-ui/core/ListItem'; -import ListItemIcon from '@material-ui/core/ListItemIcon'; -import ListItemText from '@material-ui/core/ListItemText'; -import { Link } from 'react-router-dom'; -import { ListItemSecondaryAction, IconButton } from '@material-ui/core'; - -import { openDeleteExperimentDialog } from '../../../actions/generalActions'; -import DeleteDialog from '../../Menu/DeleteDialog'; -import ScheduleIcon from '@material-ui/icons/Schedule'; -import RestoreIcon from '@material-ui/icons/Restore'; -import HighlightOffIcon from '@material-ui/icons/HighlightOff'; -import DoneIcon from '@material-ui/icons/Done'; -import DeleteIcon from '@material-ui/icons/Delete'; -import HourglassFullIcon from '@material-ui/icons/HourglassFull'; - -const module = 'nasMonitor'; - -const styles = theme => ({ - created: { - color: theme.colors.created, - }, - running: { - color: theme.colors.running, - }, - restarting: { - color: theme.colors.restarting, - }, - succeeded: { - color: theme.colors.succeeded, - }, - failed: { - color: theme.colors.failed, - }, -}); - -const NASJobList = props => { - const { classes } = props; - - const onDeleteExperiment = (name, namespace) => event => { - props.openDeleteExperimentDialog(name, namespace); - }; - - return ( -
- - {props.filteredJobsList.map((job, i) => { - let icon; - if (job.status === 'Created') { - icon = ; - } else if (job.status === 'Running') { - icon = ; - } else if (job.status === 'Restarting') { - icon = ; - } else if (job.status === 'Succeeded') { - icon = ; - } else if (job.status === 'Failed') { - icon = ; - } - return ( - - {icon} - - - - - - - - ); - })} - - -
- ); -}; - -const mapStateToProps = state => { - return { - filteredJobsList: state[module].filteredJobsList, - }; -}; - -export default connect(mapStateToProps, { openDeleteExperimentDialog })( - withStyles(styles)(NASJobList), -); diff --git a/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobMonitor.jsx b/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobMonitor.jsx deleted file mode 100644 index 108450fd84c..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobMonitor.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import { withStyles } from '@material-ui/core/styles'; -import Typography from '@material-ui/core/Typography'; - -import FilterPanel from './FilterPanel'; -import NASJobList from './NASJobList'; - -import { fetchNASJobs } from '../../../actions/nasMonitorActions'; - -const styles = theme => ({ - root: { - width: '90%', - margin: '0 auto', - marginTop: 10, - }, - text: { - marginBottom: 20, - }, -}); - -class NASJobMonitor extends React.Component { - componentDidMount() { - this.props.fetchNASJobs(); - } - - render() { - const { classes } = this.props; - return ( -
- - {'Experiment Monitor'} - - - -
- ); - } -} - -export default connect(null, { fetchNASJobs })(withStyles(styles)(NASJobMonitor)); diff --git a/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobStepInfo.jsx b/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobStepInfo.jsx deleted file mode 100644 index c2d9b80a518..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/NAS/Monitor/NASJobStepInfo.jsx +++ /dev/null @@ -1,57 +0,0 @@ -import React from 'react'; -import { withStyles } from '@material-ui/core'; -import Typography from '@material-ui/core/Typography'; -import Button from '@material-ui/core/Button'; - -import * as d3 from 'd3'; -import * as d3Graphviz from 'd3-graphviz'; - -const styles = theme => ({ - root: { - margin: '0 auto', - textAlign: 'center', - }, - link: { - textDecoration: 'none', - }, -}); - -class NASJobStepInfo extends React.Component { - componentDidMount() { - const id = `graph${this.props.id}`; - d3.select(`#${id}`) - .graphviz() - .renderDot(this.props.step.architecture) - .width(640) - .height(480) - .fit(true); - } - - render() { - const { step, classes } = this.props; - const id = `graph${this.props.id}`; - return ( -
- Architecture for Trial: {step.trialname} -
-
- {step.metricsname.map((metrics, index) => { - return ( - - {step.metricsname[index]}: {step.metricsvalue[index]}. - - ); - })} -
- {/* TODO: add link in backend */} - {/* - - */} -
- ); - } -} - -export default withStyles(styles)(NASJobStepInfo); diff --git a/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/AddDialog.jsx b/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/AddDialog.jsx deleted file mode 100644 index 36844cad3df..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/AddDialog.jsx +++ /dev/null @@ -1,239 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import withStyles from '@material-ui/styles/withStyles'; - -import AceEditor from 'react-ace'; -import 'ace-builds/src-noconflict/theme-sqlserver'; -import 'ace-builds/src-noconflict/mode-yaml'; - -import Button from '@material-ui/core/Button'; -import Dialog from '@material-ui/core/Dialog'; -import DialogActions from '@material-ui/core/DialogActions'; -import DialogContent from '@material-ui/core/DialogContent'; -import TextField from '@material-ui/core/TextField'; -import DialogTitle from '@material-ui/core/DialogTitle'; -import Typography from '@material-ui/core/Typography'; -import Select from '@material-ui/core/Select'; -import MenuItem from '@material-ui/core/MenuItem'; -import FormControl from '@material-ui/core/FormControl'; -import InputLabel from '@material-ui/core/InputLabel'; -import OutlinedInput from '@material-ui/core/OutlinedInput'; - -import { closeDialog, addTemplate, changeTemplate } from '../../../actions/templateActions'; - -const module = 'template'; - -const styles = theme => ({ - header: { - textAlign: 'center', - width: 650, - }, - headerTypography: { - textAlign: 'center', - marginTop: 5, - fontSize: 19, - }, - textField: { - marginBottom: 10, - width: '100%', - }, - selectBox: { - width: 200, - }, - selectForm: { - margin: 10, - }, - selectDiv: { - textAlign: 'center', - }, -}); - -//TODO: Add functionality to create new ConfigMap with Trial Template -class AddDialog extends React.Component { - componentDidMount() { - if (this.props.trialTemplatesList.length != 0) { - let configMaps = this.props.trialTemplatesList[0].ConfigMapsList; - if (configMaps.length != 0) { - let configMapsList = []; - configMaps.forEach(configMap => configMapsList.push(configMap.ConfigMapName)); - this.props.changeTemplate( - this.props.edittedTemplateNamespace, - this.props.edittedTemplateConfigMapName, - this.props.edittedTemplateName, - this.props.edittedTemplateYaml, - configMapsList, - ); - } - } - } - - onNamespaceChange = event => { - let newNamespace = event.target.value; - - let namespaceIndex = this.props.trialTemplatesList.findIndex(function(trialTemplate, i) { - return trialTemplate.Namespace === newNamespace; - }); - - if (this.props.trialTemplatesList.length != 0) { - let configMaps = this.props.trialTemplatesList[namespaceIndex].ConfigMapsList; - //TODO: add logic when configMapsList is empty - if (configMaps.length != 0) { - let configMapsList = []; - configMaps.forEach(configMap => configMapsList.push(configMap.ConfigMapName)); - - this.props.changeTemplate( - newNamespace, - configMapsList[0], - this.props.edittedTemplateName, - this.props.edittedTemplateYaml, - configMapsList, - ); - } - } - }; - - onConfigMapNameChange = event => { - this.props.changeTemplate( - this.props.edittedTemplateNamespace, - event.target.value, - this.props.edittedTemplateName, - this.props.edittedTemplateYaml, - this.props.edittedTemplateConfigMapSelectList, - ); - }; - - onNameChange = event => { - this.props.changeTemplate( - this.props.edittedTemplateNamespace, - this.props.edittedTemplateConfigMapName, - event.target.value, - this.props.edittedTemplateYaml, - this.props.edittedTemplateConfigMapSelectList, - ); - }; - - onYamlChange = newTemplateYaml => { - this.props.changeTemplate( - this.props.edittedTemplateNamespace, - this.props.edittedTemplateConfigMapName, - this.props.edittedTemplateName, - newTemplateYaml, - this.props.edittedTemplateConfigMapSelectList, - ); - }; - - submitAddTemplate = () => { - this.props.addTemplate( - this.props.edittedTemplateNamespace, - this.props.edittedTemplateConfigMapName, - this.props.edittedTemplateName, - this.props.edittedTemplateYaml, - ); - }; - - render() { - const { classes } = this.props; - - return ( -
- - - {'Template Creator'} - - {'Select Namespace and ConfigMap'} - - - -
- - Namespace - - - - ConfigMap - - -
- -
- -
- - - - -
-
- ); - } -} - -const mapStateToProps = state => { - return { - addOpen: state[module].addOpen, - trialTemplatesList: state[module].trialTemplatesList, - edittedTemplateNamespace: state[module].edittedTemplateNamespace, - edittedTemplateConfigMapName: state[module].edittedTemplateConfigMapName, - edittedTemplateName: state[module].edittedTemplateName, - edittedTemplateYaml: state[module].edittedTemplateYaml, - edittedTemplateConfigMapSelectList: state[module].edittedTemplateConfigMapSelectList, - }; -}; - -export default connect(mapStateToProps, { - closeDialog, - addTemplate, - changeTemplate, -})(withStyles(styles)(AddDialog)); diff --git a/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/DeleteDialog.jsx b/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/DeleteDialog.jsx deleted file mode 100644 index 7dae7504034..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/DeleteDialog.jsx +++ /dev/null @@ -1,54 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import withStyles from '@material-ui/styles/withStyles'; - -import Button from '@material-ui/core/Button'; -import Dialog from '@material-ui/core/Dialog'; -import DialogActions from '@material-ui/core/DialogActions'; -import DialogContent from '@material-ui/core/DialogContent'; -import DialogContentText from '@material-ui/core/DialogContentText'; -import DialogTitle from '@material-ui/core/DialogTitle'; - -import { closeDialog, deleteTemplate } from '../../../actions/templateActions'; - -const module = 'template'; - -const DeleteDialog = props => { - const submitDeleteTemplate = () => { - props.deleteTemplate( - props.edittedTemplateNamespace, - props.edittedTemplateConfigMapName, - props.edittedTemplateName, - ); - }; - - return ( -
- - {'Are you sure?'} - - Are you sure you want to delete this template? - - - - - - -
- ); -}; - -const mapStateToProps = state => { - return { - deleteOpen: state[module].deleteOpen, - edittedTemplateNamespace: state[module].edittedTemplateNamespace, - edittedTemplateConfigMapName: state[module].edittedTemplateConfigMapName, - edittedTemplateName: state[module].edittedTemplateName, - }; -}; - -export default connect(mapStateToProps, { closeDialog, deleteTemplate })(DeleteDialog); diff --git a/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/EditDialog.jsx b/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/EditDialog.jsx deleted file mode 100644 index 3cc4c5f6d71..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/EditDialog.jsx +++ /dev/null @@ -1,137 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import withStyles from '@material-ui/styles/withStyles'; - -import AceEditor from 'react-ace'; -import 'ace-builds/src-noconflict/theme-sqlserver'; -import 'ace-builds/src-noconflict/mode-yaml'; - -import Button from '@material-ui/core/Button'; -import Dialog from '@material-ui/core/Dialog'; -import DialogActions from '@material-ui/core/DialogActions'; -import DialogContent from '@material-ui/core/DialogContent'; -import TextField from '@material-ui/core/TextField'; -import DialogTitle from '@material-ui/core/DialogTitle'; -import Typography from '@material-ui/core/Typography'; - -import { closeDialog, editTemplate, changeTemplate } from '../../../actions/templateActions'; - -const module = 'template'; - -const styles = theme => ({ - header: { - textAlign: 'center', - width: 650, - }, - headerTypography: { - textAlign: 'center', - marginTop: 5, - fontSize: 19, - }, - textField: { - marginBottom: 10, - width: '100%', - }, -}); - -class EditDialog extends React.Component { - onNameChange = event => { - this.props.changeTemplate( - this.props.edittedTemplateNamespace, - this.props.edittedTemplateConfigMapName, - event.target.value, - this.props.edittedTemplateYaml, - this.props.edittedTemplateConfigMapSelectList, - ); - }; - - onYamlChange = newTemplateYaml => { - this.props.changeTemplate( - this.props.edittedTemplateNamespace, - this.props.edittedTemplateConfigMapName, - this.props.edittedTemplateName, - newTemplateYaml, - this.props.edittedTemplateConfigMapSelectList, - ); - }; - - submitEditTemplate = () => { - this.props.editTemplate( - this.props.edittedTemplateNamespace, - this.props.edittedTemplateConfigMapName, - this.props.currentTemplateName, - this.props.edittedTemplateName, - this.props.edittedTemplateYaml, - ); - }; - - render() { - const { classes } = this.props; - return ( - - - {'Template Editor'} - - {'Namespace: ' + this.props.edittedTemplateNamespace} - - - - {'ConfigMap: ' + this.props.edittedTemplateConfigMapName} - - - - - -
- -
- - - - -
- ); - } -} - -const mapStateToProps = state => { - return { - editOpen: state[module].editOpen, - edittedTemplateNamespace: state[module].edittedTemplateNamespace, - edittedTemplateConfigMapName: state[module].edittedTemplateConfigMapName, - currentTemplateName: state[module].currentTemplateName, - edittedTemplateName: state[module].edittedTemplateName, - edittedTemplateYaml: state[module].edittedTemplateYaml, - edittedTemplateConfigMapSelectList: state[module].edittedTemplateConfigMapSelectList, - }; -}; - -export default connect(mapStateToProps, { closeDialog, editTemplate, changeTemplate })( - withStyles(styles)(EditDialog), -); diff --git a/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/FilterPanel.jsx b/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/FilterPanel.jsx deleted file mode 100644 index 9a0ae7d4606..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/FilterPanel.jsx +++ /dev/null @@ -1,88 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { withStyles } from '@material-ui/core/styles'; - -import TextField from '@material-ui/core/TextField'; -import Select from '@material-ui/core/Select'; -import InputLabel from '@material-ui/core/InputLabel'; -import MenuItem from '@material-ui/core/MenuItem'; -import FormControl from '@material-ui/core/FormControl'; - -import { fetchNamespaces } from '../../../actions/generalActions'; -import { filterTemplates } from '../../../actions/templateActions'; - -const module = 'template'; -const generalModule = 'general'; - -const styles = theme => ({ - selectBox: { - marginLeft: theme.spacing.unit, - marginRight: theme.spacing.unit, - width: 200, - height: 56, - }, - textField: { - marginLeft: theme.spacing.unit, - marginRight: theme.spacing.unit, - }, -}); - -class FilterPanel extends React.Component { - componentDidMount() { - this.props.fetchNamespaces(); - this.props.filterTemplates(this.props.filteredNamespace, this.props.filteredConfigMapName); - } - - onNamespaceChange = event => { - this.props.filterTemplates(event.target.value, this.props.filteredConfigMapName); - }; - - onConfigMapNameChange = event => { - this.props.filterTemplates(this.props.filteredNamespace, event.target.value); - }; - - render() { - const { classes } = this.props; - - return ( -
- - Namespace - - - -
- ); - } -} - -const mapStateToProps = state => { - return { - namespaces: state[generalModule].namespaces, - filteredNamespace: state[module].filteredNamespace, - filteredConfigMapName: state[module].filteredConfigMapName, - }; -}; - -export default connect(mapStateToProps, { fetchNamespaces, filterTemplates })( - withStyles(styles)(FilterPanel), -); diff --git a/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/TemplateList.jsx b/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/TemplateList.jsx deleted file mode 100644 index 97919ed40b2..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/TemplateList.jsx +++ /dev/null @@ -1,174 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { withStyles } from '@material-ui/core/styles'; - -import ExpansionPanel from '@material-ui/core/ExpansionPanel'; -import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary'; -import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails'; -import Typography from '@material-ui/core/Typography'; -import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import Grid from '@material-ui/core/Grid'; -import Divider from '@material-ui/core/Divider'; -import Button from '@material-ui/core/Button'; -import LinearProgress from '@material-ui/core/LinearProgress'; - -import TemplatePanel from './TemplatePanel'; -import FilterPanel from './FilterPanel'; -import AddDialog from './AddDialog'; -import EditDialog from './EditDialog'; -import DeleteDialog from './DeleteDialog'; - -import { openDialog } from '../../../actions/templateActions'; - -const module = 'template'; - -const styles = theme => ({ - namespace: { - marginTop: 25, - marginRight: 15, - fontSize: theme.typography.pxToRem(26), - }, - configMap: { - margin: 15, - fontSize: theme.typography.pxToRem(23), - }, - templatesBlock: { - width: '96%', - margin: '0 auto', - }, - template: { - fontSize: theme.typography.pxToRem(20), - fontWeight: theme.typography.fontWeightRegular, - }, - divider: { - marginTop: 20, - }, - buttonAdd: { - textAlign: 'center', - }, - noTemplates: { - marginTop: 25, - marginRight: 15, - fontSize: theme.typography.pxToRem(50), - }, - loading: { - marginTop: 30, - }, -}); - -const dialogTypeAdd = 'add'; - -//TODO: Add functionality to create new ConfigMap with Trial Template -class TemplateList extends React.Component { - openAddDialog = () => { - this.props.openDialog( - dialogTypeAdd, - this.props.trialTemplatesList[0].Namespace, - this.props.trialTemplatesList[0].ConfigMapsList[0].ConfigMapName, - ); - }; - - render() { - const { classes } = this.props; - return ( -
- {this.props.loading ? ( - - ) : ( -
- {this.props.trialTemplatesList.length != 0 ? ( -
- -
- -
- {this.props.filteredTrialTemplatesList.map((trialTemplate, nsIndex) => { - return ( -
- - - Namespace: - - - - {trialTemplate.Namespace} - - - -
-
-
- - {trialTemplate.ConfigMapsList.map((configMap, cmIndex) => { - return ( -
- - - ConfigMap: - - - - {configMap.ConfigMapName} - - - - - {configMap.TemplatesList.map((template, templateIndex) => { - return ( -
- - }> - - {template.Name} - - - - - - -
- ); - })} - -
- ); - })} -
- ); - })} - - - - -
- ) : ( -
- No Katib Trial Templates -
- )} -
- )} -
- ); - } -} - -const mapStateToProps = state => { - return { - filteredTrialTemplatesList: state[module].filteredTrialTemplatesList, - trialTemplatesList: state[module].trialTemplatesList, - loading: state[module].loading, - }; -}; - -export default connect(mapStateToProps, { openDialog })(withStyles(styles)(TemplateList)); diff --git a/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/TemplatePanel.jsx b/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/TemplatePanel.jsx deleted file mode 100644 index 7414c02c676..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Templates/Common/TemplatePanel.jsx +++ /dev/null @@ -1,90 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import AceEditor from 'react-ace'; -import 'ace-builds/src-noconflict/theme-sqlserver'; -import 'ace-builds/src-noconflict/mode-yaml'; - -import makeStyles from '@material-ui/styles/makeStyles'; -import Button from '@material-ui/core/Button'; -import DeleteIcon from '@material-ui/icons/Delete'; -import CreateIcon from '@material-ui/icons/Create'; - -import { openDialog } from '../../../actions/templateActions'; - -const useStyles = makeStyles({ - root: { - width: '98%', - margin: '0 auto', - }, - - buttons: { - marginTop: 30, - marginLeft: 20, - }, - icon: { - margin: 4, - }, -}); -const dialogTypeEdit = 'edit'; -const dialogTypeDelete = 'delete'; - -const TemplatePanel = props => { - const classes = useStyles(); - - const openEditDialog = (namespace, configMapName, templateName, templateYaml) => event => { - props.openDialog(dialogTypeEdit, namespace, configMapName, templateName, templateYaml); - }; - - const openDeleteDialog = (namespace, configMapName, templateName) => event => { - props.openDialog(dialogTypeDelete, namespace, configMapName, templateName); - }; - - return ( -
- - - - -
- ); -}; - -const mapStateToProps = state => { - return {}; -}; - -export default connect(mapStateToProps, { openDialog })(TemplatePanel); diff --git a/pkg/ui/v1alpha3/frontend/src/components/Templates/Trial.jsx b/pkg/ui/v1alpha3/frontend/src/components/Templates/Trial.jsx deleted file mode 100644 index 6fc2393ce50..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/components/Templates/Trial.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import { withStyles } from '@material-ui/core/styles'; -import Typography from '@material-ui/core/Typography'; - -import TemplateList from './Common/TemplateList'; - -import { fetchTrialTemplates } from '../../actions/templateActions'; - -const styles = theme => ({ - root: { - width: '90%', - margin: '0 auto', - marginTop: 10, - }, - text: { - marginBottom: 20, - }, -}); - -class Trial extends React.Component { - componentDidMount() { - this.props.fetchTrialTemplates(); - } - - render() { - const { classes } = this.props; - - return ( -
- - {'Trial Templates'} - - - -
- ); - } -} -export default connect(null, { fetchTrialTemplates })(withStyles(styles)(Trial)); diff --git a/pkg/ui/v1alpha3/frontend/src/constants/constants.js b/pkg/ui/v1alpha3/frontend/src/constants/constants.js deleted file mode 100644 index d0ff7834322..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/constants/constants.js +++ /dev/null @@ -1,23 +0,0 @@ -// Here we store global constants for React frontend - -export const JOB_TYPE_HP = 'hp'; -export const JOB_TYPE_NAS = 'nas'; - -export const MC_KIND_STDOUT = 'StdOut'; -export const MC_KIND_FILE = 'File'; -export const MC_KIND_TENSORFLOW_EVENT = 'TensorFlowEvent'; -export const MC_KIND_PROMETHEUS = 'PrometheusMetric'; -export const MC_KIND_CUSTOM = 'Custom'; -export const MC_KIND_NONE = 'None'; - -export const MC_FILE_SYSTEM_KIND_FILE = 'File'; -export const MC_FILE_SYSTEM_KIND_DIRECTORY = 'Directory'; -export const MC_FILE_SYSTEM_NO_KIND = 'No File System'; - -export const MC_HTTP_GET_HTTP_SCHEME = 'HTTP'; - -export const MC_PROMETHEUS_DEFAULT_PORT = 8080; -export const MC_PROMETHEUS_DEFAULT_PATH = '/metrics'; - -export const LINK_HP_CREATE = '/katib/hp'; -export const LINK_NAS_CREATE = '/katib/nas'; diff --git a/pkg/ui/v1alpha3/frontend/src/index.js b/pkg/ui/v1alpha3/frontend/src/index.js deleted file mode 100755 index 68f35eea727..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/index.js +++ /dev/null @@ -1,58 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import App from './components/App'; -import KubeflowDashboard from './components/KubeflowDashboard'; -import * as serviceWorker from './serviceWorker'; -import CssBaseline from '@material-ui/core/CssBaseline'; -import { createMuiTheme, MuiThemeProvider } from '@material-ui/core/styles'; -import configureStore from './store'; -import rootSaga from './sagas'; - -import { HashRouter as Router } from 'react-router-dom'; - -import { Provider } from 'react-redux'; - -const store = configureStore(); - -store.runSaga(rootSaga); - -const theme = createMuiTheme({ - palette: { - primary: { - main: '#000', - }, - secondary: { - main: '#fff', - }, - }, - colors: { - created: '#33adff', - running: '#0911f6', - restarting: '#1eb9af', - succeeded: '#02970a', - failed: '#e62e00', - killed: '#ff5c33', - }, - typography: { - fontFamily: - 'open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol', - }, -}); - -ReactDOM.render( - - - - - - - - - , - document.getElementById('root'), -); - -// If you want your app to work offline and load faster, you can change -// unregister() to register() below. Note this comes with some pitfalls. -// Learn more about service workers: http://bit.ly/CRA-PWA -serviceWorker.unregister(); diff --git a/pkg/ui/v1alpha3/frontend/src/reducers/general.js b/pkg/ui/v1alpha3/frontend/src/reducers/general.js deleted file mode 100644 index d0989ad6355..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/reducers/general.js +++ /dev/null @@ -1,255 +0,0 @@ -import * as actions from '../actions/generalActions'; -import * as nasCreateActions from '../actions/nasCreateActions'; -import * as hpCreateActions from '../actions/hpCreateActions'; -import * as hpMonitorActions from '../actions/hpMonitorActions'; -import * as nasMonitorActions from '../actions/nasMonitorActions'; -import * as templateActions from '../actions/templateActions'; - -const initialState = { - menuOpen: false, - snackOpen: false, - snackText: '', - deleteDialog: false, - deleteId: '', - namespaces: [], - globalNamespace: '', - experiment: {}, - dialogExperimentOpen: false, - suggestion: {}, - dialogSuggestionOpen: false, - - templateNamespace: '', - templateConfigMapName: '', - templateName: '', - trialTemplatesList: [], - currentTemplateConfigMapsList: [], - currentTemplateNamesList: [], - mcKindsList: ['StdOut', 'File', 'TensorFlowEvent', 'PrometheusMetric', 'Custom', 'None'], - mcFileSystemKindsList: ['No File System', 'File', 'Directory'], - mcURISchemesList: ['HTTP', 'HTTPS'], -}; - -const generalReducer = (state = initialState, action) => { - switch (action.type) { - case actions.TOGGLE_MENU: - return { - ...state, - menuOpen: action.state, - }; - case actions.CLOSE_SNACKBAR: - return { - ...state, - snackOpen: false, - }; - case actions.SUBMIT_YAML_SUCCESS: - return { - ...state, - snackOpen: true, - snackText: 'Successfully submitted', - }; - case actions.SUBMIT_YAML_FAILURE: - return { - ...state, - snackOpen: true, - snackText: action.message, - }; - case actions.DELETE_EXPERIMENT_FAILURE: - return { - ...state, - deleteDialog: false, - snackOpen: true, - snackText: 'Whoops, something went wrong', - }; - case actions.DELETE_EXPERIMENT_SUCCESS: - return { - ...state, - deleteDialog: false, - snackOpen: true, - snackText: 'Successfully deleted. Press Update button', - }; - case actions.OPEN_DELETE_EXPERIMENT_DIALOG: - return { - ...state, - deleteDialog: true, - deleteExperimentName: action.name, - deleteExperimentNamespace: action.namespace, - }; - case actions.CLOSE_DELETE_EXPERIMENT_DIALOG: - return { - ...state, - deleteDialog: false, - }; - case nasCreateActions.SUBMIT_NAS_JOB_REQUEST: - return { - ...state, - loading: true, - }; - case nasCreateActions.SUBMIT_NAS_JOB_SUCCESS: - return { - ...state, - loading: false, - snackOpen: true, - snackText: 'Successfully submitted', - }; - case nasCreateActions.SUBMIT_NAS_JOB_FAILURE: - return { - ...state, - loading: false, - snackOpen: true, - snackText: action.message, - }; - case hpCreateActions.SUBMIT_HP_JOB_REQUEST: - return { - ...state, - loading: true, - }; - case hpCreateActions.SUBMIT_HP_JOB_SUCCESS: - return { - ...state, - loading: false, - snackOpen: true, - snackText: 'Successfully submitted', - }; - case hpCreateActions.SUBMIT_HP_JOB_FAILURE: - return { - ...state, - loading: false, - snackOpen: true, - snackText: action.message, - }; - case actions.FETCH_NAMESPACES_SUCCESS: - return { - ...state, - namespaces: action.namespaces, - }; - case actions.CHANGE_GLOBAL_NAMESPACE: - state.globalNamespace = action.globalNamespace; - return { - ...state, - globalNamespace: action.globalNamespace, - }; - case actions.FETCH_EXPERIMENT_SUCCESS: - return { - ...state, - experiment: action.experiment, - dialogExperimentOpen: true, - }; - case actions.CLOSE_DIALOG_EXPERIMENT: - return { - ...state, - dialogExperimentOpen: false, - }; - case actions.FETCH_SUGGESTION_SUCCESS: - return { - ...state, - suggestion: action.suggestion, - dialogSuggestionOpen: true, - }; - case actions.CLOSE_DIALOG_SUGGESTION: - return { - ...state, - dialogSuggestionOpen: false, - }; - case hpMonitorActions.FETCH_HP_JOB_INFO_REQUEST: - return { - ...state, - dialogExperimentOpen: false, - dialogSuggestionOpen: false, - }; - case nasMonitorActions.FETCH_NAS_JOB_INFO_REQUEST: - return { - ...state, - dialogExperimentOpen: false, - dialogSuggestionOpen: false, - }; - case templateActions.FETCH_TRIAL_TEMPLATES_SUCCESS: - let templates = action.trialTemplatesList; - - let configMapNames = templates[0].ConfigMapsList.map(configMap => configMap.ConfigMapName); - - let templateNames = templates[0].ConfigMapsList[0].TemplatesList.map( - template => template.Name, - ); - - return { - ...state, - trialTemplatesList: templates, - templateNamespace: templates[0].Namespace, - templateConfigMapName: templates[0].ConfigMapsList[0].ConfigMapName, - templateName: templates[0].ConfigMapsList[0].TemplatesList[0].Name, - currentTemplateConfigMapsList: configMapNames, - currentTemplateNamesList: templateNames, - }; - - case actions.FILTER_TEMPLATES_EXPERIMENT: - switch (action.trialConfigMapName) { - // Case when we change namespace - case '': - // Get Namespace index - let nsIndex = state.trialTemplatesList.findIndex(function(trialTemplate, i) { - return trialTemplate.Namespace === action.trialNamespace; - }); - - // Get new ConfigMapNames List - configMapNames = state.trialTemplatesList[nsIndex].ConfigMapsList.map( - configMap => configMap.ConfigMapName, - ); - - // Get new Template Names List - templateNames = state.trialTemplatesList[nsIndex].ConfigMapsList[0].TemplatesList.map( - template => template.Name, - ); - - return { - ...state, - templateNamespace: action.trialNamespace, - templateConfigMapName: configMapNames[0], - templateName: templateNames[0], - currentTemplateConfigMapsList: configMapNames, - currentTemplateNamesList: templateNames, - }; - // Case when we change configMap - default: - // Get Namespace index - nsIndex = state.trialTemplatesList.findIndex(function(trialTemplate, i) { - return trialTemplate.Namespace === action.trialNamespace; - }); - - // Get ConfigMap index - let cmIndex = state.trialTemplatesList[nsIndex].ConfigMapsList.findIndex(function( - configMap, - i, - ) { - return configMap.ConfigMapName === action.trialConfigMapName; - }); - - // Get new Template Names List - templateNames = state.trialTemplatesList[nsIndex].ConfigMapsList[ - cmIndex - ].TemplatesList.map(template => template.Name); - - return { - ...state, - templateNamespace: action.trialNamespace, - templateConfigMapName: action.trialConfigMapName, - templateName: templateNames[0], - currentTemplateNamesList: templateNames, - }; - } - case actions.CHANGE_TEMPLATE_NAME: - return { - ...state, - templateName: action.templateName, - }; - case actions.VALIDATION_ERROR: - return { - ...state, - snackOpen: true, - snackText: action.message, - }; - default: - return state; - } -}; - -export default generalReducer; diff --git a/pkg/ui/v1alpha3/frontend/src/reducers/hpCreate.js b/pkg/ui/v1alpha3/frontend/src/reducers/hpCreate.js deleted file mode 100644 index 3901e7d0bde..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/reducers/hpCreate.js +++ /dev/null @@ -1,382 +0,0 @@ -import * as actions from '../actions/hpCreateActions'; -import * as constants from '../constants/constants'; - -const initialState = { - loading: false, - commonParametersMetadata: [ - { - name: 'Name', - value: 'random-experiment', - description: 'A name of an experiment', - }, - { - name: 'Namespace', - value: 'kubeflow', - description: 'Namespace to deploy an experiment', - }, - ], - commonParametersSpec: [ - { - name: 'ParallelTrialCount', - value: '3', - description: 'How many trials can be processed in parallel', - }, - { - name: 'MaxTrialCount', - value: '12', - description: 'Max completed trials to mark experiment as succeeded', - }, - { - name: 'MaxFailedTrialCount', - value: '3', - description: 'Max failed trials to mark experiment as failed', - }, - ], - allObjectiveTypes: ['minimize', 'maximize'], - objective: [ - { - name: 'Type', - value: 'maximize', - description: 'Type of optimization', - }, - { - name: 'Goal', - value: '0.99', - description: 'Goal of optimization', - }, - { - name: 'ObjectiveMetricName', - value: 'Validation-accuracy', - description: 'Name for the objective metric', - }, - ], - additionalMetricNames: [ - { - value: 'Train-accuracy', - }, - ], - algorithmName: 'random', - allAlgorithms: ['grid', 'random', 'hyperband', 'bayesianoptimization', 'tpe'], - algorithmSettings: [], - parameters: [ - { - name: '--lr', - parameterType: 'double', - feasibleSpace: 'feasibleSpace', - min: '0.01', - max: '0.03', - list: [], - }, - { - name: '--num-layers', - parameterType: 'int', - feasibleSpace: 'feasibleSpace', - min: '2', - max: '5', - list: [], - }, - { - name: '--optimizer', - parameterType: 'categorical', - feasibleSpace: 'list', - min: '', - max: '', - list: [ - { - value: 'sgd', - }, - { - value: 'adam', - }, - { - value: 'ftrl', - }, - ], - }, - ], - allParameterTypes: ['int', 'double', 'categorical'], - currentYaml: '', - mcSpec: { - collector: { - kind: 'StdOut', - }, - source: { - filter: { - metricsFormat: [], - }, - }, - }, - mcCustomContainerYaml: '', -}; - -const filterValue = (obj, key) => { - return obj.findIndex(p => p.name === key); -}; - -const hpCreateReducer = (state = initialState, action) => { - switch (action.type) { - case actions.CHANGE_YAML_HP: - return { - ...state, - currentYaml: action.payload, - }; - case actions.CHANGE_META_HP: - let meta = state.commonParametersMetadata.slice(); - let index = filterValue(meta, action.name); - meta[index].value = action.value; - return { - ...state, - commonParametersMetadata: meta, - }; - case actions.CHANGE_SPEC_HP: - let spec = state.commonParametersSpec.slice(); - index = filterValue(spec, action.name); - spec[index].value = action.value; - return { - ...state, - commonParametersSpec: spec, - }; - case actions.CHANGE_OBJECTIVE_HP: - let obj = state.objective.slice(); - index = filterValue(obj, action.name); - obj[index].value = action.value; - return { - ...state, - objective: obj, - }; - case actions.ADD_METRICS_HP: - let additionalMetricNames = state.additionalMetricNames.slice(); - additionalMetricNames.push({ - value: '', - }); - return { - ...state, - additionalMetricNames: additionalMetricNames, - }; - case actions.DELETE_METRICS_HP: - additionalMetricNames = state.additionalMetricNames.slice(); - additionalMetricNames.splice(action.index, 1); - return { - ...state, - additionalMetricNames: additionalMetricNames, - }; - case actions.EDIT_METRICS_HP: - additionalMetricNames = state.additionalMetricNames.slice(); - additionalMetricNames[action.index].value = action.value; - return { - ...state, - additionalMetricNames: additionalMetricNames, - }; - case actions.CHANGE_ALGORITHM_NAME_HP: - return { - ...state, - algorithmName: action.algorithmName, - }; - case actions.ADD_ALGORITHM_SETTING_HP: - let algorithmSettings = state.algorithmSettings.slice(); - let setting = { name: '', value: '' }; - algorithmSettings.push(setting); - return { - ...state, - algorithmSettings: algorithmSettings, - }; - case actions.CHANGE_ALGORITHM_SETTING_HP: - algorithmSettings = state.algorithmSettings.slice(); - algorithmSettings[action.index][action.field] = action.value; - return { - ...state, - algorithmSettings: algorithmSettings, - }; - case actions.DELETE_ALGORITHM_SETTING_HP: - algorithmSettings = state.algorithmSettings.slice(); - algorithmSettings.splice(action.index, 1); - return { - ...state, - algorithmSettings: algorithmSettings, - }; - case actions.ADD_PARAMETER_HP: - let parameters = state.parameters.slice(); - parameters.push({ - name: '', - parameterType: '', - feasibleSpace: 'feasibleSpace', - min: '', - max: '', - list: [], - }); - return { - ...state, - parameters: parameters, - }; - case actions.EDIT_PARAMETER_HP: - parameters = state.parameters.slice(); - parameters[action.index][action.field] = action.value; - return { - ...state, - parameters: parameters, - }; - case actions.DELETE_PARAMETER_HP: - parameters = state.parameters.slice(); - parameters.splice(action.index, 1); - return { - ...state, - parameters: parameters, - }; - case actions.ADD_LIST_PARAMETER_HP: - parameters = state.parameters.slice(); - parameters[action.paramIndex].list.push({ - value: '', - }); - return { - ...state, - parameters: parameters, - }; - case actions.EDIT_LIST_PARAMETER_HP: - parameters = state.parameters.slice(); - parameters[action.paramIndex].list[action.index].value = action.value; - return { - ...state, - parameters: parameters, - }; - case actions.DELETE_LIST_PARAMETER_HP: - parameters = state.parameters.slice(); - parameters[action.paramIndex].list.splice(action.index, 1); - return { - ...state, - parameters: parameters, - }; - // Metrics Collector Kind change - case actions.CHANGE_MC_KIND_HP: - let newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - newMCSpec.collector.kind = action.kind; - - if ( - action.kind === constants.MC_KIND_FILE || - action.kind === constants.MC_KIND_TENSORFLOW_EVENT || - action.kind === constants.MC_KIND_CUSTOM - ) { - let newKind; - switch (action.kind) { - case constants.MC_KIND_FILE: - newKind = constants.MC_FILE_SYSTEM_KIND_FILE; - break; - - case constants.MC_KIND_TENSORFLOW_EVENT: - newKind = constants.MC_FILE_SYSTEM_KIND_DIRECTORY; - break; - - default: - newKind = constants.MC_FILE_SYSTEM_NO_KIND; - } - // File or TF Event Kind - newMCSpec.source.fileSystemPath = { - kind: newKind, - path: '', - }; - } else if (action.kind === constants.MC_KIND_PROMETHEUS) { - // Prometheus Kind - newMCSpec.source.httpGet = { - port: constants.MC_PROMETHEUS_DEFAULT_PORT, - path: constants.MC_PROMETHEUS_DEFAULT_PATH, - scheme: constants.MC_HTTP_GET_HTTP_SCHEME, - host: '', - httpHeaders: [], - }; - } - - return { - ...state, - mcSpec: newMCSpec, - mcCustomContainerYaml: '', - }; - // File System Path change - case actions.CHANGE_MC_FILE_SYSTEM_HP: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - newMCSpec.source.fileSystemPath.kind = action.kind; - newMCSpec.source.fileSystemPath.path = action.path; - return { - ...state, - mcSpec: newMCSpec, - }; - // HTTPGet settings - case actions.CHANGE_MC_HTTP_GET_HP: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - - newMCSpec.source.httpGet.port = action.port; - newMCSpec.source.httpGet.path = action.path; - newMCSpec.source.httpGet.scheme = action.scheme; - newMCSpec.source.httpGet.host = action.host; - - return { - ...state, - mcSpec: newMCSpec, - }; - // Collector HTTPGet Headers - case actions.ADD_MC_HTTP_GET_HEADER_HP: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - let currentHeaders = newMCSpec.source.httpGet.httpHeaders.slice(); - let newHeader = { name: '', value: '' }; - currentHeaders.push(newHeader); - newMCSpec.source.httpGet.httpHeaders = currentHeaders; - return { - ...state, - mcSpec: newMCSpec, - }; - case actions.CHANGE_MC_HTTP_GET_HEADER_HP: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - currentHeaders = newMCSpec.source.httpGet.httpHeaders.slice(); - currentHeaders[action.index][action.fieldName] = action.value; - newMCSpec.source.httpGet.httpHeaders = currentHeaders; - return { - ...state, - mcSpec: newMCSpec, - }; - case actions.DELETE_MC_HTTP_GET_HEADER_HP: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - currentHeaders = newMCSpec.source.httpGet.httpHeaders.slice(); - currentHeaders.splice(action.index, 1); - newMCSpec.source.httpGet.httpHeaders = currentHeaders; - return { - ...state, - mcSpec: newMCSpec, - }; - // Collector Custom container - case actions.CHANGE_MC_CUSTOM_CONTAINER_HP: - return { - ...state, - mcCustomContainerYaml: action.yamlContainer, - }; - // Collector Metrics Format - case actions.ADD_MC_METRICS_FORMAT_HP: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - let currentFormats = newMCSpec.source.filter.metricsFormat.slice(); - currentFormats.push(''); - newMCSpec.source.filter.metricsFormat = currentFormats; - return { - ...state, - mcSpec: newMCSpec, - }; - case actions.CHANGE_MC_METRIC_FORMAT_HP: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - currentFormats = newMCSpec.source.filter.metricsFormat.slice(); - currentFormats[action.index] = action.format; - newMCSpec.source.filter.metricsFormat = currentFormats; - return { - ...state, - mcSpec: newMCSpec, - }; - case actions.DELETE_MC_METRIC_FORMAT_HP: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - currentFormats = newMCSpec.source.filter.metricsFormat.slice(); - currentFormats.splice(action.index, 1); - newMCSpec.source.filter.metricsFormat = currentFormats; - return { - ...state, - mcSpec: newMCSpec, - }; - default: - return state; - } -}; - -export default hpCreateReducer; diff --git a/pkg/ui/v1alpha3/frontend/src/reducers/hpMonitor.js b/pkg/ui/v1alpha3/frontend/src/reducers/hpMonitor.js deleted file mode 100644 index a1110f5ef51..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/reducers/hpMonitor.js +++ /dev/null @@ -1,127 +0,0 @@ -import * as actions from '../actions/hpMonitorActions'; - -const initialState = { - experimentName: '', - experimentNamespace: '', - filterType: { - Created: true, - Running: true, - Restarting: true, - Succeeded: true, - Failed: true, - }, - jobsList: [], - filteredJobsList: [], - jobData: [], - trialData: [], - dialogTrialOpen: false, - loading: false, - trialName: '', -}; - -const hpMonitorReducer = (state = initialState, action) => { - switch (action.type) { - case actions.FILTER_JOBS: - let jobs = state.jobsList.slice(); - let newList = jobs.filter( - job => - job.name.includes(action.experimentName) && - (job.namespace == action.experimentNamespace || - action.experimentNamespace == 'All namespaces' || - action.experimentNamespace.length == 0), - ); - let types = Object.assign({}, state.filterType); - var typeKeys = Object.keys(types); - - var filters = typeKeys.filter(key => { - return types[key]; - }); - - let filteredJobs = newList.filter(job => filters.includes(job.status)); - - return { - ...state, - filteredJobsList: filteredJobs, - experimentName: action.experimentName, - experimentNamespace: action.experimentNamespace, - }; - case actions.CHANGE_TYPE: - jobs = state.jobsList.slice(); - newList = jobs.filter( - job => - job.name.includes(state.experimentName) && - (job.namespace == state.experimentNamespace || - state.experimentNamespace == 'All namespaces' || - state.experimentNamespace.length == 0), - ); - types = Object.assign({}, state.filterType); - types[action.filter] = action.checked; - typeKeys = Object.keys(types); - - filters = typeKeys.filter(key => { - return types[key]; - }); - filteredJobs = newList.filter(job => filters.includes(job.status)); - - return { - ...state, - filterType: types, - filteredJobsList: filteredJobs, - }; - case actions.FETCH_HP_JOBS_SUCCESS: - jobs = action.jobs; - types = Object.assign({}, state.filterType); - typeKeys = Object.keys(types); - - filters = typeKeys.filter(key => { - return types[key]; - }); - - filteredJobs = jobs.filter( - job => - filters.includes(job.status) && - job.name.includes(state.experimentName) && - (job.namespace == state.experimentNamespace || - state.experimentNamespace == 'All namespaces' || - state.experimentNamespace.length == 0), - ); - return { - ...state, - jobsList: action.jobs, - filteredJobsList: filteredJobs, - }; - case actions.FETCH_HP_JOB_INFO_REQUEST: - return { - ...state, - loading: true, - dialogTrialOpen: false, - }; - case actions.FETCH_HP_JOB_INFO_SUCCESS: - return { - ...state, - jobData: action.jobData, - loading: false, - }; - case actions.FETCH_HP_JOB_INFO_FAILURE: - return { - ...state, - loading: false, - }; - case actions.FETCH_HP_JOB_TRIAL_INFO_SUCCESS: - return { - ...state, - trialData: action.trialData, - dialogTrialOpen: true, - trialName: action.trialName, - }; - case actions.CLOSE_DIALOG_TRIAL: - return { - ...state, - dialogTrialOpen: false, - }; - default: - return state; - } -}; - -export default hpMonitorReducer; diff --git a/pkg/ui/v1alpha3/frontend/src/reducers/index.js b/pkg/ui/v1alpha3/frontend/src/reducers/index.js deleted file mode 100644 index 5e34e9f4782..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/reducers/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import { combineReducers } from 'redux'; -import generalReducer from './general'; -import nasCreateReducer from './nasCreate'; -import nasMonitorReducer from './nasMonitor'; -import hpCreateReducer from './hpCreate'; -import templateReducer from './template'; -import hpMonitorReducer from './hpMonitor'; - -const rootReducer = combineReducers({ - ['general']: generalReducer, - ['template']: templateReducer, - ['hpCreate']: hpCreateReducer, - ['hpMonitor']: hpMonitorReducer, - ['nasCreate']: nasCreateReducer, - ['nasMonitor']: nasMonitorReducer, -}); - -export default rootReducer; diff --git a/pkg/ui/v1alpha3/frontend/src/reducers/nasCreate.js b/pkg/ui/v1alpha3/frontend/src/reducers/nasCreate.js deleted file mode 100644 index 9a3198d80e5..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/reducers/nasCreate.js +++ /dev/null @@ -1,682 +0,0 @@ -import * as actions from '../actions/nasCreateActions'; -import * as constants from '../constants/constants'; - -const initialState = { - commonParametersMetadata: [ - { - name: 'Name', - value: 'enas-example', - description: 'A name of an experiment', - }, - { - name: 'Namespace', - value: 'kubeflow', - description: 'Namespace to deploy an experiment', - }, - ], - commonParametersSpec: [ - { - name: 'ParallelTrialCount', - value: '3', - description: 'How many trials can be processed in parallel', - }, - { - name: 'MaxTrialCount', - value: '12', - description: 'Max completed trials to mark experiment as succeeded', - }, - { - name: 'MaxFailedTrialCount', - value: '3', - description: 'Max failed trials to mark experiment as failed', - }, - ], - allObjectiveTypes: ['minimize', 'maximize'], - objective: [ - { - name: 'Type', - value: 'maximize', - description: 'Type of optimization', - }, - { - name: 'Goal', - value: '0.99', - description: 'Goal of optimization', - }, - { - name: 'ObjectiveMetricName', - value: 'Validation-Accuracy', - description: 'Name for the objective metric', - }, - ], - additionalMetricNames: [], - algorithmName: 'enas', - allAlgorithms: ['enas'], - algorithmSettings: [ - { - name: 'controller_hidden_size', - value: '64', - }, - { - name: 'controller_temperature', - value: '5', - }, - { - name: 'controller_tanh_const', - value: '2.25', - }, - { - name: 'controller_entropy_weight', - value: '1e-5', - }, - { - name: 'controller_baseline_decay', - value: '0.999', - }, - { - name: 'controller_learning_rate', - value: '5e-5', - }, - { - name: 'controller_skip_target', - value: '0.4', - }, - { - name: 'controller_skip_weight', - value: '0.8', - }, - { - name: 'controller_train_steps', - value: '50', - }, - { - name: 'controller_log_every_steps', - value: '10', - }, - ], - //Graph Config - numLayers: '8', - inputSize: ['32', '32', '3'], - outputSize: ['10'], - operations: [ - { - operationType: 'convolution', - parameters: [ - { - name: 'filter_size', - parameterType: 'categorical', - feasibleSpace: 'list', - min: '', - max: '', - step: '', - list: [ - { - value: '3', - }, - { - value: '5', - }, - { - value: '7', - }, - ], - }, - { - name: 'num_filter', - parameterType: 'categorical', - feasibleSpace: 'list', - min: '', - max: '', - step: '', - list: [ - { - value: '32', - }, - { - value: '48', - }, - { - value: '64', - }, - { - value: '96', - }, - { - value: '128', - }, - ], - }, - { - name: 'stride', - parameterType: 'categorical', - feasibleSpace: 'list', - min: '', - max: '', - step: '', - list: [ - { - value: '1', - }, - { - value: '2', - }, - ], - }, - ], - }, - { - operationType: 'separable_convolution', - parameters: [ - { - name: 'filter_size', - parameterType: 'categorical', - feasibleSpace: 'list', - min: '', - max: '', - step: '', - list: [ - { - value: '3', - }, - { - value: '5', - }, - { - value: '7', - }, - ], - }, - { - name: 'num_filter', - parameterType: 'categorical', - feasibleSpace: 'list', - min: '', - max: '', - step: '', - list: [ - { - value: '32', - }, - { - value: '48', - }, - { - value: '64', - }, - { - value: '96', - }, - { - value: '128', - }, - ], - }, - { - name: 'stride', - parameterType: 'categorical', - feasibleSpace: 'list', - min: '', - max: '', - step: '', - list: [ - { - value: '1', - }, - { - value: '2', - }, - ], - }, - { - name: 'depth_multiplier', - parameterType: 'categorical', - feasibleSpace: 'list', - min: '', - max: '', - step: '', - list: [ - { - value: '1', - }, - { - value: '2', - }, - ], - }, - ], - }, - { - operationType: 'depthwise_convolution', - parameters: [ - { - name: 'filter_size', - parameterType: 'categorical', - feasibleSpace: 'list', - min: '', - max: '', - step: '', - list: [ - { - value: '3', - }, - { - value: '5', - }, - { - value: '7', - }, - ], - }, - { - name: 'stride', - parameterType: 'categorical', - feasibleSpace: 'list', - min: '', - max: '', - step: '', - list: [ - { - value: '1', - }, - { - value: '2', - }, - ], - }, - { - name: 'depth_multiplier', - parameterType: 'categorical', - feasibleSpace: 'list', - min: '', - max: '', - step: '', - list: [ - { - value: '1', - }, - { - value: '2', - }, - ], - }, - ], - }, - { - operationType: 'reduction', - parameters: [ - { - name: 'reduction_type', - parameterType: 'categorical', - feasibleSpace: 'list', - min: '', - max: '', - step: '', - list: [ - { - value: 'max_pooling', - }, - { - value: 'avg_pooling', - }, - ], - }, - { - name: 'pool_size', - parameterType: 'int', - feasibleSpace: 'feasibleSpace', - min: '2', - max: '3', - step: '1', - list: [], - }, - ], - }, - ], - allParameterTypes: ['int', 'double', 'categorical'], - currentYaml: '', - snackText: '', - snackOpen: false, - mcSpec: { - collector: { - kind: 'StdOut', - }, - source: { - filter: { - metricsFormat: [], - }, - }, - }, - mcCustomContainerYaml: '', -}; - -const filterValue = (obj, key) => { - return obj.findIndex(p => p.name === key); -}; - -const nasCreateReducer = (state = initialState, action) => { - switch (action.type) { - case actions.CHANGE_YAML_NAS: - return { - ...state, - currentYaml: action.payload, - }; - case actions.CHANGE_META_NAS: - let meta = state.commonParametersMetadata.slice(); - let index = filterValue(meta, action.name); - meta[index].value = action.value; - return { - ...state, - commonParametersMetadata: meta, - }; - case actions.CHANGE_SPEC_NAS: - let spec = state.commonParametersSpec.slice(); - index = filterValue(spec, action.name); - spec[index].value = action.value; - return { - ...state, - commonParametersSpec: spec, - }; - case actions.CHANGE_OBJECTIVE_NAS: - let obj = state.objective.slice(); - index = filterValue(obj, action.name); - obj[index].value = action.value; - return { - ...state, - objective: obj, - }; - case actions.ADD_METRICS_NAS: - let additionalMetricNames = state.additionalMetricNames.slice(); - additionalMetricNames.push({ - value: '', - }); - return { - ...state, - additionalMetricNames: additionalMetricNames, - }; - case actions.DELETE_METRICS_NAS: - additionalMetricNames = state.additionalMetricNames.slice(); - additionalMetricNames.splice(action.index, 1); - return { - ...state, - additionalMetricNames: additionalMetricNames, - }; - case actions.EDIT_METRICS_NAS: - additionalMetricNames = state.additionalMetricNames.slice(); - additionalMetricNames[action.index].value = action.value; - return { - ...state, - additionalMetricNames: additionalMetricNames, - }; - case actions.CHANGE_ALGORITHM_NAME_NAS: - return { - ...state, - algorithmName: action.algorithmName, - }; - case actions.ADD_ALGORITHM_SETTING_NAS: - let algorithmSettings = state.algorithmSettings.slice(); - let setting = { name: '', value: '' }; - algorithmSettings.push(setting); - return { - ...state, - algorithmSettings: algorithmSettings, - }; - case actions.CHANGE_ALGORITHM_SETTING_NAS: - algorithmSettings = state.algorithmSettings.slice(); - algorithmSettings[action.index][action.field] = action.value; - return { - ...state, - algorithmSettings: algorithmSettings, - }; - case actions.DELETE_ALGORITHM_SETTING_NAS: - algorithmSettings = state.algorithmSettings.slice(); - algorithmSettings.splice(action.index, 1); - return { - ...state, - algorithmSettings: algorithmSettings, - }; - case actions.EDIT_NUM_LAYERS: - let numLayers = action.value; - return { - ...state, - numLayers: numLayers, - }; - case actions.ADD_SIZE: - let size = state[action.sizeType].slice(); - size.push('0'); - return { - ...state, - [action.sizeType]: size, - }; - case actions.EDIT_SIZE: - size = state[action.sizeType].slice(); - size[action.index] = action.value; - return { - ...state, - [action.sizeType]: size, - }; - case actions.DELETE_SIZE: - size = state[action.sizeType].slice(); - size.splice(action.index, 1); - return { - ...state, - [action.sizeType]: size, - }; - case actions.ADD_OPERATION: - let operations = state.operations.slice(); - operations.push({ - operationType: '', - parameters: [], - }); - return { - ...state, - operations, - }; - case actions.DELETE_OPERATION: - operations = state.operations.slice(); - operations.splice(action.index, 1); - return { - ...state, - operations, - }; - case actions.CHANGE_OPERATION: - operations = state.operations.slice(); - operations[action.index].operationType = action.value; - return { - ...state, - operations, - }; - case actions.ADD_PARAMETER_NAS: - operations = state.operations.slice(); - operations[action.opIndex].parameters.push({ - name: '', - parameterType: 'categorical', - feasibleSpace: 'list', - min: '', - max: '', - step: '', - list: [], - }); - return { - ...state, - operations, - }; - case actions.CHANGE_PARAMETER_NAS: - operations = state.operations.slice(); - operations[action.opIndex].parameters[action.paramIndex][action.field] = action.value; - return { - ...state, - operations, - }; - case actions.DELETE_PARAMETER_NAS: - operations = state.operations.slice(); - operations[action.opIndex].parameters.splice(action.paramIndex, 1); - return { - ...state, - operations, - }; - case actions.ADD_LIST_PARAMETER_NAS: - operations = state.operations.slice(); - operations[action.opIndex].parameters[action.paramIndex].list.push({ - //TODO: Remove it? - // name: "", - value: '', - }); - return { - ...state, - operations, - }; - case actions.DELETE_LIST_PARAMETER_NAS: - operations = state.operations.slice(); - operations[action.opIndex].parameters[action.paramIndex].list.splice(action.listIndex, 1); - return { - ...state, - operations, - }; - case actions.EDIT_LIST_PARAMETER_NAS: - operations = state.operations.slice(); - operations[action.opIndex].parameters[action.paramIndex].list[action.listIndex].value = - action.value; - return { - ...state, - operations, - }; - case actions.CLOSE_SNACKBAR: - return { - ...state, - snackOpen: false, - }; - // Metrics Collector Kind change - case actions.CHANGE_MC_KIND_NAS: - let newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - newMCSpec.collector.kind = action.kind; - - if ( - action.kind === constants.MC_KIND_FILE || - action.kind === constants.MC_KIND_TENSORFLOW_EVENT || - action.kind === constants.MC_KIND_CUSTOM - ) { - let newKind; - switch (action.kind) { - case constants.MC_KIND_FILE: - newKind = constants.MC_FILE_SYSTEM_KIND_FILE; - break; - - case constants.MC_KIND_TENSORFLOW_EVENT: - newKind = constants.MC_FILE_SYSTEM_KIND_DIRECTORY; - break; - - default: - newKind = constants.MC_FILE_SYSTEM_NO_KIND; - } - // File or TF Event Kind - newMCSpec.source.fileSystemPath = { - kind: newKind, - path: '', - }; - } else if (action.kind === constants.MC_KIND_PROMETHEUS) { - // Prometheus Kind - newMCSpec.source.httpGet = { - port: constants.MC_PROMETHEUS_DEFAULT_PORT, - path: constants.MC_PROMETHEUS_DEFAULT_PATH, - scheme: constants.MC_HTTP_GET_HTTP_SCHEME, - host: '', - httpHeaders: [], - }; - } - - return { - ...state, - mcSpec: newMCSpec, - mcCustomContainerYaml: '', - }; - // File System Path change - case actions.CHANGE_MC_FILE_SYSTEM_NAS: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - newMCSpec.source.fileSystemPath.kind = action.kind; - newMCSpec.source.fileSystemPath.path = action.path; - return { - ...state, - mcSpec: newMCSpec, - }; - // HTTPGet settings - case actions.CHANGE_MC_HTTP_GET_NAS: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - - newMCSpec.source.httpGet.port = action.port; - newMCSpec.source.httpGet.path = action.path; - newMCSpec.source.httpGet.scheme = action.scheme; - newMCSpec.source.httpGet.host = action.host; - - return { - ...state, - mcSpec: newMCSpec, - }; - // Collector HTTPGet Headers - case actions.ADD_MC_HTTP_GET_HEADER_NAS: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - let currentHeaders = newMCSpec.source.httpGet.httpHeaders.slice(); - let newHeader = { name: '', value: '' }; - currentHeaders.push(newHeader); - newMCSpec.source.httpGet.httpHeaders = currentHeaders; - return { - ...state, - mcSpec: newMCSpec, - }; - case actions.CHANGE_MC_HTTP_GET_HEADER_NAS: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - currentHeaders = newMCSpec.source.httpGet.httpHeaders.slice(); - currentHeaders[action.index][action.fieldName] = action.value; - newMCSpec.source.httpGet.httpHeaders = currentHeaders; - return { - ...state, - mcSpec: newMCSpec, - }; - case actions.DELETE_MC_HTTP_GET_HEADER_NAS: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - currentHeaders = newMCSpec.source.httpGet.httpHeaders.slice(); - currentHeaders.splice(action.index, 1); - newMCSpec.source.httpGet.httpHeaders = currentHeaders; - return { - ...state, - mcSpec: newMCSpec, - }; - // Collector Custom container - case actions.CHANGE_MC_CUSTOM_CONTAINER_NAS: - return { - ...state, - mcCustomContainerYaml: action.yamlContainer, - }; - // Collector Metrics Format - case actions.ADD_MC_METRICS_FORMAT_NAS: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - let currentFormats = newMCSpec.source.filter.metricsFormat.slice(); - currentFormats.push(''); - newMCSpec.source.filter.metricsFormat = currentFormats; - return { - ...state, - mcSpec: newMCSpec, - }; - case actions.CHANGE_MC_METRIC_FORMAT_NAS: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - currentFormats = newMCSpec.source.filter.metricsFormat.slice(); - currentFormats[action.index] = action.format; - newMCSpec.source.filter.metricsFormat = currentFormats; - return { - ...state, - mcSpec: newMCSpec, - }; - case actions.DELETE_MC_METRIC_FORMAT_NAS: - newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); - currentFormats = newMCSpec.source.filter.metricsFormat.slice(); - currentFormats.splice(action.index, 1); - newMCSpec.source.filter.metricsFormat = currentFormats; - return { - ...state, - mcSpec: newMCSpec, - }; - default: - return state; - } -}; - -export default nasCreateReducer; diff --git a/pkg/ui/v1alpha3/frontend/src/reducers/nasMonitor.js b/pkg/ui/v1alpha3/frontend/src/reducers/nasMonitor.js deleted file mode 100644 index 7fbc12655db..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/reducers/nasMonitor.js +++ /dev/null @@ -1,112 +0,0 @@ -import * as actions from '../actions/nasMonitorActions'; - -const initialState = { - experimentName: '', - experimentNamespace: '', - filter: '', - filterType: { - Created: true, - Running: true, - Restarting: true, - Succeeded: true, - Failed: true, - }, - jobsList: [], - filteredJobsList: [], - loading: false, - steps: [], -}; - -const nasMonitorReducer = (state = initialState, action) => { - switch (action.type) { - case actions.FILTER_JOBS: - let jobs = state.jobsList.slice(); - let newList = jobs.filter( - job => - job.name.includes(action.experimentName) && - (job.namespace == action.experimentNamespace || - action.experimentNamespace == 'All namespaces' || - action.experimentNamespace.length == 0), - ); - let types = Object.assign({}, state.filterType); - var typeKeys = Object.keys(types); - - var filters = typeKeys.filter(key => { - return types[key]; - }); - - let filteredJobs = newList.filter(job => filters.includes(job.status)); - - return { - ...state, - filteredJobsList: filteredJobs, - experimentName: action.experimentName, - experimentNamespace: action.experimentNamespace, - }; - case actions.CHANGE_TYPE: - jobs = state.jobsList.slice(); - newList = jobs.filter( - job => - job.name.includes(state.experimentName) && - (job.namespace == state.experimentNamespace || - state.experimentNamespace == 'All namespaces' || - state.experimentNamespace.length == 0), - ); - types = Object.assign({}, state.filterType); - types[action.filter] = action.checked; - typeKeys = Object.keys(types); - - filters = typeKeys.filter(key => { - return types[key]; - }); - filteredJobs = newList.filter(job => filters.includes(job.status)); - - return { - ...state, - filterType: types, - filteredJobsList: filteredJobs, - }; - case actions.FETCH_NAS_JOBS_SUCCESS: - jobs = action.jobs; - types = Object.assign({}, state.filterType); - typeKeys = Object.keys(types); - - filters = typeKeys.filter(key => { - return types[key]; - }); - - filteredJobs = jobs.filter( - job => - filters.includes(job.status) && - job.name.includes(state.experimentName) && - (job.namespace == state.experimentNamespace || - state.experimentNamespace == 'All namespaces' || - state.experimentNamespace.length == 0), - ); - return { - ...state, - jobsList: action.jobs, - filteredJobsList: filteredJobs, - }; - case actions.FETCH_NAS_JOB_INFO_REQUEST: - return { - ...state, - loading: true, - }; - case actions.FETCH_NAS_JOB_INFO_FAILURE: - return { - ...state, - loading: false, - }; - case actions.FETCH_NAS_JOB_INFO_SUCCESS: - return { - ...state, - loading: false, - steps: action.steps, - }; - default: - return state; - } -}; - -export default nasMonitorReducer; diff --git a/pkg/ui/v1alpha3/frontend/src/reducers/template.js b/pkg/ui/v1alpha3/frontend/src/reducers/template.js deleted file mode 100644 index 8759a3135a2..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/reducers/template.js +++ /dev/null @@ -1,152 +0,0 @@ -import * as actions from '../actions/templateActions'; - -const initialState = { - addOpen: false, - editOpen: false, - deleteOpen: false, - trialTemplatesList: [], - filteredTrialTemplatesList: [], - currentTemplateName: '', - edittedTemplateNamespace: '', - edittedTemplateConfigMapName: '', - edittedTemplateName: '', - edittedTemplateYaml: '', - loading: false, - edittedTemplateConfigMapSelectList: [], - filteredNamespace: 'All namespaces', - filteredConfigMapName: '', -}; - -const rootReducer = (state = initialState, action) => { - switch (action.type) { - case actions.CLOSE_DIALOG: - return { - ...state, - editOpen: false, - addOpen: false, - deleteOpen: false, - }; - case actions.OPEN_DIALOG: - switch (action.dialogType) { - case 'add': - return { - ...state, - addOpen: true, - edittedTemplateNamespace: action.namespace, - edittedTemplateConfigMapName: action.configMapName, - edittedTemplateName: '', - edittedTemplateYaml: '', - filteredNamespace: 'All namespaces', - filteredConfigMapName: '', - }; - case 'edit': - return { - ...state, - editOpen: true, - edittedTemplateNamespace: action.namespace, - edittedTemplateConfigMapName: action.configMapName, - edittedTemplateName: action.templateName, - edittedTemplateYaml: action.templateYaml, - currentTemplateName: action.templateName, - filteredNamespace: 'All namespaces', - filteredConfigMapName: '', - }; - case 'delete': - return { - ...state, - deleteOpen: true, - edittedTemplateNamespace: action.namespace, - edittedTemplateConfigMapName: action.configMapName, - edittedTemplateName: action.templateName, - filteredNamespace: 'All namespaces', - filteredConfigMapName: '', - }; - default: - return state; - } - case actions.FETCH_TRIAL_TEMPLATES_REQUEST: - return { - ...state, - loading: true, - }; - case actions.FETCH_TRIAL_TEMPLATES_FAILURE: - return { - ...state, - loading: false, - }; - case actions.FETCH_TRIAL_TEMPLATES_SUCCESS: - return { - ...state, - trialTemplatesList: action.trialTemplatesList, - filteredTrialTemplatesList: action.trialTemplatesList, - loading: false, - }; - case actions.ADD_TEMPLATE_SUCCESS: - case actions.DELETE_TEMPLATE_SUCCESS: - case actions.EDIT_TEMPLATE_SUCCESS: - return { - ...state, - addOpen: false, - deleteOpen: false, - editOpen: false, - trialTemplatesList: action.trialTemplatesList, - filteredTrialTemplatesList: action.trialTemplatesList, - }; - - case actions.ADD_TEMPLATE_FAILURE: - case actions.EDIT_TEMPLATE_FAILURE: - case actions.DELETE_TEMPLATE_FAILURE: - return { - ...state, - addOpen: false, - deleteOpen: false, - editOpen: false, - }; - case actions.CHANGE_TEMPLATE: - return { - ...state, - edittedTemplateNamespace: action.edittedTemplateNamespace, - edittedTemplateConfigMapName: action.edittedTemplateConfigMapName, - edittedTemplateName: action.edittedTemplateName, - edittedTemplateYaml: action.edittedTemplateYaml, - edittedTemplateConfigMapSelectList: action.edittedTemplateConfigMapSelectList, - }; - case actions.FILTER_TEMPLATES: - let templates = state.trialTemplatesList; - - //Filter ConfigMap - let filteredConfigMaps = []; - for (let i = 0; i < templates.length; i++) { - let configMapsList = []; - for (let j = 0; j < templates[i].ConfigMapsList.length; j++) { - if (templates[i].ConfigMapsList[j].ConfigMapName.includes(action.filteredConfigMapName)) { - configMapsList.push(templates[i].ConfigMapsList[j]); - } - } - if (configMapsList.length != 0) { - let newNamespaceBlock = {}; - newNamespaceBlock.Namespace = templates[i].Namespace; - newNamespaceBlock.ConfigMapsList = configMapsList; - filteredConfigMaps.push(newNamespaceBlock); - } - } - - //Filter Namespace - let filteredTemplates = filteredConfigMaps.filter( - template => - template.Namespace == action.filteredNamespace || - action.filteredNamespace == 'All namespaces', - ); - - return { - ...state, - filteredNamespace: action.filteredNamespace, - filteredConfigMapName: action.filteredConfigMapName, - filteredTrialTemplatesList: filteredTemplates, - }; - default: - return state; - } -}; - -export default rootReducer; diff --git a/pkg/ui/v1alpha3/frontend/src/sagas/index.js b/pkg/ui/v1alpha3/frontend/src/sagas/index.js deleted file mode 100644 index 5ffb35c5212..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/sagas/index.js +++ /dev/null @@ -1,691 +0,0 @@ -import { take, put, call, fork, select, all, takeEvery } from 'redux-saga/effects'; -import axios from 'axios'; -import * as templateActions from '../actions/templateActions'; -import * as hpMonitorActions from '../actions/hpMonitorActions'; -import * as hpCreateActions from '../actions/hpCreateActions'; -import * as nasMonitorActions from '../actions/nasMonitorActions'; -import * as nasCreateActions from '../actions/nasCreateActions'; -import * as generalActions from '../actions/generalActions'; - -export const submitYaml = function*() { - while (true) { - const action = yield take(generalActions.SUBMIT_YAML_REQUEST); - try { - let isRightNamespace = false; - for (const [index, value] of Object.entries(action.yaml.split('\n'))) { - const noSpaceLine = value.replace(/\s/g, ''); - if (noSpaceLine == 'trialTemplate:') { - break; - } - if (action.globalNamespace == '' || noSpaceLine == 'namespace:' + action.globalNamespace) { - isRightNamespace = true; - break; - } - } - if (isRightNamespace) { - const result = yield call(goSubmitYaml, action.yaml); - if (result.status === 200) { - yield put({ - type: generalActions.SUBMIT_YAML_SUCCESS, - }); - } else { - yield put({ - type: generalActions.SUBMIT_YAML_FAILURE, - message: result.message, - }); - } - } else { - yield put({ - type: generalActions.SUBMIT_YAML_FAILURE, - message: 'You can submit experiments only in ' + action.globalNamespace + ' namespace!', - }); - } - } catch (err) { - yield put({ - type: generalActions.SUBMIT_YAML_FAILURE, - }); - } - } -}; - -const goSubmitYaml = function*(yaml) { - try { - const data = { - yaml, - }; - const result = yield call(axios.post, '/katib/submit_yaml/', data); - return result; - } catch (err) { - return { - status: 500, - message: err.response.data, - }; - } -}; - -export const deleteExperiment = function*() { - while (true) { - const action = yield take(generalActions.DELETE_EXPERIMENT_REQUEST); - try { - const result = yield call(goDeleteExperiment, action.name, action.namespace); - if (result.status === 200) { - yield put({ - type: generalActions.DELETE_EXPERIMENT_SUCCESS, - }); - } else { - yield put({ - type: generalActions.DELETE_EXPERIMENT_FAILURE, - }); - } - } catch (err) { - yield put({ - type: generalActions.DELETE_EXPERIMENT_FAILURE, - }); - } - } -}; - -const goDeleteExperiment = function*(name, namespace) { - try { - const result = yield call( - axios.get, - `/katib/delete_experiment/?experimentName=${name}&namespace=${namespace}`, - ); - return result; - } catch (err) { - yield put({ - type: generalActions.DELETE_EXPERIMENT_FAILURE, - }); - } -}; - -export const submitHPJob = function*() { - while (true) { - const action = yield take(hpCreateActions.SUBMIT_HP_JOB_REQUEST); - try { - const result = yield call(goSubmitHPJob, action.data); - if (result.status === 200) { - yield put({ - type: hpCreateActions.SUBMIT_HP_JOB_SUCCESS, - }); - } else { - yield put({ - type: hpCreateActions.SUBMIT_HP_JOB_FAILURE, - message: result.message, - }); - } - } catch (err) { - yield put({ - type: hpCreateActions.SUBMIT_HP_JOB_FAILURE, - }); - } - } -}; - -const goSubmitHPJob = function*(postData) { - try { - const data = { - postData, - }; - const result = yield call(axios.post, '/katib/submit_hp_job/', data); - return result; - } catch (err) { - return { - status: 500, - message: err.response.data, - }; - } -}; - -export const fetchHPJobs = function*() { - while (true) { - const action = yield take(hpMonitorActions.FETCH_HP_JOBS_REQUEST); - try { - const result = yield call(goFetchHPJobs); - if (result.status === 200) { - let data = Object.assign(result.data, {}); - data.map((template, i) => { - Object.keys(template).forEach(key => { - const value = template[key]; - delete template[key]; - template[key.toLowerCase()] = value; - }); - }); - yield put({ - type: hpMonitorActions.FETCH_HP_JOBS_SUCCESS, - jobs: data, - }); - } else { - yield put({ - type: hpMonitorActions.FETCH_HP_JOBS_FAILURE, - }); - } - } catch (err) { - yield put({ - type: hpMonitorActions.FETCH_HP_JOBS_FAILURE, - }); - } - } -}; - -const goFetchHPJobs = function*() { - try { - const result = yield call(axios.get, '/katib/fetch_hp_jobs/'); - return result; - } catch (err) { - yield put({ - type: hpMonitorActions.FETCH_HP_JOBS_FAILURE, - }); - } -}; - -export const fetchExperiment = function*() { - while (true) { - const action = yield take(generalActions.FETCH_EXPERIMENT_REQUEST); - try { - const result = yield call(goFetchExperiment, action.name, action.namespace); - if (result.status === 200) { - yield put({ - type: generalActions.FETCH_EXPERIMENT_SUCCESS, - experiment: result.data, - }); - } else { - yield put({ - type: generalActions.FETCH_EXPERIMENT_FAILURE, - }); - } - } catch (err) { - yield put({ - type: generalActions.FETCH_EXPERIMENT_FAILURE, - }); - } - } -}; - -const goFetchExperiment = function*(name, namespace) { - try { - const result = yield call( - axios.get, - `/katib/fetch_experiment/?experimentName=${name}&namespace=${namespace}`, - ); - return result; - } catch (err) { - yield put({ - type: generalActions.FETCH_EXPERIMENT_FAILURE, - }); - } -}; - -export const fetchSuggestion = function*() { - while (true) { - const action = yield take(generalActions.FETCH_SUGGESTION_REQUEST); - try { - const result = yield call(goFetchSuggestion, action.name, action.namespace); - if (result.status === 200) { - yield put({ - type: generalActions.FETCH_SUGGESTION_SUCCESS, - suggestion: result.data, - }); - } else { - yield put({ - type: generalActions.FETCH_SUGGESTION_FAILURE, - }); - } - } catch (err) { - yield put({ - type: generalActions.FETCH_SUGGESTION_FAILURE, - }); - } - } -}; - -const goFetchSuggestion = function*(name, namespace) { - try { - const result = yield call( - axios.get, - `/katib/fetch_suggestion/?suggestionName=${name}&namespace=${namespace}`, - ); - return result; - } catch (err) { - yield put({ - type: generalActions.FETCH_SUGGESTION_FAILURE, - }); - } -}; - -export const fetchHPJobInfo = function*() { - while (true) { - const action = yield take(hpMonitorActions.FETCH_HP_JOB_INFO_REQUEST); - try { - const result = yield call(goFetchHPJobInfo, action.name, action.namespace); - if (result.status === 200) { - let data = result.data.split('\n').map((line, i) => line.split(',')); - yield put({ - type: hpMonitorActions.FETCH_HP_JOB_INFO_SUCCESS, - jobData: data, - }); - } else { - yield put({ - type: hpMonitorActions.FETCH_HP_JOB_INFO_FAILURE, - }); - } - } catch (err) { - yield put({ - type: hpMonitorActions.FETCH_HP_JOB_INFO_FAILURE, - }); - } - } -}; - -const goFetchHPJobInfo = function*(name, namespace) { - try { - const result = yield call( - axios.get, - `/katib/fetch_hp_job_info/?experimentName=${name}&namespace=${namespace}`, - ); - return result; - } catch (err) { - yield put({ - type: hpMonitorActions.FETCH_HP_JOB_INFO_FAILURE, - }); - } -}; - -export const fetchHPJobTrialInfo = function*() { - while (true) { - const action = yield take(hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_REQUEST); - try { - const result = yield call(gofetchHPJobTrialInfo, action.trialName, action.namespace); - if (result.status === 200) { - let data = result.data.split('\n').map((line, i) => line.split(',')); - yield put({ - type: hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_SUCCESS, - trialData: data, - trialName: action.trialName, - }); - } else { - yield put({ - type: hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_FAILURE, - }); - } - } catch (err) { - yield put({ - type: hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_FAILURE, - }); - } - } -}; - -const gofetchHPJobTrialInfo = function*(trialName, namespace) { - try { - const result = yield call( - axios.get, - `/katib/fetch_hp_job_trial_info/?trialName=${trialName}&namespace=${namespace}`, - ); - return result; - } catch (err) { - yield put({ - type: hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_FAILURE, - }); - } -}; - -export const submitNASJob = function*() { - while (true) { - const action = yield take(nasCreateActions.SUBMIT_NAS_JOB_REQUEST); - try { - const result = yield call(goSubmitNASJob, action.data); - if (result.status === 200) { - yield put({ - type: nasCreateActions.SUBMIT_NAS_JOB_SUCCESS, - }); - } else { - yield put({ - type: nasCreateActions.SUBMIT_NAS_JOB_FAILURE, - message: result.message, - }); - } - } catch (err) { - yield put({ - type: nasCreateActions.SUBMIT_NAS_JOB_FAILURE, - }); - } - } -}; - -const goSubmitNASJob = function*(postData) { - try { - const data = { - postData, - }; - const result = yield call(axios.post, '/katib/submit_nas_job/', data); - return result; - } catch (err) { - return { - status: 500, - message: err.response.data, - }; - } -}; - -export const fetchNASJobs = function*() { - while (true) { - const action = yield take(nasMonitorActions.FETCH_NAS_JOBS_REQUEST); - try { - const result = yield call(goFetchNASJobs); - if (result.status === 200) { - let data = Object.assign(result.data, {}); - data.map((template, i) => { - Object.keys(template).forEach(key => { - const value = template[key]; - delete template[key]; - template[key.toLowerCase()] = value; - }); - }); - yield put({ - type: nasMonitorActions.FETCH_NAS_JOBS_SUCCESS, - jobs: data, - }); - } else { - yield put({ - type: nasMonitorActions.FETCH_NAS_JOBS_FAILURE, - }); - } - } catch (err) { - yield put({ - type: nasMonitorActions.FETCH_NAS_JOBS_FAILURE, - }); - } - } -}; - -const goFetchNASJobs = function*() { - try { - const result = yield call(axios.get, '/katib/fetch_nas_jobs/'); - return result; - } catch (err) { - yield put({ - type: nasMonitorActions.FETCH_NAS_JOBS_FAILURE, - }); - } -}; - -export const fetchNASJobInfo = function*() { - while (true) { - const action = yield take(nasMonitorActions.FETCH_NAS_JOB_INFO_REQUEST); - try { - const result = yield call(goFetchNASJobInfo, action.experimentName, action.namespace); - if (result.status === 200) { - let data = Object.assign(result.data, {}); - data.map((template, i) => { - Object.keys(template).forEach(key => { - const value = template[key]; - delete template[key]; - template[key.toLowerCase()] = value; - }); - }); - yield put({ - type: nasMonitorActions.FETCH_NAS_JOB_INFO_SUCCESS, - steps: data, - }); - } else { - yield put({ - type: nasMonitorActions.FETCH_NAS_JOB_INFO_FAILURE, - }); - } - } catch (err) { - yield put({ - type: nasMonitorActions.FETCH_NAS_JOB_INFO_FAILURE, - }); - } - } -}; - -const goFetchNASJobInfo = function*(experimentName, namespace) { - try { - const result = yield call( - axios.get, - `/katib/fetch_nas_job_info/?experimentName=${experimentName}&namespace=${namespace}`, - ); - return result; - } catch (err) { - yield put({ - type: nasMonitorActions.FETCH_NAS_JOB_INFO_FAILURE, - }); - } -}; - -export const fetchTrialTemplates = function*() { - while (true) { - const action = yield take(templateActions.FETCH_TRIAL_TEMPLATES_REQUEST); - try { - const result = yield call(goFetchTrialTemplates); - if (result.status === 200) { - yield put({ - type: templateActions.FETCH_TRIAL_TEMPLATES_SUCCESS, - trialTemplatesList: result.data.Data, - }); - } else { - yield put({ - type: templateActions.FETCH_TRIAL_TEMPLATES_FAILURE, - }); - } - } catch (err) { - yield put({ - type: templateActions.FETCH_TRIAL_TEMPLATES_FAILURE, - }); - } - } -}; - -const goFetchTrialTemplates = function*(namespace) { - try { - const result = yield call(axios.get, `/katib/fetch_trial_templates`); - return result; - } catch (err) { - yield put({ - type: templateActions.FETCH_TRIAL_TEMPLATES_FAILURE, - }); - } -}; - -export const addTemplate = function*() { - while (true) { - const action = yield take(templateActions.ADD_TEMPLATE_REQUEST); - try { - const result = yield call( - goAddTemplate, - action.edittedNamespace, - action.edittedConfigMapName, - action.edittedName, - action.edittedYaml, - ); - if (result.status === 200) { - yield put({ - type: templateActions.ADD_TEMPLATE_SUCCESS, - trialTemplatesList: result.data.Data, - }); - } else { - yield put({ - type: templateActions.ADD_TEMPLATE_FAILURE, - }); - } - } catch (err) { - yield put({ - type: templateActions.ADD_TEMPLATE_FAILURE, - }); - } - } -}; - -const goAddTemplate = function*(edittedNamespace, edittedConfigMapName, edittedName, edittedYaml) { - try { - const data = { - edittedNamespace, - edittedConfigMapName, - edittedName, - edittedYaml, - }; - const result = yield call(axios.post, '/katib/add_template/', data); - return result; - } catch (err) { - yield put({ - type: templateActions.ADD_TEMPLATE_FAILURE, - }); - } -}; - -export const editTemplate = function*() { - while (true) { - const action = yield take(templateActions.EDIT_TEMPLATE_REQUEST); - try { - const result = yield call( - goEditTemplate, - action.edittedNamespace, - action.edittedConfigMapName, - action.currentName, - action.edittedName, - action.edittedYaml, - ); - if (result.status === 200) { - yield put({ - type: templateActions.EDIT_TEMPLATE_SUCCESS, - trialTemplatesList: result.data.Data, - }); - } else { - yield put({ - type: templateActions.EDIT_TEMPLATE_FAILURE, - }); - } - } catch (err) { - yield put({ - type: templateActions.EDIT_TEMPLATE_FAILURE, - }); - } - } -}; - -const goEditTemplate = function*( - edittedNamespace, - edittedConfigMapName, - currentName, - edittedName, - edittedYaml, -) { - try { - const data = { - edittedNamespace, - edittedConfigMapName, - currentName, - edittedName, - edittedYaml, - }; - const result = yield call(axios.post, '/katib/edit_template/', data); - return result; - } catch (err) { - yield put({ - type: templateActions.EDIT_TEMPLATE_FAILURE, - }); - } -}; - -export const deleteTemplate = function*() { - while (true) { - const action = yield take(templateActions.DELETE_TEMPLATE_REQUEST); - try { - const result = yield call( - goDeleteTemplate, - action.edittedNamespace, - action.edittedConfigMapName, - action.edittedName, - ); - if (result.status === 200) { - yield put({ - type: templateActions.DELETE_TEMPLATE_SUCCESS, - trialTemplatesList: result.data.Data, - }); - } else { - yield put({ - type: templateActions.DELETE_TEMPLATE_FAILURE, - }); - } - } catch (err) { - yield put({ - type: templateActions.DELETE_TEMPLATE_FAILURE, - }); - } - } -}; - -const goDeleteTemplate = function*(edittedNamespace, edittedConfigMapName, edittedName) { - try { - const data = { - edittedNamespace, - edittedConfigMapName, - edittedName, - }; - const result = yield call(axios.post, '/katib/delete_template/', data); - return result; - } catch (err) { - yield put({ - type: templateActions.DELETE_TEMPLATE_FAILURE, - }); - } -}; - -export const fetchNamespaces = function*() { - while (true) { - const action = yield take(generalActions.FETCH_NAMESPACES_REQUEST); - try { - const result = yield call(goFetchNamespaces); - if (result.status === 200) { - let data = result.data; - data.unshift('All namespaces'); - yield put({ - type: generalActions.FETCH_NAMESPACES_SUCCESS, - namespaces: data, - }); - } else { - yield put({ - type: generalActions.FETCH_NAMESPACES_FAILURE, - }); - } - } catch (err) { - yield put({ - type: generalActions.FETCH_NAMESPACES_FAILURE, - }); - } - } -}; - -const goFetchNamespaces = function*() { - try { - const result = yield call(axios.get, '/katib/fetch_namespaces'); - return result; - } catch (err) { - yield put({ - type: generalActions.FETCH_NAMESPACES_FAILURE, - }); - } -}; - -export default function* rootSaga() { - yield all([ - fork(fetchTrialTemplates), - fork(fetchHPJobs), - fork(fetchNASJobs), - fork(addTemplate), - fork(editTemplate), - fork(deleteTemplate), - fork(submitYaml), - fork(deleteExperiment), - fork(submitHPJob), - fork(submitNASJob), - fork(fetchHPJobInfo), - fork(fetchExperiment), - fork(fetchSuggestion), - fork(fetchHPJobTrialInfo), - fork(fetchNASJobInfo), - fork(fetchNamespaces), - ]); -} diff --git a/pkg/ui/v1alpha3/frontend/src/serviceWorker.js b/pkg/ui/v1alpha3/frontend/src/serviceWorker.js deleted file mode 100755 index f4f3eb4b214..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/serviceWorker.js +++ /dev/null @@ -1,131 +0,0 @@ -// This optional code is used to register a service worker. -// register() is not called by default. - -// This lets the app load faster on subsequent visits in production, and gives -// it offline capabilities. However, it also means that developers (and users) -// will only see deployed updates on subsequent visits to a page, after all the -// existing tabs open on the page have been closed, since previously cached -// resources are updated in the background. - -// To learn more about the benefits of this model and instructions on how to -// opt-in, read http://bit.ly/CRA-PWA - -const isLocalhost = Boolean( - window.location.hostname === 'localhost' || - // [::1] is the IPv6 localhost address. - window.location.hostname === '[::1]' || - // 127.0.0.1/8 is considered localhost for IPv4. - window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/), -); - -export function register(config) { - if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { - // The URL constructor is available in all browsers that support SW. - const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); - if (publicUrl.origin !== window.location.origin) { - // Our service worker won't work if PUBLIC_URL is on a different origin - // from what our page is served on. This might happen if a CDN is used to - // serve assets; see https://github.com/facebook/create-react-app/issues/2374 - return; - } - - window.addEventListener('load', () => { - const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; - - if (isLocalhost) { - // This is running on localhost. Let's check if a service worker still exists or not. - checkValidServiceWorker(swUrl, config); - - // Add some additional logging to localhost, pointing developers to the - // service worker/PWA documentation. - navigator.serviceWorker.ready.then(() => { - console.log( - 'This web app is being served cache-first by a service ' + - 'worker. To learn more, visit http://bit.ly/CRA-PWA', - ); - }); - } else { - // Is not localhost. Just register service worker - registerValidSW(swUrl, config); - } - }); - } -} - -function registerValidSW(swUrl, config) { - navigator.serviceWorker - .register(swUrl) - .then(registration => { - registration.onupdatefound = () => { - const installingWorker = registration.installing; - if (installingWorker == null) { - return; - } - installingWorker.onstatechange = () => { - if (installingWorker.state === 'installed') { - if (navigator.serviceWorker.controller) { - // At this point, the updated precached content has been fetched, - // but the previous service worker will still serve the older - // content until all client tabs are closed. - console.log( - 'New content is available and will be used when all ' + - 'tabs for this page are closed. See http://bit.ly/CRA-PWA.', - ); - - // Execute callback - if (config && config.onUpdate) { - config.onUpdate(registration); - } - } else { - // At this point, everything has been precached. - // It's the perfect time to display a - // "Content is cached for offline use." message. - console.log('Content is cached for offline use.'); - - // Execute callback - if (config && config.onSuccess) { - config.onSuccess(registration); - } - } - } - }; - }; - }) - .catch(error => { - console.error('Error during service worker registration:', error); - }); -} - -function checkValidServiceWorker(swUrl, config) { - // Check if the service worker can be found. If it can't reload the page. - fetch(swUrl) - .then(response => { - // Ensure service worker exists, and that we really are getting a JS file. - const contentType = response.headers.get('content-type'); - if ( - response.status === 404 || - (contentType != null && contentType.indexOf('javascript') === -1) - ) { - // No service worker found. Probably a different app. Reload the page. - navigator.serviceWorker.ready.then(registration => { - registration.unregister().then(() => { - window.location.reload(); - }); - }); - } else { - // Service worker found. Proceed as normal. - registerValidSW(swUrl, config); - } - }) - .catch(() => { - console.log('No internet connection found. App is running in offline mode.'); - }); -} - -export function unregister() { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.ready.then(registration => { - registration.unregister(); - }); - } -} diff --git a/pkg/ui/v1alpha3/frontend/src/store/index.js b/pkg/ui/v1alpha3/frontend/src/store/index.js deleted file mode 100644 index e8eab207613..00000000000 --- a/pkg/ui/v1alpha3/frontend/src/store/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import { createStore, applyMiddleware, compose } from 'redux'; -import logger from 'redux-logger'; -import createSagaMiddleware, { END } from 'redux-saga'; -import rootReducer from '../reducers'; - -export default function configureStore(initialState) { - const sagaMiddleware = createSagaMiddleware(); - - const store = createStore( - rootReducer, - initialState, - compose(applyMiddleware(sagaMiddleware, logger)), - ); - - store.runSaga = sagaMiddleware.run; - store.close = () => store.dispatch(END); - return store; -} diff --git a/pkg/ui/v1alpha3/hp.go b/pkg/ui/v1alpha3/hp.go deleted file mode 100644 index 4c5204f66bc..00000000000 --- a/pkg/ui/v1alpha3/hp.go +++ /dev/null @@ -1,235 +0,0 @@ -package v1alpha3 - -import ( - "context" - "encoding/json" - "log" - "net/http" - "strconv" - "strings" - "time" - - corev1 "k8s.io/api/core/v1" - - commonv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - api_pb_v1alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" -) - -// FetchAllHPJobs gets experiments in all namespaces. -func (k *KatibUIHandler) FetchAllHPJobs(w http.ResponseWriter, r *http.Request) { - // At first, try to list experiments in cluster scope - jobs, err := k.getExperimentList([]string{""}, JobTypeHP) - if err != nil { - // If failed, just try to list experiments from own namespace - jobs, err = k.getExperimentList([]string{}, JobTypeHP) - } - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - response, err := json.Marshal(jobs) - if err != nil { - log.Printf("Marshal HP jobs failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Write(response) -} - -func (k *KatibUIHandler) FetchHPJobInfo(w http.ResponseWriter, r *http.Request) { - //enableCors(&w) - experimentName := r.URL.Query()["experimentName"][0] - namespace := r.URL.Query()["namespace"][0] - - conn, c := k.connectManager() - defer conn.Close() - - resultText := "trialName,Status" - experiment, err := k.katibClient.GetExperiment(experimentName, namespace) - if err != nil { - log.Printf("GetExperiment from HP job failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - log.Printf("Got Experiment") - metricsList := map[string]int{} - metricsName := experiment.Spec.Objective.ObjectiveMetricName - resultText += "," + metricsName - metricsList[metricsName] = 0 - for i, m := range experiment.Spec.Objective.AdditionalMetricNames { - resultText += "," + m - metricsList[m] = i + 1 - } - log.Printf("Got metrics names") - paramList := map[string]int{} - for i, p := range experiment.Spec.Parameters { - resultText += "," + p.Name - paramList[p.Name] = i + len(metricsList) - } - log.Printf("Got Parameters names") - - trialList, err := k.katibClient.GetTrialList(experimentName, namespace) - if err != nil { - log.Printf("GetTrialList from HP job failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - log.Printf("Got Trial List") - - for _, t := range trialList.Items { - succeeded := false - for _, condition := range t.Status.Conditions { - if condition.Type == trialsv1alpha3.TrialSucceeded && - condition.Status == corev1.ConditionTrue { - succeeded = true - } - } - var lastTrialCondition string - - // Take only the latest condition - if len(t.Status.Conditions) > 0 { - lastTrialCondition = string(t.Status.Conditions[len(t.Status.Conditions)-1].Type) - } - - trialResText := make([]string, len(metricsList)+len(paramList)) - - if succeeded { - obsLogResp, err := c.GetObservationLog( - context.Background(), - &api_pb_v1alpha3.GetObservationLogRequest{ - TrialName: t.Name, - StartTime: "", - EndTime: "", - }, - ) - if err != nil { - log.Printf("GetObservationLog from HP job failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - for _, m := range obsLogResp.ObservationLog.MetricLogs { - if trialResText[metricsList[m.Metric.Name]] == "" { - trialResText[metricsList[m.Metric.Name]] = m.Metric.Value - } else { - currentValue, _ := strconv.ParseFloat(m.Metric.Value, 64) - bestValue, _ := strconv.ParseFloat(trialResText[metricsList[m.Metric.Name]], 64) - if t.Spec.Objective.Type == commonv1alpha3.ObjectiveTypeMinimize && currentValue < bestValue { - trialResText[metricsList[m.Metric.Name]] = m.Metric.Value - } else if t.Spec.Objective.Type == commonv1alpha3.ObjectiveTypeMaximize && currentValue > bestValue { - trialResText[metricsList[m.Metric.Name]] = m.Metric.Value - } - } - } - } - for _, trialParam := range t.Spec.ParameterAssignments { - trialResText[paramList[trialParam.Name]] = trialParam.Value - } - resultText += "\n" + t.Name + "," + lastTrialCondition + "," + strings.Join(trialResText, ",") - } - log.Printf("Logs parsed, results:\n %v", resultText) - response, err := json.Marshal(resultText) - if err != nil { - log.Printf("Marshal result text for HP job failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Write(response) -} - -// FetchHPJobTrialInfo returns all metrics for the HP Job Trial -func (k *KatibUIHandler) FetchHPJobTrialInfo(w http.ResponseWriter, r *http.Request) { - //enableCors(&w) - trialName := r.URL.Query()["trialName"][0] - namespace := r.URL.Query()["namespace"][0] - conn, c := k.connectManager() - defer conn.Close() - - trial, err := k.katibClient.GetTrial(trialName, namespace) - - if err != nil { - log.Printf("GetTrial from HP job failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - } - - objectiveType := trial.Spec.Objective.Type - - // resultArray - array of arrays, where [i][0] - metricName, [i][1] - metricTime, [i][2] - metricValue - var resultArray [][]string - resultArray = append(resultArray, strings.Split("metricName,time,value", ",")) - obsLogResp, err := c.GetObservationLog( - context.Background(), - &api_pb_v1alpha3.GetObservationLogRequest{ - TrialName: trialName, - StartTime: "", - EndTime: "", - }, - ) - if err != nil { - log.Printf("GetObservationLog failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - // prevMetricTimeValue is the dict, where key = metric name, - // value = array, where [0] - Last metric time, [1] - Best metric value for this time - prevMetricTimeValue := make(map[string][]string) - for _, m := range obsLogResp.ObservationLog.MetricLogs { - parsedCurrentTime, _ := time.Parse(time.RFC3339Nano, m.TimeStamp) - formatCurrentTime := parsedCurrentTime.Format("2006-01-02T15:04:05") - if _, found := prevMetricTimeValue[m.Metric.Name]; !found { - prevMetricTimeValue[m.Metric.Name] = []string{"", ""} - - } - - newMetricValue, err := strconv.ParseFloat(m.Metric.Value, 64) - if err != nil { - log.Printf("ParseFloat for new metric value: %v failed: %v", m.Metric.Value, err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - var prevMetricValue float64 - if prevMetricTimeValue[m.Metric.Name][1] != "" { - prevMetricValue, err = strconv.ParseFloat(prevMetricTimeValue[m.Metric.Name][1], 64) - if err != nil { - log.Printf("ParseFloat for prev metric value: %v failed: %v", prevMetricTimeValue[m.Metric.Name][1], err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - } - - if formatCurrentTime == prevMetricTimeValue[m.Metric.Name][0] && - ((objectiveType == commonv1alpha3.ObjectiveTypeMinimize && - newMetricValue < prevMetricValue) || - (objectiveType == commonv1alpha3.ObjectiveTypeMaximize && - newMetricValue > prevMetricValue)) { - - prevMetricTimeValue[m.Metric.Name][1] = m.Metric.Value - for i := len(resultArray) - 1; i >= 0; i-- { - if resultArray[i][0] == m.Metric.Name { - resultArray[i][2] = m.Metric.Value - break - } - } - } else if formatCurrentTime != prevMetricTimeValue[m.Metric.Name][0] { - resultArray = append(resultArray, []string{m.Metric.Name, formatCurrentTime, m.Metric.Value}) - prevMetricTimeValue[m.Metric.Name][0] = formatCurrentTime - prevMetricTimeValue[m.Metric.Name][1] = m.Metric.Value - } - } - - var resultText string - for _, metric := range resultArray { - resultText += strings.Join(metric, ",") + "\n" - } - - response, err := json.Marshal(resultText) - if err != nil { - log.Printf("Marshal result text in Trial info failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Write(response) -} diff --git a/pkg/ui/v1alpha3/nas.go b/pkg/ui/v1alpha3/nas.go deleted file mode 100644 index 77b6ed24555..00000000000 --- a/pkg/ui/v1alpha3/nas.go +++ /dev/null @@ -1,110 +0,0 @@ -package v1alpha3 - -import ( - "context" - "encoding/json" - "log" - "net/http" - "strconv" - - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - api_pb_v1alpha3 "github.com/kubeflow/katib/pkg/apis/manager/v1alpha3" -) - -func (k *KatibUIHandler) FetchAllNASJobs(w http.ResponseWriter, r *http.Request) { - // At first, try to list experiments in cluster scope - jobs, err := k.getExperimentList([]string{""}, JobTypeNAS) - if err != nil { - // If failed, just try to list experiments from own namespace - jobs, err = k.getExperimentList([]string{}, JobTypeNAS) - } - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - response, err := json.Marshal(jobs) - if err != nil { - log.Printf("Marshal NAS jobs failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Write(response) -} - -func (k *KatibUIHandler) FetchNASJobInfo(w http.ResponseWriter, r *http.Request) { - //enableCors(&w) - experimentName := r.URL.Query()["experimentName"][0] - namespace := r.URL.Query()["namespace"][0] - - responseRaw := make([]NNView, 0) - var architecture string - var decoder string - - conn, c := k.connectManager() - - defer conn.Close() - - trials, err := k.katibClient.GetTrialList(experimentName, namespace) - if err != nil { - log.Printf("GetTrialList from NAS job failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - log.Printf("Got Trial List") - - for i, t := range trials.Items { - succeeded := false - for _, condition := range t.Status.Conditions { - if condition.Type == trialsv1alpha3.TrialSucceeded { - succeeded = true - } - } - if succeeded { - obsLogResp, err := c.GetObservationLog( - context.Background(), - &api_pb_v1alpha3.GetObservationLogRequest{ - TrialName: t.Name, - StartTime: "", - EndTime: "", - }, - ) - if err != nil { - log.Printf("GetObservationLog from NAS job failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - metricsName := make([]string, 0) - metricsValue := make([]string, 0) - for _, m := range obsLogResp.ObservationLog.MetricLogs { - metricsName = append(metricsName, m.Metric.Name) - metricsValue = append(metricsValue, m.Metric.Value) - - } - for _, trialParam := range t.Spec.ParameterAssignments { - if trialParam.Name == "architecture" { - architecture = trialParam.Value - } - if trialParam.Name == "nn_config" { - decoder = trialParam.Value - } - } - responseRaw = append(responseRaw, NNView{ - Name: "Generation " + strconv.Itoa(i), - TrialName: t.Name, - Architecture: generateNNImage(architecture, decoder), - MetricsName: metricsName, - MetricsValue: metricsValue, - }) - } - } - log.Printf("Logs parsed, result: %v", responseRaw) - - response, err := json.Marshal(responseRaw) - if err != nil { - log.Printf("Marshal result in NAS job failed: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Write(response) -} diff --git a/pkg/ui/v1alpha3/types.go b/pkg/ui/v1alpha3/types.go deleted file mode 100644 index bb9b3deb904..00000000000 --- a/pkg/ui/v1alpha3/types.go +++ /dev/null @@ -1,82 +0,0 @@ -package v1alpha3 - -import ( - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - "github.com/kubeflow/katib/pkg/util/v1alpha3/katibclient" -) - -const maxMsgSize = 1<<31 - 1 - -var ( - // namespace = "default" - allowedHeaders = "Accept, Content-Type, Content-Length, Accept-Encoding, Authorization, X-CSRF-Token" - - TrialTemplateLabel = map[string]string{ - consts.LabelTrialTemplateConfigMapName: consts.LabelTrialTemplateConfigMapValue} -) - -type Decoder struct { - Layers int `json:"num_layers"` - InputSize []int `json:"input_size"` - OutputSize []int `json:"output_size"` - Embedding map[int]*Block `json:"embedding"` -} - -type Block struct { - ID int `json:"opt_id"` - Type string `json:"opt_type"` - Param Option `json:"opt_params"` -} - -type Option struct { - FilterNumber string `json:"num_filter"` - FilterSize string `json:"filter_size"` - Stride string `json:"stride"` -} - -type JobView struct { - Name string - Status string - Namespace string -} - -type TrialTemplatesView struct { - Namespace string - ConfigMapsList []ConfigMapsList -} - -type TrialTemplatesResponse struct { - Data []TrialTemplatesView -} - -type ConfigMapsList struct { - ConfigMapName string - TemplatesList []TemplatesList -} - -type TemplatesList struct { - Name string - Yaml string -} - -type KatibUIHandler struct { - katibClient katibclient.Client -} - -type NNView struct { - Name string - TrialName string - Architecture string - MetricsName []string - MetricsValue []string -} - -type JobType string - -const ( - JobTypeHP = "HP" - JobTypeNAS = "NAS" - ActionTypeAdd = "add" - ActionTypeEdit = "edit" - ActionTypeDelete = "delete" -) diff --git a/pkg/ui/v1alpha3/util.go b/pkg/ui/v1alpha3/util.go deleted file mode 100644 index 04cc3c859f4..00000000000 --- a/pkg/ui/v1alpha3/util.go +++ /dev/null @@ -1,236 +0,0 @@ -package v1alpha3 - -import ( - "encoding/json" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - "log" - "net/http" - "strconv" - "strings" - - gographviz "github.com/awalterschulze/gographviz" - apiv1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -func (k *KatibUIHandler) getExperimentList(namespace []string, typ JobType) ([]JobView, error) { - jobs := make([]JobView, 0) - - el, err := k.katibClient.GetExperimentList(namespace...) - if err != nil { - log.Printf("GetExperimentList failed: %v", err) - return nil, err - } - for _, experiment := range el.Items { - if (typ == JobTypeNAS && experiment.Spec.NasConfig != nil) || - (typ == JobTypeHP && experiment.Spec.NasConfig == nil) { - experimentLastCondition, err := experiment.GetLastConditionType() - if err != nil { - log.Printf("GetLastConditionType failed: %v", err) - return nil, err - } - jobs = append(jobs, JobView{ - Name: experiment.Name, - Namespace: experiment.Namespace, - Status: string(experimentLastCondition), - }) - } - } - return jobs, nil -} - -func enableCors(w *http.ResponseWriter) { - (*w).Header().Set("Content-Type", "text/html; charset=utf-8") - (*w).Header().Set("Access-Control-Allow-Origin", "*") - (*w).Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE") - (*w).Header().Set("Access-Control-Allow-Headers", allowedHeaders) - (*w).Header().Set("Access-Control-Expose-Headers", "Access-Control-*") - (*w).Header().Set("Access-Control-Allow-Credentials", "true") -} - -func (k *KatibUIHandler) getTrialTemplatesViewList() ([]TrialTemplatesView, error) { - trialTemplatesViewList := make([]TrialTemplatesView, 0) - - // Get all available namespaces - namespaces, err := k.getAvailableNamespaces() - if err != nil { - log.Printf("GetAvailableNamespaces failed: %v", err) - return nil, err - } - - // Get Trial Template ConfigMap for each namespace - for _, ns := range namespaces { - trialTemplatesConfigMapList, err := k.katibClient.GetTrialTemplates(ns) - if err != nil { - log.Printf("GetTrialTemplates failed: %v", err) - return nil, err - } - - if len(trialTemplatesConfigMapList.Items) != 0 { - trialTemplatesViewList = append(trialTemplatesViewList, getTrialTemplatesView(trialTemplatesConfigMapList)) - } - } - return trialTemplatesViewList, nil -} - -func (k *KatibUIHandler) getAvailableNamespaces() ([]string, error) { - var namespaces []string - - namespaceList, err := k.katibClient.GetNamespaceList() - if err != nil { - namespaces = append(namespaces, consts.DefaultKatibNamespace) - return namespaces, nil - } - for _, ns := range namespaceList.Items { - namespaces = append(namespaces, ns.ObjectMeta.Name) - } - - return namespaces, nil -} - -func getTrialTemplatesView(templatesConfigMapList *apiv1.ConfigMapList) TrialTemplatesView { - - trialTemplateView := TrialTemplatesView{ - Namespace: templatesConfigMapList.Items[0].ObjectMeta.Namespace, - ConfigMapsList: []ConfigMapsList{}, - } - for _, configMap := range templatesConfigMapList.Items { - configMapList := ConfigMapsList{ - ConfigMapName: configMap.ObjectMeta.Name, - TemplatesList: []TemplatesList{}, - } - for key := range configMap.Data { - templatesList := TemplatesList{ - Name: key, - Yaml: configMap.Data[key], - } - configMapList.TemplatesList = append(configMapList.TemplatesList, templatesList) - } - - trialTemplateView.ConfigMapsList = append(trialTemplateView.ConfigMapsList, configMapList) - } - - return trialTemplateView -} - -func (k *KatibUIHandler) updateTrialTemplates( - edittedNamespace, - edittedConfigMapName, - edittedName, - edittedYaml, - currentName, - actionType string) ([]TrialTemplatesView, error) { - - templates, err := k.katibClient.GetConfigMap(edittedConfigMapName, edittedNamespace) - if err != nil { - log.Printf("GetConfigMap failed: %v", err) - return nil, err - } - - if actionType == ActionTypeAdd { - if len(templates) == 0 { - templates = make(map[string]string) - templates[edittedName] = edittedYaml - } else { - templates[edittedName] = edittedYaml - } - } else if actionType == ActionTypeEdit { - delete(templates, currentName) - templates[edittedName] = edittedYaml - } else if actionType == ActionTypeDelete { - delete(templates, edittedName) - } - - templatesConfigMap := &apiv1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: edittedConfigMapName, - Namespace: edittedNamespace, - Labels: TrialTemplateLabel, - }, - Data: templates, - } - - err = k.katibClient.UpdateConfigMap(templatesConfigMap) - if err != nil { - log.Printf("UpdateConfigMap failed: %v", err) - return nil, err - } - - newTemplates, err := k.getTrialTemplatesViewList() - if err != nil { - log.Printf("getTrialTemplatesViewList: %v", err) - return nil, err - } - - return newTemplates, nil - -} -func getNodeString(block *Block) string { - var nodeString string - switch block.Type { - case "convolution": - nodeString += block.Param.FilterSize + "x" + block.Param.FilterSize - nodeString += " conv\n" - nodeString += block.Param.FilterSize + " channels" - case "separable_convolution": - nodeString += block.Param.FilterSize + "x" + block.Param.FilterSize - nodeString += " sep_conv\n" - nodeString += block.Param.FilterSize + " channels" - case "depthwise_convolution": - nodeString += block.Param.FilterSize + "x" + block.Param.FilterSize - nodeString += " depth_conv\n" - case "reduction": - // TODO: Need to be fixed - nodeString += "3x3 max_pooling" - } - return strconv.Quote(nodeString) -} - -func generateNNImage(architecture string, decoder string) string { - - var architectureInt [][]int - - if err := json.Unmarshal([]byte(architecture), &architectureInt); err != nil { - panic(err) - } - /* - Always has num_layers, input_size, output_size and embeding - Embeding is a map: int to Parameter - Parameter has id, type, Option - - Beforehand substite all ' to " and wrap the string in ` - */ - - replacedDecoder := strings.Replace(decoder, `'`, `"`, -1) - var decoderParsed Decoder - - err := json.Unmarshal([]byte(replacedDecoder), &decoderParsed) - if err != nil { - panic(err) - } - - graphAst, _ := gographviz.ParseString(`digraph G {}`) - graph := gographviz.NewGraph() - if err := gographviz.Analyse(graphAst, graph); err != nil { - panic(err) - } - graph.AddNode("G", "0", map[string]string{"label": strconv.Quote("Input")}) - var i int - for i = 0; i < len(architectureInt); i++ { - graph.AddNode("G", strconv.Itoa(i+1), map[string]string{"label": getNodeString(decoderParsed.Embedding[architectureInt[i][0]])}) - graph.AddEdge(strconv.Itoa(i), strconv.Itoa(i+1), true, nil) - for j := 1; j < i+1; j++ { - if architectureInt[i][j] == 1 { - graph.AddEdge(strconv.Itoa(j-1), strconv.Itoa(i+1), true, nil) - } - } - } - graph.AddNode("G", strconv.Itoa(i+1), map[string]string{"label": strconv.Quote("GlobalAvgPool")}) - graph.AddEdge(strconv.Itoa(i), strconv.Itoa(i+1), true, nil) - graph.AddNode("G", strconv.Itoa(i+2), map[string]string{"label": strconv.Quote("FullConnect\nSoftmax")}) - graph.AddEdge(strconv.Itoa(i+1), strconv.Itoa(i+2), true, nil) - graph.AddNode("G", strconv.Itoa(i+3), map[string]string{"label": strconv.Quote("Output")}) - graph.AddEdge(strconv.Itoa(i+2), strconv.Itoa(i+3), true, nil) - s := graph.String() - return s -} diff --git a/pkg/util/v1alpha3/env/env.go b/pkg/util/v1alpha3/env/env.go deleted file mode 100644 index 3de45f1865f..00000000000 --- a/pkg/util/v1alpha3/env/env.go +++ /dev/null @@ -1,10 +0,0 @@ -package env - -import "os" - -func GetEnvOrDefault(key string, fallback string) string { - if value, ok := os.LookupEnv(key); ok { - return value - } - return fallback -} diff --git a/pkg/util/v1alpha3/env/env_test.go b/pkg/util/v1alpha3/env/env_test.go deleted file mode 100644 index b1f5d0caf74..00000000000 --- a/pkg/util/v1alpha3/env/env_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package env - -import ( - "os" - "testing" -) - -func TestGetEnvWithDefault(t *testing.T) { - expected := "FAKE" - key := "TEST" - v := GetEnvOrDefault(key, expected) - if v != expected { - t.Errorf("Expected %s, got %s", expected, v) - } - expected = "FAKE1" - os.Setenv(key, expected) - v = GetEnvOrDefault(key, "") - if v != expected { - t.Errorf("Expected %s, got %s", expected, v) - } -} diff --git a/pkg/util/v1alpha3/katibclient/katib_client.go b/pkg/util/v1alpha3/katibclient/katib_client.go deleted file mode 100644 index 9c1d77a88bc..00000000000 --- a/pkg/util/v1alpha3/katibclient/katib_client.go +++ /dev/null @@ -1,223 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package katibclient - -import ( - "context" - - apiv1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/kubernetes/scheme" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/config" - - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - suggestionsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1alpha3" - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" -) - -type Client interface { - InjectClient(c client.Client) - GetClient() client.Client - GetExperimentList(namespace ...string) (*experimentsv1alpha3.ExperimentList, error) - CreateExperiment(experiment *experimentsv1alpha3.Experiment, namespace ...string) error - UpdateExperiment(experiment *experimentsv1alpha3.Experiment, namespace ...string) error - DeleteExperiment(experiment *experimentsv1alpha3.Experiment, namespace ...string) error - GetExperiment(name string, namespace ...string) (*experimentsv1alpha3.Experiment, error) - GetConfigMap(name string, namespace ...string) (map[string]string, error) - GetTrial(name string, namespace ...string) (*trialsv1alpha3.Trial, error) - GetTrialList(name string, namespace ...string) (*trialsv1alpha3.TrialList, error) - GetTrialTemplates(namespace ...string) (*apiv1.ConfigMapList, error) - GetSuggestion(name string, namespace ...string) (*suggestionsv1alpha3.Suggestion, error) - UpdateConfigMap(newConfigMap *apiv1.ConfigMap) error - GetNamespaceList() (*apiv1.NamespaceList, error) -} - -type KatibClient struct { - client client.Client -} - -func NewWithGivenClient(c client.Client) Client { - return &KatibClient{ - client: c, - } -} - -func NewClient(options client.Options) (Client, error) { - cfg, err := config.GetConfig() - if err != nil { - return nil, err - } - experimentsv1alpha3.AddToScheme(scheme.Scheme) - trialsv1alpha3.AddToScheme(scheme.Scheme) - suggestionsv1alpha3.AddToScheme(scheme.Scheme) - cl, err := client.New(cfg, options) - if err != nil { - return nil, err - } - return &KatibClient{ - client: cl, - }, nil -} - -func (k *KatibClient) InjectClient(c client.Client) { - k.client = c -} - -func (k *KatibClient) GetClient() client.Client { - return k.client -} - -func (k *KatibClient) GetExperimentList(namespace ...string) (*experimentsv1alpha3.ExperimentList, error) { - ns := getNamespace(namespace...) - expList := &experimentsv1alpha3.ExperimentList{} - listOpt := client.InNamespace(ns) - - if err := k.client.List(context.Background(), listOpt, expList); err != nil { - return expList, err - } - return expList, nil - -} - -// GetSuggestion returns the Suggestion CR for the given name and namespace -func (k *KatibClient) GetSuggestion(name string, namespace ...string) ( - *suggestionsv1alpha3.Suggestion, error) { - ns := getNamespace(namespace...) - suggestion := &suggestionsv1alpha3.Suggestion{} - - if err := k.client.Get(context.TODO(), types.NamespacedName{Name: name, Namespace: ns}, suggestion); err != nil { - return nil, err - } - return suggestion, nil - -} - -// GetTrial returns the Trial for the given name and namespace -func (k *KatibClient) GetTrial(name string, namespace ...string) (*trialsv1alpha3.Trial, error) { - ns := getNamespace(namespace...) - trial := &trialsv1alpha3.Trial{} - - if err := k.client.Get(context.TODO(), types.NamespacedName{Name: name, Namespace: ns}, trial); err != nil { - return nil, err - } - return trial, nil - -} - -func (k *KatibClient) GetTrialList(name string, namespace ...string) (*trialsv1alpha3.TrialList, error) { - ns := getNamespace(namespace...) - trialList := &trialsv1alpha3.TrialList{} - labels := map[string]string{consts.LabelExperimentName: name} - listOpt := &client.ListOptions{} - listOpt.MatchingLabels(labels).InNamespace(ns) - - if err := k.client.List(context.Background(), listOpt, trialList); err != nil { - return trialList, err - } - return trialList, nil - -} - -func (k *KatibClient) CreateExperiment(experiment *experimentsv1alpha3.Experiment, namespace ...string) error { - - if err := k.client.Create(context.Background(), experiment); err != nil { - return err - } - return nil -} - -func (k *KatibClient) UpdateExperiment(experiment *experimentsv1alpha3.Experiment, namespace ...string) error { - - if err := k.client.Update(context.Background(), experiment); err != nil { - return err - } - return nil -} - -func (k *KatibClient) DeleteExperiment(experiment *experimentsv1alpha3.Experiment, namespace ...string) error { - - if err := k.client.Delete(context.Background(), experiment); err != nil { - return err - } - return nil -} - -func (k *KatibClient) GetExperiment(name string, namespace ...string) (*experimentsv1alpha3.Experiment, error) { - ns := getNamespace(namespace...) - exp := &experimentsv1alpha3.Experiment{} - if err := k.client.Get(context.TODO(), types.NamespacedName{Name: name, Namespace: ns}, exp); err != nil { - return nil, err - } - return exp, nil -} - -// GetConfigMap returns the configmap for the given name and namespace. -func (k *KatibClient) GetConfigMap(name string, namespace ...string) (map[string]string, error) { - ns := getNamespace(namespace...) - configMap := &apiv1.ConfigMap{} - if err := k.client.Get(context.TODO(), types.NamespacedName{Name: name, Namespace: ns}, configMap); err != nil { - return map[string]string{}, err - } - return configMap.Data, nil -} - -// GetTrialTemplates returns all trial templates from the given namespace -func (k *KatibClient) GetTrialTemplates(namespace ...string) (*apiv1.ConfigMapList, error) { - ns := getNamespace(namespace...) - - templatesConfigMapList := &apiv1.ConfigMapList{} - - templateLabel := map[string]string{consts.LabelTrialTemplateConfigMapName: consts.LabelTrialTemplateConfigMapValue} - listOpt := &client.ListOptions{} - listOpt.MatchingLabels(templateLabel).InNamespace(ns) - - err := k.client.List(context.TODO(), listOpt, templatesConfigMapList) - - if err != nil { - return nil, err - } - - return templatesConfigMapList, nil - -} - -func (k *KatibClient) UpdateConfigMap(newConfigMap *apiv1.ConfigMap) error { - - if err := k.client.Update(context.Background(), newConfigMap); err != nil { - return err - } - return nil -} - -func getNamespace(namespace ...string) string { - if len(namespace) == 0 { - return consts.DefaultKatibNamespace - } - return namespace[0] -} - -func (k *KatibClient) GetNamespaceList() (*apiv1.NamespaceList, error) { - - namespaceList := &apiv1.NamespaceList{} - listOpt := &client.ListOptions{} - - if err := k.client.List(context.TODO(), listOpt, namespaceList); err != nil { - return namespaceList, err - } - return namespaceList, nil -} diff --git a/pkg/util/v1alpha3/katibconfig/config.go b/pkg/util/v1alpha3/katibconfig/config.go deleted file mode 100644 index 63a9f36c507..00000000000 --- a/pkg/util/v1alpha3/katibconfig/config.go +++ /dev/null @@ -1,194 +0,0 @@ -package katibconfig - -import ( - "context" - "encoding/json" - "errors" - "strings" - - corev1 "k8s.io/api/core/v1" - apitypes "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" - - common "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" -) - -type suggestionConfigJSON struct { - Image string `json:"image"` - ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy"` - Resource corev1.ResourceRequirements `json:"resources"` - ServiceAccountName string `json:"serviceAccountName"` -} - -type metricsCollectorConfigJSON struct { - Image string `json:"image"` - ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy"` - Resource corev1.ResourceRequirements `json:"resources"` -} - -// GetSuggestionConfigData gets the config data for the given algorithm name. -func GetSuggestionConfigData(algorithmName string, client client.Client) (map[string]string, error) { - configMap := &corev1.ConfigMap{} - suggestionConfigData := map[string]string{} - err := client.Get( - context.TODO(), - apitypes.NamespacedName{Name: consts.KatibConfigMapName, Namespace: consts.DefaultKatibNamespace}, - configMap) - if err != nil { - return map[string]string{}, err - } - - if config, ok := configMap.Data[consts.LabelSuggestionTag]; ok { - suggestionsConfig := map[string]suggestionConfigJSON{} - if err := json.Unmarshal([]byte(config), &suggestionsConfig); err != nil { - return map[string]string{}, err - } - if suggestionConfig, ok := suggestionsConfig[algorithmName]; ok { - // Get image from config - image := suggestionConfig.Image - if strings.TrimSpace(image) != "" { - suggestionConfigData[consts.LabelSuggestionImageTag] = image - } else { - return map[string]string{}, errors.New("Required value for " + consts.LabelSuggestionImageTag + " configuration of algorithm name " + algorithmName) - } - - // Get Image Pull Policy - imagePullPolicy := suggestionConfig.ImagePullPolicy - if imagePullPolicy == corev1.PullAlways || imagePullPolicy == corev1.PullIfNotPresent || imagePullPolicy == corev1.PullNever { - suggestionConfigData[consts.LabelSuggestionImagePullPolicy] = string(imagePullPolicy) - } else { - suggestionConfigData[consts.LabelSuggestionImagePullPolicy] = consts.DefaultImagePullPolicy - } - - // Get Service Account Name - serviceAccountName := suggestionConfig.ServiceAccountName - if strings.TrimSpace(serviceAccountName) != "" { - suggestionConfigData[consts.LabelSuggestionServiceAccountName] = serviceAccountName - } - - // Set default values for CPU, Memory and Disk - suggestionConfigData[consts.LabelSuggestionCPURequestTag] = consts.DefaultCPURequest - suggestionConfigData[consts.LabelSuggestionMemRequestTag] = consts.DefaultMemRequest - suggestionConfigData[consts.LabelSuggestionDiskRequestTag] = consts.DefaultDiskRequest - suggestionConfigData[consts.LabelSuggestionCPULimitTag] = consts.DefaultCPULimit - suggestionConfigData[consts.LabelSuggestionMemLimitTag] = consts.DefaultMemLimit - suggestionConfigData[consts.LabelSuggestionDiskLimitTag] = consts.DefaultDiskLimit - - // Get CPU, Memory and Disk Requests from config - cpuRequest := suggestionConfig.Resource.Requests[corev1.ResourceCPU] - memRequest := suggestionConfig.Resource.Requests[corev1.ResourceMemory] - diskRequest := suggestionConfig.Resource.Requests[corev1.ResourceEphemeralStorage] - if !cpuRequest.IsZero() { - suggestionConfigData[consts.LabelSuggestionCPURequestTag] = cpuRequest.String() - } - if !memRequest.IsZero() { - suggestionConfigData[consts.LabelSuggestionMemRequestTag] = memRequest.String() - } - if !diskRequest.IsZero() { - suggestionConfigData[consts.LabelSuggestionDiskRequestTag] = diskRequest.String() - } - - // Get CPU, Memory and Disk Limits from config - cpuLimit := suggestionConfig.Resource.Limits[corev1.ResourceCPU] - memLimit := suggestionConfig.Resource.Limits[corev1.ResourceMemory] - diskLimit := suggestionConfig.Resource.Limits[corev1.ResourceEphemeralStorage] - if !cpuLimit.IsZero() { - suggestionConfigData[consts.LabelSuggestionCPULimitTag] = cpuLimit.String() - } - if !memLimit.IsZero() { - suggestionConfigData[consts.LabelSuggestionMemLimitTag] = memLimit.String() - } - if !diskLimit.IsZero() { - suggestionConfigData[consts.LabelSuggestionDiskLimitTag] = diskLimit.String() - } - - } else { - return map[string]string{}, errors.New("Failed to find algorithm " + algorithmName + " config in configmap " + consts.KatibConfigMapName) - } - } else { - return map[string]string{}, errors.New("Failed to find suggestions config in configmap " + consts.KatibConfigMapName) - } - return suggestionConfigData, nil -} - -// GetMetricsCollectorConfigData gets the config data for the given kind. -func GetMetricsCollectorConfigData(cKind common.CollectorKind, client client.Client) (map[string]string, error) { - configMap := &corev1.ConfigMap{} - metricsCollectorConfigData := map[string]string{} - err := client.Get( - context.TODO(), - apitypes.NamespacedName{Name: consts.KatibConfigMapName, Namespace: consts.DefaultKatibNamespace}, - configMap) - if err != nil { - return metricsCollectorConfigData, err - } - // Get the config with name metrics-collector-sidecar. - if config, ok := configMap.Data[consts.LabelMetricsCollectorSidecar]; ok { - kind := string(cKind) - mcsConfig := map[string]metricsCollectorConfigJSON{} - if err := json.Unmarshal([]byte(config), &mcsConfig); err != nil { - return metricsCollectorConfigData, err - } - // Get the config for the given cKind. - if metricsCollectorConfig, ok := mcsConfig[kind]; ok { - image := metricsCollectorConfig.Image - // If the image is not empty, we set it into result. - if strings.TrimSpace(image) != "" { - metricsCollectorConfigData[consts.LabelMetricsCollectorSidecarImage] = image - } else { - return metricsCollectorConfigData, errors.New("Required value for " + consts.LabelMetricsCollectorSidecarImage + "configuration of metricsCollector kind " + kind) - } - - // Get Image Pull Policy - imagePullPolicy := metricsCollectorConfig.ImagePullPolicy - if imagePullPolicy == corev1.PullAlways || imagePullPolicy == corev1.PullIfNotPresent || imagePullPolicy == corev1.PullNever { - metricsCollectorConfigData[consts.LabelMetricsCollectorImagePullPolicy] = string(imagePullPolicy) - } else { - metricsCollectorConfigData[consts.LabelMetricsCollectorImagePullPolicy] = consts.DefaultImagePullPolicy - } - - // Set default values for CPU, Memory and Disk - metricsCollectorConfigData[consts.LabelMetricsCollectorCPURequestTag] = consts.DefaultCPURequest - metricsCollectorConfigData[consts.LabelMetricsCollectorMemRequestTag] = consts.DefaultMemRequest - metricsCollectorConfigData[consts.LabelMetricsCollectorDiskRequestTag] = consts.DefaultDiskRequest - metricsCollectorConfigData[consts.LabelMetricsCollectorCPULimitTag] = consts.DefaultCPULimit - metricsCollectorConfigData[consts.LabelMetricsCollectorMemLimitTag] = consts.DefaultMemLimit - metricsCollectorConfigData[consts.LabelMetricsCollectorDiskLimitTag] = consts.DefaultDiskLimit - - // Get CPU, Memory and Disk Requests from config - cpuRequest := metricsCollectorConfig.Resource.Requests[corev1.ResourceCPU] - memRequest := metricsCollectorConfig.Resource.Requests[corev1.ResourceMemory] - diskRequest := metricsCollectorConfig.Resource.Requests[corev1.ResourceEphemeralStorage] - if !cpuRequest.IsZero() { - metricsCollectorConfigData[consts.LabelSuggestionCPURequestTag] = cpuRequest.String() - } - if !memRequest.IsZero() { - metricsCollectorConfigData[consts.LabelSuggestionMemRequestTag] = memRequest.String() - } - if !diskRequest.IsZero() { - metricsCollectorConfigData[consts.LabelSuggestionDiskRequestTag] = diskRequest.String() - } - - // Get CPU, Memory and Disk Limits from config - cpuLimit := metricsCollectorConfig.Resource.Limits[corev1.ResourceCPU] - memLimit := metricsCollectorConfig.Resource.Limits[corev1.ResourceMemory] - diskLimit := metricsCollectorConfig.Resource.Limits[corev1.ResourceEphemeralStorage] - if !cpuLimit.IsZero() { - metricsCollectorConfigData[consts.LabelSuggestionCPULimitTag] = cpuLimit.String() - } - if !memLimit.IsZero() { - metricsCollectorConfigData[consts.LabelSuggestionMemLimitTag] = memLimit.String() - } - if !diskLimit.IsZero() { - metricsCollectorConfigData[consts.LabelSuggestionDiskLimitTag] = diskLimit.String() - } - - } else { - return metricsCollectorConfigData, errors.New("Cannot support metricsCollector injection for kind " + kind) - } - } else { - return metricsCollectorConfigData, errors.New("Failed to find metrics collector configuration in configmap " + consts.KatibConfigMapName) - } - return metricsCollectorConfigData, nil -} diff --git a/pkg/webhook/v1alpha3/common/const.go b/pkg/webhook/v1alpha3/common/const.go deleted file mode 100644 index 2ec4b28efaa..00000000000 --- a/pkg/webhook/v1alpha3/common/const.go +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package common - -const ( - KatibMetricsCollectorInjection = "katib-metricscollector-injection" - KatibMetricsCollectorInjectionEnabled = "enabled" -) diff --git a/pkg/webhook/v1alpha3/experiment/mutate_webhook.go b/pkg/webhook/v1alpha3/experiment/mutate_webhook.go deleted file mode 100644 index 45368d18b26..00000000000 --- a/pkg/webhook/v1alpha3/experiment/mutate_webhook.go +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package experiment - -import ( - "context" - "net/http" - - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/runtime/inject" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission/types" - - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" -) - -// experimentDefaulter that sets default fields in experiment -type experimentDefaulter struct { - client client.Client - decoder types.Decoder -} - -var _ admission.Handler = &experimentDefaulter{} - -func (e *experimentDefaulter) Handle(ctx context.Context, req types.Request) types.Response { - inst := &experimentsv1alpha3.Experiment{} - err := e.decoder.Decode(req, inst) - if err != nil { - return admission.ErrorResponse(http.StatusBadRequest, err) - } - - copy := inst.DeepCopy() - copy.SetDefault() - - return admission.PatchResponse(inst, copy) -} - -var _ inject.Client = &experimentDefaulter{} - -func (e *experimentDefaulter) InjectClient(c client.Client) error { - e.client = c - return nil -} - -var _ inject.Decoder = &experimentDefaulter{} - -func (e *experimentDefaulter) InjectDecoder(d types.Decoder) error { - e.decoder = d - return nil -} - -func NewExperimentDefaulter(c client.Client) *experimentDefaulter { - return &experimentDefaulter{ - client: c, - } -} diff --git a/pkg/webhook/v1alpha3/experiment/validation_webhook.go b/pkg/webhook/v1alpha3/experiment/validation_webhook.go deleted file mode 100644 index 57f2db082eb..00000000000 --- a/pkg/webhook/v1alpha3/experiment/validation_webhook.go +++ /dev/null @@ -1,114 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package experiment - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "net/http" - - v1 "k8s.io/api/core/v1" - ktypes "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/runtime/inject" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission/types" - - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/manifest" - "github.com/kubeflow/katib/pkg/webhook/v1alpha3/common" - "github.com/kubeflow/katib/pkg/webhook/v1alpha3/experiment/validator" -) - -// experimentValidator validates Pods -type experimentValidator struct { - admission.Handler - client client.Client - decoder types.Decoder - validator.Validator -} - -func NewExperimentValidator(c client.Client) *experimentValidator { - p := manifest.New(c) - return &experimentValidator{ - Validator: validator.New(p), - } -} - -func (v *experimentValidator) Handle(ctx context.Context, req types.Request) types.Response { - inst := &experimentsv1alpha3.Experiment{} - var oldInst *experimentsv1alpha3.Experiment - err := v.decoder.Decode(req, inst) - if err != nil { - return admission.ErrorResponse(http.StatusBadRequest, err) - } - if len(req.AdmissionRequest.OldObject.Raw) > 0 { - oldDecoder := json.NewDecoder(bytes.NewBuffer(req.AdmissionRequest.OldObject.Raw)) - oldInst = &experimentsv1alpha3.Experiment{} - if err := oldDecoder.Decode(&oldInst); err != nil { - return admission.ErrorResponse(http.StatusBadRequest, fmt.Errorf("cannot decode incoming old object: %v", err)) - } - } - - // After metrics collector sidecar injection in Job level done, delete validation for namespace labels - ns := &v1.Namespace{} - if err := v.client.Get(context.TODO(), ktypes.NamespacedName{Name: req.AdmissionRequest.Namespace}, ns); err != nil { - return admission.ErrorResponse(http.StatusInternalServerError, err) - } - validNS := true - if ns.Labels == nil { - validNS = false - } else { - if v, ok := ns.Labels[common.KatibMetricsCollectorInjection]; !ok || v != common.KatibMetricsCollectorInjectionEnabled { - validNS = false - } - } - if !validNS { - err = fmt.Errorf("Cannot create the Experiment %q in namespace %q: the namespace lacks label \"%s: %s\"", - inst.Name, req.AdmissionRequest.Namespace, common.KatibMetricsCollectorInjection, common.KatibMetricsCollectorInjectionEnabled) - return admission.ErrorResponse(http.StatusBadRequest, err) - } - - err = v.ValidateExperiment(inst, oldInst) - if err != nil { - return admission.ErrorResponse(http.StatusBadRequest, err) - } - return admission.ValidationResponse(true, "") -} - -// experimentValidator implements inject.Client. -// A client will be automatically injected. -var _ inject.Client = &experimentValidator{} - -// InjectClient injects the client. -func (v *experimentValidator) InjectClient(c client.Client) error { - v.client = c - v.Validator.InjectClient(c) - return nil -} - -// experimentValidator implements inject.Decoder. -// A decoder will be automatically injected. -var _ inject.Decoder = &experimentValidator{} - -// InjectDecoder injects the decoder. -func (v *experimentValidator) InjectDecoder(d types.Decoder) error { - v.decoder = d - return nil -} diff --git a/pkg/webhook/v1alpha3/experiment/validator/validator.go b/pkg/webhook/v1alpha3/experiment/validator/validator.go deleted file mode 100644 index 6c50075be5b..00000000000 --- a/pkg/webhook/v1alpha3/experiment/validator/validator.go +++ /dev/null @@ -1,234 +0,0 @@ -package validator - -import ( - "bytes" - "fmt" - "path/filepath" - "regexp" - "strconv" - "strings" - - "k8s.io/apimachinery/pkg/api/equality" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - k8syaml "k8s.io/apimachinery/pkg/util/yaml" - "sigs.k8s.io/controller-runtime/pkg/client" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - - commonapiv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/manifest" - jobv1alpha3 "github.com/kubeflow/katib/pkg/job/v1alpha3" - mccommon "github.com/kubeflow/katib/pkg/metricscollector/v1alpha3/common" -) - -var log = logf.Log.WithName("experiment-validating-webhook") - -type Validator interface { - ValidateExperiment(instance, oldInst *experimentsv1alpha3.Experiment) error - InjectClient(c client.Client) -} - -type DefaultValidator struct { - manifest.Generator -} - -func New(generator manifest.Generator) Validator { - return &DefaultValidator{ - Generator: generator, - } -} - -func (g *DefaultValidator) InjectClient(c client.Client) { - g.Generator.InjectClient(c) -} - -func (g *DefaultValidator) ValidateExperiment(instance, oldInst *experimentsv1alpha3.Experiment) error { - if instance.Spec.MaxFailedTrialCount != nil && *instance.Spec.MaxFailedTrialCount < 0 { - return fmt.Errorf("spec.maxFailedTrialCount should not be less than 0") - } - if instance.Spec.MaxTrialCount != nil && *instance.Spec.MaxTrialCount <= 0 { - return fmt.Errorf("spec.maxTrialCount must be greater than 0") - } - if instance.Spec.ParallelTrialCount != nil && *instance.Spec.ParallelTrialCount <= 0 { - return fmt.Errorf("spec.parallelTrialCount must be greater than 0") - } - if oldInst != nil { - oldInst.Spec.MaxFailedTrialCount = instance.Spec.MaxFailedTrialCount - oldInst.Spec.MaxTrialCount = instance.Spec.MaxTrialCount - oldInst.Spec.ParallelTrialCount = instance.Spec.ParallelTrialCount - if equality.Semantic.DeepEqual(instance.Spec, oldInst.Spec) { - return nil - } else { - return fmt.Errorf("Only spec.parallelTrialCount, spec.maxTrialCount and spec.maxFailedTrialCount are editable.") - } - } - if err := g.validateObjective(instance.Spec.Objective); err != nil { - return err - } - if err := g.validateAlgorithm(instance.Spec.Algorithm); err != nil { - return err - } - if err := g.validateResumePolicy(instance.Spec.ResumePolicy); err != nil { - return err - } - - if err := g.validateTrialTemplate(instance); err != nil { - return err - } - - if len(instance.Spec.Parameters) == 0 && instance.Spec.NasConfig == nil { - return fmt.Errorf("spec.parameters or spec.nasConfig must be specified.") - } - - if len(instance.Spec.Parameters) > 0 && instance.Spec.NasConfig != nil { - return fmt.Errorf("Only one of spec.parameters and spec.nasConfig can be specified.") - } - - if err := g.validateMetricsCollector(instance); err != nil { - return err - } - return nil -} - -func (g *DefaultValidator) validateObjective(obj *commonapiv1alpha3.ObjectiveSpec) error { - if obj == nil { - return fmt.Errorf("No spec.objective specified.") - } - if obj.Type != commonapiv1alpha3.ObjectiveTypeMinimize && obj.Type != commonapiv1alpha3.ObjectiveTypeMaximize { - return fmt.Errorf("spec.objective.type must be %s or %s.", commonapiv1alpha3.ObjectiveTypeMinimize, commonapiv1alpha3.ObjectiveTypeMaximize) - } - if obj.ObjectiveMetricName == "" { - return fmt.Errorf("No spec.objective.objectiveMetricName specified.") - } - return nil -} - -func (g *DefaultValidator) validateAlgorithm(ag *commonapiv1alpha3.AlgorithmSpec) error { - if ag == nil { - return fmt.Errorf("No spec.algorithm specified.") - } - if ag.AlgorithmName == "" { - return fmt.Errorf("No spec.algorithm.name specified.") - } - - if _, err := g.GetSuggestionConfigData(ag.AlgorithmName); err != nil { - return fmt.Errorf("Don't support algorithm %s: %v.", ag.AlgorithmName, err) - } - - return nil -} - -func (g *DefaultValidator) validateResumePolicy(resume experimentsv1alpha3.ResumePolicyType) error { - validTypes := map[experimentsv1alpha3.ResumePolicyType]string{ - "": "", - experimentsv1alpha3.NeverResume: "", - experimentsv1alpha3.LongRunning: "", - } - if _, ok := validTypes[resume]; !ok { - return fmt.Errorf("invalid ResumePolicyType %s", resume) - } - return nil -} - -func (g *DefaultValidator) validateTrialTemplate(instance *experimentsv1alpha3.Experiment) error { - trialName := fmt.Sprintf("%s-trial", instance.GetName()) - runSpec, err := g.GetRunSpec(instance, instance.GetName(), trialName, instance.GetNamespace()) - if err != nil { - return fmt.Errorf("Invalid spec.trialTemplate: %v.", err) - } - - bufSize := 1024 - buf := bytes.NewBufferString(runSpec) - - job := &unstructured.Unstructured{} - if err := k8syaml.NewYAMLOrJSONDecoder(buf, bufSize).Decode(job); err != nil { - return fmt.Errorf("Invalid spec.trialTemplate: %v.", err) - } - - if err := g.validateSupportedJob(job); err != nil { - return fmt.Errorf("Invalid spec.trialTemplate: %v.", err) - } - - if job.GetNamespace() != instance.GetNamespace() { - return fmt.Errorf("Invalid spec.trialTemplate: metadata.namespace should be %s or {{.NameSpace}}", instance.GetNamespace()) - } - if job.GetName() != trialName { - return fmt.Errorf("Invalid spec.trialTemplate: metadata.name should be {{.Trial}}") - } - return nil -} - -func (g *DefaultValidator) validateSupportedJob(job *unstructured.Unstructured) error { - gvk := job.GroupVersionKind() - supportedJobs := jobv1alpha3.SupportedJobList - for _, sJob := range supportedJobs { - if gvk == sJob { - return nil - } - } - return fmt.Errorf("Job type %v not supported", gvk) -} - -func (g *DefaultValidator) validateMetricsCollector(inst *experimentsv1alpha3.Experiment) error { - mcSpec := inst.Spec.MetricsCollectorSpec - mcKind := mcSpec.Collector.Kind - for _, mc := range mccommon.AutoInjectMetricsCollecterList { - if mcKind != mc { - continue - } - if _, err := g.GetMetricsCollectorImage(mcKind); err != nil { - return fmt.Errorf("GetMetricsCollectorImage failed: %v.", err) - } - break - } - // TODO(hougangliu): log warning message if some field will not be used for the metricsCollector kind - switch mcKind { - case commonapiv1alpha3.NoneCollector, commonapiv1alpha3.StdOutCollector: - return nil - case commonapiv1alpha3.FileCollector: - if mcSpec.Source == nil || mcSpec.Source.FileSystemPath == nil || - mcSpec.Source.FileSystemPath.Kind != commonapiv1alpha3.FileKind || !filepath.IsAbs(mcSpec.Source.FileSystemPath.Path) { - return fmt.Errorf("File path where metrics file exists is required by .spec.metricsCollectorSpec.source.fileSystemPath.path") - } - case commonapiv1alpha3.TfEventCollector: - if mcSpec.Source == nil || mcSpec.Source.FileSystemPath == nil || - mcSpec.Source.FileSystemPath.Kind != commonapiv1alpha3.DirectoryKind || !filepath.IsAbs(mcSpec.Source.FileSystemPath.Path) { - return fmt.Errorf("Directory path where tensorflow event files exist is required by .spec.metricsCollectorSpec.source.fileSystemPath.path") - } - case commonapiv1alpha3.PrometheusMetricCollector: - i, err := strconv.Atoi(mcSpec.Source.HttpGet.Port.String()) - if err != nil || i <= 0 { - return fmt.Errorf(".spec.metricsCollectorSpec.source.httpGet.port must be a positive integer value for metrics collector kind: %v.", mcKind) - } - if !strings.HasPrefix(mcSpec.Source.HttpGet.Path, "/") { - return fmt.Errorf(".spec.metricsCollectorSpec.source.httpGet.path is invalid for metrics collector kind: %v.", mcKind) - } - case commonapiv1alpha3.CustomCollector: - if mcSpec.Collector.CustomCollector == nil { - return fmt.Errorf(".spec.metricsCollectorSpec.collector.customCollector is required for metrics collector kind: %v.", mcKind) - } - if mcSpec.Source.FileSystemPath != nil { - if !filepath.IsAbs(mcSpec.Source.FileSystemPath.Path) || (mcSpec.Source.FileSystemPath.Kind != commonapiv1alpha3.DirectoryKind && - mcSpec.Source.FileSystemPath.Kind != commonapiv1alpha3.FileKind) { - return fmt.Errorf(".spec.metricsCollectorSpec.source is invalid") - } - } - default: - return fmt.Errorf("Invalid metrics collector kind: %v.", mcKind) - } - if mcSpec.Source != nil && mcSpec.Source.Filter != nil && len(mcSpec.Source.Filter.MetricsFormat) > 0 { - // the filter regular expression must have two top subexpressions, the first matched one will be taken as metric name, the second one as metric value - mustTwoBracket, _ := regexp.Compile(`.*\(.*\).*\(.*\).*`) - for _, mFormat := range mcSpec.Source.Filter.MetricsFormat { - if _, err := regexp.Compile(mFormat); err != nil { - return fmt.Errorf("Invalid %q in .spec.metricsCollectorSpec.source.filter: %v.", mFormat, err) - } else { - if !mustTwoBracket.MatchString(mFormat) { - return fmt.Errorf("Invalid %q in .spec.metricsCollectorSpec.source.filter: two top subexpressions are required", mFormat) - } - } - } - } - - return nil -} diff --git a/pkg/webhook/v1alpha3/experiment/validator/validator_test.go b/pkg/webhook/v1alpha3/experiment/validator/validator_test.go deleted file mode 100644 index 82774135f0a..00000000000 --- a/pkg/webhook/v1alpha3/experiment/validator/validator_test.go +++ /dev/null @@ -1,563 +0,0 @@ -package validator - -import ( - "strings" - "testing" - - "github.com/golang/mock/gomock" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/intstr" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - - commonv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - manifestmock "github.com/kubeflow/katib/pkg/mock/v1alpha3/experiment/manifest" - v1 "k8s.io/api/core/v1" -) - -func init() { - logf.SetLogger(logf.ZapLogger(false)) -} - -func TestValidateTFJobTrialTemplate(t *testing.T) { - trialTFJobTemplate := `apiVersion: "kubeflow.org/v1" -kind: "TFJob" -metadata: - name: "dist-mnist-for-e2e-test" -spec: - tfReplicaSpecs: - Worker: - template: - spec: - containers: - - name: tensorflow - image: gaocegege/mnist:1` - - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - p := manifestmock.NewMockGenerator(mockCtrl) - g := New(p) - - p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(trialTFJobTemplate, nil) - - instance := newFakeInstance() - if err := g.(*DefaultValidator).validateTrialTemplate(instance); err == nil { - t.Errorf("Expected error, got nil") - } -} - -func TestValidateJobTrialTemplate(t *testing.T) { - trialJobTemplate := `apiVersion: batch/v1 -kind: Job -metadata: - name: fake-trial - namespace: fakens -spec: - template: - spec: - containers: - - name: fake-trial - image: test-image` - - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - p := manifestmock.NewMockGenerator(mockCtrl) - g := New(p) - - invalidYaml := strings.Replace(trialJobTemplate, "- name", "- * -", -1) - invalidJobType := strings.Replace(trialJobTemplate, "Job", "NewJobType", -1) - invalidNamespace := strings.Replace(trialJobTemplate, "fakens", "not-fakens", -1) - invalidJobName := strings.Replace(trialJobTemplate, "fake-trial", "new-name", -1) - - validRun := p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(trialJobTemplate, nil) - invalidYamlRun := p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(invalidYaml, nil) - invalidJobTypeRun := p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(invalidJobType, nil) - invalidNamespaceRun := p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(invalidNamespace, nil) - invalidJobNameRun := p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(invalidJobName, nil) - - gomock.InOrder( - validRun, - invalidYamlRun, - invalidJobTypeRun, - invalidNamespaceRun, - invalidJobNameRun, - ) - - tcs := []struct { - Instance *experimentsv1alpha3.Experiment - Err bool - }{ - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.TrialTemplate = newFakeTrialTemplate(trialJobTemplate) - return i - }(), - Err: false, - }, - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.TrialTemplate = newFakeTrialTemplate(invalidYaml) - return i - }(), - Err: true, - }, - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.TrialTemplate = newFakeTrialTemplate(invalidJobType) - return i - }(), - Err: true, - }, - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.TrialTemplate = newFakeTrialTemplate(invalidNamespace) - return i - }(), - Err: true, - }, - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.TrialTemplate = newFakeTrialTemplate(invalidJobName) - return i - }(), - Err: true, - }, - } - for _, tc := range tcs { - err := g.(*DefaultValidator).validateTrialTemplate(tc.Instance) - if !tc.Err && err != nil { - t.Errorf("Expected nil, got %v", err) - } else if tc.Err && err == nil { - t.Errorf("Expected err, got nil") - } - } -} - -func TestValidateExperiment(t *testing.T) { - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - p := manifestmock.NewMockGenerator(mockCtrl) - g := New(p) - - trialJobTemplate := `apiVersion: "batch/v1" -kind: "Job" -metadata: - name: "fake-trial" - namespace: fakens` - - suggestionConfigData := map[string]string{} - suggestionConfigData[consts.LabelSuggestionImageTag] = "algorithmImage" - fakeNegativeInt := int32(-1) - - p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(trialJobTemplate, nil).AnyTimes() - p.EXPECT().GetSuggestionConfigData(gomock.Any()).Return(suggestionConfigData, nil).AnyTimes() - p.EXPECT().GetMetricsCollectorImage(gomock.Any()).Return("metricsCollectorImage", nil).AnyTimes() - - tcs := []struct { - Instance *experimentsv1alpha3.Experiment - Err bool - oldInstance *experimentsv1alpha3.Experiment - }{ - //Objective - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.Objective = nil - return i - }(), - Err: true, - }, - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.Objective.Type = commonv1alpha3.ObjectiveTypeUnknown - return i - }(), - Err: true, - }, - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.Objective.ObjectiveMetricName = "" - return i - }(), - Err: true, - }, - //Algorithm - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.Algorithm = nil - return i - }(), - Err: true, - }, - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.Algorithm.AlgorithmName = "" - return i - }(), - Err: true, - }, - { - Instance: newFakeInstance(), - Err: false, - }, - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.MaxFailedTrialCount = &fakeNegativeInt - return i - }(), - Err: true, - }, - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.MaxTrialCount = &fakeNegativeInt - return i - }(), - Err: true, - }, - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.ParallelTrialCount = &fakeNegativeInt - return i - }(), - Err: true, - }, - { - Instance: newFakeInstance(), - Err: false, - oldInstance: newFakeInstance(), - }, - { - Instance: newFakeInstance(), - Err: true, - oldInstance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.Algorithm.AlgorithmName = "not-test" - return i - }(), - }, - { - Instance: newFakeInstance(), - Err: true, - oldInstance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.ResumePolicy = "invalid-policy" - return i - }(), - }, - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.Parameters = []experimentsv1alpha3.ParameterSpec{} - i.Spec.NasConfig = nil - return i - }(), - Err: true, - }, - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.NasConfig = &experimentsv1alpha3.NasConfig{ - Operations: []experimentsv1alpha3.Operation{ - { - OperationType: "op1", - }, - }, - } - return i - }(), - Err: true, - }, - } - - for _, tc := range tcs { - err := g.ValidateExperiment(tc.Instance, tc.oldInstance) - if !tc.Err && err != nil { - t.Errorf("Expected nil, got %v", err) - } else if tc.Err && err == nil { - t.Errorf("Expected err, got nil") - } - } -} - -func TestValidateMetricsCollector(t *testing.T) { - - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - p := manifestmock.NewMockGenerator(mockCtrl) - g := New(p) - - p.EXPECT().GetMetricsCollectorImage(gomock.Any()).Return("metricsCollectorImage", nil).AnyTimes() - - tcs := []struct { - Instance *experimentsv1alpha3.Experiment - Err bool - }{ - // Invalid Metrics Collector Kind - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.MetricsCollectorSpec = &commonv1alpha3.MetricsCollectorSpec{ - Collector: &commonv1alpha3.CollectorSpec{ - Kind: commonv1alpha3.CollectorKind("invalid-kind"), - }, - } - return i - }(), - Err: true, - }, - // FileCollector invalid Path - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.MetricsCollectorSpec = &commonv1alpha3.MetricsCollectorSpec{ - Collector: &commonv1alpha3.CollectorSpec{ - Kind: commonv1alpha3.FileCollector, - }, - Source: &commonv1alpha3.SourceSpec{ - FileSystemPath: &commonv1alpha3.FileSystemPath{ - Path: "not/absolute/path", - }, - }, - } - return i - }(), - Err: true, - }, - // TfEventCollector invalid Path - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.MetricsCollectorSpec = &commonv1alpha3.MetricsCollectorSpec{ - Collector: &commonv1alpha3.CollectorSpec{ - Kind: commonv1alpha3.TfEventCollector, - }, - Source: &commonv1alpha3.SourceSpec{ - FileSystemPath: &commonv1alpha3.FileSystemPath{ - Path: "not/absolute/path", - }, - }, - } - return i - }(), - Err: true, - }, - // PrometheusMetricCollector invalid Port - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.MetricsCollectorSpec = &commonv1alpha3.MetricsCollectorSpec{ - Collector: &commonv1alpha3.CollectorSpec{ - Kind: commonv1alpha3.PrometheusMetricCollector, - }, - Source: &commonv1alpha3.SourceSpec{ - HttpGet: &v1.HTTPGetAction{ - Port: intstr.IntOrString{ - StrVal: "Port", - }, - }, - }, - } - return i - }(), - Err: true, - }, - // PrometheusMetricCollector invalid Path - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.MetricsCollectorSpec = &commonv1alpha3.MetricsCollectorSpec{ - Collector: &commonv1alpha3.CollectorSpec{ - Kind: commonv1alpha3.PrometheusMetricCollector, - }, - Source: &commonv1alpha3.SourceSpec{ - HttpGet: &v1.HTTPGetAction{ - Port: intstr.IntOrString{ - IntVal: 8888, - }, - Path: "not/valid/path", - }, - }, - } - return i - }(), - Err: true, - }, - // CustomCollector empty CustomCollector - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.MetricsCollectorSpec = &commonv1alpha3.MetricsCollectorSpec{ - Collector: &commonv1alpha3.CollectorSpec{ - Kind: commonv1alpha3.CustomCollector, - }, - } - return i - }(), - Err: true, - }, - // CustomCollector invalid Path - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.MetricsCollectorSpec = &commonv1alpha3.MetricsCollectorSpec{ - Collector: &commonv1alpha3.CollectorSpec{ - Kind: commonv1alpha3.CustomCollector, - CustomCollector: &v1.Container{ - Name: "my-collector", - }, - }, - Source: &commonv1alpha3.SourceSpec{ - FileSystemPath: &commonv1alpha3.FileSystemPath{ - Path: "not/absolute/path", - }, - }, - } - return i - }(), - Err: true, - }, - // FileMetricCollector invalid regexp in metrics format - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.MetricsCollectorSpec = &commonv1alpha3.MetricsCollectorSpec{ - Collector: &commonv1alpha3.CollectorSpec{ - Kind: commonv1alpha3.FileCollector, - }, - Source: &commonv1alpha3.SourceSpec{ - Filter: &commonv1alpha3.FilterSpec{ - MetricsFormat: []string{ - "[", - }, - }, - FileSystemPath: &commonv1alpha3.FileSystemPath{ - Path: "/absolute/path", - Kind: commonv1alpha3.FileKind, - }, - }, - } - return i - }(), - Err: true, - }, - // FileMetricCollector one subexpression in metrics format - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.MetricsCollectorSpec = &commonv1alpha3.MetricsCollectorSpec{ - Collector: &commonv1alpha3.CollectorSpec{ - Kind: commonv1alpha3.FileCollector, - }, - Source: &commonv1alpha3.SourceSpec{ - Filter: &commonv1alpha3.FilterSpec{ - MetricsFormat: []string{ - "{metricName: ([\\w|-]+)}", - }, - }, - FileSystemPath: &commonv1alpha3.FileSystemPath{ - Path: "/absolute/path", - Kind: commonv1alpha3.FileKind, - }, - }, - } - return i - }(), - Err: true, - }, - // Valid FileMetricCollector - { - Instance: func() *experimentsv1alpha3.Experiment { - i := newFakeInstance() - i.Spec.MetricsCollectorSpec = &commonv1alpha3.MetricsCollectorSpec{ - Collector: &commonv1alpha3.CollectorSpec{ - Kind: commonv1alpha3.FileCollector, - }, - Source: &commonv1alpha3.SourceSpec{ - FileSystemPath: &commonv1alpha3.FileSystemPath{ - Path: "/absolute/path", - Kind: commonv1alpha3.FileKind, - }, - }, - } - return i - }(), - Err: false, - }, - } - - for _, tc := range tcs { - err := g.(*DefaultValidator).validateMetricsCollector(tc.Instance) - if !tc.Err && err != nil { - t.Errorf("Expected nil, got %v", err) - } else if tc.Err && err == nil { - t.Errorf("Expected err, got nil") - } - } - -} - -func newFakeInstance() *experimentsv1alpha3.Experiment { - goal := 0.11 - return &experimentsv1alpha3.Experiment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake", - Namespace: "fakens", - }, - Spec: experimentsv1alpha3.ExperimentSpec{ - MetricsCollectorSpec: &commonv1alpha3.MetricsCollectorSpec{ - Collector: &commonv1alpha3.CollectorSpec{ - Kind: commonv1alpha3.StdOutCollector, - }, - }, - Objective: &commonv1alpha3.ObjectiveSpec{ - Type: commonv1alpha3.ObjectiveTypeMaximize, - Goal: &goal, - ObjectiveMetricName: "testme", - }, - Algorithm: &commonv1alpha3.AlgorithmSpec{ - AlgorithmName: "test", - AlgorithmSettings: []commonv1alpha3.AlgorithmSetting{ - { - Name: "test1", - Value: "value1", - }, - }, - }, - Parameters: []experimentsv1alpha3.ParameterSpec{ - { - Name: "test", - ParameterType: experimentsv1alpha3.ParameterTypeCategorical, - FeasibleSpace: experimentsv1alpha3.FeasibleSpace{ - List: []string{"1", "2"}, - }, - }, - }, - }, - } -} - -func newFakeTrialTemplate(template string) *experimentsv1alpha3.TrialTemplate { - return &experimentsv1alpha3.TrialTemplate{ - Retain: false, - GoTemplate: &experimentsv1alpha3.GoTemplate{ - RawTemplate: template, - }, - } -} diff --git a/pkg/webhook/v1alpha3/pod/const.go b/pkg/webhook/v1alpha3/pod/const.go deleted file mode 100644 index 881d038516c..00000000000 --- a/pkg/webhook/v1alpha3/pod/const.go +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package pod - -import ( - common "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" -) - -const ( - MasterRole = "master" - BatchJob = "Job" -) - -var ( - NeedWrapWorkerMetricsCollecterList = [...]common.CollectorKind{ - common.StdOutCollector, - common.TfEventCollector, - common.FileCollector, - } -) diff --git a/pkg/webhook/v1alpha3/pod/inject_webhook.go b/pkg/webhook/v1alpha3/pod/inject_webhook.go deleted file mode 100644 index 6630b224b9f..00000000000 --- a/pkg/webhook/v1alpha3/pod/inject_webhook.go +++ /dev/null @@ -1,391 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package pod - -import ( - "context" - "fmt" - "net/http" - "path/filepath" - "strings" - - "github.com/spf13/viper" - v1 "k8s.io/api/core/v1" - k8serrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/resource" - apitypes "k8s.io/apimachinery/pkg/types" - "k8s.io/utils/pointer" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/runtime/inject" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission/types" - - common "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - trialsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1alpha3" - katibmanagerv1alpha3 "github.com/kubeflow/katib/pkg/common/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - jobv1alpha3 "github.com/kubeflow/katib/pkg/job/v1alpha3" - mccommon "github.com/kubeflow/katib/pkg/metricscollector/v1alpha3/common" - "github.com/kubeflow/katib/pkg/util/v1alpha3/katibconfig" -) - -var log = logf.Log.WithName("injector-webhook") - -// sidecarInjector that inject metrics collect sidecar into master pod -type sidecarInjector struct { - client client.Client - decoder types.Decoder - - // injectSecurityContext indicates if we should inject the security - // context into the metrics collector sidecar. - injectSecurityContext bool -} - -var _ admission.Handler = &sidecarInjector{} - -func (s *sidecarInjector) Handle(ctx context.Context, req types.Request) types.Response { - // Get the namespace from req since the namespace in the pod is empty. - namespace := req.AdmissionRequest.Namespace - pod := &v1.Pod{} - err := s.decoder.Decode(req, pod) - if err != nil { - return admission.ErrorResponse(http.StatusBadRequest, err) - } - - // Check whether the pod need to be mutated - needMutate, err := s.MutationRequired(pod, namespace) - if err != nil { - return admission.ErrorResponse(http.StatusInternalServerError, err) - } else { - if !needMutate { - return admission.ValidationResponse(true, "") - } - } - - // Do mutation - mutatedPod, err := s.Mutate(pod, namespace) - if err != nil { - log.Error(err, "Failed to inject metrics collector") - return admission.ErrorResponse(http.StatusBadRequest, err) - } - - return admission.PatchResponse(pod, mutatedPod) -} - -var _ inject.Client = &sidecarInjector{} - -func (s *sidecarInjector) InjectClient(c client.Client) error { - s.client = c - return nil -} - -var _ inject.Decoder = &sidecarInjector{} - -func (s *sidecarInjector) InjectDecoder(d types.Decoder) error { - s.decoder = d - return nil -} - -// NewSidecarInjector returns a new sidecar injector. -func NewSidecarInjector(c client.Client) *sidecarInjector { - return &sidecarInjector{ - injectSecurityContext: viper.GetBool(consts.ConfigInjectSecurityContext), - client: c, - } -} - -func (s *sidecarInjector) MutationRequired(pod *v1.Pod, ns string) (bool, error) { - jobKind, jobName, err := getKatibJob(pod) - if err != nil { - return false, nil - } - if !isMasterRole(pod, jobKind) { - return false, nil - } - - trialName := jobName - trial := &trialsv1alpha3.Trial{} - err = s.client.Get(context.TODO(), apitypes.NamespacedName{Name: trialName, Namespace: ns}, trial) - if err != nil { - if k8serrors.IsNotFound(err) { - return false, nil - } else { - return false, err - } - } - if trial.Spec.MetricsCollector.Collector.Kind == common.NoneCollector { - return false, nil - } - return true, nil -} - -func (s *sidecarInjector) Mutate(pod *v1.Pod, namespace string) (*v1.Pod, error) { - mutatedPod := pod.DeepCopy() - - kind, trialName, _ := getKatibJob(pod) - trial := &trialsv1alpha3.Trial{} - if err := s.client.Get(context.TODO(), apitypes.NamespacedName{Name: trialName, Namespace: namespace}, trial); err != nil { - return nil, err - } - - injectContainer, err := s.getMetricsCollectorContainer(trial, pod) - if err != nil { - return nil, err - } - mutatedPod.Spec.Containers = append(mutatedPod.Spec.Containers, *injectContainer) - - mutatedPod.Spec.ShareProcessNamespace = pointer.BoolPtr(true) - - mountPath, pathKind := getMountPath(trial.Spec.MetricsCollector) - if mountPath != "" { - if err = mutateVolume(mutatedPod, kind, mountPath, injectContainer.Name, pathKind); err != nil { - return nil, err - } - } - if needWrapWorkerContainer(trial.Spec.MetricsCollector) { - if err = wrapWorkerContainer(mutatedPod, namespace, kind, mountPath, pathKind, trial.Spec.MetricsCollector); err != nil { - return nil, err - } - } - - log.Info("Inject metrics collector sidecar container", "Pod", pod.Name, "Trial", trialName) - return mutatedPod, nil -} - -func (s *sidecarInjector) getMetricsCollectorContainer(trial *trialsv1alpha3.Trial, originalPod *v1.Pod) (*v1.Container, error) { - mc := trial.Spec.MetricsCollector - if mc.Collector.Kind == common.CustomCollector { - return mc.Collector.CustomCollector, nil - } - metricName := trial.Spec.Objective.ObjectiveMetricName - for _, v := range trial.Spec.Objective.AdditionalMetricNames { - metricName += ";" - metricName += v - } - metricsCollectorConfigData, err := katibconfig.GetMetricsCollectorConfigData(mc.Collector.Kind, s.client) - if err != nil { - return nil, err - } - args := getMetricsCollectorArgs(trial.Name, metricName, mc) - sidecarContainerName := getSidecarContainerName(trial.Spec.MetricsCollector.Collector.Kind) - - // Get metricsCollector data from config - metricsCollectorContainerImage := metricsCollectorConfigData[consts.LabelMetricsCollectorSidecarImage] - metricsCollectorImagePullPolicy := metricsCollectorConfigData[consts.LabelMetricsCollectorImagePullPolicy] - metricsCollectorCPULimit := metricsCollectorConfigData[consts.LabelMetricsCollectorCPULimitTag] - metricsCollectorCPURequest := metricsCollectorConfigData[consts.LabelMetricsCollectorCPURequestTag] - metricsCollectorMemLimit := metricsCollectorConfigData[consts.LabelMetricsCollectorMemLimitTag] - metricsCollectorMemRequest := metricsCollectorConfigData[consts.LabelMetricsCollectorMemRequestTag] - metricsCollectorDiskLimit := metricsCollectorConfigData[consts.LabelMetricsCollectorDiskLimitTag] - metricsCollectorDiskRequest := metricsCollectorConfigData[consts.LabelMetricsCollectorDiskRequestTag] - - cpuLimitQuantity, err := resource.ParseQuantity(metricsCollectorCPULimit) - if err != nil { - return nil, err - } - cpuRequestQuantity, err := resource.ParseQuantity(metricsCollectorCPURequest) - if err != nil { - return nil, err - } - memLimitQuantity, err := resource.ParseQuantity(metricsCollectorMemLimit) - if err != nil { - return nil, err - } - memRequestQuantity, err := resource.ParseQuantity(metricsCollectorMemRequest) - if err != nil { - return nil, err - } - diskLimitQuantity, err := resource.ParseQuantity(metricsCollectorDiskLimit) - if err != nil { - return nil, err - } - diskRequestQuantity, err := resource.ParseQuantity(metricsCollectorDiskRequest) - if err != nil { - return nil, err - } - - injectContainer := v1.Container{ - Name: sidecarContainerName, - Image: metricsCollectorContainerImage, - Args: args, - ImagePullPolicy: v1.PullPolicy(metricsCollectorImagePullPolicy), - Resources: v1.ResourceRequirements{ - Limits: v1.ResourceList{ - v1.ResourceCPU: cpuLimitQuantity, - v1.ResourceMemory: memLimitQuantity, - v1.ResourceEphemeralStorage: diskLimitQuantity, - }, - Requests: v1.ResourceList{ - v1.ResourceCPU: cpuRequestQuantity, - v1.ResourceMemory: memRequestQuantity, - v1.ResourceEphemeralStorage: diskRequestQuantity, - }, - }, - } - - // Inject the security context when the flag is enabled. - if s.injectSecurityContext { - if len(originalPod.Spec.Containers) != 0 && - originalPod.Spec.Containers[0].SecurityContext != nil { - injectContainer.SecurityContext = originalPod.Spec.Containers[0].SecurityContext.DeepCopy() - } - } - - return &injectContainer, nil -} - -func getMetricsCollectorArgs(trialName, metricName string, mc common.MetricsCollectorSpec) []string { - args := []string{"-t", trialName, "-m", metricName, "-s", katibmanagerv1alpha3.GetDBManagerAddr()} - if mountPath, _ := getMountPath(mc); mountPath != "" { - args = append(args, "-path", mountPath) - } - if mc.Source != nil && mc.Source.Filter != nil && len(mc.Source.Filter.MetricsFormat) > 0 { - args = append(args, "-f", strings.Join(mc.Source.Filter.MetricsFormat, ";")) - } - return args -} - -func getMountPath(mc common.MetricsCollectorSpec) (string, common.FileSystemKind) { - if mc.Collector.Kind == common.StdOutCollector { - return common.DefaultFilePath, common.FileKind - } else if mc.Collector.Kind == common.FileCollector { - return mc.Source.FileSystemPath.Path, common.FileKind - } else if mc.Collector.Kind == common.TfEventCollector { - return mc.Source.FileSystemPath.Path, common.DirectoryKind - } else if mc.Collector.Kind == common.CustomCollector { - if mc.Source == nil || mc.Source.FileSystemPath == nil { - return "", common.InvalidKind - } - return mc.Source.FileSystemPath.Path, mc.Source.FileSystemPath.Kind - } else { - return "", common.InvalidKind - } -} - -func needWrapWorkerContainer(mc common.MetricsCollectorSpec) bool { - mcKind := mc.Collector.Kind - for _, kind := range NeedWrapWorkerMetricsCollecterList { - if mcKind == kind { - return true - } - } - return false -} - -func wrapWorkerContainer( - pod *v1.Pod, namespace, jobKind, metricsFile string, - pathKind common.FileSystemKind, - mc common.MetricsCollectorSpec) error { - index := -1 - for i, c := range pod.Spec.Containers { - jobProvider, err := jobv1alpha3.New(jobKind) - if err != nil { - return err - } - if jobProvider.IsTrainingContainer(i, c) { - index = i - break - } - } - if index >= 0 { - command := []string{"sh", "-c"} - args, err := getContainerCommand(pod, namespace, index) - if err != nil { - return err - } - // If the first two commands are sh -c, we do not inject command. - if args[0] == "sh" || args[0] == "bash" { - if args[1] == "-c" { - command = args[0:2] - args = args[2:] - } - } - if mc.Collector.Kind == common.StdOutCollector { - redirectStr := fmt.Sprintf("1>%s 2>&1", metricsFile) - args = append(args, redirectStr) - } - args = append(args, "&&", getMarkCompletedCommand(metricsFile, pathKind)) - argsStr := strings.Join(args, " ") - c := &pod.Spec.Containers[index] - c.Command = command - c.Args = []string{argsStr} - } - return nil -} - -func getMarkCompletedCommand(mountPath string, pathKind common.FileSystemKind) string { - dir := mountPath - if pathKind == common.FileKind { - dir = filepath.Dir(mountPath) - } - // $$ is process id in shell - pidFile := filepath.Join(dir, "$$$$.pid") - return fmt.Sprintf("echo %s > %s", mccommon.TrainingCompleted, pidFile) -} - -func mutateVolume(pod *v1.Pod, jobKind, mountPath, sidecarContainerName string, pathKind common.FileSystemKind) error { - metricsVol := v1.Volume{ - Name: common.MetricsVolume, - VolumeSource: v1.VolumeSource{ - EmptyDir: &v1.EmptyDirVolumeSource{}, - }, - } - dir := mountPath - if pathKind == common.FileKind { - dir = filepath.Dir(mountPath) - } - vm := v1.VolumeMount{ - Name: metricsVol.Name, - MountPath: dir, - } - indexList := []int{} - for i, c := range pod.Spec.Containers { - shouldMount := false - if c.Name == sidecarContainerName { - shouldMount = true - } else { - jobProvider, err := jobv1alpha3.New(jobKind) - if err != nil { - return err - } - shouldMount = jobProvider.IsTrainingContainer(i, c) - } - if shouldMount { - indexList = append(indexList, i) - } - } - for _, i := range indexList { - c := &pod.Spec.Containers[i] - if c.VolumeMounts == nil { - c.VolumeMounts = make([]v1.VolumeMount, 0) - } - c.VolumeMounts = append(c.VolumeMounts, vm) - pod.Spec.Containers[i] = *c - } - pod.Spec.Volumes = append(pod.Spec.Volumes, metricsVol) - - return nil -} - -func getSidecarContainerName(cKind common.CollectorKind) string { - if cKind == common.StdOutCollector || cKind == common.FileCollector { - return mccommon.MetricLoggerCollectorContainerName - } else { - return mccommon.MetricCollectorContainerName - } -} diff --git a/pkg/webhook/v1alpha3/pod/inject_webhook_test.go b/pkg/webhook/v1alpha3/pod/inject_webhook_test.go deleted file mode 100644 index 50105eebb44..00000000000 --- a/pkg/webhook/v1alpha3/pod/inject_webhook_test.go +++ /dev/null @@ -1,542 +0,0 @@ -package pod - -import ( - "reflect" - "testing" - - "path/filepath" - - common "github.com/kubeflow/katib/pkg/apis/controller/common/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - mccommon "github.com/kubeflow/katib/pkg/metricscollector/v1alpha3/common" - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/equality" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -func TestWrapWorkerContainer(t *testing.T) { - testCases := []struct { - Pod *v1.Pod - Namespace string - JobKind string - MetricsFile string - PathKind common.FileSystemKind - MC common.MetricsCollectorSpec - Expected *v1.Pod - ExpectedError error - Name string - }{ - { - Pod: &v1.Pod{ - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "tensorflow", - Command: []string{ - "python main.py", - }, - }, - }, - }, - }, - Namespace: "nohere", - JobKind: "TFJob", - MetricsFile: "testfile", - PathKind: common.FileKind, - MC: common.MetricsCollectorSpec{ - Collector: &common.CollectorSpec{ - Kind: common.StdOutCollector, - }, - }, - Expected: &v1.Pod{ - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "tensorflow", - Command: []string{ - "sh", "-c", - }, - Args: []string{ - "python main.py 1>testfile 2>&1 && echo completed > $$$$.pid", - }, - }, - }, - }, - }, - ExpectedError: nil, - Name: "tensorflow container without sh -c", - }, - { - Pod: &v1.Pod{ - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "test", - Command: []string{ - "python main.py", - }, - }, - }, - }, - }, - Namespace: "nohere", - JobKind: "TFJob", - MetricsFile: "testfile", - PathKind: common.FileKind, - MC: common.MetricsCollectorSpec{ - Collector: &common.CollectorSpec{ - Kind: common.StdOutCollector, - }, - }, - Expected: &v1.Pod{ - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "test", - Command: []string{ - "python main.py", - }, - }, - }, - }, - }, - ExpectedError: nil, - Name: "test container without sh -c", - }, - { - Pod: &v1.Pod{ - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "tensorflow", - Command: []string{ - "sh", "-c", - "python main.py", - }, - }, - }, - }, - }, - Namespace: "nohere", - JobKind: "TFJob", - MetricsFile: "testfile", - PathKind: common.FileKind, - MC: common.MetricsCollectorSpec{ - Collector: &common.CollectorSpec{ - Kind: common.StdOutCollector, - }, - }, - Expected: &v1.Pod{ - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "tensorflow", - Command: []string{ - "sh", "-c", - }, - Args: []string{ - "python main.py 1>testfile 2>&1 && echo completed > $$$$.pid", - }, - }, - }, - }, - }, - ExpectedError: nil, - Name: "Tensorflow container with sh -c", - }, - } - - for _, c := range testCases { - err := wrapWorkerContainer(c.Pod, c.Namespace, c.JobKind, c.MetricsFile, c.PathKind, c.MC) - if err != c.ExpectedError { - t.Errorf("Expected error %v, got %v", c.ExpectedError, err) - } - if err == nil { - if !equality.Semantic.DeepEqual(c.Pod.Spec.Containers, c.Expected.Spec.Containers) { - t.Errorf("Case %s: Expected pod %v, got %v", - c.Name, c.Expected.Spec.Containers, c.Pod.Spec.Containers) - } - } - } -} - -func TestGetMetricsCollectorArgs(t *testing.T) { - testTrialName := "test-trial" - testMetricName := "accuracy" - katibDBAddress := "katib-db-manager.kubeflow:6789" - testPath := "/test/path" - testCases := []struct { - TrialName string - MetricName string - MCSpec common.MetricsCollectorSpec - ExpectedArgs []string - Name string - }{ - { - TrialName: testTrialName, - MetricName: testMetricName, - MCSpec: common.MetricsCollectorSpec{ - Collector: &common.CollectorSpec{ - Kind: common.StdOutCollector, - }, - }, - ExpectedArgs: []string{ - "-t", testTrialName, - "-m", testMetricName, - "-s", katibDBAddress, - "-path", common.DefaultFilePath, - }, - Name: "StdOut MC", - }, - { - TrialName: testTrialName, - MetricName: testMetricName, - MCSpec: common.MetricsCollectorSpec{ - Collector: &common.CollectorSpec{ - Kind: common.FileCollector, - }, - Source: &common.SourceSpec{ - FileSystemPath: &common.FileSystemPath{ - Path: testPath, - }, - Filter: &common.FilterSpec{ - MetricsFormat: []string{ - "{mn1: ([a-b]), mv1: [0-9]}", - "{mn2: ([a-b]), mv2: ([0-9])}", - }, - }, - }, - }, - ExpectedArgs: []string{ - "-t", testTrialName, - "-m", testMetricName, - "-s", katibDBAddress, - "-path", testPath, - "-f", "{mn1: ([a-b]), mv1: [0-9]};{mn2: ([a-b]), mv2: ([0-9])}", - }, - Name: "File MC with Filter", - }, - { - TrialName: testTrialName, - MetricName: testMetricName, - MCSpec: common.MetricsCollectorSpec{ - Collector: &common.CollectorSpec{ - Kind: common.TfEventCollector, - }, - Source: &common.SourceSpec{ - FileSystemPath: &common.FileSystemPath{ - Path: testPath, - }, - }, - }, - ExpectedArgs: []string{ - "-t", testTrialName, - "-m", testMetricName, - "-s", katibDBAddress, - "-path", testPath, - }, - Name: "Tf Event MC", - }, - { - TrialName: testTrialName, - MetricName: testMetricName, - MCSpec: common.MetricsCollectorSpec{ - Collector: &common.CollectorSpec{ - Kind: common.CustomCollector, - }, - }, - ExpectedArgs: []string{ - "-t", testTrialName, - "-m", testMetricName, - "-s", katibDBAddress, - }, - Name: "Custom MC without Path", - }, - { - TrialName: testTrialName, - MetricName: testMetricName, - MCSpec: common.MetricsCollectorSpec{ - Collector: &common.CollectorSpec{ - Kind: common.CustomCollector, - }, - Source: &common.SourceSpec{ - FileSystemPath: &common.FileSystemPath{ - Path: testPath, - }, - }, - }, - ExpectedArgs: []string{ - "-t", testTrialName, - "-m", testMetricName, - "-s", katibDBAddress, - "-path", testPath, - }, - Name: "Custom MC with Path", - }, - { - TrialName: testTrialName, - MetricName: testMetricName, - MCSpec: common.MetricsCollectorSpec{ - Collector: &common.CollectorSpec{ - Kind: common.PrometheusMetricCollector, - }, - }, - ExpectedArgs: []string{ - "-t", testTrialName, - "-m", testMetricName, - "-s", katibDBAddress, - }, - Name: "Prometheus MC without Path", - }, - } - - for _, tc := range testCases { - args := getMetricsCollectorArgs(tc.TrialName, tc.MetricName, tc.MCSpec) - if !reflect.DeepEqual(tc.ExpectedArgs, args) { - t.Errorf("Case %v failed. ExpectedArgs: %v, got %v", tc.Name, tc.ExpectedArgs, args) - } - } -} - -func TestNeedWrapWorkerContainer(t *testing.T) { - testCases := []struct { - MCSpec common.MetricsCollectorSpec - needWrap bool - }{ - { - MCSpec: common.MetricsCollectorSpec{ - Collector: &common.CollectorSpec{ - Kind: common.StdOutCollector, - }, - }, - needWrap: true, - }, - { - MCSpec: common.MetricsCollectorSpec{ - Collector: &common.CollectorSpec{ - Kind: common.CustomCollector, - }, - }, - needWrap: false, - }, - } - - for _, tc := range testCases { - needWrap := needWrapWorkerContainer(tc.MCSpec) - if needWrap != tc.needWrap { - t.Errorf("Expected needWrap %v, got %v", tc.needWrap, needWrap) - } - } -} - -func TestMutateVolume(t *testing.T) { - tc := struct { - Pod v1.Pod - ExpectedPod v1.Pod - JobKind string - MountPath string - SidecarContainerName string - PathKind common.FileSystemKind - Err bool - }{ - Pod: v1.Pod{ - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "train-job", - }, - { - Name: "init-container", - }, - { - Name: "metrics-collector", - }, - }, - }, - }, - ExpectedPod: v1.Pod{ - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "train-job", - VolumeMounts: []v1.VolumeMount{ - { - Name: common.MetricsVolume, - MountPath: filepath.Dir(common.DefaultFilePath), - }, - }, - }, - { - Name: "init-container", - }, - { - Name: "metrics-collector", - }, - }, - Volumes: []v1.Volume{ - { - Name: common.MetricsVolume, - VolumeSource: v1.VolumeSource{ - EmptyDir: &v1.EmptyDirVolumeSource{}, - }, - }, - }, - }, - }, - JobKind: "Job", - MountPath: common.DefaultFilePath, - SidecarContainerName: "train-job", - PathKind: common.FileKind, - } - - err := mutateVolume( - &tc.Pod, - tc.JobKind, - tc.MountPath, - tc.SidecarContainerName, - tc.PathKind) - if err != nil { - t.Errorf("mutateVolume failed: %v", err) - } else if !equality.Semantic.DeepEqual(tc.Pod, tc.ExpectedPod) { - t.Errorf("Expected pod %v, got %v", tc.ExpectedPod, tc.Pod) - } -} - -func TestGetSidecarContainerName(t *testing.T) { - testCases := []struct { - CollectorKind common.CollectorKind - ExpectedCollectorKind string - }{ - { - CollectorKind: common.StdOutCollector, - ExpectedCollectorKind: mccommon.MetricLoggerCollectorContainerName, - }, - { - CollectorKind: common.TfEventCollector, - ExpectedCollectorKind: mccommon.MetricCollectorContainerName, - }, - } - - for _, tc := range testCases { - collectorKind := getSidecarContainerName(tc.CollectorKind) - if collectorKind != tc.ExpectedCollectorKind { - t.Errorf("Expected Collector Kind: %v, got %v", tc.ExpectedCollectorKind, collectorKind) - } - } -} - -func TestGetKatibJob(t *testing.T) { - testCases := []struct { - Pod v1.Pod - ExpectedJobKind string - ExpectedJobName string - Err bool - Name string - }{ - { - Pod: v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - OwnerReferences: []metav1.OwnerReference{ - { - APIVersion: "kubeflow.org/v1", - Kind: "PyTorchJob", - Name: "OwnerName", - }, - }, - }, - }, - ExpectedJobKind: "PyTorchJob", - ExpectedJobName: "OwnerName", - Err: false, - Name: "Valid Pod", - }, - { - Pod: v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - OwnerReferences: []metav1.OwnerReference{ - { - APIVersion: "notkubeflow.org/v1", - Kind: "PyTorchJob", - Name: "OwnerName", - }, - }, - }, - }, - Err: true, - Name: "Invalid APIVersion", - }, - { - Pod: v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - OwnerReferences: []metav1.OwnerReference{ - { - APIVersion: "kubeflow.org/v1", - Kind: "MXJob", - Name: "OwnerName", - }, - }, - }, - }, - Err: true, - Name: "Invalid Kind", - }, - } - - for _, tc := range testCases { - jobKind, jobName, err := getKatibJob(&tc.Pod) - if !tc.Err && err != nil { - t.Errorf("Case %v failed. Error %v", tc.Name, err) - } else if !tc.Err && (tc.ExpectedJobKind != jobKind || tc.ExpectedJobName != jobName) { - t.Errorf("Case %v failed. Expected jobKind %v, got %v, Expected jobName %v, got %v", - tc.Name, tc.ExpectedJobKind, jobKind, tc.ExpectedJobName, jobName) - } else if tc.Err && err == nil { - t.Errorf("Expected error got nil") - } - } -} - -func TestIsMasterRole(t *testing.T) { - masterRoleLabel := make(map[string]string) - masterRoleLabel[consts.JobRole] = MasterRole - invalidLabel := make(map[string]string) - invalidLabel["invalid-label"] = "invalid" - testCases := []struct { - Pod v1.Pod - JobKind string - IsMaster bool - Name string - }{ - { - JobKind: "Job", - IsMaster: true, - Name: "Kubernetes Batch Job Pod", - }, - { - Pod: v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Labels: masterRoleLabel, - }, - }, - JobKind: "PyTorchJob", - IsMaster: true, - Name: "Pytorch Master Pod", - }, - { - Pod: v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Labels: invalidLabel, - }, - }, - JobKind: "PyTorchJob", - IsMaster: false, - Name: "Pytorch Pod with invalid label", - }, - } - - for _, tc := range testCases { - isMaster := isMasterRole(&tc.Pod, tc.JobKind) - if isMaster != tc.IsMaster { - t.Errorf("Case %v. Expected isMaster %v, got %v", tc.Name, tc.IsMaster, isMaster) - } - } -} diff --git a/pkg/webhook/v1alpha3/pod/utils.go b/pkg/webhook/v1alpha3/pod/utils.go deleted file mode 100644 index af852f87b62..00000000000 --- a/pkg/webhook/v1alpha3/pod/utils.go +++ /dev/null @@ -1,143 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package pod - -import ( - "errors" - "fmt" - - "github.com/google/go-containerregistry/pkg/authn" - "github.com/google/go-containerregistry/pkg/authn/k8schain" - "github.com/google/go-containerregistry/pkg/name" - crv1 "github.com/google/go-containerregistry/pkg/v1" - "github.com/google/go-containerregistry/pkg/v1/remote" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" - - jobv1alpha3 "github.com/kubeflow/katib/pkg/job/v1alpha3" -) - -func getKatibJob(pod *v1.Pod) (string, string, error) { - for _, gvk := range jobv1alpha3.SupportedJobList { - owners := pod.GetOwnerReferences() - for _, owner := range owners { - if isMatchGVK(owner, gvk) { - return owner.Kind, owner.Name, nil - } - } - } - return "", "", errors.New("The Pod doesn't belong to Katib Job") -} - -func isMatchGVK(owner metav1.OwnerReference, gvk schema.GroupVersionKind) bool { - if owner.Kind != gvk.Kind { - return false - } - gv := gvk.Group + "/" + gvk.Version - if gv != owner.APIVersion { - return false - } - return true -} - -func isMasterRole(pod *v1.Pod, jobKind string) bool { - if labels, ok := jobv1alpha3.JobRoleMap[jobKind]; ok { - if len(labels) == 0 { - return true - } - for _, label := range labels { - if v, err := getLabel(pod, label); err == nil { - if v == MasterRole { - return true - } - } - } - } - return false -} - -func getLabel(pod *v1.Pod, targetLabel string) (string, error) { - labels := pod.Labels - for k, v := range labels { - if k == targetLabel { - return v, nil - } - } - return "", errors.New("Label " + targetLabel + " not found.") -} - -func getRemoteImage(pod *v1.Pod, namespace string, containerIndex int) (crv1.Image, error) { - // verify the image name, then download the remote config file - c := pod.Spec.Containers[containerIndex] - ref, err := name.ParseReference(c.Image, name.WeakValidation) - if err != nil { - return nil, fmt.Errorf("Failed to parse image %q: %v", c.Image, err) - } - imagePullSecrets := []string{} - for _, s := range pod.Spec.ImagePullSecrets { - imagePullSecrets = append(imagePullSecrets, s.Name) - } - kc, err := k8schain.NewInCluster(k8schain.Options{ - Namespace: namespace, - ServiceAccountName: pod.Spec.ServiceAccountName, - ImagePullSecrets: imagePullSecrets, - }) - if err != nil { - return nil, fmt.Errorf("Failed to create k8schain: %v", err) - } - - mkc := authn.NewMultiKeychain(kc) - img, err := remote.Image(ref, remote.WithAuthFromKeychain(mkc)) - if err != nil { - return nil, fmt.Errorf("Failed to get container image %q info from registry: %v", c.Image, err) - } - - return img, nil -} - -func getContainerCommand(pod *v1.Pod, namespace string, containerIndex int) ([]string, error) { - // https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes - var err error - var img crv1.Image - var cfg *crv1.ConfigFile - args := []string{} - c := pod.Spec.Containers[containerIndex] - if len(c.Command) != 0 { - args = append(args, c.Command...) - } else { - img, err = getRemoteImage(pod, namespace, containerIndex) - if err != nil { - return nil, err - } - cfg, err = img.ConfigFile() - if err != nil { - return nil, fmt.Errorf("Failed to get config for image %q: %v", c.Image, err) - } - if len(cfg.Config.Entrypoint) != 0 { - args = append(args, cfg.Config.Entrypoint...) - } - } - if len(c.Args) != 0 { - args = append(args, c.Args...) - } else { - if cfg != nil && len(cfg.Config.Cmd) != 0 { - args = append(args, cfg.Config.Cmd...) - } - } - return args, nil -} diff --git a/pkg/webhook/v1alpha3/webhook.go b/pkg/webhook/v1alpha3/webhook.go deleted file mode 100644 index 069a8b897e4..00000000000 --- a/pkg/webhook/v1alpha3/webhook.go +++ /dev/null @@ -1,118 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package webhook - -import ( - "github.com/spf13/viper" - admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/webhook" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission/builder" - - experimentsv1alpha3 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1alpha3" - "github.com/kubeflow/katib/pkg/controller.v1alpha3/consts" - "github.com/kubeflow/katib/pkg/webhook/v1alpha3/common" - "github.com/kubeflow/katib/pkg/webhook/v1alpha3/experiment" - "github.com/kubeflow/katib/pkg/webhook/v1alpha3/pod" -) - -func AddToManager(m manager.Manager, port int32, serviceName string) error { - so := webhook.ServerOptions{ - CertDir: "/tmp/cert", - BootstrapOptions: &webhook.BootstrapOptions{ - Service: &webhook.Service{ - Namespace: consts.DefaultKatibNamespace, - Name: serviceName, - Selectors: map[string]string{ - "app": serviceName, - }, - }, - ValidatingWebhookConfigName: "katib-validating-webhook-config", - MutatingWebhookConfigName: "katib-mutating-webhook-config", - }, - Port: port, - } - - // Decide if we should use local file system. - // If not, we set a secret in BootstrapOptions. - usingFS := viper.GetBool(consts.ConfigCertLocalFS) - if !usingFS { - so.BootstrapOptions.Secret = &types.NamespacedName{ - Namespace: consts.DefaultKatibNamespace, - Name: serviceName, - } - } - server, err := webhook.NewServer("katib-admission-server", m, so) - if err != nil { - return err - } - - if err := register(m, server); err != nil { - return err - } - - return nil -} - -func register(manager manager.Manager, server *webhook.Server) error { - mutatingWebhook, err := builder.NewWebhookBuilder(). - FailurePolicy(admissionregistrationv1beta1.Fail). - Name("mutating.experiment.katib.kubeflow.org"). - Mutating(). - Operations(admissionregistrationv1beta1.Create, admissionregistrationv1beta1.Update). - WithManager(manager). - ForType(&experimentsv1alpha3.Experiment{}). - Handlers(experiment.NewExperimentDefaulter(manager.GetClient())). - Build() - if err != nil { - return err - } - validatingWebhook, err := builder.NewWebhookBuilder(). - FailurePolicy(admissionregistrationv1beta1.Fail). - Name("validating.experiment.katib.kubeflow.org"). - Validating(). - Operations(admissionregistrationv1beta1.Create, admissionregistrationv1beta1.Update). - WithManager(manager). - ForType(&experimentsv1alpha3.Experiment{}). - Handlers(experiment.NewExperimentValidator(manager.GetClient())). - Build() - if err != nil { - return err - } - nsSelector := &metav1.LabelSelector{ - MatchLabels: map[string]string{ - common.KatibMetricsCollectorInjection: common.KatibMetricsCollectorInjectionEnabled, - }, - } - injectWebhook, err := builder.NewWebhookBuilder(). - FailurePolicy(admissionregistrationv1beta1.Fail). - Name("mutating.pod.katib.kubeflow.org"). - NamespaceSelector(nsSelector). - Mutating(). - Operations(admissionregistrationv1beta1.Create). - WithManager(manager). - ForType(&v1.Pod{}). - Handlers(pod.NewSidecarInjector(manager.GetClient())). - FailurePolicy(admissionregistrationv1beta1.Ignore). - Build() - if err != nil { - return err - } - return server.Register(mutatingWebhook, validatingWebhook, injectWebhook) -} diff --git a/scripts/mockgen.sh b/scripts/mockgen.sh index e99de5ff829..d596a5051a8 100755 --- a/scripts/mockgen.sh +++ b/scripts/mockgen.sh @@ -21,20 +21,6 @@ set -o pipefail SCRIPT_ROOT=$(dirname ${BASH_SOURCE})/.. cd ${SCRIPT_ROOT} -echo "Generating v1alpha3 ManagerClient..." -mockgen -package mock -destination pkg/mock/v1alpha3/api/manager.go github.com/kubeflow/katib/pkg/apis/manager/v1alpha3 ManagerClient -echo "Generating v1alpha3 SuggestionClient..." -mockgen -package mock -destination pkg/mock/v1alpha3/api/suggestion.go github.com/kubeflow/katib/pkg/apis/manager/v1alpha3 SuggestionClient -echo "Generating v1alpha3 KatibDBInterface..." -mockgen -package mock -destination pkg/mock/v1alpha3/db/db.go github.com/kubeflow/katib/pkg/db/v1alpha3/common KatibDBInterface -echo "Generating v1alpha3 Generator..." -mockgen -package mock -destination pkg/mock/v1alpha3/experiment/manifest/generator.go github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/manifest Generator -echo "Generating v1alpha3 KatibClient..." -mockgen -package mock -destination pkg/mock/v1alpha3/util/katibclient/katibclient.go github.com/kubeflow/katib/pkg/util/v1alpha3/katibclient Client -echo "Generating v1alpha3 ManagerClient in Trial Controller..." -mockgen -package mock -destination pkg/mock/v1alpha3/trial/managerclient/katibmanager.go github.com/kubeflow/katib/pkg/controller.v1alpha3/trial/managerclient ManagerClient -echo "Generating v1alpha3 Suggestion in Experiment Controller..." -mockgen -package mock -destination pkg/mock/v1alpha3/experiment/suggestion/suggestion.go github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/suggestion Suggestion echo "Generating v1beta1 Suggestion RPC Client..." mockgen -package mock -destination pkg/mock/v1beta1/api/suggestion.go github.com/kubeflow/katib/pkg/apis/manager/v1beta1 SuggestionClient diff --git a/scripts/v1alpha3/build.sh b/scripts/v1alpha3/build.sh deleted file mode 100755 index 7a47029b36b..00000000000 --- a/scripts/v1alpha3/build.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/bash - -# Copyright 2018 The Kubeflow Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -o errexit -set -o nounset -set -o pipefail - -REGISTRY="gcr.io/kubeflow-images-public" -TAG="latest" -PREFIX="katib/v1alpha3" -CMD_PREFIX="cmd" -MACHINE_ARCH=`uname -m` - -SCRIPT_ROOT=$(dirname ${BASH_SOURCE})/../.. - -cd ${SCRIPT_ROOT} - -usage() { echo "Usage: $0 [-t ] [-r ] [-p ]" 1>&2; exit 1; } - -while getopts ":t::r::p:" opt; do - case $opt in - t) - TAG=${OPTARG} - ;; - r) - REGISTRY=${OPTARG} - ;; - p) - PREFIX=${OPTARG} - ;; - *) - usage - ;; - esac -done -echo "Registry: ${REGISTRY}, tag: ${TAG}, prefix: ${PREFIX}" - -echo "Building core image..." -docker build -t ${REGISTRY}/${PREFIX}/katib-controller:${TAG} -f ${CMD_PREFIX}/katib-controller/v1alpha3/Dockerfile . -docker build -t ${REGISTRY}/${PREFIX}/katib-db-manager:${TAG} -f ${CMD_PREFIX}/db-manager/v1alpha3/Dockerfile . - -echo "Building UI image..." -docker build -t ${REGISTRY}/${PREFIX}/katib-ui:${TAG} -f ${CMD_PREFIX}/ui/v1alpha3/Dockerfile . - -echo "Building file metrics collector image..." -docker build -t ${REGISTRY}/${PREFIX}/file-metrics-collector:${TAG} -f ${CMD_PREFIX}/metricscollector/v1alpha3/file-metricscollector/Dockerfile . - -echo "Building TF Event metrics collector image..." -if [ $MACHINE_ARCH == "aarch64" ]; then - docker build -t ${REGISTRY}/${PREFIX}/tfevent-metrics-collector:${TAG} -f ${CMD_PREFIX}/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile.aarch64 . -elif [ $MACHINE_ARCH == "ppc64le" ]; then - docker build -t ${REGISTRY}/${PREFIX}/tfevent-metrics-collector:${TAG} -f ${CMD_PREFIX}/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile.ppc64le . -else - docker build -t ${REGISTRY}/${PREFIX}/tfevent-metrics-collector:${TAG} -f ${CMD_PREFIX}/metricscollector/v1alpha3/tfevent-metricscollector/Dockerfile . -fi - -echo "Building suggestion images..." -docker build -t ${REGISTRY}/${PREFIX}/suggestion-hyperopt:${TAG} -f ${CMD_PREFIX}/suggestion/hyperopt/v1alpha3/Dockerfile . -docker build -t ${REGISTRY}/${PREFIX}/suggestion-skopt:${TAG} -f ${CMD_PREFIX}/suggestion/skopt/v1alpha3/Dockerfile . -docker build -t ${REGISTRY}/${PREFIX}/suggestion-chocolate:${TAG} -f ${CMD_PREFIX}/suggestion/chocolate/v1alpha3/Dockerfile . -if [ $MACHINE_ARCH == "aarch64" ]; then - docker build -t ${REGISTRY}/${PREFIX}/suggestion-enas:${TAG} -f ${CMD_PREFIX}/suggestion/nas/enas/v1alpha3/Dockerfile.aarch64 . -else - docker build -t ${REGISTRY}/${PREFIX}/suggestion-enas:${TAG} -f ${CMD_PREFIX}/suggestion/nas/enas/v1alpha3/Dockerfile . -fi -docker build -t ${REGISTRY}/${PREFIX}/suggestion-hyperband:${TAG} -f ${CMD_PREFIX}/suggestion/hyperband/v1alpha3/Dockerfile . -docker build -t ${REGISTRY}/${PREFIX}/suggestion-goptuna:${TAG} -f ${CMD_PREFIX}/suggestion/goptuna/v1alpha3/Dockerfile . diff --git a/scripts/v1alpha3/deploy.sh b/scripts/v1alpha3/deploy.sh deleted file mode 100755 index 0e2ca6ed58e..00000000000 --- a/scripts/v1alpha3/deploy.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# Copyright 2018 The Kubeflow Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -o errexit -set -o nounset -set -o pipefail -set -o xtrace - -SCRIPT_ROOT=$(dirname ${BASH_SOURCE})/../.. - -cd ${SCRIPT_ROOT} -kubectl get validatingwebhookconfigurations katib-validating-webhook-config && kubectl delete validatingwebhookconfigurations katib-validating-webhook-config -kubectl get mutatingwebhookconfigurations katib-mutating-webhook-config && kubectl delete mutatingwebhookconfigurations katib-mutating-webhook-config -kubectl apply -f manifests/v1alpha3 -kubectl apply -f manifests/v1alpha3/katib-controller -kubectl apply -f manifests/v1alpha3/db-manager -kubectl apply -f manifests/v1alpha3/pv -kubectl apply -f manifests/v1alpha3/mysql-db -kubectl apply -f manifests/v1alpha3/ui -cd - > /dev/null diff --git a/scripts/v1alpha3/undeploy.sh b/scripts/v1alpha3/undeploy.sh deleted file mode 100755 index afcbbda9730..00000000000 --- a/scripts/v1alpha3/undeploy.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash - -# Copyright 2019 The Kubeflow Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -o nounset -set -o pipefail -set -o xtrace - -# Delete CR first -experiments=`kubectl get experiments --all-namespaces | awk '{if (NR>1) {print $1"/"$2}}'` -for s in $experiments -do - ns=`echo $s|cut -d "/" -f 1` - exp=`echo $s|cut -d "/" -f 2` - kubectl delete experiments $exp -n $ns -done - -SCRIPT_ROOT=$(dirname ${BASH_SOURCE})/../.. - -cd ${SCRIPT_ROOT} -kubectl delete -f manifests/v1alpha3/katib-controller -kubectl delete -f manifests/v1alpha3/db-manager -kubectl delete -f manifests/v1alpha3/mysql-db -kubectl delete -f manifests/v1alpha3/ui -kubectl delete -f manifests/v1alpha3/pv -kubectl delete -f manifests/v1alpha3 -kubectl get mutatingwebhookconfigurations katib-mutating-webhook-config && kubectl delete mutatingwebhookconfigurations katib-mutating-webhook-config -kubectl get validatingwebhookconfigurations katib-validating-webhook-config && kubectl delete validatingwebhookconfigurations katib-validating-webhook-config -cd - > /dev/null diff --git a/sdk/python/v1alpha3/README.md b/sdk/python/v1alpha3/README.md deleted file mode 100644 index 84cbccf647e..00000000000 --- a/sdk/python/v1alpha3/README.md +++ /dev/null @@ -1,98 +0,0 @@ -# Kubeflow Katib SDK - -Python SDK for Kubeflow Katib - -## Requirements. - -Python 2.7 and 3.4+ - -## Installation & Usage - -### pip install - -```sh -pip install kubeflow-katib==0.0.2 -``` - -Then import package: - -```python -from kubeflow import katib -``` - -### Setuptools - -Install via [Setuptools](http://pypi.python.org/pypi/setuptools). - -```sh -python setup.py install --user -``` -(or `sudo python setup.py install` to install the package for all users) - -## Getting Started - -Please follow the [samples](examples) to create, update, delete and get hyperparamaters of Katib Experiment. - -## Documentation for API Endpoints - -Class | Method | Description ------------- | ------------- | ------------- -[KatibClient](docs/KatibClient.md) | [create_experiment](docs/KatibClient.md#create_experiment) | Create Katib Experiment| -[KatibClient](docs/KatibClient.md) | [get_experiment](docs/KatibClient.md#get_experiment) | Get or watch the specified Experiment or all Experiment in the namespace | -[KatibClient](docs/KatibClient.md) | [delete_experiment](docs/KatibClient.md#delete_experiment) | Delete specified Experiment | -[KatibClient](docs/KatibClient.md) | [list_experiments](docs/KatibClient.md#list_experiments) | List all Experiments with status | -[KatibClient](docs/KatibClient.md) | [get_experiment_status](docs/KatibClient.md#get_experiment_status) | Get Experiment status| -[KatibClient](docs/KatibClient.md) | [is_experiment_succeeded](docs/KatibClient.md#is_experiment_succeeded) | Check if Experiment status is Succeeded | -[KatibClient](docs/KatibClient.md) | [list_trials](docs/KatibClient.md#list_trials) | List all trials of specified Experiment | -[KatibClient](docs/KatibClient.md) | [get_optimal_hyperparmeters](docs/KatibClient.md#get_optimal_hyperparmeters) | Get currentOptimalTrial with paramaterAssignments of an Experiment| - - -## Documentation For Models - -- [V1alpha3AlgorithmSetting](docs/V1alpha3AlgorithmSetting.md) -- [V1alpha3AlgorithmSpec](docs/V1alpha3AlgorithmSpec.md) -- [V1alpha3CollectorSpec](docs/V1alpha3CollectorSpec.md) -- [V1alpha3EarlyStoppingSetting](docs/V1alpha3EarlyStoppingSetting.md) -- [V1alpha3EarlyStoppingSpec](docs/V1alpha3EarlyStoppingSpec.md) -- [V1alpha3Experiment](docs/V1alpha3Experiment.md) -- [V1alpha3ExperimentCondition](docs/V1alpha3ExperimentCondition.md) -- [V1alpha3ExperimentList](docs/V1alpha3ExperimentList.md) -- [V1alpha3ExperimentSpec](docs/V1alpha3ExperimentSpec.md) -- [V1alpha3ExperimentStatus](docs/V1alpha3ExperimentStatus.md) -- [V1alpha3FeasibleSpace](docs/V1alpha3FeasibleSpace.md) -- [V1alpha3FileSystemPath](docs/V1alpha3FileSystemPath.md) -- [V1alpha3FilterSpec](docs/V1alpha3FilterSpec.md) -- [V1alpha3GoTemplate](docs/V1alpha3GoTemplate.md) -- [V1alpha3GraphConfig](docs/V1alpha3GraphConfig.md) -- [V1alpha3Metric](docs/V1alpha3Metric.md) -- [V1alpha3MetricsCollectorSpec](docs/V1alpha3MetricsCollectorSpec.md) -- [V1alpha3NasConfig](docs/V1alpha3NasConfig.md) -- [V1alpha3ObjectiveSpec](docs/V1alpha3ObjectiveSpec.md) -- [V1alpha3Observation](docs/V1alpha3Observation.md) -- [V1alpha3Operation](docs/V1alpha3Operation.md) -- [V1alpha3OptimalTrial](docs/V1alpha3OptimalTrial.md) -- [V1alpha3ParameterAssignment](docs/V1alpha3ParameterAssignment.md) -- [V1alpha3ParameterSpec](docs/V1alpha3ParameterSpec.md) -- [V1alpha3SourceSpec](docs/V1alpha3SourceSpec.md) -- [V1alpha3Suggestion](docs/V1alpha3Suggestion.md) -- [V1alpha3SuggestionCondition](docs/V1alpha3SuggestionCondition.md) -- [V1alpha3SuggestionList](docs/V1alpha3SuggestionList.md) -- [V1alpha3SuggestionSpec](docs/V1alpha3SuggestionSpec.md) -- [V1alpha3SuggestionStatus](docs/V1alpha3SuggestionStatus.md) -- [V1alpha3TemplateSpec](docs/V1alpha3TemplateSpec.md) -- [V1alpha3Trial](docs/V1alpha3Trial.md) -- [V1alpha3TrialAssignment](docs/V1alpha3TrialAssignment.md) -- [V1alpha3TrialCondition](docs/V1alpha3TrialCondition.md) -- [V1alpha3TrialList](docs/V1alpha3TrialList.md) -- [V1alpha3TrialSpec](docs/V1alpha3TrialSpec.md) -- [V1alpha3TrialStatus](docs/V1alpha3TrialStatus.md) -- [V1alpha3TrialTemplate](docs/V1alpha3TrialTemplate.md) - -## Documentation For Authorization - - All endpoints do not require authorization. - - -## Author - -prem0912 diff --git a/sdk/python/v1alpha3/docs/KatibClient.md b/sdk/python/v1alpha3/docs/KatibClient.md deleted file mode 100644 index e60ec667135..00000000000 --- a/sdk/python/v1alpha3/docs/KatibClient.md +++ /dev/null @@ -1,135 +0,0 @@ -# KatibClient - -> KatibClient(config_file=None, context=None, client_configuration=None, persist_config=True) - -User can loads authentication and cluster information from kube-config file and stores them in kubernetes.client.configuration. Parameters are as following: - -parameter | Description ------------- | ------------- -config_file | Location of kube-config file. Defaults to `~/.kube/config`. Note that the config_file is needed if user want to operate katib SDK in another remote cluster, user must set `config_file` to load kube-config file explicitly, e.g. `KatibClient(config_file="~/.kube/config")`. | -context |Set the active context. If is set to None, current_context from config file will be used.| -client_configuration | The kubernetes.client.Configuration to set configs to.| -persist_config | If True, config file will be updated when changed (e.g GCP token refresh).| - - -The APIs for KatibClient are as following: - -Class | Method | Description ------------- | ------------- | ------------- -KatibClient | [create_experiment](#create_experiment) | Create Katib Experiment| -KatibClient | [get_experiment](#get_experiment) | Get or watch the specified experiment or all experiments in the namespace | -KatibClient | [delete_experiment](#delete_experiment) | Delete specified experiment | -KatibClient | [list_experiments](#list_experiments) | List all experiments with status | -KatibClient | [get_experiment_status](#get_experiment_status) | Get experiment status| -KatibClient | [is_experiment_succeeded](#is_experiment_succeeded) | Check if experiment status is Succeeded | -KatibClient | [list_trials](#list_trials) | List all trials of specified experiment with status | -KatibClient | [get_optimal_hyperparmeters](#get_optimal_hyperparmeters) | Get currentOptimalTrial with paramaterAssignments of an experiment| - - - -## create_experiment -> create_experiment(experiment, namespace=None) - -### Parameters -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -experiment | [V1alpha3Experiment](V1alpha3Experiment.md) | experiment definition| Required | -namespace | str | Namespace for experiment deploying to. If the `namespace` is not defined, will align with experiment definition, or use current or default namespace if namespace is not specified in experiment definition. | Optional | - -### Return type -object - -## get_experiment -> get_experiment(name=None, namespace=None) - -Get experiment in the specified namespace - -### Parameters -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -name | str | Experiment name. If the `name` is not specified, will get all experiments in the namespace.| Optional. | -namespace | str | Experiment's namespace. Defaults to current or default namespace.| Optional | - -### Return type -object - -## delete_experiment -> delete_experiment(name, namespace=None) - -### Parameters -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -name | str | Experiment name.| Required | -namespace | str | Experiment's namespace. Defaults to current or default namespace. | Optional| - -### Return type -object - -## list_experiments -> list_experiments(namespace=None) - -List all experiment with status - -### Parameters -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -namespace | str | Experiment's namespace. Defaults to current or default namespace.| Optional | - -### Return type -List - -## get_experiment_status -> get_experiment_status(name, namespace=None) - -Returns experiment status, such as Running, Failed or Succeeded. - -### Parameters -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -name | str | Experiment name. | Required | -namespace | str | Experiment's namespace. Defaults to current or default namespace.| Optional | - -### Return type -Str - -## is_experiment_succeeded -> is_experiment_succeeded(name, namespace=None) - -Returns True if Experiment succeeded; false otherwise. - -### Parameters -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -name | str | Experiment name.| Required | -namespace | str | Experiment's namespace. Defaults to current or default namespace.| Optional | - -### Return type -Bool - -## list_trials -> list_trials(name, namespace=None) - -List all trials of an experiment with status - -### Parameters -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -name | str | Experiment name.| Required | -namespace | str | Experiment's namespace. Defaults to current or default namespace.| Optional | - -### Return type -List - -## get_optimal_hyperparmeters -> get_optimal_hyperparmeters(name, namespace=None) - -Get currentOptimalTrial with paramaterAssignments of an experiment - -### Parameters -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -name | str | Experiment name.| Required | -namespace | str | Experiment's namespace. Defaults to current or default namespace.| Optional | - -### Return type -Dict diff --git a/sdk/python/v1alpha3/docs/V1Time.md b/sdk/python/v1alpha3/docs/V1Time.md deleted file mode 100644 index 1bc6a022af6..00000000000 --- a/sdk/python/v1alpha3/docs/V1Time.md +++ /dev/null @@ -1,7 +0,0 @@ -# V1Time - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1alpha3/docs/V1UnstructuredUnstructured.md b/sdk/python/v1alpha3/docs/V1UnstructuredUnstructured.md deleted file mode 100644 index f02db67f502..00000000000 --- a/sdk/python/v1alpha3/docs/V1UnstructuredUnstructured.md +++ /dev/null @@ -1,7 +0,0 @@ -# V1UnstructuredUnstructured - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1alpha3/docs/V1alpha3AlgorithmSetting.md b/sdk/python/v1alpha3/docs/V1alpha3AlgorithmSetting.md deleted file mode 100644 index 5732f5d0a69..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3AlgorithmSetting.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3AlgorithmSetting - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**name** | **str** | | [optional] -**value** | **str** | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3AlgorithmSpec.md b/sdk/python/v1alpha3/docs/V1alpha3AlgorithmSpec.md deleted file mode 100644 index 954b05cd4fa..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3AlgorithmSpec.md +++ /dev/null @@ -1,12 +0,0 @@ -# V1alpha3AlgorithmSpec - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**algorithm_name** | **str** | | [optional] -**algorithm_settings** | [**list[V1alpha3AlgorithmSetting]**](V1alpha3AlgorithmSetting.md) | Key-value pairs representing settings for suggestion algorithms. | [optional] -**early_stopping** | [**V1alpha3EarlyStoppingSpec**](V1alpha3EarlyStoppingSpec.md) | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3CollectorSpec.md b/sdk/python/v1alpha3/docs/V1alpha3CollectorSpec.md deleted file mode 100644 index be875fd6f6b..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3CollectorSpec.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3CollectorSpec - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**custom_collector** | [**V1Container**](V1Container.md) | When kind is \"customCollector\", this field will be used | [optional] -**kind** | **str** | | - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3EarlyStoppingSetting.md b/sdk/python/v1alpha3/docs/V1alpha3EarlyStoppingSetting.md deleted file mode 100644 index 44a82777d1f..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3EarlyStoppingSetting.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3EarlyStoppingSetting - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**name** | **str** | | [optional] -**value** | **str** | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3EarlyStoppingSpec.md b/sdk/python/v1alpha3/docs/V1alpha3EarlyStoppingSpec.md deleted file mode 100644 index c0ba8f6f38b..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3EarlyStoppingSpec.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3EarlyStoppingSpec - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**early_stopping_algorithm_name** | **str** | | [optional] -**early_stopping_settings** | [**list[V1alpha3EarlyStoppingSetting]**](V1alpha3EarlyStoppingSetting.md) | | - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3Experiment.md b/sdk/python/v1alpha3/docs/V1alpha3Experiment.md deleted file mode 100644 index c5c884d919c..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3Experiment.md +++ /dev/null @@ -1,14 +0,0 @@ -# V1alpha3Experiment - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**api_version** | **str** | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources | [optional] -**kind** | **str** | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds | [optional] -**metadata** | [**V1ObjectMeta**](V1ObjectMeta.md) | | [optional] -**spec** | [**V1alpha3ExperimentSpec**](V1alpha3ExperimentSpec.md) | | [optional] -**status** | [**V1alpha3ExperimentStatus**](V1alpha3ExperimentStatus.md) | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3ExperimentCondition.md b/sdk/python/v1alpha3/docs/V1alpha3ExperimentCondition.md deleted file mode 100644 index acf60356c1f..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3ExperimentCondition.md +++ /dev/null @@ -1,15 +0,0 @@ -# V1alpha3ExperimentCondition - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**last_transition_time** | [**V1Time**](V1Time.md) | Last time the condition transitioned from one status to another. | [optional] -**last_update_time** | [**V1Time**](V1Time.md) | The last time this condition was updated. | [optional] -**message** | **str** | A human readable message indicating details about the transition. | [optional] -**reason** | **str** | The reason for the condition's last transition. | [optional] -**status** | **str** | Status of the condition, one of True, False, Unknown. | -**type** | **str** | Type of experiment condition. | - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3ExperimentList.md b/sdk/python/v1alpha3/docs/V1alpha3ExperimentList.md deleted file mode 100644 index 2998fcb3964..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3ExperimentList.md +++ /dev/null @@ -1,13 +0,0 @@ -# V1alpha3ExperimentList - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**api_version** | **str** | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources | [optional] -**items** | [**list[V1alpha3Experiment]**](V1alpha3Experiment.md) | | -**kind** | **str** | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds | [optional] -**metadata** | [**V1ListMeta**](V1ListMeta.md) | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3ExperimentSpec.md b/sdk/python/v1alpha3/docs/V1alpha3ExperimentSpec.md deleted file mode 100644 index d6f6b66f809..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3ExperimentSpec.md +++ /dev/null @@ -1,19 +0,0 @@ -# V1alpha3ExperimentSpec - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**algorithm** | [**V1alpha3AlgorithmSpec**](V1alpha3AlgorithmSpec.md) | Describes the suggestion algorithm. | [optional] -**max_failed_trial_count** | **int** | Max failed trials to mark experiment as failed. | [optional] -**max_trial_count** | **int** | Max completed trials to mark experiment as succeeded | [optional] -**metrics_collector_spec** | [**V1alpha3MetricsCollectorSpec**](V1alpha3MetricsCollectorSpec.md) | For v1alpha3 we will keep the metrics collector implementation same as v1alpha1. | [optional] -**nas_config** | [**V1alpha3NasConfig**](V1alpha3NasConfig.md) | | [optional] -**objective** | [**V1alpha3ObjectiveSpec**](V1alpha3ObjectiveSpec.md) | Describes the objective of the experiment. | [optional] -**parallel_trial_count** | **int** | How many trials can be processed in parallel. Defaults to 3 | [optional] -**parameters** | [**list[V1alpha3ParameterSpec]**](V1alpha3ParameterSpec.md) | List of hyperparameter configurations. | [optional] -**resume_policy** | **str** | Describes resuming policy which usually take effect after experiment terminated. | [optional] -**trial_template** | [**V1alpha3TrialTemplate**](V1alpha3TrialTemplate.md) | Template for each run of the trial. | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3ExperimentStatus.md b/sdk/python/v1alpha3/docs/V1alpha3ExperimentStatus.md deleted file mode 100644 index f647dcaa544..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3ExperimentStatus.md +++ /dev/null @@ -1,25 +0,0 @@ -# V1alpha3ExperimentStatus - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**completion_time** | [**V1Time**](V1Time.md) | Represents time when the Experiment was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] -**conditions** | [**list[V1alpha3ExperimentCondition]**](V1alpha3ExperimentCondition.md) | List of observed runtime conditions for this Experiment. | [optional] -**current_optimal_trial** | [**V1alpha3OptimalTrial**](V1alpha3OptimalTrial.md) | Current optimal trial parameters and observations. | [optional] -**failed_trial_list** | **list[str]** | List of trial names which have already failed. | [optional] -**killed_trial_list** | **list[str]** | List of trial names which have been killed. | [optional] -**last_reconcile_time** | [**V1Time**](V1Time.md) | Represents last time when the Experiment was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] -**pending_trial_list** | **list[str]** | List of trial names which are pending. | [optional] -**running_trial_list** | **list[str]** | List of trial names which are running. | [optional] -**start_time** | [**V1Time**](V1Time.md) | Represents time when the Experiment was acknowledged by the Experiment controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] -**succeeded_trial_list** | **list[str]** | List of trial names which have already succeeded. | [optional] -**trials** | **int** | Trials is the total number of trials owned by the experiment. | [optional] -**trials_failed** | **int** | How many trials have failed. | [optional] -**trials_killed** | **int** | How many trials have been killed. | [optional] -**trials_pending** | **int** | How many trials are currently pending. | [optional] -**trials_running** | **int** | How many trials are currently running. | [optional] -**trials_succeeded** | **int** | How many trials have succeeded. | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3FeasibleSpace.md b/sdk/python/v1alpha3/docs/V1alpha3FeasibleSpace.md deleted file mode 100644 index 458287cf16e..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3FeasibleSpace.md +++ /dev/null @@ -1,13 +0,0 @@ -# V1alpha3FeasibleSpace - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**list** | **list[str]** | | [optional] -**max** | **str** | | [optional] -**min** | **str** | | [optional] -**step** | **str** | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3FileSystemPath.md b/sdk/python/v1alpha3/docs/V1alpha3FileSystemPath.md deleted file mode 100644 index b1fad283b32..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3FileSystemPath.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3FileSystemPath - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**kind** | **str** | | [optional] -**path** | **str** | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3FilterSpec.md b/sdk/python/v1alpha3/docs/V1alpha3FilterSpec.md deleted file mode 100644 index 7825b8e1359..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3FilterSpec.md +++ /dev/null @@ -1,10 +0,0 @@ -# V1alpha3FilterSpec - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**metrics_format** | **list[str]** | When the metrics output follows format as this field specified, metricsCollector collects it and reports to metrics server, it can be \"<metric_name>: <float>\" or else | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3GoTemplate.md b/sdk/python/v1alpha3/docs/V1alpha3GoTemplate.md deleted file mode 100644 index d06d8e1c50e..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3GoTemplate.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3GoTemplate - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**raw_template** | **str** | | [optional] -**template_spec** | [**V1alpha3TemplateSpec**](V1alpha3TemplateSpec.md) | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3GraphConfig.md b/sdk/python/v1alpha3/docs/V1alpha3GraphConfig.md deleted file mode 100644 index d6a8fbd2f40..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3GraphConfig.md +++ /dev/null @@ -1,12 +0,0 @@ -# V1alpha3GraphConfig - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**input_sizes** | **list[int]** | | [optional] -**num_layers** | **int** | | [optional] -**output_sizes** | **list[int]** | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3Metric.md b/sdk/python/v1alpha3/docs/V1alpha3Metric.md deleted file mode 100644 index eb6faaa98c7..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3Metric.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3Metric - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**name** | **str** | | [optional] -**value** | **float** | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3MetricsCollectorSpec.md b/sdk/python/v1alpha3/docs/V1alpha3MetricsCollectorSpec.md deleted file mode 100644 index f3ca31b910c..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3MetricsCollectorSpec.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3MetricsCollectorSpec - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**collector** | [**V1alpha3CollectorSpec**](V1alpha3CollectorSpec.md) | | [optional] -**source** | [**V1alpha3SourceSpec**](V1alpha3SourceSpec.md) | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3NasConfig.md b/sdk/python/v1alpha3/docs/V1alpha3NasConfig.md deleted file mode 100644 index b85f786d13d..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3NasConfig.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3NasConfig - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**graph_config** | [**V1alpha3GraphConfig**](V1alpha3GraphConfig.md) | | [optional] -**operations** | [**list[V1alpha3Operation]**](V1alpha3Operation.md) | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3ObjectiveSpec.md b/sdk/python/v1alpha3/docs/V1alpha3ObjectiveSpec.md deleted file mode 100644 index 64308fec5c8..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3ObjectiveSpec.md +++ /dev/null @@ -1,13 +0,0 @@ -# V1alpha3ObjectiveSpec - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**additional_metric_names** | **list[str]** | This can be empty if we only care about the objective metric. Note: If we adopt a push instead of pull mechanism, this can be omitted completely. | [optional] -**goal** | **float** | | [optional] -**objective_metric_name** | **str** | | [optional] -**type** | **str** | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3Observation.md b/sdk/python/v1alpha3/docs/V1alpha3Observation.md deleted file mode 100644 index 8297e4865a9..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3Observation.md +++ /dev/null @@ -1,10 +0,0 @@ -# V1alpha3Observation - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**metrics** | [**list[V1alpha3Metric]**](V1alpha3Metric.md) | Key-value pairs for metric names and values | - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3Operation.md b/sdk/python/v1alpha3/docs/V1alpha3Operation.md deleted file mode 100644 index 5aca8207ba8..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3Operation.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3Operation - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**operation_type** | **str** | | [optional] -**parameters** | [**list[V1alpha3ParameterSpec]**](V1alpha3ParameterSpec.md) | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3OptimalTrial.md b/sdk/python/v1alpha3/docs/V1alpha3OptimalTrial.md deleted file mode 100644 index a3ca32a8234..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3OptimalTrial.md +++ /dev/null @@ -1,12 +0,0 @@ -# V1alpha3OptimalTrial - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**best_trial_name** | **str** | BestTrialName is the name of the best trial. | -**observation** | [**V1alpha3Observation**](V1alpha3Observation.md) | Observation for this trial | [optional] -**parameter_assignments** | [**list[V1alpha3ParameterAssignment]**](V1alpha3ParameterAssignment.md) | Key-value pairs for hyperparameters and assignment values. | - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3ParameterAssignment.md b/sdk/python/v1alpha3/docs/V1alpha3ParameterAssignment.md deleted file mode 100644 index 142c175e9d6..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3ParameterAssignment.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3ParameterAssignment - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**name** | **str** | | [optional] -**value** | **str** | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3ParameterSpec.md b/sdk/python/v1alpha3/docs/V1alpha3ParameterSpec.md deleted file mode 100644 index c8dda2bd6ef..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3ParameterSpec.md +++ /dev/null @@ -1,12 +0,0 @@ -# V1alpha3ParameterSpec - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**feasible_space** | [**V1alpha3FeasibleSpace**](V1alpha3FeasibleSpace.md) | | [optional] -**name** | **str** | | [optional] -**parameter_type** | **str** | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3SourceSpec.md b/sdk/python/v1alpha3/docs/V1alpha3SourceSpec.md deleted file mode 100644 index 91d5e0e455d..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3SourceSpec.md +++ /dev/null @@ -1,12 +0,0 @@ -# V1alpha3SourceSpec - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**file_system_path** | [**V1alpha3FileSystemPath**](V1alpha3FileSystemPath.md) | During training model, metrics may be persisted into local file in source code, such as tfEvent use case | [optional] -**filter** | [**V1alpha3FilterSpec**](V1alpha3FilterSpec.md) | Default metric output format is {\"metric\": \"<metric_name>\", \"value\": <int_or_float>, \"epoch\": <int>, \"step\": <int>}, but if the output doesn't follow default format, please extend it here | [optional] -**http_get** | [**V1HTTPGetAction**](V1HTTPGetAction.md) | Model-train source code can expose metrics by http, such as HTTP endpoint in prometheus metric format | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3Suggestion.md b/sdk/python/v1alpha3/docs/V1alpha3Suggestion.md deleted file mode 100644 index 278cb43be9a..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3Suggestion.md +++ /dev/null @@ -1,14 +0,0 @@ -# V1alpha3Suggestion - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**api_version** | **str** | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources | [optional] -**kind** | **str** | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds | [optional] -**metadata** | [**V1ObjectMeta**](V1ObjectMeta.md) | | [optional] -**spec** | [**V1alpha3SuggestionSpec**](V1alpha3SuggestionSpec.md) | | [optional] -**status** | [**V1alpha3SuggestionStatus**](V1alpha3SuggestionStatus.md) | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3SuggestionCondition.md b/sdk/python/v1alpha3/docs/V1alpha3SuggestionCondition.md deleted file mode 100644 index ff864b5bb63..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3SuggestionCondition.md +++ /dev/null @@ -1,15 +0,0 @@ -# V1alpha3SuggestionCondition - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**last_transition_time** | [**V1Time**](V1Time.md) | Last time the condition transitioned from one status to another. | [optional] -**last_update_time** | [**V1Time**](V1Time.md) | The last time this condition was updated. | [optional] -**message** | **str** | A human readable message indicating details about the transition. | [optional] -**reason** | **str** | The reason for the condition's last transition. | [optional] -**status** | **str** | Status of the condition, one of True, False, Unknown. | -**type** | **str** | Type of Suggestion condition. | - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3SuggestionList.md b/sdk/python/v1alpha3/docs/V1alpha3SuggestionList.md deleted file mode 100644 index 0be1dffcd6e..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3SuggestionList.md +++ /dev/null @@ -1,13 +0,0 @@ -# V1alpha3SuggestionList - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**api_version** | **str** | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources | [optional] -**items** | [**list[V1alpha3Suggestion]**](V1alpha3Suggestion.md) | | -**kind** | **str** | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds | [optional] -**metadata** | [**V1ListMeta**](V1ListMeta.md) | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3SuggestionSpec.md b/sdk/python/v1alpha3/docs/V1alpha3SuggestionSpec.md deleted file mode 100644 index 2846cc3c8f3..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3SuggestionSpec.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3SuggestionSpec - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**algorithm_name** | **str** | | -**requests** | **int** | Number of suggestions requested | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3SuggestionStatus.md b/sdk/python/v1alpha3/docs/V1alpha3SuggestionStatus.md deleted file mode 100644 index 0e67e50c37d..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3SuggestionStatus.md +++ /dev/null @@ -1,16 +0,0 @@ -# V1alpha3SuggestionStatus - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**algorithm_settings** | [**list[V1alpha3AlgorithmSetting]**](V1alpha3AlgorithmSetting.md) | Algorithmsettings set by the algorithm services. | [optional] -**completion_time** | [**V1Time**](V1Time.md) | Represents time when the Suggestion was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] -**conditions** | [**list[V1alpha3SuggestionCondition]**](V1alpha3SuggestionCondition.md) | List of observed runtime conditions for this Suggestion. | [optional] -**last_reconcile_time** | [**V1Time**](V1Time.md) | Represents last time when the Suggestion was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] -**start_time** | [**V1Time**](V1Time.md) | Represents time when the Suggestion was acknowledged by the Suggestion controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] -**suggestion_count** | **int** | Number of suggestion results | [optional] -**suggestions** | [**list[V1alpha3TrialAssignment]**](V1alpha3TrialAssignment.md) | Suggestion results | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3TemplateSpec.md b/sdk/python/v1alpha3/docs/V1alpha3TemplateSpec.md deleted file mode 100644 index 77f5eeaae26..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3TemplateSpec.md +++ /dev/null @@ -1,12 +0,0 @@ -# V1alpha3TemplateSpec - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**config_map_name** | **str** | | [optional] -**config_map_namespace** | **str** | | [optional] -**template_path** | **str** | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3Trial.md b/sdk/python/v1alpha3/docs/V1alpha3Trial.md deleted file mode 100644 index 3af09596e68..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3Trial.md +++ /dev/null @@ -1,14 +0,0 @@ -# V1alpha3Trial - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**api_version** | **str** | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources | [optional] -**kind** | **str** | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds | [optional] -**metadata** | [**V1ObjectMeta**](V1ObjectMeta.md) | | [optional] -**spec** | [**V1alpha3TrialSpec**](V1alpha3TrialSpec.md) | | [optional] -**status** | [**V1alpha3TrialStatus**](V1alpha3TrialStatus.md) | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3TrialAssignment.md b/sdk/python/v1alpha3/docs/V1alpha3TrialAssignment.md deleted file mode 100644 index 5290294d01e..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3TrialAssignment.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3TrialAssignment - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**name** | **str** | Name of the suggestion | [optional] -**parameter_assignments** | [**list[V1alpha3ParameterAssignment]**](V1alpha3ParameterAssignment.md) | Suggestion results | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3TrialCondition.md b/sdk/python/v1alpha3/docs/V1alpha3TrialCondition.md deleted file mode 100644 index 3bcfd706f53..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3TrialCondition.md +++ /dev/null @@ -1,15 +0,0 @@ -# V1alpha3TrialCondition - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**last_transition_time** | [**V1Time**](V1Time.md) | Last time the condition transitioned from one status to another. | [optional] -**last_update_time** | [**V1Time**](V1Time.md) | The last time this condition was updated. | [optional] -**message** | **str** | A human readable message indicating details about the transition. | [optional] -**reason** | **str** | The reason for the condition's last transition. | [optional] -**status** | **str** | Status of the condition, one of True, False, Unknown. | -**type** | **str** | Type of trial condition. | - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3TrialList.md b/sdk/python/v1alpha3/docs/V1alpha3TrialList.md deleted file mode 100644 index 3bd2e789d2a..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3TrialList.md +++ /dev/null @@ -1,13 +0,0 @@ -# V1alpha3TrialList - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**api_version** | **str** | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources | [optional] -**items** | [**list[V1alpha3Trial]**](V1alpha3Trial.md) | | -**kind** | **str** | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds | [optional] -**metadata** | [**V1ListMeta**](V1ListMeta.md) | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3TrialSpec.md b/sdk/python/v1alpha3/docs/V1alpha3TrialSpec.md deleted file mode 100644 index e13ffb42747..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3TrialSpec.md +++ /dev/null @@ -1,14 +0,0 @@ -# V1alpha3TrialSpec - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**metrics_collector** | [**V1alpha3MetricsCollectorSpec**](V1alpha3MetricsCollectorSpec.md) | Describes how metrics will be collected | [optional] -**objective** | [**V1alpha3ObjectiveSpec**](V1alpha3ObjectiveSpec.md) | Describes the objective of the experiment. | [optional] -**parameter_assignments** | [**list[V1alpha3ParameterAssignment]**](V1alpha3ParameterAssignment.md) | Key-value pairs for hyperparameters and assignment values. | -**retain_run** | **bool** | Whether to retain the trial run object after completed. | [optional] -**run_spec** | **str** | Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest. | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3TrialStatus.md b/sdk/python/v1alpha3/docs/V1alpha3TrialStatus.md deleted file mode 100644 index 34227fd7896..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3TrialStatus.md +++ /dev/null @@ -1,14 +0,0 @@ -# V1alpha3TrialStatus - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**completion_time** | [**V1Time**](V1Time.md) | Represents time when the Trial was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC | [optional] -**conditions** | [**list[V1alpha3TrialCondition]**](V1alpha3TrialCondition.md) | List of observed runtime conditions for this Trial. | [optional] -**last_reconcile_time** | [**V1Time**](V1Time.md) | Represents last time when the Trial was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] -**observation** | [**V1alpha3Observation**](V1alpha3Observation.md) | Results of the Trial - objectives and other metrics values. | [optional] -**start_time** | [**V1Time**](V1Time.md) | Represents time when the Trial was acknowledged by the Trial controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/docs/V1alpha3TrialTemplate.md b/sdk/python/v1alpha3/docs/V1alpha3TrialTemplate.md deleted file mode 100644 index 18b667cbc78..00000000000 --- a/sdk/python/v1alpha3/docs/V1alpha3TrialTemplate.md +++ /dev/null @@ -1,11 +0,0 @@ -# V1alpha3TrialTemplate - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**go_template** | [**V1alpha3GoTemplate**](V1alpha3GoTemplate.md) | | [optional] -**retain** | **bool** | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/sdk/python/v1alpha3/examples/bayesianoptimization-katib-sdk.ipynb b/sdk/python/v1alpha3/examples/bayesianoptimization-katib-sdk.ipynb deleted file mode 100644 index 66136000ebb..00000000000 --- a/sdk/python/v1alpha3/examples/bayesianoptimization-katib-sdk.ipynb +++ /dev/null @@ -1,531 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "from kubernetes.client import V1ObjectMeta\n", - "import kubeflow.katib as kc\n", - "from kubeflow.katib import constants\n", - "from kubeflow.katib import utils\n", - "from kubeflow.katib import V1alpha3AlgorithmSetting\n", - "from kubeflow.katib import V1alpha3AlgorithmSetting\n", - "from kubeflow.katib import V1alpha3AlgorithmSpec\n", - "from kubeflow.katib import V1alpha3CollectorSpec\n", - "from kubeflow.katib import V1alpha3EarlyStoppingSetting\n", - "from kubeflow.katib import V1alpha3EarlyStoppingSpecs\n", - "from kubeflow.katib import V1alpha3Experiment\n", - "from kubeflow.katib import V1alpha3ExperimentCondition\n", - "from kubeflow.katib import V1alpha3ExperimentList\n", - "from kubeflow.katib import V1alpha3ExperimentSpec\n", - "from kubeflow.katib import V1alpha3ExperimentStatus\n", - "from kubeflow.katib import V1alpha3FeasibleSpace\n", - "from kubeflow.katib import V1alpha3FileSystemPath\n", - "from kubeflow.katib import V1alpha3FilterSpec\n", - "from kubeflow.katib import V1alpha3GoTemplate\n", - "from kubeflow.katib import V1alpha3GraphConfig\n", - "from kubeflow.katib import V1alpha3Metric\n", - "from kubeflow.katib import V1alpha3MetricsCollectorSpec\n", - "from kubeflow.katib import V1alpha3NasConfig\n", - "from kubeflow.katib import V1alpha3ObjectiveSpec\n", - "from kubeflow.katib import V1alpha3Observation\n", - "from kubeflow.katib import V1alpha3Operation\n", - "from kubeflow.katib import V1alpha3OptimalTrial\n", - "from kubeflow.katib import V1alpha3ParameterAssignment\n", - "from kubeflow.katib import V1alpha3ParameterSpec\n", - "from kubeflow.katib import V1alpha3SourceSpec\n", - "from kubeflow.katib import V1alpha3Suggestion\n", - "from kubeflow.katib import V1alpha3SuggestionCondition\n", - "from kubeflow.katib import V1alpha3SuggestionList\n", - "from kubeflow.katib import V1alpha3SuggestionSpec\n", - "from kubeflow.katib import V1alpha3SuggestionStatus\n", - "from kubeflow.katib import V1alpha3TemplateSpec\n", - "from kubeflow.katib import V1alpha3Trial\n", - "from kubeflow.katib import V1alpha3TrialAssignment\n", - "from kubeflow.katib import V1alpha3TrialCondition\n", - "from kubeflow.katib import V1alpha3TrialList\n", - "from kubeflow.katib import V1alpha3TrialSpec\n", - "from kubeflow.katib import V1alpha3TrialStatus\n", - "from kubeflow.katib import V1alpha3TrialTemplate" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "algorithmsettings = V1alpha3AlgorithmSetting(\n", - " name= \"random_state\",\n", - " value = \"10\"\n", - " )\n", - "algorithm = V1alpha3AlgorithmSpec(\n", - " algorithm_name = \"bayesianoptimization\",\n", - " algorithm_settings = [algorithmsettings]\n", - " )\n", - "\n", - "# Objective\n", - "objective = V1alpha3ObjectiveSpec(\n", - " goal = 0.9999,\n", - " objective_metric_name = \"Validation-accuracy\",\n", - " type = \"maximize\")\n", - "\n", - "# Parameters\n", - "\n", - "feasible_space_optimizer = V1alpha3FeasibleSpace(list = [\"sgd\", \"adam\", \"ftrl\"])\n", - "feasible_space_lr = V1alpha3FeasibleSpace(min = \"0.01\", max = \"0.03\")\n", - "feasible_space_layers = V1alpha3FeasibleSpace(min = \"2\", max = \"5\")\n", - "\n", - "parameters = [V1alpha3ParameterSpec(\n", - " feasible_space = feasible_space_optimizer, \n", - " name = \"--optimizer\",\n", - " parameter_type = \"categorical\"\n", - " ),\n", - " V1alpha3ParameterSpec(\n", - " feasible_space = feasible_space_lr, \n", - " name = \"--lr\",\n", - " parameter_type =\"double\"\n", - " ),\n", - " V1alpha3ParameterSpec(\n", - " feasible_space = feasible_space_layers, \n", - " name = \"--num-layers\",\n", - " parameter_type = \"int\"\n", - " )]\n", - "\n", - "# Trialtemplate\n", - "go_template = V1alpha3GoTemplate(\n", - " raw_template = \"apiVersion: \\\"batch/v1\\\"\\nkind: Job\\nmetadata:\\n name: {{.Trial}}\\n namespace: {{.NameSpace}}\\nspec:\\n template:\\n spec:\\n containers:\\n - name: {{.Trial}}\\n image: docker.io/kubeflowkatib/mxnet-mnist\\n command:\\n - \\\"python3\\\"\\n - \\\"/opt/mxnet-mnist/mnist.py\\\"\\n - \\\"--batch-size=64\\\"\\n {{- with .HyperParameters}}\\n {{- range .}}\\n - \\\"{{.Name}}={{.Value}}\\\"\\n {{- end}}\\n {{- end}}\\n restartPolicy: Never\"\n", - " )\n", - "\n", - "\n", - "trial_template= V1alpha3TrialTemplate(go_template=go_template)\n", - "\n", - "\n", - "# Experiment\n", - "experiment = V1alpha3Experiment(\n", - " api_version=\"kubeflow.org/v1alpha3\",\n", - " kind=\"Experiment\",\n", - " metadata=V1ObjectMeta(name=\"bayesianoptimization\",namespace=\"anonymous\"),\n", - "\n", - " spec=V1alpha3ExperimentSpec(\n", - " algorithm = algorithm,\n", - " max_failed_trial_count=3,\n", - " max_trial_count=5,\n", - " objective = objective,\n", - " parallel_trial_count=5,\n", - " parameters = parameters ,\n", - " trial_template = trial_template\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "namespace = kc.utils.get_default_target_namespace()\n", - "#experiment" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "kclient = kc.KatibClient()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Create Experiment" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "Katib Experiment link here" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "{'apiVersion': 'kubeflow.org/v1alpha3',\n", - " 'kind': 'Experiment',\n", - " 'metadata': {'creationTimestamp': '2020-03-04T10:46:49Z',\n", - " 'generation': 1,\n", - " 'name': 'bayesianoptimization',\n", - " 'namespace': 'anonymous',\n", - " 'resourceVersion': '7034916',\n", - " 'selfLink': '/apis/kubeflow.org/v1alpha3/namespaces/anonymous/experiments/bayesianoptimization',\n", - " 'uid': '7360157b-5e05-11ea-8d71-42010aa00012'},\n", - " 'spec': {'algorithm': {'algorithmName': 'bayesianoptimization',\n", - " 'algorithmSettings': [{'name': 'random_state', 'value': '10'}]},\n", - " 'maxFailedTrialCount': 3,\n", - " 'maxTrialCount': 5,\n", - " 'metricsCollectorSpec': {'collector': {'kind': 'StdOut'}},\n", - " 'objective': {'goal': 0.9999,\n", - " 'objectiveMetricName': 'Validation-accuracy',\n", - " 'type': 'maximize'},\n", - " 'parallelTrialCount': 5,\n", - " 'parameters': [{'feasibleSpace': {'list': ['sgd', 'adam', 'ftrl']},\n", - " 'name': '--optimizer',\n", - " 'parameterType': 'categorical'},\n", - " {'feasibleSpace': {'max': '0.03', 'min': '0.01'},\n", - " 'name': '--lr',\n", - " 'parameterType': 'double'},\n", - " {'feasibleSpace': {'max': '5', 'min': '2'},\n", - " 'name': '--num-layers',\n", - " 'parameterType': 'int'}],\n", - " 'trialTemplate': {'goTemplate': {'rawTemplate': 'apiVersion: \"batch/v1\"\\nkind: Job\\nmetadata:\\n name: {{.Trial}}\\n namespace: {{.NameSpace}}\\nspec:\\n template:\\n spec:\\n containers:\\n - name: {{.Trial}}\\n image: docker.io/kubeflowkatib/mxnet-mnist\\n command:\\n - \"python3\"\\n - \"/opt/mxnet-mnist/mnist.py\"\\n - \"--batch-size=64\"\\n {{- with .HyperParameters}}\\n {{- range .}}\\n - \"{{.Name}}={{.Value}}\"\\n {{- end}}\\n {{- end}}\\n restartPolicy: Never'}}}}" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.create_experiment(experiment, namespace=namespace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get Single Experiment" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'apiVersion': 'kubeflow.org/v1alpha3',\n", - " 'kind': 'Experiment',\n", - " 'metadata': {'creationTimestamp': '2020-03-04T10:46:49Z',\n", - " 'finalizers': ['update-prometheus-metrics'],\n", - " 'generation': 1,\n", - " 'name': 'bayesianoptimization',\n", - " 'namespace': 'anonymous',\n", - " 'resourceVersion': '7034918',\n", - " 'selfLink': '/apis/kubeflow.org/v1alpha3/namespaces/anonymous/experiments/bayesianoptimization',\n", - " 'uid': '7360157b-5e05-11ea-8d71-42010aa00012'},\n", - " 'spec': {'algorithm': {'algorithmName': 'bayesianoptimization',\n", - " 'algorithmSettings': [{'name': 'random_state', 'value': '10'}]},\n", - " 'maxFailedTrialCount': 3,\n", - " 'maxTrialCount': 5,\n", - " 'metricsCollectorSpec': {'collector': {'kind': 'StdOut'}},\n", - " 'objective': {'goal': 0.9999,\n", - " 'objectiveMetricName': 'Validation-accuracy',\n", - " 'type': 'maximize'},\n", - " 'parallelTrialCount': 5,\n", - " 'parameters': [{'feasibleSpace': {'list': ['sgd', 'adam', 'ftrl']},\n", - " 'name': '--optimizer',\n", - " 'parameterType': 'categorical'},\n", - " {'feasibleSpace': {'max': '0.03', 'min': '0.01'},\n", - " 'name': '--lr',\n", - " 'parameterType': 'double'},\n", - " {'feasibleSpace': {'max': '5', 'min': '2'},\n", - " 'name': '--num-layers',\n", - " 'parameterType': 'int'}],\n", - " 'trialTemplate': {'goTemplate': {'rawTemplate': 'apiVersion: \"batch/v1\"\\nkind: Job\\nmetadata:\\n name: {{.Trial}}\\n namespace: {{.NameSpace}}\\nspec:\\n template:\\n spec:\\n containers:\\n - name: {{.Trial}}\\n image: docker.io/kubeflowkatib/mxnet-mnist\\n command:\\n - \"python3\"\\n - \"/opt/mxnet-mnist/mnist.py\"\\n - \"--batch-size=64\"\\n {{- with .HyperParameters}}\\n {{- range .}}\\n - \"{{.Name}}={{.Value}}\"\\n {{- end}}\\n {{- end}}\\n restartPolicy: Never'}}},\n", - " 'status': {'completionTime': None,\n", - " 'conditions': [{'lastTransitionTime': '2020-03-04T10:46:49Z',\n", - " 'lastUpdateTime': '2020-03-04T10:46:49Z',\n", - " 'message': 'Experiment is created',\n", - " 'reason': 'ExperimentCreated',\n", - " 'status': 'True',\n", - " 'type': 'Created'}],\n", - " 'currentOptimalTrial': {'bestTrialName': '',\n", - " 'observation': {'metrics': None},\n", - " 'parameterAssignments': None},\n", - " 'startTime': '2020-03-04T10:46:49Z'}}" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.get_experiment(name=\"bayesianoptimization\", namespace=namespace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get all Experiments" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'apiVersion': 'kubeflow.org/v1alpha3',\n", - " 'items': [{'apiVersion': 'kubeflow.org/v1alpha3',\n", - " 'kind': 'Experiment',\n", - " 'metadata': {'creationTimestamp': '2020-03-04T10:46:49Z',\n", - " 'finalizers': ['update-prometheus-metrics'],\n", - " 'generation': 1,\n", - " 'name': 'bayesianoptimization',\n", - " 'namespace': 'anonymous',\n", - " 'resourceVersion': '7034918',\n", - " 'selfLink': '/apis/kubeflow.org/v1alpha3/namespaces/anonymous/experiments/bayesianoptimization',\n", - " 'uid': '7360157b-5e05-11ea-8d71-42010aa00012'},\n", - " 'spec': {'algorithm': {'algorithmName': 'bayesianoptimization',\n", - " 'algorithmSettings': [{'name': 'random_state', 'value': '10'}]},\n", - " 'maxFailedTrialCount': 3,\n", - " 'maxTrialCount': 5,\n", - " 'metricsCollectorSpec': {'collector': {'kind': 'StdOut'}},\n", - " 'objective': {'goal': 0.9999,\n", - " 'objectiveMetricName': 'Validation-accuracy',\n", - " 'type': 'maximize'},\n", - " 'parallelTrialCount': 5,\n", - " 'parameters': [{'feasibleSpace': {'list': ['sgd', 'adam', 'ftrl']},\n", - " 'name': '--optimizer',\n", - " 'parameterType': 'categorical'},\n", - " {'feasibleSpace': {'max': '0.03', 'min': '0.01'},\n", - " 'name': '--lr',\n", - " 'parameterType': 'double'},\n", - " {'feasibleSpace': {'max': '5', 'min': '2'},\n", - " 'name': '--num-layers',\n", - " 'parameterType': 'int'}],\n", - " 'trialTemplate': {'goTemplate': {'rawTemplate': 'apiVersion: \"batch/v1\"\\nkind: Job\\nmetadata:\\n name: {{.Trial}}\\n namespace: {{.NameSpace}}\\nspec:\\n template:\\n spec:\\n containers:\\n - name: {{.Trial}}\\n image: docker.io/kubeflowkatib/mxnet-mnist\\n command:\\n - \"python3\"\\n - \"/opt/mxnet-mnist/mnist.py\"\\n - \"--batch-size=64\"\\n {{- with .HyperParameters}}\\n {{- range .}}\\n - \"{{.Name}}={{.Value}}\"\\n {{- end}}\\n {{- end}}\\n restartPolicy: Never'}}},\n", - " 'status': {'completionTime': None,\n", - " 'conditions': [{'lastTransitionTime': '2020-03-04T10:46:49Z',\n", - " 'lastUpdateTime': '2020-03-04T10:46:49Z',\n", - " 'message': 'Experiment is created',\n", - " 'reason': 'ExperimentCreated',\n", - " 'status': 'True',\n", - " 'type': 'Created'}],\n", - " 'currentOptimalTrial': {'bestTrialName': '',\n", - " 'observation': {'metrics': None},\n", - " 'parameterAssignments': None},\n", - " 'startTime': '2020-03-04T10:46:49Z'}}],\n", - " 'kind': 'ExperimentList',\n", - " 'metadata': {'continue': '',\n", - " 'resourceVersion': '7035035',\n", - " 'selfLink': '/apis/kubeflow.org/v1alpha3/namespaces/anonymous/experiments'}}" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.get_experiment()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get experiment status" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Running'" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.get_experiment_status(name=\"bayesianoptimization\", namespace=namespace)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Is experiment succeeded" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.is_experiment_succeeded(name=\"bayesianoptimization\", namespace=namespace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## List Trials of an experiment" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'name': 'bayesianoptimization-52tsscjq', 'status': 'Running'},\n", - " {'name': 'bayesianoptimization-65fnsn5t', 'status': 'Running'},\n", - " {'name': 'bayesianoptimization-d5blztvn', 'status': 'Running'},\n", - " {'name': 'bayesianoptimization-gs7b6g25', 'status': 'Running'},\n", - " {'name': 'bayesianoptimization-s8qwszvr', 'status': 'Running'}]" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.list_trials(name=\"bayesianoptimization\", namespace=namespace)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## List all experiments" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'name': 'bayesianoptimization', 'status': 'Running'}]" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.list_experiments(namespace=namespace)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get Optimal Hyperparameter" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'status': 'Succeeded',\n", - " 'currentOptimalTrial': {'bestTrialName': 'bayesianoptimization-nkj9hd9z',\n", - " 'observation': {'metrics': [{'name': 'Validation-accuracy',\n", - " 'value': 0.980195}]},\n", - " 'parameterAssignments': [{'name': '--optimizer', 'value': 'sgd'},\n", - " {'name': '--lr', 'value': '0.01721786775240965'},\n", - " {'name': '--num-layers', 'value': '3'}]}}" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.get_optimal_hyperparmeters(name=\"bayesianoptimization\", namespace=namespace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Delete experiment" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - " kclient.delete_experiment(name=\"bayesianoptimization\", namespace=namespace)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/sdk/python/v1alpha3/examples/tfjob-katib-sdk.ipynb b/sdk/python/v1alpha3/examples/tfjob-katib-sdk.ipynb deleted file mode 100644 index 07680200d71..00000000000 --- a/sdk/python/v1alpha3/examples/tfjob-katib-sdk.ipynb +++ /dev/null @@ -1,551 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "from kubernetes.client import V1ObjectMeta\n", - "import kubeflow.katib as kc\n", - "from kubeflow.katib import constants\n", - "from kubeflow.katib import utils\n", - "from kubeflow.katib import V1alpha3AlgorithmSetting\n", - "from kubeflow.katib import V1alpha3AlgorithmSetting\n", - "from kubeflow.katib import V1alpha3AlgorithmSpec\n", - "from kubeflow.katib import V1alpha3CollectorSpec\n", - "from kubeflow.katib import V1alpha3EarlyStoppingSetting\n", - "from kubeflow.katib import V1alpha3EarlyStoppingSpec\n", - "from kubeflow.katib import V1alpha3Experiment\n", - "from kubeflow.katib import V1alpha3ExperimentCondition\n", - "from kubeflow.katib import V1alpha3ExperimentList\n", - "from kubeflow.katib import V1alpha3ExperimentSpec\n", - "from kubeflow.katib import V1alpha3ExperimentStatus\n", - "from kubeflow.katib import V1alpha3FeasibleSpace\n", - "from kubeflow.katib import V1alpha3FileSystemPath\n", - "from kubeflow.katib import V1alpha3FilterSpec\n", - "from kubeflow.katib import V1alpha3GoTemplate\n", - "from kubeflow.katib import V1alpha3GraphConfig\n", - "from kubeflow.katib import V1alpha3Metric\n", - "from kubeflow.katib import V1alpha3MetricsCollectorSpec\n", - "from kubeflow.katib import V1alpha3NasConfig\n", - "from kubeflow.katib import V1alpha3ObjectiveSpec\n", - "from kubeflow.katib import V1alpha3Observation\n", - "from kubeflow.katib import V1alpha3Operation\n", - "from kubeflow.katib import V1alpha3OptimalTrial\n", - "from kubeflow.katib import V1alpha3ParameterAssignment\n", - "from kubeflow.katib import V1alpha3ParameterSpec\n", - "from kubeflow.katib import V1alpha3SourceSpec\n", - "from kubeflow.katib import V1alpha3Suggestion\n", - "from kubeflow.katib import V1alpha3SuggestionCondition\n", - "from kubeflow.katib import V1alpha3SuggestionList\n", - "from kubeflow.katib import V1alpha3SuggestionSpec\n", - "from kubeflow.katib import V1alpha3SuggestionStatus\n", - "from kubeflow.katib import V1alpha3TemplateSpec\n", - "from kubeflow.katib import V1alpha3Trial\n", - "from kubeflow.katib import V1alpha3TrialAssignment\n", - "from kubeflow.katib import V1alpha3TrialCondition\n", - "from kubeflow.katib import V1alpha3TrialList\n", - "from kubeflow.katib import V1alpha3TrialSpec\n", - "from kubeflow.katib import V1alpha3TrialStatus\n", - "from kubeflow.katib import V1alpha3TrialTemplate" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "algorithmsettings = V1alpha3AlgorithmSetting(\n", - " name= None,\n", - " value = None\n", - " )\n", - "algorithm = V1alpha3AlgorithmSpec(\n", - " algorithm_name = \"random\",\n", - " algorithm_settings = [algorithmsettings]\n", - " )\n", - "\n", - "# Metric Collector\n", - "collector = V1alpha3CollectorSpec(kind = \"TensorFlowEvent\")\n", - "FileSystemPath = V1alpha3FileSystemPath(kind = \"/train\" , path = \"Directory\")\n", - "metrics_collector_spec = V1alpha3MetricsCollectorSpec(\n", - " collector = collector,\n", - " source = FileSystemPath)\n", - "\n", - "# Objective\n", - "objective = V1alpha3ObjectiveSpec(\n", - " goal = 0.9999,\n", - " objective_metric_name = \"accuracy_1\",\n", - " type = \"maximize\")\n", - "\n", - "# Parameters\n", - "feasible_space = V1alpha3FeasibleSpace(min = \"100\", max = \"200\")\n", - "parameters = [V1alpha3ParameterSpec(\n", - " feasible_space = feasible_space, \n", - " name = \"--batch_size\",\n", - " parameter_type = \"int\"\n", - " )]\n", - "\n", - "# Trialtemplate\n", - "go_template = V1alpha3GoTemplate(\n", - " raw_template = \"apiVersion: \\\"kubeflow.org/v1\\\"\\nkind: TFJob\\nmetadata:\\n name: {{.Trial}}\\n namespace: {{.NameSpace}}\\nspec:\\n tfReplicaSpecs:\\n Worker:\\n replicas: 1\\n restartPolicy: OnFailure\\n template:\\n spec:\\n containers:\\n - name: tensorflow\\n image: gcr.io/kubeflow-ci/tf-mnist-with-summaries:1.0\\n imagePullPolicy: Always\\n command:\\n - \\\"python\\\"\\n - \\\"/var/tf_mnist/mnist_with_summaries.py\\\"\\n - \\\"--log_dir=/train/metrics\\\"\\n {{- with .HyperParameters}}\\n {{- range .}}\\n - \\\"{{.Name}}={{.Value}}\\\"\\n {{- end}}\\n {{- end}}\"\n", - " )\n", - "\n", - "\n", - "trial_template= V1alpha3TrialTemplate(go_template=go_template)\n", - "\n", - "\n", - "# Experiment\n", - "experiment = V1alpha3Experiment(\n", - " api_version=\"kubeflow.org/v1alpha3\",\n", - " kind=\"Experiment\",\n", - " metadata=V1ObjectMeta(name=\"tfjob-example\",namespace=\"anonymous\"),\n", - "\n", - " spec=V1alpha3ExperimentSpec(\n", - " algorithm = algorithm,\n", - " max_failed_trial_count=3,\n", - " max_trial_count=12,\n", - " metrics_collector_spec= metrics_collector_spec ,\n", - " objective = objective,\n", - " parallel_trial_count=4,\n", - " parameters = parameters ,\n", - " trial_template = trial_template\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "namespace = kc.utils.get_default_target_namespace()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "kclient = kc.KatibClient()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Create Experiment" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "Katib Experiment link here" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "text/plain": [ - "{'apiVersion': 'kubeflow.org/v1alpha3',\n", - " 'kind': 'Experiment',\n", - " 'metadata': {'creationTimestamp': '2020-03-04T10:50:02Z',\n", - " 'generation': 1,\n", - " 'name': 'tfjob-example',\n", - " 'namespace': 'anonymous',\n", - " 'resourceVersion': '7037041',\n", - " 'selfLink': '/apis/kubeflow.org/v1alpha3/namespaces/anonymous/experiments/tfjob-example',\n", - " 'uid': 'e6d578d8-5e05-11ea-8d71-42010aa00012'},\n", - " 'spec': {'algorithm': {'algorithmName': 'random', 'algorithmSettings': [{}]},\n", - " 'maxFailedTrialCount': 3,\n", - " 'maxTrialCount': 12,\n", - " 'metricsCollectorSpec': {'collector': {'kind': 'TensorFlowEvent'},\n", - " 'source': {'fileSystemPath': {'kind': 'Directory',\n", - " 'path': '/var/log/katib/tfevent/'},\n", - " 'kind': '/train',\n", - " 'path': 'Directory'}},\n", - " 'objective': {'goal': 0.9999,\n", - " 'objectiveMetricName': 'accuracy_1',\n", - " 'type': 'maximize'},\n", - " 'parallelTrialCount': 4,\n", - " 'parameters': [{'feasibleSpace': {'max': '200', 'min': '100'},\n", - " 'name': '--batch_size',\n", - " 'parameterType': 'int'}],\n", - " 'trialTemplate': {'goTemplate': {'rawTemplate': 'apiVersion: \"kubeflow.org/v1\"\\nkind: TFJob\\nmetadata:\\n name: {{.Trial}}\\n namespace: {{.NameSpace}}\\nspec:\\n tfReplicaSpecs:\\n Worker:\\n replicas: 1\\n restartPolicy: OnFailure\\n template:\\n spec:\\n containers:\\n - name: tensorflow\\n image: gcr.io/kubeflow-ci/tf-mnist-with-summaries:1.0\\n imagePullPolicy: Always\\n command:\\n - \"python\"\\n - \"/var/tf_mnist/mnist_with_summaries.py\"\\n - \"--log_dir=/train/metrics\"\\n {{- with .HyperParameters}}\\n {{- range .}}\\n - \"{{.Name}}={{.Value}}\"\\n {{- end}}\\n {{- end}}'}}}}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.create_experiment(experiment,namespace=namespace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get Single Experiment" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'apiVersion': 'kubeflow.org/v1alpha3',\n", - " 'kind': 'Experiment',\n", - " 'metadata': {'creationTimestamp': '2020-03-04T10:50:02Z',\n", - " 'finalizers': ['update-prometheus-metrics'],\n", - " 'generation': 2,\n", - " 'name': 'tfjob-example',\n", - " 'namespace': 'anonymous',\n", - " 'resourceVersion': '7037043',\n", - " 'selfLink': '/apis/kubeflow.org/v1alpha3/namespaces/anonymous/experiments/tfjob-example',\n", - " 'uid': 'e6d578d8-5e05-11ea-8d71-42010aa00012'},\n", - " 'spec': {'algorithm': {'algorithmName': 'random', 'algorithmSettings': [{}]},\n", - " 'maxFailedTrialCount': 3,\n", - " 'maxTrialCount': 12,\n", - " 'metricsCollectorSpec': {'collector': {'kind': 'TensorFlowEvent'},\n", - " 'source': {'fileSystemPath': {'kind': 'Directory',\n", - " 'path': '/var/log/katib/tfevent/'}}},\n", - " 'objective': {'goal': 0.9999,\n", - " 'objectiveMetricName': 'accuracy_1',\n", - " 'type': 'maximize'},\n", - " 'parallelTrialCount': 4,\n", - " 'parameters': [{'feasibleSpace': {'max': '200', 'min': '100'},\n", - " 'name': '--batch_size',\n", - " 'parameterType': 'int'}],\n", - " 'trialTemplate': {'goTemplate': {'rawTemplate': 'apiVersion: \"kubeflow.org/v1\"\\nkind: TFJob\\nmetadata:\\n name: {{.Trial}}\\n namespace: {{.NameSpace}}\\nspec:\\n tfReplicaSpecs:\\n Worker:\\n replicas: 1\\n restartPolicy: OnFailure\\n template:\\n spec:\\n containers:\\n - name: tensorflow\\n image: gcr.io/kubeflow-ci/tf-mnist-with-summaries:1.0\\n imagePullPolicy: Always\\n command:\\n - \"python\"\\n - \"/var/tf_mnist/mnist_with_summaries.py\"\\n - \"--log_dir=/train/metrics\"\\n {{- with .HyperParameters}}\\n {{- range .}}\\n - \"{{.Name}}={{.Value}}\"\\n {{- end}}\\n {{- end}}'}}},\n", - " 'status': {'completionTime': None,\n", - " 'conditions': [{'lastTransitionTime': '2020-03-04T10:50:02Z',\n", - " 'lastUpdateTime': '2020-03-04T10:50:02Z',\n", - " 'message': 'Experiment is created',\n", - " 'reason': 'ExperimentCreated',\n", - " 'status': 'True',\n", - " 'type': 'Created'}],\n", - " 'currentOptimalTrial': {'bestTrialName': '',\n", - " 'observation': {'metrics': None},\n", - " 'parameterAssignments': None},\n", - " 'startTime': '2020-03-04T10:50:02Z'}}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.get_experiment(name=\"tfjob-example\", namespace=namespace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get all Experiments" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'apiVersion': 'kubeflow.org/v1alpha3',\n", - " 'items': [{'apiVersion': 'kubeflow.org/v1alpha3',\n", - " 'kind': 'Experiment',\n", - " 'metadata': {'creationTimestamp': '2020-03-04T10:46:49Z',\n", - " 'finalizers': ['update-prometheus-metrics'],\n", - " 'generation': 1,\n", - " 'name': 'bayesianoptimization',\n", - " 'namespace': 'anonymous',\n", - " 'resourceVersion': '7036404',\n", - " 'selfLink': '/apis/kubeflow.org/v1alpha3/namespaces/anonymous/experiments/bayesianoptimization',\n", - " 'uid': '7360157b-5e05-11ea-8d71-42010aa00012'},\n", - " 'spec': {'algorithm': {'algorithmName': 'bayesianoptimization',\n", - " 'algorithmSettings': [{'name': 'random_state', 'value': '10'}]},\n", - " 'maxFailedTrialCount': 3,\n", - " 'maxTrialCount': 5,\n", - " 'metricsCollectorSpec': {'collector': {'kind': 'StdOut'}},\n", - " 'objective': {'goal': 0.9999,\n", - " 'objectiveMetricName': 'Validation-accuracy',\n", - " 'type': 'maximize'},\n", - " 'parallelTrialCount': 5,\n", - " 'parameters': [{'feasibleSpace': {'list': ['sgd', 'adam', 'ftrl']},\n", - " 'name': '--optimizer',\n", - " 'parameterType': 'categorical'},\n", - " {'feasibleSpace': {'max': '0.03', 'min': '0.01'},\n", - " 'name': '--lr',\n", - " 'parameterType': 'double'},\n", - " {'feasibleSpace': {'max': '5', 'min': '2'},\n", - " 'name': '--num-layers',\n", - " 'parameterType': 'int'}],\n", - " 'trialTemplate': {'goTemplate': {'rawTemplate': 'apiVersion: \"batch/v1\"\\nkind: Job\\nmetadata:\\n name: {{.Trial}}\\n namespace: {{.NameSpace}}\\nspec:\\n template:\\n spec:\\n containers:\\n - name: {{.Trial}}\\n image: docker.io/kubeflowkatib/mxnet-mnist\\n command:\\n - \"python3\"\\n - \"/opt/mxnet-mnist/mnist.py\"\\n - \"--batch-size=64\"\\n {{- with .HyperParameters}}\\n {{- range .}}\\n - \"{{.Name}}={{.Value}}\"\\n {{- end}}\\n {{- end}}\\n restartPolicy: Never'}}},\n", - " 'status': {'conditions': [{'lastTransitionTime': '2020-03-04T10:46:49Z',\n", - " 'lastUpdateTime': '2020-03-04T10:46:49Z',\n", - " 'message': 'Experiment is created',\n", - " 'reason': 'ExperimentCreated',\n", - " 'status': 'True',\n", - " 'type': 'Created'},\n", - " {'lastTransitionTime': '2020-03-04T10:47:03Z',\n", - " 'lastUpdateTime': '2020-03-04T10:47:03Z',\n", - " 'message': 'Experiment is running',\n", - " 'reason': 'ExperimentRunning',\n", - " 'status': 'True',\n", - " 'type': 'Running'}],\n", - " 'currentOptimalTrial': {'bestTrialName': 'bayesianoptimization-d5blztvn',\n", - " 'observation': {'metrics': [{'name': 'Validation-accuracy',\n", - " 'value': 0.978404}]},\n", - " 'parameterAssignments': [{'name': '--optimizer', 'value': 'sgd'},\n", - " {'name': '--lr', 'value': '0.021196507397563884'},\n", - " {'name': '--num-layers', 'value': '4'}]},\n", - " 'runningTrialList': ['bayesianoptimization-gs7b6g25'],\n", - " 'startTime': '2020-03-04T10:46:49Z',\n", - " 'succeededTrialList': ['bayesianoptimization-52tsscjq',\n", - " 'bayesianoptimization-65fnsn5t',\n", - " 'bayesianoptimization-d5blztvn',\n", - " 'bayesianoptimization-s8qwszvr'],\n", - " 'trials': 5,\n", - " 'trialsRunning': 1,\n", - " 'trialsSucceeded': 4}},\n", - " {'apiVersion': 'kubeflow.org/v1alpha3',\n", - " 'kind': 'Experiment',\n", - " 'metadata': {'creationTimestamp': '2020-03-04T10:50:02Z',\n", - " 'finalizers': ['update-prometheus-metrics'],\n", - " 'generation': 2,\n", - " 'name': 'tfjob-example',\n", - " 'namespace': 'anonymous',\n", - " 'resourceVersion': '7037043',\n", - " 'selfLink': '/apis/kubeflow.org/v1alpha3/namespaces/anonymous/experiments/tfjob-example',\n", - " 'uid': 'e6d578d8-5e05-11ea-8d71-42010aa00012'},\n", - " 'spec': {'algorithm': {'algorithmName': 'random',\n", - " 'algorithmSettings': [{}]},\n", - " 'maxFailedTrialCount': 3,\n", - " 'maxTrialCount': 12,\n", - " 'metricsCollectorSpec': {'collector': {'kind': 'TensorFlowEvent'},\n", - " 'source': {'fileSystemPath': {'kind': 'Directory',\n", - " 'path': '/var/log/katib/tfevent/'}}},\n", - " 'objective': {'goal': 0.9999,\n", - " 'objectiveMetricName': 'accuracy_1',\n", - " 'type': 'maximize'},\n", - " 'parallelTrialCount': 4,\n", - " 'parameters': [{'feasibleSpace': {'max': '200', 'min': '100'},\n", - " 'name': '--batch_size',\n", - " 'parameterType': 'int'}],\n", - " 'trialTemplate': {'goTemplate': {'rawTemplate': 'apiVersion: \"kubeflow.org/v1\"\\nkind: TFJob\\nmetadata:\\n name: {{.Trial}}\\n namespace: {{.NameSpace}}\\nspec:\\n tfReplicaSpecs:\\n Worker:\\n replicas: 1\\n restartPolicy: OnFailure\\n template:\\n spec:\\n containers:\\n - name: tensorflow\\n image: gcr.io/kubeflow-ci/tf-mnist-with-summaries:1.0\\n imagePullPolicy: Always\\n command:\\n - \"python\"\\n - \"/var/tf_mnist/mnist_with_summaries.py\"\\n - \"--log_dir=/train/metrics\"\\n {{- with .HyperParameters}}\\n {{- range .}}\\n - \"{{.Name}}={{.Value}}\"\\n {{- end}}\\n {{- end}}'}}},\n", - " 'status': {'completionTime': None,\n", - " 'conditions': [{'lastTransitionTime': '2020-03-04T10:50:02Z',\n", - " 'lastUpdateTime': '2020-03-04T10:50:02Z',\n", - " 'message': 'Experiment is created',\n", - " 'reason': 'ExperimentCreated',\n", - " 'status': 'True',\n", - " 'type': 'Created'}],\n", - " 'currentOptimalTrial': {'bestTrialName': '',\n", - " 'observation': {'metrics': None},\n", - " 'parameterAssignments': None},\n", - " 'startTime': '2020-03-04T10:50:02Z'}}],\n", - " 'kind': 'ExperimentList',\n", - " 'metadata': {'continue': '',\n", - " 'resourceVersion': '7037091',\n", - " 'selfLink': '/apis/kubeflow.org/v1alpha3/namespaces/anonymous/experiments'}}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.get_experiment(namespace=namespace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get experiment status" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Created'" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.get_experiment_status(name=\"tfjob-example\", namespace=namespace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Is experiment succeeded" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.is_experiment_succeeded(name=\"tfjob-example\", namespace=namespace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## List Trials of a experiment" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'name': 'tfjob-example-fl9h8gpv', 'status': 'Running'},\n", - " {'name': 'tfjob-example-gg2wl8gl', 'status': 'Running'},\n", - " {'name': 'tfjob-example-gh6s9htw', 'status': 'Created'},\n", - " {'name': 'tfjob-example-w774npf9', 'status': 'Running'}]" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.list_trials(name=\"tfjob-example\", namespace=namespace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## List all Experiments" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'name': 'bayesianoptimization', 'status': 'Succeeded'},\n", - " {'name': 'tfjob-example', 'status': 'Running'}]" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "kclient.list_experiments(namespace=namespace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get Optimal Hyperparameter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "kclient.get_optimal_hyperparmeters(name=\"tfjob-example\", namespace=namespace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Delete experiment" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "kclient.delete_experiment(name=\"tfjob-example\", namespace=namespace)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/sdk/python/v1alpha3/kubeflow/__init__.py b/sdk/python/v1alpha3/kubeflow/__init__.py deleted file mode 100644 index 69e3be50dac..00000000000 --- a/sdk/python/v1alpha3/kubeflow/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/sdk/python/v1alpha3/kubeflow/katib/__init__.py b/sdk/python/v1alpha3/kubeflow/katib/__init__.py deleted file mode 100644 index 6f721bf7153..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/__init__.py +++ /dev/null @@ -1,64 +0,0 @@ -# coding: utf-8 - -# flake8: noqa - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -# import apis into sdk package - -# import ApiClient -from kubeflow.katib.api_client import ApiClient -from kubeflow.katib.configuration import Configuration -# import models into sdk package -from kubeflow.katib.models.v1alpha3_algorithm_setting import V1alpha3AlgorithmSetting -from kubeflow.katib.models.v1alpha3_algorithm_spec import V1alpha3AlgorithmSpec -from kubeflow.katib.models.v1alpha3_collector_spec import V1alpha3CollectorSpec -from kubeflow.katib.models.v1alpha3_early_stopping_setting import V1alpha3EarlyStoppingSetting -from kubeflow.katib.models.v1alpha3_early_stopping_spec import V1alpha3EarlyStoppingSpec -from kubeflow.katib.models.v1alpha3_experiment import V1alpha3Experiment -from kubeflow.katib.models.v1alpha3_experiment_condition import V1alpha3ExperimentCondition -from kubeflow.katib.models.v1alpha3_experiment_list import V1alpha3ExperimentList -from kubeflow.katib.models.v1alpha3_experiment_spec import V1alpha3ExperimentSpec -from kubeflow.katib.models.v1alpha3_experiment_status import V1alpha3ExperimentStatus -from kubeflow.katib.models.v1alpha3_feasible_space import V1alpha3FeasibleSpace -from kubeflow.katib.models.v1alpha3_file_system_path import V1alpha3FileSystemPath -from kubeflow.katib.models.v1alpha3_filter_spec import V1alpha3FilterSpec -from kubeflow.katib.models.v1alpha3_go_template import V1alpha3GoTemplate -from kubeflow.katib.models.v1alpha3_graph_config import V1alpha3GraphConfig -from kubeflow.katib.models.v1alpha3_metric import V1alpha3Metric -from kubeflow.katib.models.v1alpha3_metrics_collector_spec import V1alpha3MetricsCollectorSpec -from kubeflow.katib.models.v1alpha3_nas_config import V1alpha3NasConfig -from kubeflow.katib.models.v1alpha3_objective_spec import V1alpha3ObjectiveSpec -from kubeflow.katib.models.v1alpha3_observation import V1alpha3Observation -from kubeflow.katib.models.v1alpha3_operation import V1alpha3Operation -from kubeflow.katib.models.v1alpha3_optimal_trial import V1alpha3OptimalTrial -from kubeflow.katib.models.v1alpha3_parameter_assignment import V1alpha3ParameterAssignment -from kubeflow.katib.models.v1alpha3_parameter_spec import V1alpha3ParameterSpec -from kubeflow.katib.models.v1alpha3_source_spec import V1alpha3SourceSpec -from kubeflow.katib.models.v1alpha3_suggestion import V1alpha3Suggestion -from kubeflow.katib.models.v1alpha3_suggestion_condition import V1alpha3SuggestionCondition -from kubeflow.katib.models.v1alpha3_suggestion_list import V1alpha3SuggestionList -from kubeflow.katib.models.v1alpha3_suggestion_spec import V1alpha3SuggestionSpec -from kubeflow.katib.models.v1alpha3_suggestion_status import V1alpha3SuggestionStatus -from kubeflow.katib.models.v1alpha3_template_spec import V1alpha3TemplateSpec -from kubeflow.katib.models.v1alpha3_trial import V1alpha3Trial -from kubeflow.katib.models.v1alpha3_trial_assignment import V1alpha3TrialAssignment -from kubeflow.katib.models.v1alpha3_trial_condition import V1alpha3TrialCondition -from kubeflow.katib.models.v1alpha3_trial_list import V1alpha3TrialList -from kubeflow.katib.models.v1alpha3_trial_spec import V1alpha3TrialSpec -from kubeflow.katib.models.v1alpha3_trial_status import V1alpha3TrialStatus -from kubeflow.katib.models.v1alpha3_trial_template import V1alpha3TrialTemplate - -# Import Katib API client -from kubeflow.katib.api.katib_client import KatibClient diff --git a/sdk/python/v1alpha3/kubeflow/katib/api/__init__.py b/sdk/python/v1alpha3/kubeflow/katib/api/__init__.py deleted file mode 100644 index 36dce7fe221..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/api/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import absolute_import - -# flake8: noqa - -# import apis into api package diff --git a/sdk/python/v1alpha3/kubeflow/katib/api/katib_client.py b/sdk/python/v1alpha3/kubeflow/katib/api/katib_client.py deleted file mode 100644 index 3dc95bff00f..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/api/katib_client.py +++ /dev/null @@ -1,290 +0,0 @@ -# Copyright 2019 The Kubeflow Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import multiprocessing -import time - -from kubernetes import client, config - -from kubeflow.katib.constants import constants -from kubeflow.katib.utils import utils - - -class KatibClient(object): - - def __init__(self, config_file=None, context=None, # pylint: disable=too-many-arguments - client_configuration=None, persist_config=True): - """ - katibclient constructor - :param config_file: kubeconfig file, defaults to ~/.kube/config - :param context: kubernetes context - :param client_configuration: kubernetes configuration object - :param persist_config: - """ - self.in_cluster = None - if config_file or not utils.is_running_in_k8s(): - config.load_kube_config( - config_file=config_file, - context=context, - client_configuration=client_configuration, - persist_config=persist_config) - self.in_cluster = False - else: - config.load_incluster_config() - self.in_cluster = True - - self.api_instance = client.CustomObjectsApi() - - def _is_ipython(self): - """Returns whether we are running in notebook.""" - try: - import IPython - ipy = IPython.get_ipython() - if ipy is None: - return False - except ImportError: - return False - return True - - def create_experiment(self, exp_object, namespace=None): - """ - Create the katib experiment - :param exp_object: experiment object - :param namespace: defaults to current or default namespace - :return: created experiment dict - """ - - if namespace is None: - namespace = utils.set_katib_namespace(exp_object) - try: - outputs = self.api_instance.create_namespaced_custom_object( - constants.EXPERIMENT_GROUP, - constants.EXPERIMENT_VERSION, - namespace, - constants.EXPERIMENT_PLURAL, - exp_object) - except client.rest.ApiException as e: - raise RuntimeError( - "Exception when calling CustomObjectsApi->create_namespaced_custom_object:\ - %s\n" % e) - - if self._is_ipython(): - if self.in_cluster: - import IPython - html = \ - ('Katib Experiment link here' - % (namespace, exp_object.metadata.name)) - IPython.display.display(IPython.display.HTML(html)) - self.in_cluster = None - return outputs - - def get_experiment(self, name=None, namespace=None): - """ - Get single experiment or all experiment - :param name: existing experiment name optional - :param namespace: defaults to current or default namespace - :return: experiment dict - """ - if namespace is None: - namespace = utils.get_default_target_namespace() - - if name: - thread = self.api_instance.get_namespaced_custom_object( - constants.EXPERIMENT_GROUP, - constants.EXPERIMENT_VERSION, - namespace, - constants.EXPERIMENT_PLURAL, - name, - async_req=True) - - katibexp = None - try: - katibexp = thread.get(constants.APISERVER_TIMEOUT) - except multiprocessing.TimeoutError: - raise RuntimeError("Timeout trying to get katib experiment.") - except client.rest.ApiException as e: - raise RuntimeError( - "Exception when calling CustomObjectsApi->get_namespaced_custom_object:\ - %s\n" % e) - except Exception as e: - raise RuntimeError( - "There was a problem to get experiment {0} in namespace {1}. Exception: \ - {2} ".format(name, namespace, e)) - - else: - thread = self.api_instance.list_namespaced_custom_object( - constants.EXPERIMENT_GROUP, - constants.EXPERIMENT_VERSION, - namespace, - constants.EXPERIMENT_PLURAL, - async_req=True) - - katibexp = None - try: - katibexp = thread.get(constants.APISERVER_TIMEOUT) - except multiprocessing.TimeoutError: - raise RuntimeError("Timeout trying to get Experiment.") - except client.rest.ApiException as e: - raise RuntimeError( - "Exception when calling CustomObjectsApi->list_namespaced_custom_object:\ - %s\n" % e) - except Exception as e: - raise RuntimeError( - "There was a problem to get experiment in namespace {0}. \ - Exception: {1} ".format(namespace, e)) - - return katibexp - - def delete_experiment(self, name, namespace=None): - """ - Delete experiment - :param name: experiment name required - :param namespace: defaults to current or default namespace - :return: status dict - """ - if namespace is None: - namespace = utils.get_default_target_namespace() - - try: - return self.api_instance.delete_namespaced_custom_object( - constants.EXPERIMENT_GROUP, - constants.EXPERIMENT_VERSION, - namespace, - constants.EXPERIMENT_PLURAL, - name, - body=client.V1DeleteOptions()) - except client.rest.ApiException as e: - raise RuntimeError( - "Exception when calling CustomObjectsApi->delete_namespaced_custom_object:\ - %s\n" % e) - - def list_experiments(self, namespace=None): - """ - List all experiments - :param namespace: defaults to current or default namespace - :return: list of experiment name with status as list - """ - if namespace is None: - namespace = utils.get_default_target_namespace() - - thread = self.api_instance.list_namespaced_custom_object( - constants.EXPERIMENT_GROUP, - constants.EXPERIMENT_VERSION, - namespace=namespace, - plural=constants.EXPERIMENT_PLURAL, - async_req=True) - - katibexp = None - try: - katibexp = thread.get(constants.APISERVER_TIMEOUT) - result = [] - for i in katibexp.get("items"): - output = {} - output["name"] = i.get("metadata", {}).get("name") - output["status"] = i.get("status", {}).get( - "conditions", [])[-1].get("type") - result.append(output) - except multiprocessing.TimeoutError: - raise RuntimeError("Timeout trying to get katib experiment.") - except client.rest.ApiException as e: - raise RuntimeError( - "Exception when calling CustomObjectsApi->get_namespaced_custom_object:\ - %s\n" % e) - except Exception as e: - raise RuntimeError( - "There was a problem to get experiment {0} in namespace {1}. Exception: \ - {2} ".format(name, namespace, e)) - return result - - def get_experiment_status(self, name, namespace=None): - """Returns experiment status, such as Running, Failed or Succeeded. - Args: - :param name: An experiment name. required - :param namespace: defaults to current or default namespace. - :return: status str - """ - if namespace is None: - namespace = utils.get_default_target_namespace() - - katibexp = self.get_experiment(name, namespace=namespace) - last_condition = katibexp.get("status", {}).get("conditions", [])[-1] - return last_condition.get("type", "") - - def is_experiment_succeeded(self, name, namespace=None): - """Returns true if experiment succeeded; false otherwise. - Args: - :param name: An experiment name. required - :param namespace: defaults to current or default namespace. optional - :return: status bool - """ - experiment_status = self.get_experiment_status( - name, namespace=namespace) - return experiment_status.lower() == "succeeded" - - def list_trials(self, name=None, namespace=None): - """ - Get trials of an experiment - :param name: existing experiment name - :param namespace: defaults to current or default namespace - :return: trials name with status as list - """ - if namespace is None: - namespace = utils.get_default_target_namespace() - - thread = self.api_instance.list_namespaced_custom_object( - constants.EXPERIMENT_GROUP, - constants.EXPERIMENT_VERSION, - namespace=namespace, - plural=constants.TRIAL_PLURAL, - async_req=True) - - katibtrial = None - try: - katibtrial = thread.get(constants.APISERVER_TIMEOUT) - result = [] - for i in katibtrial.get("items"): - output = {} - if i.get("metadata", {}).get("ownerReferences")[0].get("name") == name: - output["name"] = i.get("metadata", {}).get("name") - output["status"] = i.get("status", {}).get( - "conditions", [])[-1].get("type") - result.append(output) - except multiprocessing.TimeoutError: - raise RuntimeError("Timeout trying to getkatib experiment.") - except client.rest.ApiException as e: - raise RuntimeError( - "Exception when calling CustomObjectsApi->get_namespaced_custom_object:\ - %s\n" % e) - except Exception as e: - raise RuntimeError( - "There was a problem to get experiment {0} in namespace {1}. Exception: \ - {2} ".format(name, namespace, e)) - return result - - def get_optimal_hyperparmeters(self, name=None, namespace=None): - """ - Get status, currentOptimalTrial with paramaterAssignments - :param name: existing experiment name - :param namespace: defaults to current or default namespace - :return: dict with status, currentOptimalTrial with paramaterAssignments of an experiment - """ - if namespace is None: - namespace = utils.get_default_target_namespace() - - katibexp = self.get_experiment(name, namespace=namespace) - result = {} - result["currentOptimalTrial"] = katibexp.get( - "status", {}).get("currentOptimalTrial") - - return result - diff --git a/sdk/python/v1alpha3/kubeflow/katib/api_client.py b/sdk/python/v1alpha3/kubeflow/katib/api_client.py deleted file mode 100644 index 1e7d8174872..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/api_client.py +++ /dev/null @@ -1,638 +0,0 @@ -# coding: utf-8 -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - -from __future__ import absolute_import - -import datetime -import json -import mimetypes -from multiprocessing.pool import ThreadPool -import os -import re -import tempfile - -# python 2 and python 3 compatibility library -import six -from six.moves.urllib.parse import quote - -from kubeflow.katib.configuration import Configuration -import kubeflow.katib.models -from kubeflow.katib import rest - - -class ApiClient(object): - """Generic API client for Swagger client library builds. - - Swagger generic API client. This client handles the client- - server communication, and is invariant across implementations. Specifics of - the methods and models for each application are generated from the Swagger - templates. - - NOTE: This class is auto generated by the swagger code generator program. - Ref: https://github.com/swagger-api/swagger-codegen - Do not edit the class manually. - - :param configuration: .Configuration object for this client - :param header_name: a header to pass when making calls to the API. - :param header_value: a header value to pass when making calls to - the API. - :param cookie: a cookie to include in the header when making calls - to the API - """ - - PRIMITIVE_TYPES = (float, bool, bytes, six.text_type) + six.integer_types - NATIVE_TYPES_MAPPING = { - 'int': int, - 'long': int if six.PY3 else long, # noqa: F821 - 'float': float, - 'str': str, - 'bool': bool, - 'date': datetime.date, - 'datetime': datetime.datetime, - 'object': object, - } - - def __init__(self, configuration=None, header_name=None, header_value=None, - cookie=None): - if configuration is None: - configuration = Configuration() - self.configuration = configuration - - # Use the pool property to lazily initialize the ThreadPool. - self._pool = None - self.rest_client = rest.RESTClientObject(configuration) - self.default_headers = {} - if header_name is not None: - self.default_headers[header_name] = header_value - self.cookie = cookie - # Set default User-Agent. - self.user_agent = 'Swagger-Codegen/0.1/python' - - def __del__(self): - if self._pool is not None: - self._pool.close() - self._pool.join() - - @property - def pool(self): - if self._pool is None: - self._pool = ThreadPool() - return self._pool - - @property - def user_agent(self): - """User agent for this API client""" - return self.default_headers['User-Agent'] - - @user_agent.setter - def user_agent(self, value): - self.default_headers['User-Agent'] = value - - def set_default_header(self, header_name, header_value): - self.default_headers[header_name] = header_value - - def __call_api( - self, resource_path, method, path_params=None, - query_params=None, header_params=None, body=None, post_params=None, - files=None, response_type=None, auth_settings=None, - _return_http_data_only=None, collection_formats=None, - _preload_content=True, _request_timeout=None): - - config = self.configuration - - # header parameters - header_params = header_params or {} - header_params.update(self.default_headers) - if self.cookie: - header_params['Cookie'] = self.cookie - if header_params: - header_params = self.sanitize_for_serialization(header_params) - header_params = dict(self.parameters_to_tuples(header_params, - collection_formats)) - - # path parameters - if path_params: - path_params = self.sanitize_for_serialization(path_params) - path_params = self.parameters_to_tuples(path_params, - collection_formats) - for k, v in path_params: - # specified safe chars, encode everything - resource_path = resource_path.replace( - '{%s}' % k, - quote(str(v), safe=config.safe_chars_for_path_param) - ) - - # query parameters - if query_params: - query_params = self.sanitize_for_serialization(query_params) - query_params = self.parameters_to_tuples(query_params, - collection_formats) - - # post parameters - if post_params or files: - post_params = self.prepare_post_parameters(post_params, files) - post_params = self.sanitize_for_serialization(post_params) - post_params = self.parameters_to_tuples(post_params, - collection_formats) - - # auth setting - self.update_params_for_auth(header_params, query_params, auth_settings) - - # body - if body: - body = self.sanitize_for_serialization(body) - - # request url - url = self.configuration.host + resource_path - - # perform request and return response - response_data = self.request( - method, url, query_params=query_params, headers=header_params, - post_params=post_params, body=body, - _preload_content=_preload_content, - _request_timeout=_request_timeout) - - self.last_response = response_data - - return_data = response_data - if _preload_content: - # deserialize response data - if response_type: - return_data = self.deserialize(response_data, response_type) - else: - return_data = None - - if _return_http_data_only: - return (return_data) - else: - return (return_data, response_data.status, - response_data.getheaders()) - - def sanitize_for_serialization(self, obj): - """Builds a JSON POST object. - - If obj is None, return None. - If obj is str, int, long, float, bool, return directly. - If obj is datetime.datetime, datetime.date - convert to string in iso8601 format. - If obj is list, sanitize each element in the list. - If obj is dict, return the dict. - If obj is swagger model, return the properties dict. - - :param obj: The data to serialize. - :return: The serialized form of data. - """ - if obj is None: - return None - elif isinstance(obj, self.PRIMITIVE_TYPES): - return obj - elif isinstance(obj, list): - return [self.sanitize_for_serialization(sub_obj) - for sub_obj in obj] - elif isinstance(obj, tuple): - return tuple(self.sanitize_for_serialization(sub_obj) - for sub_obj in obj) - elif isinstance(obj, (datetime.datetime, datetime.date)): - return obj.isoformat() - - if isinstance(obj, dict): - obj_dict = obj - else: - # Convert model obj to dict except - # attributes `swagger_types`, `attribute_map` - # and attributes which value is not None. - # Convert attribute name to json key in - # model definition for request. - obj_dict = {obj.attribute_map[attr]: getattr(obj, attr) - for attr, _ in six.iteritems(obj.swagger_types) - if getattr(obj, attr) is not None} - - return {key: self.sanitize_for_serialization(val) - for key, val in six.iteritems(obj_dict)} - - def deserialize(self, response, response_type): - """Deserializes response into an object. - - :param response: RESTResponse object to be deserialized. - :param response_type: class literal for - deserialized object, or string of class name. - - :return: deserialized object. - """ - # handle file downloading - # save response body into a tmp file and return the instance - if response_type == "file": - return self.__deserialize_file(response) - - # fetch data from response object - try: - data = json.loads(response.data) - except ValueError: - data = response.data - - return self.__deserialize(data, response_type) - - def __deserialize(self, data, klass): - """Deserializes dict, list, str into an object. - - :param data: dict, list or str. - :param klass: class literal, or string of class name. - - :return: object. - """ - if data is None: - return None - - if type(klass) == str: - if klass.startswith('list['): - sub_kls = re.match(r'list\[(.*)\]', klass).group(1) - return [self.__deserialize(sub_data, sub_kls) - for sub_data in data] - - if klass.startswith('dict('): - sub_kls = re.match(r'dict\(([^,]*), (.*)\)', klass).group(2) - return {k: self.__deserialize(v, sub_kls) - for k, v in six.iteritems(data)} - - # convert str to class - if klass in self.NATIVE_TYPES_MAPPING: - klass = self.NATIVE_TYPES_MAPPING[klass] - else: - klass = getattr(katib.models, klass) - - if klass in self.PRIMITIVE_TYPES: - return self.__deserialize_primitive(data, klass) - elif klass == object: - return self.__deserialize_object(data) - elif klass == datetime.date: - return self.__deserialize_date(data) - elif klass == datetime.datetime: - return self.__deserialize_datatime(data) - else: - return self.__deserialize_model(data, klass) - - def call_api(self, resource_path, method, - path_params=None, query_params=None, header_params=None, - body=None, post_params=None, files=None, - response_type=None, auth_settings=None, async_req=None, - _return_http_data_only=None, collection_formats=None, - _preload_content=True, _request_timeout=None): - """Makes the HTTP request (synchronous) and returns deserialized data. - - To make an async request, set the async_req parameter. - - :param resource_path: Path to method endpoint. - :param method: Method to call. - :param path_params: Path parameters in the url. - :param query_params: Query parameters in the url. - :param header_params: Header parameters to be - placed in the request header. - :param body: Request body. - :param post_params dict: Request post form parameters, - for `application/x-www-form-urlencoded`, `multipart/form-data`. - :param auth_settings list: Auth Settings names for the request. - :param response: Response data type. - :param files dict: key -> filename, value -> filepath, - for `multipart/form-data`. - :param async_req bool: execute request asynchronously - :param _return_http_data_only: response data without head status code - and headers - :param collection_formats: dict of collection formats for path, query, - header, and post parameters. - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :return: - If async_req parameter is True, - the request will be called asynchronously. - The method will return the request thread. - If parameter async_req is False or missing, - then the method will return the response directly. - """ - if not async_req: - return self.__call_api(resource_path, method, - path_params, query_params, header_params, - body, post_params, files, - response_type, auth_settings, - _return_http_data_only, collection_formats, - _preload_content, _request_timeout) - else: - thread = self.pool.apply_async(self.__call_api, (resource_path, - method, path_params, query_params, - header_params, body, - post_params, files, - response_type, auth_settings, - _return_http_data_only, - collection_formats, - _preload_content, _request_timeout)) - return thread - - def request(self, method, url, query_params=None, headers=None, - post_params=None, body=None, _preload_content=True, - _request_timeout=None): - """Makes the HTTP request using RESTClient.""" - if method == "GET": - return self.rest_client.GET(url, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - headers=headers) - elif method == "HEAD": - return self.rest_client.HEAD(url, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - headers=headers) - elif method == "OPTIONS": - return self.rest_client.OPTIONS(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "POST": - return self.rest_client.POST(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "PUT": - return self.rest_client.PUT(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "PATCH": - return self.rest_client.PATCH(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "DELETE": - return self.rest_client.DELETE(url, - query_params=query_params, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - else: - raise ValueError( - "http method must be `GET`, `HEAD`, `OPTIONS`," - " `POST`, `PATCH`, `PUT` or `DELETE`." - ) - - def parameters_to_tuples(self, params, collection_formats): - """Get parameters as list of tuples, formatting collections. - - :param params: Parameters as dict or list of two-tuples - :param dict collection_formats: Parameter collection formats - :return: Parameters as list of tuples, collections formatted - """ - new_params = [] - if collection_formats is None: - collection_formats = {} - for k, v in six.iteritems(params) if isinstance(params, dict) else params: # noqa: E501 - if k in collection_formats: - collection_format = collection_formats[k] - if collection_format == 'multi': - new_params.extend((k, value) for value in v) - else: - if collection_format == 'ssv': - delimiter = ' ' - elif collection_format == 'tsv': - delimiter = '\t' - elif collection_format == 'pipes': - delimiter = '|' - else: # csv is the default - delimiter = ',' - new_params.append( - (k, delimiter.join(str(value) for value in v))) - else: - new_params.append((k, v)) - return new_params - - def prepare_post_parameters(self, post_params=None, files=None): - """Builds form parameters. - - :param post_params: Normal form parameters. - :param files: File parameters. - :return: Form parameters with files. - """ - params = [] - - if post_params: - params = post_params - - if files: - for k, v in six.iteritems(files): - if not v: - continue - file_names = v if type(v) is list else [v] - for n in file_names: - with open(n, 'rb') as f: - filename = os.path.basename(f.name) - filedata = f.read() - mimetype = (mimetypes.guess_type(filename)[0] or - 'application/octet-stream') - params.append( - tuple([k, tuple([filename, filedata, mimetype])])) - - return params - - def select_header_accept(self, accepts): - """Returns `Accept` based on an array of accepts provided. - - :param accepts: List of headers. - :return: Accept (e.g. application/json). - """ - if not accepts: - return - - accepts = [x.lower() for x in accepts] - - if 'application/json' in accepts: - return 'application/json' - else: - return ', '.join(accepts) - - def select_header_content_type(self, content_types): - """Returns `Content-Type` based on an array of content_types provided. - - :param content_types: List of content-types. - :return: Content-Type (e.g. application/json). - """ - if not content_types: - return 'application/json' - - content_types = [x.lower() for x in content_types] - - if 'application/json' in content_types or '*/*' in content_types: - return 'application/json' - else: - return content_types[0] - - def update_params_for_auth(self, headers, querys, auth_settings): - """Updates header and query params based on authentication setting. - - :param headers: Header parameters dict to be updated. - :param querys: Query parameters tuple list to be updated. - :param auth_settings: Authentication setting identifiers list. - """ - if not auth_settings: - return - - for auth in auth_settings: - auth_setting = self.configuration.auth_settings().get(auth) - if auth_setting: - if not auth_setting['value']: - continue - elif auth_setting['in'] == 'header': - headers[auth_setting['key']] = auth_setting['value'] - elif auth_setting['in'] == 'query': - querys.append((auth_setting['key'], auth_setting['value'])) - else: - raise ValueError( - 'Authentication token must be in `query` or `header`' - ) - - def __deserialize_file(self, response): - """Deserializes body to file - - Saves response body into a file in a temporary folder, - using the filename from the `Content-Disposition` header if provided. - - :param response: RESTResponse. - :return: file path. - """ - fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) - os.close(fd) - os.remove(path) - - content_disposition = response.getheader("Content-Disposition") - if content_disposition: - filename = re.search(r'filename=[\'"]?([^\'"\s]+)[\'"]?', - content_disposition).group(1) - path = os.path.join(os.path.dirname(path), filename) - - with open(path, "wb") as f: - f.write(response.data) - - return path - - def __deserialize_primitive(self, data, klass): - """Deserializes string to primitive type. - - :param data: str. - :param klass: class literal. - - :return: int, long, float, str, bool. - """ - try: - return klass(data) - except UnicodeEncodeError: - return six.text_type(data) - except TypeError: - return data - - def __deserialize_object(self, value): - """Return a original value. - - :return: object. - """ - return value - - def __deserialize_date(self, string): - """Deserializes string to date. - - :param string: str. - :return: date. - """ - try: - from dateutil.parser import parse - return parse(string).date() - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, - reason="Failed to parse `{0}` as date object".format(string) - ) - - def __deserialize_datatime(self, string): - """Deserializes string to datetime. - - The string should be in iso8601 datetime format. - - :param string: str. - :return: datetime. - """ - try: - from dateutil.parser import parse - return parse(string) - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, - reason=( - "Failed to parse `{0}` as datetime object" - .format(string) - ) - ) - - def __hasattr(self, object, name): - return name in object.__class__.__dict__ - - def __deserialize_model(self, data, klass): - """Deserializes list or dict to model. - - :param data: dict, list. - :param klass: class literal. - :return: model object. - """ - - if (not klass.swagger_types and - not self.__hasattr(klass, 'get_real_child_model')): - return data - - kwargs = {} - if klass.swagger_types is not None: - for attr, attr_type in six.iteritems(klass.swagger_types): - if (data is not None and - klass.attribute_map[attr] in data and - isinstance(data, (list, dict))): - value = data[klass.attribute_map[attr]] - kwargs[attr] = self.__deserialize(value, attr_type) - - instance = klass(**kwargs) - - if (isinstance(instance, dict) and - klass.swagger_types is not None and - isinstance(data, dict)): - for key, value in data.items(): - if key not in klass.swagger_types: - instance[key] = value - if self.__hasattr(instance, 'get_real_child_model'): - klass_name = instance.get_real_child_model(data) - if klass_name: - instance = self.__deserialize(data, klass_name) - return instance diff --git a/sdk/python/v1alpha3/kubeflow/katib/configuration.py b/sdk/python/v1alpha3/kubeflow/katib/configuration.py deleted file mode 100644 index f13219be986..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/configuration.py +++ /dev/null @@ -1,237 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import copy -import logging -import multiprocessing -import sys -import urllib3 - -import six -from six.moves import http_client as httplib - - -class Configuration(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Ref: https://github.com/swagger-api/swagger-codegen - Do not edit the class manually. - """ - - _default = None - - def __init__(self): - """Constructor""" - if self._default: - for key in self._default.__dict__.keys(): - self.__dict__[key] = copy.copy(self._default.__dict__[key]) - return - - # Default Base url - self.host = "https://localhost" - # Temp file folder for downloading files - self.temp_folder_path = None - - # Authentication Settings - # dict to store API key(s) - self.api_key = {} - # dict to store API prefix (e.g. Bearer) - self.api_key_prefix = {} - # Username for HTTP basic authentication - self.username = "" - # Password for HTTP basic authentication - self.password = "" - - # Logging Settings - self.logger = {} - self.logger["package_logger"] = logging.getLogger("katib") - self.logger["urllib3_logger"] = logging.getLogger("urllib3") - # Log format - self.logger_format = '%(asctime)s %(levelname)s %(message)s' - # Log stream handler - self.logger_stream_handler = None - # Log file handler - self.logger_file_handler = None - # Debug file location - self.logger_file = None - # Debug switch - self.debug = False - - # SSL/TLS verification - # Set this to false to skip verifying SSL certificate when calling API - # from https server. - self.verify_ssl = True - # Set this to customize the certificate file to verify the peer. - self.ssl_ca_cert = None - # client certificate file - self.cert_file = None - # client key file - self.key_file = None - # Set this to True/False to enable/disable SSL hostname verification. - self.assert_hostname = None - - # urllib3 connection pool's maximum number of connections saved - # per pool. urllib3 uses 1 connection as default value, but this is - # not the best value when you are making a lot of possibly parallel - # requests to the same host, which is often the case here. - # cpu_count * 5 is used as default value to increase performance. - self.connection_pool_maxsize = multiprocessing.cpu_count() * 5 - - # Proxy URL - self.proxy = None - # Safe chars for path_param - self.safe_chars_for_path_param = '' - - @classmethod - def set_default(cls, default): - cls._default = default - - @property - def logger_file(self): - """The logger file. - - If the logger_file is None, then add stream handler and remove file - handler. Otherwise, add file handler and remove stream handler. - - :param value: The logger_file path. - :type: str - """ - return self.__logger_file - - @logger_file.setter - def logger_file(self, value): - """The logger file. - - If the logger_file is None, then add stream handler and remove file - handler. Otherwise, add file handler and remove stream handler. - - :param value: The logger_file path. - :type: str - """ - self.__logger_file = value - if self.__logger_file: - # If set logging file, - # then add file handler and remove stream handler. - self.logger_file_handler = logging.FileHandler(self.__logger_file) - self.logger_file_handler.setFormatter(self.logger_formatter) - for _, logger in six.iteritems(self.logger): - logger.addHandler(self.logger_file_handler) - if self.logger_stream_handler: - logger.removeHandler(self.logger_stream_handler) - else: - # If not set logging file, - # then add stream handler and remove file handler. - self.logger_stream_handler = logging.StreamHandler() - self.logger_stream_handler.setFormatter(self.logger_formatter) - for _, logger in six.iteritems(self.logger): - logger.addHandler(self.logger_stream_handler) - if self.logger_file_handler: - logger.removeHandler(self.logger_file_handler) - - @property - def debug(self): - """Debug status - - :param value: The debug status, True or False. - :type: bool - """ - return self.__debug - - @debug.setter - def debug(self, value): - """Debug status - - :param value: The debug status, True or False. - :type: bool - """ - self.__debug = value - if self.__debug: - # if debug status is True, turn on debug logging - for _, logger in six.iteritems(self.logger): - logger.setLevel(logging.DEBUG) - # turn on httplib debug - httplib.HTTPConnection.debuglevel = 1 - else: - # if debug status is False, turn off debug logging, - # setting log level to default `logging.WARNING` - for _, logger in six.iteritems(self.logger): - logger.setLevel(logging.WARNING) - # turn off httplib debug - httplib.HTTPConnection.debuglevel = 0 - - @property - def logger_format(self): - """The logger format. - - The logger_formatter will be updated when sets logger_format. - - :param value: The format string. - :type: str - """ - return self.__logger_format - - @logger_format.setter - def logger_format(self, value): - """The logger format. - - The logger_formatter will be updated when sets logger_format. - - :param value: The format string. - :type: str - """ - self.__logger_format = value - self.logger_formatter = logging.Formatter(self.__logger_format) - - def get_api_key_with_prefix(self, identifier): - """Gets API key (with prefix if set). - - :param identifier: The identifier of apiKey. - :return: The token for api key authentication. - """ - if (self.api_key.get(identifier) and - self.api_key_prefix.get(identifier)): - return self.api_key_prefix[identifier] + ' ' + self.api_key[identifier] # noqa: E501 - elif self.api_key.get(identifier): - return self.api_key[identifier] - - def get_basic_auth_token(self): - """Gets HTTP basic authentication header (string). - - :return: The token for basic HTTP authentication. - """ - return urllib3.util.make_headers( - basic_auth=self.username + ':' + self.password - ).get('authorization') - - def auth_settings(self): - """Gets Auth Settings dict for api client. - - :return: The Auth Settings information dict. - """ - return { - - } - - def to_debug_report(self): - """Gets the essential information for debugging. - - :return: The report for debugging. - """ - return "Python SDK Debug Report:\n"\ - "OS: {env}\n"\ - "Python Version: {pyversion}\n"\ - "Version of the API: v1alpha3-0.1\n"\ - "SDK Package Version: 0.1".\ - format(env=sys.platform, pyversion=sys.version) diff --git a/sdk/python/v1alpha3/kubeflow/katib/constants/__init__.py b/sdk/python/v1alpha3/kubeflow/katib/constants/__init__.py deleted file mode 100644 index ede60a09abd..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/constants/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2019 kubeflow.org. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/sdk/python/v1alpha3/kubeflow/katib/constants/constants.py b/sdk/python/v1alpha3/kubeflow/katib/constants/constants.py deleted file mode 100644 index f76f213831c..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/constants/constants.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2019 kubeflow.org. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -# Katib K8S constants -EXPERIMENT_GROUP = 'kubeflow.org' -EXPERIMENT_KIND = 'experiment' -EXPERIMENT_PLURAL = 'experiments' -EXPERIMENT_VERSION = os.environ.get('EXPERIMENT_VERSION', 'v1alpha3') -EXPERIMENT_LOGLEVEL = os.environ.get('EXPERIMENT_LOGLEVEL', 'INFO').upper() - -TRIAL_KIND = 'trial' -TRIAL_PLURAL = 'trials' -TRIAL_VERSION = os.environ.get('EXPERIMENT_VERSION', 'v1alpha3') - -# How long to wait in seconds for requests to the ApiServer -APISERVER_TIMEOUT = 120 diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/__init__.py b/sdk/python/v1alpha3/kubeflow/katib/models/__init__.py deleted file mode 100644 index 454bc2101e2..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/__init__.py +++ /dev/null @@ -1,55 +0,0 @@ -# coding: utf-8 - -# flake8: noqa -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -# import models into model package -from kubeflow.katib.models.v1alpha3_algorithm_setting import V1alpha3AlgorithmSetting -from kubeflow.katib.models.v1alpha3_algorithm_spec import V1alpha3AlgorithmSpec -from kubeflow.katib.models.v1alpha3_collector_spec import V1alpha3CollectorSpec -from kubeflow.katib.models.v1alpha3_early_stopping_setting import V1alpha3EarlyStoppingSetting -from kubeflow.katib.models.v1alpha3_early_stopping_spec import V1alpha3EarlyStoppingSpec -from kubeflow.katib.models.v1alpha3_experiment import V1alpha3Experiment -from kubeflow.katib.models.v1alpha3_experiment_condition import V1alpha3ExperimentCondition -from kubeflow.katib.models.v1alpha3_experiment_list import V1alpha3ExperimentList -from kubeflow.katib.models.v1alpha3_experiment_spec import V1alpha3ExperimentSpec -from kubeflow.katib.models.v1alpha3_experiment_status import V1alpha3ExperimentStatus -from kubeflow.katib.models.v1alpha3_feasible_space import V1alpha3FeasibleSpace -from kubeflow.katib.models.v1alpha3_file_system_path import V1alpha3FileSystemPath -from kubeflow.katib.models.v1alpha3_filter_spec import V1alpha3FilterSpec -from kubeflow.katib.models.v1alpha3_go_template import V1alpha3GoTemplate -from kubeflow.katib.models.v1alpha3_graph_config import V1alpha3GraphConfig -from kubeflow.katib.models.v1alpha3_metric import V1alpha3Metric -from kubeflow.katib.models.v1alpha3_metrics_collector_spec import V1alpha3MetricsCollectorSpec -from kubeflow.katib.models.v1alpha3_nas_config import V1alpha3NasConfig -from kubeflow.katib.models.v1alpha3_objective_spec import V1alpha3ObjectiveSpec -from kubeflow.katib.models.v1alpha3_observation import V1alpha3Observation -from kubeflow.katib.models.v1alpha3_operation import V1alpha3Operation -from kubeflow.katib.models.v1alpha3_optimal_trial import V1alpha3OptimalTrial -from kubeflow.katib.models.v1alpha3_parameter_assignment import V1alpha3ParameterAssignment -from kubeflow.katib.models.v1alpha3_parameter_spec import V1alpha3ParameterSpec -from kubeflow.katib.models.v1alpha3_source_spec import V1alpha3SourceSpec -from kubeflow.katib.models.v1alpha3_suggestion import V1alpha3Suggestion -from kubeflow.katib.models.v1alpha3_suggestion_condition import V1alpha3SuggestionCondition -from kubeflow.katib.models.v1alpha3_suggestion_list import V1alpha3SuggestionList -from kubeflow.katib.models.v1alpha3_suggestion_spec import V1alpha3SuggestionSpec -from kubeflow.katib.models.v1alpha3_suggestion_status import V1alpha3SuggestionStatus -from kubeflow.katib.models.v1alpha3_template_spec import V1alpha3TemplateSpec -from kubeflow.katib.models.v1alpha3_trial import V1alpha3Trial -from kubeflow.katib.models.v1alpha3_trial_assignment import V1alpha3TrialAssignment -from kubeflow.katib.models.v1alpha3_trial_condition import V1alpha3TrialCondition -from kubeflow.katib.models.v1alpha3_trial_list import V1alpha3TrialList -from kubeflow.katib.models.v1alpha3_trial_spec import V1alpha3TrialSpec -from kubeflow.katib.models.v1alpha3_trial_status import V1alpha3TrialStatus -from kubeflow.katib.models.v1alpha3_trial_template import V1alpha3TrialTemplate diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1_time.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1_time.py deleted file mode 100644 index cabbec802af..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1_time.py +++ /dev/null @@ -1,86 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1beta1-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1Time(object): - """NOTE: This class is auto generated by the swagger code generator program. - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501 - """V1Time - a model defined in Swagger""" # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1Time, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1Time): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1_unstructured_unstructured.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1_unstructured_unstructured.py deleted file mode 100644 index ae39cdc5dc8..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1_unstructured_unstructured.py +++ /dev/null @@ -1,86 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1beta1-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1UnstructuredUnstructured(object): - """NOTE: This class is auto generated by the swagger code generator program. - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501 - """V1UnstructuredUnstructured - a model defined in Swagger""" # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1UnstructuredUnstructured, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1UnstructuredUnstructured): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_algorithm_setting.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_algorithm_setting.py deleted file mode 100644 index e578578542b..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_algorithm_setting.py +++ /dev/null @@ -1,141 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1alpha3AlgorithmSetting(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'name': 'str', - 'value': 'str' - } - - attribute_map = { - 'name': 'name', - 'value': 'value' - } - - def __init__(self, name=None, value=None): # noqa: E501 - """V1alpha3AlgorithmSetting - a model defined in Swagger""" # noqa: E501 - - self._name = None - self._value = None - self.discriminator = None - - if name is not None: - self.name = name - if value is not None: - self.value = value - - @property - def name(self): - """Gets the name of this V1alpha3AlgorithmSetting. # noqa: E501 - - - :return: The name of this V1alpha3AlgorithmSetting. # noqa: E501 - :rtype: str - """ - return self._name - - @name.setter - def name(self, name): - """Sets the name of this V1alpha3AlgorithmSetting. - - - :param name: The name of this V1alpha3AlgorithmSetting. # noqa: E501 - :type: str - """ - - self._name = name - - @property - def value(self): - """Gets the value of this V1alpha3AlgorithmSetting. # noqa: E501 - - - :return: The value of this V1alpha3AlgorithmSetting. # noqa: E501 - :rtype: str - """ - return self._value - - @value.setter - def value(self, value): - """Sets the value of this V1alpha3AlgorithmSetting. - - - :param value: The value of this V1alpha3AlgorithmSetting. # noqa: E501 - :type: str - """ - - self._value = value - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3AlgorithmSetting, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3AlgorithmSetting): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_algorithm_spec.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_algorithm_spec.py deleted file mode 100644 index 36344a05f95..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_algorithm_spec.py +++ /dev/null @@ -1,172 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_algorithm_setting import V1alpha3AlgorithmSetting # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_early_stopping_spec import V1alpha3EarlyStoppingSpec # noqa: F401,E501 - - -class V1alpha3AlgorithmSpec(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'algorithm_name': 'str', - 'algorithm_settings': 'list[V1alpha3AlgorithmSetting]', - 'early_stopping': 'V1alpha3EarlyStoppingSpec' - } - - attribute_map = { - 'algorithm_name': 'algorithmName', - 'algorithm_settings': 'algorithmSettings', - 'early_stopping': 'earlyStopping' - } - - def __init__(self, algorithm_name=None, algorithm_settings=None, early_stopping=None): # noqa: E501 - """V1alpha3AlgorithmSpec - a model defined in Swagger""" # noqa: E501 - - self._algorithm_name = None - self._algorithm_settings = None - self._early_stopping = None - self.discriminator = None - - if algorithm_name is not None: - self.algorithm_name = algorithm_name - if algorithm_settings is not None: - self.algorithm_settings = algorithm_settings - if early_stopping is not None: - self.early_stopping = early_stopping - - @property - def algorithm_name(self): - """Gets the algorithm_name of this V1alpha3AlgorithmSpec. # noqa: E501 - - - :return: The algorithm_name of this V1alpha3AlgorithmSpec. # noqa: E501 - :rtype: str - """ - return self._algorithm_name - - @algorithm_name.setter - def algorithm_name(self, algorithm_name): - """Sets the algorithm_name of this V1alpha3AlgorithmSpec. - - - :param algorithm_name: The algorithm_name of this V1alpha3AlgorithmSpec. # noqa: E501 - :type: str - """ - - self._algorithm_name = algorithm_name - - @property - def algorithm_settings(self): - """Gets the algorithm_settings of this V1alpha3AlgorithmSpec. # noqa: E501 - - Key-value pairs representing settings for suggestion algorithms. # noqa: E501 - - :return: The algorithm_settings of this V1alpha3AlgorithmSpec. # noqa: E501 - :rtype: list[V1alpha3AlgorithmSetting] - """ - return self._algorithm_settings - - @algorithm_settings.setter - def algorithm_settings(self, algorithm_settings): - """Sets the algorithm_settings of this V1alpha3AlgorithmSpec. - - Key-value pairs representing settings for suggestion algorithms. # noqa: E501 - - :param algorithm_settings: The algorithm_settings of this V1alpha3AlgorithmSpec. # noqa: E501 - :type: list[V1alpha3AlgorithmSetting] - """ - - self._algorithm_settings = algorithm_settings - - @property - def early_stopping(self): - """Gets the early_stopping of this V1alpha3AlgorithmSpec. # noqa: E501 - - - :return: The early_stopping of this V1alpha3AlgorithmSpec. # noqa: E501 - :rtype: V1alpha3EarlyStoppingSpec - """ - return self._early_stopping - - @early_stopping.setter - def early_stopping(self, early_stopping): - """Sets the early_stopping of this V1alpha3AlgorithmSpec. - - - :param early_stopping: The early_stopping of this V1alpha3AlgorithmSpec. # noqa: E501 - :type: V1alpha3EarlyStoppingSpec - """ - - self._early_stopping = early_stopping - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3AlgorithmSpec, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3AlgorithmSpec): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_collector_spec.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_collector_spec.py deleted file mode 100644 index bc2edbfe2bc..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_collector_spec.py +++ /dev/null @@ -1,146 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubernetes.client import V1Container # noqa: F401,E501 - - -class V1alpha3CollectorSpec(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'custom_collector': 'V1Container', - 'kind': 'str' - } - - attribute_map = { - 'custom_collector': 'customCollector', - 'kind': 'kind' - } - - def __init__(self, custom_collector=None, kind=None): # noqa: E501 - """V1alpha3CollectorSpec - a model defined in Swagger""" # noqa: E501 - - self._custom_collector = None - self._kind = None - self.discriminator = None - - if custom_collector is not None: - self.custom_collector = custom_collector - self.kind = kind - - @property - def custom_collector(self): - """Gets the custom_collector of this V1alpha3CollectorSpec. # noqa: E501 - - When kind is \"customCollector\", this field will be used # noqa: E501 - - :return: The custom_collector of this V1alpha3CollectorSpec. # noqa: E501 - :rtype: V1Container - """ - return self._custom_collector - - @custom_collector.setter - def custom_collector(self, custom_collector): - """Sets the custom_collector of this V1alpha3CollectorSpec. - - When kind is \"customCollector\", this field will be used # noqa: E501 - - :param custom_collector: The custom_collector of this V1alpha3CollectorSpec. # noqa: E501 - :type: V1Container - """ - - self._custom_collector = custom_collector - - @property - def kind(self): - """Gets the kind of this V1alpha3CollectorSpec. # noqa: E501 - - - :return: The kind of this V1alpha3CollectorSpec. # noqa: E501 - :rtype: str - """ - return self._kind - - @kind.setter - def kind(self, kind): - """Sets the kind of this V1alpha3CollectorSpec. - - - :param kind: The kind of this V1alpha3CollectorSpec. # noqa: E501 - :type: str - """ - if kind is None: - raise ValueError("Invalid value for `kind`, must not be `None`") # noqa: E501 - - self._kind = kind - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3CollectorSpec, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3CollectorSpec): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_early_stopping_setting.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_early_stopping_setting.py deleted file mode 100644 index 504ad722cbf..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_early_stopping_setting.py +++ /dev/null @@ -1,141 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1alpha3EarlyStoppingSetting(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'name': 'str', - 'value': 'str' - } - - attribute_map = { - 'name': 'name', - 'value': 'value' - } - - def __init__(self, name=None, value=None): # noqa: E501 - """V1alpha3EarlyStoppingSetting - a model defined in Swagger""" # noqa: E501 - - self._name = None - self._value = None - self.discriminator = None - - if name is not None: - self.name = name - if value is not None: - self.value = value - - @property - def name(self): - """Gets the name of this V1alpha3EarlyStoppingSetting. # noqa: E501 - - - :return: The name of this V1alpha3EarlyStoppingSetting. # noqa: E501 - :rtype: str - """ - return self._name - - @name.setter - def name(self, name): - """Sets the name of this V1alpha3EarlyStoppingSetting. - - - :param name: The name of this V1alpha3EarlyStoppingSetting. # noqa: E501 - :type: str - """ - - self._name = name - - @property - def value(self): - """Gets the value of this V1alpha3EarlyStoppingSetting. # noqa: E501 - - - :return: The value of this V1alpha3EarlyStoppingSetting. # noqa: E501 - :rtype: str - """ - return self._value - - @value.setter - def value(self, value): - """Sets the value of this V1alpha3EarlyStoppingSetting. - - - :param value: The value of this V1alpha3EarlyStoppingSetting. # noqa: E501 - :type: str - """ - - self._value = value - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3EarlyStoppingSetting, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3EarlyStoppingSetting): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_early_stopping_spec.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_early_stopping_spec.py deleted file mode 100644 index d602af28862..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_early_stopping_spec.py +++ /dev/null @@ -1,144 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_early_stopping_setting import V1alpha3EarlyStoppingSetting # noqa: F401,E501 - - -class V1alpha3EarlyStoppingSpec(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'early_stopping_algorithm_name': 'str', - 'early_stopping_settings': 'list[V1alpha3EarlyStoppingSetting]' - } - - attribute_map = { - 'early_stopping_algorithm_name': 'earlyStoppingAlgorithmName', - 'early_stopping_settings': 'earlyStoppingSettings' - } - - def __init__(self, early_stopping_algorithm_name=None, early_stopping_settings=None): # noqa: E501 - """V1alpha3EarlyStoppingSpec - a model defined in Swagger""" # noqa: E501 - - self._early_stopping_algorithm_name = None - self._early_stopping_settings = None - self.discriminator = None - - if early_stopping_algorithm_name is not None: - self.early_stopping_algorithm_name = early_stopping_algorithm_name - self.early_stopping_settings = early_stopping_settings - - @property - def early_stopping_algorithm_name(self): - """Gets the early_stopping_algorithm_name of this V1alpha3EarlyStoppingSpec. # noqa: E501 - - - :return: The early_stopping_algorithm_name of this V1alpha3EarlyStoppingSpec. # noqa: E501 - :rtype: str - """ - return self._early_stopping_algorithm_name - - @early_stopping_algorithm_name.setter - def early_stopping_algorithm_name(self, early_stopping_algorithm_name): - """Sets the early_stopping_algorithm_name of this V1alpha3EarlyStoppingSpec. - - - :param early_stopping_algorithm_name: The early_stopping_algorithm_name of this V1alpha3EarlyStoppingSpec. # noqa: E501 - :type: str - """ - - self._early_stopping_algorithm_name = early_stopping_algorithm_name - - @property - def early_stopping_settings(self): - """Gets the early_stopping_settings of this V1alpha3EarlyStoppingSpec. # noqa: E501 - - - :return: The early_stopping_settings of this V1alpha3EarlyStoppingSpec. # noqa: E501 - :rtype: list[V1alpha3EarlyStoppingSetting] - """ - return self._early_stopping_settings - - @early_stopping_settings.setter - def early_stopping_settings(self, early_stopping_settings): - """Sets the early_stopping_settings of this V1alpha3EarlyStoppingSpec. - - - :param early_stopping_settings: The early_stopping_settings of this V1alpha3EarlyStoppingSpec. # noqa: E501 - :type: list[V1alpha3EarlyStoppingSetting] - """ - if early_stopping_settings is None: - raise ValueError("Invalid value for `early_stopping_settings`, must not be `None`") # noqa: E501 - - self._early_stopping_settings = early_stopping_settings - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3EarlyStoppingSpec, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3EarlyStoppingSpec): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment.py deleted file mode 100644 index 5839b27c8c2..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment.py +++ /dev/null @@ -1,227 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_experiment_spec import V1alpha3ExperimentSpec # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_experiment_status import V1alpha3ExperimentStatus # noqa: F401,E501 -from kubernetes.client import V1ObjectMeta # noqa: F401,E501 - - -class V1alpha3Experiment(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'api_version': 'str', - 'kind': 'str', - 'metadata': 'V1ObjectMeta', - 'spec': 'V1alpha3ExperimentSpec', - 'status': 'V1alpha3ExperimentStatus' - } - - attribute_map = { - 'api_version': 'apiVersion', - 'kind': 'kind', - 'metadata': 'metadata', - 'spec': 'spec', - 'status': 'status' - } - - def __init__(self, api_version=None, kind=None, metadata=None, spec=None, status=None): # noqa: E501 - """V1alpha3Experiment - a model defined in Swagger""" # noqa: E501 - - self._api_version = None - self._kind = None - self._metadata = None - self._spec = None - self._status = None - self.discriminator = None - - if api_version is not None: - self.api_version = api_version - if kind is not None: - self.kind = kind - if metadata is not None: - self.metadata = metadata - if spec is not None: - self.spec = spec - if status is not None: - self.status = status - - @property - def api_version(self): - """Gets the api_version of this V1alpha3Experiment. # noqa: E501 - - APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources # noqa: E501 - - :return: The api_version of this V1alpha3Experiment. # noqa: E501 - :rtype: str - """ - return self._api_version - - @api_version.setter - def api_version(self, api_version): - """Sets the api_version of this V1alpha3Experiment. - - APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources # noqa: E501 - - :param api_version: The api_version of this V1alpha3Experiment. # noqa: E501 - :type: str - """ - - self._api_version = api_version - - @property - def kind(self): - """Gets the kind of this V1alpha3Experiment. # noqa: E501 - - Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds # noqa: E501 - - :return: The kind of this V1alpha3Experiment. # noqa: E501 - :rtype: str - """ - return self._kind - - @kind.setter - def kind(self, kind): - """Sets the kind of this V1alpha3Experiment. - - Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds # noqa: E501 - - :param kind: The kind of this V1alpha3Experiment. # noqa: E501 - :type: str - """ - - self._kind = kind - - @property - def metadata(self): - """Gets the metadata of this V1alpha3Experiment. # noqa: E501 - - - :return: The metadata of this V1alpha3Experiment. # noqa: E501 - :rtype: V1ObjectMeta - """ - return self._metadata - - @metadata.setter - def metadata(self, metadata): - """Sets the metadata of this V1alpha3Experiment. - - - :param metadata: The metadata of this V1alpha3Experiment. # noqa: E501 - :type: V1ObjectMeta - """ - - self._metadata = metadata - - @property - def spec(self): - """Gets the spec of this V1alpha3Experiment. # noqa: E501 - - - :return: The spec of this V1alpha3Experiment. # noqa: E501 - :rtype: V1alpha3ExperimentSpec - """ - return self._spec - - @spec.setter - def spec(self, spec): - """Sets the spec of this V1alpha3Experiment. - - - :param spec: The spec of this V1alpha3Experiment. # noqa: E501 - :type: V1alpha3ExperimentSpec - """ - - self._spec = spec - - @property - def status(self): - """Gets the status of this V1alpha3Experiment. # noqa: E501 - - - :return: The status of this V1alpha3Experiment. # noqa: E501 - :rtype: V1alpha3ExperimentStatus - """ - return self._status - - @status.setter - def status(self, status): - """Sets the status of this V1alpha3Experiment. - - - :param status: The status of this V1alpha3Experiment. # noqa: E501 - :type: V1alpha3ExperimentStatus - """ - - self._status = status - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3Experiment, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3Experiment): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_condition.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_condition.py deleted file mode 100644 index d6edfdd2990..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_condition.py +++ /dev/null @@ -1,261 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1_time import V1Time # noqa: F401,E501 - - -class V1alpha3ExperimentCondition(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'last_transition_time': 'V1Time', - 'last_update_time': 'V1Time', - 'message': 'str', - 'reason': 'str', - 'status': 'str', - 'type': 'str' - } - - attribute_map = { - 'last_transition_time': 'lastTransitionTime', - 'last_update_time': 'lastUpdateTime', - 'message': 'message', - 'reason': 'reason', - 'status': 'status', - 'type': 'type' - } - - def __init__(self, last_transition_time=None, last_update_time=None, message=None, reason=None, status=None, type=None): # noqa: E501 - """V1alpha3ExperimentCondition - a model defined in Swagger""" # noqa: E501 - - self._last_transition_time = None - self._last_update_time = None - self._message = None - self._reason = None - self._status = None - self._type = None - self.discriminator = None - - if last_transition_time is not None: - self.last_transition_time = last_transition_time - if last_update_time is not None: - self.last_update_time = last_update_time - if message is not None: - self.message = message - if reason is not None: - self.reason = reason - self.status = status - self.type = type - - @property - def last_transition_time(self): - """Gets the last_transition_time of this V1alpha3ExperimentCondition. # noqa: E501 - - Last time the condition transitioned from one status to another. # noqa: E501 - - :return: The last_transition_time of this V1alpha3ExperimentCondition. # noqa: E501 - :rtype: V1Time - """ - return self._last_transition_time - - @last_transition_time.setter - def last_transition_time(self, last_transition_time): - """Sets the last_transition_time of this V1alpha3ExperimentCondition. - - Last time the condition transitioned from one status to another. # noqa: E501 - - :param last_transition_time: The last_transition_time of this V1alpha3ExperimentCondition. # noqa: E501 - :type: V1Time - """ - - self._last_transition_time = last_transition_time - - @property - def last_update_time(self): - """Gets the last_update_time of this V1alpha3ExperimentCondition. # noqa: E501 - - The last time this condition was updated. # noqa: E501 - - :return: The last_update_time of this V1alpha3ExperimentCondition. # noqa: E501 - :rtype: V1Time - """ - return self._last_update_time - - @last_update_time.setter - def last_update_time(self, last_update_time): - """Sets the last_update_time of this V1alpha3ExperimentCondition. - - The last time this condition was updated. # noqa: E501 - - :param last_update_time: The last_update_time of this V1alpha3ExperimentCondition. # noqa: E501 - :type: V1Time - """ - - self._last_update_time = last_update_time - - @property - def message(self): - """Gets the message of this V1alpha3ExperimentCondition. # noqa: E501 - - A human readable message indicating details about the transition. # noqa: E501 - - :return: The message of this V1alpha3ExperimentCondition. # noqa: E501 - :rtype: str - """ - return self._message - - @message.setter - def message(self, message): - """Sets the message of this V1alpha3ExperimentCondition. - - A human readable message indicating details about the transition. # noqa: E501 - - :param message: The message of this V1alpha3ExperimentCondition. # noqa: E501 - :type: str - """ - - self._message = message - - @property - def reason(self): - """Gets the reason of this V1alpha3ExperimentCondition. # noqa: E501 - - The reason for the condition's last transition. # noqa: E501 - - :return: The reason of this V1alpha3ExperimentCondition. # noqa: E501 - :rtype: str - """ - return self._reason - - @reason.setter - def reason(self, reason): - """Sets the reason of this V1alpha3ExperimentCondition. - - The reason for the condition's last transition. # noqa: E501 - - :param reason: The reason of this V1alpha3ExperimentCondition. # noqa: E501 - :type: str - """ - - self._reason = reason - - @property - def status(self): - """Gets the status of this V1alpha3ExperimentCondition. # noqa: E501 - - Status of the condition, one of True, False, Unknown. # noqa: E501 - - :return: The status of this V1alpha3ExperimentCondition. # noqa: E501 - :rtype: str - """ - return self._status - - @status.setter - def status(self, status): - """Sets the status of this V1alpha3ExperimentCondition. - - Status of the condition, one of True, False, Unknown. # noqa: E501 - - :param status: The status of this V1alpha3ExperimentCondition. # noqa: E501 - :type: str - """ - if status is None: - raise ValueError("Invalid value for `status`, must not be `None`") # noqa: E501 - - self._status = status - - @property - def type(self): - """Gets the type of this V1alpha3ExperimentCondition. # noqa: E501 - - Type of experiment condition. # noqa: E501 - - :return: The type of this V1alpha3ExperimentCondition. # noqa: E501 - :rtype: str - """ - return self._type - - @type.setter - def type(self, type): - """Sets the type of this V1alpha3ExperimentCondition. - - Type of experiment condition. # noqa: E501 - - :param type: The type of this V1alpha3ExperimentCondition. # noqa: E501 - :type: str - """ - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - - self._type = type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3ExperimentCondition, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3ExperimentCondition): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_list.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_list.py deleted file mode 100644 index ee653920777..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_list.py +++ /dev/null @@ -1,201 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_experiment import V1alpha3Experiment # noqa: F401,E501 -from kubernetes.client import V1ListMeta # noqa: F401,E501 - - -class V1alpha3ExperimentList(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'api_version': 'str', - 'items': 'list[V1alpha3Experiment]', - 'kind': 'str', - 'metadata': 'V1ListMeta' - } - - attribute_map = { - 'api_version': 'apiVersion', - 'items': 'items', - 'kind': 'kind', - 'metadata': 'metadata' - } - - def __init__(self, api_version=None, items=None, kind=None, metadata=None): # noqa: E501 - """V1alpha3ExperimentList - a model defined in Swagger""" # noqa: E501 - - self._api_version = None - self._items = None - self._kind = None - self._metadata = None - self.discriminator = None - - if api_version is not None: - self.api_version = api_version - self.items = items - if kind is not None: - self.kind = kind - if metadata is not None: - self.metadata = metadata - - @property - def api_version(self): - """Gets the api_version of this V1alpha3ExperimentList. # noqa: E501 - - APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources # noqa: E501 - - :return: The api_version of this V1alpha3ExperimentList. # noqa: E501 - :rtype: str - """ - return self._api_version - - @api_version.setter - def api_version(self, api_version): - """Sets the api_version of this V1alpha3ExperimentList. - - APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources # noqa: E501 - - :param api_version: The api_version of this V1alpha3ExperimentList. # noqa: E501 - :type: str - """ - - self._api_version = api_version - - @property - def items(self): - """Gets the items of this V1alpha3ExperimentList. # noqa: E501 - - - :return: The items of this V1alpha3ExperimentList. # noqa: E501 - :rtype: list[V1alpha3Experiment] - """ - return self._items - - @items.setter - def items(self, items): - """Sets the items of this V1alpha3ExperimentList. - - - :param items: The items of this V1alpha3ExperimentList. # noqa: E501 - :type: list[V1alpha3Experiment] - """ - if items is None: - raise ValueError("Invalid value for `items`, must not be `None`") # noqa: E501 - - self._items = items - - @property - def kind(self): - """Gets the kind of this V1alpha3ExperimentList. # noqa: E501 - - Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds # noqa: E501 - - :return: The kind of this V1alpha3ExperimentList. # noqa: E501 - :rtype: str - """ - return self._kind - - @kind.setter - def kind(self, kind): - """Sets the kind of this V1alpha3ExperimentList. - - Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds # noqa: E501 - - :param kind: The kind of this V1alpha3ExperimentList. # noqa: E501 - :type: str - """ - - self._kind = kind - - @property - def metadata(self): - """Gets the metadata of this V1alpha3ExperimentList. # noqa: E501 - - - :return: The metadata of this V1alpha3ExperimentList. # noqa: E501 - :rtype: V1ListMeta - """ - return self._metadata - - @metadata.setter - def metadata(self, metadata): - """Sets the metadata of this V1alpha3ExperimentList. - - - :param metadata: The metadata of this V1alpha3ExperimentList. # noqa: E501 - :type: V1ListMeta - """ - - self._metadata = metadata - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3ExperimentList, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3ExperimentList): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_spec.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_spec.py deleted file mode 100644 index 7918d3e51f6..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_spec.py +++ /dev/null @@ -1,374 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_algorithm_spec import V1alpha3AlgorithmSpec # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_metrics_collector_spec import V1alpha3MetricsCollectorSpec # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_nas_config import V1alpha3NasConfig # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_objective_spec import V1alpha3ObjectiveSpec # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_parameter_spec import V1alpha3ParameterSpec # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_trial_template import V1alpha3TrialTemplate # noqa: F401,E501 - - -class V1alpha3ExperimentSpec(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'algorithm': 'V1alpha3AlgorithmSpec', - 'max_failed_trial_count': 'int', - 'max_trial_count': 'int', - 'metrics_collector_spec': 'V1alpha3MetricsCollectorSpec', - 'nas_config': 'V1alpha3NasConfig', - 'objective': 'V1alpha3ObjectiveSpec', - 'parallel_trial_count': 'int', - 'parameters': 'list[V1alpha3ParameterSpec]', - 'resume_policy': 'str', - 'trial_template': 'V1alpha3TrialTemplate' - } - - attribute_map = { - 'algorithm': 'algorithm', - 'max_failed_trial_count': 'maxFailedTrialCount', - 'max_trial_count': 'maxTrialCount', - 'metrics_collector_spec': 'metricsCollectorSpec', - 'nas_config': 'nasConfig', - 'objective': 'objective', - 'parallel_trial_count': 'parallelTrialCount', - 'parameters': 'parameters', - 'resume_policy': 'resumePolicy', - 'trial_template': 'trialTemplate' - } - - def __init__(self, algorithm=None, max_failed_trial_count=None, max_trial_count=None, metrics_collector_spec=None, nas_config=None, objective=None, parallel_trial_count=None, parameters=None, resume_policy=None, trial_template=None): # noqa: E501 - """V1alpha3ExperimentSpec - a model defined in Swagger""" # noqa: E501 - - self._algorithm = None - self._max_failed_trial_count = None - self._max_trial_count = None - self._metrics_collector_spec = None - self._nas_config = None - self._objective = None - self._parallel_trial_count = None - self._parameters = None - self._resume_policy = None - self._trial_template = None - self.discriminator = None - - if algorithm is not None: - self.algorithm = algorithm - if max_failed_trial_count is not None: - self.max_failed_trial_count = max_failed_trial_count - if max_trial_count is not None: - self.max_trial_count = max_trial_count - if metrics_collector_spec is not None: - self.metrics_collector_spec = metrics_collector_spec - if nas_config is not None: - self.nas_config = nas_config - if objective is not None: - self.objective = objective - if parallel_trial_count is not None: - self.parallel_trial_count = parallel_trial_count - if parameters is not None: - self.parameters = parameters - if resume_policy is not None: - self.resume_policy = resume_policy - if trial_template is not None: - self.trial_template = trial_template - - @property - def algorithm(self): - """Gets the algorithm of this V1alpha3ExperimentSpec. # noqa: E501 - - Describes the suggestion algorithm. # noqa: E501 - - :return: The algorithm of this V1alpha3ExperimentSpec. # noqa: E501 - :rtype: V1alpha3AlgorithmSpec - """ - return self._algorithm - - @algorithm.setter - def algorithm(self, algorithm): - """Sets the algorithm of this V1alpha3ExperimentSpec. - - Describes the suggestion algorithm. # noqa: E501 - - :param algorithm: The algorithm of this V1alpha3ExperimentSpec. # noqa: E501 - :type: V1alpha3AlgorithmSpec - """ - - self._algorithm = algorithm - - @property - def max_failed_trial_count(self): - """Gets the max_failed_trial_count of this V1alpha3ExperimentSpec. # noqa: E501 - - Max failed trials to mark experiment as failed. # noqa: E501 - - :return: The max_failed_trial_count of this V1alpha3ExperimentSpec. # noqa: E501 - :rtype: int - """ - return self._max_failed_trial_count - - @max_failed_trial_count.setter - def max_failed_trial_count(self, max_failed_trial_count): - """Sets the max_failed_trial_count of this V1alpha3ExperimentSpec. - - Max failed trials to mark experiment as failed. # noqa: E501 - - :param max_failed_trial_count: The max_failed_trial_count of this V1alpha3ExperimentSpec. # noqa: E501 - :type: int - """ - - self._max_failed_trial_count = max_failed_trial_count - - @property - def max_trial_count(self): - """Gets the max_trial_count of this V1alpha3ExperimentSpec. # noqa: E501 - - Max completed trials to mark experiment as succeeded # noqa: E501 - - :return: The max_trial_count of this V1alpha3ExperimentSpec. # noqa: E501 - :rtype: int - """ - return self._max_trial_count - - @max_trial_count.setter - def max_trial_count(self, max_trial_count): - """Sets the max_trial_count of this V1alpha3ExperimentSpec. - - Max completed trials to mark experiment as succeeded # noqa: E501 - - :param max_trial_count: The max_trial_count of this V1alpha3ExperimentSpec. # noqa: E501 - :type: int - """ - - self._max_trial_count = max_trial_count - - @property - def metrics_collector_spec(self): - """Gets the metrics_collector_spec of this V1alpha3ExperimentSpec. # noqa: E501 - - For v1alpha3 we will keep the metrics collector implementation same as v1alpha1. # noqa: E501 - - :return: The metrics_collector_spec of this V1alpha3ExperimentSpec. # noqa: E501 - :rtype: V1alpha3MetricsCollectorSpec - """ - return self._metrics_collector_spec - - @metrics_collector_spec.setter - def metrics_collector_spec(self, metrics_collector_spec): - """Sets the metrics_collector_spec of this V1alpha3ExperimentSpec. - - For v1alpha3 we will keep the metrics collector implementation same as v1alpha1. # noqa: E501 - - :param metrics_collector_spec: The metrics_collector_spec of this V1alpha3ExperimentSpec. # noqa: E501 - :type: V1alpha3MetricsCollectorSpec - """ - - self._metrics_collector_spec = metrics_collector_spec - - @property - def nas_config(self): - """Gets the nas_config of this V1alpha3ExperimentSpec. # noqa: E501 - - - :return: The nas_config of this V1alpha3ExperimentSpec. # noqa: E501 - :rtype: V1alpha3NasConfig - """ - return self._nas_config - - @nas_config.setter - def nas_config(self, nas_config): - """Sets the nas_config of this V1alpha3ExperimentSpec. - - - :param nas_config: The nas_config of this V1alpha3ExperimentSpec. # noqa: E501 - :type: V1alpha3NasConfig - """ - - self._nas_config = nas_config - - @property - def objective(self): - """Gets the objective of this V1alpha3ExperimentSpec. # noqa: E501 - - Describes the objective of the experiment. # noqa: E501 - - :return: The objective of this V1alpha3ExperimentSpec. # noqa: E501 - :rtype: V1alpha3ObjectiveSpec - """ - return self._objective - - @objective.setter - def objective(self, objective): - """Sets the objective of this V1alpha3ExperimentSpec. - - Describes the objective of the experiment. # noqa: E501 - - :param objective: The objective of this V1alpha3ExperimentSpec. # noqa: E501 - :type: V1alpha3ObjectiveSpec - """ - - self._objective = objective - - @property - def parallel_trial_count(self): - """Gets the parallel_trial_count of this V1alpha3ExperimentSpec. # noqa: E501 - - How many trials can be processed in parallel. Defaults to 3 # noqa: E501 - - :return: The parallel_trial_count of this V1alpha3ExperimentSpec. # noqa: E501 - :rtype: int - """ - return self._parallel_trial_count - - @parallel_trial_count.setter - def parallel_trial_count(self, parallel_trial_count): - """Sets the parallel_trial_count of this V1alpha3ExperimentSpec. - - How many trials can be processed in parallel. Defaults to 3 # noqa: E501 - - :param parallel_trial_count: The parallel_trial_count of this V1alpha3ExperimentSpec. # noqa: E501 - :type: int - """ - - self._parallel_trial_count = parallel_trial_count - - @property - def parameters(self): - """Gets the parameters of this V1alpha3ExperimentSpec. # noqa: E501 - - List of hyperparameter configurations. # noqa: E501 - - :return: The parameters of this V1alpha3ExperimentSpec. # noqa: E501 - :rtype: list[V1alpha3ParameterSpec] - """ - return self._parameters - - @parameters.setter - def parameters(self, parameters): - """Sets the parameters of this V1alpha3ExperimentSpec. - - List of hyperparameter configurations. # noqa: E501 - - :param parameters: The parameters of this V1alpha3ExperimentSpec. # noqa: E501 - :type: list[V1alpha3ParameterSpec] - """ - - self._parameters = parameters - - @property - def resume_policy(self): - """Gets the resume_policy of this V1alpha3ExperimentSpec. # noqa: E501 - - Describes resuming policy which usually take effect after experiment terminated. # noqa: E501 - - :return: The resume_policy of this V1alpha3ExperimentSpec. # noqa: E501 - :rtype: str - """ - return self._resume_policy - - @resume_policy.setter - def resume_policy(self, resume_policy): - """Sets the resume_policy of this V1alpha3ExperimentSpec. - - Describes resuming policy which usually take effect after experiment terminated. # noqa: E501 - - :param resume_policy: The resume_policy of this V1alpha3ExperimentSpec. # noqa: E501 - :type: str - """ - - self._resume_policy = resume_policy - - @property - def trial_template(self): - """Gets the trial_template of this V1alpha3ExperimentSpec. # noqa: E501 - - Template for each run of the trial. # noqa: E501 - - :return: The trial_template of this V1alpha3ExperimentSpec. # noqa: E501 - :rtype: V1alpha3TrialTemplate - """ - return self._trial_template - - @trial_template.setter - def trial_template(self, trial_template): - """Sets the trial_template of this V1alpha3ExperimentSpec. - - Template for each run of the trial. # noqa: E501 - - :param trial_template: The trial_template of this V1alpha3ExperimentSpec. # noqa: E501 - :type: V1alpha3TrialTemplate - """ - - self._trial_template = trial_template - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3ExperimentSpec, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3ExperimentSpec): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_status.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_status.py deleted file mode 100644 index 8f6d952564a..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_experiment_status.py +++ /dev/null @@ -1,541 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1_time import V1Time # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_experiment_condition import V1alpha3ExperimentCondition # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_optimal_trial import V1alpha3OptimalTrial # noqa: F401,E501 - - -class V1alpha3ExperimentStatus(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'completion_time': 'V1Time', - 'conditions': 'list[V1alpha3ExperimentCondition]', - 'current_optimal_trial': 'V1alpha3OptimalTrial', - 'failed_trial_list': 'list[str]', - 'killed_trial_list': 'list[str]', - 'last_reconcile_time': 'V1Time', - 'pending_trial_list': 'list[str]', - 'running_trial_list': 'list[str]', - 'start_time': 'V1Time', - 'succeeded_trial_list': 'list[str]', - 'trials': 'int', - 'trials_failed': 'int', - 'trials_killed': 'int', - 'trials_pending': 'int', - 'trials_running': 'int', - 'trials_succeeded': 'int' - } - - attribute_map = { - 'completion_time': 'completionTime', - 'conditions': 'conditions', - 'current_optimal_trial': 'currentOptimalTrial', - 'failed_trial_list': 'failedTrialList', - 'killed_trial_list': 'killedTrialList', - 'last_reconcile_time': 'lastReconcileTime', - 'pending_trial_list': 'pendingTrialList', - 'running_trial_list': 'runningTrialList', - 'start_time': 'startTime', - 'succeeded_trial_list': 'succeededTrialList', - 'trials': 'trials', - 'trials_failed': 'trialsFailed', - 'trials_killed': 'trialsKilled', - 'trials_pending': 'trialsPending', - 'trials_running': 'trialsRunning', - 'trials_succeeded': 'trialsSucceeded' - } - - def __init__(self, completion_time=None, conditions=None, current_optimal_trial=None, failed_trial_list=None, killed_trial_list=None, last_reconcile_time=None, pending_trial_list=None, running_trial_list=None, start_time=None, succeeded_trial_list=None, trials=None, trials_failed=None, trials_killed=None, trials_pending=None, trials_running=None, trials_succeeded=None): # noqa: E501 - """V1alpha3ExperimentStatus - a model defined in Swagger""" # noqa: E501 - - self._completion_time = None - self._conditions = None - self._current_optimal_trial = None - self._failed_trial_list = None - self._killed_trial_list = None - self._last_reconcile_time = None - self._pending_trial_list = None - self._running_trial_list = None - self._start_time = None - self._succeeded_trial_list = None - self._trials = None - self._trials_failed = None - self._trials_killed = None - self._trials_pending = None - self._trials_running = None - self._trials_succeeded = None - self.discriminator = None - - if completion_time is not None: - self.completion_time = completion_time - if conditions is not None: - self.conditions = conditions - if current_optimal_trial is not None: - self.current_optimal_trial = current_optimal_trial - if failed_trial_list is not None: - self.failed_trial_list = failed_trial_list - if killed_trial_list is not None: - self.killed_trial_list = killed_trial_list - if last_reconcile_time is not None: - self.last_reconcile_time = last_reconcile_time - if pending_trial_list is not None: - self.pending_trial_list = pending_trial_list - if running_trial_list is not None: - self.running_trial_list = running_trial_list - if start_time is not None: - self.start_time = start_time - if succeeded_trial_list is not None: - self.succeeded_trial_list = succeeded_trial_list - if trials is not None: - self.trials = trials - if trials_failed is not None: - self.trials_failed = trials_failed - if trials_killed is not None: - self.trials_killed = trials_killed - if trials_pending is not None: - self.trials_pending = trials_pending - if trials_running is not None: - self.trials_running = trials_running - if trials_succeeded is not None: - self.trials_succeeded = trials_succeeded - - @property - def completion_time(self): - """Gets the completion_time of this V1alpha3ExperimentStatus. # noqa: E501 - - Represents time when the Experiment was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :return: The completion_time of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: V1Time - """ - return self._completion_time - - @completion_time.setter - def completion_time(self, completion_time): - """Sets the completion_time of this V1alpha3ExperimentStatus. - - Represents time when the Experiment was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :param completion_time: The completion_time of this V1alpha3ExperimentStatus. # noqa: E501 - :type: V1Time - """ - - self._completion_time = completion_time - - @property - def conditions(self): - """Gets the conditions of this V1alpha3ExperimentStatus. # noqa: E501 - - List of observed runtime conditions for this Experiment. # noqa: E501 - - :return: The conditions of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: list[V1alpha3ExperimentCondition] - """ - return self._conditions - - @conditions.setter - def conditions(self, conditions): - """Sets the conditions of this V1alpha3ExperimentStatus. - - List of observed runtime conditions for this Experiment. # noqa: E501 - - :param conditions: The conditions of this V1alpha3ExperimentStatus. # noqa: E501 - :type: list[V1alpha3ExperimentCondition] - """ - - self._conditions = conditions - - @property - def current_optimal_trial(self): - """Gets the current_optimal_trial of this V1alpha3ExperimentStatus. # noqa: E501 - - Current optimal trial parameters and observations. # noqa: E501 - - :return: The current_optimal_trial of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: V1alpha3OptimalTrial - """ - return self._current_optimal_trial - - @current_optimal_trial.setter - def current_optimal_trial(self, current_optimal_trial): - """Sets the current_optimal_trial of this V1alpha3ExperimentStatus. - - Current optimal trial parameters and observations. # noqa: E501 - - :param current_optimal_trial: The current_optimal_trial of this V1alpha3ExperimentStatus. # noqa: E501 - :type: V1alpha3OptimalTrial - """ - - self._current_optimal_trial = current_optimal_trial - - @property - def failed_trial_list(self): - """Gets the failed_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - - List of trial names which have already failed. # noqa: E501 - - :return: The failed_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: list[str] - """ - return self._failed_trial_list - - @failed_trial_list.setter - def failed_trial_list(self, failed_trial_list): - """Sets the failed_trial_list of this V1alpha3ExperimentStatus. - - List of trial names which have already failed. # noqa: E501 - - :param failed_trial_list: The failed_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - :type: list[str] - """ - - self._failed_trial_list = failed_trial_list - - @property - def killed_trial_list(self): - """Gets the killed_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - - List of trial names which have been killed. # noqa: E501 - - :return: The killed_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: list[str] - """ - return self._killed_trial_list - - @killed_trial_list.setter - def killed_trial_list(self, killed_trial_list): - """Sets the killed_trial_list of this V1alpha3ExperimentStatus. - - List of trial names which have been killed. # noqa: E501 - - :param killed_trial_list: The killed_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - :type: list[str] - """ - - self._killed_trial_list = killed_trial_list - - @property - def last_reconcile_time(self): - """Gets the last_reconcile_time of this V1alpha3ExperimentStatus. # noqa: E501 - - Represents last time when the Experiment was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :return: The last_reconcile_time of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: V1Time - """ - return self._last_reconcile_time - - @last_reconcile_time.setter - def last_reconcile_time(self, last_reconcile_time): - """Sets the last_reconcile_time of this V1alpha3ExperimentStatus. - - Represents last time when the Experiment was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :param last_reconcile_time: The last_reconcile_time of this V1alpha3ExperimentStatus. # noqa: E501 - :type: V1Time - """ - - self._last_reconcile_time = last_reconcile_time - - @property - def pending_trial_list(self): - """Gets the pending_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - - List of trial names which are pending. # noqa: E501 - - :return: The pending_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: list[str] - """ - return self._pending_trial_list - - @pending_trial_list.setter - def pending_trial_list(self, pending_trial_list): - """Sets the pending_trial_list of this V1alpha3ExperimentStatus. - - List of trial names which are pending. # noqa: E501 - - :param pending_trial_list: The pending_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - :type: list[str] - """ - - self._pending_trial_list = pending_trial_list - - @property - def running_trial_list(self): - """Gets the running_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - - List of trial names which are running. # noqa: E501 - - :return: The running_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: list[str] - """ - return self._running_trial_list - - @running_trial_list.setter - def running_trial_list(self, running_trial_list): - """Sets the running_trial_list of this V1alpha3ExperimentStatus. - - List of trial names which are running. # noqa: E501 - - :param running_trial_list: The running_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - :type: list[str] - """ - - self._running_trial_list = running_trial_list - - @property - def start_time(self): - """Gets the start_time of this V1alpha3ExperimentStatus. # noqa: E501 - - Represents time when the Experiment was acknowledged by the Experiment controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :return: The start_time of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: V1Time - """ - return self._start_time - - @start_time.setter - def start_time(self, start_time): - """Sets the start_time of this V1alpha3ExperimentStatus. - - Represents time when the Experiment was acknowledged by the Experiment controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :param start_time: The start_time of this V1alpha3ExperimentStatus. # noqa: E501 - :type: V1Time - """ - - self._start_time = start_time - - @property - def succeeded_trial_list(self): - """Gets the succeeded_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - - List of trial names which have already succeeded. # noqa: E501 - - :return: The succeeded_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: list[str] - """ - return self._succeeded_trial_list - - @succeeded_trial_list.setter - def succeeded_trial_list(self, succeeded_trial_list): - """Sets the succeeded_trial_list of this V1alpha3ExperimentStatus. - - List of trial names which have already succeeded. # noqa: E501 - - :param succeeded_trial_list: The succeeded_trial_list of this V1alpha3ExperimentStatus. # noqa: E501 - :type: list[str] - """ - - self._succeeded_trial_list = succeeded_trial_list - - @property - def trials(self): - """Gets the trials of this V1alpha3ExperimentStatus. # noqa: E501 - - Trials is the total number of trials owned by the experiment. # noqa: E501 - - :return: The trials of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: int - """ - return self._trials - - @trials.setter - def trials(self, trials): - """Sets the trials of this V1alpha3ExperimentStatus. - - Trials is the total number of trials owned by the experiment. # noqa: E501 - - :param trials: The trials of this V1alpha3ExperimentStatus. # noqa: E501 - :type: int - """ - - self._trials = trials - - @property - def trials_failed(self): - """Gets the trials_failed of this V1alpha3ExperimentStatus. # noqa: E501 - - How many trials have failed. # noqa: E501 - - :return: The trials_failed of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: int - """ - return self._trials_failed - - @trials_failed.setter - def trials_failed(self, trials_failed): - """Sets the trials_failed of this V1alpha3ExperimentStatus. - - How many trials have failed. # noqa: E501 - - :param trials_failed: The trials_failed of this V1alpha3ExperimentStatus. # noqa: E501 - :type: int - """ - - self._trials_failed = trials_failed - - @property - def trials_killed(self): - """Gets the trials_killed of this V1alpha3ExperimentStatus. # noqa: E501 - - How many trials have been killed. # noqa: E501 - - :return: The trials_killed of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: int - """ - return self._trials_killed - - @trials_killed.setter - def trials_killed(self, trials_killed): - """Sets the trials_killed of this V1alpha3ExperimentStatus. - - How many trials have been killed. # noqa: E501 - - :param trials_killed: The trials_killed of this V1alpha3ExperimentStatus. # noqa: E501 - :type: int - """ - - self._trials_killed = trials_killed - - @property - def trials_pending(self): - """Gets the trials_pending of this V1alpha3ExperimentStatus. # noqa: E501 - - How many trials are currently pending. # noqa: E501 - - :return: The trials_pending of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: int - """ - return self._trials_pending - - @trials_pending.setter - def trials_pending(self, trials_pending): - """Sets the trials_pending of this V1alpha3ExperimentStatus. - - How many trials are currently pending. # noqa: E501 - - :param trials_pending: The trials_pending of this V1alpha3ExperimentStatus. # noqa: E501 - :type: int - """ - - self._trials_pending = trials_pending - - @property - def trials_running(self): - """Gets the trials_running of this V1alpha3ExperimentStatus. # noqa: E501 - - How many trials are currently running. # noqa: E501 - - :return: The trials_running of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: int - """ - return self._trials_running - - @trials_running.setter - def trials_running(self, trials_running): - """Sets the trials_running of this V1alpha3ExperimentStatus. - - How many trials are currently running. # noqa: E501 - - :param trials_running: The trials_running of this V1alpha3ExperimentStatus. # noqa: E501 - :type: int - """ - - self._trials_running = trials_running - - @property - def trials_succeeded(self): - """Gets the trials_succeeded of this V1alpha3ExperimentStatus. # noqa: E501 - - How many trials have succeeded. # noqa: E501 - - :return: The trials_succeeded of this V1alpha3ExperimentStatus. # noqa: E501 - :rtype: int - """ - return self._trials_succeeded - - @trials_succeeded.setter - def trials_succeeded(self, trials_succeeded): - """Sets the trials_succeeded of this V1alpha3ExperimentStatus. - - How many trials have succeeded. # noqa: E501 - - :param trials_succeeded: The trials_succeeded of this V1alpha3ExperimentStatus. # noqa: E501 - :type: int - """ - - self._trials_succeeded = trials_succeeded - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3ExperimentStatus, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3ExperimentStatus): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_feasible_space.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_feasible_space.py deleted file mode 100644 index 2fbf3c7e82a..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_feasible_space.py +++ /dev/null @@ -1,193 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1alpha3FeasibleSpace(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'list': 'list[str]', - 'max': 'str', - 'min': 'str', - 'step': 'str' - } - - attribute_map = { - 'list': 'list', - 'max': 'max', - 'min': 'min', - 'step': 'step' - } - - def __init__(self, list=None, max=None, min=None, step=None): # noqa: E501 - """V1alpha3FeasibleSpace - a model defined in Swagger""" # noqa: E501 - - self._list = None - self._max = None - self._min = None - self._step = None - self.discriminator = None - - if list is not None: - self.list = list - if max is not None: - self.max = max - if min is not None: - self.min = min - if step is not None: - self.step = step - - @property - def list(self): - """Gets the list of this V1alpha3FeasibleSpace. # noqa: E501 - - - :return: The list of this V1alpha3FeasibleSpace. # noqa: E501 - :rtype: list[str] - """ - return self._list - - @list.setter - def list(self, list): - """Sets the list of this V1alpha3FeasibleSpace. - - - :param list: The list of this V1alpha3FeasibleSpace. # noqa: E501 - :type: list[str] - """ - - self._list = list - - @property - def max(self): - """Gets the max of this V1alpha3FeasibleSpace. # noqa: E501 - - - :return: The max of this V1alpha3FeasibleSpace. # noqa: E501 - :rtype: str - """ - return self._max - - @max.setter - def max(self, max): - """Sets the max of this V1alpha3FeasibleSpace. - - - :param max: The max of this V1alpha3FeasibleSpace. # noqa: E501 - :type: str - """ - - self._max = max - - @property - def min(self): - """Gets the min of this V1alpha3FeasibleSpace. # noqa: E501 - - - :return: The min of this V1alpha3FeasibleSpace. # noqa: E501 - :rtype: str - """ - return self._min - - @min.setter - def min(self, min): - """Sets the min of this V1alpha3FeasibleSpace. - - - :param min: The min of this V1alpha3FeasibleSpace. # noqa: E501 - :type: str - """ - - self._min = min - - @property - def step(self): - """Gets the step of this V1alpha3FeasibleSpace. # noqa: E501 - - - :return: The step of this V1alpha3FeasibleSpace. # noqa: E501 - :rtype: str - """ - return self._step - - @step.setter - def step(self, step): - """Sets the step of this V1alpha3FeasibleSpace. - - - :param step: The step of this V1alpha3FeasibleSpace. # noqa: E501 - :type: str - """ - - self._step = step - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3FeasibleSpace, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3FeasibleSpace): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_file_system_path.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_file_system_path.py deleted file mode 100644 index 520eabd0e75..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_file_system_path.py +++ /dev/null @@ -1,141 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1alpha3FileSystemPath(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'kind': 'str', - 'path': 'str' - } - - attribute_map = { - 'kind': 'kind', - 'path': 'path' - } - - def __init__(self, kind=None, path=None): # noqa: E501 - """V1alpha3FileSystemPath - a model defined in Swagger""" # noqa: E501 - - self._kind = None - self._path = None - self.discriminator = None - - if kind is not None: - self.kind = kind - if path is not None: - self.path = path - - @property - def kind(self): - """Gets the kind of this V1alpha3FileSystemPath. # noqa: E501 - - - :return: The kind of this V1alpha3FileSystemPath. # noqa: E501 - :rtype: str - """ - return self._kind - - @kind.setter - def kind(self, kind): - """Sets the kind of this V1alpha3FileSystemPath. - - - :param kind: The kind of this V1alpha3FileSystemPath. # noqa: E501 - :type: str - """ - - self._kind = kind - - @property - def path(self): - """Gets the path of this V1alpha3FileSystemPath. # noqa: E501 - - - :return: The path of this V1alpha3FileSystemPath. # noqa: E501 - :rtype: str - """ - return self._path - - @path.setter - def path(self, path): - """Sets the path of this V1alpha3FileSystemPath. - - - :param path: The path of this V1alpha3FileSystemPath. # noqa: E501 - :type: str - """ - - self._path = path - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3FileSystemPath, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3FileSystemPath): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_filter_spec.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_filter_spec.py deleted file mode 100644 index 8b99f32bc28..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_filter_spec.py +++ /dev/null @@ -1,117 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1alpha3FilterSpec(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'metrics_format': 'list[str]' - } - - attribute_map = { - 'metrics_format': 'metricsFormat' - } - - def __init__(self, metrics_format=None): # noqa: E501 - """V1alpha3FilterSpec - a model defined in Swagger""" # noqa: E501 - - self._metrics_format = None - self.discriminator = None - - if metrics_format is not None: - self.metrics_format = metrics_format - - @property - def metrics_format(self): - """Gets the metrics_format of this V1alpha3FilterSpec. # noqa: E501 - - When the metrics output follows format as this field specified, metricsCollector collects it and reports to metrics server, it can be \": \" or else # noqa: E501 - - :return: The metrics_format of this V1alpha3FilterSpec. # noqa: E501 - :rtype: list[str] - """ - return self._metrics_format - - @metrics_format.setter - def metrics_format(self, metrics_format): - """Sets the metrics_format of this V1alpha3FilterSpec. - - When the metrics output follows format as this field specified, metricsCollector collects it and reports to metrics server, it can be \": \" or else # noqa: E501 - - :param metrics_format: The metrics_format of this V1alpha3FilterSpec. # noqa: E501 - :type: list[str] - """ - - self._metrics_format = metrics_format - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3FilterSpec, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3FilterSpec): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_go_template.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_go_template.py deleted file mode 100644 index dde34f4b88d..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_go_template.py +++ /dev/null @@ -1,143 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_template_spec import V1alpha3TemplateSpec # noqa: F401,E501 - - -class V1alpha3GoTemplate(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'raw_template': 'str', - 'template_spec': 'V1alpha3TemplateSpec' - } - - attribute_map = { - 'raw_template': 'rawTemplate', - 'template_spec': 'templateSpec' - } - - def __init__(self, raw_template=None, template_spec=None): # noqa: E501 - """V1alpha3GoTemplate - a model defined in Swagger""" # noqa: E501 - - self._raw_template = None - self._template_spec = None - self.discriminator = None - - if raw_template is not None: - self.raw_template = raw_template - if template_spec is not None: - self.template_spec = template_spec - - @property - def raw_template(self): - """Gets the raw_template of this V1alpha3GoTemplate. # noqa: E501 - - - :return: The raw_template of this V1alpha3GoTemplate. # noqa: E501 - :rtype: str - """ - return self._raw_template - - @raw_template.setter - def raw_template(self, raw_template): - """Sets the raw_template of this V1alpha3GoTemplate. - - - :param raw_template: The raw_template of this V1alpha3GoTemplate. # noqa: E501 - :type: str - """ - - self._raw_template = raw_template - - @property - def template_spec(self): - """Gets the template_spec of this V1alpha3GoTemplate. # noqa: E501 - - - :return: The template_spec of this V1alpha3GoTemplate. # noqa: E501 - :rtype: V1alpha3TemplateSpec - """ - return self._template_spec - - @template_spec.setter - def template_spec(self, template_spec): - """Sets the template_spec of this V1alpha3GoTemplate. - - - :param template_spec: The template_spec of this V1alpha3GoTemplate. # noqa: E501 - :type: V1alpha3TemplateSpec - """ - - self._template_spec = template_spec - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3GoTemplate, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3GoTemplate): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_graph_config.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_graph_config.py deleted file mode 100644 index 6363f6b23be..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_graph_config.py +++ /dev/null @@ -1,167 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1alpha3GraphConfig(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'input_sizes': 'list[int]', - 'num_layers': 'int', - 'output_sizes': 'list[int]' - } - - attribute_map = { - 'input_sizes': 'inputSizes', - 'num_layers': 'numLayers', - 'output_sizes': 'outputSizes' - } - - def __init__(self, input_sizes=None, num_layers=None, output_sizes=None): # noqa: E501 - """V1alpha3GraphConfig - a model defined in Swagger""" # noqa: E501 - - self._input_sizes = None - self._num_layers = None - self._output_sizes = None - self.discriminator = None - - if input_sizes is not None: - self.input_sizes = input_sizes - if num_layers is not None: - self.num_layers = num_layers - if output_sizes is not None: - self.output_sizes = output_sizes - - @property - def input_sizes(self): - """Gets the input_sizes of this V1alpha3GraphConfig. # noqa: E501 - - - :return: The input_sizes of this V1alpha3GraphConfig. # noqa: E501 - :rtype: list[int] - """ - return self._input_sizes - - @input_sizes.setter - def input_sizes(self, input_sizes): - """Sets the input_sizes of this V1alpha3GraphConfig. - - - :param input_sizes: The input_sizes of this V1alpha3GraphConfig. # noqa: E501 - :type: list[int] - """ - - self._input_sizes = input_sizes - - @property - def num_layers(self): - """Gets the num_layers of this V1alpha3GraphConfig. # noqa: E501 - - - :return: The num_layers of this V1alpha3GraphConfig. # noqa: E501 - :rtype: int - """ - return self._num_layers - - @num_layers.setter - def num_layers(self, num_layers): - """Sets the num_layers of this V1alpha3GraphConfig. - - - :param num_layers: The num_layers of this V1alpha3GraphConfig. # noqa: E501 - :type: int - """ - - self._num_layers = num_layers - - @property - def output_sizes(self): - """Gets the output_sizes of this V1alpha3GraphConfig. # noqa: E501 - - - :return: The output_sizes of this V1alpha3GraphConfig. # noqa: E501 - :rtype: list[int] - """ - return self._output_sizes - - @output_sizes.setter - def output_sizes(self, output_sizes): - """Sets the output_sizes of this V1alpha3GraphConfig. - - - :param output_sizes: The output_sizes of this V1alpha3GraphConfig. # noqa: E501 - :type: list[int] - """ - - self._output_sizes = output_sizes - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3GraphConfig, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3GraphConfig): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_metric.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_metric.py deleted file mode 100644 index 900d68db1cb..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_metric.py +++ /dev/null @@ -1,141 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1alpha3Metric(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'name': 'str', - 'value': 'float' - } - - attribute_map = { - 'name': 'name', - 'value': 'value' - } - - def __init__(self, name=None, value=None): # noqa: E501 - """V1alpha3Metric - a model defined in Swagger""" # noqa: E501 - - self._name = None - self._value = None - self.discriminator = None - - if name is not None: - self.name = name - if value is not None: - self.value = value - - @property - def name(self): - """Gets the name of this V1alpha3Metric. # noqa: E501 - - - :return: The name of this V1alpha3Metric. # noqa: E501 - :rtype: str - """ - return self._name - - @name.setter - def name(self, name): - """Sets the name of this V1alpha3Metric. - - - :param name: The name of this V1alpha3Metric. # noqa: E501 - :type: str - """ - - self._name = name - - @property - def value(self): - """Gets the value of this V1alpha3Metric. # noqa: E501 - - - :return: The value of this V1alpha3Metric. # noqa: E501 - :rtype: float - """ - return self._value - - @value.setter - def value(self, value): - """Sets the value of this V1alpha3Metric. - - - :param value: The value of this V1alpha3Metric. # noqa: E501 - :type: float - """ - - self._value = value - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3Metric, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3Metric): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_metrics_collector_spec.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_metrics_collector_spec.py deleted file mode 100644 index c41c3620da9..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_metrics_collector_spec.py +++ /dev/null @@ -1,144 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_collector_spec import V1alpha3CollectorSpec # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_source_spec import V1alpha3SourceSpec # noqa: F401,E501 - - -class V1alpha3MetricsCollectorSpec(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'collector': 'V1alpha3CollectorSpec', - 'source': 'V1alpha3SourceSpec' - } - - attribute_map = { - 'collector': 'collector', - 'source': 'source' - } - - def __init__(self, collector=None, source=None): # noqa: E501 - """V1alpha3MetricsCollectorSpec - a model defined in Swagger""" # noqa: E501 - - self._collector = None - self._source = None - self.discriminator = None - - if collector is not None: - self.collector = collector - if source is not None: - self.source = source - - @property - def collector(self): - """Gets the collector of this V1alpha3MetricsCollectorSpec. # noqa: E501 - - - :return: The collector of this V1alpha3MetricsCollectorSpec. # noqa: E501 - :rtype: V1alpha3CollectorSpec - """ - return self._collector - - @collector.setter - def collector(self, collector): - """Sets the collector of this V1alpha3MetricsCollectorSpec. - - - :param collector: The collector of this V1alpha3MetricsCollectorSpec. # noqa: E501 - :type: V1alpha3CollectorSpec - """ - - self._collector = collector - - @property - def source(self): - """Gets the source of this V1alpha3MetricsCollectorSpec. # noqa: E501 - - - :return: The source of this V1alpha3MetricsCollectorSpec. # noqa: E501 - :rtype: V1alpha3SourceSpec - """ - return self._source - - @source.setter - def source(self, source): - """Sets the source of this V1alpha3MetricsCollectorSpec. - - - :param source: The source of this V1alpha3MetricsCollectorSpec. # noqa: E501 - :type: V1alpha3SourceSpec - """ - - self._source = source - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3MetricsCollectorSpec, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3MetricsCollectorSpec): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_nas_config.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_nas_config.py deleted file mode 100644 index 2296309bd0b..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_nas_config.py +++ /dev/null @@ -1,144 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_graph_config import V1alpha3GraphConfig # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_operation import V1alpha3Operation # noqa: F401,E501 - - -class V1alpha3NasConfig(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'graph_config': 'V1alpha3GraphConfig', - 'operations': 'list[V1alpha3Operation]' - } - - attribute_map = { - 'graph_config': 'graphConfig', - 'operations': 'operations' - } - - def __init__(self, graph_config=None, operations=None): # noqa: E501 - """V1alpha3NasConfig - a model defined in Swagger""" # noqa: E501 - - self._graph_config = None - self._operations = None - self.discriminator = None - - if graph_config is not None: - self.graph_config = graph_config - if operations is not None: - self.operations = operations - - @property - def graph_config(self): - """Gets the graph_config of this V1alpha3NasConfig. # noqa: E501 - - - :return: The graph_config of this V1alpha3NasConfig. # noqa: E501 - :rtype: V1alpha3GraphConfig - """ - return self._graph_config - - @graph_config.setter - def graph_config(self, graph_config): - """Sets the graph_config of this V1alpha3NasConfig. - - - :param graph_config: The graph_config of this V1alpha3NasConfig. # noqa: E501 - :type: V1alpha3GraphConfig - """ - - self._graph_config = graph_config - - @property - def operations(self): - """Gets the operations of this V1alpha3NasConfig. # noqa: E501 - - - :return: The operations of this V1alpha3NasConfig. # noqa: E501 - :rtype: list[V1alpha3Operation] - """ - return self._operations - - @operations.setter - def operations(self, operations): - """Sets the operations of this V1alpha3NasConfig. - - - :param operations: The operations of this V1alpha3NasConfig. # noqa: E501 - :type: list[V1alpha3Operation] - """ - - self._operations = operations - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3NasConfig, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3NasConfig): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_objective_spec.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_objective_spec.py deleted file mode 100644 index b89b036f1e3..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_objective_spec.py +++ /dev/null @@ -1,195 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1alpha3ObjectiveSpec(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'additional_metric_names': 'list[str]', - 'goal': 'float', - 'objective_metric_name': 'str', - 'type': 'str' - } - - attribute_map = { - 'additional_metric_names': 'additionalMetricNames', - 'goal': 'goal', - 'objective_metric_name': 'objectiveMetricName', - 'type': 'type' - } - - def __init__(self, additional_metric_names=None, goal=None, objective_metric_name=None, type=None): # noqa: E501 - """V1alpha3ObjectiveSpec - a model defined in Swagger""" # noqa: E501 - - self._additional_metric_names = None - self._goal = None - self._objective_metric_name = None - self._type = None - self.discriminator = None - - if additional_metric_names is not None: - self.additional_metric_names = additional_metric_names - if goal is not None: - self.goal = goal - if objective_metric_name is not None: - self.objective_metric_name = objective_metric_name - if type is not None: - self.type = type - - @property - def additional_metric_names(self): - """Gets the additional_metric_names of this V1alpha3ObjectiveSpec. # noqa: E501 - - This can be empty if we only care about the objective metric. Note: If we adopt a push instead of pull mechanism, this can be omitted completely. # noqa: E501 - - :return: The additional_metric_names of this V1alpha3ObjectiveSpec. # noqa: E501 - :rtype: list[str] - """ - return self._additional_metric_names - - @additional_metric_names.setter - def additional_metric_names(self, additional_metric_names): - """Sets the additional_metric_names of this V1alpha3ObjectiveSpec. - - This can be empty if we only care about the objective metric. Note: If we adopt a push instead of pull mechanism, this can be omitted completely. # noqa: E501 - - :param additional_metric_names: The additional_metric_names of this V1alpha3ObjectiveSpec. # noqa: E501 - :type: list[str] - """ - - self._additional_metric_names = additional_metric_names - - @property - def goal(self): - """Gets the goal of this V1alpha3ObjectiveSpec. # noqa: E501 - - - :return: The goal of this V1alpha3ObjectiveSpec. # noqa: E501 - :rtype: float - """ - return self._goal - - @goal.setter - def goal(self, goal): - """Sets the goal of this V1alpha3ObjectiveSpec. - - - :param goal: The goal of this V1alpha3ObjectiveSpec. # noqa: E501 - :type: float - """ - - self._goal = goal - - @property - def objective_metric_name(self): - """Gets the objective_metric_name of this V1alpha3ObjectiveSpec. # noqa: E501 - - - :return: The objective_metric_name of this V1alpha3ObjectiveSpec. # noqa: E501 - :rtype: str - """ - return self._objective_metric_name - - @objective_metric_name.setter - def objective_metric_name(self, objective_metric_name): - """Sets the objective_metric_name of this V1alpha3ObjectiveSpec. - - - :param objective_metric_name: The objective_metric_name of this V1alpha3ObjectiveSpec. # noqa: E501 - :type: str - """ - - self._objective_metric_name = objective_metric_name - - @property - def type(self): - """Gets the type of this V1alpha3ObjectiveSpec. # noqa: E501 - - - :return: The type of this V1alpha3ObjectiveSpec. # noqa: E501 - :rtype: str - """ - return self._type - - @type.setter - def type(self, type): - """Sets the type of this V1alpha3ObjectiveSpec. - - - :param type: The type of this V1alpha3ObjectiveSpec. # noqa: E501 - :type: str - """ - - self._type = type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3ObjectiveSpec, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3ObjectiveSpec): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_observation.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_observation.py deleted file mode 100644 index 2b244afcb79..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_observation.py +++ /dev/null @@ -1,120 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_metric import V1alpha3Metric # noqa: F401,E501 - - -class V1alpha3Observation(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'metrics': 'list[V1alpha3Metric]' - } - - attribute_map = { - 'metrics': 'metrics' - } - - def __init__(self, metrics=None): # noqa: E501 - """V1alpha3Observation - a model defined in Swagger""" # noqa: E501 - - self._metrics = None - self.discriminator = None - - self.metrics = metrics - - @property - def metrics(self): - """Gets the metrics of this V1alpha3Observation. # noqa: E501 - - Key-value pairs for metric names and values # noqa: E501 - - :return: The metrics of this V1alpha3Observation. # noqa: E501 - :rtype: list[V1alpha3Metric] - """ - return self._metrics - - @metrics.setter - def metrics(self, metrics): - """Sets the metrics of this V1alpha3Observation. - - Key-value pairs for metric names and values # noqa: E501 - - :param metrics: The metrics of this V1alpha3Observation. # noqa: E501 - :type: list[V1alpha3Metric] - """ - if metrics is None: - raise ValueError("Invalid value for `metrics`, must not be `None`") # noqa: E501 - - self._metrics = metrics - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3Observation, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3Observation): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_operation.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_operation.py deleted file mode 100644 index 2880f5e173f..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_operation.py +++ /dev/null @@ -1,143 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_parameter_spec import V1alpha3ParameterSpec # noqa: F401,E501 - - -class V1alpha3Operation(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'operation_type': 'str', - 'parameters': 'list[V1alpha3ParameterSpec]' - } - - attribute_map = { - 'operation_type': 'operationType', - 'parameters': 'parameters' - } - - def __init__(self, operation_type=None, parameters=None): # noqa: E501 - """V1alpha3Operation - a model defined in Swagger""" # noqa: E501 - - self._operation_type = None - self._parameters = None - self.discriminator = None - - if operation_type is not None: - self.operation_type = operation_type - if parameters is not None: - self.parameters = parameters - - @property - def operation_type(self): - """Gets the operation_type of this V1alpha3Operation. # noqa: E501 - - - :return: The operation_type of this V1alpha3Operation. # noqa: E501 - :rtype: str - """ - return self._operation_type - - @operation_type.setter - def operation_type(self, operation_type): - """Sets the operation_type of this V1alpha3Operation. - - - :param operation_type: The operation_type of this V1alpha3Operation. # noqa: E501 - :type: str - """ - - self._operation_type = operation_type - - @property - def parameters(self): - """Gets the parameters of this V1alpha3Operation. # noqa: E501 - - - :return: The parameters of this V1alpha3Operation. # noqa: E501 - :rtype: list[V1alpha3ParameterSpec] - """ - return self._parameters - - @parameters.setter - def parameters(self, parameters): - """Sets the parameters of this V1alpha3Operation. - - - :param parameters: The parameters of this V1alpha3Operation. # noqa: E501 - :type: list[V1alpha3ParameterSpec] - """ - - self._parameters = parameters - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3Operation, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3Operation): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_optimal_trial.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_optimal_trial.py deleted file mode 100644 index d24ae509739..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_optimal_trial.py +++ /dev/null @@ -1,178 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_observation import V1alpha3Observation # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_parameter_assignment import V1alpha3ParameterAssignment # noqa: F401,E501 - - -class V1alpha3OptimalTrial(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'best_trial_name': 'str', - 'observation': 'V1alpha3Observation', - 'parameter_assignments': 'list[V1alpha3ParameterAssignment]' - } - - attribute_map = { - 'best_trial_name': 'bestTrialName', - 'observation': 'observation', - 'parameter_assignments': 'parameterAssignments' - } - - def __init__(self, best_trial_name=None, observation=None, parameter_assignments=None): # noqa: E501 - """V1alpha3OptimalTrial - a model defined in Swagger""" # noqa: E501 - - self._best_trial_name = None - self._observation = None - self._parameter_assignments = None - self.discriminator = None - - self.best_trial_name = best_trial_name - if observation is not None: - self.observation = observation - self.parameter_assignments = parameter_assignments - - @property - def best_trial_name(self): - """Gets the best_trial_name of this V1alpha3OptimalTrial. # noqa: E501 - - BestTrialName is the name of the best trial. # noqa: E501 - - :return: The best_trial_name of this V1alpha3OptimalTrial. # noqa: E501 - :rtype: str - """ - return self._best_trial_name - - @best_trial_name.setter - def best_trial_name(self, best_trial_name): - """Sets the best_trial_name of this V1alpha3OptimalTrial. - - BestTrialName is the name of the best trial. # noqa: E501 - - :param best_trial_name: The best_trial_name of this V1alpha3OptimalTrial. # noqa: E501 - :type: str - """ - if best_trial_name is None: - raise ValueError("Invalid value for `best_trial_name`, must not be `None`") # noqa: E501 - - self._best_trial_name = best_trial_name - - @property - def observation(self): - """Gets the observation of this V1alpha3OptimalTrial. # noqa: E501 - - Observation for this trial # noqa: E501 - - :return: The observation of this V1alpha3OptimalTrial. # noqa: E501 - :rtype: V1alpha3Observation - """ - return self._observation - - @observation.setter - def observation(self, observation): - """Sets the observation of this V1alpha3OptimalTrial. - - Observation for this trial # noqa: E501 - - :param observation: The observation of this V1alpha3OptimalTrial. # noqa: E501 - :type: V1alpha3Observation - """ - - self._observation = observation - - @property - def parameter_assignments(self): - """Gets the parameter_assignments of this V1alpha3OptimalTrial. # noqa: E501 - - Key-value pairs for hyperparameters and assignment values. # noqa: E501 - - :return: The parameter_assignments of this V1alpha3OptimalTrial. # noqa: E501 - :rtype: list[V1alpha3ParameterAssignment] - """ - return self._parameter_assignments - - @parameter_assignments.setter - def parameter_assignments(self, parameter_assignments): - """Sets the parameter_assignments of this V1alpha3OptimalTrial. - - Key-value pairs for hyperparameters and assignment values. # noqa: E501 - - :param parameter_assignments: The parameter_assignments of this V1alpha3OptimalTrial. # noqa: E501 - :type: list[V1alpha3ParameterAssignment] - """ - if parameter_assignments is None: - raise ValueError("Invalid value for `parameter_assignments`, must not be `None`") # noqa: E501 - - self._parameter_assignments = parameter_assignments - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3OptimalTrial, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3OptimalTrial): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_parameter_assignment.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_parameter_assignment.py deleted file mode 100644 index a1d3698b4c9..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_parameter_assignment.py +++ /dev/null @@ -1,141 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1alpha3ParameterAssignment(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'name': 'str', - 'value': 'str' - } - - attribute_map = { - 'name': 'name', - 'value': 'value' - } - - def __init__(self, name=None, value=None): # noqa: E501 - """V1alpha3ParameterAssignment - a model defined in Swagger""" # noqa: E501 - - self._name = None - self._value = None - self.discriminator = None - - if name is not None: - self.name = name - if value is not None: - self.value = value - - @property - def name(self): - """Gets the name of this V1alpha3ParameterAssignment. # noqa: E501 - - - :return: The name of this V1alpha3ParameterAssignment. # noqa: E501 - :rtype: str - """ - return self._name - - @name.setter - def name(self, name): - """Sets the name of this V1alpha3ParameterAssignment. - - - :param name: The name of this V1alpha3ParameterAssignment. # noqa: E501 - :type: str - """ - - self._name = name - - @property - def value(self): - """Gets the value of this V1alpha3ParameterAssignment. # noqa: E501 - - - :return: The value of this V1alpha3ParameterAssignment. # noqa: E501 - :rtype: str - """ - return self._value - - @value.setter - def value(self, value): - """Sets the value of this V1alpha3ParameterAssignment. - - - :param value: The value of this V1alpha3ParameterAssignment. # noqa: E501 - :type: str - """ - - self._value = value - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3ParameterAssignment, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3ParameterAssignment): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_parameter_spec.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_parameter_spec.py deleted file mode 100644 index 662e9da1665..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_parameter_spec.py +++ /dev/null @@ -1,169 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_feasible_space import V1alpha3FeasibleSpace # noqa: F401,E501 - - -class V1alpha3ParameterSpec(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'feasible_space': 'V1alpha3FeasibleSpace', - 'name': 'str', - 'parameter_type': 'str' - } - - attribute_map = { - 'feasible_space': 'feasibleSpace', - 'name': 'name', - 'parameter_type': 'parameterType' - } - - def __init__(self, feasible_space=None, name=None, parameter_type=None): # noqa: E501 - """V1alpha3ParameterSpec - a model defined in Swagger""" # noqa: E501 - - self._feasible_space = None - self._name = None - self._parameter_type = None - self.discriminator = None - - if feasible_space is not None: - self.feasible_space = feasible_space - if name is not None: - self.name = name - if parameter_type is not None: - self.parameter_type = parameter_type - - @property - def feasible_space(self): - """Gets the feasible_space of this V1alpha3ParameterSpec. # noqa: E501 - - - :return: The feasible_space of this V1alpha3ParameterSpec. # noqa: E501 - :rtype: V1alpha3FeasibleSpace - """ - return self._feasible_space - - @feasible_space.setter - def feasible_space(self, feasible_space): - """Sets the feasible_space of this V1alpha3ParameterSpec. - - - :param feasible_space: The feasible_space of this V1alpha3ParameterSpec. # noqa: E501 - :type: V1alpha3FeasibleSpace - """ - - self._feasible_space = feasible_space - - @property - def name(self): - """Gets the name of this V1alpha3ParameterSpec. # noqa: E501 - - - :return: The name of this V1alpha3ParameterSpec. # noqa: E501 - :rtype: str - """ - return self._name - - @name.setter - def name(self, name): - """Sets the name of this V1alpha3ParameterSpec. - - - :param name: The name of this V1alpha3ParameterSpec. # noqa: E501 - :type: str - """ - - self._name = name - - @property - def parameter_type(self): - """Gets the parameter_type of this V1alpha3ParameterSpec. # noqa: E501 - - - :return: The parameter_type of this V1alpha3ParameterSpec. # noqa: E501 - :rtype: str - """ - return self._parameter_type - - @parameter_type.setter - def parameter_type(self, parameter_type): - """Sets the parameter_type of this V1alpha3ParameterSpec. - - - :param parameter_type: The parameter_type of this V1alpha3ParameterSpec. # noqa: E501 - :type: str - """ - - self._parameter_type = parameter_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3ParameterSpec, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3ParameterSpec): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_source_spec.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_source_spec.py deleted file mode 100644 index f3def097852..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_source_spec.py +++ /dev/null @@ -1,177 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_file_system_path import V1alpha3FileSystemPath # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_filter_spec import V1alpha3FilterSpec # noqa: F401,E501 -from kubernetes.client import V1HTTPGetAction # noqa: F401,E501 - - -class V1alpha3SourceSpec(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'file_system_path': 'V1alpha3FileSystemPath', - 'filter': 'V1alpha3FilterSpec', - 'http_get': 'V1HTTPGetAction' - } - - attribute_map = { - 'file_system_path': 'fileSystemPath', - 'filter': 'filter', - 'http_get': 'httpGet' - } - - def __init__(self, file_system_path=None, filter=None, http_get=None): # noqa: E501 - """V1alpha3SourceSpec - a model defined in Swagger""" # noqa: E501 - - self._file_system_path = None - self._filter = None - self._http_get = None - self.discriminator = None - - if file_system_path is not None: - self.file_system_path = file_system_path - if filter is not None: - self.filter = filter - if http_get is not None: - self.http_get = http_get - - @property - def file_system_path(self): - """Gets the file_system_path of this V1alpha3SourceSpec. # noqa: E501 - - During training model, metrics may be persisted into local file in source code, such as tfEvent use case # noqa: E501 - - :return: The file_system_path of this V1alpha3SourceSpec. # noqa: E501 - :rtype: V1alpha3FileSystemPath - """ - return self._file_system_path - - @file_system_path.setter - def file_system_path(self, file_system_path): - """Sets the file_system_path of this V1alpha3SourceSpec. - - During training model, metrics may be persisted into local file in source code, such as tfEvent use case # noqa: E501 - - :param file_system_path: The file_system_path of this V1alpha3SourceSpec. # noqa: E501 - :type: V1alpha3FileSystemPath - """ - - self._file_system_path = file_system_path - - @property - def filter(self): - """Gets the filter of this V1alpha3SourceSpec. # noqa: E501 - - Default metric output format is {\"metric\": \"\", \"value\": , \"epoch\": , \"step\": }, but if the output doesn't follow default format, please extend it here # noqa: E501 - - :return: The filter of this V1alpha3SourceSpec. # noqa: E501 - :rtype: V1alpha3FilterSpec - """ - return self._filter - - @filter.setter - def filter(self, filter): - """Sets the filter of this V1alpha3SourceSpec. - - Default metric output format is {\"metric\": \"\", \"value\": , \"epoch\": , \"step\": }, but if the output doesn't follow default format, please extend it here # noqa: E501 - - :param filter: The filter of this V1alpha3SourceSpec. # noqa: E501 - :type: V1alpha3FilterSpec - """ - - self._filter = filter - - @property - def http_get(self): - """Gets the http_get of this V1alpha3SourceSpec. # noqa: E501 - - Model-train source code can expose metrics by http, such as HTTP endpoint in prometheus metric format # noqa: E501 - - :return: The http_get of this V1alpha3SourceSpec. # noqa: E501 - :rtype: V1HTTPGetAction - """ - return self._http_get - - @http_get.setter - def http_get(self, http_get): - """Sets the http_get of this V1alpha3SourceSpec. - - Model-train source code can expose metrics by http, such as HTTP endpoint in prometheus metric format # noqa: E501 - - :param http_get: The http_get of this V1alpha3SourceSpec. # noqa: E501 - :type: V1HTTPGetAction - """ - - self._http_get = http_get - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3SourceSpec, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3SourceSpec): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion.py deleted file mode 100644 index e0a3067f62b..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion.py +++ /dev/null @@ -1,227 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_suggestion_spec import V1alpha3SuggestionSpec # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_suggestion_status import V1alpha3SuggestionStatus # noqa: F401,E501 -from kubernetes.client import V1ObjectMeta # noqa: F401,E501 - - -class V1alpha3Suggestion(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'api_version': 'str', - 'kind': 'str', - 'metadata': 'V1ObjectMeta', - 'spec': 'V1alpha3SuggestionSpec', - 'status': 'V1alpha3SuggestionStatus' - } - - attribute_map = { - 'api_version': 'apiVersion', - 'kind': 'kind', - 'metadata': 'metadata', - 'spec': 'spec', - 'status': 'status' - } - - def __init__(self, api_version=None, kind=None, metadata=None, spec=None, status=None): # noqa: E501 - """V1alpha3Suggestion - a model defined in Swagger""" # noqa: E501 - - self._api_version = None - self._kind = None - self._metadata = None - self._spec = None - self._status = None - self.discriminator = None - - if api_version is not None: - self.api_version = api_version - if kind is not None: - self.kind = kind - if metadata is not None: - self.metadata = metadata - if spec is not None: - self.spec = spec - if status is not None: - self.status = status - - @property - def api_version(self): - """Gets the api_version of this V1alpha3Suggestion. # noqa: E501 - - APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources # noqa: E501 - - :return: The api_version of this V1alpha3Suggestion. # noqa: E501 - :rtype: str - """ - return self._api_version - - @api_version.setter - def api_version(self, api_version): - """Sets the api_version of this V1alpha3Suggestion. - - APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources # noqa: E501 - - :param api_version: The api_version of this V1alpha3Suggestion. # noqa: E501 - :type: str - """ - - self._api_version = api_version - - @property - def kind(self): - """Gets the kind of this V1alpha3Suggestion. # noqa: E501 - - Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds # noqa: E501 - - :return: The kind of this V1alpha3Suggestion. # noqa: E501 - :rtype: str - """ - return self._kind - - @kind.setter - def kind(self, kind): - """Sets the kind of this V1alpha3Suggestion. - - Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds # noqa: E501 - - :param kind: The kind of this V1alpha3Suggestion. # noqa: E501 - :type: str - """ - - self._kind = kind - - @property - def metadata(self): - """Gets the metadata of this V1alpha3Suggestion. # noqa: E501 - - - :return: The metadata of this V1alpha3Suggestion. # noqa: E501 - :rtype: V1ObjectMeta - """ - return self._metadata - - @metadata.setter - def metadata(self, metadata): - """Sets the metadata of this V1alpha3Suggestion. - - - :param metadata: The metadata of this V1alpha3Suggestion. # noqa: E501 - :type: V1ObjectMeta - """ - - self._metadata = metadata - - @property - def spec(self): - """Gets the spec of this V1alpha3Suggestion. # noqa: E501 - - - :return: The spec of this V1alpha3Suggestion. # noqa: E501 - :rtype: V1alpha3SuggestionSpec - """ - return self._spec - - @spec.setter - def spec(self, spec): - """Sets the spec of this V1alpha3Suggestion. - - - :param spec: The spec of this V1alpha3Suggestion. # noqa: E501 - :type: V1alpha3SuggestionSpec - """ - - self._spec = spec - - @property - def status(self): - """Gets the status of this V1alpha3Suggestion. # noqa: E501 - - - :return: The status of this V1alpha3Suggestion. # noqa: E501 - :rtype: V1alpha3SuggestionStatus - """ - return self._status - - @status.setter - def status(self, status): - """Sets the status of this V1alpha3Suggestion. - - - :param status: The status of this V1alpha3Suggestion. # noqa: E501 - :type: V1alpha3SuggestionStatus - """ - - self._status = status - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3Suggestion, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3Suggestion): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_condition.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_condition.py deleted file mode 100644 index 8f36927709f..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_condition.py +++ /dev/null @@ -1,261 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1_time import V1Time # noqa: F401,E501 - - -class V1alpha3SuggestionCondition(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'last_transition_time': 'V1Time', - 'last_update_time': 'V1Time', - 'message': 'str', - 'reason': 'str', - 'status': 'str', - 'type': 'str' - } - - attribute_map = { - 'last_transition_time': 'lastTransitionTime', - 'last_update_time': 'lastUpdateTime', - 'message': 'message', - 'reason': 'reason', - 'status': 'status', - 'type': 'type' - } - - def __init__(self, last_transition_time=None, last_update_time=None, message=None, reason=None, status=None, type=None): # noqa: E501 - """V1alpha3SuggestionCondition - a model defined in Swagger""" # noqa: E501 - - self._last_transition_time = None - self._last_update_time = None - self._message = None - self._reason = None - self._status = None - self._type = None - self.discriminator = None - - if last_transition_time is not None: - self.last_transition_time = last_transition_time - if last_update_time is not None: - self.last_update_time = last_update_time - if message is not None: - self.message = message - if reason is not None: - self.reason = reason - self.status = status - self.type = type - - @property - def last_transition_time(self): - """Gets the last_transition_time of this V1alpha3SuggestionCondition. # noqa: E501 - - Last time the condition transitioned from one status to another. # noqa: E501 - - :return: The last_transition_time of this V1alpha3SuggestionCondition. # noqa: E501 - :rtype: V1Time - """ - return self._last_transition_time - - @last_transition_time.setter - def last_transition_time(self, last_transition_time): - """Sets the last_transition_time of this V1alpha3SuggestionCondition. - - Last time the condition transitioned from one status to another. # noqa: E501 - - :param last_transition_time: The last_transition_time of this V1alpha3SuggestionCondition. # noqa: E501 - :type: V1Time - """ - - self._last_transition_time = last_transition_time - - @property - def last_update_time(self): - """Gets the last_update_time of this V1alpha3SuggestionCondition. # noqa: E501 - - The last time this condition was updated. # noqa: E501 - - :return: The last_update_time of this V1alpha3SuggestionCondition. # noqa: E501 - :rtype: V1Time - """ - return self._last_update_time - - @last_update_time.setter - def last_update_time(self, last_update_time): - """Sets the last_update_time of this V1alpha3SuggestionCondition. - - The last time this condition was updated. # noqa: E501 - - :param last_update_time: The last_update_time of this V1alpha3SuggestionCondition. # noqa: E501 - :type: V1Time - """ - - self._last_update_time = last_update_time - - @property - def message(self): - """Gets the message of this V1alpha3SuggestionCondition. # noqa: E501 - - A human readable message indicating details about the transition. # noqa: E501 - - :return: The message of this V1alpha3SuggestionCondition. # noqa: E501 - :rtype: str - """ - return self._message - - @message.setter - def message(self, message): - """Sets the message of this V1alpha3SuggestionCondition. - - A human readable message indicating details about the transition. # noqa: E501 - - :param message: The message of this V1alpha3SuggestionCondition. # noqa: E501 - :type: str - """ - - self._message = message - - @property - def reason(self): - """Gets the reason of this V1alpha3SuggestionCondition. # noqa: E501 - - The reason for the condition's last transition. # noqa: E501 - - :return: The reason of this V1alpha3SuggestionCondition. # noqa: E501 - :rtype: str - """ - return self._reason - - @reason.setter - def reason(self, reason): - """Sets the reason of this V1alpha3SuggestionCondition. - - The reason for the condition's last transition. # noqa: E501 - - :param reason: The reason of this V1alpha3SuggestionCondition. # noqa: E501 - :type: str - """ - - self._reason = reason - - @property - def status(self): - """Gets the status of this V1alpha3SuggestionCondition. # noqa: E501 - - Status of the condition, one of True, False, Unknown. # noqa: E501 - - :return: The status of this V1alpha3SuggestionCondition. # noqa: E501 - :rtype: str - """ - return self._status - - @status.setter - def status(self, status): - """Sets the status of this V1alpha3SuggestionCondition. - - Status of the condition, one of True, False, Unknown. # noqa: E501 - - :param status: The status of this V1alpha3SuggestionCondition. # noqa: E501 - :type: str - """ - if status is None: - raise ValueError("Invalid value for `status`, must not be `None`") # noqa: E501 - - self._status = status - - @property - def type(self): - """Gets the type of this V1alpha3SuggestionCondition. # noqa: E501 - - Type of Suggestion condition. # noqa: E501 - - :return: The type of this V1alpha3SuggestionCondition. # noqa: E501 - :rtype: str - """ - return self._type - - @type.setter - def type(self, type): - """Sets the type of this V1alpha3SuggestionCondition. - - Type of Suggestion condition. # noqa: E501 - - :param type: The type of this V1alpha3SuggestionCondition. # noqa: E501 - :type: str - """ - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - - self._type = type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3SuggestionCondition, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3SuggestionCondition): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_list.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_list.py deleted file mode 100644 index 3a48a58bf4e..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_list.py +++ /dev/null @@ -1,201 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_suggestion import V1alpha3Suggestion # noqa: F401,E501 -from kubernetes.client import V1ListMeta # noqa: F401,E501 - - -class V1alpha3SuggestionList(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'api_version': 'str', - 'items': 'list[V1alpha3Suggestion]', - 'kind': 'str', - 'metadata': 'V1ListMeta' - } - - attribute_map = { - 'api_version': 'apiVersion', - 'items': 'items', - 'kind': 'kind', - 'metadata': 'metadata' - } - - def __init__(self, api_version=None, items=None, kind=None, metadata=None): # noqa: E501 - """V1alpha3SuggestionList - a model defined in Swagger""" # noqa: E501 - - self._api_version = None - self._items = None - self._kind = None - self._metadata = None - self.discriminator = None - - if api_version is not None: - self.api_version = api_version - self.items = items - if kind is not None: - self.kind = kind - if metadata is not None: - self.metadata = metadata - - @property - def api_version(self): - """Gets the api_version of this V1alpha3SuggestionList. # noqa: E501 - - APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources # noqa: E501 - - :return: The api_version of this V1alpha3SuggestionList. # noqa: E501 - :rtype: str - """ - return self._api_version - - @api_version.setter - def api_version(self, api_version): - """Sets the api_version of this V1alpha3SuggestionList. - - APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources # noqa: E501 - - :param api_version: The api_version of this V1alpha3SuggestionList. # noqa: E501 - :type: str - """ - - self._api_version = api_version - - @property - def items(self): - """Gets the items of this V1alpha3SuggestionList. # noqa: E501 - - - :return: The items of this V1alpha3SuggestionList. # noqa: E501 - :rtype: list[V1alpha3Suggestion] - """ - return self._items - - @items.setter - def items(self, items): - """Sets the items of this V1alpha3SuggestionList. - - - :param items: The items of this V1alpha3SuggestionList. # noqa: E501 - :type: list[V1alpha3Suggestion] - """ - if items is None: - raise ValueError("Invalid value for `items`, must not be `None`") # noqa: E501 - - self._items = items - - @property - def kind(self): - """Gets the kind of this V1alpha3SuggestionList. # noqa: E501 - - Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds # noqa: E501 - - :return: The kind of this V1alpha3SuggestionList. # noqa: E501 - :rtype: str - """ - return self._kind - - @kind.setter - def kind(self, kind): - """Sets the kind of this V1alpha3SuggestionList. - - Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds # noqa: E501 - - :param kind: The kind of this V1alpha3SuggestionList. # noqa: E501 - :type: str - """ - - self._kind = kind - - @property - def metadata(self): - """Gets the metadata of this V1alpha3SuggestionList. # noqa: E501 - - - :return: The metadata of this V1alpha3SuggestionList. # noqa: E501 - :rtype: V1ListMeta - """ - return self._metadata - - @metadata.setter - def metadata(self, metadata): - """Sets the metadata of this V1alpha3SuggestionList. - - - :param metadata: The metadata of this V1alpha3SuggestionList. # noqa: E501 - :type: V1ListMeta - """ - - self._metadata = metadata - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3SuggestionList, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3SuggestionList): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_spec.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_spec.py deleted file mode 100644 index f594a5facd7..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_spec.py +++ /dev/null @@ -1,144 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1alpha3SuggestionSpec(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'algorithm_name': 'str', - 'requests': 'int' - } - - attribute_map = { - 'algorithm_name': 'algorithmName', - 'requests': 'requests' - } - - def __init__(self, algorithm_name=None, requests=None): # noqa: E501 - """V1alpha3SuggestionSpec - a model defined in Swagger""" # noqa: E501 - - self._algorithm_name = None - self._requests = None - self.discriminator = None - - self.algorithm_name = algorithm_name - if requests is not None: - self.requests = requests - - @property - def algorithm_name(self): - """Gets the algorithm_name of this V1alpha3SuggestionSpec. # noqa: E501 - - - :return: The algorithm_name of this V1alpha3SuggestionSpec. # noqa: E501 - :rtype: str - """ - return self._algorithm_name - - @algorithm_name.setter - def algorithm_name(self, algorithm_name): - """Sets the algorithm_name of this V1alpha3SuggestionSpec. - - - :param algorithm_name: The algorithm_name of this V1alpha3SuggestionSpec. # noqa: E501 - :type: str - """ - if algorithm_name is None: - raise ValueError("Invalid value for `algorithm_name`, must not be `None`") # noqa: E501 - - self._algorithm_name = algorithm_name - - @property - def requests(self): - """Gets the requests of this V1alpha3SuggestionSpec. # noqa: E501 - - Number of suggestions requested # noqa: E501 - - :return: The requests of this V1alpha3SuggestionSpec. # noqa: E501 - :rtype: int - """ - return self._requests - - @requests.setter - def requests(self, requests): - """Sets the requests of this V1alpha3SuggestionSpec. - - Number of suggestions requested # noqa: E501 - - :param requests: The requests of this V1alpha3SuggestionSpec. # noqa: E501 - :type: int - """ - - self._requests = requests - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3SuggestionSpec, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3SuggestionSpec): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_status.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_status.py deleted file mode 100644 index 5f19388b328..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_suggestion_status.py +++ /dev/null @@ -1,290 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1_time import V1Time # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_algorithm_setting import V1alpha3AlgorithmSetting # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_suggestion_condition import V1alpha3SuggestionCondition # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_trial_assignment import V1alpha3TrialAssignment # noqa: F401,E501 - - -class V1alpha3SuggestionStatus(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'algorithm_settings': 'list[V1alpha3AlgorithmSetting]', - 'completion_time': 'V1Time', - 'conditions': 'list[V1alpha3SuggestionCondition]', - 'last_reconcile_time': 'V1Time', - 'start_time': 'V1Time', - 'suggestion_count': 'int', - 'suggestions': 'list[V1alpha3TrialAssignment]' - } - - attribute_map = { - 'algorithm_settings': 'algorithmSettings', - 'completion_time': 'completionTime', - 'conditions': 'conditions', - 'last_reconcile_time': 'lastReconcileTime', - 'start_time': 'startTime', - 'suggestion_count': 'suggestionCount', - 'suggestions': 'suggestions' - } - - def __init__(self, algorithm_settings=None, completion_time=None, conditions=None, last_reconcile_time=None, start_time=None, suggestion_count=None, suggestions=None): # noqa: E501 - """V1alpha3SuggestionStatus - a model defined in Swagger""" # noqa: E501 - - self._algorithm_settings = None - self._completion_time = None - self._conditions = None - self._last_reconcile_time = None - self._start_time = None - self._suggestion_count = None - self._suggestions = None - self.discriminator = None - - if algorithm_settings is not None: - self.algorithm_settings = algorithm_settings - if completion_time is not None: - self.completion_time = completion_time - if conditions is not None: - self.conditions = conditions - if last_reconcile_time is not None: - self.last_reconcile_time = last_reconcile_time - if start_time is not None: - self.start_time = start_time - if suggestion_count is not None: - self.suggestion_count = suggestion_count - if suggestions is not None: - self.suggestions = suggestions - - @property - def algorithm_settings(self): - """Gets the algorithm_settings of this V1alpha3SuggestionStatus. # noqa: E501 - - Algorithmsettings set by the algorithm services. # noqa: E501 - - :return: The algorithm_settings of this V1alpha3SuggestionStatus. # noqa: E501 - :rtype: list[V1alpha3AlgorithmSetting] - """ - return self._algorithm_settings - - @algorithm_settings.setter - def algorithm_settings(self, algorithm_settings): - """Sets the algorithm_settings of this V1alpha3SuggestionStatus. - - Algorithmsettings set by the algorithm services. # noqa: E501 - - :param algorithm_settings: The algorithm_settings of this V1alpha3SuggestionStatus. # noqa: E501 - :type: list[V1alpha3AlgorithmSetting] - """ - - self._algorithm_settings = algorithm_settings - - @property - def completion_time(self): - """Gets the completion_time of this V1alpha3SuggestionStatus. # noqa: E501 - - Represents time when the Suggestion was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :return: The completion_time of this V1alpha3SuggestionStatus. # noqa: E501 - :rtype: V1Time - """ - return self._completion_time - - @completion_time.setter - def completion_time(self, completion_time): - """Sets the completion_time of this V1alpha3SuggestionStatus. - - Represents time when the Suggestion was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :param completion_time: The completion_time of this V1alpha3SuggestionStatus. # noqa: E501 - :type: V1Time - """ - - self._completion_time = completion_time - - @property - def conditions(self): - """Gets the conditions of this V1alpha3SuggestionStatus. # noqa: E501 - - List of observed runtime conditions for this Suggestion. # noqa: E501 - - :return: The conditions of this V1alpha3SuggestionStatus. # noqa: E501 - :rtype: list[V1alpha3SuggestionCondition] - """ - return self._conditions - - @conditions.setter - def conditions(self, conditions): - """Sets the conditions of this V1alpha3SuggestionStatus. - - List of observed runtime conditions for this Suggestion. # noqa: E501 - - :param conditions: The conditions of this V1alpha3SuggestionStatus. # noqa: E501 - :type: list[V1alpha3SuggestionCondition] - """ - - self._conditions = conditions - - @property - def last_reconcile_time(self): - """Gets the last_reconcile_time of this V1alpha3SuggestionStatus. # noqa: E501 - - Represents last time when the Suggestion was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :return: The last_reconcile_time of this V1alpha3SuggestionStatus. # noqa: E501 - :rtype: V1Time - """ - return self._last_reconcile_time - - @last_reconcile_time.setter - def last_reconcile_time(self, last_reconcile_time): - """Sets the last_reconcile_time of this V1alpha3SuggestionStatus. - - Represents last time when the Suggestion was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :param last_reconcile_time: The last_reconcile_time of this V1alpha3SuggestionStatus. # noqa: E501 - :type: V1Time - """ - - self._last_reconcile_time = last_reconcile_time - - @property - def start_time(self): - """Gets the start_time of this V1alpha3SuggestionStatus. # noqa: E501 - - Represents time when the Suggestion was acknowledged by the Suggestion controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :return: The start_time of this V1alpha3SuggestionStatus. # noqa: E501 - :rtype: V1Time - """ - return self._start_time - - @start_time.setter - def start_time(self, start_time): - """Sets the start_time of this V1alpha3SuggestionStatus. - - Represents time when the Suggestion was acknowledged by the Suggestion controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :param start_time: The start_time of this V1alpha3SuggestionStatus. # noqa: E501 - :type: V1Time - """ - - self._start_time = start_time - - @property - def suggestion_count(self): - """Gets the suggestion_count of this V1alpha3SuggestionStatus. # noqa: E501 - - Number of suggestion results # noqa: E501 - - :return: The suggestion_count of this V1alpha3SuggestionStatus. # noqa: E501 - :rtype: int - """ - return self._suggestion_count - - @suggestion_count.setter - def suggestion_count(self, suggestion_count): - """Sets the suggestion_count of this V1alpha3SuggestionStatus. - - Number of suggestion results # noqa: E501 - - :param suggestion_count: The suggestion_count of this V1alpha3SuggestionStatus. # noqa: E501 - :type: int - """ - - self._suggestion_count = suggestion_count - - @property - def suggestions(self): - """Gets the suggestions of this V1alpha3SuggestionStatus. # noqa: E501 - - Suggestion results # noqa: E501 - - :return: The suggestions of this V1alpha3SuggestionStatus. # noqa: E501 - :rtype: list[V1alpha3TrialAssignment] - """ - return self._suggestions - - @suggestions.setter - def suggestions(self, suggestions): - """Sets the suggestions of this V1alpha3SuggestionStatus. - - Suggestion results # noqa: E501 - - :param suggestions: The suggestions of this V1alpha3SuggestionStatus. # noqa: E501 - :type: list[V1alpha3TrialAssignment] - """ - - self._suggestions = suggestions - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3SuggestionStatus, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3SuggestionStatus): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_template_spec.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_template_spec.py deleted file mode 100644 index bee1a1a1112..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_template_spec.py +++ /dev/null @@ -1,167 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1alpha3TemplateSpec(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'config_map_name': 'str', - 'config_map_namespace': 'str', - 'template_path': 'str' - } - - attribute_map = { - 'config_map_name': 'configMapName', - 'config_map_namespace': 'configMapNamespace', - 'template_path': 'templatePath' - } - - def __init__(self, config_map_name=None, config_map_namespace=None, template_path=None): # noqa: E501 - """V1alpha3TemplateSpec - a model defined in Swagger""" # noqa: E501 - - self._config_map_name = None - self._config_map_namespace = None - self._template_path = None - self.discriminator = None - - if config_map_name is not None: - self.config_map_name = config_map_name - if config_map_namespace is not None: - self.config_map_namespace = config_map_namespace - if template_path is not None: - self.template_path = template_path - - @property - def config_map_name(self): - """Gets the config_map_name of this V1alpha3TemplateSpec. # noqa: E501 - - - :return: The config_map_name of this V1alpha3TemplateSpec. # noqa: E501 - :rtype: str - """ - return self._config_map_name - - @config_map_name.setter - def config_map_name(self, config_map_name): - """Sets the config_map_name of this V1alpha3TemplateSpec. - - - :param config_map_name: The config_map_name of this V1alpha3TemplateSpec. # noqa: E501 - :type: str - """ - - self._config_map_name = config_map_name - - @property - def config_map_namespace(self): - """Gets the config_map_namespace of this V1alpha3TemplateSpec. # noqa: E501 - - - :return: The config_map_namespace of this V1alpha3TemplateSpec. # noqa: E501 - :rtype: str - """ - return self._config_map_namespace - - @config_map_namespace.setter - def config_map_namespace(self, config_map_namespace): - """Sets the config_map_namespace of this V1alpha3TemplateSpec. - - - :param config_map_namespace: The config_map_namespace of this V1alpha3TemplateSpec. # noqa: E501 - :type: str - """ - - self._config_map_namespace = config_map_namespace - - @property - def template_path(self): - """Gets the template_path of this V1alpha3TemplateSpec. # noqa: E501 - - - :return: The template_path of this V1alpha3TemplateSpec. # noqa: E501 - :rtype: str - """ - return self._template_path - - @template_path.setter - def template_path(self, template_path): - """Sets the template_path of this V1alpha3TemplateSpec. - - - :param template_path: The template_path of this V1alpha3TemplateSpec. # noqa: E501 - :type: str - """ - - self._template_path = template_path - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3TemplateSpec, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3TemplateSpec): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial.py deleted file mode 100644 index 651eaa8bd33..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial.py +++ /dev/null @@ -1,227 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_trial_spec import V1alpha3TrialSpec # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_trial_status import V1alpha3TrialStatus # noqa: F401,E501 -from kubernetes.client import V1ObjectMeta # noqa: F401,E501 - - -class V1alpha3Trial(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'api_version': 'str', - 'kind': 'str', - 'metadata': 'V1ObjectMeta', - 'spec': 'V1alpha3TrialSpec', - 'status': 'V1alpha3TrialStatus' - } - - attribute_map = { - 'api_version': 'apiVersion', - 'kind': 'kind', - 'metadata': 'metadata', - 'spec': 'spec', - 'status': 'status' - } - - def __init__(self, api_version=None, kind=None, metadata=None, spec=None, status=None): # noqa: E501 - """V1alpha3Trial - a model defined in Swagger""" # noqa: E501 - - self._api_version = None - self._kind = None - self._metadata = None - self._spec = None - self._status = None - self.discriminator = None - - if api_version is not None: - self.api_version = api_version - if kind is not None: - self.kind = kind - if metadata is not None: - self.metadata = metadata - if spec is not None: - self.spec = spec - if status is not None: - self.status = status - - @property - def api_version(self): - """Gets the api_version of this V1alpha3Trial. # noqa: E501 - - APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources # noqa: E501 - - :return: The api_version of this V1alpha3Trial. # noqa: E501 - :rtype: str - """ - return self._api_version - - @api_version.setter - def api_version(self, api_version): - """Sets the api_version of this V1alpha3Trial. - - APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources # noqa: E501 - - :param api_version: The api_version of this V1alpha3Trial. # noqa: E501 - :type: str - """ - - self._api_version = api_version - - @property - def kind(self): - """Gets the kind of this V1alpha3Trial. # noqa: E501 - - Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds # noqa: E501 - - :return: The kind of this V1alpha3Trial. # noqa: E501 - :rtype: str - """ - return self._kind - - @kind.setter - def kind(self, kind): - """Sets the kind of this V1alpha3Trial. - - Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds # noqa: E501 - - :param kind: The kind of this V1alpha3Trial. # noqa: E501 - :type: str - """ - - self._kind = kind - - @property - def metadata(self): - """Gets the metadata of this V1alpha3Trial. # noqa: E501 - - - :return: The metadata of this V1alpha3Trial. # noqa: E501 - :rtype: V1ObjectMeta - """ - return self._metadata - - @metadata.setter - def metadata(self, metadata): - """Sets the metadata of this V1alpha3Trial. - - - :param metadata: The metadata of this V1alpha3Trial. # noqa: E501 - :type: V1ObjectMeta - """ - - self._metadata = metadata - - @property - def spec(self): - """Gets the spec of this V1alpha3Trial. # noqa: E501 - - - :return: The spec of this V1alpha3Trial. # noqa: E501 - :rtype: V1alpha3TrialSpec - """ - return self._spec - - @spec.setter - def spec(self, spec): - """Sets the spec of this V1alpha3Trial. - - - :param spec: The spec of this V1alpha3Trial. # noqa: E501 - :type: V1alpha3TrialSpec - """ - - self._spec = spec - - @property - def status(self): - """Gets the status of this V1alpha3Trial. # noqa: E501 - - - :return: The status of this V1alpha3Trial. # noqa: E501 - :rtype: V1alpha3TrialStatus - """ - return self._status - - @status.setter - def status(self, status): - """Sets the status of this V1alpha3Trial. - - - :param status: The status of this V1alpha3Trial. # noqa: E501 - :type: V1alpha3TrialStatus - """ - - self._status = status - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3Trial, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3Trial): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_assignment.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_assignment.py deleted file mode 100644 index f21d7ea0533..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_assignment.py +++ /dev/null @@ -1,147 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_parameter_assignment import V1alpha3ParameterAssignment # noqa: F401,E501 - - -class V1alpha3TrialAssignment(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'name': 'str', - 'parameter_assignments': 'list[V1alpha3ParameterAssignment]' - } - - attribute_map = { - 'name': 'name', - 'parameter_assignments': 'parameterAssignments' - } - - def __init__(self, name=None, parameter_assignments=None): # noqa: E501 - """V1alpha3TrialAssignment - a model defined in Swagger""" # noqa: E501 - - self._name = None - self._parameter_assignments = None - self.discriminator = None - - if name is not None: - self.name = name - if parameter_assignments is not None: - self.parameter_assignments = parameter_assignments - - @property - def name(self): - """Gets the name of this V1alpha3TrialAssignment. # noqa: E501 - - Name of the suggestion # noqa: E501 - - :return: The name of this V1alpha3TrialAssignment. # noqa: E501 - :rtype: str - """ - return self._name - - @name.setter - def name(self, name): - """Sets the name of this V1alpha3TrialAssignment. - - Name of the suggestion # noqa: E501 - - :param name: The name of this V1alpha3TrialAssignment. # noqa: E501 - :type: str - """ - - self._name = name - - @property - def parameter_assignments(self): - """Gets the parameter_assignments of this V1alpha3TrialAssignment. # noqa: E501 - - Suggestion results # noqa: E501 - - :return: The parameter_assignments of this V1alpha3TrialAssignment. # noqa: E501 - :rtype: list[V1alpha3ParameterAssignment] - """ - return self._parameter_assignments - - @parameter_assignments.setter - def parameter_assignments(self, parameter_assignments): - """Sets the parameter_assignments of this V1alpha3TrialAssignment. - - Suggestion results # noqa: E501 - - :param parameter_assignments: The parameter_assignments of this V1alpha3TrialAssignment. # noqa: E501 - :type: list[V1alpha3ParameterAssignment] - """ - - self._parameter_assignments = parameter_assignments - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3TrialAssignment, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3TrialAssignment): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_condition.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_condition.py deleted file mode 100644 index 9a40bde4617..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_condition.py +++ /dev/null @@ -1,261 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1_time import V1Time # noqa: F401,E501 - - -class V1alpha3TrialCondition(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'last_transition_time': 'V1Time', - 'last_update_time': 'V1Time', - 'message': 'str', - 'reason': 'str', - 'status': 'str', - 'type': 'str' - } - - attribute_map = { - 'last_transition_time': 'lastTransitionTime', - 'last_update_time': 'lastUpdateTime', - 'message': 'message', - 'reason': 'reason', - 'status': 'status', - 'type': 'type' - } - - def __init__(self, last_transition_time=None, last_update_time=None, message=None, reason=None, status=None, type=None): # noqa: E501 - """V1alpha3TrialCondition - a model defined in Swagger""" # noqa: E501 - - self._last_transition_time = None - self._last_update_time = None - self._message = None - self._reason = None - self._status = None - self._type = None - self.discriminator = None - - if last_transition_time is not None: - self.last_transition_time = last_transition_time - if last_update_time is not None: - self.last_update_time = last_update_time - if message is not None: - self.message = message - if reason is not None: - self.reason = reason - self.status = status - self.type = type - - @property - def last_transition_time(self): - """Gets the last_transition_time of this V1alpha3TrialCondition. # noqa: E501 - - Last time the condition transitioned from one status to another. # noqa: E501 - - :return: The last_transition_time of this V1alpha3TrialCondition. # noqa: E501 - :rtype: V1Time - """ - return self._last_transition_time - - @last_transition_time.setter - def last_transition_time(self, last_transition_time): - """Sets the last_transition_time of this V1alpha3TrialCondition. - - Last time the condition transitioned from one status to another. # noqa: E501 - - :param last_transition_time: The last_transition_time of this V1alpha3TrialCondition. # noqa: E501 - :type: V1Time - """ - - self._last_transition_time = last_transition_time - - @property - def last_update_time(self): - """Gets the last_update_time of this V1alpha3TrialCondition. # noqa: E501 - - The last time this condition was updated. # noqa: E501 - - :return: The last_update_time of this V1alpha3TrialCondition. # noqa: E501 - :rtype: V1Time - """ - return self._last_update_time - - @last_update_time.setter - def last_update_time(self, last_update_time): - """Sets the last_update_time of this V1alpha3TrialCondition. - - The last time this condition was updated. # noqa: E501 - - :param last_update_time: The last_update_time of this V1alpha3TrialCondition. # noqa: E501 - :type: V1Time - """ - - self._last_update_time = last_update_time - - @property - def message(self): - """Gets the message of this V1alpha3TrialCondition. # noqa: E501 - - A human readable message indicating details about the transition. # noqa: E501 - - :return: The message of this V1alpha3TrialCondition. # noqa: E501 - :rtype: str - """ - return self._message - - @message.setter - def message(self, message): - """Sets the message of this V1alpha3TrialCondition. - - A human readable message indicating details about the transition. # noqa: E501 - - :param message: The message of this V1alpha3TrialCondition. # noqa: E501 - :type: str - """ - - self._message = message - - @property - def reason(self): - """Gets the reason of this V1alpha3TrialCondition. # noqa: E501 - - The reason for the condition's last transition. # noqa: E501 - - :return: The reason of this V1alpha3TrialCondition. # noqa: E501 - :rtype: str - """ - return self._reason - - @reason.setter - def reason(self, reason): - """Sets the reason of this V1alpha3TrialCondition. - - The reason for the condition's last transition. # noqa: E501 - - :param reason: The reason of this V1alpha3TrialCondition. # noqa: E501 - :type: str - """ - - self._reason = reason - - @property - def status(self): - """Gets the status of this V1alpha3TrialCondition. # noqa: E501 - - Status of the condition, one of True, False, Unknown. # noqa: E501 - - :return: The status of this V1alpha3TrialCondition. # noqa: E501 - :rtype: str - """ - return self._status - - @status.setter - def status(self, status): - """Sets the status of this V1alpha3TrialCondition. - - Status of the condition, one of True, False, Unknown. # noqa: E501 - - :param status: The status of this V1alpha3TrialCondition. # noqa: E501 - :type: str - """ - if status is None: - raise ValueError("Invalid value for `status`, must not be `None`") # noqa: E501 - - self._status = status - - @property - def type(self): - """Gets the type of this V1alpha3TrialCondition. # noqa: E501 - - Type of trial condition. # noqa: E501 - - :return: The type of this V1alpha3TrialCondition. # noqa: E501 - :rtype: str - """ - return self._type - - @type.setter - def type(self, type): - """Sets the type of this V1alpha3TrialCondition. - - Type of trial condition. # noqa: E501 - - :param type: The type of this V1alpha3TrialCondition. # noqa: E501 - :type: str - """ - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - - self._type = type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3TrialCondition, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3TrialCondition): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_list.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_list.py deleted file mode 100644 index e3f12f934b8..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_list.py +++ /dev/null @@ -1,201 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_trial import V1alpha3Trial # noqa: F401,E501 -from kubernetes.client import V1ListMeta # noqa: F401,E501 - - -class V1alpha3TrialList(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'api_version': 'str', - 'items': 'list[V1alpha3Trial]', - 'kind': 'str', - 'metadata': 'V1ListMeta' - } - - attribute_map = { - 'api_version': 'apiVersion', - 'items': 'items', - 'kind': 'kind', - 'metadata': 'metadata' - } - - def __init__(self, api_version=None, items=None, kind=None, metadata=None): # noqa: E501 - """V1alpha3TrialList - a model defined in Swagger""" # noqa: E501 - - self._api_version = None - self._items = None - self._kind = None - self._metadata = None - self.discriminator = None - - if api_version is not None: - self.api_version = api_version - self.items = items - if kind is not None: - self.kind = kind - if metadata is not None: - self.metadata = metadata - - @property - def api_version(self): - """Gets the api_version of this V1alpha3TrialList. # noqa: E501 - - APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources # noqa: E501 - - :return: The api_version of this V1alpha3TrialList. # noqa: E501 - :rtype: str - """ - return self._api_version - - @api_version.setter - def api_version(self, api_version): - """Sets the api_version of this V1alpha3TrialList. - - APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources # noqa: E501 - - :param api_version: The api_version of this V1alpha3TrialList. # noqa: E501 - :type: str - """ - - self._api_version = api_version - - @property - def items(self): - """Gets the items of this V1alpha3TrialList. # noqa: E501 - - - :return: The items of this V1alpha3TrialList. # noqa: E501 - :rtype: list[V1alpha3Trial] - """ - return self._items - - @items.setter - def items(self, items): - """Sets the items of this V1alpha3TrialList. - - - :param items: The items of this V1alpha3TrialList. # noqa: E501 - :type: list[V1alpha3Trial] - """ - if items is None: - raise ValueError("Invalid value for `items`, must not be `None`") # noqa: E501 - - self._items = items - - @property - def kind(self): - """Gets the kind of this V1alpha3TrialList. # noqa: E501 - - Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds # noqa: E501 - - :return: The kind of this V1alpha3TrialList. # noqa: E501 - :rtype: str - """ - return self._kind - - @kind.setter - def kind(self, kind): - """Sets the kind of this V1alpha3TrialList. - - Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds # noqa: E501 - - :param kind: The kind of this V1alpha3TrialList. # noqa: E501 - :type: str - """ - - self._kind = kind - - @property - def metadata(self): - """Gets the metadata of this V1alpha3TrialList. # noqa: E501 - - - :return: The metadata of this V1alpha3TrialList. # noqa: E501 - :rtype: V1ListMeta - """ - return self._metadata - - @metadata.setter - def metadata(self, metadata): - """Sets the metadata of this V1alpha3TrialList. - - - :param metadata: The metadata of this V1alpha3TrialList. # noqa: E501 - :type: V1ListMeta - """ - - self._metadata = metadata - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3TrialList, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3TrialList): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_spec.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_spec.py deleted file mode 100644 index a84608f4e1c..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_spec.py +++ /dev/null @@ -1,234 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_metrics_collector_spec import V1alpha3MetricsCollectorSpec # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_objective_spec import V1alpha3ObjectiveSpec # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_parameter_assignment import V1alpha3ParameterAssignment # noqa: F401,E501 - - -class V1alpha3TrialSpec(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'metrics_collector': 'V1alpha3MetricsCollectorSpec', - 'objective': 'V1alpha3ObjectiveSpec', - 'parameter_assignments': 'list[V1alpha3ParameterAssignment]', - 'retain_run': 'bool', - 'run_spec': 'str' - } - - attribute_map = { - 'metrics_collector': 'metricsCollector', - 'objective': 'objective', - 'parameter_assignments': 'parameterAssignments', - 'retain_run': 'retainRun', - 'run_spec': 'runSpec' - } - - def __init__(self, metrics_collector=None, objective=None, parameter_assignments=None, retain_run=None, run_spec=None): # noqa: E501 - """V1alpha3TrialSpec - a model defined in Swagger""" # noqa: E501 - - self._metrics_collector = None - self._objective = None - self._parameter_assignments = None - self._retain_run = None - self._run_spec = None - self.discriminator = None - - if metrics_collector is not None: - self.metrics_collector = metrics_collector - if objective is not None: - self.objective = objective - self.parameter_assignments = parameter_assignments - if retain_run is not None: - self.retain_run = retain_run - if run_spec is not None: - self.run_spec = run_spec - - @property - def metrics_collector(self): - """Gets the metrics_collector of this V1alpha3TrialSpec. # noqa: E501 - - Describes how metrics will be collected # noqa: E501 - - :return: The metrics_collector of this V1alpha3TrialSpec. # noqa: E501 - :rtype: V1alpha3MetricsCollectorSpec - """ - return self._metrics_collector - - @metrics_collector.setter - def metrics_collector(self, metrics_collector): - """Sets the metrics_collector of this V1alpha3TrialSpec. - - Describes how metrics will be collected # noqa: E501 - - :param metrics_collector: The metrics_collector of this V1alpha3TrialSpec. # noqa: E501 - :type: V1alpha3MetricsCollectorSpec - """ - - self._metrics_collector = metrics_collector - - @property - def objective(self): - """Gets the objective of this V1alpha3TrialSpec. # noqa: E501 - - Describes the objective of the experiment. # noqa: E501 - - :return: The objective of this V1alpha3TrialSpec. # noqa: E501 - :rtype: V1alpha3ObjectiveSpec - """ - return self._objective - - @objective.setter - def objective(self, objective): - """Sets the objective of this V1alpha3TrialSpec. - - Describes the objective of the experiment. # noqa: E501 - - :param objective: The objective of this V1alpha3TrialSpec. # noqa: E501 - :type: V1alpha3ObjectiveSpec - """ - - self._objective = objective - - @property - def parameter_assignments(self): - """Gets the parameter_assignments of this V1alpha3TrialSpec. # noqa: E501 - - Key-value pairs for hyperparameters and assignment values. # noqa: E501 - - :return: The parameter_assignments of this V1alpha3TrialSpec. # noqa: E501 - :rtype: list[V1alpha3ParameterAssignment] - """ - return self._parameter_assignments - - @parameter_assignments.setter - def parameter_assignments(self, parameter_assignments): - """Sets the parameter_assignments of this V1alpha3TrialSpec. - - Key-value pairs for hyperparameters and assignment values. # noqa: E501 - - :param parameter_assignments: The parameter_assignments of this V1alpha3TrialSpec. # noqa: E501 - :type: list[V1alpha3ParameterAssignment] - """ - if parameter_assignments is None: - raise ValueError("Invalid value for `parameter_assignments`, must not be `None`") # noqa: E501 - - self._parameter_assignments = parameter_assignments - - @property - def retain_run(self): - """Gets the retain_run of this V1alpha3TrialSpec. # noqa: E501 - - Whether to retain the trial run object after completed. # noqa: E501 - - :return: The retain_run of this V1alpha3TrialSpec. # noqa: E501 - :rtype: bool - """ - return self._retain_run - - @retain_run.setter - def retain_run(self, retain_run): - """Sets the retain_run of this V1alpha3TrialSpec. - - Whether to retain the trial run object after completed. # noqa: E501 - - :param retain_run: The retain_run of this V1alpha3TrialSpec. # noqa: E501 - :type: bool - """ - - self._retain_run = retain_run - - @property - def run_spec(self): - """Gets the run_spec of this V1alpha3TrialSpec. # noqa: E501 - - Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest. # noqa: E501 - - :return: The run_spec of this V1alpha3TrialSpec. # noqa: E501 - :rtype: str - """ - return self._run_spec - - @run_spec.setter - def run_spec(self, run_spec): - """Sets the run_spec of this V1alpha3TrialSpec. - - Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest. # noqa: E501 - - :param run_spec: The run_spec of this V1alpha3TrialSpec. # noqa: E501 - :type: str - """ - - self._run_spec = run_spec - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3TrialSpec, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3TrialSpec): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_status.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_status.py deleted file mode 100644 index 65332c1a36f..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_status.py +++ /dev/null @@ -1,233 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1_time import V1Time # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_observation import V1alpha3Observation # noqa: F401,E501 -from kubeflow.katib.models.v1alpha3_trial_condition import V1alpha3TrialCondition # noqa: F401,E501 - - -class V1alpha3TrialStatus(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'completion_time': 'V1Time', - 'conditions': 'list[V1alpha3TrialCondition]', - 'last_reconcile_time': 'V1Time', - 'observation': 'V1alpha3Observation', - 'start_time': 'V1Time' - } - - attribute_map = { - 'completion_time': 'completionTime', - 'conditions': 'conditions', - 'last_reconcile_time': 'lastReconcileTime', - 'observation': 'observation', - 'start_time': 'startTime' - } - - def __init__(self, completion_time=None, conditions=None, last_reconcile_time=None, observation=None, start_time=None): # noqa: E501 - """V1alpha3TrialStatus - a model defined in Swagger""" # noqa: E501 - - self._completion_time = None - self._conditions = None - self._last_reconcile_time = None - self._observation = None - self._start_time = None - self.discriminator = None - - if completion_time is not None: - self.completion_time = completion_time - if conditions is not None: - self.conditions = conditions - if last_reconcile_time is not None: - self.last_reconcile_time = last_reconcile_time - if observation is not None: - self.observation = observation - if start_time is not None: - self.start_time = start_time - - @property - def completion_time(self): - """Gets the completion_time of this V1alpha3TrialStatus. # noqa: E501 - - Represents time when the Trial was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC # noqa: E501 - - :return: The completion_time of this V1alpha3TrialStatus. # noqa: E501 - :rtype: V1Time - """ - return self._completion_time - - @completion_time.setter - def completion_time(self, completion_time): - """Sets the completion_time of this V1alpha3TrialStatus. - - Represents time when the Trial was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC # noqa: E501 - - :param completion_time: The completion_time of this V1alpha3TrialStatus. # noqa: E501 - :type: V1Time - """ - - self._completion_time = completion_time - - @property - def conditions(self): - """Gets the conditions of this V1alpha3TrialStatus. # noqa: E501 - - List of observed runtime conditions for this Trial. # noqa: E501 - - :return: The conditions of this V1alpha3TrialStatus. # noqa: E501 - :rtype: list[V1alpha3TrialCondition] - """ - return self._conditions - - @conditions.setter - def conditions(self, conditions): - """Sets the conditions of this V1alpha3TrialStatus. - - List of observed runtime conditions for this Trial. # noqa: E501 - - :param conditions: The conditions of this V1alpha3TrialStatus. # noqa: E501 - :type: list[V1alpha3TrialCondition] - """ - - self._conditions = conditions - - @property - def last_reconcile_time(self): - """Gets the last_reconcile_time of this V1alpha3TrialStatus. # noqa: E501 - - Represents last time when the Trial was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :return: The last_reconcile_time of this V1alpha3TrialStatus. # noqa: E501 - :rtype: V1Time - """ - return self._last_reconcile_time - - @last_reconcile_time.setter - def last_reconcile_time(self, last_reconcile_time): - """Sets the last_reconcile_time of this V1alpha3TrialStatus. - - Represents last time when the Trial was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 - - :param last_reconcile_time: The last_reconcile_time of this V1alpha3TrialStatus. # noqa: E501 - :type: V1Time - """ - - self._last_reconcile_time = last_reconcile_time - - @property - def observation(self): - """Gets the observation of this V1alpha3TrialStatus. # noqa: E501 - - Results of the Trial - objectives and other metrics values. # noqa: E501 - - :return: The observation of this V1alpha3TrialStatus. # noqa: E501 - :rtype: V1alpha3Observation - """ - return self._observation - - @observation.setter - def observation(self, observation): - """Sets the observation of this V1alpha3TrialStatus. - - Results of the Trial - objectives and other metrics values. # noqa: E501 - - :param observation: The observation of this V1alpha3TrialStatus. # noqa: E501 - :type: V1alpha3Observation - """ - - self._observation = observation - - @property - def start_time(self): - """Gets the start_time of this V1alpha3TrialStatus. # noqa: E501 - - Represents time when the Trial was acknowledged by the Trial controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC # noqa: E501 - - :return: The start_time of this V1alpha3TrialStatus. # noqa: E501 - :rtype: V1Time - """ - return self._start_time - - @start_time.setter - def start_time(self, start_time): - """Sets the start_time of this V1alpha3TrialStatus. - - Represents time when the Trial was acknowledged by the Trial controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC # noqa: E501 - - :param start_time: The start_time of this V1alpha3TrialStatus. # noqa: E501 - :type: V1Time - """ - - self._start_time = start_time - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3TrialStatus, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3TrialStatus): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_template.py b/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_template.py deleted file mode 100644 index fe72090ea12..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/models/v1alpha3_trial_template.py +++ /dev/null @@ -1,143 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - -from kubeflow.katib.models.v1alpha3_go_template import V1alpha3GoTemplate # noqa: F401,E501 - - -class V1alpha3TrialTemplate(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'go_template': 'V1alpha3GoTemplate', - 'retain': 'bool' - } - - attribute_map = { - 'go_template': 'goTemplate', - 'retain': 'retain' - } - - def __init__(self, go_template=None, retain=None): # noqa: E501 - """V1alpha3TrialTemplate - a model defined in Swagger""" # noqa: E501 - - self._go_template = None - self._retain = None - self.discriminator = None - - if go_template is not None: - self.go_template = go_template - if retain is not None: - self.retain = retain - - @property - def go_template(self): - """Gets the go_template of this V1alpha3TrialTemplate. # noqa: E501 - - - :return: The go_template of this V1alpha3TrialTemplate. # noqa: E501 - :rtype: V1alpha3GoTemplate - """ - return self._go_template - - @go_template.setter - def go_template(self, go_template): - """Sets the go_template of this V1alpha3TrialTemplate. - - - :param go_template: The go_template of this V1alpha3TrialTemplate. # noqa: E501 - :type: V1alpha3GoTemplate - """ - - self._go_template = go_template - - @property - def retain(self): - """Gets the retain of this V1alpha3TrialTemplate. # noqa: E501 - - - :return: The retain of this V1alpha3TrialTemplate. # noqa: E501 - :rtype: bool - """ - return self._retain - - @retain.setter - def retain(self, retain): - """Sets the retain of this V1alpha3TrialTemplate. - - - :param retain: The retain of this V1alpha3TrialTemplate. # noqa: E501 - :type: bool - """ - - self._retain = retain - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1alpha3TrialTemplate, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1alpha3TrialTemplate): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1alpha3/kubeflow/katib/rest.py b/sdk/python/v1alpha3/kubeflow/katib/rest.py deleted file mode 100644 index ed8ec7bdb85..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/rest.py +++ /dev/null @@ -1,323 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import io -import json -import logging -import re -import ssl - -import certifi -# python 2 and python 3 compatibility library -import six -from six.moves.urllib.parse import urlencode - -try: - import urllib3 -except ImportError: - raise ImportError('Swagger python client requires urllib3.') - - -logger = logging.getLogger(__name__) - - -class RESTResponse(io.IOBase): - - def __init__(self, resp): - self.urllib3_response = resp - self.status = resp.status - self.reason = resp.reason - self.data = resp.data - - def getheaders(self): - """Returns a dictionary of the response headers.""" - return self.urllib3_response.getheaders() - - def getheader(self, name, default=None): - """Returns a given response header.""" - return self.urllib3_response.getheader(name, default) - - -class RESTClientObject(object): - - def __init__(self, configuration, pools_size=4, maxsize=None): - # urllib3.PoolManager will pass all kw parameters to connectionpool - # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501 - # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501 - # maxsize is the number of requests to host that are allowed in parallel # noqa: E501 - # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501 - - # cert_reqs - if configuration.verify_ssl: - cert_reqs = ssl.CERT_REQUIRED - else: - cert_reqs = ssl.CERT_NONE - - # ca_certs - if configuration.ssl_ca_cert: - ca_certs = configuration.ssl_ca_cert - else: - # if not set certificate file, use Mozilla's root certificates. - ca_certs = certifi.where() - - addition_pool_args = {} - if configuration.assert_hostname is not None: - addition_pool_args['assert_hostname'] = configuration.assert_hostname # noqa: E501 - - if maxsize is None: - if configuration.connection_pool_maxsize is not None: - maxsize = configuration.connection_pool_maxsize - else: - maxsize = 4 - - # https pool manager - if configuration.proxy: - self.pool_manager = urllib3.ProxyManager( - num_pools=pools_size, - maxsize=maxsize, - cert_reqs=cert_reqs, - ca_certs=ca_certs, - cert_file=configuration.cert_file, - key_file=configuration.key_file, - proxy_url=configuration.proxy, - **addition_pool_args - ) - else: - self.pool_manager = urllib3.PoolManager( - num_pools=pools_size, - maxsize=maxsize, - cert_reqs=cert_reqs, - ca_certs=ca_certs, - cert_file=configuration.cert_file, - key_file=configuration.key_file, - **addition_pool_args - ) - - def request(self, method, url, query_params=None, headers=None, - body=None, post_params=None, _preload_content=True, - _request_timeout=None): - """Perform requests. - - :param method: http request method - :param url: http request url - :param query_params: query parameters in the url - :param headers: http request headers - :param body: request json body, for `application/json` - :param post_params: request post parameters, - `application/x-www-form-urlencoded` - and `multipart/form-data` - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - """ - method = method.upper() - assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', - 'PATCH', 'OPTIONS'] - - if post_params and body: - raise ValueError( - "body parameter cannot be used with post_params parameter." - ) - - post_params = post_params or {} - headers = headers or {} - - timeout = None - if _request_timeout: - if isinstance(_request_timeout, (int, ) if six.PY3 else (int, long)): # noqa: E501,F821 - timeout = urllib3.Timeout(total=_request_timeout) - elif (isinstance(_request_timeout, tuple) and - len(_request_timeout) == 2): - timeout = urllib3.Timeout( - connect=_request_timeout[0], read=_request_timeout[1]) - - if 'Content-Type' not in headers: - headers['Content-Type'] = 'application/json' - - try: - # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` - if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']: - if query_params: - url += '?' + urlencode(query_params) - if re.search('json', headers['Content-Type'], re.IGNORECASE): - request_body = None - if body is not None: - request_body = json.dumps(body) - r = self.pool_manager.request( - method, url, - body=request_body, - preload_content=_preload_content, - timeout=timeout, - headers=headers) - elif headers['Content-Type'] == 'application/x-www-form-urlencoded': # noqa: E501 - r = self.pool_manager.request( - method, url, - fields=post_params, - encode_multipart=False, - preload_content=_preload_content, - timeout=timeout, - headers=headers) - elif headers['Content-Type'] == 'multipart/form-data': - # must del headers['Content-Type'], or the correct - # Content-Type which generated by urllib3 will be - # overwritten. - del headers['Content-Type'] - r = self.pool_manager.request( - method, url, - fields=post_params, - encode_multipart=True, - preload_content=_preload_content, - timeout=timeout, - headers=headers) - # Pass a `string` parameter directly in the body to support - # other content types than Json when `body` argument is - # provided in serialized form - elif isinstance(body, str): - request_body = body - r = self.pool_manager.request( - method, url, - body=request_body, - preload_content=_preload_content, - timeout=timeout, - headers=headers) - else: - # Cannot generate the request from given parameters - msg = """Cannot prepare a request message for provided - arguments. Please check that your arguments match - declared content type.""" - raise ApiException(status=0, reason=msg) - # For `GET`, `HEAD` - else: - r = self.pool_manager.request(method, url, - fields=query_params, - preload_content=_preload_content, - timeout=timeout, - headers=headers) - except urllib3.exceptions.SSLError as e: - msg = "{0}\n{1}".format(type(e).__name__, str(e)) - raise ApiException(status=0, reason=msg) - - if _preload_content: - r = RESTResponse(r) - - # In the python 3, the response.data is bytes. - # we need to decode it to string. - if six.PY3: - r.data = r.data.decode('utf8') - - # log response body - logger.debug("response body: %s", r.data) - - if not 200 <= r.status <= 299: - raise ApiException(http_resp=r) - - return r - - def GET(self, url, headers=None, query_params=None, _preload_content=True, - _request_timeout=None): - return self.request("GET", url, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - query_params=query_params) - - def HEAD(self, url, headers=None, query_params=None, _preload_content=True, - _request_timeout=None): - return self.request("HEAD", url, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - query_params=query_params) - - def OPTIONS(self, url, headers=None, query_params=None, post_params=None, - body=None, _preload_content=True, _request_timeout=None): - return self.request("OPTIONS", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - def DELETE(self, url, headers=None, query_params=None, body=None, - _preload_content=True, _request_timeout=None): - return self.request("DELETE", url, - headers=headers, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - def POST(self, url, headers=None, query_params=None, post_params=None, - body=None, _preload_content=True, _request_timeout=None): - return self.request("POST", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - def PUT(self, url, headers=None, query_params=None, post_params=None, - body=None, _preload_content=True, _request_timeout=None): - return self.request("PUT", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - def PATCH(self, url, headers=None, query_params=None, post_params=None, - body=None, _preload_content=True, _request_timeout=None): - return self.request("PATCH", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - -class ApiException(Exception): - - def __init__(self, status=None, reason=None, http_resp=None): - if http_resp: - self.status = http_resp.status - self.reason = http_resp.reason - self.body = http_resp.data - self.headers = http_resp.getheaders() - else: - self.status = status - self.reason = reason - self.body = None - self.headers = None - - def __str__(self): - """Custom error messages for exception""" - error_message = "({0})\n"\ - "Reason: {1}\n".format(self.status, self.reason) - if self.headers: - error_message += "HTTP response headers: {0}\n".format( - self.headers) - - if self.body: - error_message += "HTTP response body: {0}\n".format(self.body) - - return error_message diff --git a/sdk/python/v1alpha3/kubeflow/katib/utils/__init__.py b/sdk/python/v1alpha3/kubeflow/katib/utils/__init__.py deleted file mode 100644 index ede60a09abd..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/utils/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2019 kubeflow.org. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/sdk/python/v1alpha3/kubeflow/katib/utils/utils.py b/sdk/python/v1alpha3/kubeflow/katib/utils/utils.py deleted file mode 100644 index 6e291791b09..00000000000 --- a/sdk/python/v1alpha3/kubeflow/katib/utils/utils.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2019 kubeflow.org. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -def is_running_in_k8s(): - return os.path.isdir('/var/run/secrets/kubernetes.io/') - - -def get_current_k8s_namespace(): - with open('/var/run/secrets/kubernetes.io/serviceaccount/namespace', 'r') as f: - return f.readline() - - -def get_default_target_namespace(): - if not is_running_in_k8s(): - return 'default' - return get_current_k8s_namespace() - - -def set_katib_namespace(katib): - katib_namespace = katib.metadata.namespace - namespace = katib_namespace or get_default_target_namespace() - return namespace diff --git a/sdk/python/v1alpha3/requirements.txt b/sdk/python/v1alpha3/requirements.txt deleted file mode 100644 index 7b0e0d448e9..00000000000 --- a/sdk/python/v1alpha3/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -certifi>=14.05.14 -six>=1.10 -python_dateutil>=2.5.3 -setuptools>=21.0.0 -urllib3>=1.15.1 -kubernetes==10.0.1 -table_logger>=0.3.5 diff --git a/sdk/python/v1alpha3/setup.py b/sdk/python/v1alpha3/setup.py deleted file mode 100644 index c40c2d4f906..00000000000 --- a/sdk/python/v1alpha3/setup.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright 2019 kubeflow.org. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import setuptools - -with open('requirements.txt') as f: - REQUIRES = f.readlines() - -setuptools.setup( - name='kubeflow-katib', - version='0.0.2', - author="Kubeflow Authors", - author_email='premnath.vel@gmail.com', - license="Apache License Version 2.0", - url="https://github.com/kubeflow/katib/tree/master/sdk/python/v1alpha3", - description="Katib Python SDK for APIVersion v1alpha3", - long_description="Katib Python SDK for APIVersion v1alpha3", - packages=setuptools.find_packages( - include=("kubeflow*")), - package_data={}, - include_package_data=False, - zip_safe=False, - classifiers=[ - 'Intended Audience :: Developers', - 'Intended Audience :: Education', - 'Intended Audience :: Science/Research', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - "License :: OSI Approved :: Apache Software License", - "Operating System :: OS Independent", - 'Topic :: Scientific/Engineering', - 'Topic :: Scientific/Engineering :: Artificial Intelligence', - 'Topic :: Software Development', - 'Topic :: Software Development :: Libraries', - 'Topic :: Software Development :: Libraries :: Python Modules', - ], - install_requires=REQUIRES -) diff --git a/sdk/python/v1alpha3/test/__init__.py b/sdk/python/v1alpha3/test/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_algorithm_setting.py b/sdk/python/v1alpha3/test/test_v1alpha3_algorithm_setting.py deleted file mode 100644 index cdaf47e9fb3..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_algorithm_setting.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_algorithm_setting import V1alpha3AlgorithmSetting # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3AlgorithmSetting(unittest.TestCase): - """V1alpha3AlgorithmSetting unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3AlgorithmSetting(self): - """Test V1alpha3AlgorithmSetting""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_algorithm_setting.V1alpha3AlgorithmSetting() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_algorithm_spec.py b/sdk/python/v1alpha3/test/test_v1alpha3_algorithm_spec.py deleted file mode 100644 index 363a7cc7faa..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_algorithm_spec.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_algorithm_spec import V1alpha3AlgorithmSpec # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3AlgorithmSpec(unittest.TestCase): - """V1alpha3AlgorithmSpec unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3AlgorithmSpec(self): - """Test V1alpha3AlgorithmSpec""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_algorithm_spec.V1alpha3AlgorithmSpec() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_collector_spec.py b/sdk/python/v1alpha3/test/test_v1alpha3_collector_spec.py deleted file mode 100644 index 637388a21c0..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_collector_spec.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_collector_spec import V1alpha3CollectorSpec # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3CollectorSpec(unittest.TestCase): - """V1alpha3CollectorSpec unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3CollectorSpec(self): - """Test V1alpha3CollectorSpec""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_collector_spec.V1alpha3CollectorSpec() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_early_stopping_setting.py b/sdk/python/v1alpha3/test/test_v1alpha3_early_stopping_setting.py deleted file mode 100644 index 4939075f2e7..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_early_stopping_setting.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_early_stopping_setting import V1alpha3EarlyStoppingSetting # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3EarlyStoppingSetting(unittest.TestCase): - """V1alpha3EarlyStoppingSetting unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3EarlyStoppingSetting(self): - """Test V1alpha3EarlyStoppingSetting""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_early_stopping_setting.V1alpha3EarlyStoppingSetting() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_early_stopping_spec.py b/sdk/python/v1alpha3/test/test_v1alpha3_early_stopping_spec.py deleted file mode 100644 index 916aa77c3f2..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_early_stopping_spec.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_early_stopping_spec import V1alpha3EarlyStoppingSpec # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3EarlyStoppingSpec(unittest.TestCase): - """V1alpha3EarlyStoppingSpec unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3EarlyStoppingSpec(self): - """Test V1alpha3EarlyStoppingSpec""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_early_stopping_spec.V1alpha3EarlyStoppingSpec() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_experiment.py b/sdk/python/v1alpha3/test/test_v1alpha3_experiment.py deleted file mode 100644 index 47d35602722..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_experiment.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_experiment import V1alpha3Experiment # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3Experiment(unittest.TestCase): - """V1alpha3Experiment unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3Experiment(self): - """Test V1alpha3Experiment""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_experiment.V1alpha3Experiment() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_experiment_condition.py b/sdk/python/v1alpha3/test/test_v1alpha3_experiment_condition.py deleted file mode 100644 index bf9ce1562a5..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_experiment_condition.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_experiment_condition import V1alpha3ExperimentCondition # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3ExperimentCondition(unittest.TestCase): - """V1alpha3ExperimentCondition unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3ExperimentCondition(self): - """Test V1alpha3ExperimentCondition""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_experiment_condition.V1alpha3ExperimentCondition() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_experiment_list.py b/sdk/python/v1alpha3/test/test_v1alpha3_experiment_list.py deleted file mode 100644 index aa107a3589a..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_experiment_list.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_experiment_list import V1alpha3ExperimentList # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3ExperimentList(unittest.TestCase): - """V1alpha3ExperimentList unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3ExperimentList(self): - """Test V1alpha3ExperimentList""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_experiment_list.V1alpha3ExperimentList() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_experiment_spec.py b/sdk/python/v1alpha3/test/test_v1alpha3_experiment_spec.py deleted file mode 100644 index 3b0cb21d3ed..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_experiment_spec.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_experiment_spec import V1alpha3ExperimentSpec # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3ExperimentSpec(unittest.TestCase): - """V1alpha3ExperimentSpec unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3ExperimentSpec(self): - """Test V1alpha3ExperimentSpec""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_experiment_spec.V1alpha3ExperimentSpec() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_experiment_status.py b/sdk/python/v1alpha3/test/test_v1alpha3_experiment_status.py deleted file mode 100644 index 81c44bb6ba8..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_experiment_status.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_experiment_status import V1alpha3ExperimentStatus # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3ExperimentStatus(unittest.TestCase): - """V1alpha3ExperimentStatus unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3ExperimentStatus(self): - """Test V1alpha3ExperimentStatus""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_experiment_status.V1alpha3ExperimentStatus() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_feasible_space.py b/sdk/python/v1alpha3/test/test_v1alpha3_feasible_space.py deleted file mode 100644 index 30b1e1baec1..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_feasible_space.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_feasible_space import V1alpha3FeasibleSpace # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3FeasibleSpace(unittest.TestCase): - """V1alpha3FeasibleSpace unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3FeasibleSpace(self): - """Test V1alpha3FeasibleSpace""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_feasible_space.V1alpha3FeasibleSpace() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_file_system_path.py b/sdk/python/v1alpha3/test/test_v1alpha3_file_system_path.py deleted file mode 100644 index b66c2910d72..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_file_system_path.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_file_system_path import V1alpha3FileSystemPath # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3FileSystemPath(unittest.TestCase): - """V1alpha3FileSystemPath unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3FileSystemPath(self): - """Test V1alpha3FileSystemPath""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_file_system_path.V1alpha3FileSystemPath() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_filter_spec.py b/sdk/python/v1alpha3/test/test_v1alpha3_filter_spec.py deleted file mode 100644 index 002d78d65fd..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_filter_spec.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_filter_spec import V1alpha3FilterSpec # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3FilterSpec(unittest.TestCase): - """V1alpha3FilterSpec unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3FilterSpec(self): - """Test V1alpha3FilterSpec""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_filter_spec.V1alpha3FilterSpec() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_go_template.py b/sdk/python/v1alpha3/test/test_v1alpha3_go_template.py deleted file mode 100644 index 313111f92fb..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_go_template.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_go_template import V1alpha3GoTemplate # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3GoTemplate(unittest.TestCase): - """V1alpha3GoTemplate unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3GoTemplate(self): - """Test V1alpha3GoTemplate""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_go_template.V1alpha3GoTemplate() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_graph_config.py b/sdk/python/v1alpha3/test/test_v1alpha3_graph_config.py deleted file mode 100644 index cbbcec0f685..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_graph_config.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_graph_config import V1alpha3GraphConfig # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3GraphConfig(unittest.TestCase): - """V1alpha3GraphConfig unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3GraphConfig(self): - """Test V1alpha3GraphConfig""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_graph_config.V1alpha3GraphConfig() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_metric.py b/sdk/python/v1alpha3/test/test_v1alpha3_metric.py deleted file mode 100644 index 925e4376d96..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_metric.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_metric import V1alpha3Metric # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3Metric(unittest.TestCase): - """V1alpha3Metric unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3Metric(self): - """Test V1alpha3Metric""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_metric.V1alpha3Metric() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_metrics_collector_spec.py b/sdk/python/v1alpha3/test/test_v1alpha3_metrics_collector_spec.py deleted file mode 100644 index 144d3aa1fc1..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_metrics_collector_spec.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_metrics_collector_spec import V1alpha3MetricsCollectorSpec # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3MetricsCollectorSpec(unittest.TestCase): - """V1alpha3MetricsCollectorSpec unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3MetricsCollectorSpec(self): - """Test V1alpha3MetricsCollectorSpec""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_metrics_collector_spec.V1alpha3MetricsCollectorSpec() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_nas_config.py b/sdk/python/v1alpha3/test/test_v1alpha3_nas_config.py deleted file mode 100644 index 753ef4b874e..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_nas_config.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_nas_config import V1alpha3NasConfig # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3NasConfig(unittest.TestCase): - """V1alpha3NasConfig unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3NasConfig(self): - """Test V1alpha3NasConfig""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_nas_config.V1alpha3NasConfig() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_objective_spec.py b/sdk/python/v1alpha3/test/test_v1alpha3_objective_spec.py deleted file mode 100644 index e7cb373533f..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_objective_spec.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_objective_spec import V1alpha3ObjectiveSpec # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3ObjectiveSpec(unittest.TestCase): - """V1alpha3ObjectiveSpec unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3ObjectiveSpec(self): - """Test V1alpha3ObjectiveSpec""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_objective_spec.V1alpha3ObjectiveSpec() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_observation.py b/sdk/python/v1alpha3/test/test_v1alpha3_observation.py deleted file mode 100644 index 0671722b9ef..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_observation.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_observation import V1alpha3Observation # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3Observation(unittest.TestCase): - """V1alpha3Observation unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3Observation(self): - """Test V1alpha3Observation""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_observation.V1alpha3Observation() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_operation.py b/sdk/python/v1alpha3/test/test_v1alpha3_operation.py deleted file mode 100644 index f4f0ea3f7c0..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_operation.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_operation import V1alpha3Operation # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3Operation(unittest.TestCase): - """V1alpha3Operation unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3Operation(self): - """Test V1alpha3Operation""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_operation.V1alpha3Operation() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_optimal_trial.py b/sdk/python/v1alpha3/test/test_v1alpha3_optimal_trial.py deleted file mode 100644 index 61dbfc2147e..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_optimal_trial.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_optimal_trial import V1alpha3OptimalTrial # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3OptimalTrial(unittest.TestCase): - """V1alpha3OptimalTrial unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3OptimalTrial(self): - """Test V1alpha3OptimalTrial""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_optimal_trial.V1alpha3OptimalTrial() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_parameter_assignment.py b/sdk/python/v1alpha3/test/test_v1alpha3_parameter_assignment.py deleted file mode 100644 index 1ab978ca383..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_parameter_assignment.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_parameter_assignment import V1alpha3ParameterAssignment # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3ParameterAssignment(unittest.TestCase): - """V1alpha3ParameterAssignment unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3ParameterAssignment(self): - """Test V1alpha3ParameterAssignment""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_parameter_assignment.V1alpha3ParameterAssignment() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_parameter_spec.py b/sdk/python/v1alpha3/test/test_v1alpha3_parameter_spec.py deleted file mode 100644 index 8e531980366..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_parameter_spec.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_parameter_spec import V1alpha3ParameterSpec # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3ParameterSpec(unittest.TestCase): - """V1alpha3ParameterSpec unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3ParameterSpec(self): - """Test V1alpha3ParameterSpec""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_parameter_spec.V1alpha3ParameterSpec() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_source_spec.py b/sdk/python/v1alpha3/test/test_v1alpha3_source_spec.py deleted file mode 100644 index bad0c566b1e..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_source_spec.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_source_spec import V1alpha3SourceSpec # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3SourceSpec(unittest.TestCase): - """V1alpha3SourceSpec unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3SourceSpec(self): - """Test V1alpha3SourceSpec""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_source_spec.V1alpha3SourceSpec() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_suggestion.py b/sdk/python/v1alpha3/test/test_v1alpha3_suggestion.py deleted file mode 100644 index 5df4948bd50..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_suggestion.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_suggestion import V1alpha3Suggestion # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3Suggestion(unittest.TestCase): - """V1alpha3Suggestion unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3Suggestion(self): - """Test V1alpha3Suggestion""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_suggestion.V1alpha3Suggestion() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_suggestion_condition.py b/sdk/python/v1alpha3/test/test_v1alpha3_suggestion_condition.py deleted file mode 100644 index 8981c27eea5..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_suggestion_condition.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_suggestion_condition import V1alpha3SuggestionCondition # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3SuggestionCondition(unittest.TestCase): - """V1alpha3SuggestionCondition unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3SuggestionCondition(self): - """Test V1alpha3SuggestionCondition""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_suggestion_condition.V1alpha3SuggestionCondition() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_suggestion_list.py b/sdk/python/v1alpha3/test/test_v1alpha3_suggestion_list.py deleted file mode 100644 index 6057598ae0b..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_suggestion_list.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_suggestion_list import V1alpha3SuggestionList # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3SuggestionList(unittest.TestCase): - """V1alpha3SuggestionList unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3SuggestionList(self): - """Test V1alpha3SuggestionList""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_suggestion_list.V1alpha3SuggestionList() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_suggestion_spec.py b/sdk/python/v1alpha3/test/test_v1alpha3_suggestion_spec.py deleted file mode 100644 index f17b7749be1..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_suggestion_spec.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_suggestion_spec import V1alpha3SuggestionSpec # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3SuggestionSpec(unittest.TestCase): - """V1alpha3SuggestionSpec unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3SuggestionSpec(self): - """Test V1alpha3SuggestionSpec""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_suggestion_spec.V1alpha3SuggestionSpec() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_suggestion_status.py b/sdk/python/v1alpha3/test/test_v1alpha3_suggestion_status.py deleted file mode 100644 index 90358d77a37..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_suggestion_status.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_suggestion_status import V1alpha3SuggestionStatus # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3SuggestionStatus(unittest.TestCase): - """V1alpha3SuggestionStatus unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3SuggestionStatus(self): - """Test V1alpha3SuggestionStatus""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_suggestion_status.V1alpha3SuggestionStatus() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_template_spec.py b/sdk/python/v1alpha3/test/test_v1alpha3_template_spec.py deleted file mode 100644 index 918537eadc1..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_template_spec.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_template_spec import V1alpha3TemplateSpec # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3TemplateSpec(unittest.TestCase): - """V1alpha3TemplateSpec unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3TemplateSpec(self): - """Test V1alpha3TemplateSpec""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_template_spec.V1alpha3TemplateSpec() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_trial.py b/sdk/python/v1alpha3/test/test_v1alpha3_trial.py deleted file mode 100644 index 62f7f2b4bbb..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_trial.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_trial import V1alpha3Trial # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3Trial(unittest.TestCase): - """V1alpha3Trial unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3Trial(self): - """Test V1alpha3Trial""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_trial.V1alpha3Trial() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_trial_assignment.py b/sdk/python/v1alpha3/test/test_v1alpha3_trial_assignment.py deleted file mode 100644 index d330d97ae31..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_trial_assignment.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_trial_assignment import V1alpha3TrialAssignment # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3TrialAssignment(unittest.TestCase): - """V1alpha3TrialAssignment unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3TrialAssignment(self): - """Test V1alpha3TrialAssignment""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_trial_assignment.V1alpha3TrialAssignment() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_trial_condition.py b/sdk/python/v1alpha3/test/test_v1alpha3_trial_condition.py deleted file mode 100644 index 4b8996d129c..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_trial_condition.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_trial_condition import V1alpha3TrialCondition # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3TrialCondition(unittest.TestCase): - """V1alpha3TrialCondition unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3TrialCondition(self): - """Test V1alpha3TrialCondition""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_trial_condition.V1alpha3TrialCondition() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_trial_list.py b/sdk/python/v1alpha3/test/test_v1alpha3_trial_list.py deleted file mode 100644 index f10ee76b0b9..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_trial_list.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_trial_list import V1alpha3TrialList # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3TrialList(unittest.TestCase): - """V1alpha3TrialList unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3TrialList(self): - """Test V1alpha3TrialList""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_trial_list.V1alpha3TrialList() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_trial_spec.py b/sdk/python/v1alpha3/test/test_v1alpha3_trial_spec.py deleted file mode 100644 index 43b556f8ae3..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_trial_spec.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_trial_spec import V1alpha3TrialSpec # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3TrialSpec(unittest.TestCase): - """V1alpha3TrialSpec unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3TrialSpec(self): - """Test V1alpha3TrialSpec""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_trial_spec.V1alpha3TrialSpec() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_trial_status.py b/sdk/python/v1alpha3/test/test_v1alpha3_trial_status.py deleted file mode 100644 index 9e2344d0d32..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_trial_status.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_trial_status import V1alpha3TrialStatus # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3TrialStatus(unittest.TestCase): - """V1alpha3TrialStatus unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3TrialStatus(self): - """Test V1alpha3TrialStatus""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_trial_status.V1alpha3TrialStatus() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1alpha3/test/test_v1alpha3_trial_template.py b/sdk/python/v1alpha3/test/test_v1alpha3_trial_template.py deleted file mode 100644 index 645ba10a0c5..00000000000 --- a/sdk/python/v1alpha3/test/test_v1alpha3_trial_template.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1alpha3-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import unittest - -import kubeflow.katib -from kubeflow.katib.models.v1alpha3_trial_template import V1alpha3TrialTemplate # noqa: E501 -from kubeflow.katib.rest import ApiException - - -class TestV1alpha3TrialTemplate(unittest.TestCase): - """V1alpha3TrialTemplate unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def testV1alpha3TrialTemplate(self): - """Test V1alpha3TrialTemplate""" - # FIXME: construct object with mandatory attributes with example values - # model = katib.models.v1alpha3_trial_template.V1alpha3TrialTemplate() # noqa: E501 - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/sdk/python/v1beta1/docs/KatibClient.md b/sdk/python/v1beta1/docs/KatibClient.md deleted file mode 100644 index 4f3d2766d51..00000000000 --- a/sdk/python/v1beta1/docs/KatibClient.md +++ /dev/null @@ -1,157 +0,0 @@ -# KatibClient - -> KatibClient(config_file=None, context=None, client_configuration=None, persist_config=True) - -User can load authentication and cluster information from kube-config file and stores them in kubernetes.client.configuration. Parameters are as following: - -| Parameter | Description | -| --- | --- | -| config_file | Location of kube-config file. Defaults to `~/.kube/config`. Note that the config_file is needed if user want to operate katib SDK in another remote cluster, user must set `config_file` to load kube-config file explicitly, e.g. `KatibClient(config_file="~/.kube/config")`. | -| context | Set the active context. If is set to None, current_context from config file will be used. | -| client_configuration | The kubernetes.client.Configuration to set configs to. | -| persist_config | If True, config file will be updated when changed (e.g GCP token refresh). | - -The APIs for KatibClient are as following: - -| Class | Method | Description | -| ----------- | ----------------------------------------------------------- | ------------------------------------------------------------------------- | -| KatibClient | [create_experiment](#create_experiment) | Create Katib Experiment | -| KatibClient | [get_experiment](#get_experiment) | Get or watch the specified Experiment or all Experiments in the namespace | -| KatibClient | [delete_experiment](#delete_experiment) | Delete specified Experiment | -| KatibClient | [list_experiments](#list_experiments) | List all Experiments with status | -| KatibClient | [get_experiment_status](#get_experiment_status) | Get Experiment status | -| KatibClient | [is_experiment_succeeded](#is_experiment_succeeded) | Check if Experiment status is Succeeded | -| KatibClient | [list_trials](#list_trials) | List all Trials of specified Experiment with status | -| KatibClient | [get_optimal_hyperparameters](#get_optimal_hyperparameters) | Get currentOptimalTrial with parameterAssignments of an Experiment | - -## create_experiment - -> create_experiment(experiment, namespace=None) - -### Parameters - -| Name | Type | Description | Notes | -| --- | --- | --- | --- | -| experiment | [V1beta1Experiment](V1beta1Experiment.md) | experiment definition | Required | -| namespace | str | Namespace for experiment deploying to. If the `namespace` is not defined, will align with experiment definition, or use current or default namespace if namespace is not specified in experiment definition. | Optional | - - -### Return type - -object - -## get_experiment - -> get_experiment(name=None, namespace=None) - -Get Experiment in the specified namespace - -### Parameters - -| Name | Type | Description | Notes | -| --- | --- | --- | --- | -| name | str | Experiment name. If the `name` is not specified, will get all experiments in the namespace. | Optional | -| namespace | str | Experiment's namespace. Defaults to current or default namespace. | Optional | - -### Return type - -object - -## delete_experiment - -> delete_experiment(name, namespace=None) - -### Parameters - -| Name | Type | Description | Notes | -| --------- | ---- | --------------------------------------------------------------- | -------- | -| name | str | Experiment name. | Required | -| namespace | str | Experiment namespace. Defaults to current or default namespace. | Optional | - -### Return type - -object - -## list_experiments - -> list_experiments(namespace=None) - -List all Experiments with status - -### Parameters - -| Name | Type | Description | Notes | -| --------- | ---- | --------------------------------------------------------------- | -------- | -| namespace | str | Experiment namespace. Defaults to current or default namespace. | Optional | - -### Return type - -List - -## get_experiment_status - -> get_experiment_status(name, namespace=None) - -Returns Experiment status, such as Created, Running, Failed, Succeeded or Restarting. - -### Parameters - -| Name | Type | Description | Notes | -| --------- | ---- | --------------------------------------------------------------- | -------- | -| name | str | Experiment name. | Required | -| namespace | str | Experiment namespace. Defaults to current or default namespace. | Optional | - -### Return type - -Str - -## is_experiment_succeeded - -> is_experiment_succeeded(name, namespace=None) - -Returns True if Experiment succeeded; false otherwise. - -### Parameters - -| Name | Type | Description | Notes | -| --------- | ---- | --------------------------------------------------------------- | -------- | -| name | str | Experiment name. | Required | -| namespace | str | Experiment namespace. Defaults to current or default namespace. | Optional | - -### Return type - -Bool - -## list_trials - -> list_trials(name, namespace=None) - -List all Trials of an Experiment with status - -### Parameters - -| Name | Type | Description | Notes | -| --------- | ---- | --------------------------------------------------------------- | -------- | -| name | str | Experiment name. | Required | -| namespace | str | Experiment namespace. Defaults to current or default namespace. | Optional | - -### Return type - -List - -## get_optimal_hyperparameters - -> get_optimal_hyperparameters(name, namespace=None) - -Get currentOptimalTrial with parameterAssignments of an Experiment - -### Parameters - -| Name | Type | Description | Notes | -| --------- | ---- | --------------------------------------------------------------- | -------- | -| name | str | Experiment name. | Required | -| namespace | str | Experiment namespace. Defaults to current or default namespace. | Optional | - -### Return type - -Dict diff --git a/sdk/python/v1beta1/docs/V1Time.md b/sdk/python/v1beta1/docs/V1Time.md deleted file mode 100644 index 1bc6a022af6..00000000000 --- a/sdk/python/v1beta1/docs/V1Time.md +++ /dev/null @@ -1,7 +0,0 @@ -# V1Time - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/docs/V1UnstructuredUnstructured.md b/sdk/python/v1beta1/docs/V1UnstructuredUnstructured.md deleted file mode 100644 index f02db67f502..00000000000 --- a/sdk/python/v1beta1/docs/V1UnstructuredUnstructured.md +++ /dev/null @@ -1,7 +0,0 @@ -# V1UnstructuredUnstructured - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1_time.py b/sdk/python/v1beta1/kubeflow/katib/models/v1_time.py deleted file mode 100644 index cabbec802af..00000000000 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1_time.py +++ /dev/null @@ -1,86 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1beta1-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1Time(object): - """NOTE: This class is auto generated by the swagger code generator program. - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501 - """V1Time - a model defined in Swagger""" # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1Time, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1Time): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1_unstructured_unstructured.py b/sdk/python/v1beta1/kubeflow/katib/models/v1_unstructured_unstructured.py deleted file mode 100644 index ae39cdc5dc8..00000000000 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1_unstructured_unstructured.py +++ /dev/null @@ -1,86 +0,0 @@ -# coding: utf-8 - -""" - Katib - - Swagger description for Katib # noqa: E501 - - OpenAPI spec version: v1beta1-0.1 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -import pprint -import re # noqa: F401 - -import six - - -class V1UnstructuredUnstructured(object): - """NOTE: This class is auto generated by the swagger code generator program. - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501 - """V1UnstructuredUnstructured - a model defined in Swagger""" # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - if issubclass(V1UnstructuredUnstructured, dict): - for key, value in self.items(): - result[key] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V1UnstructuredUnstructured): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/test/unit/v1alpha3/crds/pytorchjob_v1.yaml b/test/unit/v1alpha3/crds/pytorchjob_v1.yaml deleted file mode 100644 index 697294be50f..00000000000 --- a/test/unit/v1alpha3/crds/pytorchjob_v1.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: pytorchjobs.kubeflow.org -spec: - group: kubeflow.org - version: v1 - scope: Namespaced - names: - kind: PyTorchJob - singular: pytorchjob - plural: pytorchjobs diff --git a/test/unit/v1alpha3/crds/tfjob_v1.yaml b/test/unit/v1alpha3/crds/tfjob_v1.yaml deleted file mode 100644 index 580ca69aa8c..00000000000 --- a/test/unit/v1alpha3/crds/tfjob_v1.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: tfjobs.kubeflow.org -spec: - group: kubeflow.org - version: v1 - scope: Namespaced - names: - kind: TFJob - singular: tfjob - plural: tfjobs diff --git a/vendor/github.com/gobuffalo/envy/LICENSE.txt b/vendor/github.com/gobuffalo/envy/LICENSE.txt deleted file mode 100644 index 123ddc0d804..00000000000 --- a/vendor/github.com/gobuffalo/envy/LICENSE.txt +++ /dev/null @@ -1,8 +0,0 @@ -The MIT License (MIT) -Copyright (c) 2018 Mark Bates - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/gobuffalo/envy/envy.go b/vendor/github.com/gobuffalo/envy/envy.go deleted file mode 100644 index d3995f45577..00000000000 --- a/vendor/github.com/gobuffalo/envy/envy.go +++ /dev/null @@ -1,268 +0,0 @@ -/* -package envy makes working with ENV variables in Go trivial. - -* Get ENV variables with default values. -* Set ENV variables safely without affecting the underlying system. -* Temporarily change ENV vars; useful for testing. -* Map all of the key/values in the ENV. -* Loads .env files (by using [godotenv](https://github.com/joho/godotenv/)) -* More! -*/ -package envy - -import ( - "errors" - "flag" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - "sync" - - "github.com/joho/godotenv" - "github.com/rogpeppe/go-internal/modfile" -) - -var gil = &sync.RWMutex{} -var env = map[string]string{} - -// GO111MODULE is ENV for turning mods on/off -const GO111MODULE = "GO111MODULE" - -func init() { - Load() - loadEnv() -} - -// Load the ENV variables to the env map -func loadEnv() { - gil.Lock() - defer gil.Unlock() - - if os.Getenv("GO_ENV") == "" { - // if the flag "test.v" is *defined*, we're running as a unit test. Note that we don't care - // about v.Value (verbose test mode); we just want to know if the test environment has defined - // it. It's also possible that the flags are not yet fully parsed (i.e. flag.Parsed() == false), - // so we could not depend on v.Value anyway. - // - if v := flag.Lookup("test.v"); v != nil { - env["GO_ENV"] = "test" - } - } - - // set the GOPATH if using >= 1.8 and the GOPATH isn't set - if os.Getenv("GOPATH") == "" { - out, err := exec.Command("go", "env", "GOPATH").Output() - if err == nil { - gp := strings.TrimSpace(string(out)) - os.Setenv("GOPATH", gp) - } - } - - for _, e := range os.Environ() { - pair := strings.Split(e, "=") - env[pair[0]] = os.Getenv(pair[0]) - } -} - -func Mods() bool { - return Get(GO111MODULE, "off") == "on" -} - -// Reload the ENV variables. Useful if -// an external ENV manager has been used -func Reload() { - env = map[string]string{} - loadEnv() -} - -// Load .env files. Files will be loaded in the same order that are received. -// Redefined vars will override previously existing values. -// IE: envy.Load(".env", "test_env/.env") will result in DIR=test_env -// If no arg passed, it will try to load a .env file. -func Load(files ...string) error { - - // If no files received, load the default one - if len(files) == 0 { - err := godotenv.Overload() - if err == nil { - Reload() - } - return err - } - - // We received a list of files - for _, file := range files { - - // Check if it exists or we can access - if _, err := os.Stat(file); err != nil { - // It does not exist or we can not access. - // Return and stop loading - return err - } - - // It exists and we have permission. Load it - if err := godotenv.Overload(file); err != nil { - return err - } - - // Reload the env so all new changes are noticed - Reload() - - } - return nil -} - -// Get a value from the ENV. If it doesn't exist the -// default value will be returned. -func Get(key string, value string) string { - gil.RLock() - defer gil.RUnlock() - if v, ok := env[key]; ok { - return v - } - return value -} - -// Get a value from the ENV. If it doesn't exist -// an error will be returned -func MustGet(key string) (string, error) { - gil.RLock() - defer gil.RUnlock() - if v, ok := env[key]; ok { - return v, nil - } - return "", fmt.Errorf("could not find ENV var with %s", key) -} - -// Set a value into the ENV. This is NOT permanent. It will -// only affect values accessed through envy. -func Set(key string, value string) { - gil.Lock() - defer gil.Unlock() - env[key] = value -} - -// MustSet the value into the underlying ENV, as well as envy. -// This may return an error if there is a problem setting the -// underlying ENV value. -func MustSet(key string, value string) error { - gil.Lock() - defer gil.Unlock() - err := os.Setenv(key, value) - if err != nil { - return err - } - env[key] = value - return nil -} - -// Map all of the keys/values set in envy. -func Map() map[string]string { - gil.RLock() - defer gil.RUnlock() - cp := map[string]string{} - for k, v := range env { - cp[k] = v - } - return env -} - -// Temp makes a copy of the values and allows operation on -// those values temporarily during the run of the function. -// At the end of the function run the copy is discarded and -// the original values are replaced. This is useful for testing. -// Warning: This function is NOT safe to use from a goroutine or -// from code which may access any Get or Set function from a goroutine -func Temp(f func()) { - oenv := env - env = map[string]string{} - for k, v := range oenv { - env[k] = v - } - defer func() { env = oenv }() - f() -} - -func GoPath() string { - return Get("GOPATH", "") -} - -func GoBin() string { - return Get("GO_BIN", "go") -} - -func InGoPath() bool { - pwd, _ := os.Getwd() - for _, p := range GoPaths() { - if strings.HasPrefix(pwd, p) { - return true - } - } - return false -} - -// GoPaths returns all possible GOPATHS that are set. -func GoPaths() []string { - gp := Get("GOPATH", "") - if runtime.GOOS == "windows" { - return strings.Split(gp, ";") // Windows uses a different separator - } - return strings.Split(gp, ":") -} - -func importPath(path string) string { - path = strings.TrimPrefix(path, "/private") - for _, gopath := range GoPaths() { - srcpath := filepath.Join(gopath, "src") - rel, err := filepath.Rel(srcpath, path) - if err == nil { - return filepath.ToSlash(rel) - } - } - - // fallback to trim - rel := strings.TrimPrefix(path, filepath.Join(GoPath(), "src")) - rel = strings.TrimPrefix(rel, string(filepath.Separator)) - return filepath.ToSlash(rel) -} - -// CurrentModule will attempt to return the module name from `go.mod` if -// modules are enabled. -// If modules are not enabled it will fallback to using CurrentPackage instead. -func CurrentModule() (string, error) { - if !Mods() { - return CurrentPackage(), nil - } - moddata, err := ioutil.ReadFile("go.mod") - if err != nil { - return "", errors.New("go.mod cannot be read or does not exist while go module is enabled") - } - packagePath := modfile.ModulePath(moddata) - if packagePath == "" { - return "", errors.New("go.mod is malformed") - } - return packagePath, nil -} - -// CurrentPackage attempts to figure out the current package name from the PWD -// Use CurrentModule for a more accurate package name. -func CurrentPackage() string { - if Mods() { - } - pwd, _ := os.Getwd() - return importPath(pwd) -} - -func Environ() []string { - gil.RLock() - defer gil.RUnlock() - var e []string - for k, v := range env { - e = append(e, fmt.Sprintf("%s=%s", k, v)) - } - return e -} diff --git a/vendor/github.com/gobuffalo/envy/version.go b/vendor/github.com/gobuffalo/envy/version.go deleted file mode 100644 index 0bff116a5db..00000000000 --- a/vendor/github.com/gobuffalo/envy/version.go +++ /dev/null @@ -1,3 +0,0 @@ -package envy - -const Version = "v1.6.15" diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/context.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/context.go deleted file mode 100644 index a745074c961..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/context.go +++ /dev/null @@ -1,187 +0,0 @@ -package runtime - -import ( - "fmt" - "net" - "net/http" - "strconv" - "strings" - "time" - - "context" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// MetadataHeaderPrefix is the http prefix that represents custom metadata -// parameters to or from a gRPC call. -const MetadataHeaderPrefix = "Grpc-Metadata-" - -// MetadataPrefix is the prefix for grpc-gateway supplied custom metadata fields. -const MetadataPrefix = "grpcgateway-" - -// MetadataTrailerPrefix is prepended to gRPC metadata as it is converted to -// HTTP headers in a response handled by grpc-gateway -const MetadataTrailerPrefix = "Grpc-Trailer-" - -const metadataGrpcTimeout = "Grpc-Timeout" - -const xForwardedFor = "X-Forwarded-For" -const xForwardedHost = "X-Forwarded-Host" - -var ( - // DefaultContextTimeout is used for gRPC call context.WithTimeout whenever a Grpc-Timeout inbound - // header isn't present. If the value is 0 the sent `context` will not have a timeout. - DefaultContextTimeout = 0 * time.Second -) - -/* -AnnotateContext adds context information such as metadata from the request. - -At a minimum, the RemoteAddr is included in the fashion of "X-Forwarded-For", -except that the forwarded destination is not another HTTP service but rather -a gRPC service. -*/ -func AnnotateContext(ctx context.Context, mux *ServeMux, req *http.Request) (context.Context, error) { - var pairs []string - timeout := DefaultContextTimeout - if tm := req.Header.Get(metadataGrpcTimeout); tm != "" { - var err error - timeout, err = timeoutDecode(tm) - if err != nil { - return nil, status.Errorf(codes.InvalidArgument, "invalid grpc-timeout: %s", tm) - } - } - - for key, vals := range req.Header { - for _, val := range vals { - // For backwards-compatibility, pass through 'authorization' header with no prefix. - if strings.ToLower(key) == "authorization" { - pairs = append(pairs, "authorization", val) - } - if h, ok := mux.incomingHeaderMatcher(key); ok { - pairs = append(pairs, h, val) - } - } - } - if host := req.Header.Get(xForwardedHost); host != "" { - pairs = append(pairs, strings.ToLower(xForwardedHost), host) - } else if req.Host != "" { - pairs = append(pairs, strings.ToLower(xForwardedHost), req.Host) - } - - if addr := req.RemoteAddr; addr != "" { - if remoteIP, _, err := net.SplitHostPort(addr); err == nil { - if fwd := req.Header.Get(xForwardedFor); fwd == "" { - pairs = append(pairs, strings.ToLower(xForwardedFor), remoteIP) - } else { - pairs = append(pairs, strings.ToLower(xForwardedFor), fmt.Sprintf("%s, %s", fwd, remoteIP)) - } - } else { - grpclog.Printf("invalid remote addr: %s", addr) - } - } - - if timeout != 0 { - ctx, _ = context.WithTimeout(ctx, timeout) - } - if len(pairs) == 0 { - return ctx, nil - } - md := metadata.Pairs(pairs...) - for _, mda := range mux.metadataAnnotators { - md = metadata.Join(md, mda(ctx, req)) - } - return metadata.NewOutgoingContext(ctx, md), nil -} - -// ServerMetadata consists of metadata sent from gRPC server. -type ServerMetadata struct { - HeaderMD metadata.MD - TrailerMD metadata.MD -} - -type serverMetadataKey struct{} - -// NewServerMetadataContext creates a new context with ServerMetadata -func NewServerMetadataContext(ctx context.Context, md ServerMetadata) context.Context { - return context.WithValue(ctx, serverMetadataKey{}, md) -} - -// ServerMetadataFromContext returns the ServerMetadata in ctx -func ServerMetadataFromContext(ctx context.Context) (md ServerMetadata, ok bool) { - md, ok = ctx.Value(serverMetadataKey{}).(ServerMetadata) - return -} - -func timeoutDecode(s string) (time.Duration, error) { - size := len(s) - if size < 2 { - return 0, fmt.Errorf("timeout string is too short: %q", s) - } - d, ok := timeoutUnitToDuration(s[size-1]) - if !ok { - return 0, fmt.Errorf("timeout unit is not recognized: %q", s) - } - t, err := strconv.ParseInt(s[:size-1], 10, 64) - if err != nil { - return 0, err - } - return d * time.Duration(t), nil -} - -func timeoutUnitToDuration(u uint8) (d time.Duration, ok bool) { - switch u { - case 'H': - return time.Hour, true - case 'M': - return time.Minute, true - case 'S': - return time.Second, true - case 'm': - return time.Millisecond, true - case 'u': - return time.Microsecond, true - case 'n': - return time.Nanosecond, true - default: - } - return -} - -// isPermanentHTTPHeader checks whether hdr belongs to the list of -// permenant request headers maintained by IANA. -// http://www.iana.org/assignments/message-headers/message-headers.xml -func isPermanentHTTPHeader(hdr string) bool { - switch hdr { - case - "Accept", - "Accept-Charset", - "Accept-Language", - "Accept-Ranges", - "Authorization", - "Cache-Control", - "Content-Type", - "Cookie", - "Date", - "Expect", - "From", - "Host", - "If-Match", - "If-Modified-Since", - "If-None-Match", - "If-Schedule-Tag-Match", - "If-Unmodified-Since", - "Max-Forwards", - "Origin", - "Pragma", - "Referer", - "User-Agent", - "Via", - "Warning": - return true - } - return false -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/convert.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/convert.go deleted file mode 100644 index 903ae23407b..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/convert.go +++ /dev/null @@ -1,87 +0,0 @@ -package runtime - -import ( - "encoding/base64" - "strconv" - - "github.com/golang/protobuf/jsonpb" - "github.com/golang/protobuf/ptypes/duration" - "github.com/golang/protobuf/ptypes/timestamp" -) - -// String just returns the given string. -// It is just for compatibility to other types. -func String(val string) (string, error) { - return val, nil -} - -// Bool converts the given string representation of a boolean value into bool. -func Bool(val string) (bool, error) { - return strconv.ParseBool(val) -} - -// Float64 converts the given string representation into representation of a floating point number into float64. -func Float64(val string) (float64, error) { - return strconv.ParseFloat(val, 64) -} - -// Float32 converts the given string representation of a floating point number into float32. -func Float32(val string) (float32, error) { - f, err := strconv.ParseFloat(val, 32) - if err != nil { - return 0, err - } - return float32(f), nil -} - -// Int64 converts the given string representation of an integer into int64. -func Int64(val string) (int64, error) { - return strconv.ParseInt(val, 0, 64) -} - -// Int32 converts the given string representation of an integer into int32. -func Int32(val string) (int32, error) { - i, err := strconv.ParseInt(val, 0, 32) - if err != nil { - return 0, err - } - return int32(i), nil -} - -// Uint64 converts the given string representation of an integer into uint64. -func Uint64(val string) (uint64, error) { - return strconv.ParseUint(val, 0, 64) -} - -// Uint32 converts the given string representation of an integer into uint32. -func Uint32(val string) (uint32, error) { - i, err := strconv.ParseUint(val, 0, 32) - if err != nil { - return 0, err - } - return uint32(i), nil -} - -// Bytes converts the given string representation of a byte sequence into a slice of bytes -// A bytes sequence is encoded in URL-safe base64 without padding -func Bytes(val string) ([]byte, error) { - b, err := base64.StdEncoding.DecodeString(val) - if err != nil { - return nil, err - } - return b, nil -} - -// Timestamp converts the given RFC3339 formatted string into a timestamp.Timestamp. -func Timestamp(val string) (*timestamp.Timestamp, error) { - var r *timestamp.Timestamp - err := jsonpb.UnmarshalString(val, r) - return r, err -} - -// Duration converts the given string into a timestamp.Duration. -func Duration(val string) (*duration.Duration, error) { - var r *duration.Duration - err := jsonpb.UnmarshalString(val, r) - return r, err -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/doc.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/doc.go deleted file mode 100644 index b6e5ddf7a9f..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -/* -Package runtime contains runtime helper functions used by -servers which protoc-gen-grpc-gateway generates. -*/ -package runtime diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/errors.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/errors.go deleted file mode 100644 index 0e2bdf4457d..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/errors.go +++ /dev/null @@ -1,142 +0,0 @@ -package runtime - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/proto" - "github.com/golang/protobuf/ptypes" - "github.com/golang/protobuf/ptypes/any" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/status" -) - -// HTTPStatusFromCode converts a gRPC error code into the corresponding HTTP response status. -// See: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto -func HTTPStatusFromCode(code codes.Code) int { - switch code { - case codes.OK: - return http.StatusOK - case codes.Canceled: - return http.StatusRequestTimeout - case codes.Unknown: - return http.StatusInternalServerError - case codes.InvalidArgument: - return http.StatusBadRequest - case codes.DeadlineExceeded: - return http.StatusGatewayTimeout - case codes.NotFound: - return http.StatusNotFound - case codes.AlreadyExists: - return http.StatusConflict - case codes.PermissionDenied: - return http.StatusForbidden - case codes.Unauthenticated: - return http.StatusUnauthorized - case codes.ResourceExhausted: - return http.StatusTooManyRequests - case codes.FailedPrecondition: - return http.StatusPreconditionFailed - case codes.Aborted: - return http.StatusConflict - case codes.OutOfRange: - return http.StatusBadRequest - case codes.Unimplemented: - return http.StatusNotImplemented - case codes.Internal: - return http.StatusInternalServerError - case codes.Unavailable: - return http.StatusServiceUnavailable - case codes.DataLoss: - return http.StatusInternalServerError - } - - grpclog.Printf("Unknown gRPC error code: %v", code) - return http.StatusInternalServerError -} - -var ( - // HTTPError replies to the request with the error. - // You can set a custom function to this variable to customize error format. - HTTPError = DefaultHTTPError - // OtherErrorHandler handles the following error used by the gateway: StatusMethodNotAllowed StatusNotFound and StatusBadRequest - OtherErrorHandler = DefaultOtherErrorHandler -) - -type errorBody struct { - Error string `protobuf:"bytes,1,name=error" json:"error"` - Code int32 `protobuf:"varint,2,name=code" json:"code"` - Details []*any.Any `protobuf:"bytes,3,rep,name=details" json:"details,omitempty"` -} - -// Make this also conform to proto.Message for builtin JSONPb Marshaler -func (e *errorBody) Reset() { *e = errorBody{} } -func (e *errorBody) String() string { return proto.CompactTextString(e) } -func (*errorBody) ProtoMessage() {} - -// DefaultHTTPError is the default implementation of HTTPError. -// If "err" is an error from gRPC system, the function replies with the status code mapped by HTTPStatusFromCode. -// If otherwise, it replies with http.StatusInternalServerError. -// -// The response body returned by this function is a JSON object, -// which contains a member whose key is "error" and whose value is err.Error(). -func DefaultHTTPError(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, _ *http.Request, err error) { - const fallback = `{"error": "failed to marshal error message"}` - - w.Header().Del("Trailer") - w.Header().Set("Content-Type", marshaler.ContentType()) - - s, ok := status.FromError(err) - if !ok { - s = status.New(codes.Unknown, err.Error()) - } - - body := &errorBody{ - Error: s.Message(), - Code: int32(s.Code()), - } - - for _, detail := range s.Details() { - if det, ok := detail.(proto.Message); ok { - a, err := ptypes.MarshalAny(det) - if err != nil { - grpclog.Printf("Failed to marshal any: %v", err) - } else { - body.Details = append(body.Details, a) - } - } - } - - buf, merr := marshaler.Marshal(body) - if merr != nil { - grpclog.Printf("Failed to marshal error message %q: %v", body, merr) - w.WriteHeader(http.StatusInternalServerError) - if _, err := io.WriteString(w, fallback); err != nil { - grpclog.Printf("Failed to write response: %v", err) - } - return - } - - md, ok := ServerMetadataFromContext(ctx) - if !ok { - grpclog.Printf("Failed to extract ServerMetadata from context") - } - - handleForwardResponseServerMetadata(w, mux, md) - handleForwardResponseTrailerHeader(w, md) - st := HTTPStatusFromCode(s.Code()) - w.WriteHeader(st) - if _, err := w.Write(buf); err != nil { - grpclog.Printf("Failed to write response: %v", err) - } - - handleForwardResponseTrailer(w, md) -} - -// DefaultOtherErrorHandler is the default implementation of OtherErrorHandler. -// It simply writes a string representation of the given error into "w". -func DefaultOtherErrorHandler(w http.ResponseWriter, _ *http.Request, msg string, code int) { - http.Error(w, msg, code) -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/handler.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/handler.go deleted file mode 100644 index 1b3c65035a4..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/handler.go +++ /dev/null @@ -1,195 +0,0 @@ -package runtime - -import ( - "fmt" - "io" - "net/http" - "net/textproto" - - "context" - "github.com/golang/protobuf/proto" - "github.com/golang/protobuf/ptypes/any" - "github.com/grpc-ecosystem/grpc-gateway/runtime/internal" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/status" -) - -// ForwardResponseStream forwards the stream from gRPC server to REST client. -func ForwardResponseStream(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, req *http.Request, recv func() (proto.Message, error), opts ...func(context.Context, http.ResponseWriter, proto.Message) error) { - f, ok := w.(http.Flusher) - if !ok { - grpclog.Printf("Flush not supported in %T", w) - http.Error(w, "unexpected type of web server", http.StatusInternalServerError) - return - } - - md, ok := ServerMetadataFromContext(ctx) - if !ok { - grpclog.Printf("Failed to extract ServerMetadata from context") - http.Error(w, "unexpected error", http.StatusInternalServerError) - return - } - handleForwardResponseServerMetadata(w, mux, md) - - w.Header().Set("Transfer-Encoding", "chunked") - w.Header().Set("Content-Type", marshaler.ContentType()) - if err := handleForwardResponseOptions(ctx, w, nil, opts); err != nil { - HTTPError(ctx, mux, marshaler, w, req, err) - return - } - - var delimiter []byte - if d, ok := marshaler.(Delimited); ok { - delimiter = d.Delimiter() - } else { - delimiter = []byte("\n") - } - - var wroteHeader bool - for { - resp, err := recv() - if err == io.EOF { - return - } - if err != nil { - handleForwardResponseStreamError(wroteHeader, marshaler, w, err) - return - } - if err := handleForwardResponseOptions(ctx, w, resp, opts); err != nil { - handleForwardResponseStreamError(wroteHeader, marshaler, w, err) - return - } - - buf, err := marshaler.Marshal(streamChunk(resp, nil)) - if err != nil { - grpclog.Printf("Failed to marshal response chunk: %v", err) - handleForwardResponseStreamError(wroteHeader, marshaler, w, err) - return - } - if _, err = w.Write(buf); err != nil { - grpclog.Printf("Failed to send response chunk: %v", err) - return - } - wroteHeader = true - if _, err = w.Write(delimiter); err != nil { - grpclog.Printf("Failed to send delimiter chunk: %v", err) - return - } - f.Flush() - } -} - -func handleForwardResponseServerMetadata(w http.ResponseWriter, mux *ServeMux, md ServerMetadata) { - for k, vs := range md.HeaderMD { - if h, ok := mux.outgoingHeaderMatcher(k); ok { - for _, v := range vs { - w.Header().Add(h, v) - } - } - } -} - -func handleForwardResponseTrailerHeader(w http.ResponseWriter, md ServerMetadata) { - for k := range md.TrailerMD { - tKey := textproto.CanonicalMIMEHeaderKey(fmt.Sprintf("%s%s", MetadataTrailerPrefix, k)) - w.Header().Add("Trailer", tKey) - } -} - -func handleForwardResponseTrailer(w http.ResponseWriter, md ServerMetadata) { - for k, vs := range md.TrailerMD { - tKey := fmt.Sprintf("%s%s", MetadataTrailerPrefix, k) - for _, v := range vs { - w.Header().Add(tKey, v) - } - } -} - -// ForwardResponseMessage forwards the message "resp" from gRPC server to REST client. -func ForwardResponseMessage(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, req *http.Request, resp proto.Message, opts ...func(context.Context, http.ResponseWriter, proto.Message) error) { - md, ok := ServerMetadataFromContext(ctx) - if !ok { - grpclog.Printf("Failed to extract ServerMetadata from context") - } - - handleForwardResponseServerMetadata(w, mux, md) - handleForwardResponseTrailerHeader(w, md) - w.Header().Set("Content-Type", marshaler.ContentType()) - if err := handleForwardResponseOptions(ctx, w, resp, opts); err != nil { - HTTPError(ctx, mux, marshaler, w, req, err) - return - } - - buf, err := marshaler.Marshal(resp) - if err != nil { - grpclog.Printf("Marshal error: %v", err) - HTTPError(ctx, mux, marshaler, w, req, err) - return - } - - if _, err = w.Write(buf); err != nil { - grpclog.Printf("Failed to write response: %v", err) - } - - handleForwardResponseTrailer(w, md) -} - -func handleForwardResponseOptions(ctx context.Context, w http.ResponseWriter, resp proto.Message, opts []func(context.Context, http.ResponseWriter, proto.Message) error) error { - if len(opts) == 0 { - return nil - } - for _, opt := range opts { - if err := opt(ctx, w, resp); err != nil { - grpclog.Printf("Error handling ForwardResponseOptions: %v", err) - return err - } - } - return nil -} - -func handleForwardResponseStreamError(wroteHeader bool, marshaler Marshaler, w http.ResponseWriter, err error) { - buf, merr := marshaler.Marshal(streamChunk(nil, err)) - if merr != nil { - grpclog.Printf("Failed to marshal an error: %v", merr) - return - } - if !wroteHeader { - s, ok := status.FromError(err) - if !ok { - s = status.New(codes.Unknown, err.Error()) - } - w.WriteHeader(HTTPStatusFromCode(s.Code())) - } - if _, werr := w.Write(buf); werr != nil { - grpclog.Printf("Failed to notify error to client: %v", werr) - return - } -} - -func streamChunk(result proto.Message, err error) map[string]proto.Message { - if err != nil { - grpcCode := codes.Unknown - grpcMessage := err.Error() - var grpcDetails []*any.Any - if s, ok := status.FromError(err); ok { - grpcCode = s.Code() - grpcMessage = s.Message() - grpcDetails = s.Proto().GetDetails() - } - httpCode := HTTPStatusFromCode(grpcCode) - return map[string]proto.Message{ - "error": &internal.StreamError{ - GrpcCode: int32(grpcCode), - HttpCode: int32(httpCode), - Message: grpcMessage, - HttpStatus: http.StatusText(httpCode), - Details: grpcDetails, - }, - } - } - if result == nil { - return streamChunk(nil, fmt.Errorf("empty response")) - } - return map[string]proto.Message{"result": result} -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/internal/stream_chunk.pb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/internal/stream_chunk.pb.go deleted file mode 100644 index a06c722c167..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/internal/stream_chunk.pb.go +++ /dev/null @@ -1,119 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: runtime/internal/stream_chunk.proto - -package internal - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import any "github.com/golang/protobuf/ptypes/any" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -// StreamError is a response type which is returned when -// streaming rpc returns an error. -type StreamError struct { - GrpcCode int32 `protobuf:"varint,1,opt,name=grpc_code,json=grpcCode" json:"grpc_code,omitempty"` - HttpCode int32 `protobuf:"varint,2,opt,name=http_code,json=httpCode" json:"http_code,omitempty"` - Message string `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` - HttpStatus string `protobuf:"bytes,4,opt,name=http_status,json=httpStatus" json:"http_status,omitempty"` - Details []*any.Any `protobuf:"bytes,5,rep,name=details" json:"details,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StreamError) Reset() { *m = StreamError{} } -func (m *StreamError) String() string { return proto.CompactTextString(m) } -func (*StreamError) ProtoMessage() {} -func (*StreamError) Descriptor() ([]byte, []int) { - return fileDescriptor_stream_chunk_6adb10b40700458b, []int{0} -} -func (m *StreamError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StreamError.Unmarshal(m, b) -} -func (m *StreamError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StreamError.Marshal(b, m, deterministic) -} -func (dst *StreamError) XXX_Merge(src proto.Message) { - xxx_messageInfo_StreamError.Merge(dst, src) -} -func (m *StreamError) XXX_Size() int { - return xxx_messageInfo_StreamError.Size(m) -} -func (m *StreamError) XXX_DiscardUnknown() { - xxx_messageInfo_StreamError.DiscardUnknown(m) -} - -var xxx_messageInfo_StreamError proto.InternalMessageInfo - -func (m *StreamError) GetGrpcCode() int32 { - if m != nil { - return m.GrpcCode - } - return 0 -} - -func (m *StreamError) GetHttpCode() int32 { - if m != nil { - return m.HttpCode - } - return 0 -} - -func (m *StreamError) GetMessage() string { - if m != nil { - return m.Message - } - return "" -} - -func (m *StreamError) GetHttpStatus() string { - if m != nil { - return m.HttpStatus - } - return "" -} - -func (m *StreamError) GetDetails() []*any.Any { - if m != nil { - return m.Details - } - return nil -} - -func init() { - proto.RegisterType((*StreamError)(nil), "grpc.gateway.runtime.StreamError") -} - -func init() { - proto.RegisterFile("runtime/internal/stream_chunk.proto", fileDescriptor_stream_chunk_6adb10b40700458b) -} - -var fileDescriptor_stream_chunk_6adb10b40700458b = []byte{ - // 226 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x34, 0x90, 0xc1, 0x4e, 0x84, 0x30, - 0x10, 0x86, 0x83, 0xeb, 0xba, 0xbb, 0xc3, 0x8d, 0xec, 0xa1, 0xea, 0x41, 0xa2, 0x17, 0x4e, 0x25, - 0xd1, 0x27, 0x50, 0xe3, 0x0b, 0xb0, 0x37, 0x2f, 0x9b, 0x59, 0x18, 0x0b, 0x11, 0x5a, 0x32, 0x1d, - 0x62, 0x78, 0x2d, 0x9f, 0xd0, 0xb4, 0xc8, 0xb1, 0xdf, 0xf7, 0xff, 0x93, 0x3f, 0x85, 0x27, 0x9e, - 0xac, 0x74, 0x03, 0x95, 0x9d, 0x15, 0x62, 0x8b, 0x7d, 0xe9, 0x85, 0x09, 0x87, 0x73, 0xdd, 0x4e, - 0xf6, 0x5b, 0x8f, 0xec, 0xc4, 0x65, 0x47, 0xc3, 0x63, 0xad, 0x0d, 0x0a, 0xfd, 0xe0, 0xac, 0xff, - 0x1b, 0x77, 0xb7, 0xc6, 0x39, 0xd3, 0x53, 0x19, 0x33, 0x97, 0xe9, 0xab, 0x44, 0x3b, 0x2f, 0x85, - 0xc7, 0xdf, 0x04, 0xd2, 0x53, 0xbc, 0xf3, 0xc1, 0xec, 0x38, 0xbb, 0x87, 0x43, 0x38, 0x71, 0xae, - 0x5d, 0x43, 0x2a, 0xc9, 0x93, 0x62, 0x5b, 0xed, 0x03, 0x78, 0x77, 0x0d, 0x05, 0xd9, 0x8a, 0x8c, - 0x8b, 0xbc, 0x5a, 0x64, 0x00, 0x51, 0x2a, 0xd8, 0x0d, 0xe4, 0x3d, 0x1a, 0x52, 0x9b, 0x3c, 0x29, - 0x0e, 0xd5, 0xfa, 0xcc, 0x1e, 0x20, 0x8d, 0x35, 0x2f, 0x28, 0x93, 0x57, 0xd7, 0xd1, 0x42, 0x40, - 0xa7, 0x48, 0x32, 0x0d, 0xbb, 0x86, 0x04, 0xbb, 0xde, 0xab, 0x6d, 0xbe, 0x29, 0xd2, 0xe7, 0xa3, - 0x5e, 0x16, 0xeb, 0x75, 0xb1, 0x7e, 0xb5, 0x73, 0xb5, 0x86, 0xde, 0xe0, 0x73, 0xbf, 0x7e, 0xc2, - 0xe5, 0x26, 0x46, 0x5e, 0xfe, 0x02, 0x00, 0x00, 0xff, 0xff, 0x16, 0x75, 0x92, 0x08, 0x1f, 0x01, - 0x00, 0x00, -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_json.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_json.go deleted file mode 100644 index f9d3a585a4c..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_json.go +++ /dev/null @@ -1,45 +0,0 @@ -package runtime - -import ( - "encoding/json" - "io" -) - -// JSONBuiltin is a Marshaler which marshals/unmarshals into/from JSON -// with the standard "encoding/json" package of Golang. -// Although it is generally faster for simple proto messages than JSONPb, -// it does not support advanced features of protobuf, e.g. map, oneof, .... -// -// The NewEncoder and NewDecoder types return *json.Encoder and -// *json.Decoder respectively. -type JSONBuiltin struct{} - -// ContentType always Returns "application/json". -func (*JSONBuiltin) ContentType() string { - return "application/json" -} - -// Marshal marshals "v" into JSON -func (j *JSONBuiltin) Marshal(v interface{}) ([]byte, error) { - return json.Marshal(v) -} - -// Unmarshal unmarshals JSON data into "v". -func (j *JSONBuiltin) Unmarshal(data []byte, v interface{}) error { - return json.Unmarshal(data, v) -} - -// NewDecoder returns a Decoder which reads JSON stream from "r". -func (j *JSONBuiltin) NewDecoder(r io.Reader) Decoder { - return json.NewDecoder(r) -} - -// NewEncoder returns an Encoder which writes JSON stream into "w". -func (j *JSONBuiltin) NewEncoder(w io.Writer) Encoder { - return json.NewEncoder(w) -} - -// Delimiter for newline encoded JSON streams. -func (j *JSONBuiltin) Delimiter() []byte { - return []byte("\n") -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_jsonpb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_jsonpb.go deleted file mode 100644 index f56072a6f15..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_jsonpb.go +++ /dev/null @@ -1,203 +0,0 @@ -package runtime - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "reflect" - - "github.com/golang/protobuf/jsonpb" - "github.com/golang/protobuf/proto" -) - -// JSONPb is a Marshaler which marshals/unmarshals into/from JSON -// with the "github.com/golang/protobuf/jsonpb". -// It supports fully functionality of protobuf unlike JSONBuiltin. -// -// The NewDecoder method returns a DecoderWrapper, so the underlying -// *json.Decoder methods can be used. -type JSONPb jsonpb.Marshaler - -// ContentType always returns "application/json". -func (*JSONPb) ContentType() string { - return "application/json" -} - -// Marshal marshals "v" into JSON. -func (j *JSONPb) Marshal(v interface{}) ([]byte, error) { - if _, ok := v.(proto.Message); !ok { - return j.marshalNonProtoField(v) - } - - var buf bytes.Buffer - if err := j.marshalTo(&buf, v); err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -func (j *JSONPb) marshalTo(w io.Writer, v interface{}) error { - p, ok := v.(proto.Message) - if !ok { - buf, err := j.marshalNonProtoField(v) - if err != nil { - return err - } - _, err = w.Write(buf) - return err - } - return (*jsonpb.Marshaler)(j).Marshal(w, p) -} - -// marshalNonProto marshals a non-message field of a protobuf message. -// This function does not correctly marshals arbitrary data structure into JSON, -// but it is only capable of marshaling non-message field values of protobuf, -// i.e. primitive types, enums; pointers to primitives or enums; maps from -// integer/string types to primitives/enums/pointers to messages. -func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) { - if v == nil { - return []byte("null"), nil - } - rv := reflect.ValueOf(v) - for rv.Kind() == reflect.Ptr { - if rv.IsNil() { - return []byte("null"), nil - } - rv = rv.Elem() - } - - if rv.Kind() == reflect.Map { - m := make(map[string]*json.RawMessage) - for _, k := range rv.MapKeys() { - buf, err := j.Marshal(rv.MapIndex(k).Interface()) - if err != nil { - return nil, err - } - m[fmt.Sprintf("%v", k.Interface())] = (*json.RawMessage)(&buf) - } - if j.Indent != "" { - return json.MarshalIndent(m, "", j.Indent) - } - return json.Marshal(m) - } - if enum, ok := rv.Interface().(protoEnum); ok && !j.EnumsAsInts { - return json.Marshal(enum.String()) - } - return json.Marshal(rv.Interface()) -} - -// Unmarshal unmarshals JSON "data" into "v" -func (j *JSONPb) Unmarshal(data []byte, v interface{}) error { - return unmarshalJSONPb(data, v) -} - -// NewDecoder returns a Decoder which reads JSON stream from "r". -func (j *JSONPb) NewDecoder(r io.Reader) Decoder { - d := json.NewDecoder(r) - return DecoderWrapper{Decoder: d} -} - -// DecoderWrapper is a wrapper around a *json.Decoder that adds -// support for protos to the Decode method. -type DecoderWrapper struct { - *json.Decoder -} - -// Decode wraps the embedded decoder's Decode method to support -// protos using a jsonpb.Unmarshaler. -func (d DecoderWrapper) Decode(v interface{}) error { - return decodeJSONPb(d.Decoder, v) -} - -// NewEncoder returns an Encoder which writes JSON stream into "w". -func (j *JSONPb) NewEncoder(w io.Writer) Encoder { - return EncoderFunc(func(v interface{}) error { return j.marshalTo(w, v) }) -} - -func unmarshalJSONPb(data []byte, v interface{}) error { - d := json.NewDecoder(bytes.NewReader(data)) - return decodeJSONPb(d, v) -} - -func decodeJSONPb(d *json.Decoder, v interface{}) error { - p, ok := v.(proto.Message) - if !ok { - return decodeNonProtoField(d, v) - } - unmarshaler := &jsonpb.Unmarshaler{AllowUnknownFields: true} - return unmarshaler.UnmarshalNext(d, p) -} - -func decodeNonProtoField(d *json.Decoder, v interface{}) error { - rv := reflect.ValueOf(v) - if rv.Kind() != reflect.Ptr { - return fmt.Errorf("%T is not a pointer", v) - } - for rv.Kind() == reflect.Ptr { - if rv.IsNil() { - rv.Set(reflect.New(rv.Type().Elem())) - } - if rv.Type().ConvertibleTo(typeProtoMessage) { - unmarshaler := &jsonpb.Unmarshaler{AllowUnknownFields: true} - return unmarshaler.UnmarshalNext(d, rv.Interface().(proto.Message)) - } - rv = rv.Elem() - } - if rv.Kind() == reflect.Map { - if rv.IsNil() { - rv.Set(reflect.MakeMap(rv.Type())) - } - conv, ok := convFromType[rv.Type().Key().Kind()] - if !ok { - return fmt.Errorf("unsupported type of map field key: %v", rv.Type().Key()) - } - - m := make(map[string]*json.RawMessage) - if err := d.Decode(&m); err != nil { - return err - } - for k, v := range m { - result := conv.Call([]reflect.Value{reflect.ValueOf(k)}) - if err := result[1].Interface(); err != nil { - return err.(error) - } - bk := result[0] - bv := reflect.New(rv.Type().Elem()) - if err := unmarshalJSONPb([]byte(*v), bv.Interface()); err != nil { - return err - } - rv.SetMapIndex(bk, bv.Elem()) - } - return nil - } - if _, ok := rv.Interface().(protoEnum); ok { - var repr interface{} - if err := d.Decode(&repr); err != nil { - return err - } - switch repr.(type) { - case string: - // TODO(yugui) Should use proto.StructProperties? - return fmt.Errorf("unmarshaling of symbolic enum %q not supported: %T", repr, rv.Interface()) - case float64: - rv.Set(reflect.ValueOf(int32(repr.(float64))).Convert(rv.Type())) - return nil - default: - return fmt.Errorf("cannot assign %#v into Go type %T", repr, rv.Interface()) - } - } - return d.Decode(v) -} - -type protoEnum interface { - fmt.Stringer - EnumDescriptor() ([]byte, []int) -} - -var typeProtoMessage = reflect.TypeOf((*proto.Message)(nil)).Elem() - -// Delimiter for newline encoded JSON streams. -func (j *JSONPb) Delimiter() []byte { - return []byte("\n") -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_proto.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_proto.go deleted file mode 100644 index f65d1a2676b..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_proto.go +++ /dev/null @@ -1,62 +0,0 @@ -package runtime - -import ( - "io" - - "errors" - "github.com/golang/protobuf/proto" - "io/ioutil" -) - -// ProtoMarshaller is a Marshaller which marshals/unmarshals into/from serialize proto bytes -type ProtoMarshaller struct{} - -// ContentType always returns "application/octet-stream". -func (*ProtoMarshaller) ContentType() string { - return "application/octet-stream" -} - -// Marshal marshals "value" into Proto -func (*ProtoMarshaller) Marshal(value interface{}) ([]byte, error) { - message, ok := value.(proto.Message) - if !ok { - return nil, errors.New("unable to marshal non proto field") - } - return proto.Marshal(message) -} - -// Unmarshal unmarshals proto "data" into "value" -func (*ProtoMarshaller) Unmarshal(data []byte, value interface{}) error { - message, ok := value.(proto.Message) - if !ok { - return errors.New("unable to unmarshal non proto field") - } - return proto.Unmarshal(data, message) -} - -// NewDecoder returns a Decoder which reads proto stream from "reader". -func (marshaller *ProtoMarshaller) NewDecoder(reader io.Reader) Decoder { - return DecoderFunc(func(value interface{}) error { - buffer, err := ioutil.ReadAll(reader) - if err != nil { - return err - } - return marshaller.Unmarshal(buffer, value) - }) -} - -// NewEncoder returns an Encoder which writes proto stream into "writer". -func (marshaller *ProtoMarshaller) NewEncoder(writer io.Writer) Encoder { - return EncoderFunc(func(value interface{}) error { - buffer, err := marshaller.Marshal(value) - if err != nil { - return err - } - _, err = writer.Write(buffer) - if err != nil { - return err - } - - return nil - }) -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler.go deleted file mode 100644 index 98fe6e88ac5..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler.go +++ /dev/null @@ -1,48 +0,0 @@ -package runtime - -import ( - "io" -) - -// Marshaler defines a conversion between byte sequence and gRPC payloads / fields. -type Marshaler interface { - // Marshal marshals "v" into byte sequence. - Marshal(v interface{}) ([]byte, error) - // Unmarshal unmarshals "data" into "v". - // "v" must be a pointer value. - Unmarshal(data []byte, v interface{}) error - // NewDecoder returns a Decoder which reads byte sequence from "r". - NewDecoder(r io.Reader) Decoder - // NewEncoder returns an Encoder which writes bytes sequence into "w". - NewEncoder(w io.Writer) Encoder - // ContentType returns the Content-Type which this marshaler is responsible for. - ContentType() string -} - -// Decoder decodes a byte sequence -type Decoder interface { - Decode(v interface{}) error -} - -// Encoder encodes gRPC payloads / fields into byte sequence. -type Encoder interface { - Encode(v interface{}) error -} - -// DecoderFunc adapts an decoder function into Decoder. -type DecoderFunc func(v interface{}) error - -// Decode delegates invocations to the underlying function itself. -func (f DecoderFunc) Decode(v interface{}) error { return f(v) } - -// EncoderFunc adapts an encoder function into Encoder -type EncoderFunc func(v interface{}) error - -// Encode delegates invocations to the underlying function itself. -func (f EncoderFunc) Encode(v interface{}) error { return f(v) } - -// Delimited defines the streaming delimiter. -type Delimited interface { - // Delimiter returns the record seperator for the stream. - Delimiter() []byte -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler_registry.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler_registry.go deleted file mode 100644 index 5cc53ae4f68..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler_registry.go +++ /dev/null @@ -1,91 +0,0 @@ -package runtime - -import ( - "errors" - "net/http" -) - -// MIMEWildcard is the fallback MIME type used for requests which do not match -// a registered MIME type. -const MIMEWildcard = "*" - -var ( - acceptHeader = http.CanonicalHeaderKey("Accept") - contentTypeHeader = http.CanonicalHeaderKey("Content-Type") - - defaultMarshaler = &JSONPb{OrigName: true} -) - -// MarshalerForRequest returns the inbound/outbound marshalers for this request. -// It checks the registry on the ServeMux for the MIME type set by the Content-Type header. -// If it isn't set (or the request Content-Type is empty), checks for "*". -// If there are multiple Content-Type headers set, choose the first one that it can -// exactly match in the registry. -// Otherwise, it follows the above logic for "*"/InboundMarshaler/OutboundMarshaler. -func MarshalerForRequest(mux *ServeMux, r *http.Request) (inbound Marshaler, outbound Marshaler) { - for _, acceptVal := range r.Header[acceptHeader] { - if m, ok := mux.marshalers.mimeMap[acceptVal]; ok { - outbound = m - break - } - } - - for _, contentTypeVal := range r.Header[contentTypeHeader] { - if m, ok := mux.marshalers.mimeMap[contentTypeVal]; ok { - inbound = m - break - } - } - - if inbound == nil { - inbound = mux.marshalers.mimeMap[MIMEWildcard] - } - if outbound == nil { - outbound = inbound - } - - return inbound, outbound -} - -// marshalerRegistry is a mapping from MIME types to Marshalers. -type marshalerRegistry struct { - mimeMap map[string]Marshaler -} - -// add adds a marshaler for a case-sensitive MIME type string ("*" to match any -// MIME type). -func (m marshalerRegistry) add(mime string, marshaler Marshaler) error { - if len(mime) == 0 { - return errors.New("empty MIME type") - } - - m.mimeMap[mime] = marshaler - - return nil -} - -// makeMarshalerMIMERegistry returns a new registry of marshalers. -// It allows for a mapping of case-sensitive Content-Type MIME type string to runtime.Marshaler interfaces. -// -// For example, you could allow the client to specify the use of the runtime.JSONPb marshaler -// with a "application/jsonpb" Content-Type and the use of the runtime.JSONBuiltin marshaler -// with a "application/json" Content-Type. -// "*" can be used to match any Content-Type. -// This can be attached to a ServerMux with the marshaler option. -func makeMarshalerMIMERegistry() marshalerRegistry { - return marshalerRegistry{ - mimeMap: map[string]Marshaler{ - MIMEWildcard: defaultMarshaler, - }, - } -} - -// WithMarshalerOption returns a ServeMuxOption which associates inbound and outbound -// Marshalers to a MIME type in mux. -func WithMarshalerOption(mime string, marshaler Marshaler) ServeMuxOption { - return func(mux *ServeMux) { - if err := mux.marshalers.add(mime, marshaler); err != nil { - panic(err) - } - } -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/mux.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/mux.go deleted file mode 100644 index 1d4c75760fe..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/mux.go +++ /dev/null @@ -1,260 +0,0 @@ -package runtime - -import ( - "fmt" - "net/http" - "net/textproto" - "strings" - - "context" - "github.com/golang/protobuf/proto" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// A HandlerFunc handles a specific pair of path pattern and HTTP method. -type HandlerFunc func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) - -// ServeMux is a request multiplexer for grpc-gateway. -// It matches http requests to patterns and invokes the corresponding handler. -type ServeMux struct { - // handlers maps HTTP method to a list of handlers. - handlers map[string][]handler - forwardResponseOptions []func(context.Context, http.ResponseWriter, proto.Message) error - marshalers marshalerRegistry - incomingHeaderMatcher HeaderMatcherFunc - outgoingHeaderMatcher HeaderMatcherFunc - metadataAnnotators []func(context.Context, *http.Request) metadata.MD - protoErrorHandler ProtoErrorHandlerFunc -} - -// ServeMuxOption is an option that can be given to a ServeMux on construction. -type ServeMuxOption func(*ServeMux) - -// WithForwardResponseOption returns a ServeMuxOption representing the forwardResponseOption. -// -// forwardResponseOption is an option that will be called on the relevant context.Context, -// http.ResponseWriter, and proto.Message before every forwarded response. -// -// The message may be nil in the case where just a header is being sent. -func WithForwardResponseOption(forwardResponseOption func(context.Context, http.ResponseWriter, proto.Message) error) ServeMuxOption { - return func(serveMux *ServeMux) { - serveMux.forwardResponseOptions = append(serveMux.forwardResponseOptions, forwardResponseOption) - } -} - -// HeaderMatcherFunc checks whether a header key should be forwarded to/from gRPC context. -type HeaderMatcherFunc func(string) (string, bool) - -// DefaultHeaderMatcher is used to pass http request headers to/from gRPC context. This adds permanent HTTP header -// keys (as specified by the IANA) to gRPC context with grpcgateway- prefix. HTTP headers that start with -// 'Grpc-Metadata-' are mapped to gRPC metadata after removing prefix 'Grpc-Metadata-'. -func DefaultHeaderMatcher(key string) (string, bool) { - key = textproto.CanonicalMIMEHeaderKey(key) - if isPermanentHTTPHeader(key) { - return MetadataPrefix + key, true - } else if strings.HasPrefix(key, MetadataHeaderPrefix) { - return key[len(MetadataHeaderPrefix):], true - } - return "", false -} - -// WithIncomingHeaderMatcher returns a ServeMuxOption representing a headerMatcher for incoming request to gateway. -// -// This matcher will be called with each header in http.Request. If matcher returns true, that header will be -// passed to gRPC context. To transform the header before passing to gRPC context, matcher should return modified header. -func WithIncomingHeaderMatcher(fn HeaderMatcherFunc) ServeMuxOption { - return func(mux *ServeMux) { - mux.incomingHeaderMatcher = fn - } -} - -// WithOutgoingHeaderMatcher returns a ServeMuxOption representing a headerMatcher for outgoing response from gateway. -// -// This matcher will be called with each header in response header metadata. If matcher returns true, that header will be -// passed to http response returned from gateway. To transform the header before passing to response, -// matcher should return modified header. -func WithOutgoingHeaderMatcher(fn HeaderMatcherFunc) ServeMuxOption { - return func(mux *ServeMux) { - mux.outgoingHeaderMatcher = fn - } -} - -// WithMetadata returns a ServeMuxOption for passing metadata to a gRPC context. -// -// This can be used by services that need to read from http.Request and modify gRPC context. A common use case -// is reading token from cookie and adding it in gRPC context. -func WithMetadata(annotator func(context.Context, *http.Request) metadata.MD) ServeMuxOption { - return func(serveMux *ServeMux) { - serveMux.metadataAnnotators = append(serveMux.metadataAnnotators, annotator) - } -} - -// WithProtoErrorHandler returns a ServeMuxOption for passing metadata to a gRPC context. -// -// This can be used to handle an error as general proto message defined by gRPC. -// The response including body and status is not backward compatible with the default error handler. -// When this option is used, HTTPError and OtherErrorHandler are overwritten on initialization. -func WithProtoErrorHandler(fn ProtoErrorHandlerFunc) ServeMuxOption { - return func(serveMux *ServeMux) { - serveMux.protoErrorHandler = fn - } -} - -// NewServeMux returns a new ServeMux whose internal mapping is empty. -func NewServeMux(opts ...ServeMuxOption) *ServeMux { - serveMux := &ServeMux{ - handlers: make(map[string][]handler), - forwardResponseOptions: make([]func(context.Context, http.ResponseWriter, proto.Message) error, 0), - marshalers: makeMarshalerMIMERegistry(), - } - - for _, opt := range opts { - opt(serveMux) - } - - if serveMux.protoErrorHandler != nil { - HTTPError = serveMux.protoErrorHandler - // OtherErrorHandler is no longer used when protoErrorHandler is set. - // Overwritten by a special error handler to return Unknown. - OtherErrorHandler = func(w http.ResponseWriter, r *http.Request, _ string, _ int) { - ctx := context.Background() - _, outboundMarshaler := MarshalerForRequest(serveMux, r) - sterr := status.Error(codes.Unknown, "unexpected use of OtherErrorHandler") - serveMux.protoErrorHandler(ctx, serveMux, outboundMarshaler, w, r, sterr) - } - } - - if serveMux.incomingHeaderMatcher == nil { - serveMux.incomingHeaderMatcher = DefaultHeaderMatcher - } - - if serveMux.outgoingHeaderMatcher == nil { - serveMux.outgoingHeaderMatcher = func(key string) (string, bool) { - return fmt.Sprintf("%s%s", MetadataHeaderPrefix, key), true - } - } - - return serveMux -} - -// Handle associates "h" to the pair of HTTP method and path pattern. -func (s *ServeMux) Handle(meth string, pat Pattern, h HandlerFunc) { - s.handlers[meth] = append(s.handlers[meth], handler{pat: pat, h: h}) -} - -// ServeHTTP dispatches the request to the first handler whose pattern matches to r.Method and r.Path. -func (s *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - path := r.URL.Path - if !strings.HasPrefix(path, "/") { - if s.protoErrorHandler != nil { - _, outboundMarshaler := MarshalerForRequest(s, r) - sterr := status.Error(codes.InvalidArgument, http.StatusText(http.StatusBadRequest)) - s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr) - } else { - OtherErrorHandler(w, r, http.StatusText(http.StatusBadRequest), http.StatusBadRequest) - } - return - } - - components := strings.Split(path[1:], "/") - l := len(components) - var verb string - if idx := strings.LastIndex(components[l-1], ":"); idx == 0 { - if s.protoErrorHandler != nil { - _, outboundMarshaler := MarshalerForRequest(s, r) - sterr := status.Error(codes.Unimplemented, http.StatusText(http.StatusNotImplemented)) - s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr) - } else { - OtherErrorHandler(w, r, http.StatusText(http.StatusNotFound), http.StatusNotFound) - } - return - } else if idx > 0 { - c := components[l-1] - components[l-1], verb = c[:idx], c[idx+1:] - } - - if override := r.Header.Get("X-HTTP-Method-Override"); override != "" && isPathLengthFallback(r) { - r.Method = strings.ToUpper(override) - if err := r.ParseForm(); err != nil { - if s.protoErrorHandler != nil { - _, outboundMarshaler := MarshalerForRequest(s, r) - sterr := status.Error(codes.InvalidArgument, err.Error()) - s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr) - } else { - OtherErrorHandler(w, r, err.Error(), http.StatusBadRequest) - } - return - } - } - for _, h := range s.handlers[r.Method] { - pathParams, err := h.pat.Match(components, verb) - if err != nil { - continue - } - h.h(w, r, pathParams) - return - } - - // lookup other methods to handle fallback from GET to POST and - // to determine if it is MethodNotAllowed or NotFound. - for m, handlers := range s.handlers { - if m == r.Method { - continue - } - for _, h := range handlers { - pathParams, err := h.pat.Match(components, verb) - if err != nil { - continue - } - // X-HTTP-Method-Override is optional. Always allow fallback to POST. - if isPathLengthFallback(r) { - if err := r.ParseForm(); err != nil { - if s.protoErrorHandler != nil { - _, outboundMarshaler := MarshalerForRequest(s, r) - sterr := status.Error(codes.InvalidArgument, err.Error()) - s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr) - } else { - OtherErrorHandler(w, r, err.Error(), http.StatusBadRequest) - } - return - } - h.h(w, r, pathParams) - return - } - if s.protoErrorHandler != nil { - _, outboundMarshaler := MarshalerForRequest(s, r) - sterr := status.Error(codes.Unimplemented, http.StatusText(http.StatusMethodNotAllowed)) - s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr) - } else { - OtherErrorHandler(w, r, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) - } - return - } - } - - if s.protoErrorHandler != nil { - _, outboundMarshaler := MarshalerForRequest(s, r) - sterr := status.Error(codes.Unimplemented, http.StatusText(http.StatusNotImplemented)) - s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr) - } else { - OtherErrorHandler(w, r, http.StatusText(http.StatusNotFound), http.StatusNotFound) - } -} - -// GetForwardResponseOptions returns the ForwardResponseOptions associated with this ServeMux. -func (s *ServeMux) GetForwardResponseOptions() []func(context.Context, http.ResponseWriter, proto.Message) error { - return s.forwardResponseOptions -} - -func isPathLengthFallback(r *http.Request) bool { - return r.Method == "POST" && r.Header.Get("Content-Type") == "application/x-www-form-urlencoded" -} - -type handler struct { - pat Pattern - h HandlerFunc -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/pattern.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/pattern.go deleted file mode 100644 index 8a9ec2cdae4..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/pattern.go +++ /dev/null @@ -1,227 +0,0 @@ -package runtime - -import ( - "errors" - "fmt" - "strings" - - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc/grpclog" -) - -var ( - // ErrNotMatch indicates that the given HTTP request path does not match to the pattern. - ErrNotMatch = errors.New("not match to the path pattern") - // ErrInvalidPattern indicates that the given definition of Pattern is not valid. - ErrInvalidPattern = errors.New("invalid pattern") -) - -type op struct { - code utilities.OpCode - operand int -} - -// Pattern is a template pattern of http request paths defined in github.com/googleapis/googleapis/google/api/http.proto. -type Pattern struct { - // ops is a list of operations - ops []op - // pool is a constant pool indexed by the operands or vars. - pool []string - // vars is a list of variables names to be bound by this pattern - vars []string - // stacksize is the max depth of the stack - stacksize int - // tailLen is the length of the fixed-size segments after a deep wildcard - tailLen int - // verb is the VERB part of the path pattern. It is empty if the pattern does not have VERB part. - verb string -} - -// NewPattern returns a new Pattern from the given definition values. -// "ops" is a sequence of op codes. "pool" is a constant pool. -// "verb" is the verb part of the pattern. It is empty if the pattern does not have the part. -// "version" must be 1 for now. -// It returns an error if the given definition is invalid. -func NewPattern(version int, ops []int, pool []string, verb string) (Pattern, error) { - if version != 1 { - grpclog.Printf("unsupported version: %d", version) - return Pattern{}, ErrInvalidPattern - } - - l := len(ops) - if l%2 != 0 { - grpclog.Printf("odd number of ops codes: %d", l) - return Pattern{}, ErrInvalidPattern - } - - var ( - typedOps []op - stack, maxstack int - tailLen int - pushMSeen bool - vars []string - ) - for i := 0; i < l; i += 2 { - op := op{code: utilities.OpCode(ops[i]), operand: ops[i+1]} - switch op.code { - case utilities.OpNop: - continue - case utilities.OpPush: - if pushMSeen { - tailLen++ - } - stack++ - case utilities.OpPushM: - if pushMSeen { - grpclog.Printf("pushM appears twice") - return Pattern{}, ErrInvalidPattern - } - pushMSeen = true - stack++ - case utilities.OpLitPush: - if op.operand < 0 || len(pool) <= op.operand { - grpclog.Printf("negative literal index: %d", op.operand) - return Pattern{}, ErrInvalidPattern - } - if pushMSeen { - tailLen++ - } - stack++ - case utilities.OpConcatN: - if op.operand <= 0 { - grpclog.Printf("negative concat size: %d", op.operand) - return Pattern{}, ErrInvalidPattern - } - stack -= op.operand - if stack < 0 { - grpclog.Print("stack underflow") - return Pattern{}, ErrInvalidPattern - } - stack++ - case utilities.OpCapture: - if op.operand < 0 || len(pool) <= op.operand { - grpclog.Printf("variable name index out of bound: %d", op.operand) - return Pattern{}, ErrInvalidPattern - } - v := pool[op.operand] - op.operand = len(vars) - vars = append(vars, v) - stack-- - if stack < 0 { - grpclog.Printf("stack underflow") - return Pattern{}, ErrInvalidPattern - } - default: - grpclog.Printf("invalid opcode: %d", op.code) - return Pattern{}, ErrInvalidPattern - } - - if maxstack < stack { - maxstack = stack - } - typedOps = append(typedOps, op) - } - return Pattern{ - ops: typedOps, - pool: pool, - vars: vars, - stacksize: maxstack, - tailLen: tailLen, - verb: verb, - }, nil -} - -// MustPattern is a helper function which makes it easier to call NewPattern in variable initialization. -func MustPattern(p Pattern, err error) Pattern { - if err != nil { - grpclog.Fatalf("Pattern initialization failed: %v", err) - } - return p -} - -// Match examines components if it matches to the Pattern. -// If it matches, the function returns a mapping from field paths to their captured values. -// If otherwise, the function returns an error. -func (p Pattern) Match(components []string, verb string) (map[string]string, error) { - if p.verb != verb { - return nil, ErrNotMatch - } - - var pos int - stack := make([]string, 0, p.stacksize) - captured := make([]string, len(p.vars)) - l := len(components) - for _, op := range p.ops { - switch op.code { - case utilities.OpNop: - continue - case utilities.OpPush, utilities.OpLitPush: - if pos >= l { - return nil, ErrNotMatch - } - c := components[pos] - if op.code == utilities.OpLitPush { - if lit := p.pool[op.operand]; c != lit { - return nil, ErrNotMatch - } - } - stack = append(stack, c) - pos++ - case utilities.OpPushM: - end := len(components) - if end < pos+p.tailLen { - return nil, ErrNotMatch - } - end -= p.tailLen - stack = append(stack, strings.Join(components[pos:end], "/")) - pos = end - case utilities.OpConcatN: - n := op.operand - l := len(stack) - n - stack = append(stack[:l], strings.Join(stack[l:], "/")) - case utilities.OpCapture: - n := len(stack) - 1 - captured[op.operand] = stack[n] - stack = stack[:n] - } - } - if pos < l { - return nil, ErrNotMatch - } - bindings := make(map[string]string) - for i, val := range captured { - bindings[p.vars[i]] = val - } - return bindings, nil -} - -// Verb returns the verb part of the Pattern. -func (p Pattern) Verb() string { return p.verb } - -func (p Pattern) String() string { - var stack []string - for _, op := range p.ops { - switch op.code { - case utilities.OpNop: - continue - case utilities.OpPush: - stack = append(stack, "*") - case utilities.OpLitPush: - stack = append(stack, p.pool[op.operand]) - case utilities.OpPushM: - stack = append(stack, "**") - case utilities.OpConcatN: - n := op.operand - l := len(stack) - n - stack = append(stack[:l], strings.Join(stack[l:], "/")) - case utilities.OpCapture: - n := len(stack) - 1 - stack[n] = fmt.Sprintf("{%s=%s}", p.vars[op.operand], stack[n]) - } - } - segs := strings.Join(stack, "/") - if p.verb != "" { - return fmt.Sprintf("/%s:%s", segs, p.verb) - } - return "/" + segs -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto2_convert.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto2_convert.go deleted file mode 100644 index a3151e2a552..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto2_convert.go +++ /dev/null @@ -1,80 +0,0 @@ -package runtime - -import ( - "github.com/golang/protobuf/proto" -) - -// StringP returns a pointer to a string whose pointee is same as the given string value. -func StringP(val string) (*string, error) { - return proto.String(val), nil -} - -// BoolP parses the given string representation of a boolean value, -// and returns a pointer to a bool whose value is same as the parsed value. -func BoolP(val string) (*bool, error) { - b, err := Bool(val) - if err != nil { - return nil, err - } - return proto.Bool(b), nil -} - -// Float64P parses the given string representation of a floating point number, -// and returns a pointer to a float64 whose value is same as the parsed number. -func Float64P(val string) (*float64, error) { - f, err := Float64(val) - if err != nil { - return nil, err - } - return proto.Float64(f), nil -} - -// Float32P parses the given string representation of a floating point number, -// and returns a pointer to a float32 whose value is same as the parsed number. -func Float32P(val string) (*float32, error) { - f, err := Float32(val) - if err != nil { - return nil, err - } - return proto.Float32(f), nil -} - -// Int64P parses the given string representation of an integer -// and returns a pointer to a int64 whose value is same as the parsed integer. -func Int64P(val string) (*int64, error) { - i, err := Int64(val) - if err != nil { - return nil, err - } - return proto.Int64(i), nil -} - -// Int32P parses the given string representation of an integer -// and returns a pointer to a int32 whose value is same as the parsed integer. -func Int32P(val string) (*int32, error) { - i, err := Int32(val) - if err != nil { - return nil, err - } - return proto.Int32(i), err -} - -// Uint64P parses the given string representation of an integer -// and returns a pointer to a uint64 whose value is same as the parsed integer. -func Uint64P(val string) (*uint64, error) { - i, err := Uint64(val) - if err != nil { - return nil, err - } - return proto.Uint64(i), err -} - -// Uint32P parses the given string representation of an integer -// and returns a pointer to a uint32 whose value is same as the parsed integer. -func Uint32P(val string) (*uint32, error) { - i, err := Uint32(val) - if err != nil { - return nil, err - } - return proto.Uint32(i), err -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto_errors.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto_errors.go deleted file mode 100644 index 059928c2847..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto_errors.go +++ /dev/null @@ -1,61 +0,0 @@ -package runtime - -import ( - "io" - "net/http" - - "context" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/status" -) - -// ProtoErrorHandlerFunc handles the error as a gRPC error generated via status package and replies to the request. -type ProtoErrorHandlerFunc func(context.Context, *ServeMux, Marshaler, http.ResponseWriter, *http.Request, error) - -var _ ProtoErrorHandlerFunc = DefaultHTTPProtoErrorHandler - -// DefaultHTTPProtoErrorHandler is an implementation of HTTPError. -// If "err" is an error from gRPC system, the function replies with the status code mapped by HTTPStatusFromCode. -// If otherwise, it replies with http.StatusInternalServerError. -// -// The response body returned by this function is a Status message marshaled by a Marshaler. -// -// Do not set this function to HTTPError variable directly, use WithProtoErrorHandler option instead. -func DefaultHTTPProtoErrorHandler(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, _ *http.Request, err error) { - // return Internal when Marshal failed - const fallback = `{"code": 13, "message": "failed to marshal error message"}` - - w.Header().Del("Trailer") - w.Header().Set("Content-Type", marshaler.ContentType()) - - s, ok := status.FromError(err) - if !ok { - s = status.New(codes.Unknown, err.Error()) - } - - buf, merr := marshaler.Marshal(s.Proto()) - if merr != nil { - grpclog.Printf("Failed to marshal error message %q: %v", s.Proto(), merr) - w.WriteHeader(http.StatusInternalServerError) - if _, err := io.WriteString(w, fallback); err != nil { - grpclog.Printf("Failed to write response: %v", err) - } - return - } - - md, ok := ServerMetadataFromContext(ctx) - if !ok { - grpclog.Printf("Failed to extract ServerMetadata from context") - } - - handleForwardResponseServerMetadata(w, mux, md) - handleForwardResponseTrailerHeader(w, md) - st := HTTPStatusFromCode(s.Code()) - w.WriteHeader(st) - if _, err := w.Write(buf); err != nil { - grpclog.Printf("Failed to write response: %v", err) - } - - handleForwardResponseTrailer(w, md) -} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/query.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/query.go deleted file mode 100644 index 07d0ff8c5bf..00000000000 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/query.go +++ /dev/null @@ -1,357 +0,0 @@ -package runtime - -import ( - "encoding/base64" - "fmt" - "net/url" - "reflect" - "regexp" - "strconv" - "strings" - "time" - - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc/grpclog" -) - -// PopulateQueryParameters populates "values" into "msg". -// A value is ignored if its key starts with one of the elements in "filter". -func PopulateQueryParameters(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error { - for key, values := range values { - re, err := regexp.Compile("^(.*)\\[(.*)\\]$") - if err != nil { - return err - } - match := re.FindStringSubmatch(key) - if len(match) == 3 { - key = match[1] - values = append([]string{match[2]}, values...) - } - fieldPath := strings.Split(key, ".") - if filter.HasCommonPrefix(fieldPath) { - continue - } - if err := populateFieldValueFromPath(msg, fieldPath, values); err != nil { - return err - } - } - return nil -} - -// PopulateFieldFromPath sets a value in a nested Protobuf structure. -// It instantiates missing protobuf fields as it goes. -func PopulateFieldFromPath(msg proto.Message, fieldPathString string, value string) error { - fieldPath := strings.Split(fieldPathString, ".") - return populateFieldValueFromPath(msg, fieldPath, []string{value}) -} - -func populateFieldValueFromPath(msg proto.Message, fieldPath []string, values []string) error { - m := reflect.ValueOf(msg) - if m.Kind() != reflect.Ptr { - return fmt.Errorf("unexpected type %T: %v", msg, msg) - } - var props *proto.Properties - m = m.Elem() - for i, fieldName := range fieldPath { - isLast := i == len(fieldPath)-1 - if !isLast && m.Kind() != reflect.Struct { - return fmt.Errorf("non-aggregate type in the mid of path: %s", strings.Join(fieldPath, ".")) - } - var f reflect.Value - var err error - f, props, err = fieldByProtoName(m, fieldName) - if err != nil { - return err - } else if !f.IsValid() { - grpclog.Printf("field not found in %T: %s", msg, strings.Join(fieldPath, ".")) - return nil - } - - switch f.Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, reflect.String, reflect.Uint32, reflect.Uint64: - if !isLast { - return fmt.Errorf("unexpected nested field %s in %s", fieldPath[i+1], strings.Join(fieldPath[:i+1], ".")) - } - m = f - case reflect.Slice: - if !isLast { - return fmt.Errorf("unexpected repeated field in %s", strings.Join(fieldPath, ".")) - } - // Handle []byte - if f.Type().Elem().Kind() == reflect.Uint8 { - m = f - break - } - return populateRepeatedField(f, values, props) - case reflect.Ptr: - if f.IsNil() { - m = reflect.New(f.Type().Elem()) - f.Set(m.Convert(f.Type())) - } - m = f.Elem() - continue - case reflect.Struct: - m = f - continue - case reflect.Map: - if !isLast { - return fmt.Errorf("unexpected nested field %s in %s", fieldPath[i+1], strings.Join(fieldPath[:i+1], ".")) - } - return populateMapField(f, values, props) - default: - return fmt.Errorf("unexpected type %s in %T", f.Type(), msg) - } - } - switch len(values) { - case 0: - return fmt.Errorf("no value of field: %s", strings.Join(fieldPath, ".")) - case 1: - default: - grpclog.Printf("too many field values: %s", strings.Join(fieldPath, ".")) - } - return populateField(m, values[0], props) -} - -// fieldByProtoName looks up a field whose corresponding protobuf field name is "name". -// "m" must be a struct value. It returns zero reflect.Value if no such field found. -func fieldByProtoName(m reflect.Value, name string) (reflect.Value, *proto.Properties, error) { - props := proto.GetProperties(m.Type()) - - // look up field name in oneof map - if op, ok := props.OneofTypes[name]; ok { - v := reflect.New(op.Type.Elem()) - field := m.Field(op.Field) - if !field.IsNil() { - return reflect.Value{}, nil, fmt.Errorf("field already set for %s oneof", props.Prop[op.Field].OrigName) - } - field.Set(v) - return v.Elem().Field(0), op.Prop, nil - } - - for _, p := range props.Prop { - if p.OrigName == name { - return m.FieldByName(p.Name), p, nil - } - if p.JSONName == name { - return m.FieldByName(p.Name), p, nil - } - } - return reflect.Value{}, nil, nil -} - -func populateMapField(f reflect.Value, values []string, props *proto.Properties) error { - if len(values) != 2 { - return fmt.Errorf("more than one value provided for key %s in map %s", values[0], props.Name) - } - - key, value := values[0], values[1] - keyType := f.Type().Key() - valueType := f.Type().Elem() - if f.IsNil() { - f.Set(reflect.MakeMap(f.Type())) - } - - keyConv, ok := convFromType[keyType.Kind()] - if !ok { - return fmt.Errorf("unsupported key type %s in map %s", keyType, props.Name) - } - valueConv, ok := convFromType[valueType.Kind()] - if !ok { - return fmt.Errorf("unsupported value type %s in map %s", valueType, props.Name) - } - - keyV := keyConv.Call([]reflect.Value{reflect.ValueOf(key)}) - if err := keyV[1].Interface(); err != nil { - return err.(error) - } - valueV := valueConv.Call([]reflect.Value{reflect.ValueOf(value)}) - if err := valueV[1].Interface(); err != nil { - return err.(error) - } - - f.SetMapIndex(keyV[0].Convert(keyType), valueV[0].Convert(valueType)) - - return nil -} - -func populateRepeatedField(f reflect.Value, values []string, props *proto.Properties) error { - elemType := f.Type().Elem() - - // is the destination field a slice of an enumeration type? - if enumValMap := proto.EnumValueMap(props.Enum); enumValMap != nil { - return populateFieldEnumRepeated(f, values, enumValMap) - } - - conv, ok := convFromType[elemType.Kind()] - if !ok { - return fmt.Errorf("unsupported field type %s", elemType) - } - f.Set(reflect.MakeSlice(f.Type(), len(values), len(values)).Convert(f.Type())) - for i, v := range values { - result := conv.Call([]reflect.Value{reflect.ValueOf(v)}) - if err := result[1].Interface(); err != nil { - return err.(error) - } - f.Index(i).Set(result[0].Convert(f.Index(i).Type())) - } - return nil -} - -func populateField(f reflect.Value, value string, props *proto.Properties) error { - i := f.Addr().Interface() - - // Handle protobuf well known types - type wkt interface { - XXX_WellKnownType() string - } - if wkt, ok := i.(wkt); ok { - switch wkt.XXX_WellKnownType() { - case "Timestamp": - if value == "null" { - f.Field(0).SetInt(0) - f.Field(1).SetInt(0) - return nil - } - - t, err := time.Parse(time.RFC3339Nano, value) - if err != nil { - return fmt.Errorf("bad Timestamp: %v", err) - } - f.Field(0).SetInt(int64(t.Unix())) - f.Field(1).SetInt(int64(t.Nanosecond())) - return nil - case "DoubleValue": - fallthrough - case "FloatValue": - float64Val, err := strconv.ParseFloat(value, 64) - if err != nil { - return fmt.Errorf("bad DoubleValue: %s", value) - } - f.Field(0).SetFloat(float64Val) - return nil - case "Int64Value": - fallthrough - case "Int32Value": - int64Val, err := strconv.ParseInt(value, 10, 64) - if err != nil { - return fmt.Errorf("bad DoubleValue: %s", value) - } - f.Field(0).SetInt(int64Val) - return nil - case "UInt64Value": - fallthrough - case "UInt32Value": - uint64Val, err := strconv.ParseUint(value, 10, 64) - if err != nil { - return fmt.Errorf("bad DoubleValue: %s", value) - } - f.Field(0).SetUint(uint64Val) - return nil - case "BoolValue": - if value == "true" { - f.Field(0).SetBool(true) - } else if value == "false" { - f.Field(0).SetBool(false) - } else { - return fmt.Errorf("bad BoolValue: %s", value) - } - return nil - case "StringValue": - f.Field(0).SetString(value) - return nil - case "BytesValue": - bytesVal, err := base64.StdEncoding.DecodeString(value) - if err != nil { - return fmt.Errorf("bad BytesValue: %s", value) - } - f.Field(0).SetBytes(bytesVal) - return nil - } - } - - // Handle google well known types - if gwkt, ok := i.(proto.Message); ok { - switch proto.MessageName(gwkt) { - case "google.protobuf.FieldMask": - p := f.Field(0) - for _, v := range strings.Split(value, ",") { - if v != "" { - p.Set(reflect.Append(p, reflect.ValueOf(v))) - } - } - return nil - } - } - - // is the destination field an enumeration type? - if enumValMap := proto.EnumValueMap(props.Enum); enumValMap != nil { - return populateFieldEnum(f, value, enumValMap) - } - - conv, ok := convFromType[f.Kind()] - if !ok { - return fmt.Errorf("unsupported field type %T", f) - } - result := conv.Call([]reflect.Value{reflect.ValueOf(value)}) - if err := result[1].Interface(); err != nil { - return err.(error) - } - f.Set(result[0].Convert(f.Type())) - return nil -} - -func convertEnum(value string, t reflect.Type, enumValMap map[string]int32) (reflect.Value, error) { - // see if it's an enumeration string - if enumVal, ok := enumValMap[value]; ok { - return reflect.ValueOf(enumVal).Convert(t), nil - } - - // check for an integer that matches an enumeration value - eVal, err := strconv.Atoi(value) - if err != nil { - return reflect.Value{}, fmt.Errorf("%s is not a valid %s", value, t) - } - for _, v := range enumValMap { - if v == int32(eVal) { - return reflect.ValueOf(eVal).Convert(t), nil - } - } - return reflect.Value{}, fmt.Errorf("%s is not a valid %s", value, t) -} - -func populateFieldEnum(f reflect.Value, value string, enumValMap map[string]int32) error { - cval, err := convertEnum(value, f.Type(), enumValMap) - if err != nil { - return err - } - f.Set(cval) - return nil -} - -func populateFieldEnumRepeated(f reflect.Value, values []string, enumValMap map[string]int32) error { - elemType := f.Type().Elem() - f.Set(reflect.MakeSlice(f.Type(), len(values), len(values)).Convert(f.Type())) - for i, v := range values { - result, err := convertEnum(v, elemType, enumValMap) - if err != nil { - return err - } - f.Index(i).Set(result) - } - return nil -} - -var ( - convFromType = map[reflect.Kind]reflect.Value{ - reflect.String: reflect.ValueOf(String), - reflect.Bool: reflect.ValueOf(Bool), - reflect.Float64: reflect.ValueOf(Float64), - reflect.Float32: reflect.ValueOf(Float32), - reflect.Int64: reflect.ValueOf(Int64), - reflect.Int32: reflect.ValueOf(Int32), - reflect.Uint64: reflect.ValueOf(Uint64), - reflect.Uint32: reflect.ValueOf(Uint32), - reflect.Slice: reflect.ValueOf(Bytes), - } -) diff --git a/vendor/github.com/hpcloud/tail/ratelimiter/memory.go b/vendor/github.com/hpcloud/tail/ratelimiter/memory.go index 8f6a5784a9a..bf3c2131b1e 100644 --- a/vendor/github.com/hpcloud/tail/ratelimiter/memory.go +++ b/vendor/github.com/hpcloud/tail/ratelimiter/memory.go @@ -5,7 +5,10 @@ import ( "time" ) -const GC_SIZE int = 100 +const ( + GC_SIZE int = 100 + GC_PERIOD time.Duration = 60 * time.Second +) type Memory struct { store map[string]LeakyBucket @@ -44,11 +47,10 @@ func (m *Memory) GarbageCollect() { now := time.Now() // rate limit GC to once per minute - if now.Add(60*time.Second).Unix() > m.lastGCCollected.Unix() { - + if now.Unix() >= m.lastGCCollected.Add(GC_PERIOD).Unix() { for key, bucket := range m.store { // if the bucket is drained, then GC - if bucket.DrainedAt().Unix() > now.Unix() { + if bucket.DrainedAt().Unix() < now.Unix() { delete(m.store, key) } } diff --git a/vendor/github.com/hpcloud/tail/tail.go b/vendor/github.com/hpcloud/tail/tail.go index 2d252d60572..c99cdaa2b70 100644 --- a/vendor/github.com/hpcloud/tail/tail.go +++ b/vendor/github.com/hpcloud/tail/tail.go @@ -22,7 +22,7 @@ import ( ) var ( - ErrStop = fmt.Errorf("tail should now stop") + ErrStop = errors.New("tail should now stop") ) type Line struct { @@ -250,7 +250,7 @@ func (tail *Tail) tailFileSync() { tail.openReader() - var offset int64 = 0 + var offset int64 var err error // Read line by line. @@ -273,10 +273,9 @@ func (tail *Tail) tailFileSync() { if cooloff { // Wait a second before seeking till the end of // file when rate limit is reached. - msg := fmt.Sprintf( - "Too much log activity; waiting a second " + - "before resuming tailing") - tail.Lines <- &Line{msg, time.Now(), fmt.Errorf(msg)} + msg := ("Too much log activity; waiting a second " + + "before resuming tailing") + tail.Lines <- &Line{msg, time.Now(), errors.New(msg)} select { case <-time.After(time.Second): case <-tail.Dying(): diff --git a/vendor/github.com/hpcloud/tail/watch/filechanges.go b/vendor/github.com/hpcloud/tail/watch/filechanges.go index 3ce5dcecbb2..f80aead9ad3 100644 --- a/vendor/github.com/hpcloud/tail/watch/filechanges.go +++ b/vendor/github.com/hpcloud/tail/watch/filechanges.go @@ -8,7 +8,7 @@ type FileChanges struct { func NewFileChanges() *FileChanges { return &FileChanges{ - make(chan bool), make(chan bool), make(chan bool)} + make(chan bool, 1), make(chan bool, 1), make(chan bool, 1)} } func (fc *FileChanges) NotifyModified() { diff --git a/vendor/github.com/hpcloud/tail/watch/inotify.go b/vendor/github.com/hpcloud/tail/watch/inotify.go index 4478f1e1a01..2bbfe0b606d 100644 --- a/vendor/github.com/hpcloud/tail/watch/inotify.go +++ b/vendor/github.com/hpcloud/tail/watch/inotify.go @@ -10,7 +10,7 @@ import ( "github.com/hpcloud/tail/util" - "gopkg.in/fsnotify.v1" + "gopkg.in/fsnotify/fsnotify.v1" "gopkg.in/tomb.v1" ) @@ -75,7 +75,6 @@ func (fw *InotifyFileWatcher) ChangeEvents(t *tomb.Tomb, pos int64) (*FileChange fw.Size = pos go func() { - defer RemoveWatch(fw.Filename) events := Events(fw.Filename) @@ -88,9 +87,11 @@ func (fw *InotifyFileWatcher) ChangeEvents(t *tomb.Tomb, pos int64) (*FileChange select { case evt, ok = <-events: if !ok { + RemoveWatch(fw.Filename) return } case <-t.Dying(): + RemoveWatch(fw.Filename) return } @@ -99,13 +100,19 @@ func (fw *InotifyFileWatcher) ChangeEvents(t *tomb.Tomb, pos int64) (*FileChange fallthrough case evt.Op&fsnotify.Rename == fsnotify.Rename: + RemoveWatch(fw.Filename) changes.NotifyDeleted() return + //With an open fd, unlink(fd) - inotify returns IN_ATTRIB (==fsnotify.Chmod) + case evt.Op&fsnotify.Chmod == fsnotify.Chmod: + fallthrough + case evt.Op&fsnotify.Write == fsnotify.Write: fi, err := os.Stat(fw.Filename) if err != nil { if os.IsNotExist(err) { + RemoveWatch(fw.Filename) changes.NotifyDeleted() return } diff --git a/vendor/github.com/hpcloud/tail/watch/inotify_tracker.go b/vendor/github.com/hpcloud/tail/watch/inotify_tracker.go index 03be4275ca2..739b3c2abf8 100644 --- a/vendor/github.com/hpcloud/tail/watch/inotify_tracker.go +++ b/vendor/github.com/hpcloud/tail/watch/inotify_tracker.go @@ -12,7 +12,7 @@ import ( "github.com/hpcloud/tail/util" - "gopkg.in/fsnotify.v1" + "gopkg.in/fsnotify/fsnotify.v1" ) type InotifyTracker struct { @@ -83,21 +83,21 @@ func watch(winfo *watchInfo) error { } // RemoveWatch signals the run goroutine to remove the watch for the input filename -func RemoveWatch(fname string) { - remove(&watchInfo{ +func RemoveWatch(fname string) error { + return remove(&watchInfo{ fname: fname, }) } // RemoveWatch create signals the run goroutine to remove the watch for the input filename -func RemoveWatchCreate(fname string) { - remove(&watchInfo{ +func RemoveWatchCreate(fname string) error { + return remove(&watchInfo{ op: fsnotify.Create, fname: fname, }) } -func remove(winfo *watchInfo) { +func remove(winfo *watchInfo) error { // start running the shared InotifyTracker if not already running once.Do(goRun) @@ -108,27 +108,10 @@ func remove(winfo *watchInfo) { delete(shared.done, winfo.fname) close(done) } - - fname := winfo.fname - if winfo.isCreate() { - // Watch for new files to be created in the parent directory. - fname = filepath.Dir(fname) - } - shared.watchNums[fname]-- - watchNum := shared.watchNums[fname] - if watchNum == 0 { - delete(shared.watchNums, fname) - } shared.mux.Unlock() - // If we were the last ones to watch this file, unsubscribe from inotify. - // This needs to happen after releasing the lock because fsnotify waits - // synchronously for the kernel to acknowledge the removal of the watch - // for this file, which causes us to deadlock if we still held the lock. - if watchNum == 0 { - shared.watcher.Remove(fname) - } shared.remove <- winfo + return <-shared.error } // Events returns a channel to which FileEvents corresponding to the input filename @@ -142,8 +125,8 @@ func Events(fname string) <-chan fsnotify.Event { } // Cleanup removes the watch for the input filename if necessary. -func Cleanup(fname string) { - RemoveWatch(fname) +func Cleanup(fname string) error { + return RemoveWatch(fname) } // watchFlags calls fsnotify.WatchFlags for the input filename and flags, creating @@ -154,6 +137,8 @@ func (shared *InotifyTracker) addWatch(winfo *watchInfo) error { if shared.chans[winfo.fname] == nil { shared.chans[winfo.fname] = make(chan fsnotify.Event) + } + if shared.done[winfo.fname] == nil { shared.done[winfo.fname] = make(chan bool) } @@ -163,47 +148,50 @@ func (shared *InotifyTracker) addWatch(winfo *watchInfo) error { fname = filepath.Dir(fname) } + var err error // already in inotify watch - if shared.watchNums[fname] > 0 { - shared.watchNums[fname]++ - if winfo.isCreate() { - shared.watchNums[winfo.fname]++ - } - return nil + if shared.watchNums[fname] == 0 { + err = shared.watcher.Add(fname) } - - err := shared.watcher.Add(fname) if err == nil { shared.watchNums[fname]++ - if winfo.isCreate() { - shared.watchNums[winfo.fname]++ - } } return err } // removeWatch calls fsnotify.RemoveWatch for the input filename and closes the // corresponding events channel. -func (shared *InotifyTracker) removeWatch(winfo *watchInfo) { +func (shared *InotifyTracker) removeWatch(winfo *watchInfo) error { shared.mux.Lock() - defer shared.mux.Unlock() ch := shared.chans[winfo.fname] - if ch == nil { - return + if ch != nil { + delete(shared.chans, winfo.fname) + close(ch) } - delete(shared.chans, winfo.fname) - close(ch) - - if !winfo.isCreate() { - return + fname := winfo.fname + if winfo.isCreate() { + // Watch for new files to be created in the parent directory. + fname = filepath.Dir(fname) } + shared.watchNums[fname]-- + watchNum := shared.watchNums[fname] + if watchNum == 0 { + delete(shared.watchNums, fname) + } + shared.mux.Unlock() - shared.watchNums[winfo.fname]-- - if shared.watchNums[winfo.fname] == 0 { - delete(shared.watchNums, winfo.fname) + var err error + // If we were the last ones to watch this file, unsubscribe from inotify. + // This needs to happen after releasing the lock because fsnotify waits + // synchronously for the kernel to acknowledge the removal of the watch + // for this file, which causes us to deadlock if we still held the lock. + if watchNum == 0 { + err = shared.watcher.Remove(fname) } + + return err } // sendEvent sends the input event to the appropriate Tail. @@ -238,7 +226,7 @@ func (shared *InotifyTracker) run() { shared.error <- shared.addWatch(winfo) case winfo := <-shared.remove: - shared.removeWatch(winfo) + shared.error <- shared.removeWatch(winfo) case event, open := <-shared.watcher.Events: if !open { diff --git a/vendor/github.com/inconshreveable/mousetrap/LICENSE b/vendor/github.com/inconshreveable/mousetrap/LICENSE deleted file mode 100644 index 5f0d1fb6a7b..00000000000 --- a/vendor/github.com/inconshreveable/mousetrap/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2014 Alan Shreve - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/vendor/github.com/inconshreveable/mousetrap/trap_others.go b/vendor/github.com/inconshreveable/mousetrap/trap_others.go deleted file mode 100644 index 9d2d8a4bab9..00000000000 --- a/vendor/github.com/inconshreveable/mousetrap/trap_others.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build !windows - -package mousetrap - -// StartedByExplorer returns true if the program was invoked by the user -// double-clicking on the executable from explorer.exe -// -// It is conservative and returns false if any of the internal calls fail. -// It does not guarantee that the program was run from a terminal. It only can tell you -// whether it was launched from explorer.exe -// -// On non-Windows platforms, it always returns false. -func StartedByExplorer() bool { - return false -} diff --git a/vendor/github.com/inconshreveable/mousetrap/trap_windows.go b/vendor/github.com/inconshreveable/mousetrap/trap_windows.go deleted file mode 100644 index 336142a5e3e..00000000000 --- a/vendor/github.com/inconshreveable/mousetrap/trap_windows.go +++ /dev/null @@ -1,98 +0,0 @@ -// +build windows -// +build !go1.4 - -package mousetrap - -import ( - "fmt" - "os" - "syscall" - "unsafe" -) - -const ( - // defined by the Win32 API - th32cs_snapprocess uintptr = 0x2 -) - -var ( - kernel = syscall.MustLoadDLL("kernel32.dll") - CreateToolhelp32Snapshot = kernel.MustFindProc("CreateToolhelp32Snapshot") - Process32First = kernel.MustFindProc("Process32FirstW") - Process32Next = kernel.MustFindProc("Process32NextW") -) - -// ProcessEntry32 structure defined by the Win32 API -type processEntry32 struct { - dwSize uint32 - cntUsage uint32 - th32ProcessID uint32 - th32DefaultHeapID int - th32ModuleID uint32 - cntThreads uint32 - th32ParentProcessID uint32 - pcPriClassBase int32 - dwFlags uint32 - szExeFile [syscall.MAX_PATH]uint16 -} - -func getProcessEntry(pid int) (pe *processEntry32, err error) { - snapshot, _, e1 := CreateToolhelp32Snapshot.Call(th32cs_snapprocess, uintptr(0)) - if snapshot == uintptr(syscall.InvalidHandle) { - err = fmt.Errorf("CreateToolhelp32Snapshot: %v", e1) - return - } - defer syscall.CloseHandle(syscall.Handle(snapshot)) - - var processEntry processEntry32 - processEntry.dwSize = uint32(unsafe.Sizeof(processEntry)) - ok, _, e1 := Process32First.Call(snapshot, uintptr(unsafe.Pointer(&processEntry))) - if ok == 0 { - err = fmt.Errorf("Process32First: %v", e1) - return - } - - for { - if processEntry.th32ProcessID == uint32(pid) { - pe = &processEntry - return - } - - ok, _, e1 = Process32Next.Call(snapshot, uintptr(unsafe.Pointer(&processEntry))) - if ok == 0 { - err = fmt.Errorf("Process32Next: %v", e1) - return - } - } -} - -func getppid() (pid int, err error) { - pe, err := getProcessEntry(os.Getpid()) - if err != nil { - return - } - - pid = int(pe.th32ParentProcessID) - return -} - -// StartedByExplorer returns true if the program was invoked by the user double-clicking -// on the executable from explorer.exe -// -// It is conservative and returns false if any of the internal calls fail. -// It does not guarantee that the program was run from a terminal. It only can tell you -// whether it was launched from explorer.exe -func StartedByExplorer() bool { - ppid, err := getppid() - if err != nil { - return false - } - - pe, err := getProcessEntry(ppid) - if err != nil { - return false - } - - name := syscall.UTF16ToString(pe.szExeFile[:]) - return name == "explorer.exe" -} diff --git a/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go b/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go deleted file mode 100644 index 9a28e57c3c3..00000000000 --- a/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go +++ /dev/null @@ -1,46 +0,0 @@ -// +build windows -// +build go1.4 - -package mousetrap - -import ( - "os" - "syscall" - "unsafe" -) - -func getProcessEntry(pid int) (*syscall.ProcessEntry32, error) { - snapshot, err := syscall.CreateToolhelp32Snapshot(syscall.TH32CS_SNAPPROCESS, 0) - if err != nil { - return nil, err - } - defer syscall.CloseHandle(snapshot) - var procEntry syscall.ProcessEntry32 - procEntry.Size = uint32(unsafe.Sizeof(procEntry)) - if err = syscall.Process32First(snapshot, &procEntry); err != nil { - return nil, err - } - for { - if procEntry.ProcessID == uint32(pid) { - return &procEntry, nil - } - err = syscall.Process32Next(snapshot, &procEntry) - if err != nil { - return nil, err - } - } -} - -// StartedByExplorer returns true if the program was invoked by the user double-clicking -// on the executable from explorer.exe -// -// It is conservative and returns false if any of the internal calls fail. -// It does not guarantee that the program was run from a terminal. It only can tell you -// whether it was launched from explorer.exe -func StartedByExplorer() bool { - pe, err := getProcessEntry(os.Getppid()) - if err != nil { - return false - } - return "explorer.exe" == syscall.UTF16ToString(pe.ExeFile[:]) -} diff --git a/vendor/github.com/joho/godotenv/LICENCE b/vendor/github.com/joho/godotenv/LICENCE deleted file mode 100644 index e7ddd51be90..00000000000 --- a/vendor/github.com/joho/godotenv/LICENCE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2013 John Barton - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/vendor/github.com/joho/godotenv/godotenv.go b/vendor/github.com/joho/godotenv/godotenv.go deleted file mode 100644 index 29b436c77c0..00000000000 --- a/vendor/github.com/joho/godotenv/godotenv.go +++ /dev/null @@ -1,346 +0,0 @@ -// Package godotenv is a go port of the ruby dotenv library (https://github.com/bkeepers/dotenv) -// -// Examples/readme can be found on the github page at https://github.com/joho/godotenv -// -// The TL;DR is that you make a .env file that looks something like -// -// SOME_ENV_VAR=somevalue -// -// and then in your go code you can call -// -// godotenv.Load() -// -// and all the env vars declared in .env will be available through os.Getenv("SOME_ENV_VAR") -package godotenv - -import ( - "bufio" - "errors" - "fmt" - "io" - "os" - "os/exec" - "regexp" - "sort" - "strings" -) - -const doubleQuoteSpecialChars = "\\\n\r\"!$`" - -// Load will read your env file(s) and load them into ENV for this process. -// -// Call this function as close as possible to the start of your program (ideally in main) -// -// If you call Load without any args it will default to loading .env in the current path -// -// You can otherwise tell it which files to load (there can be more than one) like -// -// godotenv.Load("fileone", "filetwo") -// -// It's important to note that it WILL NOT OVERRIDE an env variable that already exists - consider the .env file to set dev vars or sensible defaults -func Load(filenames ...string) (err error) { - filenames = filenamesOrDefault(filenames) - - for _, filename := range filenames { - err = loadFile(filename, false) - if err != nil { - return // return early on a spazout - } - } - return -} - -// Overload will read your env file(s) and load them into ENV for this process. -// -// Call this function as close as possible to the start of your program (ideally in main) -// -// If you call Overload without any args it will default to loading .env in the current path -// -// You can otherwise tell it which files to load (there can be more than one) like -// -// godotenv.Overload("fileone", "filetwo") -// -// It's important to note this WILL OVERRIDE an env variable that already exists - consider the .env file to forcefilly set all vars. -func Overload(filenames ...string) (err error) { - filenames = filenamesOrDefault(filenames) - - for _, filename := range filenames { - err = loadFile(filename, true) - if err != nil { - return // return early on a spazout - } - } - return -} - -// Read all env (with same file loading semantics as Load) but return values as -// a map rather than automatically writing values into env -func Read(filenames ...string) (envMap map[string]string, err error) { - filenames = filenamesOrDefault(filenames) - envMap = make(map[string]string) - - for _, filename := range filenames { - individualEnvMap, individualErr := readFile(filename) - - if individualErr != nil { - err = individualErr - return // return early on a spazout - } - - for key, value := range individualEnvMap { - envMap[key] = value - } - } - - return -} - -// Parse reads an env file from io.Reader, returning a map of keys and values. -func Parse(r io.Reader) (envMap map[string]string, err error) { - envMap = make(map[string]string) - - var lines []string - scanner := bufio.NewScanner(r) - for scanner.Scan() { - lines = append(lines, scanner.Text()) - } - - if err = scanner.Err(); err != nil { - return - } - - for _, fullLine := range lines { - if !isIgnoredLine(fullLine) { - var key, value string - key, value, err = parseLine(fullLine, envMap) - - if err != nil { - return - } - envMap[key] = value - } - } - return -} - -//Unmarshal reads an env file from a string, returning a map of keys and values. -func Unmarshal(str string) (envMap map[string]string, err error) { - return Parse(strings.NewReader(str)) -} - -// Exec loads env vars from the specified filenames (empty map falls back to default) -// then executes the cmd specified. -// -// Simply hooks up os.Stdin/err/out to the command and calls Run() -// -// If you want more fine grained control over your command it's recommended -// that you use `Load()` or `Read()` and the `os/exec` package yourself. -func Exec(filenames []string, cmd string, cmdArgs []string) error { - Load(filenames...) - - command := exec.Command(cmd, cmdArgs...) - command.Stdin = os.Stdin - command.Stdout = os.Stdout - command.Stderr = os.Stderr - return command.Run() -} - -// Write serializes the given environment and writes it to a file -func Write(envMap map[string]string, filename string) error { - content, error := Marshal(envMap) - if error != nil { - return error - } - file, error := os.Create(filename) - if error != nil { - return error - } - _, err := file.WriteString(content) - return err -} - -// Marshal outputs the given environment as a dotenv-formatted environment file. -// Each line is in the format: KEY="VALUE" where VALUE is backslash-escaped. -func Marshal(envMap map[string]string) (string, error) { - lines := make([]string, 0, len(envMap)) - for k, v := range envMap { - lines = append(lines, fmt.Sprintf(`%s="%s"`, k, doubleQuoteEscape(v))) - } - sort.Strings(lines) - return strings.Join(lines, "\n"), nil -} - -func filenamesOrDefault(filenames []string) []string { - if len(filenames) == 0 { - return []string{".env"} - } - return filenames -} - -func loadFile(filename string, overload bool) error { - envMap, err := readFile(filename) - if err != nil { - return err - } - - currentEnv := map[string]bool{} - rawEnv := os.Environ() - for _, rawEnvLine := range rawEnv { - key := strings.Split(rawEnvLine, "=")[0] - currentEnv[key] = true - } - - for key, value := range envMap { - if !currentEnv[key] || overload { - os.Setenv(key, value) - } - } - - return nil -} - -func readFile(filename string) (envMap map[string]string, err error) { - file, err := os.Open(filename) - if err != nil { - return - } - defer file.Close() - - return Parse(file) -} - -func parseLine(line string, envMap map[string]string) (key string, value string, err error) { - if len(line) == 0 { - err = errors.New("zero length string") - return - } - - // ditch the comments (but keep quoted hashes) - if strings.Contains(line, "#") { - segmentsBetweenHashes := strings.Split(line, "#") - quotesAreOpen := false - var segmentsToKeep []string - for _, segment := range segmentsBetweenHashes { - if strings.Count(segment, "\"") == 1 || strings.Count(segment, "'") == 1 { - if quotesAreOpen { - quotesAreOpen = false - segmentsToKeep = append(segmentsToKeep, segment) - } else { - quotesAreOpen = true - } - } - - if len(segmentsToKeep) == 0 || quotesAreOpen { - segmentsToKeep = append(segmentsToKeep, segment) - } - } - - line = strings.Join(segmentsToKeep, "#") - } - - firstEquals := strings.Index(line, "=") - firstColon := strings.Index(line, ":") - splitString := strings.SplitN(line, "=", 2) - if firstColon != -1 && (firstColon < firstEquals || firstEquals == -1) { - //this is a yaml-style line - splitString = strings.SplitN(line, ":", 2) - } - - if len(splitString) != 2 { - err = errors.New("Can't separate key from value") - return - } - - // Parse the key - key = splitString[0] - if strings.HasPrefix(key, "export") { - key = strings.TrimPrefix(key, "export") - } - key = strings.Trim(key, " ") - - // Parse the value - value = parseValue(splitString[1], envMap) - return -} - -func parseValue(value string, envMap map[string]string) string { - - // trim - value = strings.Trim(value, " ") - - // check if we've got quoted values or possible escapes - if len(value) > 1 { - rs := regexp.MustCompile(`\A'(.*)'\z`) - singleQuotes := rs.FindStringSubmatch(value) - - rd := regexp.MustCompile(`\A"(.*)"\z`) - doubleQuotes := rd.FindStringSubmatch(value) - - if singleQuotes != nil || doubleQuotes != nil { - // pull the quotes off the edges - value = value[1 : len(value)-1] - } - - if doubleQuotes != nil { - // expand newlines - escapeRegex := regexp.MustCompile(`\\.`) - value = escapeRegex.ReplaceAllStringFunc(value, func(match string) string { - c := strings.TrimPrefix(match, `\`) - switch c { - case "n": - return "\n" - case "r": - return "\r" - default: - return match - } - }) - // unescape characters - e := regexp.MustCompile(`\\([^$])`) - value = e.ReplaceAllString(value, "$1") - } - - if singleQuotes == nil { - value = expandVariables(value, envMap) - } - } - - return value -} - -func expandVariables(v string, m map[string]string) string { - r := regexp.MustCompile(`(\\)?(\$)(\()?\{?([A-Z0-9_]+)?\}?`) - - return r.ReplaceAllStringFunc(v, func(s string) string { - submatch := r.FindStringSubmatch(s) - - if submatch == nil { - return s - } - if submatch[1] == "\\" || submatch[2] == "(" { - return submatch[0][1:] - } else if submatch[4] != "" { - return m[submatch[4]] - } - return s - }) -} - -func isIgnoredLine(line string) bool { - trimmedLine := strings.Trim(line, " \n\t") - return len(trimmedLine) == 0 || strings.HasPrefix(trimmedLine, "#") -} - -func doubleQuoteEscape(line string) string { - for _, c := range doubleQuoteSpecialChars { - toReplace := "\\" + string(c) - if c == '\n' { - toReplace = `\n` - } - if c == '\r' { - toReplace = `\r` - } - line = strings.Replace(line, string(c), toReplace, -1) - } - return line -} diff --git a/vendor/github.com/markbates/inflect/LICENCE b/vendor/github.com/markbates/inflect/LICENCE deleted file mode 100644 index 8a36b944a5e..00000000000 --- a/vendor/github.com/markbates/inflect/LICENCE +++ /dev/null @@ -1,7 +0,0 @@ -Copyright (c) 2011 Chris Farmiloe - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/markbates/inflect/helpers.go b/vendor/github.com/markbates/inflect/helpers.go deleted file mode 100644 index 24050c70a04..00000000000 --- a/vendor/github.com/markbates/inflect/helpers.go +++ /dev/null @@ -1,19 +0,0 @@ -package inflect - -//Helpers is a map of the helper names with its corresponding inflect function -var Helpers = map[string]interface{}{ - "asciffy": Asciify, - "camelize": Camelize, - "camelize_down_first": CamelizeDownFirst, - "capitalize": Capitalize, - "dasherize": Dasherize, - "humanize": Humanize, - "ordinalize": Ordinalize, - "parameterize": Parameterize, - "pluralize": Pluralize, - "pluralize_with_size": PluralizeWithSize, - "singularize": Singularize, - "tableize": Tableize, - "typeify": Typeify, - "underscore": Underscore, -} diff --git a/vendor/github.com/markbates/inflect/inflect.go b/vendor/github.com/markbates/inflect/inflect.go deleted file mode 100644 index 9b6776c191c..00000000000 --- a/vendor/github.com/markbates/inflect/inflect.go +++ /dev/null @@ -1,892 +0,0 @@ -package inflect - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "regexp" - "strconv" - "strings" - "unicode" - "unicode/utf8" -) - -// baseAcronyms comes from https://en.wikipedia.org/wiki/List_of_information_technology_acronymss -const baseAcronyms = `JSON,JWT,ID,UUID,SQL,ACK,ACL,ADSL,AES,ANSI,API,ARP,ATM,BGP,BSS,CAT,CCITT,CHAP,CIDR,CIR,CLI,CPE,CPU,CRC,CRT,CSMA,CMOS,DCE,DEC,DES,DHCP,DNS,DRAM,DSL,DSLAM,DTE,DMI,EHA,EIA,EIGRP,EOF,ESS,FCC,FCS,FDDI,FTP,GBIC,gbps,GEPOF,HDLC,HTTP,HTTPS,IANA,ICMP,IDF,IDS,IEEE,IETF,IMAP,IP,IPS,ISDN,ISP,kbps,LACP,LAN,LAPB,LAPF,LLC,MAC,MAN,Mbps,MC,MDF,MIB,MoCA,MPLS,MTU,NAC,NAT,NBMA,NIC,NRZ,NRZI,NVRAM,OSI,OSPF,OUI,PAP,PAT,PC,PIM,PIM,PCM,PDU,POP3,POP,POTS,PPP,PPTP,PTT,PVST,RADIUS,RAM,RARP,RFC,RIP,RLL,ROM,RSTP,RTP,RCP,SDLC,SFD,SFP,SLARP,SLIP,SMTP,SNA,SNAP,SNMP,SOF,SRAM,SSH,SSID,STP,SYN,TDM,TFTP,TIA,TOFU,UDP,URL,URI,USB,UTP,VC,VLAN,VLSM,VPN,W3C,WAN,WEP,WiFi,WPA,WWW` - -// Rule used by rulesets -type Rule struct { - suffix string - replacement string - exact bool -} - -// Ruleset a Ruleset is the config of pluralization rules -// you can extend the rules with the Add* methods -type Ruleset struct { - uncountables map[string]bool - plurals []*Rule - singulars []*Rule - humans []*Rule - acronyms []*Rule -} - -// NewRuleset creates a blank ruleset. Unless you are going to -// build your own rules from scratch you probably -// won't need this and can just use the defaultRuleset -// via the global inflect.* methods -func NewRuleset() *Ruleset { - rs := new(Ruleset) - rs.uncountables = make(map[string]bool) - rs.plurals = make([]*Rule, 0) - rs.singulars = make([]*Rule, 0) - rs.humans = make([]*Rule, 0) - rs.acronyms = make([]*Rule, 0) - return rs -} - -// NewDefaultRuleset creates a new ruleset and load it with the default -// set of common English pluralization rules -func NewDefaultRuleset() *Ruleset { - rs := NewRuleset() - rs.AddPlural("movie", "movies") - rs.AddPlural("s", "s") - rs.AddPlural("testis", "testes") - rs.AddPlural("axis", "axes") - rs.AddPlural("octopus", "octopi") - rs.AddPlural("virus", "viri") - rs.AddPlural("octopi", "octopi") - rs.AddPlural("viri", "viri") - rs.AddPlural("alias", "aliases") - rs.AddPlural("status", "statuses") - rs.AddPlural("Status", "Statuses") - rs.AddPlural("campus", "campuses") - rs.AddPlural("bus", "buses") - rs.AddPlural("buffalo", "buffaloes") - rs.AddPlural("tomato", "tomatoes") - rs.AddPlural("tum", "ta") - rs.AddPlural("ium", "ia") - rs.AddPlural("ta", "ta") - rs.AddPlural("ia", "ia") - rs.AddPlural("sis", "ses") - rs.AddPlural("lf", "lves") - rs.AddPlural("rf", "rves") - rs.AddPlural("afe", "aves") - rs.AddPlural("bfe", "bves") - rs.AddPlural("cfe", "cves") - rs.AddPlural("dfe", "dves") - rs.AddPlural("efe", "eves") - rs.AddPlural("gfe", "gves") - rs.AddPlural("hfe", "hves") - rs.AddPlural("ife", "ives") - rs.AddPlural("jfe", "jves") - rs.AddPlural("kfe", "kves") - rs.AddPlural("lfe", "lves") - rs.AddPlural("mfe", "mves") - rs.AddPlural("nfe", "nves") - rs.AddPlural("ofe", "oves") - rs.AddPlural("pfe", "pves") - rs.AddPlural("qfe", "qves") - rs.AddPlural("rfe", "rves") - rs.AddPlural("sfe", "sves") - rs.AddPlural("tfe", "tves") - rs.AddPlural("ufe", "uves") - rs.AddPlural("vfe", "vves") - rs.AddPlural("wfe", "wves") - rs.AddPlural("xfe", "xves") - rs.AddPlural("yfe", "yves") - rs.AddPlural("zfe", "zves") - rs.AddPlural("hive", "hives") - rs.AddPlural("quy", "quies") - rs.AddPlural("by", "bies") - rs.AddPlural("cy", "cies") - rs.AddPlural("dy", "dies") - rs.AddPlural("fy", "fies") - rs.AddPlural("gy", "gies") - rs.AddPlural("hy", "hies") - rs.AddPlural("jy", "jies") - rs.AddPlural("ky", "kies") - rs.AddPlural("ly", "lies") - rs.AddPlural("my", "mies") - rs.AddPlural("ny", "nies") - rs.AddPlural("py", "pies") - rs.AddPlural("qy", "qies") - rs.AddPlural("ry", "ries") - rs.AddPlural("sy", "sies") - rs.AddPlural("ty", "ties") - rs.AddPlural("vy", "vies") - rs.AddPlural("wy", "wies") - rs.AddPlural("xy", "xies") - rs.AddPlural("zy", "zies") - rs.AddPlural("x", "xes") - rs.AddPlural("ch", "ches") - rs.AddPlural("ss", "sses") - rs.AddPlural("sh", "shes") - rs.AddPlural("matrix", "matrices") - rs.AddPlural("vertix", "vertices") - rs.AddPlural("indix", "indices") - rs.AddPlural("matrex", "matrices") - rs.AddPlural("vertex", "vertices") - rs.AddPlural("index", "indices") - rs.AddPlural("mouse", "mice") - rs.AddPlural("louse", "lice") - rs.AddPlural("mice", "mice") - rs.AddPlural("lice", "lice") - rs.AddPlural("ress", "resses") - rs.AddPluralExact("ox", "oxen", true) - rs.AddPluralExact("oxen", "oxen", true) - rs.AddPluralExact("quiz", "quizzes", true) - rs.AddSingular("s", "") - rs.AddSingular("ss", "ss") - rs.AddSingular("news", "news") - rs.AddSingular("ta", "tum") - rs.AddSingular("ia", "ium") - rs.AddSingular("analyses", "analysis") - rs.AddSingular("bases", "basis") - rs.AddSingularExact("basis", "basis", true) - rs.AddSingular("diagnoses", "diagnosis") - rs.AddSingularExact("diagnosis", "diagnosis", true) - rs.AddSingular("parentheses", "parenthesis") - rs.AddSingular("prognoses", "prognosis") - rs.AddSingular("synopses", "synopsis") - rs.AddSingular("theses", "thesis") - rs.AddSingular("analyses", "analysis") - rs.AddSingularExact("analysis", "analysis", true) - rs.AddSingular("ovies", "ovie") - rs.AddSingular("aves", "afe") - rs.AddSingular("bves", "bfe") - rs.AddSingular("cves", "cfe") - rs.AddSingular("dves", "dfe") - rs.AddSingular("eves", "efe") - rs.AddSingular("gves", "gfe") - rs.AddSingular("hves", "hfe") - rs.AddSingular("ives", "ife") - rs.AddSingular("jves", "jfe") - rs.AddSingular("kves", "kfe") - rs.AddSingular("lves", "lfe") - rs.AddSingular("mves", "mfe") - rs.AddSingular("nves", "nfe") - rs.AddSingular("oves", "ofe") - rs.AddSingular("pves", "pfe") - rs.AddSingular("qves", "qfe") - rs.AddSingular("rves", "rfe") - rs.AddSingular("sves", "sfe") - rs.AddSingular("tves", "tfe") - rs.AddSingular("uves", "ufe") - rs.AddSingular("vves", "vfe") - rs.AddSingular("wves", "wfe") - rs.AddSingular("xves", "xfe") - rs.AddSingular("yves", "yfe") - rs.AddSingular("zves", "zfe") - rs.AddSingular("hives", "hive") - rs.AddSingular("tives", "tive") - rs.AddSingular("lves", "lf") - rs.AddSingular("rves", "rf") - rs.AddSingular("quies", "quy") - rs.AddSingular("bies", "by") - rs.AddSingular("cies", "cy") - rs.AddSingular("dies", "dy") - rs.AddSingular("fies", "fy") - rs.AddSingular("gies", "gy") - rs.AddSingular("hies", "hy") - rs.AddSingular("jies", "jy") - rs.AddSingular("kies", "ky") - rs.AddSingular("lies", "ly") - rs.AddSingular("mies", "my") - rs.AddSingular("nies", "ny") - rs.AddSingular("pies", "py") - rs.AddSingular("qies", "qy") - rs.AddSingular("ries", "ry") - rs.AddSingular("sies", "sy") - rs.AddSingular("ties", "ty") - // rs.AddSingular("vies", "vy") - rs.AddSingular("wies", "wy") - rs.AddSingular("xies", "xy") - rs.AddSingular("zies", "zy") - rs.AddSingular("series", "series") - rs.AddSingular("xes", "x") - rs.AddSingular("ches", "ch") - rs.AddSingular("sses", "ss") - rs.AddSingular("shes", "sh") - rs.AddSingular("mice", "mouse") - rs.AddSingular("lice", "louse") - rs.AddSingular("buses", "bus") - rs.AddSingularExact("bus", "bus", true) - rs.AddSingular("oes", "o") - rs.AddSingular("shoes", "shoe") - rs.AddSingular("crises", "crisis") - rs.AddSingularExact("crisis", "crisis", true) - rs.AddSingular("axes", "axis") - rs.AddSingularExact("axis", "axis", true) - rs.AddSingular("testes", "testis") - rs.AddSingularExact("testis", "testis", true) - rs.AddSingular("octopi", "octopus") - rs.AddSingularExact("octopus", "octopus", true) - rs.AddSingular("viri", "virus") - rs.AddSingularExact("virus", "virus", true) - rs.AddSingular("statuses", "status") - rs.AddSingular("Statuses", "Status") - rs.AddSingular("campuses", "campus") - rs.AddSingularExact("status", "status", true) - rs.AddSingularExact("Status", "Status", true) - rs.AddSingularExact("campus", "campus", true) - rs.AddSingular("aliases", "alias") - rs.AddSingularExact("alias", "alias", true) - rs.AddSingularExact("oxen", "ox", true) - rs.AddSingular("vertices", "vertex") - rs.AddSingular("indices", "index") - rs.AddSingular("matrices", "matrix") - rs.AddSingularExact("quizzes", "quiz", true) - rs.AddSingular("databases", "database") - rs.AddSingular("resses", "ress") - rs.AddSingular("ress", "ress") - rs.AddIrregular("person", "people") - rs.AddIrregular("man", "men") - rs.AddIrregular("child", "children") - rs.AddIrregular("sex", "sexes") - rs.AddIrregular("move", "moves") - rs.AddIrregular("zombie", "zombies") - rs.AddIrregular("Status", "Statuses") - rs.AddIrregular("status", "statuses") - rs.AddIrregular("campus", "campuses") - rs.AddIrregular("human", "humans") - rs.AddUncountable("equipment") - rs.AddUncountable("information") - rs.AddUncountable("rice") - rs.AddUncountable("money") - rs.AddUncountable("species") - rs.AddUncountable("series") - rs.AddUncountable("fish") - rs.AddUncountable("sheep") - rs.AddUncountable("jeans") - rs.AddUncountable("police") - - acronyms := strings.Split(baseAcronyms, ",") - for _, acr := range acronyms { - rs.AddAcronym(acr) - } - - return rs -} - -// Uncountables returns a map of uncountables in the ruleset -func (rs *Ruleset) Uncountables() map[string]bool { - return rs.uncountables -} - -// AddPlural add a pluralization rule -func (rs *Ruleset) AddPlural(suffix, replacement string) { - rs.AddPluralExact(suffix, replacement, false) -} - -// AddPluralExact add a pluralization rule with full string match -func (rs *Ruleset) AddPluralExact(suffix, replacement string, exact bool) { - // remove uncountable - delete(rs.uncountables, suffix) - // create rule - r := new(Rule) - r.suffix = suffix - r.replacement = replacement - r.exact = exact - // prepend - rs.plurals = append([]*Rule{r}, rs.plurals...) -} - -// AddSingular add a singular rule -func (rs *Ruleset) AddSingular(suffix, replacement string) { - rs.AddSingularExact(suffix, replacement, false) -} - -// AddSingularExact same as AddSingular but you can set `exact` to force -// a full string match -func (rs *Ruleset) AddSingularExact(suffix, replacement string, exact bool) { - // remove from uncountable - delete(rs.uncountables, suffix) - // create rule - r := new(Rule) - r.suffix = suffix - r.replacement = replacement - r.exact = exact - rs.singulars = append([]*Rule{r}, rs.singulars...) -} - -// AddHuman Human rules are applied by humanize to show more friendly -// versions of words -func (rs *Ruleset) AddHuman(suffix, replacement string) { - r := new(Rule) - r.suffix = suffix - r.replacement = replacement - rs.humans = append([]*Rule{r}, rs.humans...) -} - -// AddIrregular Add any inconsistent pluralizing/singularizing rules -// to the set here. -func (rs *Ruleset) AddIrregular(singular, plural string) { - delete(rs.uncountables, singular) - delete(rs.uncountables, plural) - rs.AddPlural(singular, plural) - rs.AddPlural(plural, plural) - rs.AddSingular(plural, singular) -} - -// AddAcronym if you use acronym you may need to add them to the ruleset -// to prevent Underscored words of things like "HTML" coming out -// as "h_t_m_l" -func (rs *Ruleset) AddAcronym(word string) { - r := new(Rule) - r.suffix = word - r.replacement = rs.Titleize(strings.ToLower(word)) - rs.acronyms = append(rs.acronyms, r) -} - -// AddUncountable add a word to this ruleset that has the same singular and plural form -// for example: "rice" -func (rs *Ruleset) AddUncountable(word string) { - rs.uncountables[strings.ToLower(word)] = true -} - -func (rs *Ruleset) isUncountable(word string) bool { - // handle multiple words by using the last one - words := strings.Split(word, " ") - if _, exists := rs.uncountables[strings.ToLower(words[len(words)-1])]; exists { - return true - } - return false -} - -//isAcronym returns if a word is acronym or not. -func (rs *Ruleset) isAcronym(word string) bool { - for _, rule := range rs.acronyms { - if strings.ToUpper(rule.suffix) == strings.ToUpper(word) { - return true - } - } - - return false -} - -//PluralizeWithSize pluralize with taking number into account -func (rs *Ruleset) PluralizeWithSize(word string, size int) string { - if size == 1 { - return rs.Singularize(word) - } - return rs.Pluralize(word) -} - -// Pluralize returns the plural form of a singular word -func (rs *Ruleset) Pluralize(word string) string { - if len(word) == 0 { - return word - } - lWord := strings.ToLower(word) - if rs.isUncountable(lWord) { - return word - } - - var candidate string - for _, rule := range rs.plurals { - if rule.exact { - if lWord == rule.suffix { - // Capitalized word - if lWord[0] != word[0] && lWord[1:] == word[1:] { - return rs.Capitalize(rule.replacement) - } - return rule.replacement - } - continue - } - - if strings.EqualFold(word, rule.suffix) { - candidate = rule.replacement - } - - if strings.HasSuffix(word, rule.suffix) { - return replaceLast(word, rule.suffix, rule.replacement) - } - } - - if candidate != "" { - return candidate - } - return word + "s" -} - -//Singularize returns the singular form of a plural word -func (rs *Ruleset) Singularize(word string) string { - if len(word) <= 1 { - return word - } - lWord := strings.ToLower(word) - if rs.isUncountable(lWord) { - return word - } - - var candidate string - - for _, rule := range rs.singulars { - if rule.exact { - if lWord == rule.suffix { - // Capitalized word - if lWord[0] != word[0] && lWord[1:] == word[1:] { - return rs.Capitalize(rule.replacement) - } - return rule.replacement - } - continue - } - - if strings.EqualFold(word, rule.suffix) { - candidate = rule.replacement - } - - if strings.HasSuffix(word, rule.suffix) { - return replaceLast(word, rule.suffix, rule.replacement) - } - } - - if candidate != "" { - return candidate - } - - return word -} - -//Capitalize uppercase first character -func (rs *Ruleset) Capitalize(word string) string { - if rs.isAcronym(word) { - return strings.ToUpper(word) - } - return strings.ToUpper(word[:1]) + word[1:] -} - -//Camelize "dino_party" -> "DinoParty" -func (rs *Ruleset) Camelize(word string) string { - if rs.isAcronym(word) { - return strings.ToUpper(word) - } - words := splitAtCaseChangeWithTitlecase(word) - return strings.Join(words, "") -} - -//CamelizeDownFirst same as Camelcase but with first letter downcased -func (rs *Ruleset) CamelizeDownFirst(word string) string { - word = Camelize(word) - return strings.ToLower(word[:1]) + word[1:] -} - -//Titleize Capitalize every word in sentence "hello there" -> "Hello There" -func (rs *Ruleset) Titleize(word string) string { - words := splitAtCaseChangeWithTitlecase(word) - result := strings.Join(words, " ") - - var acronymWords []string - for index, word := range words { - if len(word) == 1 { - acronymWords = append(acronymWords, word) - } - - if len(word) > 1 || index == len(words)-1 || len(acronymWords) > 1 { - acronym := strings.Join(acronymWords, "") - if !rs.isAcronym(acronym) { - acronymWords = acronymWords[:len(acronymWords)] - continue - } - - result = strings.Replace(result, strings.Join(acronymWords, " "), acronym, 1) - acronymWords = []string{} - } - } - - return result -} - -func (rs *Ruleset) safeCaseAcronyms(word string) string { - // convert an acronym like HTML into Html - for _, rule := range rs.acronyms { - word = strings.Replace(word, rule.suffix, rule.replacement, -1) - } - return word -} - -func (rs *Ruleset) separatedWords(word, sep string) string { - word = rs.safeCaseAcronyms(word) - words := splitAtCaseChange(word) - return strings.Join(words, sep) -} - -//Underscore lowercase underscore version "BigBen" -> "big_ben" -func (rs *Ruleset) Underscore(word string) string { - return rs.separatedWords(word, "_") -} - -//Humanize First letter of sentence capitalized -// Uses custom friendly replacements via AddHuman() -func (rs *Ruleset) Humanize(word string) string { - word = replaceLast(word, "_id", "") // strip foreign key kinds - // replace and strings in humans list - for _, rule := range rs.humans { - word = strings.Replace(word, rule.suffix, rule.replacement, -1) - } - sentence := rs.separatedWords(word, " ") - - r, n := utf8.DecodeRuneInString(sentence) - return string(unicode.ToUpper(r)) + sentence[n:] -} - -//ForeignKey an underscored foreign key name "Person" -> "person_id" -func (rs *Ruleset) ForeignKey(word string) string { - return rs.Underscore(rs.Singularize(word)) + "_id" -} - -//ForeignKeyCondensed a foreign key (with an underscore) "Person" -> "personid" -func (rs *Ruleset) ForeignKeyCondensed(word string) string { - return rs.Underscore(word) + "id" -} - -//Tableize Rails style pluralized table names: "SuperPerson" -> "super_people" -func (rs *Ruleset) Tableize(word string) string { - return rs.Pluralize(rs.Underscore(rs.Typeify(word))) -} - -var notUrlSafe *regexp.Regexp = regexp.MustCompile(`[^\w\d\-_ ]`) - -//Parameterize param safe dasherized names like "my-param" -func (rs *Ruleset) Parameterize(word string) string { - return ParameterizeJoin(word, "-") -} - -//ParameterizeJoin param safe dasherized names with custom separator -func (rs *Ruleset) ParameterizeJoin(word, sep string) string { - word = strings.ToLower(word) - word = rs.Asciify(word) - word = notUrlSafe.ReplaceAllString(word, "") - word = strings.Replace(word, " ", sep, -1) - if len(sep) > 0 { - squash, err := regexp.Compile(sep + "+") - if err == nil { - word = squash.ReplaceAllString(word, sep) - } - } - word = strings.Trim(word, sep+" ") - return word -} - -var lookalikes = map[string]*regexp.Regexp{ - "A": regexp.MustCompile(`À|Á|Â|Ã|Ä|Å`), - "AE": regexp.MustCompile(`Æ`), - "C": regexp.MustCompile(`Ç`), - "E": regexp.MustCompile(`È|É|Ê|Ë`), - "G": regexp.MustCompile(`Ğ`), - "I": regexp.MustCompile(`Ì|Í|Î|Ï|İ`), - "N": regexp.MustCompile(`Ñ`), - "O": regexp.MustCompile(`Ò|Ó|Ô|Õ|Ö|Ø`), - "S": regexp.MustCompile(`Ş`), - "U": regexp.MustCompile(`Ù|Ú|Û|Ü`), - "Y": regexp.MustCompile(`Ý`), - "ss": regexp.MustCompile(`ß`), - "a": regexp.MustCompile(`à|á|â|ã|ä|å`), - "ae": regexp.MustCompile(`æ`), - "c": regexp.MustCompile(`ç`), - "e": regexp.MustCompile(`è|é|ê|ë`), - "g": regexp.MustCompile(`ğ`), - "i": regexp.MustCompile(`ì|í|î|ï|ı`), - "n": regexp.MustCompile(`ñ`), - "o": regexp.MustCompile(`ò|ó|ô|õ|ö|ø`), - "s": regexp.MustCompile(`ş`), - "u": regexp.MustCompile(`ù|ú|û|ü|ũ|ū|ŭ|ů|ű|ų`), - "y": regexp.MustCompile(`ý|ÿ`), -} - -//Asciify transforms Latin characters like é -> e -func (rs *Ruleset) Asciify(word string) string { - for repl, regex := range lookalikes { - word = regex.ReplaceAllString(word, repl) - } - return word -} - -var tablePrefix = regexp.MustCompile(`^[^.]*\.`) - -//Typeify "something_like_this" -> "SomethingLikeThis" -func (rs *Ruleset) Typeify(word string) string { - word = tablePrefix.ReplaceAllString(word, "") - return rs.Camelize(rs.Singularize(word)) -} - -//Dasherize "SomeText" -> "some-text" -func (rs *Ruleset) Dasherize(word string) string { - return rs.separatedWords(word, "-") -} - -//Ordinalize "1031" -> "1031st" -func (rs *Ruleset) Ordinalize(str string) string { - number, err := strconv.Atoi(str) - if err != nil { - return str - } - switch abs(number) % 100 { - case 11, 12, 13: - return fmt.Sprintf("%dth", number) - default: - switch abs(number) % 10 { - case 1: - return fmt.Sprintf("%dst", number) - case 2: - return fmt.Sprintf("%dnd", number) - case 3: - return fmt.Sprintf("%drd", number) - } - } - return fmt.Sprintf("%dth", number) -} - -//ForeignKeyToAttribute returns the attribute name from the foreign key -func (rs *Ruleset) ForeignKeyToAttribute(str string) string { - w := rs.Camelize(str) - if strings.HasSuffix(w, "Id") { - return strings.TrimSuffix(w, "Id") + "ID" - } - return w -} - -//LoadReader loads rules from io.Reader param -func (rs *Ruleset) LoadReader(r io.Reader) error { - m := map[string]string{} - err := json.NewDecoder(r).Decode(&m) - if err != nil { - return fmt.Errorf("could not decode inflection JSON from reader: %s", err) - } - for s, p := range m { - defaultRuleset.AddIrregular(s, p) - } - return nil -} - -///////////////////////////////////////// -// the default global ruleset -////////////////////////////////////////// - -var defaultRuleset *Ruleset - -//LoadReader loads rules from io.Reader param -func LoadReader(r io.Reader) error { - return defaultRuleset.LoadReader(r) -} - -func init() { - defaultRuleset = NewDefaultRuleset() - - pwd, _ := os.Getwd() - cfg := filepath.Join(pwd, "inflections.json") - if p := os.Getenv("INFLECT_PATH"); p != "" { - cfg = p - } - if _, err := os.Stat(cfg); err == nil { - b, err := ioutil.ReadFile(cfg) - if err != nil { - fmt.Printf("could not read inflection file %s (%s)\n", cfg, err) - return - } - if err = defaultRuleset.LoadReader(bytes.NewReader(b)); err != nil { - fmt.Println(err) - } - } -} - -//Uncountables returns a list of uncountables rules -func Uncountables() map[string]bool { - return defaultRuleset.Uncountables() -} - -//AddPlural adds plural to the ruleset -func AddPlural(suffix, replacement string) { - defaultRuleset.AddPlural(suffix, replacement) -} - -//AddSingular adds singular to the ruleset -func AddSingular(suffix, replacement string) { - defaultRuleset.AddSingular(suffix, replacement) -} - -//AddHuman adds human -func AddHuman(suffix, replacement string) { - defaultRuleset.AddHuman(suffix, replacement) -} - -func AddIrregular(singular, plural string) { - defaultRuleset.AddIrregular(singular, plural) -} - -func AddAcronym(word string) { - defaultRuleset.AddAcronym(word) -} - -func AddUncountable(word string) { - defaultRuleset.AddUncountable(word) -} - -func Pluralize(word string) string { - return defaultRuleset.Pluralize(word) -} - -func PluralizeWithSize(word string, size int) string { - return defaultRuleset.PluralizeWithSize(word, size) -} - -func Singularize(word string) string { - return defaultRuleset.Singularize(word) -} - -func Capitalize(word string) string { - return defaultRuleset.Capitalize(word) -} - -func Camelize(word string) string { - return defaultRuleset.Camelize(word) -} - -func CamelizeDownFirst(word string) string { - return defaultRuleset.CamelizeDownFirst(word) -} - -func Titleize(word string) string { - return defaultRuleset.Titleize(word) -} - -func Underscore(word string) string { - return defaultRuleset.Underscore(word) -} - -func Humanize(word string) string { - return defaultRuleset.Humanize(word) -} - -func ForeignKey(word string) string { - return defaultRuleset.ForeignKey(word) -} - -func ForeignKeyCondensed(word string) string { - return defaultRuleset.ForeignKeyCondensed(word) -} - -func Tableize(word string) string { - return defaultRuleset.Tableize(word) -} - -func Parameterize(word string) string { - return defaultRuleset.Parameterize(word) -} - -func ParameterizeJoin(word, sep string) string { - return defaultRuleset.ParameterizeJoin(word, sep) -} - -func Typeify(word string) string { - return defaultRuleset.Typeify(word) -} - -func Dasherize(word string) string { - return defaultRuleset.Dasherize(word) -} - -func Ordinalize(word string) string { - return defaultRuleset.Ordinalize(word) -} - -func Asciify(word string) string { - return defaultRuleset.Asciify(word) -} - -func ForeignKeyToAttribute(word string) string { - return defaultRuleset.ForeignKeyToAttribute(word) -} - -// helper funcs - -func reverse(s string) string { - o := make([]rune, utf8.RuneCountInString(s)) - i := len(o) - for _, c := range s { - i-- - o[i] = c - } - return string(o) -} - -func isSpacerChar(c rune) bool { - switch { - case c == rune("_"[0]): - return true - case c == rune(" "[0]): - return true - case c == rune(":"[0]): - return true - case c == rune("-"[0]): - return true - } - return false -} - -func splitAtCaseChange(s string) []string { - words := make([]string, 0) - word := make([]rune, 0) - for _, c := range s { - spacer := isSpacerChar(c) - if len(word) > 0 { - if unicode.IsUpper(c) || spacer { - words = append(words, string(word)) - word = make([]rune, 0) - } - } - if !spacer { - word = append(word, unicode.ToLower(c)) - } - } - words = append(words, string(word)) - return words -} - -func splitAtCaseChangeWithTitlecase(s string) []string { - words := make([]string, 0) - word := make([]rune, 0) - - for _, c := range s { - spacer := isSpacerChar(c) - if len(word) > 0 { - if unicode.IsUpper(c) || spacer { - words = append(words, string(word)) - word = make([]rune, 0) - } - } - if !spacer { - if len(word) > 0 { - word = append(word, unicode.ToLower(c)) - } else { - word = append(word, unicode.ToUpper(c)) - } - } - } - - words = append(words, string(word)) - return words -} - -func replaceLast(s, match, repl string) string { - // reverse strings - srev := reverse(s) - mrev := reverse(match) - rrev := reverse(repl) - // match first and reverse back - return reverse(strings.Replace(srev, mrev, rrev, 1)) -} - -func abs(x int) int { - if x < 0 { - return -x - } - return x -} diff --git a/vendor/github.com/markbates/inflect/name.go b/vendor/github.com/markbates/inflect/name.go deleted file mode 100644 index e6863e28a68..00000000000 --- a/vendor/github.com/markbates/inflect/name.go +++ /dev/null @@ -1,163 +0,0 @@ -package inflect - -import ( - "fmt" - "path/filepath" - "strings" - - "github.com/gobuffalo/envy" -) - -// Name is a string that represents the "name" of a thing, like an app, model, etc... -type Name string - -// Title version of a name. ie. "foo_bar" => "Foo Bar" -func (n Name) Title() string { - x := strings.Split(string(n), "/") - for i, s := range x { - x[i] = Titleize(s) - } - - return strings.Join(x, " ") -} - -// Underscore version of a name. ie. "FooBar" => "foo_bar" -func (n Name) Underscore() string { - w := string(n) - if strings.ToUpper(w) == w { - return strings.ToLower(w) - } - return Underscore(w) -} - -// Plural version of a name -func (n Name) Plural() string { - return Pluralize(string(n)) -} - -// Singular version of a name -func (n Name) Singular() string { - return Singularize(string(n)) -} - -// Camel version of a name -func (n Name) Camel() string { - c := Camelize(string(n)) - if strings.HasSuffix(c, "Id") { - c = strings.TrimSuffix(c, "Id") - c += "ID" - } - return c -} - -// Model version of a name. ie. "user" => "User" -func (n Name) Model() string { - x := strings.Split(string(n), "/") - for i, s := range x { - x[i] = Camelize(Singularize(s)) - } - - return strings.Join(x, "") -} - -// Resource version of a name -func (n Name) Resource() string { - name := n.Underscore() - x := strings.FieldsFunc(name, func(r rune) bool { - return r == '_' || r == '/' - }) - - for i, w := range x { - if i == len(x)-1 { - x[i] = Camelize(Pluralize(strings.ToLower(w))) - continue - } - - x[i] = Camelize(w) - } - - return strings.Join(x, "") -} - -// ModelPlural version of a name. ie. "user" => "Users" -func (n Name) ModelPlural() string { - return Camelize(Pluralize(n.Model())) -} - -// File version of a name -func (n Name) File() string { - return Underscore(Camelize(string(n))) -} - -// Table version of a name -func (n Name) Table() string { - return Underscore(Pluralize(string(n))) -} - -// UnderSingular version of a name -func (n Name) UnderSingular() string { - return Underscore(Singularize(string(n))) -} - -// PluralCamel version of a name -func (n Name) PluralCamel() string { - return Pluralize(Camelize(string(n))) -} - -// PluralUnder version of a name -func (n Name) PluralUnder() string { - return Pluralize(Underscore(string(n))) -} - -// URL version of a name -func (n Name) URL() string { - return n.PluralUnder() -} - -// CamelSingular version of a name -func (n Name) CamelSingular() string { - return Camelize(Singularize(string(n))) -} - -// VarCaseSingular version of a name. ie. "FooBar" => "fooBar" -func (n Name) VarCaseSingular() string { - return CamelizeDownFirst(Singularize(Underscore(n.Resource()))) -} - -// VarCasePlural version of a name. ie. "FooBar" => "fooBar" -func (n Name) VarCasePlural() string { - return CamelizeDownFirst(n.Resource()) -} - -// Lower case version of a string -func (n Name) Lower() string { - return strings.ToLower(string(n)) -} - -// ParamID returns foo_bar_id -func (n Name) ParamID() string { - return fmt.Sprintf("%s_id", strings.Replace(n.UnderSingular(), "/", "_", -1)) -} - -// Package returns go package -func (n Name) Package() string { - key := string(n) - - for _, gp := range envy.GoPaths() { - key = strings.TrimPrefix(key, filepath.Join(gp, "src")) - key = strings.TrimPrefix(key, gp) - } - key = strings.TrimPrefix(key, string(filepath.Separator)) - - key = strings.Replace(key, "\\", "/", -1) - return key -} - -// Char returns first character in lower case, this is useful for methods inside a struct. -func (n Name) Char() string { - return strings.ToLower(string(n[0])) -} - -func (n Name) String() string { - return string(n) -} diff --git a/vendor/github.com/markbates/inflect/version.go b/vendor/github.com/markbates/inflect/version.go deleted file mode 100644 index a1674498419..00000000000 --- a/vendor/github.com/markbates/inflect/version.go +++ /dev/null @@ -1,3 +0,0 @@ -package inflect - -const Version = "v1.0.4" diff --git a/vendor/github.com/mitchellh/go-ps/LICENSE.md b/vendor/github.com/mitchellh/go-ps/LICENSE.md deleted file mode 100644 index 22985159044..00000000000 --- a/vendor/github.com/mitchellh/go-ps/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Mitchell Hashimoto - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/github.com/mitchellh/go-ps/process.go b/vendor/github.com/mitchellh/go-ps/process.go deleted file mode 100644 index 2b5e8ed2323..00000000000 --- a/vendor/github.com/mitchellh/go-ps/process.go +++ /dev/null @@ -1,40 +0,0 @@ -// ps provides an API for finding and listing processes in a platform-agnostic -// way. -// -// NOTE: If you're reading these docs online via GoDocs or some other system, -// you might only see the Unix docs. This project makes heavy use of -// platform-specific implementations. We recommend reading the source if you -// are interested. -package ps - -// Process is the generic interface that is implemented on every platform -// and provides common operations for processes. -type Process interface { - // Pid is the process ID for this process. - Pid() int - - // PPid is the parent process ID for this process. - PPid() int - - // Executable name running this process. This is not a path to the - // executable. - Executable() string -} - -// Processes returns all processes. -// -// This of course will be a point-in-time snapshot of when this method was -// called. Some operating systems don't provide snapshot capability of the -// process table, in which case the process table returned might contain -// ephemeral entities that happened to be running when this was called. -func Processes() ([]Process, error) { - return processes() -} - -// FindProcess looks up a single process by pid. -// -// Process will be nil and error will be nil if a matching process is -// not found. -func FindProcess(pid int) (Process, error) { - return findProcess(pid) -} diff --git a/vendor/github.com/mitchellh/go-ps/process_darwin.go b/vendor/github.com/mitchellh/go-ps/process_darwin.go deleted file mode 100644 index 5ee87fb68a8..00000000000 --- a/vendor/github.com/mitchellh/go-ps/process_darwin.go +++ /dev/null @@ -1,138 +0,0 @@ -// +build darwin - -package ps - -import ( - "bytes" - "encoding/binary" - "syscall" - "unsafe" -) - -type DarwinProcess struct { - pid int - ppid int - binary string -} - -func (p *DarwinProcess) Pid() int { - return p.pid -} - -func (p *DarwinProcess) PPid() int { - return p.ppid -} - -func (p *DarwinProcess) Executable() string { - return p.binary -} - -func findProcess(pid int) (Process, error) { - ps, err := processes() - if err != nil { - return nil, err - } - - for _, p := range ps { - if p.Pid() == pid { - return p, nil - } - } - - return nil, nil -} - -func processes() ([]Process, error) { - buf, err := darwinSyscall() - if err != nil { - return nil, err - } - - procs := make([]*kinfoProc, 0, 50) - k := 0 - for i := _KINFO_STRUCT_SIZE; i < buf.Len(); i += _KINFO_STRUCT_SIZE { - proc := &kinfoProc{} - err = binary.Read(bytes.NewBuffer(buf.Bytes()[k:i]), binary.LittleEndian, proc) - if err != nil { - return nil, err - } - - k = i - procs = append(procs, proc) - } - - darwinProcs := make([]Process, len(procs)) - for i, p := range procs { - darwinProcs[i] = &DarwinProcess{ - pid: int(p.Pid), - ppid: int(p.PPid), - binary: darwinCstring(p.Comm), - } - } - - return darwinProcs, nil -} - -func darwinCstring(s [16]byte) string { - i := 0 - for _, b := range s { - if b != 0 { - i++ - } else { - break - } - } - - return string(s[:i]) -} - -func darwinSyscall() (*bytes.Buffer, error) { - mib := [4]int32{_CTRL_KERN, _KERN_PROC, _KERN_PROC_ALL, 0} - size := uintptr(0) - - _, _, errno := syscall.Syscall6( - syscall.SYS___SYSCTL, - uintptr(unsafe.Pointer(&mib[0])), - 4, - 0, - uintptr(unsafe.Pointer(&size)), - 0, - 0) - - if errno != 0 { - return nil, errno - } - - bs := make([]byte, size) - _, _, errno = syscall.Syscall6( - syscall.SYS___SYSCTL, - uintptr(unsafe.Pointer(&mib[0])), - 4, - uintptr(unsafe.Pointer(&bs[0])), - uintptr(unsafe.Pointer(&size)), - 0, - 0) - - if errno != 0 { - return nil, errno - } - - return bytes.NewBuffer(bs[0:size]), nil -} - -const ( - _CTRL_KERN = 1 - _KERN_PROC = 14 - _KERN_PROC_ALL = 0 - _KINFO_STRUCT_SIZE = 648 -) - -type kinfoProc struct { - _ [40]byte - Pid int32 - _ [199]byte - Comm [16]byte - _ [301]byte - PPid int32 - _ [84]byte -} diff --git a/vendor/github.com/mitchellh/go-ps/process_freebsd.go b/vendor/github.com/mitchellh/go-ps/process_freebsd.go deleted file mode 100644 index 130acbe6c64..00000000000 --- a/vendor/github.com/mitchellh/go-ps/process_freebsd.go +++ /dev/null @@ -1,260 +0,0 @@ -// +build freebsd - -package ps - -import ( - "bytes" - "encoding/binary" - "syscall" - "unsafe" -) - -// copied from sys/sysctl.h -const ( - CTL_KERN = 1 // "high kernel": proc, limits - KERN_PROC = 14 // struct: process entries - KERN_PROC_PID = 1 // by process id - KERN_PROC_PROC = 8 // only return procs - KERN_PROC_PATHNAME = 12 // path to executable -) - -// copied from sys/user.h -type Kinfo_proc struct { - Ki_structsize int32 - Ki_layout int32 - Ki_args int64 - Ki_paddr int64 - Ki_addr int64 - Ki_tracep int64 - Ki_textvp int64 - Ki_fd int64 - Ki_vmspace int64 - Ki_wchan int64 - Ki_pid int32 - Ki_ppid int32 - Ki_pgid int32 - Ki_tpgid int32 - Ki_sid int32 - Ki_tsid int32 - Ki_jobc [2]byte - Ki_spare_short1 [2]byte - Ki_tdev int32 - Ki_siglist [16]byte - Ki_sigmask [16]byte - Ki_sigignore [16]byte - Ki_sigcatch [16]byte - Ki_uid int32 - Ki_ruid int32 - Ki_svuid int32 - Ki_rgid int32 - Ki_svgid int32 - Ki_ngroups [2]byte - Ki_spare_short2 [2]byte - Ki_groups [64]byte - Ki_size int64 - Ki_rssize int64 - Ki_swrss int64 - Ki_tsize int64 - Ki_dsize int64 - Ki_ssize int64 - Ki_xstat [2]byte - Ki_acflag [2]byte - Ki_pctcpu int32 - Ki_estcpu int32 - Ki_slptime int32 - Ki_swtime int32 - Ki_cow int32 - Ki_runtime int64 - Ki_start [16]byte - Ki_childtime [16]byte - Ki_flag int64 - Ki_kiflag int64 - Ki_traceflag int32 - Ki_stat [1]byte - Ki_nice [1]byte - Ki_lock [1]byte - Ki_rqindex [1]byte - Ki_oncpu [1]byte - Ki_lastcpu [1]byte - Ki_ocomm [17]byte - Ki_wmesg [9]byte - Ki_login [18]byte - Ki_lockname [9]byte - Ki_comm [20]byte - Ki_emul [17]byte - Ki_sparestrings [68]byte - Ki_spareints [36]byte - Ki_cr_flags int32 - Ki_jid int32 - Ki_numthreads int32 - Ki_tid int32 - Ki_pri int32 - Ki_rusage [144]byte - Ki_rusage_ch [144]byte - Ki_pcb int64 - Ki_kstack int64 - Ki_udata int64 - Ki_tdaddr int64 - Ki_spareptrs [48]byte - Ki_spareint64s [96]byte - Ki_sflag int64 - Ki_tdflags int64 -} - -// UnixProcess is an implementation of Process that contains Unix-specific -// fields and information. -type UnixProcess struct { - pid int - ppid int - state rune - pgrp int - sid int - - binary string -} - -func (p *UnixProcess) Pid() int { - return p.pid -} - -func (p *UnixProcess) PPid() int { - return p.ppid -} - -func (p *UnixProcess) Executable() string { - return p.binary -} - -// Refresh reloads all the data associated with this process. -func (p *UnixProcess) Refresh() error { - - mib := []int32{CTL_KERN, KERN_PROC, KERN_PROC_PID, int32(p.pid)} - - buf, length, err := call_syscall(mib) - if err != nil { - return err - } - proc_k := Kinfo_proc{} - if length != uint64(unsafe.Sizeof(proc_k)) { - return err - } - - k, err := parse_kinfo_proc(buf) - if err != nil { - return err - } - - p.ppid, p.pgrp, p.sid, p.binary = copy_params(&k) - return nil -} - -func copy_params(k *Kinfo_proc) (int, int, int, string) { - n := -1 - for i, b := range k.Ki_comm { - if b == 0 { - break - } - n = i + 1 - } - comm := string(k.Ki_comm[:n]) - - return int(k.Ki_ppid), int(k.Ki_pgid), int(k.Ki_sid), comm -} - -func findProcess(pid int) (Process, error) { - mib := []int32{CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, int32(pid)} - - _, _, err := call_syscall(mib) - if err != nil { - return nil, err - } - - return newUnixProcess(pid) -} - -func processes() ([]Process, error) { - results := make([]Process, 0, 50) - - mib := []int32{CTL_KERN, KERN_PROC, KERN_PROC_PROC, 0} - buf, length, err := call_syscall(mib) - if err != nil { - return results, err - } - - // get kinfo_proc size - k := Kinfo_proc{} - procinfo_len := int(unsafe.Sizeof(k)) - count := int(length / uint64(procinfo_len)) - - // parse buf to procs - for i := 0; i < count; i++ { - b := buf[i*procinfo_len : i*procinfo_len+procinfo_len] - k, err := parse_kinfo_proc(b) - if err != nil { - continue - } - p, err := newUnixProcess(int(k.Ki_pid)) - if err != nil { - continue - } - p.ppid, p.pgrp, p.sid, p.binary = copy_params(&k) - - results = append(results, p) - } - - return results, nil -} - -func parse_kinfo_proc(buf []byte) (Kinfo_proc, error) { - var k Kinfo_proc - br := bytes.NewReader(buf) - err := binary.Read(br, binary.LittleEndian, &k) - if err != nil { - return k, err - } - - return k, nil -} - -func call_syscall(mib []int32) ([]byte, uint64, error) { - miblen := uint64(len(mib)) - - // get required buffer size - length := uint64(0) - _, _, err := syscall.RawSyscall6( - syscall.SYS___SYSCTL, - uintptr(unsafe.Pointer(&mib[0])), - uintptr(miblen), - 0, - uintptr(unsafe.Pointer(&length)), - 0, - 0) - if err != 0 { - b := make([]byte, 0) - return b, length, err - } - if length == 0 { - b := make([]byte, 0) - return b, length, err - } - // get proc info itself - buf := make([]byte, length) - _, _, err = syscall.RawSyscall6( - syscall.SYS___SYSCTL, - uintptr(unsafe.Pointer(&mib[0])), - uintptr(miblen), - uintptr(unsafe.Pointer(&buf[0])), - uintptr(unsafe.Pointer(&length)), - 0, - 0) - if err != 0 { - return buf, length, err - } - - return buf, length, nil -} - -func newUnixProcess(pid int) (*UnixProcess, error) { - p := &UnixProcess{pid: pid} - return p, p.Refresh() -} diff --git a/vendor/github.com/mitchellh/go-ps/process_linux.go b/vendor/github.com/mitchellh/go-ps/process_linux.go deleted file mode 100644 index c1558f78346..00000000000 --- a/vendor/github.com/mitchellh/go-ps/process_linux.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build linux - -package ps - -import ( - "fmt" - "io/ioutil" - "strings" -) - -// Refresh reloads all the data associated with this process. -func (p *UnixProcess) Refresh() error { - statPath := fmt.Sprintf("/proc/%d/stat", p.pid) - dataBytes, err := ioutil.ReadFile(statPath) - if err != nil { - return err - } - - // First, parse out the image name - data := string(dataBytes) - binStart := strings.IndexRune(data, '(') + 1 - binEnd := strings.IndexRune(data[binStart:], ')') - p.binary = data[binStart : binStart+binEnd] - - // Move past the image name and start parsing the rest - data = data[binStart+binEnd+2:] - _, err = fmt.Sscanf(data, - "%c %d %d %d", - &p.state, - &p.ppid, - &p.pgrp, - &p.sid) - - return err -} diff --git a/vendor/github.com/mitchellh/go-ps/process_solaris.go b/vendor/github.com/mitchellh/go-ps/process_solaris.go deleted file mode 100644 index 014c41611de..00000000000 --- a/vendor/github.com/mitchellh/go-ps/process_solaris.go +++ /dev/null @@ -1,96 +0,0 @@ -// +build solaris - -package ps - -import ( - "encoding/binary" - "fmt" - "os" -) - -type ushort_t uint16 - -type id_t int32 -type pid_t int32 -type uid_t int32 -type gid_t int32 - -type dev_t uint64 -type size_t uint64 -type uintptr_t uint64 - -type timestruc_t [16]byte - -// This is copy from /usr/include/sys/procfs.h -type psinfo_t struct { - Pr_flag int32 /* process flags (DEPRECATED; do not use) */ - Pr_nlwp int32 /* number of active lwps in the process */ - Pr_pid pid_t /* unique process id */ - Pr_ppid pid_t /* process id of parent */ - Pr_pgid pid_t /* pid of process group leader */ - Pr_sid pid_t /* session id */ - Pr_uid uid_t /* real user id */ - Pr_euid uid_t /* effective user id */ - Pr_gid gid_t /* real group id */ - Pr_egid gid_t /* effective group id */ - Pr_addr uintptr_t /* address of process */ - Pr_size size_t /* size of process image in Kbytes */ - Pr_rssize size_t /* resident set size in Kbytes */ - Pr_pad1 size_t - Pr_ttydev dev_t /* controlling tty device (or PRNODEV) */ - - // Guess this following 2 ushort_t values require a padding to properly - // align to the 64bit mark. - Pr_pctcpu ushort_t /* % of recent cpu time used by all lwps */ - Pr_pctmem ushort_t /* % of system memory used by process */ - Pr_pad64bit [4]byte - - Pr_start timestruc_t /* process start time, from the epoch */ - Pr_time timestruc_t /* usr+sys cpu time for this process */ - Pr_ctime timestruc_t /* usr+sys cpu time for reaped children */ - Pr_fname [16]byte /* name of execed file */ - Pr_psargs [80]byte /* initial characters of arg list */ - Pr_wstat int32 /* if zombie, the wait() status */ - Pr_argc int32 /* initial argument count */ - Pr_argv uintptr_t /* address of initial argument vector */ - Pr_envp uintptr_t /* address of initial environment vector */ - Pr_dmodel [1]byte /* data model of the process */ - Pr_pad2 [3]byte - Pr_taskid id_t /* task id */ - Pr_projid id_t /* project id */ - Pr_nzomb int32 /* number of zombie lwps in the process */ - Pr_poolid id_t /* pool id */ - Pr_zoneid id_t /* zone id */ - Pr_contract id_t /* process contract */ - Pr_filler int32 /* reserved for future use */ - Pr_lwp [128]byte /* information for representative lwp */ -} - -func (p *UnixProcess) Refresh() error { - var psinfo psinfo_t - - path := fmt.Sprintf("/proc/%d/psinfo", p.pid) - fh, err := os.Open(path) - if err != nil { - return err - } - defer fh.Close() - - err = binary.Read(fh, binary.LittleEndian, &psinfo) - if err != nil { - return err - } - - p.ppid = int(psinfo.Pr_ppid) - p.binary = toString(psinfo.Pr_fname[:], 16) - return nil -} - -func toString(array []byte, len int) string { - for i := 0; i < len; i++ { - if array[i] == 0 { - return string(array[:i]) - } - } - return string(array[:]) -} diff --git a/vendor/github.com/mitchellh/go-ps/process_unix.go b/vendor/github.com/mitchellh/go-ps/process_unix.go deleted file mode 100644 index 3b733cec406..00000000000 --- a/vendor/github.com/mitchellh/go-ps/process_unix.go +++ /dev/null @@ -1,101 +0,0 @@ -// +build linux solaris - -package ps - -import ( - "fmt" - "io" - "os" - "strconv" -) - -// UnixProcess is an implementation of Process that contains Unix-specific -// fields and information. -type UnixProcess struct { - pid int - ppid int - state rune - pgrp int - sid int - - binary string -} - -func (p *UnixProcess) Pid() int { - return p.pid -} - -func (p *UnixProcess) PPid() int { - return p.ppid -} - -func (p *UnixProcess) Executable() string { - return p.binary -} - -func findProcess(pid int) (Process, error) { - dir := fmt.Sprintf("/proc/%d", pid) - _, err := os.Stat(dir) - if err != nil { - if os.IsNotExist(err) { - return nil, nil - } - - return nil, err - } - - return newUnixProcess(pid) -} - -func processes() ([]Process, error) { - d, err := os.Open("/proc") - if err != nil { - return nil, err - } - defer d.Close() - - results := make([]Process, 0, 50) - for { - fis, err := d.Readdir(10) - if err == io.EOF { - break - } - if err != nil { - return nil, err - } - - for _, fi := range fis { - // We only care about directories, since all pids are dirs - if !fi.IsDir() { - continue - } - - // We only care if the name starts with a numeric - name := fi.Name() - if name[0] < '0' || name[0] > '9' { - continue - } - - // From this point forward, any errors we just ignore, because - // it might simply be that the process doesn't exist anymore. - pid, err := strconv.ParseInt(name, 10, 0) - if err != nil { - continue - } - - p, err := newUnixProcess(int(pid)) - if err != nil { - continue - } - - results = append(results, p) - } - } - - return results, nil -} - -func newUnixProcess(pid int) (*UnixProcess, error) { - p := &UnixProcess{pid: pid} - return p, p.Refresh() -} diff --git a/vendor/github.com/mitchellh/go-ps/process_windows.go b/vendor/github.com/mitchellh/go-ps/process_windows.go deleted file mode 100644 index f151974e380..00000000000 --- a/vendor/github.com/mitchellh/go-ps/process_windows.go +++ /dev/null @@ -1,119 +0,0 @@ -// +build windows - -package ps - -import ( - "fmt" - "syscall" - "unsafe" -) - -// Windows API functions -var ( - modKernel32 = syscall.NewLazyDLL("kernel32.dll") - procCloseHandle = modKernel32.NewProc("CloseHandle") - procCreateToolhelp32Snapshot = modKernel32.NewProc("CreateToolhelp32Snapshot") - procProcess32First = modKernel32.NewProc("Process32FirstW") - procProcess32Next = modKernel32.NewProc("Process32NextW") -) - -// Some constants from the Windows API -const ( - ERROR_NO_MORE_FILES = 0x12 - MAX_PATH = 260 -) - -// PROCESSENTRY32 is the Windows API structure that contains a process's -// information. -type PROCESSENTRY32 struct { - Size uint32 - CntUsage uint32 - ProcessID uint32 - DefaultHeapID uintptr - ModuleID uint32 - CntThreads uint32 - ParentProcessID uint32 - PriorityClassBase int32 - Flags uint32 - ExeFile [MAX_PATH]uint16 -} - -// WindowsProcess is an implementation of Process for Windows. -type WindowsProcess struct { - pid int - ppid int - exe string -} - -func (p *WindowsProcess) Pid() int { - return p.pid -} - -func (p *WindowsProcess) PPid() int { - return p.ppid -} - -func (p *WindowsProcess) Executable() string { - return p.exe -} - -func newWindowsProcess(e *PROCESSENTRY32) *WindowsProcess { - // Find when the string ends for decoding - end := 0 - for { - if e.ExeFile[end] == 0 { - break - } - end++ - } - - return &WindowsProcess{ - pid: int(e.ProcessID), - ppid: int(e.ParentProcessID), - exe: syscall.UTF16ToString(e.ExeFile[:end]), - } -} - -func findProcess(pid int) (Process, error) { - ps, err := processes() - if err != nil { - return nil, err - } - - for _, p := range ps { - if p.Pid() == pid { - return p, nil - } - } - - return nil, nil -} - -func processes() ([]Process, error) { - handle, _, _ := procCreateToolhelp32Snapshot.Call( - 0x00000002, - 0) - if handle < 0 { - return nil, syscall.GetLastError() - } - defer procCloseHandle.Call(handle) - - var entry PROCESSENTRY32 - entry.Size = uint32(unsafe.Sizeof(entry)) - ret, _, _ := procProcess32First.Call(handle, uintptr(unsafe.Pointer(&entry))) - if ret == 0 { - return nil, fmt.Errorf("Error retrieving process info.") - } - - results := make([]Process, 0, 50) - for { - results = append(results, newWindowsProcess(&entry)) - - ret, _, _ := procProcess32Next.Call(handle, uintptr(unsafe.Pointer(&entry))) - if ret == 0 { - break - } - } - - return results, nil -} diff --git a/vendor/github.com/pkg/errors/LICENSE b/vendor/github.com/pkg/errors/LICENSE deleted file mode 100644 index 835ba3e755c..00000000000 --- a/vendor/github.com/pkg/errors/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2015, Dave Cheney -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/pkg/errors/errors.go b/vendor/github.com/pkg/errors/errors.go deleted file mode 100644 index 7421f326ffe..00000000000 --- a/vendor/github.com/pkg/errors/errors.go +++ /dev/null @@ -1,282 +0,0 @@ -// Package errors provides simple error handling primitives. -// -// The traditional error handling idiom in Go is roughly akin to -// -// if err != nil { -// return err -// } -// -// which when applied recursively up the call stack results in error reports -// without context or debugging information. The errors package allows -// programmers to add context to the failure path in their code in a way -// that does not destroy the original value of the error. -// -// Adding context to an error -// -// The errors.Wrap function returns a new error that adds context to the -// original error by recording a stack trace at the point Wrap is called, -// together with the supplied message. For example -// -// _, err := ioutil.ReadAll(r) -// if err != nil { -// return errors.Wrap(err, "read failed") -// } -// -// If additional control is required, the errors.WithStack and -// errors.WithMessage functions destructure errors.Wrap into its component -// operations: annotating an error with a stack trace and with a message, -// respectively. -// -// Retrieving the cause of an error -// -// Using errors.Wrap constructs a stack of errors, adding context to the -// preceding error. Depending on the nature of the error it may be necessary -// to reverse the operation of errors.Wrap to retrieve the original error -// for inspection. Any error value which implements this interface -// -// type causer interface { -// Cause() error -// } -// -// can be inspected by errors.Cause. errors.Cause will recursively retrieve -// the topmost error that does not implement causer, which is assumed to be -// the original cause. For example: -// -// switch err := errors.Cause(err).(type) { -// case *MyError: -// // handle specifically -// default: -// // unknown error -// } -// -// Although the causer interface is not exported by this package, it is -// considered a part of its stable public interface. -// -// Formatted printing of errors -// -// All error values returned from this package implement fmt.Formatter and can -// be formatted by the fmt package. The following verbs are supported: -// -// %s print the error. If the error has a Cause it will be -// printed recursively. -// %v see %s -// %+v extended format. Each Frame of the error's StackTrace will -// be printed in detail. -// -// Retrieving the stack trace of an error or wrapper -// -// New, Errorf, Wrap, and Wrapf record a stack trace at the point they are -// invoked. This information can be retrieved with the following interface: -// -// type stackTracer interface { -// StackTrace() errors.StackTrace -// } -// -// The returned errors.StackTrace type is defined as -// -// type StackTrace []Frame -// -// The Frame type represents a call site in the stack trace. Frame supports -// the fmt.Formatter interface that can be used for printing information about -// the stack trace of this error. For example: -// -// if err, ok := err.(stackTracer); ok { -// for _, f := range err.StackTrace() { -// fmt.Printf("%+s:%d", f) -// } -// } -// -// Although the stackTracer interface is not exported by this package, it is -// considered a part of its stable public interface. -// -// See the documentation for Frame.Format for more details. -package errors - -import ( - "fmt" - "io" -) - -// New returns an error with the supplied message. -// New also records the stack trace at the point it was called. -func New(message string) error { - return &fundamental{ - msg: message, - stack: callers(), - } -} - -// Errorf formats according to a format specifier and returns the string -// as a value that satisfies error. -// Errorf also records the stack trace at the point it was called. -func Errorf(format string, args ...interface{}) error { - return &fundamental{ - msg: fmt.Sprintf(format, args...), - stack: callers(), - } -} - -// fundamental is an error that has a message and a stack, but no caller. -type fundamental struct { - msg string - *stack -} - -func (f *fundamental) Error() string { return f.msg } - -func (f *fundamental) Format(s fmt.State, verb rune) { - switch verb { - case 'v': - if s.Flag('+') { - io.WriteString(s, f.msg) - f.stack.Format(s, verb) - return - } - fallthrough - case 's': - io.WriteString(s, f.msg) - case 'q': - fmt.Fprintf(s, "%q", f.msg) - } -} - -// WithStack annotates err with a stack trace at the point WithStack was called. -// If err is nil, WithStack returns nil. -func WithStack(err error) error { - if err == nil { - return nil - } - return &withStack{ - err, - callers(), - } -} - -type withStack struct { - error - *stack -} - -func (w *withStack) Cause() error { return w.error } - -func (w *withStack) Format(s fmt.State, verb rune) { - switch verb { - case 'v': - if s.Flag('+') { - fmt.Fprintf(s, "%+v", w.Cause()) - w.stack.Format(s, verb) - return - } - fallthrough - case 's': - io.WriteString(s, w.Error()) - case 'q': - fmt.Fprintf(s, "%q", w.Error()) - } -} - -// Wrap returns an error annotating err with a stack trace -// at the point Wrap is called, and the supplied message. -// If err is nil, Wrap returns nil. -func Wrap(err error, message string) error { - if err == nil { - return nil - } - err = &withMessage{ - cause: err, - msg: message, - } - return &withStack{ - err, - callers(), - } -} - -// Wrapf returns an error annotating err with a stack trace -// at the point Wrapf is called, and the format specifier. -// If err is nil, Wrapf returns nil. -func Wrapf(err error, format string, args ...interface{}) error { - if err == nil { - return nil - } - err = &withMessage{ - cause: err, - msg: fmt.Sprintf(format, args...), - } - return &withStack{ - err, - callers(), - } -} - -// WithMessage annotates err with a new message. -// If err is nil, WithMessage returns nil. -func WithMessage(err error, message string) error { - if err == nil { - return nil - } - return &withMessage{ - cause: err, - msg: message, - } -} - -// WithMessagef annotates err with the format specifier. -// If err is nil, WithMessagef returns nil. -func WithMessagef(err error, format string, args ...interface{}) error { - if err == nil { - return nil - } - return &withMessage{ - cause: err, - msg: fmt.Sprintf(format, args...), - } -} - -type withMessage struct { - cause error - msg string -} - -func (w *withMessage) Error() string { return w.msg + ": " + w.cause.Error() } -func (w *withMessage) Cause() error { return w.cause } - -func (w *withMessage) Format(s fmt.State, verb rune) { - switch verb { - case 'v': - if s.Flag('+') { - fmt.Fprintf(s, "%+v\n", w.Cause()) - io.WriteString(s, w.msg) - return - } - fallthrough - case 's', 'q': - io.WriteString(s, w.Error()) - } -} - -// Cause returns the underlying cause of the error, if possible. -// An error value has a cause if it implements the following -// interface: -// -// type causer interface { -// Cause() error -// } -// -// If the error does not implement Cause, the original error will -// be returned. If the error is nil, nil will be returned without further -// investigation. -func Cause(err error) error { - type causer interface { - Cause() error - } - - for err != nil { - cause, ok := err.(causer) - if !ok { - break - } - err = cause.Cause() - } - return err -} diff --git a/vendor/github.com/pkg/errors/stack.go b/vendor/github.com/pkg/errors/stack.go deleted file mode 100644 index 2874a048cf3..00000000000 --- a/vendor/github.com/pkg/errors/stack.go +++ /dev/null @@ -1,147 +0,0 @@ -package errors - -import ( - "fmt" - "io" - "path" - "runtime" - "strings" -) - -// Frame represents a program counter inside a stack frame. -type Frame uintptr - -// pc returns the program counter for this frame; -// multiple frames may have the same PC value. -func (f Frame) pc() uintptr { return uintptr(f) - 1 } - -// file returns the full path to the file that contains the -// function for this Frame's pc. -func (f Frame) file() string { - fn := runtime.FuncForPC(f.pc()) - if fn == nil { - return "unknown" - } - file, _ := fn.FileLine(f.pc()) - return file -} - -// line returns the line number of source code of the -// function for this Frame's pc. -func (f Frame) line() int { - fn := runtime.FuncForPC(f.pc()) - if fn == nil { - return 0 - } - _, line := fn.FileLine(f.pc()) - return line -} - -// Format formats the frame according to the fmt.Formatter interface. -// -// %s source file -// %d source line -// %n function name -// %v equivalent to %s:%d -// -// Format accepts flags that alter the printing of some verbs, as follows: -// -// %+s function name and path of source file relative to the compile time -// GOPATH separated by \n\t (\n\t) -// %+v equivalent to %+s:%d -func (f Frame) Format(s fmt.State, verb rune) { - switch verb { - case 's': - switch { - case s.Flag('+'): - pc := f.pc() - fn := runtime.FuncForPC(pc) - if fn == nil { - io.WriteString(s, "unknown") - } else { - file, _ := fn.FileLine(pc) - fmt.Fprintf(s, "%s\n\t%s", fn.Name(), file) - } - default: - io.WriteString(s, path.Base(f.file())) - } - case 'd': - fmt.Fprintf(s, "%d", f.line()) - case 'n': - name := runtime.FuncForPC(f.pc()).Name() - io.WriteString(s, funcname(name)) - case 'v': - f.Format(s, 's') - io.WriteString(s, ":") - f.Format(s, 'd') - } -} - -// StackTrace is stack of Frames from innermost (newest) to outermost (oldest). -type StackTrace []Frame - -// Format formats the stack of Frames according to the fmt.Formatter interface. -// -// %s lists source files for each Frame in the stack -// %v lists the source file and line number for each Frame in the stack -// -// Format accepts flags that alter the printing of some verbs, as follows: -// -// %+v Prints filename, function, and line number for each Frame in the stack. -func (st StackTrace) Format(s fmt.State, verb rune) { - switch verb { - case 'v': - switch { - case s.Flag('+'): - for _, f := range st { - fmt.Fprintf(s, "\n%+v", f) - } - case s.Flag('#'): - fmt.Fprintf(s, "%#v", []Frame(st)) - default: - fmt.Fprintf(s, "%v", []Frame(st)) - } - case 's': - fmt.Fprintf(s, "%s", []Frame(st)) - } -} - -// stack represents a stack of program counters. -type stack []uintptr - -func (s *stack) Format(st fmt.State, verb rune) { - switch verb { - case 'v': - switch { - case st.Flag('+'): - for _, pc := range *s { - f := Frame(pc) - fmt.Fprintf(st, "\n%+v", f) - } - } - } -} - -func (s *stack) StackTrace() StackTrace { - f := make([]Frame, len(*s)) - for i := 0; i < len(f); i++ { - f[i] = Frame((*s)[i]) - } - return f -} - -func callers() *stack { - const depth = 32 - var pcs [depth]uintptr - n := runtime.Callers(3, pcs[:]) - var st stack = pcs[0:n] - return &st -} - -// funcname removes the path prefix component of a function's name reported by func.Name(). -func funcname(name string) string { - i := strings.LastIndex(name, "/") - name = name[i+1:] - i = strings.Index(name, ".") - return name[i+1:] -} diff --git a/vendor/github.com/rogpeppe/go-internal/LICENSE b/vendor/github.com/rogpeppe/go-internal/LICENSE deleted file mode 100644 index 49ea0f92882..00000000000 --- a/vendor/github.com/rogpeppe/go-internal/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2018 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/rogpeppe/go-internal/modfile/gopkgin.go b/vendor/github.com/rogpeppe/go-internal/modfile/gopkgin.go deleted file mode 100644 index c94b3848a0e..00000000000 --- a/vendor/github.com/rogpeppe/go-internal/modfile/gopkgin.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// TODO: Figure out what gopkg.in should do. - -package modfile - -import "strings" - -// ParseGopkgIn splits gopkg.in import paths into their constituent parts -func ParseGopkgIn(path string) (root, repo, major, subdir string, ok bool) { - if !strings.HasPrefix(path, "gopkg.in/") { - return - } - f := strings.Split(path, "/") - if len(f) >= 2 { - if elem, v, ok := dotV(f[1]); ok { - root = strings.Join(f[:2], "/") - repo = "github.com/go-" + elem + "/" + elem - major = v - subdir = strings.Join(f[2:], "/") - return root, repo, major, subdir, true - } - } - if len(f) >= 3 { - if elem, v, ok := dotV(f[2]); ok { - root = strings.Join(f[:3], "/") - repo = "github.com/" + f[1] + "/" + elem - major = v - subdir = strings.Join(f[3:], "/") - return root, repo, major, subdir, true - } - } - return -} - -func dotV(name string) (elem, v string, ok bool) { - i := len(name) - 1 - for i >= 0 && '0' <= name[i] && name[i] <= '9' { - i-- - } - if i <= 2 || i+1 >= len(name) || name[i-1] != '.' || name[i] != 'v' || name[i+1] == '0' && len(name) != i+2 { - return "", "", false - } - return name[:i-1], name[i:], true -} diff --git a/vendor/github.com/rogpeppe/go-internal/modfile/print.go b/vendor/github.com/rogpeppe/go-internal/modfile/print.go deleted file mode 100644 index 7b1dd8f9533..00000000000 --- a/vendor/github.com/rogpeppe/go-internal/modfile/print.go +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package modfile implements parsing and formatting for -// go.mod files. -package modfile - -import ( - "bytes" - "fmt" - "strings" -) - -func Format(f *FileSyntax) []byte { - pr := &printer{} - pr.file(f) - return pr.Bytes() -} - -// A printer collects the state during printing of a file or expression. -type printer struct { - bytes.Buffer // output buffer - comment []Comment // pending end-of-line comments - margin int // left margin (indent), a number of tabs -} - -// printf prints to the buffer. -func (p *printer) printf(format string, args ...interface{}) { - fmt.Fprintf(p, format, args...) -} - -// indent returns the position on the current line, in bytes, 0-indexed. -func (p *printer) indent() int { - b := p.Bytes() - n := 0 - for n < len(b) && b[len(b)-1-n] != '\n' { - n++ - } - return n -} - -// newline ends the current line, flushing end-of-line comments. -func (p *printer) newline() { - if len(p.comment) > 0 { - p.printf(" ") - for i, com := range p.comment { - if i > 0 { - p.trim() - p.printf("\n") - for i := 0; i < p.margin; i++ { - p.printf("\t") - } - } - p.printf("%s", strings.TrimSpace(com.Token)) - } - p.comment = p.comment[:0] - } - - p.trim() - p.printf("\n") - for i := 0; i < p.margin; i++ { - p.printf("\t") - } -} - -// trim removes trailing spaces and tabs from the current line. -func (p *printer) trim() { - // Remove trailing spaces and tabs from line we're about to end. - b := p.Bytes() - n := len(b) - for n > 0 && (b[n-1] == '\t' || b[n-1] == ' ') { - n-- - } - p.Truncate(n) -} - -// file formats the given file into the print buffer. -func (p *printer) file(f *FileSyntax) { - for _, com := range f.Before { - p.printf("%s", strings.TrimSpace(com.Token)) - p.newline() - } - - for i, stmt := range f.Stmt { - switch x := stmt.(type) { - case *CommentBlock: - // comments already handled - p.expr(x) - - default: - p.expr(x) - p.newline() - } - - for _, com := range stmt.Comment().After { - p.printf("%s", strings.TrimSpace(com.Token)) - p.newline() - } - - if i+1 < len(f.Stmt) { - p.newline() - } - } -} - -func (p *printer) expr(x Expr) { - // Emit line-comments preceding this expression. - if before := x.Comment().Before; len(before) > 0 { - // Want to print a line comment. - // Line comments must be at the current margin. - p.trim() - if p.indent() > 0 { - // There's other text on the line. Start a new line. - p.printf("\n") - } - // Re-indent to margin. - for i := 0; i < p.margin; i++ { - p.printf("\t") - } - for _, com := range before { - p.printf("%s", strings.TrimSpace(com.Token)) - p.newline() - } - } - - switch x := x.(type) { - default: - panic(fmt.Errorf("printer: unexpected type %T", x)) - - case *CommentBlock: - // done - - case *LParen: - p.printf("(") - case *RParen: - p.printf(")") - - case *Line: - sep := "" - for _, tok := range x.Token { - p.printf("%s%s", sep, tok) - sep = " " - } - - case *LineBlock: - for _, tok := range x.Token { - p.printf("%s ", tok) - } - p.expr(&x.LParen) - p.margin++ - for _, l := range x.Line { - p.newline() - p.expr(l) - } - p.margin-- - p.newline() - p.expr(&x.RParen) - } - - // Queue end-of-line comments for printing when we - // reach the end of the line. - p.comment = append(p.comment, x.Comment().Suffix...) -} diff --git a/vendor/github.com/rogpeppe/go-internal/modfile/read.go b/vendor/github.com/rogpeppe/go-internal/modfile/read.go deleted file mode 100644 index 1d81ff1ab7a..00000000000 --- a/vendor/github.com/rogpeppe/go-internal/modfile/read.go +++ /dev/null @@ -1,869 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Module file parser. -// This is a simplified copy of Google's buildifier parser. - -package modfile - -import ( - "bytes" - "fmt" - "os" - "strconv" - "strings" - "unicode" - "unicode/utf8" -) - -// A Position describes the position between two bytes of input. -type Position struct { - Line int // line in input (starting at 1) - LineRune int // rune in line (starting at 1) - Byte int // byte in input (starting at 0) -} - -// add returns the position at the end of s, assuming it starts at p. -func (p Position) add(s string) Position { - p.Byte += len(s) - if n := strings.Count(s, "\n"); n > 0 { - p.Line += n - s = s[strings.LastIndex(s, "\n")+1:] - p.LineRune = 1 - } - p.LineRune += utf8.RuneCountInString(s) - return p -} - -// An Expr represents an input element. -type Expr interface { - // Span returns the start and end position of the expression, - // excluding leading or trailing comments. - Span() (start, end Position) - - // Comment returns the comments attached to the expression. - // This method would normally be named 'Comments' but that - // would interfere with embedding a type of the same name. - Comment() *Comments -} - -// A Comment represents a single // comment. -type Comment struct { - Start Position - Token string // without trailing newline - Suffix bool // an end of line (not whole line) comment -} - -// Comments collects the comments associated with an expression. -type Comments struct { - Before []Comment // whole-line comments before this expression - Suffix []Comment // end-of-line comments after this expression - - // For top-level expressions only, After lists whole-line - // comments following the expression. - After []Comment -} - -// Comment returns the receiver. This isn't useful by itself, but -// a Comments struct is embedded into all the expression -// implementation types, and this gives each of those a Comment -// method to satisfy the Expr interface. -func (c *Comments) Comment() *Comments { - return c -} - -// A FileSyntax represents an entire go.mod file. -type FileSyntax struct { - Name string // file path - Comments - Stmt []Expr -} - -func (x *FileSyntax) Span() (start, end Position) { - if len(x.Stmt) == 0 { - return - } - start, _ = x.Stmt[0].Span() - _, end = x.Stmt[len(x.Stmt)-1].Span() - return start, end -} - -func (x *FileSyntax) addLine(hint Expr, tokens ...string) *Line { - if hint == nil { - // If no hint given, add to the last statement of the given type. - Loop: - for i := len(x.Stmt) - 1; i >= 0; i-- { - stmt := x.Stmt[i] - switch stmt := stmt.(type) { - case *Line: - if stmt.Token != nil && stmt.Token[0] == tokens[0] { - hint = stmt - break Loop - } - case *LineBlock: - if stmt.Token[0] == tokens[0] { - hint = stmt - break Loop - } - } - } - } - - if hint != nil { - for i, stmt := range x.Stmt { - switch stmt := stmt.(type) { - case *Line: - if stmt == hint { - // Convert line to line block. - stmt.InBlock = true - block := &LineBlock{Token: stmt.Token[:1], Line: []*Line{stmt}} - stmt.Token = stmt.Token[1:] - x.Stmt[i] = block - new := &Line{Token: tokens[1:], InBlock: true} - block.Line = append(block.Line, new) - return new - } - case *LineBlock: - if stmt == hint { - new := &Line{Token: tokens[1:], InBlock: true} - stmt.Line = append(stmt.Line, new) - return new - } - for j, line := range stmt.Line { - if line == hint { - // Add new line after hint. - stmt.Line = append(stmt.Line, nil) - copy(stmt.Line[j+2:], stmt.Line[j+1:]) - new := &Line{Token: tokens[1:], InBlock: true} - stmt.Line[j+1] = new - return new - } - } - } - } - } - - new := &Line{Token: tokens} - x.Stmt = append(x.Stmt, new) - return new -} - -func (x *FileSyntax) updateLine(line *Line, tokens ...string) { - if line.InBlock { - tokens = tokens[1:] - } - line.Token = tokens -} - -func (x *FileSyntax) removeLine(line *Line) { - line.Token = nil -} - -// Cleanup cleans up the file syntax x after any edit operations. -// To avoid quadratic behavior, removeLine marks the line as dead -// by setting line.Token = nil but does not remove it from the slice -// in which it appears. After edits have all been indicated, -// calling Cleanup cleans out the dead lines. -func (x *FileSyntax) Cleanup() { - w := 0 - for _, stmt := range x.Stmt { - switch stmt := stmt.(type) { - case *Line: - if stmt.Token == nil { - continue - } - case *LineBlock: - ww := 0 - for _, line := range stmt.Line { - if line.Token != nil { - stmt.Line[ww] = line - ww++ - } - } - if ww == 0 { - continue - } - if ww == 1 { - // Collapse block into single line. - line := &Line{ - Comments: Comments{ - Before: commentsAdd(stmt.Before, stmt.Line[0].Before), - Suffix: commentsAdd(stmt.Line[0].Suffix, stmt.Suffix), - After: commentsAdd(stmt.Line[0].After, stmt.After), - }, - Token: stringsAdd(stmt.Token, stmt.Line[0].Token), - } - x.Stmt[w] = line - w++ - continue - } - stmt.Line = stmt.Line[:ww] - } - x.Stmt[w] = stmt - w++ - } - x.Stmt = x.Stmt[:w] -} - -func commentsAdd(x, y []Comment) []Comment { - return append(x[:len(x):len(x)], y...) -} - -func stringsAdd(x, y []string) []string { - return append(x[:len(x):len(x)], y...) -} - -// A CommentBlock represents a top-level block of comments separate -// from any rule. -type CommentBlock struct { - Comments - Start Position -} - -func (x *CommentBlock) Span() (start, end Position) { - return x.Start, x.Start -} - -// A Line is a single line of tokens. -type Line struct { - Comments - Start Position - Token []string - InBlock bool - End Position -} - -func (x *Line) Span() (start, end Position) { - return x.Start, x.End -} - -// A LineBlock is a factored block of lines, like -// -// require ( -// "x" -// "y" -// ) -// -type LineBlock struct { - Comments - Start Position - LParen LParen - Token []string - Line []*Line - RParen RParen -} - -func (x *LineBlock) Span() (start, end Position) { - return x.Start, x.RParen.Pos.add(")") -} - -// An LParen represents the beginning of a parenthesized line block. -// It is a place to store suffix comments. -type LParen struct { - Comments - Pos Position -} - -func (x *LParen) Span() (start, end Position) { - return x.Pos, x.Pos.add(")") -} - -// An RParen represents the end of a parenthesized line block. -// It is a place to store whole-line (before) comments. -type RParen struct { - Comments - Pos Position -} - -func (x *RParen) Span() (start, end Position) { - return x.Pos, x.Pos.add(")") -} - -// An input represents a single input file being parsed. -type input struct { - // Lexing state. - filename string // name of input file, for errors - complete []byte // entire input - remaining []byte // remaining input - token []byte // token being scanned - lastToken string // most recently returned token, for error messages - pos Position // current input position - comments []Comment // accumulated comments - endRule int // position of end of current rule - - // Parser state. - file *FileSyntax // returned top-level syntax tree - parseError error // error encountered during parsing - - // Comment assignment state. - pre []Expr // all expressions, in preorder traversal - post []Expr // all expressions, in postorder traversal -} - -func newInput(filename string, data []byte) *input { - return &input{ - filename: filename, - complete: data, - remaining: data, - pos: Position{Line: 1, LineRune: 1, Byte: 0}, - } -} - -// parse parses the input file. -func parse(file string, data []byte) (f *FileSyntax, err error) { - in := newInput(file, data) - // The parser panics for both routine errors like syntax errors - // and for programmer bugs like array index errors. - // Turn both into error returns. Catching bug panics is - // especially important when processing many files. - defer func() { - if e := recover(); e != nil { - if e == in.parseError { - err = in.parseError - } else { - err = fmt.Errorf("%s:%d:%d: internal error: %v", in.filename, in.pos.Line, in.pos.LineRune, e) - } - } - }() - - // Invoke the parser. - in.parseFile() - if in.parseError != nil { - return nil, in.parseError - } - in.file.Name = in.filename - - // Assign comments to nearby syntax. - in.assignComments() - - return in.file, nil -} - -// Error is called to report an error. -// The reason s is often "syntax error". -// Error does not return: it panics. -func (in *input) Error(s string) { - if s == "syntax error" && in.lastToken != "" { - s += " near " + in.lastToken - } - in.parseError = fmt.Errorf("%s:%d:%d: %v", in.filename, in.pos.Line, in.pos.LineRune, s) - panic(in.parseError) -} - -// eof reports whether the input has reached end of file. -func (in *input) eof() bool { - return len(in.remaining) == 0 -} - -// peekRune returns the next rune in the input without consuming it. -func (in *input) peekRune() int { - if len(in.remaining) == 0 { - return 0 - } - r, _ := utf8.DecodeRune(in.remaining) - return int(r) -} - -// peekPrefix reports whether the remaining input begins with the given prefix. -func (in *input) peekPrefix(prefix string) bool { - // This is like bytes.HasPrefix(in.remaining, []byte(prefix)) - // but without the allocation of the []byte copy of prefix. - for i := 0; i < len(prefix); i++ { - if i >= len(in.remaining) || in.remaining[i] != prefix[i] { - return false - } - } - return true -} - -// readRune consumes and returns the next rune in the input. -func (in *input) readRune() int { - if len(in.remaining) == 0 { - in.Error("internal lexer error: readRune at EOF") - } - r, size := utf8.DecodeRune(in.remaining) - in.remaining = in.remaining[size:] - if r == '\n' { - in.pos.Line++ - in.pos.LineRune = 1 - } else { - in.pos.LineRune++ - } - in.pos.Byte += size - return int(r) -} - -type symType struct { - pos Position - endPos Position - text string -} - -// startToken marks the beginning of the next input token. -// It must be followed by a call to endToken, once the token has -// been consumed using readRune. -func (in *input) startToken(sym *symType) { - in.token = in.remaining - sym.text = "" - sym.pos = in.pos -} - -// endToken marks the end of an input token. -// It records the actual token string in sym.text if the caller -// has not done that already. -func (in *input) endToken(sym *symType) { - if sym.text == "" { - tok := string(in.token[:len(in.token)-len(in.remaining)]) - sym.text = tok - in.lastToken = sym.text - } - sym.endPos = in.pos -} - -// lex is called from the parser to obtain the next input token. -// It returns the token value (either a rune like '+' or a symbolic token _FOR) -// and sets val to the data associated with the token. -// For all our input tokens, the associated data is -// val.Pos (the position where the token begins) -// and val.Token (the input string corresponding to the token). -func (in *input) lex(sym *symType) int { - // Skip past spaces, stopping at non-space or EOF. - countNL := 0 // number of newlines we've skipped past - for !in.eof() { - // Skip over spaces. Count newlines so we can give the parser - // information about where top-level blank lines are, - // for top-level comment assignment. - c := in.peekRune() - if c == ' ' || c == '\t' || c == '\r' { - in.readRune() - continue - } - - // Comment runs to end of line. - if in.peekPrefix("//") { - in.startToken(sym) - - // Is this comment the only thing on its line? - // Find the last \n before this // and see if it's all - // spaces from there to here. - i := bytes.LastIndex(in.complete[:in.pos.Byte], []byte("\n")) - suffix := len(bytes.TrimSpace(in.complete[i+1:in.pos.Byte])) > 0 - in.readRune() - in.readRune() - - // Consume comment. - for len(in.remaining) > 0 && in.readRune() != '\n' { - } - in.endToken(sym) - - sym.text = strings.TrimRight(sym.text, "\n") - in.lastToken = "comment" - - // If we are at top level (not in a statement), hand the comment to - // the parser as a _COMMENT token. The grammar is written - // to handle top-level comments itself. - if !suffix { - // Not in a statement. Tell parser about top-level comment. - return _COMMENT - } - - // Otherwise, save comment for later attachment to syntax tree. - if countNL > 1 { - in.comments = append(in.comments, Comment{sym.pos, "", false}) - } - in.comments = append(in.comments, Comment{sym.pos, sym.text, suffix}) - countNL = 1 - return _EOL - } - - if in.peekPrefix("/*") { - in.Error(fmt.Sprintf("mod files must use // comments (not /* */ comments)")) - } - - // Found non-space non-comment. - break - } - - // Found the beginning of the next token. - in.startToken(sym) - defer in.endToken(sym) - - // End of file. - if in.eof() { - in.lastToken = "EOF" - return _EOF - } - - // Punctuation tokens. - switch c := in.peekRune(); c { - case '\n': - in.readRune() - return c - - case '(': - in.readRune() - return c - - case ')': - in.readRune() - return c - - case '"', '`': // quoted string - quote := c - in.readRune() - for { - if in.eof() { - in.pos = sym.pos - in.Error("unexpected EOF in string") - } - if in.peekRune() == '\n' { - in.Error("unexpected newline in string") - } - c := in.readRune() - if c == quote { - break - } - if c == '\\' && quote != '`' { - if in.eof() { - in.pos = sym.pos - in.Error("unexpected EOF in string") - } - in.readRune() - } - } - in.endToken(sym) - return _STRING - } - - // Checked all punctuation. Must be identifier token. - if c := in.peekRune(); !isIdent(c) { - in.Error(fmt.Sprintf("unexpected input character %#q", c)) - } - - // Scan over identifier. - for isIdent(in.peekRune()) { - if in.peekPrefix("//") { - break - } - if in.peekPrefix("/*") { - in.Error(fmt.Sprintf("mod files must use // comments (not /* */ comments)")) - } - in.readRune() - } - return _IDENT -} - -// isIdent reports whether c is an identifier rune. -// We treat nearly all runes as identifier runes. -func isIdent(c int) bool { - return c != 0 && !unicode.IsSpace(rune(c)) -} - -// Comment assignment. -// We build two lists of all subexpressions, preorder and postorder. -// The preorder list is ordered by start location, with outer expressions first. -// The postorder list is ordered by end location, with outer expressions last. -// We use the preorder list to assign each whole-line comment to the syntax -// immediately following it, and we use the postorder list to assign each -// end-of-line comment to the syntax immediately preceding it. - -// order walks the expression adding it and its subexpressions to the -// preorder and postorder lists. -func (in *input) order(x Expr) { - if x != nil { - in.pre = append(in.pre, x) - } - switch x := x.(type) { - default: - panic(fmt.Errorf("order: unexpected type %T", x)) - case nil: - // nothing - case *LParen, *RParen: - // nothing - case *CommentBlock: - // nothing - case *Line: - // nothing - case *FileSyntax: - for _, stmt := range x.Stmt { - in.order(stmt) - } - case *LineBlock: - in.order(&x.LParen) - for _, l := range x.Line { - in.order(l) - } - in.order(&x.RParen) - } - if x != nil { - in.post = append(in.post, x) - } -} - -// assignComments attaches comments to nearby syntax. -func (in *input) assignComments() { - const debug = false - - // Generate preorder and postorder lists. - in.order(in.file) - - // Split into whole-line comments and suffix comments. - var line, suffix []Comment - for _, com := range in.comments { - if com.Suffix { - suffix = append(suffix, com) - } else { - line = append(line, com) - } - } - - if debug { - for _, c := range line { - fmt.Fprintf(os.Stderr, "LINE %q :%d:%d #%d\n", c.Token, c.Start.Line, c.Start.LineRune, c.Start.Byte) - } - } - - // Assign line comments to syntax immediately following. - for _, x := range in.pre { - start, _ := x.Span() - if debug { - fmt.Printf("pre %T :%d:%d #%d\n", x, start.Line, start.LineRune, start.Byte) - } - xcom := x.Comment() - for len(line) > 0 && start.Byte >= line[0].Start.Byte { - if debug { - fmt.Fprintf(os.Stderr, "ASSIGN LINE %q #%d\n", line[0].Token, line[0].Start.Byte) - } - xcom.Before = append(xcom.Before, line[0]) - line = line[1:] - } - } - - // Remaining line comments go at end of file. - in.file.After = append(in.file.After, line...) - - if debug { - for _, c := range suffix { - fmt.Fprintf(os.Stderr, "SUFFIX %q :%d:%d #%d\n", c.Token, c.Start.Line, c.Start.LineRune, c.Start.Byte) - } - } - - // Assign suffix comments to syntax immediately before. - for i := len(in.post) - 1; i >= 0; i-- { - x := in.post[i] - - start, end := x.Span() - if debug { - fmt.Printf("post %T :%d:%d #%d :%d:%d #%d\n", x, start.Line, start.LineRune, start.Byte, end.Line, end.LineRune, end.Byte) - } - - // Do not assign suffix comments to end of line block or whole file. - // Instead assign them to the last element inside. - switch x.(type) { - case *FileSyntax: - continue - } - - // Do not assign suffix comments to something that starts - // on an earlier line, so that in - // - // x ( y - // z ) // comment - // - // we assign the comment to z and not to x ( ... ). - if start.Line != end.Line { - continue - } - xcom := x.Comment() - for len(suffix) > 0 && end.Byte <= suffix[len(suffix)-1].Start.Byte { - if debug { - fmt.Fprintf(os.Stderr, "ASSIGN SUFFIX %q #%d\n", suffix[len(suffix)-1].Token, suffix[len(suffix)-1].Start.Byte) - } - xcom.Suffix = append(xcom.Suffix, suffix[len(suffix)-1]) - suffix = suffix[:len(suffix)-1] - } - } - - // We assigned suffix comments in reverse. - // If multiple suffix comments were appended to the same - // expression node, they are now in reverse. Fix that. - for _, x := range in.post { - reverseComments(x.Comment().Suffix) - } - - // Remaining suffix comments go at beginning of file. - in.file.Before = append(in.file.Before, suffix...) -} - -// reverseComments reverses the []Comment list. -func reverseComments(list []Comment) { - for i, j := 0, len(list)-1; i < j; i, j = i+1, j-1 { - list[i], list[j] = list[j], list[i] - } -} - -func (in *input) parseFile() { - in.file = new(FileSyntax) - var sym symType - var cb *CommentBlock - for { - tok := in.lex(&sym) - switch tok { - case '\n': - if cb != nil { - in.file.Stmt = append(in.file.Stmt, cb) - cb = nil - } - case _COMMENT: - if cb == nil { - cb = &CommentBlock{Start: sym.pos} - } - com := cb.Comment() - com.Before = append(com.Before, Comment{Start: sym.pos, Token: sym.text}) - case _EOF: - if cb != nil { - in.file.Stmt = append(in.file.Stmt, cb) - } - return - default: - in.parseStmt(&sym) - if cb != nil { - in.file.Stmt[len(in.file.Stmt)-1].Comment().Before = cb.Before - cb = nil - } - } - } -} - -func (in *input) parseStmt(sym *symType) { - start := sym.pos - end := sym.endPos - token := []string{sym.text} - for { - tok := in.lex(sym) - switch tok { - case '\n', _EOF, _EOL: - in.file.Stmt = append(in.file.Stmt, &Line{ - Start: start, - Token: token, - End: end, - }) - return - case '(': - in.file.Stmt = append(in.file.Stmt, in.parseLineBlock(start, token, sym)) - return - default: - token = append(token, sym.text) - end = sym.endPos - } - } -} - -func (in *input) parseLineBlock(start Position, token []string, sym *symType) *LineBlock { - x := &LineBlock{ - Start: start, - Token: token, - LParen: LParen{Pos: sym.pos}, - } - var comments []Comment - for { - tok := in.lex(sym) - switch tok { - case _EOL: - // ignore - case '\n': - if len(comments) == 0 && len(x.Line) > 0 || len(comments) > 0 && comments[len(comments)-1].Token != "" { - comments = append(comments, Comment{}) - } - case _COMMENT: - comments = append(comments, Comment{Start: sym.pos, Token: sym.text}) - case _EOF: - in.Error(fmt.Sprintf("syntax error (unterminated block started at %s:%d:%d)", in.filename, x.Start.Line, x.Start.LineRune)) - case ')': - x.RParen.Before = comments - x.RParen.Pos = sym.pos - tok = in.lex(sym) - if tok != '\n' && tok != _EOF && tok != _EOL { - in.Error("syntax error (expected newline after closing paren)") - } - return x - default: - l := in.parseLine(sym) - x.Line = append(x.Line, l) - l.Comment().Before = comments - comments = nil - } - } -} - -func (in *input) parseLine(sym *symType) *Line { - start := sym.pos - end := sym.endPos - token := []string{sym.text} - for { - tok := in.lex(sym) - switch tok { - case '\n', _EOF, _EOL: - return &Line{ - Start: start, - Token: token, - End: end, - InBlock: true, - } - default: - token = append(token, sym.text) - end = sym.endPos - } - } -} - -const ( - _EOF = -(1 + iota) - _EOL - _IDENT - _STRING - _COMMENT -) - -var ( - slashSlash = []byte("//") - moduleStr = []byte("module") -) - -// ModulePath returns the module path from the gomod file text. -// If it cannot find a module path, it returns an empty string. -// It is tolerant of unrelated problems in the go.mod file. -func ModulePath(mod []byte) string { - for len(mod) > 0 { - line := mod - mod = nil - if i := bytes.IndexByte(line, '\n'); i >= 0 { - line, mod = line[:i], line[i+1:] - } - if i := bytes.Index(line, slashSlash); i >= 0 { - line = line[:i] - } - line = bytes.TrimSpace(line) - if !bytes.HasPrefix(line, moduleStr) { - continue - } - line = line[len(moduleStr):] - n := len(line) - line = bytes.TrimSpace(line) - if len(line) == n || len(line) == 0 { - continue - } - - if line[0] == '"' || line[0] == '`' { - p, err := strconv.Unquote(string(line)) - if err != nil { - return "" // malformed quoted string or multiline module path - } - return p - } - - return string(line) - } - return "" // missing module path -} diff --git a/vendor/github.com/rogpeppe/go-internal/modfile/rule.go b/vendor/github.com/rogpeppe/go-internal/modfile/rule.go deleted file mode 100644 index 24d275f12f2..00000000000 --- a/vendor/github.com/rogpeppe/go-internal/modfile/rule.go +++ /dev/null @@ -1,724 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package modfile - -import ( - "bytes" - "errors" - "fmt" - "path/filepath" - "regexp" - "sort" - "strconv" - "strings" - "unicode" - - "github.com/rogpeppe/go-internal/module" - "github.com/rogpeppe/go-internal/semver" -) - -// A File is the parsed, interpreted form of a go.mod file. -type File struct { - Module *Module - Go *Go - Require []*Require - Exclude []*Exclude - Replace []*Replace - - Syntax *FileSyntax -} - -// A Module is the module statement. -type Module struct { - Mod module.Version - Syntax *Line -} - -// A Go is the go statement. -type Go struct { - Version string // "1.23" - Syntax *Line -} - -// A Require is a single require statement. -type Require struct { - Mod module.Version - Indirect bool // has "// indirect" comment - Syntax *Line -} - -// An Exclude is a single exclude statement. -type Exclude struct { - Mod module.Version - Syntax *Line -} - -// A Replace is a single replace statement. -type Replace struct { - Old module.Version - New module.Version - Syntax *Line -} - -func (f *File) AddModuleStmt(path string) error { - if f.Syntax == nil { - f.Syntax = new(FileSyntax) - } - if f.Module == nil { - f.Module = &Module{ - Mod: module.Version{Path: path}, - Syntax: f.Syntax.addLine(nil, "module", AutoQuote(path)), - } - } else { - f.Module.Mod.Path = path - f.Syntax.updateLine(f.Module.Syntax, "module", AutoQuote(path)) - } - return nil -} - -func (f *File) AddComment(text string) { - if f.Syntax == nil { - f.Syntax = new(FileSyntax) - } - f.Syntax.Stmt = append(f.Syntax.Stmt, &CommentBlock{ - Comments: Comments{ - Before: []Comment{ - { - Token: text, - }, - }, - }, - }) -} - -type VersionFixer func(path, version string) (string, error) - -// Parse parses the data, reported in errors as being from file, -// into a File struct. It applies fix, if non-nil, to canonicalize all module versions found. -func Parse(file string, data []byte, fix VersionFixer) (*File, error) { - return parseToFile(file, data, fix, true) -} - -// ParseLax is like Parse but ignores unknown statements. -// It is used when parsing go.mod files other than the main module, -// under the theory that most statement types we add in the future will -// only apply in the main module, like exclude and replace, -// and so we get better gradual deployments if old go commands -// simply ignore those statements when found in go.mod files -// in dependencies. -func ParseLax(file string, data []byte, fix VersionFixer) (*File, error) { - return parseToFile(file, data, fix, false) -} - -func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (*File, error) { - fs, err := parse(file, data) - if err != nil { - return nil, err - } - f := &File{ - Syntax: fs, - } - - var errs bytes.Buffer - for _, x := range fs.Stmt { - switch x := x.(type) { - case *Line: - f.add(&errs, x, x.Token[0], x.Token[1:], fix, strict) - - case *LineBlock: - if len(x.Token) > 1 { - if strict { - fmt.Fprintf(&errs, "%s:%d: unknown block type: %s\n", file, x.Start.Line, strings.Join(x.Token, " ")) - } - continue - } - switch x.Token[0] { - default: - if strict { - fmt.Fprintf(&errs, "%s:%d: unknown block type: %s\n", file, x.Start.Line, strings.Join(x.Token, " ")) - } - continue - case "module", "require", "exclude", "replace": - for _, l := range x.Line { - f.add(&errs, l, x.Token[0], l.Token, fix, strict) - } - } - } - } - - if errs.Len() > 0 { - return nil, errors.New(strings.TrimRight(errs.String(), "\n")) - } - return f, nil -} - -var goVersionRE = regexp.MustCompile(`([1-9][0-9]*)\.(0|[1-9][0-9]*)`) - -func (f *File) add(errs *bytes.Buffer, line *Line, verb string, args []string, fix VersionFixer, strict bool) { - // If strict is false, this module is a dependency. - // We ignore all unknown directives as well as main-module-only - // directives like replace and exclude. It will work better for - // forward compatibility if we can depend on modules that have unknown - // statements (presumed relevant only when acting as the main module) - // and simply ignore those statements. - if !strict { - switch verb { - case "module", "require", "go": - // want these even for dependency go.mods - default: - return - } - } - - switch verb { - default: - fmt.Fprintf(errs, "%s:%d: unknown directive: %s\n", f.Syntax.Name, line.Start.Line, verb) - - case "go": - if f.Go != nil { - fmt.Fprintf(errs, "%s:%d: repeated go statement\n", f.Syntax.Name, line.Start.Line) - return - } - if len(args) != 1 || !goVersionRE.MatchString(args[0]) { - fmt.Fprintf(errs, "%s:%d: usage: go 1.23\n", f.Syntax.Name, line.Start.Line) - return - } - f.Go = &Go{Syntax: line} - f.Go.Version = args[0] - case "module": - if f.Module != nil { - fmt.Fprintf(errs, "%s:%d: repeated module statement\n", f.Syntax.Name, line.Start.Line) - return - } - f.Module = &Module{Syntax: line} - if len(args) != 1 { - - fmt.Fprintf(errs, "%s:%d: usage: module module/path [version]\n", f.Syntax.Name, line.Start.Line) - return - } - s, err := parseString(&args[0]) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid quoted string: %v\n", f.Syntax.Name, line.Start.Line, err) - return - } - f.Module.Mod = module.Version{Path: s} - case "require", "exclude": - if len(args) != 2 { - fmt.Fprintf(errs, "%s:%d: usage: %s module/path v1.2.3\n", f.Syntax.Name, line.Start.Line, verb) - return - } - s, err := parseString(&args[0]) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid quoted string: %v\n", f.Syntax.Name, line.Start.Line, err) - return - } - old := args[1] - v, err := parseVersion(s, &args[1], fix) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid module version %q: %v\n", f.Syntax.Name, line.Start.Line, old, err) - return - } - pathMajor, err := modulePathMajor(s) - if err != nil { - fmt.Fprintf(errs, "%s:%d: %v\n", f.Syntax.Name, line.Start.Line, err) - return - } - if !module.MatchPathMajor(v, pathMajor) { - if pathMajor == "" { - pathMajor = "v0 or v1" - } - fmt.Fprintf(errs, "%s:%d: invalid module: %s should be %s, not %s (%s)\n", f.Syntax.Name, line.Start.Line, s, pathMajor, semver.Major(v), v) - return - } - if verb == "require" { - f.Require = append(f.Require, &Require{ - Mod: module.Version{Path: s, Version: v}, - Syntax: line, - Indirect: isIndirect(line), - }) - } else { - f.Exclude = append(f.Exclude, &Exclude{ - Mod: module.Version{Path: s, Version: v}, - Syntax: line, - }) - } - case "replace": - arrow := 2 - if len(args) >= 2 && args[1] == "=>" { - arrow = 1 - } - if len(args) < arrow+2 || len(args) > arrow+3 || args[arrow] != "=>" { - fmt.Fprintf(errs, "%s:%d: usage: %s module/path [v1.2.3] => other/module v1.4\n\t or %s module/path [v1.2.3] => ../local/directory\n", f.Syntax.Name, line.Start.Line, verb, verb) - return - } - s, err := parseString(&args[0]) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid quoted string: %v\n", f.Syntax.Name, line.Start.Line, err) - return - } - pathMajor, err := modulePathMajor(s) - if err != nil { - fmt.Fprintf(errs, "%s:%d: %v\n", f.Syntax.Name, line.Start.Line, err) - return - } - var v string - if arrow == 2 { - old := args[1] - v, err = parseVersion(s, &args[1], fix) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid module version %v: %v\n", f.Syntax.Name, line.Start.Line, old, err) - return - } - if !module.MatchPathMajor(v, pathMajor) { - if pathMajor == "" { - pathMajor = "v0 or v1" - } - fmt.Fprintf(errs, "%s:%d: invalid module: %s should be %s, not %s (%s)\n", f.Syntax.Name, line.Start.Line, s, pathMajor, semver.Major(v), v) - return - } - } - ns, err := parseString(&args[arrow+1]) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid quoted string: %v\n", f.Syntax.Name, line.Start.Line, err) - return - } - nv := "" - if len(args) == arrow+2 { - if !IsDirectoryPath(ns) { - fmt.Fprintf(errs, "%s:%d: replacement module without version must be directory path (rooted or starting with ./ or ../)\n", f.Syntax.Name, line.Start.Line) - return - } - if filepath.Separator == '/' && strings.Contains(ns, `\`) { - fmt.Fprintf(errs, "%s:%d: replacement directory appears to be Windows path (on a non-windows system)\n", f.Syntax.Name, line.Start.Line) - return - } - } - if len(args) == arrow+3 { - old := args[arrow+1] - nv, err = parseVersion(ns, &args[arrow+2], fix) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid module version %v: %v\n", f.Syntax.Name, line.Start.Line, old, err) - return - } - if IsDirectoryPath(ns) { - fmt.Fprintf(errs, "%s:%d: replacement module directory path %q cannot have version\n", f.Syntax.Name, line.Start.Line, ns) - return - } - } - f.Replace = append(f.Replace, &Replace{ - Old: module.Version{Path: s, Version: v}, - New: module.Version{Path: ns, Version: nv}, - Syntax: line, - }) - } -} - -// isIndirect reports whether line has a "// indirect" comment, -// meaning it is in go.mod only for its effect on indirect dependencies, -// so that it can be dropped entirely once the effective version of the -// indirect dependency reaches the given minimum version. -func isIndirect(line *Line) bool { - if len(line.Suffix) == 0 { - return false - } - f := strings.Fields(line.Suffix[0].Token) - return (len(f) == 2 && f[1] == "indirect" || len(f) > 2 && f[1] == "indirect;") && f[0] == "//" -} - -// setIndirect sets line to have (or not have) a "// indirect" comment. -func setIndirect(line *Line, indirect bool) { - if isIndirect(line) == indirect { - return - } - if indirect { - // Adding comment. - if len(line.Suffix) == 0 { - // New comment. - line.Suffix = []Comment{{Token: "// indirect", Suffix: true}} - return - } - // Insert at beginning of existing comment. - com := &line.Suffix[0] - space := " " - if len(com.Token) > 2 && com.Token[2] == ' ' || com.Token[2] == '\t' { - space = "" - } - com.Token = "// indirect;" + space + com.Token[2:] - return - } - - // Removing comment. - f := strings.Fields(line.Suffix[0].Token) - if len(f) == 2 { - // Remove whole comment. - line.Suffix = nil - return - } - - // Remove comment prefix. - com := &line.Suffix[0] - i := strings.Index(com.Token, "indirect;") - com.Token = "//" + com.Token[i+len("indirect;"):] -} - -// IsDirectoryPath reports whether the given path should be interpreted -// as a directory path. Just like on the go command line, relative paths -// and rooted paths are directory paths; the rest are module paths. -func IsDirectoryPath(ns string) bool { - // Because go.mod files can move from one system to another, - // we check all known path syntaxes, both Unix and Windows. - return strings.HasPrefix(ns, "./") || strings.HasPrefix(ns, "../") || strings.HasPrefix(ns, "/") || - strings.HasPrefix(ns, `.\`) || strings.HasPrefix(ns, `..\`) || strings.HasPrefix(ns, `\`) || - len(ns) >= 2 && ('A' <= ns[0] && ns[0] <= 'Z' || 'a' <= ns[0] && ns[0] <= 'z') && ns[1] == ':' -} - -// MustQuote reports whether s must be quoted in order to appear as -// a single token in a go.mod line. -func MustQuote(s string) bool { - for _, r := range s { - if !unicode.IsPrint(r) || r == ' ' || r == '"' || r == '\'' || r == '`' { - return true - } - } - return s == "" || strings.Contains(s, "//") || strings.Contains(s, "/*") -} - -// AutoQuote returns s or, if quoting is required for s to appear in a go.mod, -// the quotation of s. -func AutoQuote(s string) string { - if MustQuote(s) { - return strconv.Quote(s) - } - return s -} - -func parseString(s *string) (string, error) { - t := *s - if strings.HasPrefix(t, `"`) { - var err error - if t, err = strconv.Unquote(t); err != nil { - return "", err - } - } else if strings.ContainsAny(t, "\"'`") { - // Other quotes are reserved both for possible future expansion - // and to avoid confusion. For example if someone types 'x' - // we want that to be a syntax error and not a literal x in literal quotation marks. - return "", fmt.Errorf("unquoted string cannot contain quote") - } - *s = AutoQuote(t) - return t, nil -} - -func parseVersion(path string, s *string, fix VersionFixer) (string, error) { - t, err := parseString(s) - if err != nil { - return "", err - } - if fix != nil { - var err error - t, err = fix(path, t) - if err != nil { - return "", err - } - } - if v := module.CanonicalVersion(t); v != "" { - *s = v - return *s, nil - } - return "", fmt.Errorf("version must be of the form v1.2.3") -} - -func modulePathMajor(path string) (string, error) { - _, major, ok := module.SplitPathVersion(path) - if !ok { - return "", fmt.Errorf("invalid module path") - } - return major, nil -} - -func (f *File) Format() ([]byte, error) { - return Format(f.Syntax), nil -} - -// Cleanup cleans up the file f after any edit operations. -// To avoid quadratic behavior, modifications like DropRequire -// clear the entry but do not remove it from the slice. -// Cleanup cleans out all the cleared entries. -func (f *File) Cleanup() { - w := 0 - for _, r := range f.Require { - if r.Mod.Path != "" { - f.Require[w] = r - w++ - } - } - f.Require = f.Require[:w] - - w = 0 - for _, x := range f.Exclude { - if x.Mod.Path != "" { - f.Exclude[w] = x - w++ - } - } - f.Exclude = f.Exclude[:w] - - w = 0 - for _, r := range f.Replace { - if r.Old.Path != "" { - f.Replace[w] = r - w++ - } - } - f.Replace = f.Replace[:w] - - f.Syntax.Cleanup() -} - -func (f *File) AddRequire(path, vers string) error { - need := true - for _, r := range f.Require { - if r.Mod.Path == path { - if need { - r.Mod.Version = vers - f.Syntax.updateLine(r.Syntax, "require", AutoQuote(path), vers) - need = false - } else { - f.Syntax.removeLine(r.Syntax) - *r = Require{} - } - } - } - - if need { - f.AddNewRequire(path, vers, false) - } - return nil -} - -func (f *File) AddNewRequire(path, vers string, indirect bool) { - line := f.Syntax.addLine(nil, "require", AutoQuote(path), vers) - setIndirect(line, indirect) - f.Require = append(f.Require, &Require{module.Version{Path: path, Version: vers}, indirect, line}) -} - -func (f *File) SetRequire(req []*Require) { - need := make(map[string]string) - indirect := make(map[string]bool) - for _, r := range req { - need[r.Mod.Path] = r.Mod.Version - indirect[r.Mod.Path] = r.Indirect - } - - for _, r := range f.Require { - if v, ok := need[r.Mod.Path]; ok { - r.Mod.Version = v - r.Indirect = indirect[r.Mod.Path] - } - } - - var newStmts []Expr - for _, stmt := range f.Syntax.Stmt { - switch stmt := stmt.(type) { - case *LineBlock: - if len(stmt.Token) > 0 && stmt.Token[0] == "require" { - var newLines []*Line - for _, line := range stmt.Line { - if p, err := parseString(&line.Token[0]); err == nil && need[p] != "" { - line.Token[1] = need[p] - delete(need, p) - setIndirect(line, indirect[p]) - newLines = append(newLines, line) - } - } - if len(newLines) == 0 { - continue // drop stmt - } - stmt.Line = newLines - } - - case *Line: - if len(stmt.Token) > 0 && stmt.Token[0] == "require" { - if p, err := parseString(&stmt.Token[1]); err == nil && need[p] != "" { - stmt.Token[2] = need[p] - delete(need, p) - setIndirect(stmt, indirect[p]) - } else { - continue // drop stmt - } - } - } - newStmts = append(newStmts, stmt) - } - f.Syntax.Stmt = newStmts - - for path, vers := range need { - f.AddNewRequire(path, vers, indirect[path]) - } - f.SortBlocks() -} - -func (f *File) DropRequire(path string) error { - for _, r := range f.Require { - if r.Mod.Path == path { - f.Syntax.removeLine(r.Syntax) - *r = Require{} - } - } - return nil -} - -func (f *File) AddExclude(path, vers string) error { - var hint *Line - for _, x := range f.Exclude { - if x.Mod.Path == path && x.Mod.Version == vers { - return nil - } - if x.Mod.Path == path { - hint = x.Syntax - } - } - - f.Exclude = append(f.Exclude, &Exclude{Mod: module.Version{Path: path, Version: vers}, Syntax: f.Syntax.addLine(hint, "exclude", AutoQuote(path), vers)}) - return nil -} - -func (f *File) DropExclude(path, vers string) error { - for _, x := range f.Exclude { - if x.Mod.Path == path && x.Mod.Version == vers { - f.Syntax.removeLine(x.Syntax) - *x = Exclude{} - } - } - return nil -} - -func (f *File) AddReplace(oldPath, oldVers, newPath, newVers string) error { - need := true - old := module.Version{Path: oldPath, Version: oldVers} - new := module.Version{Path: newPath, Version: newVers} - tokens := []string{"replace", AutoQuote(oldPath)} - if oldVers != "" { - tokens = append(tokens, oldVers) - } - tokens = append(tokens, "=>", AutoQuote(newPath)) - if newVers != "" { - tokens = append(tokens, newVers) - } - - var hint *Line - for _, r := range f.Replace { - if r.Old.Path == oldPath && (oldVers == "" || r.Old.Version == oldVers) { - if need { - // Found replacement for old; update to use new. - r.New = new - f.Syntax.updateLine(r.Syntax, tokens...) - need = false - continue - } - // Already added; delete other replacements for same. - f.Syntax.removeLine(r.Syntax) - *r = Replace{} - } - if r.Old.Path == oldPath { - hint = r.Syntax - } - } - if need { - f.Replace = append(f.Replace, &Replace{Old: old, New: new, Syntax: f.Syntax.addLine(hint, tokens...)}) - } - return nil -} - -func (f *File) DropReplace(oldPath, oldVers string) error { - for _, r := range f.Replace { - if r.Old.Path == oldPath && r.Old.Version == oldVers { - f.Syntax.removeLine(r.Syntax) - *r = Replace{} - } - } - return nil -} - -func (f *File) SortBlocks() { - f.removeDups() // otherwise sorting is unsafe - - for _, stmt := range f.Syntax.Stmt { - block, ok := stmt.(*LineBlock) - if !ok { - continue - } - sort.Slice(block.Line, func(i, j int) bool { - li := block.Line[i] - lj := block.Line[j] - for k := 0; k < len(li.Token) && k < len(lj.Token); k++ { - if li.Token[k] != lj.Token[k] { - return li.Token[k] < lj.Token[k] - } - } - return len(li.Token) < len(lj.Token) - }) - } -} - -func (f *File) removeDups() { - have := make(map[module.Version]bool) - kill := make(map[*Line]bool) - for _, x := range f.Exclude { - if have[x.Mod] { - kill[x.Syntax] = true - continue - } - have[x.Mod] = true - } - var excl []*Exclude - for _, x := range f.Exclude { - if !kill[x.Syntax] { - excl = append(excl, x) - } - } - f.Exclude = excl - - have = make(map[module.Version]bool) - // Later replacements take priority over earlier ones. - for i := len(f.Replace) - 1; i >= 0; i-- { - x := f.Replace[i] - if have[x.Old] { - kill[x.Syntax] = true - continue - } - have[x.Old] = true - } - var repl []*Replace - for _, x := range f.Replace { - if !kill[x.Syntax] { - repl = append(repl, x) - } - } - f.Replace = repl - - var stmts []Expr - for _, stmt := range f.Syntax.Stmt { - switch stmt := stmt.(type) { - case *Line: - if kill[stmt] { - continue - } - case *LineBlock: - var lines []*Line - for _, line := range stmt.Line { - if !kill[line] { - lines = append(lines, line) - } - } - stmt.Line = lines - if len(lines) == 0 { - continue - } - } - stmts = append(stmts, stmt) - } - f.Syntax.Stmt = stmts -} diff --git a/vendor/github.com/rogpeppe/go-internal/module/module.go b/vendor/github.com/rogpeppe/go-internal/module/module.go deleted file mode 100644 index 3ff6d9bf535..00000000000 --- a/vendor/github.com/rogpeppe/go-internal/module/module.go +++ /dev/null @@ -1,540 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package module defines the module.Version type -// along with support code. -package module - -// IMPORTANT NOTE -// -// This file essentially defines the set of valid import paths for the go command. -// There are many subtle considerations, including Unicode ambiguity, -// security, network, and file system representations. -// -// This file also defines the set of valid module path and version combinations, -// another topic with many subtle considerations. -// -// Changes to the semantics in this file require approval from rsc. - -import ( - "fmt" - "sort" - "strings" - "unicode" - "unicode/utf8" - - "github.com/rogpeppe/go-internal/semver" -) - -// A Version is defined by a module path and version pair. -type Version struct { - Path string - - // Version is usually a semantic version in canonical form. - // There are two exceptions to this general rule. - // First, the top-level target of a build has no specific version - // and uses Version = "". - // Second, during MVS calculations the version "none" is used - // to represent the decision to take no version of a given module. - Version string `json:",omitempty"` -} - -// Check checks that a given module path, version pair is valid. -// In addition to the path being a valid module path -// and the version being a valid semantic version, -// the two must correspond. -// For example, the path "yaml/v2" only corresponds to -// semantic versions beginning with "v2.". -func Check(path, version string) error { - if err := CheckPath(path); err != nil { - return err - } - if !semver.IsValid(version) { - return fmt.Errorf("malformed semantic version %v", version) - } - _, pathMajor, _ := SplitPathVersion(path) - if !MatchPathMajor(version, pathMajor) { - if pathMajor == "" { - pathMajor = "v0 or v1" - } - if pathMajor[0] == '.' { // .v1 - pathMajor = pathMajor[1:] - } - return fmt.Errorf("mismatched module path %v and version %v (want %v)", path, version, pathMajor) - } - return nil -} - -// firstPathOK reports whether r can appear in the first element of a module path. -// The first element of the path must be an LDH domain name, at least for now. -// To avoid case ambiguity, the domain name must be entirely lower case. -func firstPathOK(r rune) bool { - return r == '-' || r == '.' || - '0' <= r && r <= '9' || - 'a' <= r && r <= 'z' -} - -// pathOK reports whether r can appear in an import path element. -// Paths can be ASCII letters, ASCII digits, and limited ASCII punctuation: + - . _ and ~. -// This matches what "go get" has historically recognized in import paths. -// TODO(rsc): We would like to allow Unicode letters, but that requires additional -// care in the safe encoding (see note below). -func pathOK(r rune) bool { - if r < utf8.RuneSelf { - return r == '+' || r == '-' || r == '.' || r == '_' || r == '~' || - '0' <= r && r <= '9' || - 'A' <= r && r <= 'Z' || - 'a' <= r && r <= 'z' - } - return false -} - -// fileNameOK reports whether r can appear in a file name. -// For now we allow all Unicode letters but otherwise limit to pathOK plus a few more punctuation characters. -// If we expand the set of allowed characters here, we have to -// work harder at detecting potential case-folding and normalization collisions. -// See note about "safe encoding" below. -func fileNameOK(r rune) bool { - if r < utf8.RuneSelf { - // Entire set of ASCII punctuation, from which we remove characters: - // ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ - // We disallow some shell special characters: " ' * < > ? ` | - // (Note that some of those are disallowed by the Windows file system as well.) - // We also disallow path separators / : and \ (fileNameOK is only called on path element characters). - // We allow spaces (U+0020) in file names. - const allowed = "!#$%&()+,-.=@[]^_{}~ " - if '0' <= r && r <= '9' || 'A' <= r && r <= 'Z' || 'a' <= r && r <= 'z' { - return true - } - for i := 0; i < len(allowed); i++ { - if rune(allowed[i]) == r { - return true - } - } - return false - } - // It may be OK to add more ASCII punctuation here, but only carefully. - // For example Windows disallows < > \, and macOS disallows :, so we must not allow those. - return unicode.IsLetter(r) -} - -// CheckPath checks that a module path is valid. -func CheckPath(path string) error { - if err := checkPath(path, false); err != nil { - return fmt.Errorf("malformed module path %q: %v", path, err) - } - i := strings.Index(path, "/") - if i < 0 { - i = len(path) - } - if i == 0 { - return fmt.Errorf("malformed module path %q: leading slash", path) - } - if !strings.Contains(path[:i], ".") { - return fmt.Errorf("malformed module path %q: missing dot in first path element", path) - } - if path[0] == '-' { - return fmt.Errorf("malformed module path %q: leading dash in first path element", path) - } - for _, r := range path[:i] { - if !firstPathOK(r) { - return fmt.Errorf("malformed module path %q: invalid char %q in first path element", path, r) - } - } - if _, _, ok := SplitPathVersion(path); !ok { - return fmt.Errorf("malformed module path %q: invalid version", path) - } - return nil -} - -// CheckImportPath checks that an import path is valid. -func CheckImportPath(path string) error { - if err := checkPath(path, false); err != nil { - return fmt.Errorf("malformed import path %q: %v", path, err) - } - return nil -} - -// checkPath checks that a general path is valid. -// It returns an error describing why but not mentioning path. -// Because these checks apply to both module paths and import paths, -// the caller is expected to add the "malformed ___ path %q: " prefix. -// fileName indicates whether the final element of the path is a file name -// (as opposed to a directory name). -func checkPath(path string, fileName bool) error { - if !utf8.ValidString(path) { - return fmt.Errorf("invalid UTF-8") - } - if path == "" { - return fmt.Errorf("empty string") - } - if strings.Contains(path, "..") { - return fmt.Errorf("double dot") - } - if strings.Contains(path, "//") { - return fmt.Errorf("double slash") - } - if path[len(path)-1] == '/' { - return fmt.Errorf("trailing slash") - } - elemStart := 0 - for i, r := range path { - if r == '/' { - if err := checkElem(path[elemStart:i], fileName); err != nil { - return err - } - elemStart = i + 1 - } - } - if err := checkElem(path[elemStart:], fileName); err != nil { - return err - } - return nil -} - -// checkElem checks whether an individual path element is valid. -// fileName indicates whether the element is a file name (not a directory name). -func checkElem(elem string, fileName bool) error { - if elem == "" { - return fmt.Errorf("empty path element") - } - if strings.Count(elem, ".") == len(elem) { - return fmt.Errorf("invalid path element %q", elem) - } - if elem[0] == '.' && !fileName { - return fmt.Errorf("leading dot in path element") - } - if elem[len(elem)-1] == '.' { - return fmt.Errorf("trailing dot in path element") - } - charOK := pathOK - if fileName { - charOK = fileNameOK - } - for _, r := range elem { - if !charOK(r) { - return fmt.Errorf("invalid char %q", r) - } - } - - // Windows disallows a bunch of path elements, sadly. - // See https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file - short := elem - if i := strings.Index(short, "."); i >= 0 { - short = short[:i] - } - for _, bad := range badWindowsNames { - if strings.EqualFold(bad, short) { - return fmt.Errorf("disallowed path element %q", elem) - } - } - return nil -} - -// CheckFilePath checks whether a slash-separated file path is valid. -func CheckFilePath(path string) error { - if err := checkPath(path, true); err != nil { - return fmt.Errorf("malformed file path %q: %v", path, err) - } - return nil -} - -// badWindowsNames are the reserved file path elements on Windows. -// See https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file -var badWindowsNames = []string{ - "CON", - "PRN", - "AUX", - "NUL", - "COM1", - "COM2", - "COM3", - "COM4", - "COM5", - "COM6", - "COM7", - "COM8", - "COM9", - "LPT1", - "LPT2", - "LPT3", - "LPT4", - "LPT5", - "LPT6", - "LPT7", - "LPT8", - "LPT9", -} - -// SplitPathVersion returns prefix and major version such that prefix+pathMajor == path -// and version is either empty or "/vN" for N >= 2. -// As a special case, gopkg.in paths are recognized directly; -// they require ".vN" instead of "/vN", and for all N, not just N >= 2. -func SplitPathVersion(path string) (prefix, pathMajor string, ok bool) { - if strings.HasPrefix(path, "gopkg.in/") { - return splitGopkgIn(path) - } - - i := len(path) - dot := false - for i > 0 && ('0' <= path[i-1] && path[i-1] <= '9' || path[i-1] == '.') { - if path[i-1] == '.' { - dot = true - } - i-- - } - if i <= 1 || path[i-1] != 'v' || path[i-2] != '/' { - return path, "", true - } - prefix, pathMajor = path[:i-2], path[i-2:] - if dot || len(pathMajor) <= 2 || pathMajor[2] == '0' || pathMajor == "/v1" { - return path, "", false - } - return prefix, pathMajor, true -} - -// splitGopkgIn is like SplitPathVersion but only for gopkg.in paths. -func splitGopkgIn(path string) (prefix, pathMajor string, ok bool) { - if !strings.HasPrefix(path, "gopkg.in/") { - return path, "", false - } - i := len(path) - if strings.HasSuffix(path, "-unstable") { - i -= len("-unstable") - } - for i > 0 && ('0' <= path[i-1] && path[i-1] <= '9') { - i-- - } - if i <= 1 || path[i-1] != 'v' || path[i-2] != '.' { - // All gopkg.in paths must end in vN for some N. - return path, "", false - } - prefix, pathMajor = path[:i-2], path[i-2:] - if len(pathMajor) <= 2 || pathMajor[2] == '0' && pathMajor != ".v0" { - return path, "", false - } - return prefix, pathMajor, true -} - -// MatchPathMajor reports whether the semantic version v -// matches the path major version pathMajor. -func MatchPathMajor(v, pathMajor string) bool { - if strings.HasPrefix(pathMajor, ".v") && strings.HasSuffix(pathMajor, "-unstable") { - pathMajor = strings.TrimSuffix(pathMajor, "-unstable") - } - if strings.HasPrefix(v, "v0.0.0-") && pathMajor == ".v1" { - // Allow old bug in pseudo-versions that generated v0.0.0- pseudoversion for gopkg .v1. - // For example, gopkg.in/yaml.v2@v2.2.1's go.mod requires gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405. - return true - } - m := semver.Major(v) - if pathMajor == "" { - return m == "v0" || m == "v1" || semver.Build(v) == "+incompatible" - } - return (pathMajor[0] == '/' || pathMajor[0] == '.') && m == pathMajor[1:] -} - -// CanonicalVersion returns the canonical form of the version string v. -// It is the same as semver.Canonical(v) except that it preserves the special build suffix "+incompatible". -func CanonicalVersion(v string) string { - cv := semver.Canonical(v) - if semver.Build(v) == "+incompatible" { - cv += "+incompatible" - } - return cv -} - -// Sort sorts the list by Path, breaking ties by comparing Versions. -func Sort(list []Version) { - sort.Slice(list, func(i, j int) bool { - mi := list[i] - mj := list[j] - if mi.Path != mj.Path { - return mi.Path < mj.Path - } - // To help go.sum formatting, allow version/file. - // Compare semver prefix by semver rules, - // file by string order. - vi := mi.Version - vj := mj.Version - var fi, fj string - if k := strings.Index(vi, "/"); k >= 0 { - vi, fi = vi[:k], vi[k:] - } - if k := strings.Index(vj, "/"); k >= 0 { - vj, fj = vj[:k], vj[k:] - } - if vi != vj { - return semver.Compare(vi, vj) < 0 - } - return fi < fj - }) -} - -// Safe encodings -// -// Module paths appear as substrings of file system paths -// (in the download cache) and of web server URLs in the proxy protocol. -// In general we cannot rely on file systems to be case-sensitive, -// nor can we rely on web servers, since they read from file systems. -// That is, we cannot rely on the file system to keep rsc.io/QUOTE -// and rsc.io/quote separate. Windows and macOS don't. -// Instead, we must never require two different casings of a file path. -// Because we want the download cache to match the proxy protocol, -// and because we want the proxy protocol to be possible to serve -// from a tree of static files (which might be stored on a case-insensitive -// file system), the proxy protocol must never require two different casings -// of a URL path either. -// -// One possibility would be to make the safe encoding be the lowercase -// hexadecimal encoding of the actual path bytes. This would avoid ever -// needing different casings of a file path, but it would be fairly illegible -// to most programmers when those paths appeared in the file system -// (including in file paths in compiler errors and stack traces) -// in web server logs, and so on. Instead, we want a safe encoding that -// leaves most paths unaltered. -// -// The safe encoding is this: -// replace every uppercase letter with an exclamation mark -// followed by the letter's lowercase equivalent. -// -// For example, -// github.com/Azure/azure-sdk-for-go -> github.com/!azure/azure-sdk-for-go. -// github.com/GoogleCloudPlatform/cloudsql-proxy -> github.com/!google!cloud!platform/cloudsql-proxy -// github.com/Sirupsen/logrus -> github.com/!sirupsen/logrus. -// -// Import paths that avoid upper-case letters are left unchanged. -// Note that because import paths are ASCII-only and avoid various -// problematic punctuation (like : < and >), the safe encoding is also ASCII-only -// and avoids the same problematic punctuation. -// -// Import paths have never allowed exclamation marks, so there is no -// need to define how to encode a literal !. -// -// Although paths are disallowed from using Unicode (see pathOK above), -// the eventual plan is to allow Unicode letters as well, to assume that -// file systems and URLs are Unicode-safe (storing UTF-8), and apply -// the !-for-uppercase convention. Note however that not all runes that -// are different but case-fold equivalent are an upper/lower pair. -// For example, U+004B ('K'), U+006B ('k'), and U+212A ('K' for Kelvin) -// are considered to case-fold to each other. When we do add Unicode -// letters, we must not assume that upper/lower are the only case-equivalent pairs. -// Perhaps the Kelvin symbol would be disallowed entirely, for example. -// Or perhaps it would encode as "!!k", or perhaps as "(212A)". -// -// Also, it would be nice to allow Unicode marks as well as letters, -// but marks include combining marks, and then we must deal not -// only with case folding but also normalization: both U+00E9 ('é') -// and U+0065 U+0301 ('e' followed by combining acute accent) -// look the same on the page and are treated by some file systems -// as the same path. If we do allow Unicode marks in paths, there -// must be some kind of normalization to allow only one canonical -// encoding of any character used in an import path. - -// EncodePath returns the safe encoding of the given module path. -// It fails if the module path is invalid. -func EncodePath(path string) (encoding string, err error) { - if err := CheckPath(path); err != nil { - return "", err - } - - return encodeString(path) -} - -// EncodeVersion returns the safe encoding of the given module version. -// Versions are allowed to be in non-semver form but must be valid file names -// and not contain exclamation marks. -func EncodeVersion(v string) (encoding string, err error) { - if err := checkElem(v, true); err != nil || strings.Contains(v, "!") { - return "", fmt.Errorf("disallowed version string %q", v) - } - return encodeString(v) -} - -func encodeString(s string) (encoding string, err error) { - haveUpper := false - for _, r := range s { - if r == '!' || r >= utf8.RuneSelf { - // This should be disallowed by CheckPath, but diagnose anyway. - // The correctness of the encoding loop below depends on it. - return "", fmt.Errorf("internal error: inconsistency in EncodePath") - } - if 'A' <= r && r <= 'Z' { - haveUpper = true - } - } - - if !haveUpper { - return s, nil - } - - var buf []byte - for _, r := range s { - if 'A' <= r && r <= 'Z' { - buf = append(buf, '!', byte(r+'a'-'A')) - } else { - buf = append(buf, byte(r)) - } - } - return string(buf), nil -} - -// DecodePath returns the module path of the given safe encoding. -// It fails if the encoding is invalid or encodes an invalid path. -func DecodePath(encoding string) (path string, err error) { - path, ok := decodeString(encoding) - if !ok { - return "", fmt.Errorf("invalid module path encoding %q", encoding) - } - if err := CheckPath(path); err != nil { - return "", fmt.Errorf("invalid module path encoding %q: %v", encoding, err) - } - return path, nil -} - -// DecodeVersion returns the version string for the given safe encoding. -// It fails if the encoding is invalid or encodes an invalid version. -// Versions are allowed to be in non-semver form but must be valid file names -// and not contain exclamation marks. -func DecodeVersion(encoding string) (v string, err error) { - v, ok := decodeString(encoding) - if !ok { - return "", fmt.Errorf("invalid version encoding %q", encoding) - } - if err := checkElem(v, true); err != nil { - return "", fmt.Errorf("disallowed version string %q", v) - } - return v, nil -} - -func decodeString(encoding string) (string, bool) { - var buf []byte - - bang := false - for _, r := range encoding { - if r >= utf8.RuneSelf { - return "", false - } - if bang { - bang = false - if r < 'a' || 'z' < r { - return "", false - } - buf = append(buf, byte(r+'A'-'a')) - continue - } - if r == '!' { - bang = true - continue - } - if 'A' <= r && r <= 'Z' { - return "", false - } - buf = append(buf, byte(r)) - } - if bang { - return "", false - } - return string(buf), true -} diff --git a/vendor/github.com/rogpeppe/go-internal/semver/semver.go b/vendor/github.com/rogpeppe/go-internal/semver/semver.go deleted file mode 100644 index 4af7118e55d..00000000000 --- a/vendor/github.com/rogpeppe/go-internal/semver/semver.go +++ /dev/null @@ -1,388 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package semver implements comparison of semantic version strings. -// In this package, semantic version strings must begin with a leading "v", -// as in "v1.0.0". -// -// The general form of a semantic version string accepted by this package is -// -// vMAJOR[.MINOR[.PATCH[-PRERELEASE][+BUILD]]] -// -// where square brackets indicate optional parts of the syntax; -// MAJOR, MINOR, and PATCH are decimal integers without extra leading zeros; -// PRERELEASE and BUILD are each a series of non-empty dot-separated identifiers -// using only alphanumeric characters and hyphens; and -// all-numeric PRERELEASE identifiers must not have leading zeros. -// -// This package follows Semantic Versioning 2.0.0 (see semver.org) -// with two exceptions. First, it requires the "v" prefix. Second, it recognizes -// vMAJOR and vMAJOR.MINOR (with no prerelease or build suffixes) -// as shorthands for vMAJOR.0.0 and vMAJOR.MINOR.0. -package semver - -// parsed returns the parsed form of a semantic version string. -type parsed struct { - major string - minor string - patch string - short string - prerelease string - build string - err string -} - -// IsValid reports whether v is a valid semantic version string. -func IsValid(v string) bool { - _, ok := parse(v) - return ok -} - -// Canonical returns the canonical formatting of the semantic version v. -// It fills in any missing .MINOR or .PATCH and discards build metadata. -// Two semantic versions compare equal only if their canonical formattings -// are identical strings. -// The canonical invalid semantic version is the empty string. -func Canonical(v string) string { - p, ok := parse(v) - if !ok { - return "" - } - if p.build != "" { - return v[:len(v)-len(p.build)] - } - if p.short != "" { - return v + p.short - } - return v -} - -// Major returns the major version prefix of the semantic version v. -// For example, Major("v2.1.0") == "v2". -// If v is an invalid semantic version string, Major returns the empty string. -func Major(v string) string { - pv, ok := parse(v) - if !ok { - return "" - } - return v[:1+len(pv.major)] -} - -// MajorMinor returns the major.minor version prefix of the semantic version v. -// For example, MajorMinor("v2.1.0") == "v2.1". -// If v is an invalid semantic version string, MajorMinor returns the empty string. -func MajorMinor(v string) string { - pv, ok := parse(v) - if !ok { - return "" - } - i := 1 + len(pv.major) - if j := i + 1 + len(pv.minor); j <= len(v) && v[i] == '.' && v[i+1:j] == pv.minor { - return v[:j] - } - return v[:i] + "." + pv.minor -} - -// Prerelease returns the prerelease suffix of the semantic version v. -// For example, Prerelease("v2.1.0-pre+meta") == "-pre". -// If v is an invalid semantic version string, Prerelease returns the empty string. -func Prerelease(v string) string { - pv, ok := parse(v) - if !ok { - return "" - } - return pv.prerelease -} - -// Build returns the build suffix of the semantic version v. -// For example, Build("v2.1.0+meta") == "+meta". -// If v is an invalid semantic version string, Build returns the empty string. -func Build(v string) string { - pv, ok := parse(v) - if !ok { - return "" - } - return pv.build -} - -// Compare returns an integer comparing two versions according to -// according to semantic version precedence. -// The result will be 0 if v == w, -1 if v < w, or +1 if v > w. -// -// An invalid semantic version string is considered less than a valid one. -// All invalid semantic version strings compare equal to each other. -func Compare(v, w string) int { - pv, ok1 := parse(v) - pw, ok2 := parse(w) - if !ok1 && !ok2 { - return 0 - } - if !ok1 { - return -1 - } - if !ok2 { - return +1 - } - if c := compareInt(pv.major, pw.major); c != 0 { - return c - } - if c := compareInt(pv.minor, pw.minor); c != 0 { - return c - } - if c := compareInt(pv.patch, pw.patch); c != 0 { - return c - } - return comparePrerelease(pv.prerelease, pw.prerelease) -} - -// Max canonicalizes its arguments and then returns the version string -// that compares greater. -func Max(v, w string) string { - v = Canonical(v) - w = Canonical(w) - if Compare(v, w) > 0 { - return v - } - return w -} - -func parse(v string) (p parsed, ok bool) { - if v == "" || v[0] != 'v' { - p.err = "missing v prefix" - return - } - p.major, v, ok = parseInt(v[1:]) - if !ok { - p.err = "bad major version" - return - } - if v == "" { - p.minor = "0" - p.patch = "0" - p.short = ".0.0" - return - } - if v[0] != '.' { - p.err = "bad minor prefix" - ok = false - return - } - p.minor, v, ok = parseInt(v[1:]) - if !ok { - p.err = "bad minor version" - return - } - if v == "" { - p.patch = "0" - p.short = ".0" - return - } - if v[0] != '.' { - p.err = "bad patch prefix" - ok = false - return - } - p.patch, v, ok = parseInt(v[1:]) - if !ok { - p.err = "bad patch version" - return - } - if len(v) > 0 && v[0] == '-' { - p.prerelease, v, ok = parsePrerelease(v) - if !ok { - p.err = "bad prerelease" - return - } - } - if len(v) > 0 && v[0] == '+' { - p.build, v, ok = parseBuild(v) - if !ok { - p.err = "bad build" - return - } - } - if v != "" { - p.err = "junk on end" - ok = false - return - } - ok = true - return -} - -func parseInt(v string) (t, rest string, ok bool) { - if v == "" { - return - } - if v[0] < '0' || '9' < v[0] { - return - } - i := 1 - for i < len(v) && '0' <= v[i] && v[i] <= '9' { - i++ - } - if v[0] == '0' && i != 1 { - return - } - return v[:i], v[i:], true -} - -func parsePrerelease(v string) (t, rest string, ok bool) { - // "A pre-release version MAY be denoted by appending a hyphen and - // a series of dot separated identifiers immediately following the patch version. - // Identifiers MUST comprise only ASCII alphanumerics and hyphen [0-9A-Za-z-]. - // Identifiers MUST NOT be empty. Numeric identifiers MUST NOT include leading zeroes." - if v == "" || v[0] != '-' { - return - } - i := 1 - start := 1 - for i < len(v) && v[i] != '+' { - if !isIdentChar(v[i]) && v[i] != '.' { - return - } - if v[i] == '.' { - if start == i || isBadNum(v[start:i]) { - return - } - start = i + 1 - } - i++ - } - if start == i || isBadNum(v[start:i]) { - return - } - return v[:i], v[i:], true -} - -func parseBuild(v string) (t, rest string, ok bool) { - if v == "" || v[0] != '+' { - return - } - i := 1 - start := 1 - for i < len(v) { - if !isIdentChar(v[i]) { - return - } - if v[i] == '.' { - if start == i { - return - } - start = i + 1 - } - i++ - } - if start == i { - return - } - return v[:i], v[i:], true -} - -func isIdentChar(c byte) bool { - return 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' || c == '-' -} - -func isBadNum(v string) bool { - i := 0 - for i < len(v) && '0' <= v[i] && v[i] <= '9' { - i++ - } - return i == len(v) && i > 1 && v[0] == '0' -} - -func isNum(v string) bool { - i := 0 - for i < len(v) && '0' <= v[i] && v[i] <= '9' { - i++ - } - return i == len(v) -} - -func compareInt(x, y string) int { - if x == y { - return 0 - } - if len(x) < len(y) { - return -1 - } - if len(x) > len(y) { - return +1 - } - if x < y { - return -1 - } else { - return +1 - } -} - -func comparePrerelease(x, y string) int { - // "When major, minor, and patch are equal, a pre-release version has - // lower precedence than a normal version. - // Example: 1.0.0-alpha < 1.0.0. - // Precedence for two pre-release versions with the same major, minor, - // and patch version MUST be determined by comparing each dot separated - // identifier from left to right until a difference is found as follows: - // identifiers consisting of only digits are compared numerically and - // identifiers with letters or hyphens are compared lexically in ASCII - // sort order. Numeric identifiers always have lower precedence than - // non-numeric identifiers. A larger set of pre-release fields has a - // higher precedence than a smaller set, if all of the preceding - // identifiers are equal. - // Example: 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < - // 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0." - if x == y { - return 0 - } - if x == "" { - return +1 - } - if y == "" { - return -1 - } - for x != "" && y != "" { - x = x[1:] // skip - or . - y = y[1:] // skip - or . - var dx, dy string - dx, x = nextIdent(x) - dy, y = nextIdent(y) - if dx != dy { - ix := isNum(dx) - iy := isNum(dy) - if ix != iy { - if ix { - return -1 - } else { - return +1 - } - } - if ix { - if len(dx) < len(dy) { - return -1 - } - if len(dx) > len(dy) { - return +1 - } - } - if dx < dy { - return -1 - } else { - return +1 - } - } - } - if x == "" { - return -1 - } else { - return +1 - } -} - -func nextIdent(x string) (dx, rest string) { - i := 0 - for i < len(x) && x[i] != '.' { - i++ - } - return x[:i], x[i:] -} diff --git a/vendor/github.com/spf13/cobra/LICENSE.txt b/vendor/github.com/spf13/cobra/LICENSE.txt deleted file mode 100644 index 298f0e2665e..00000000000 --- a/vendor/github.com/spf13/cobra/LICENSE.txt +++ /dev/null @@ -1,174 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. diff --git a/vendor/github.com/spf13/cobra/args.go b/vendor/github.com/spf13/cobra/args.go deleted file mode 100644 index a5d8a9273ea..00000000000 --- a/vendor/github.com/spf13/cobra/args.go +++ /dev/null @@ -1,89 +0,0 @@ -package cobra - -import ( - "fmt" -) - -type PositionalArgs func(cmd *Command, args []string) error - -// Legacy arg validation has the following behaviour: -// - root commands with no subcommands can take arbitrary arguments -// - root commands with subcommands will do subcommand validity checking -// - subcommands will always accept arbitrary arguments -func legacyArgs(cmd *Command, args []string) error { - // no subcommand, always take args - if !cmd.HasSubCommands() { - return nil - } - - // root command with subcommands, do subcommand checking. - if !cmd.HasParent() && len(args) > 0 { - return fmt.Errorf("unknown command %q for %q%s", args[0], cmd.CommandPath(), cmd.findSuggestions(args[0])) - } - return nil -} - -// NoArgs returns an error if any args are included. -func NoArgs(cmd *Command, args []string) error { - if len(args) > 0 { - return fmt.Errorf("unknown command %q for %q", args[0], cmd.CommandPath()) - } - return nil -} - -// OnlyValidArgs returns an error if any args are not in the list of ValidArgs. -func OnlyValidArgs(cmd *Command, args []string) error { - if len(cmd.ValidArgs) > 0 { - for _, v := range args { - if !stringInSlice(v, cmd.ValidArgs) { - return fmt.Errorf("invalid argument %q for %q%s", v, cmd.CommandPath(), cmd.findSuggestions(args[0])) - } - } - } - return nil -} - -// ArbitraryArgs never returns an error. -func ArbitraryArgs(cmd *Command, args []string) error { - return nil -} - -// MinimumNArgs returns an error if there is not at least N args. -func MinimumNArgs(n int) PositionalArgs { - return func(cmd *Command, args []string) error { - if len(args) < n { - return fmt.Errorf("requires at least %d arg(s), only received %d", n, len(args)) - } - return nil - } -} - -// MaximumNArgs returns an error if there are more than N args. -func MaximumNArgs(n int) PositionalArgs { - return func(cmd *Command, args []string) error { - if len(args) > n { - return fmt.Errorf("accepts at most %d arg(s), received %d", n, len(args)) - } - return nil - } -} - -// ExactArgs returns an error if there are not exactly n args. -func ExactArgs(n int) PositionalArgs { - return func(cmd *Command, args []string) error { - if len(args) != n { - return fmt.Errorf("accepts %d arg(s), received %d", n, len(args)) - } - return nil - } -} - -// RangeArgs returns an error if the number of args is not within the expected range. -func RangeArgs(min int, max int) PositionalArgs { - return func(cmd *Command, args []string) error { - if len(args) < min || len(args) > max { - return fmt.Errorf("accepts between %d and %d arg(s), received %d", min, max, len(args)) - } - return nil - } -} diff --git a/vendor/github.com/spf13/cobra/bash_completions.go b/vendor/github.com/spf13/cobra/bash_completions.go deleted file mode 100644 index 8fa8f486fac..00000000000 --- a/vendor/github.com/spf13/cobra/bash_completions.go +++ /dev/null @@ -1,584 +0,0 @@ -package cobra - -import ( - "bytes" - "fmt" - "io" - "os" - "sort" - "strings" - - "github.com/spf13/pflag" -) - -// Annotations for Bash completion. -const ( - BashCompFilenameExt = "cobra_annotation_bash_completion_filename_extensions" - BashCompCustom = "cobra_annotation_bash_completion_custom" - BashCompOneRequiredFlag = "cobra_annotation_bash_completion_one_required_flag" - BashCompSubdirsInDir = "cobra_annotation_bash_completion_subdirs_in_dir" -) - -func writePreamble(buf *bytes.Buffer, name string) { - buf.WriteString(fmt.Sprintf("# bash completion for %-36s -*- shell-script -*-\n", name)) - buf.WriteString(fmt.Sprintf(` -__%[1]s_debug() -{ - if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then - echo "$*" >> "${BASH_COMP_DEBUG_FILE}" - fi -} - -# Homebrew on Macs have version 1.3 of bash-completion which doesn't include -# _init_completion. This is a very minimal version of that function. -__%[1]s_init_completion() -{ - COMPREPLY=() - _get_comp_words_by_ref "$@" cur prev words cword -} - -__%[1]s_index_of_word() -{ - local w word=$1 - shift - index=0 - for w in "$@"; do - [[ $w = "$word" ]] && return - index=$((index+1)) - done - index=-1 -} - -__%[1]s_contains_word() -{ - local w word=$1; shift - for w in "$@"; do - [[ $w = "$word" ]] && return - done - return 1 -} - -__%[1]s_handle_reply() -{ - __%[1]s_debug "${FUNCNAME[0]}" - case $cur in - -*) - if [[ $(type -t compopt) = "builtin" ]]; then - compopt -o nospace - fi - local allflags - if [ ${#must_have_one_flag[@]} -ne 0 ]; then - allflags=("${must_have_one_flag[@]}") - else - allflags=("${flags[*]} ${two_word_flags[*]}") - fi - COMPREPLY=( $(compgen -W "${allflags[*]}" -- "$cur") ) - if [[ $(type -t compopt) = "builtin" ]]; then - [[ "${COMPREPLY[0]}" == *= ]] || compopt +o nospace - fi - - # complete after --flag=abc - if [[ $cur == *=* ]]; then - if [[ $(type -t compopt) = "builtin" ]]; then - compopt +o nospace - fi - - local index flag - flag="${cur%%=*}" - __%[1]s_index_of_word "${flag}" "${flags_with_completion[@]}" - COMPREPLY=() - if [[ ${index} -ge 0 ]]; then - PREFIX="" - cur="${cur#*=}" - ${flags_completion[${index}]} - if [ -n "${ZSH_VERSION}" ]; then - # zsh completion needs --flag= prefix - eval "COMPREPLY=( \"\${COMPREPLY[@]/#/${flag}=}\" )" - fi - fi - fi - return 0; - ;; - esac - - # check if we are handling a flag with special work handling - local index - __%[1]s_index_of_word "${prev}" "${flags_with_completion[@]}" - if [[ ${index} -ge 0 ]]; then - ${flags_completion[${index}]} - return - fi - - # we are parsing a flag and don't have a special handler, no completion - if [[ ${cur} != "${words[cword]}" ]]; then - return - fi - - local completions - completions=("${commands[@]}") - if [[ ${#must_have_one_noun[@]} -ne 0 ]]; then - completions=("${must_have_one_noun[@]}") - fi - if [[ ${#must_have_one_flag[@]} -ne 0 ]]; then - completions+=("${must_have_one_flag[@]}") - fi - COMPREPLY=( $(compgen -W "${completions[*]}" -- "$cur") ) - - if [[ ${#COMPREPLY[@]} -eq 0 && ${#noun_aliases[@]} -gt 0 && ${#must_have_one_noun[@]} -ne 0 ]]; then - COMPREPLY=( $(compgen -W "${noun_aliases[*]}" -- "$cur") ) - fi - - if [[ ${#COMPREPLY[@]} -eq 0 ]]; then - declare -F __custom_func >/dev/null && __custom_func - fi - - # available in bash-completion >= 2, not always present on macOS - if declare -F __ltrim_colon_completions >/dev/null; then - __ltrim_colon_completions "$cur" - fi - - # If there is only 1 completion and it is a flag with an = it will be completed - # but we don't want a space after the = - if [[ "${#COMPREPLY[@]}" -eq "1" ]] && [[ $(type -t compopt) = "builtin" ]] && [[ "${COMPREPLY[0]}" == --*= ]]; then - compopt -o nospace - fi -} - -# The arguments should be in the form "ext1|ext2|extn" -__%[1]s_handle_filename_extension_flag() -{ - local ext="$1" - _filedir "@(${ext})" -} - -__%[1]s_handle_subdirs_in_dir_flag() -{ - local dir="$1" - pushd "${dir}" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 -} - -__%[1]s_handle_flag() -{ - __%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}" - - # if a command required a flag, and we found it, unset must_have_one_flag() - local flagname=${words[c]} - local flagvalue - # if the word contained an = - if [[ ${words[c]} == *"="* ]]; then - flagvalue=${flagname#*=} # take in as flagvalue after the = - flagname=${flagname%%=*} # strip everything after the = - flagname="${flagname}=" # but put the = back - fi - __%[1]s_debug "${FUNCNAME[0]}: looking for ${flagname}" - if __%[1]s_contains_word "${flagname}" "${must_have_one_flag[@]}"; then - must_have_one_flag=() - fi - - # if you set a flag which only applies to this command, don't show subcommands - if __%[1]s_contains_word "${flagname}" "${local_nonpersistent_flags[@]}"; then - commands=() - fi - - # keep flag value with flagname as flaghash - # flaghash variable is an associative array which is only supported in bash > 3. - if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then - if [ -n "${flagvalue}" ] ; then - flaghash[${flagname}]=${flagvalue} - elif [ -n "${words[ $((c+1)) ]}" ] ; then - flaghash[${flagname}]=${words[ $((c+1)) ]} - else - flaghash[${flagname}]="true" # pad "true" for bool flag - fi - fi - - # skip the argument to a two word flag - if __%[1]s_contains_word "${words[c]}" "${two_word_flags[@]}"; then - c=$((c+1)) - # if we are looking for a flags value, don't show commands - if [[ $c -eq $cword ]]; then - commands=() - fi - fi - - c=$((c+1)) - -} - -__%[1]s_handle_noun() -{ - __%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}" - - if __%[1]s_contains_word "${words[c]}" "${must_have_one_noun[@]}"; then - must_have_one_noun=() - elif __%[1]s_contains_word "${words[c]}" "${noun_aliases[@]}"; then - must_have_one_noun=() - fi - - nouns+=("${words[c]}") - c=$((c+1)) -} - -__%[1]s_handle_command() -{ - __%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}" - - local next_command - if [[ -n ${last_command} ]]; then - next_command="_${last_command}_${words[c]//:/__}" - else - if [[ $c -eq 0 ]]; then - next_command="_%[1]s_root_command" - else - next_command="_${words[c]//:/__}" - fi - fi - c=$((c+1)) - __%[1]s_debug "${FUNCNAME[0]}: looking for ${next_command}" - declare -F "$next_command" >/dev/null && $next_command -} - -__%[1]s_handle_word() -{ - if [[ $c -ge $cword ]]; then - __%[1]s_handle_reply - return - fi - __%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}" - if [[ "${words[c]}" == -* ]]; then - __%[1]s_handle_flag - elif __%[1]s_contains_word "${words[c]}" "${commands[@]}"; then - __%[1]s_handle_command - elif [[ $c -eq 0 ]]; then - __%[1]s_handle_command - elif __%[1]s_contains_word "${words[c]}" "${command_aliases[@]}"; then - # aliashash variable is an associative array which is only supported in bash > 3. - if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then - words[c]=${aliashash[${words[c]}]} - __%[1]s_handle_command - else - __%[1]s_handle_noun - fi - else - __%[1]s_handle_noun - fi - __%[1]s_handle_word -} - -`, name)) -} - -func writePostscript(buf *bytes.Buffer, name string) { - name = strings.Replace(name, ":", "__", -1) - buf.WriteString(fmt.Sprintf("__start_%s()\n", name)) - buf.WriteString(fmt.Sprintf(`{ - local cur prev words cword - declare -A flaghash 2>/dev/null || : - declare -A aliashash 2>/dev/null || : - if declare -F _init_completion >/dev/null 2>&1; then - _init_completion -s || return - else - __%[1]s_init_completion -n "=" || return - fi - - local c=0 - local flags=() - local two_word_flags=() - local local_nonpersistent_flags=() - local flags_with_completion=() - local flags_completion=() - local commands=("%[1]s") - local must_have_one_flag=() - local must_have_one_noun=() - local last_command - local nouns=() - - __%[1]s_handle_word -} - -`, name)) - buf.WriteString(fmt.Sprintf(`if [[ $(type -t compopt) = "builtin" ]]; then - complete -o default -F __start_%s %s -else - complete -o default -o nospace -F __start_%s %s -fi - -`, name, name, name, name)) - buf.WriteString("# ex: ts=4 sw=4 et filetype=sh\n") -} - -func writeCommands(buf *bytes.Buffer, cmd *Command) { - buf.WriteString(" commands=()\n") - for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c == cmd.helpCommand { - continue - } - buf.WriteString(fmt.Sprintf(" commands+=(%q)\n", c.Name())) - writeCmdAliases(buf, c) - } - buf.WriteString("\n") -} - -func writeFlagHandler(buf *bytes.Buffer, name string, annotations map[string][]string, cmd *Command) { - for key, value := range annotations { - switch key { - case BashCompFilenameExt: - buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name)) - - var ext string - if len(value) > 0 { - ext = fmt.Sprintf("__%s_handle_filename_extension_flag ", cmd.Root().Name()) + strings.Join(value, "|") - } else { - ext = "_filedir" - } - buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", ext)) - case BashCompCustom: - buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name)) - if len(value) > 0 { - handlers := strings.Join(value, "; ") - buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", handlers)) - } else { - buf.WriteString(" flags_completion+=(:)\n") - } - case BashCompSubdirsInDir: - buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name)) - - var ext string - if len(value) == 1 { - ext = fmt.Sprintf("__%s_handle_subdirs_in_dir_flag ", cmd.Root().Name()) + value[0] - } else { - ext = "_filedir -d" - } - buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", ext)) - } - } -} - -func writeShortFlag(buf *bytes.Buffer, flag *pflag.Flag, cmd *Command) { - name := flag.Shorthand - format := " " - if len(flag.NoOptDefVal) == 0 { - format += "two_word_" - } - format += "flags+=(\"-%s\")\n" - buf.WriteString(fmt.Sprintf(format, name)) - writeFlagHandler(buf, "-"+name, flag.Annotations, cmd) -} - -func writeFlag(buf *bytes.Buffer, flag *pflag.Flag, cmd *Command) { - name := flag.Name - format := " flags+=(\"--%s" - if len(flag.NoOptDefVal) == 0 { - format += "=" - } - format += "\")\n" - buf.WriteString(fmt.Sprintf(format, name)) - writeFlagHandler(buf, "--"+name, flag.Annotations, cmd) -} - -func writeLocalNonPersistentFlag(buf *bytes.Buffer, flag *pflag.Flag) { - name := flag.Name - format := " local_nonpersistent_flags+=(\"--%s" - if len(flag.NoOptDefVal) == 0 { - format += "=" - } - format += "\")\n" - buf.WriteString(fmt.Sprintf(format, name)) -} - -func writeFlags(buf *bytes.Buffer, cmd *Command) { - buf.WriteString(` flags=() - two_word_flags=() - local_nonpersistent_flags=() - flags_with_completion=() - flags_completion=() - -`) - localNonPersistentFlags := cmd.LocalNonPersistentFlags() - cmd.NonInheritedFlags().VisitAll(func(flag *pflag.Flag) { - if nonCompletableFlag(flag) { - return - } - writeFlag(buf, flag, cmd) - if len(flag.Shorthand) > 0 { - writeShortFlag(buf, flag, cmd) - } - if localNonPersistentFlags.Lookup(flag.Name) != nil { - writeLocalNonPersistentFlag(buf, flag) - } - }) - cmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) { - if nonCompletableFlag(flag) { - return - } - writeFlag(buf, flag, cmd) - if len(flag.Shorthand) > 0 { - writeShortFlag(buf, flag, cmd) - } - }) - - buf.WriteString("\n") -} - -func writeRequiredFlag(buf *bytes.Buffer, cmd *Command) { - buf.WriteString(" must_have_one_flag=()\n") - flags := cmd.NonInheritedFlags() - flags.VisitAll(func(flag *pflag.Flag) { - if nonCompletableFlag(flag) { - return - } - for key := range flag.Annotations { - switch key { - case BashCompOneRequiredFlag: - format := " must_have_one_flag+=(\"--%s" - if flag.Value.Type() != "bool" { - format += "=" - } - format += "\")\n" - buf.WriteString(fmt.Sprintf(format, flag.Name)) - - if len(flag.Shorthand) > 0 { - buf.WriteString(fmt.Sprintf(" must_have_one_flag+=(\"-%s\")\n", flag.Shorthand)) - } - } - } - }) -} - -func writeRequiredNouns(buf *bytes.Buffer, cmd *Command) { - buf.WriteString(" must_have_one_noun=()\n") - sort.Sort(sort.StringSlice(cmd.ValidArgs)) - for _, value := range cmd.ValidArgs { - buf.WriteString(fmt.Sprintf(" must_have_one_noun+=(%q)\n", value)) - } -} - -func writeCmdAliases(buf *bytes.Buffer, cmd *Command) { - if len(cmd.Aliases) == 0 { - return - } - - sort.Sort(sort.StringSlice(cmd.Aliases)) - - buf.WriteString(fmt.Sprint(` if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then`, "\n")) - for _, value := range cmd.Aliases { - buf.WriteString(fmt.Sprintf(" command_aliases+=(%q)\n", value)) - buf.WriteString(fmt.Sprintf(" aliashash[%q]=%q\n", value, cmd.Name())) - } - buf.WriteString(` fi`) - buf.WriteString("\n") -} -func writeArgAliases(buf *bytes.Buffer, cmd *Command) { - buf.WriteString(" noun_aliases=()\n") - sort.Sort(sort.StringSlice(cmd.ArgAliases)) - for _, value := range cmd.ArgAliases { - buf.WriteString(fmt.Sprintf(" noun_aliases+=(%q)\n", value)) - } -} - -func gen(buf *bytes.Buffer, cmd *Command) { - for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c == cmd.helpCommand { - continue - } - gen(buf, c) - } - commandName := cmd.CommandPath() - commandName = strings.Replace(commandName, " ", "_", -1) - commandName = strings.Replace(commandName, ":", "__", -1) - - if cmd.Root() == cmd { - buf.WriteString(fmt.Sprintf("_%s_root_command()\n{\n", commandName)) - } else { - buf.WriteString(fmt.Sprintf("_%s()\n{\n", commandName)) - } - - buf.WriteString(fmt.Sprintf(" last_command=%q\n", commandName)) - buf.WriteString("\n") - buf.WriteString(" command_aliases=()\n") - buf.WriteString("\n") - - writeCommands(buf, cmd) - writeFlags(buf, cmd) - writeRequiredFlag(buf, cmd) - writeRequiredNouns(buf, cmd) - writeArgAliases(buf, cmd) - buf.WriteString("}\n\n") -} - -// GenBashCompletion generates bash completion file and writes to the passed writer. -func (c *Command) GenBashCompletion(w io.Writer) error { - buf := new(bytes.Buffer) - writePreamble(buf, c.Name()) - if len(c.BashCompletionFunction) > 0 { - buf.WriteString(c.BashCompletionFunction + "\n") - } - gen(buf, c) - writePostscript(buf, c.Name()) - - _, err := buf.WriteTo(w) - return err -} - -func nonCompletableFlag(flag *pflag.Flag) bool { - return flag.Hidden || len(flag.Deprecated) > 0 -} - -// GenBashCompletionFile generates bash completion file. -func (c *Command) GenBashCompletionFile(filename string) error { - outFile, err := os.Create(filename) - if err != nil { - return err - } - defer outFile.Close() - - return c.GenBashCompletion(outFile) -} - -// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists, -// and causes your command to report an error if invoked without the flag. -func (c *Command) MarkFlagRequired(name string) error { - return MarkFlagRequired(c.Flags(), name) -} - -// MarkPersistentFlagRequired adds the BashCompOneRequiredFlag annotation to the named persistent flag if it exists, -// and causes your command to report an error if invoked without the flag. -func (c *Command) MarkPersistentFlagRequired(name string) error { - return MarkFlagRequired(c.PersistentFlags(), name) -} - -// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists, -// and causes your command to report an error if invoked without the flag. -func MarkFlagRequired(flags *pflag.FlagSet, name string) error { - return flags.SetAnnotation(name, BashCompOneRequiredFlag, []string{"true"}) -} - -// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag, if it exists. -// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided. -func (c *Command) MarkFlagFilename(name string, extensions ...string) error { - return MarkFlagFilename(c.Flags(), name, extensions...) -} - -// MarkFlagCustom adds the BashCompCustom annotation to the named flag, if it exists. -// Generated bash autocompletion will call the bash function f for the flag. -func (c *Command) MarkFlagCustom(name string, f string) error { - return MarkFlagCustom(c.Flags(), name, f) -} - -// MarkPersistentFlagFilename adds the BashCompFilenameExt annotation to the named persistent flag, if it exists. -// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided. -func (c *Command) MarkPersistentFlagFilename(name string, extensions ...string) error { - return MarkFlagFilename(c.PersistentFlags(), name, extensions...) -} - -// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag in the flag set, if it exists. -// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided. -func MarkFlagFilename(flags *pflag.FlagSet, name string, extensions ...string) error { - return flags.SetAnnotation(name, BashCompFilenameExt, extensions) -} - -// MarkFlagCustom adds the BashCompCustom annotation to the named flag in the flag set, if it exists. -// Generated bash autocompletion will call the bash function f for the flag. -func MarkFlagCustom(flags *pflag.FlagSet, name string, f string) error { - return flags.SetAnnotation(name, BashCompCustom, []string{f}) -} diff --git a/vendor/github.com/spf13/cobra/cobra.go b/vendor/github.com/spf13/cobra/cobra.go deleted file mode 100644 index 7010fd15b72..00000000000 --- a/vendor/github.com/spf13/cobra/cobra.go +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright © 2013 Steve Francia . -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Commands similar to git, go tools and other modern CLI tools -// inspired by go, go-Commander, gh and subcommand - -package cobra - -import ( - "fmt" - "io" - "reflect" - "strconv" - "strings" - "text/template" - "unicode" -) - -var templateFuncs = template.FuncMap{ - "trim": strings.TrimSpace, - "trimRightSpace": trimRightSpace, - "trimTrailingWhitespaces": trimRightSpace, - "appendIfNotPresent": appendIfNotPresent, - "rpad": rpad, - "gt": Gt, - "eq": Eq, -} - -var initializers []func() - -// EnablePrefixMatching allows to set automatic prefix matching. Automatic prefix matching can be a dangerous thing -// to automatically enable in CLI tools. -// Set this to true to enable it. -var EnablePrefixMatching = false - -// EnableCommandSorting controls sorting of the slice of commands, which is turned on by default. -// To disable sorting, set it to false. -var EnableCommandSorting = true - -// MousetrapHelpText enables an information splash screen on Windows -// if the CLI is started from explorer.exe. -// To disable the mousetrap, just set this variable to blank string (""). -// Works only on Microsoft Windows. -var MousetrapHelpText string = `This is a command line tool. - -You need to open cmd.exe and run it from there. -` - -// AddTemplateFunc adds a template function that's available to Usage and Help -// template generation. -func AddTemplateFunc(name string, tmplFunc interface{}) { - templateFuncs[name] = tmplFunc -} - -// AddTemplateFuncs adds multiple template functions that are available to Usage and -// Help template generation. -func AddTemplateFuncs(tmplFuncs template.FuncMap) { - for k, v := range tmplFuncs { - templateFuncs[k] = v - } -} - -// OnInitialize sets the passed functions to be run when each command's -// Execute method is called. -func OnInitialize(y ...func()) { - initializers = append(initializers, y...) -} - -// FIXME Gt is unused by cobra and should be removed in a version 2. It exists only for compatibility with users of cobra. - -// Gt takes two types and checks whether the first type is greater than the second. In case of types Arrays, Chans, -// Maps and Slices, Gt will compare their lengths. Ints are compared directly while strings are first parsed as -// ints and then compared. -func Gt(a interface{}, b interface{}) bool { - var left, right int64 - av := reflect.ValueOf(a) - - switch av.Kind() { - case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: - left = int64(av.Len()) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - left = av.Int() - case reflect.String: - left, _ = strconv.ParseInt(av.String(), 10, 64) - } - - bv := reflect.ValueOf(b) - - switch bv.Kind() { - case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: - right = int64(bv.Len()) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - right = bv.Int() - case reflect.String: - right, _ = strconv.ParseInt(bv.String(), 10, 64) - } - - return left > right -} - -// FIXME Eq is unused by cobra and should be removed in a version 2. It exists only for compatibility with users of cobra. - -// Eq takes two types and checks whether they are equal. Supported types are int and string. Unsupported types will panic. -func Eq(a interface{}, b interface{}) bool { - av := reflect.ValueOf(a) - bv := reflect.ValueOf(b) - - switch av.Kind() { - case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: - panic("Eq called on unsupported type") - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return av.Int() == bv.Int() - case reflect.String: - return av.String() == bv.String() - } - return false -} - -func trimRightSpace(s string) string { - return strings.TrimRightFunc(s, unicode.IsSpace) -} - -// FIXME appendIfNotPresent is unused by cobra and should be removed in a version 2. It exists only for compatibility with users of cobra. - -// appendIfNotPresent will append stringToAppend to the end of s, but only if it's not yet present in s. -func appendIfNotPresent(s, stringToAppend string) string { - if strings.Contains(s, stringToAppend) { - return s - } - return s + " " + stringToAppend -} - -// rpad adds padding to the right of a string. -func rpad(s string, padding int) string { - template := fmt.Sprintf("%%-%ds", padding) - return fmt.Sprintf(template, s) -} - -// tmpl executes the given template text on data, writing the result to w. -func tmpl(w io.Writer, text string, data interface{}) error { - t := template.New("top") - t.Funcs(templateFuncs) - template.Must(t.Parse(text)) - return t.Execute(w, data) -} - -// ld compares two strings and returns the levenshtein distance between them. -func ld(s, t string, ignoreCase bool) int { - if ignoreCase { - s = strings.ToLower(s) - t = strings.ToLower(t) - } - d := make([][]int, len(s)+1) - for i := range d { - d[i] = make([]int, len(t)+1) - } - for i := range d { - d[i][0] = i - } - for j := range d[0] { - d[0][j] = j - } - for j := 1; j <= len(t); j++ { - for i := 1; i <= len(s); i++ { - if s[i-1] == t[j-1] { - d[i][j] = d[i-1][j-1] - } else { - min := d[i-1][j] - if d[i][j-1] < min { - min = d[i][j-1] - } - if d[i-1][j-1] < min { - min = d[i-1][j-1] - } - d[i][j] = min + 1 - } - } - - } - return d[len(s)][len(t)] -} - -func stringInSlice(a string, list []string) bool { - for _, b := range list { - if b == a { - return true - } - } - return false -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/testdata/LICENSE.golden b/vendor/github.com/spf13/cobra/cobra/cmd/testdata/LICENSE.golden deleted file mode 100644 index d6456956733..00000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/testdata/LICENSE.golden +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/spf13/cobra/command.go b/vendor/github.com/spf13/cobra/command.go deleted file mode 100644 index 34d1bf36712..00000000000 --- a/vendor/github.com/spf13/cobra/command.go +++ /dev/null @@ -1,1517 +0,0 @@ -// Copyright © 2013 Steve Francia . -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package cobra is a commander providing a simple interface to create powerful modern CLI interfaces. -// In addition to providing an interface, Cobra simultaneously provides a controller to organize your application code. -package cobra - -import ( - "bytes" - "fmt" - "io" - "os" - "path/filepath" - "sort" - "strings" - - flag "github.com/spf13/pflag" -) - -// FParseErrWhitelist configures Flag parse errors to be ignored -type FParseErrWhitelist flag.ParseErrorsWhitelist - -// Command is just that, a command for your application. -// E.g. 'go run ...' - 'run' is the command. Cobra requires -// you to define the usage and description as part of your command -// definition to ensure usability. -type Command struct { - // Use is the one-line usage message. - Use string - - // Aliases is an array of aliases that can be used instead of the first word in Use. - Aliases []string - - // SuggestFor is an array of command names for which this command will be suggested - - // similar to aliases but only suggests. - SuggestFor []string - - // Short is the short description shown in the 'help' output. - Short string - - // Long is the long message shown in the 'help ' output. - Long string - - // Example is examples of how to use the command. - Example string - - // ValidArgs is list of all valid non-flag arguments that are accepted in bash completions - ValidArgs []string - - // Expected arguments - Args PositionalArgs - - // ArgAliases is List of aliases for ValidArgs. - // These are not suggested to the user in the bash completion, - // but accepted if entered manually. - ArgAliases []string - - // BashCompletionFunction is custom functions used by the bash autocompletion generator. - BashCompletionFunction string - - // Deprecated defines, if this command is deprecated and should print this string when used. - Deprecated string - - // Hidden defines, if this command is hidden and should NOT show up in the list of available commands. - Hidden bool - - // Annotations are key/value pairs that can be used by applications to identify or - // group commands. - Annotations map[string]string - - // Version defines the version for this command. If this value is non-empty and the command does not - // define a "version" flag, a "version" boolean flag will be added to the command and, if specified, - // will print content of the "Version" variable. - Version string - - // The *Run functions are executed in the following order: - // * PersistentPreRun() - // * PreRun() - // * Run() - // * PostRun() - // * PersistentPostRun() - // All functions get the same args, the arguments after the command name. - // - // PersistentPreRun: children of this command will inherit and execute. - PersistentPreRun func(cmd *Command, args []string) - // PersistentPreRunE: PersistentPreRun but returns an error. - PersistentPreRunE func(cmd *Command, args []string) error - // PreRun: children of this command will not inherit. - PreRun func(cmd *Command, args []string) - // PreRunE: PreRun but returns an error. - PreRunE func(cmd *Command, args []string) error - // Run: Typically the actual work function. Most commands will only implement this. - Run func(cmd *Command, args []string) - // RunE: Run but returns an error. - RunE func(cmd *Command, args []string) error - // PostRun: run after the Run command. - PostRun func(cmd *Command, args []string) - // PostRunE: PostRun but returns an error. - PostRunE func(cmd *Command, args []string) error - // PersistentPostRun: children of this command will inherit and execute after PostRun. - PersistentPostRun func(cmd *Command, args []string) - // PersistentPostRunE: PersistentPostRun but returns an error. - PersistentPostRunE func(cmd *Command, args []string) error - - // SilenceErrors is an option to quiet errors down stream. - SilenceErrors bool - - // SilenceUsage is an option to silence usage when an error occurs. - SilenceUsage bool - - // DisableFlagParsing disables the flag parsing. - // If this is true all flags will be passed to the command as arguments. - DisableFlagParsing bool - - // DisableAutoGenTag defines, if gen tag ("Auto generated by spf13/cobra...") - // will be printed by generating docs for this command. - DisableAutoGenTag bool - - // DisableFlagsInUseLine will disable the addition of [flags] to the usage - // line of a command when printing help or generating docs - DisableFlagsInUseLine bool - - // DisableSuggestions disables the suggestions based on Levenshtein distance - // that go along with 'unknown command' messages. - DisableSuggestions bool - // SuggestionsMinimumDistance defines minimum levenshtein distance to display suggestions. - // Must be > 0. - SuggestionsMinimumDistance int - - // TraverseChildren parses flags on all parents before executing child command. - TraverseChildren bool - - //FParseErrWhitelist flag parse errors to be ignored - FParseErrWhitelist FParseErrWhitelist - - // commands is the list of commands supported by this program. - commands []*Command - // parent is a parent command for this command. - parent *Command - // Max lengths of commands' string lengths for use in padding. - commandsMaxUseLen int - commandsMaxCommandPathLen int - commandsMaxNameLen int - // commandsAreSorted defines, if command slice are sorted or not. - commandsAreSorted bool - // commandCalledAs is the name or alias value used to call this command. - commandCalledAs struct { - name string - called bool - } - - // args is actual args parsed from flags. - args []string - // flagErrorBuf contains all error messages from pflag. - flagErrorBuf *bytes.Buffer - // flags is full set of flags. - flags *flag.FlagSet - // pflags contains persistent flags. - pflags *flag.FlagSet - // lflags contains local flags. - lflags *flag.FlagSet - // iflags contains inherited flags. - iflags *flag.FlagSet - // parentsPflags is all persistent flags of cmd's parents. - parentsPflags *flag.FlagSet - // globNormFunc is the global normalization function - // that we can use on every pflag set and children commands - globNormFunc func(f *flag.FlagSet, name string) flag.NormalizedName - - // output is an output writer defined by user. - output io.Writer - // usageFunc is usage func defined by user. - usageFunc func(*Command) error - // usageTemplate is usage template defined by user. - usageTemplate string - // flagErrorFunc is func defined by user and it's called when the parsing of - // flags returns an error. - flagErrorFunc func(*Command, error) error - // helpTemplate is help template defined by user. - helpTemplate string - // helpFunc is help func defined by user. - helpFunc func(*Command, []string) - // helpCommand is command with usage 'help'. If it's not defined by user, - // cobra uses default help command. - helpCommand *Command - // versionTemplate is the version template defined by user. - versionTemplate string -} - -// SetArgs sets arguments for the command. It is set to os.Args[1:] by default, if desired, can be overridden -// particularly useful when testing. -func (c *Command) SetArgs(a []string) { - c.args = a -} - -// SetOutput sets the destination for usage and error messages. -// If output is nil, os.Stderr is used. -func (c *Command) SetOutput(output io.Writer) { - c.output = output -} - -// SetUsageFunc sets usage function. Usage can be defined by application. -func (c *Command) SetUsageFunc(f func(*Command) error) { - c.usageFunc = f -} - -// SetUsageTemplate sets usage template. Can be defined by Application. -func (c *Command) SetUsageTemplate(s string) { - c.usageTemplate = s -} - -// SetFlagErrorFunc sets a function to generate an error when flag parsing -// fails. -func (c *Command) SetFlagErrorFunc(f func(*Command, error) error) { - c.flagErrorFunc = f -} - -// SetHelpFunc sets help function. Can be defined by Application. -func (c *Command) SetHelpFunc(f func(*Command, []string)) { - c.helpFunc = f -} - -// SetHelpCommand sets help command. -func (c *Command) SetHelpCommand(cmd *Command) { - c.helpCommand = cmd -} - -// SetHelpTemplate sets help template to be used. Application can use it to set custom template. -func (c *Command) SetHelpTemplate(s string) { - c.helpTemplate = s -} - -// SetVersionTemplate sets version template to be used. Application can use it to set custom template. -func (c *Command) SetVersionTemplate(s string) { - c.versionTemplate = s -} - -// SetGlobalNormalizationFunc sets a normalization function to all flag sets and also to child commands. -// The user should not have a cyclic dependency on commands. -func (c *Command) SetGlobalNormalizationFunc(n func(f *flag.FlagSet, name string) flag.NormalizedName) { - c.Flags().SetNormalizeFunc(n) - c.PersistentFlags().SetNormalizeFunc(n) - c.globNormFunc = n - - for _, command := range c.commands { - command.SetGlobalNormalizationFunc(n) - } -} - -// OutOrStdout returns output to stdout. -func (c *Command) OutOrStdout() io.Writer { - return c.getOut(os.Stdout) -} - -// OutOrStderr returns output to stderr -func (c *Command) OutOrStderr() io.Writer { - return c.getOut(os.Stderr) -} - -func (c *Command) getOut(def io.Writer) io.Writer { - if c.output != nil { - return c.output - } - if c.HasParent() { - return c.parent.getOut(def) - } - return def -} - -// UsageFunc returns either the function set by SetUsageFunc for this command -// or a parent, or it returns a default usage function. -func (c *Command) UsageFunc() (f func(*Command) error) { - if c.usageFunc != nil { - return c.usageFunc - } - if c.HasParent() { - return c.Parent().UsageFunc() - } - return func(c *Command) error { - c.mergePersistentFlags() - err := tmpl(c.OutOrStderr(), c.UsageTemplate(), c) - if err != nil { - c.Println(err) - } - return err - } -} - -// Usage puts out the usage for the command. -// Used when a user provides invalid input. -// Can be defined by user by overriding UsageFunc. -func (c *Command) Usage() error { - return c.UsageFunc()(c) -} - -// HelpFunc returns either the function set by SetHelpFunc for this command -// or a parent, or it returns a function with default help behavior. -func (c *Command) HelpFunc() func(*Command, []string) { - if c.helpFunc != nil { - return c.helpFunc - } - if c.HasParent() { - return c.Parent().HelpFunc() - } - return func(c *Command, a []string) { - c.mergePersistentFlags() - err := tmpl(c.OutOrStdout(), c.HelpTemplate(), c) - if err != nil { - c.Println(err) - } - } -} - -// Help puts out the help for the command. -// Used when a user calls help [command]. -// Can be defined by user by overriding HelpFunc. -func (c *Command) Help() error { - c.HelpFunc()(c, []string{}) - return nil -} - -// UsageString return usage string. -func (c *Command) UsageString() string { - tmpOutput := c.output - bb := new(bytes.Buffer) - c.SetOutput(bb) - c.Usage() - c.output = tmpOutput - return bb.String() -} - -// FlagErrorFunc returns either the function set by SetFlagErrorFunc for this -// command or a parent, or it returns a function which returns the original -// error. -func (c *Command) FlagErrorFunc() (f func(*Command, error) error) { - if c.flagErrorFunc != nil { - return c.flagErrorFunc - } - - if c.HasParent() { - return c.parent.FlagErrorFunc() - } - return func(c *Command, err error) error { - return err - } -} - -var minUsagePadding = 25 - -// UsagePadding return padding for the usage. -func (c *Command) UsagePadding() int { - if c.parent == nil || minUsagePadding > c.parent.commandsMaxUseLen { - return minUsagePadding - } - return c.parent.commandsMaxUseLen -} - -var minCommandPathPadding = 11 - -// CommandPathPadding return padding for the command path. -func (c *Command) CommandPathPadding() int { - if c.parent == nil || minCommandPathPadding > c.parent.commandsMaxCommandPathLen { - return minCommandPathPadding - } - return c.parent.commandsMaxCommandPathLen -} - -var minNamePadding = 11 - -// NamePadding returns padding for the name. -func (c *Command) NamePadding() int { - if c.parent == nil || minNamePadding > c.parent.commandsMaxNameLen { - return minNamePadding - } - return c.parent.commandsMaxNameLen -} - -// UsageTemplate returns usage template for the command. -func (c *Command) UsageTemplate() string { - if c.usageTemplate != "" { - return c.usageTemplate - } - - if c.HasParent() { - return c.parent.UsageTemplate() - } - return `Usage:{{if .Runnable}} - {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}} - {{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}} - -Aliases: - {{.NameAndAliases}}{{end}}{{if .HasExample}} - -Examples: -{{.Example}}{{end}}{{if .HasAvailableSubCommands}} - -Available Commands:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name "help"))}} - {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}} - -Flags: -{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}} - -Global Flags: -{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}} - -Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} - {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}} - -Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}} -` -} - -// HelpTemplate return help template for the command. -func (c *Command) HelpTemplate() string { - if c.helpTemplate != "" { - return c.helpTemplate - } - - if c.HasParent() { - return c.parent.HelpTemplate() - } - return `{{with (or .Long .Short)}}{{. | trimTrailingWhitespaces}} - -{{end}}{{if or .Runnable .HasSubCommands}}{{.UsageString}}{{end}}` -} - -// VersionTemplate return version template for the command. -func (c *Command) VersionTemplate() string { - if c.versionTemplate != "" { - return c.versionTemplate - } - - if c.HasParent() { - return c.parent.VersionTemplate() - } - return `{{with .Name}}{{printf "%s " .}}{{end}}{{printf "version %s" .Version}} -` -} - -func hasNoOptDefVal(name string, fs *flag.FlagSet) bool { - flag := fs.Lookup(name) - if flag == nil { - return false - } - return flag.NoOptDefVal != "" -} - -func shortHasNoOptDefVal(name string, fs *flag.FlagSet) bool { - if len(name) == 0 { - return false - } - - flag := fs.ShorthandLookup(name[:1]) - if flag == nil { - return false - } - return flag.NoOptDefVal != "" -} - -func stripFlags(args []string, c *Command) []string { - if len(args) == 0 { - return args - } - c.mergePersistentFlags() - - commands := []string{} - flags := c.Flags() - -Loop: - for len(args) > 0 { - s := args[0] - args = args[1:] - switch { - case s == "--": - // "--" terminates the flags - break Loop - case strings.HasPrefix(s, "--") && !strings.Contains(s, "=") && !hasNoOptDefVal(s[2:], flags): - // If '--flag arg' then - // delete arg from args. - fallthrough // (do the same as below) - case strings.HasPrefix(s, "-") && !strings.Contains(s, "=") && len(s) == 2 && !shortHasNoOptDefVal(s[1:], flags): - // If '-f arg' then - // delete 'arg' from args or break the loop if len(args) <= 1. - if len(args) <= 1 { - break Loop - } else { - args = args[1:] - continue - } - case s != "" && !strings.HasPrefix(s, "-"): - commands = append(commands, s) - } - } - - return commands -} - -// argsMinusFirstX removes only the first x from args. Otherwise, commands that look like -// openshift admin policy add-role-to-user admin my-user, lose the admin argument (arg[4]). -func argsMinusFirstX(args []string, x string) []string { - for i, y := range args { - if x == y { - ret := []string{} - ret = append(ret, args[:i]...) - ret = append(ret, args[i+1:]...) - return ret - } - } - return args -} - -func isFlagArg(arg string) bool { - return ((len(arg) >= 3 && arg[1] == '-') || - (len(arg) >= 2 && arg[0] == '-' && arg[1] != '-')) -} - -// Find the target command given the args and command tree -// Meant to be run on the highest node. Only searches down. -func (c *Command) Find(args []string) (*Command, []string, error) { - var innerfind func(*Command, []string) (*Command, []string) - - innerfind = func(c *Command, innerArgs []string) (*Command, []string) { - argsWOflags := stripFlags(innerArgs, c) - if len(argsWOflags) == 0 { - return c, innerArgs - } - nextSubCmd := argsWOflags[0] - - cmd := c.findNext(nextSubCmd) - if cmd != nil { - return innerfind(cmd, argsMinusFirstX(innerArgs, nextSubCmd)) - } - return c, innerArgs - } - - commandFound, a := innerfind(c, args) - if commandFound.Args == nil { - return commandFound, a, legacyArgs(commandFound, stripFlags(a, commandFound)) - } - return commandFound, a, nil -} - -func (c *Command) findSuggestions(arg string) string { - if c.DisableSuggestions { - return "" - } - if c.SuggestionsMinimumDistance <= 0 { - c.SuggestionsMinimumDistance = 2 - } - suggestionsString := "" - if suggestions := c.SuggestionsFor(arg); len(suggestions) > 0 { - suggestionsString += "\n\nDid you mean this?\n" - for _, s := range suggestions { - suggestionsString += fmt.Sprintf("\t%v\n", s) - } - } - return suggestionsString -} - -func (c *Command) findNext(next string) *Command { - matches := make([]*Command, 0) - for _, cmd := range c.commands { - if cmd.Name() == next || cmd.HasAlias(next) { - cmd.commandCalledAs.name = next - return cmd - } - if EnablePrefixMatching && cmd.hasNameOrAliasPrefix(next) { - matches = append(matches, cmd) - } - } - - if len(matches) == 1 { - return matches[0] - } - - return nil -} - -// Traverse the command tree to find the command, and parse args for -// each parent. -func (c *Command) Traverse(args []string) (*Command, []string, error) { - flags := []string{} - inFlag := false - - for i, arg := range args { - switch { - // A long flag with a space separated value - case strings.HasPrefix(arg, "--") && !strings.Contains(arg, "="): - // TODO: this isn't quite right, we should really check ahead for 'true' or 'false' - inFlag = !hasNoOptDefVal(arg[2:], c.Flags()) - flags = append(flags, arg) - continue - // A short flag with a space separated value - case strings.HasPrefix(arg, "-") && !strings.Contains(arg, "=") && len(arg) == 2 && !shortHasNoOptDefVal(arg[1:], c.Flags()): - inFlag = true - flags = append(flags, arg) - continue - // The value for a flag - case inFlag: - inFlag = false - flags = append(flags, arg) - continue - // A flag without a value, or with an `=` separated value - case isFlagArg(arg): - flags = append(flags, arg) - continue - } - - cmd := c.findNext(arg) - if cmd == nil { - return c, args, nil - } - - if err := c.ParseFlags(flags); err != nil { - return nil, args, err - } - return cmd.Traverse(args[i+1:]) - } - return c, args, nil -} - -// SuggestionsFor provides suggestions for the typedName. -func (c *Command) SuggestionsFor(typedName string) []string { - suggestions := []string{} - for _, cmd := range c.commands { - if cmd.IsAvailableCommand() { - levenshteinDistance := ld(typedName, cmd.Name(), true) - suggestByLevenshtein := levenshteinDistance <= c.SuggestionsMinimumDistance - suggestByPrefix := strings.HasPrefix(strings.ToLower(cmd.Name()), strings.ToLower(typedName)) - if suggestByLevenshtein || suggestByPrefix { - suggestions = append(suggestions, cmd.Name()) - } - for _, explicitSuggestion := range cmd.SuggestFor { - if strings.EqualFold(typedName, explicitSuggestion) { - suggestions = append(suggestions, cmd.Name()) - } - } - } - } - return suggestions -} - -// VisitParents visits all parents of the command and invokes fn on each parent. -func (c *Command) VisitParents(fn func(*Command)) { - if c.HasParent() { - fn(c.Parent()) - c.Parent().VisitParents(fn) - } -} - -// Root finds root command. -func (c *Command) Root() *Command { - if c.HasParent() { - return c.Parent().Root() - } - return c -} - -// ArgsLenAtDash will return the length of c.Flags().Args at the moment -// when a -- was found during args parsing. -func (c *Command) ArgsLenAtDash() int { - return c.Flags().ArgsLenAtDash() -} - -func (c *Command) execute(a []string) (err error) { - if c == nil { - return fmt.Errorf("Called Execute() on a nil Command") - } - - if len(c.Deprecated) > 0 { - c.Printf("Command %q is deprecated, %s\n", c.Name(), c.Deprecated) - } - - // initialize help and version flag at the last point possible to allow for user - // overriding - c.InitDefaultHelpFlag() - c.InitDefaultVersionFlag() - - err = c.ParseFlags(a) - if err != nil { - return c.FlagErrorFunc()(c, err) - } - - // If help is called, regardless of other flags, return we want help. - // Also say we need help if the command isn't runnable. - helpVal, err := c.Flags().GetBool("help") - if err != nil { - // should be impossible to get here as we always declare a help - // flag in InitDefaultHelpFlag() - c.Println("\"help\" flag declared as non-bool. Please correct your code") - return err - } - - if helpVal { - return flag.ErrHelp - } - - // for back-compat, only add version flag behavior if version is defined - if c.Version != "" { - versionVal, err := c.Flags().GetBool("version") - if err != nil { - c.Println("\"version\" flag declared as non-bool. Please correct your code") - return err - } - if versionVal { - err := tmpl(c.OutOrStdout(), c.VersionTemplate(), c) - if err != nil { - c.Println(err) - } - return err - } - } - - if !c.Runnable() { - return flag.ErrHelp - } - - c.preRun() - - argWoFlags := c.Flags().Args() - if c.DisableFlagParsing { - argWoFlags = a - } - - if err := c.ValidateArgs(argWoFlags); err != nil { - return err - } - - for p := c; p != nil; p = p.Parent() { - if p.PersistentPreRunE != nil { - if err := p.PersistentPreRunE(c, argWoFlags); err != nil { - return err - } - break - } else if p.PersistentPreRun != nil { - p.PersistentPreRun(c, argWoFlags) - break - } - } - if c.PreRunE != nil { - if err := c.PreRunE(c, argWoFlags); err != nil { - return err - } - } else if c.PreRun != nil { - c.PreRun(c, argWoFlags) - } - - if err := c.validateRequiredFlags(); err != nil { - return err - } - if c.RunE != nil { - if err := c.RunE(c, argWoFlags); err != nil { - return err - } - } else { - c.Run(c, argWoFlags) - } - if c.PostRunE != nil { - if err := c.PostRunE(c, argWoFlags); err != nil { - return err - } - } else if c.PostRun != nil { - c.PostRun(c, argWoFlags) - } - for p := c; p != nil; p = p.Parent() { - if p.PersistentPostRunE != nil { - if err := p.PersistentPostRunE(c, argWoFlags); err != nil { - return err - } - break - } else if p.PersistentPostRun != nil { - p.PersistentPostRun(c, argWoFlags) - break - } - } - - return nil -} - -func (c *Command) preRun() { - for _, x := range initializers { - x() - } -} - -// Execute uses the args (os.Args[1:] by default) -// and run through the command tree finding appropriate matches -// for commands and then corresponding flags. -func (c *Command) Execute() error { - _, err := c.ExecuteC() - return err -} - -// ExecuteC executes the command. -func (c *Command) ExecuteC() (cmd *Command, err error) { - // Regardless of what command execute is called on, run on Root only - if c.HasParent() { - return c.Root().ExecuteC() - } - - // windows hook - if preExecHookFn != nil { - preExecHookFn(c) - } - - // initialize help as the last point possible to allow for user - // overriding - c.InitDefaultHelpCmd() - - var args []string - - // Workaround FAIL with "go test -v" or "cobra.test -test.v", see #155 - if c.args == nil && filepath.Base(os.Args[0]) != "cobra.test" { - args = os.Args[1:] - } else { - args = c.args - } - - var flags []string - if c.TraverseChildren { - cmd, flags, err = c.Traverse(args) - } else { - cmd, flags, err = c.Find(args) - } - if err != nil { - // If found parse to a subcommand and then failed, talk about the subcommand - if cmd != nil { - c = cmd - } - if !c.SilenceErrors { - c.Println("Error:", err.Error()) - c.Printf("Run '%v --help' for usage.\n", c.CommandPath()) - } - return c, err - } - - cmd.commandCalledAs.called = true - if cmd.commandCalledAs.name == "" { - cmd.commandCalledAs.name = cmd.Name() - } - - err = cmd.execute(flags) - if err != nil { - // Always show help if requested, even if SilenceErrors is in - // effect - if err == flag.ErrHelp { - cmd.HelpFunc()(cmd, args) - return cmd, nil - } - - // If root command has SilentErrors flagged, - // all subcommands should respect it - if !cmd.SilenceErrors && !c.SilenceErrors { - c.Println("Error:", err.Error()) - } - - // If root command has SilentUsage flagged, - // all subcommands should respect it - if !cmd.SilenceUsage && !c.SilenceUsage { - c.Println(cmd.UsageString()) - } - } - return cmd, err -} - -func (c *Command) ValidateArgs(args []string) error { - if c.Args == nil { - return nil - } - return c.Args(c, args) -} - -func (c *Command) validateRequiredFlags() error { - flags := c.Flags() - missingFlagNames := []string{} - flags.VisitAll(func(pflag *flag.Flag) { - requiredAnnotation, found := pflag.Annotations[BashCompOneRequiredFlag] - if !found { - return - } - if (requiredAnnotation[0] == "true") && !pflag.Changed { - missingFlagNames = append(missingFlagNames, pflag.Name) - } - }) - - if len(missingFlagNames) > 0 { - return fmt.Errorf(`required flag(s) "%s" not set`, strings.Join(missingFlagNames, `", "`)) - } - return nil -} - -// InitDefaultHelpFlag adds default help flag to c. -// It is called automatically by executing the c or by calling help and usage. -// If c already has help flag, it will do nothing. -func (c *Command) InitDefaultHelpFlag() { - c.mergePersistentFlags() - if c.Flags().Lookup("help") == nil { - usage := "help for " - if c.Name() == "" { - usage += "this command" - } else { - usage += c.Name() - } - c.Flags().BoolP("help", "h", false, usage) - } -} - -// InitDefaultVersionFlag adds default version flag to c. -// It is called automatically by executing the c. -// If c already has a version flag, it will do nothing. -// If c.Version is empty, it will do nothing. -func (c *Command) InitDefaultVersionFlag() { - if c.Version == "" { - return - } - - c.mergePersistentFlags() - if c.Flags().Lookup("version") == nil { - usage := "version for " - if c.Name() == "" { - usage += "this command" - } else { - usage += c.Name() - } - c.Flags().Bool("version", false, usage) - } -} - -// InitDefaultHelpCmd adds default help command to c. -// It is called automatically by executing the c or by calling help and usage. -// If c already has help command or c has no subcommands, it will do nothing. -func (c *Command) InitDefaultHelpCmd() { - if !c.HasSubCommands() { - return - } - - if c.helpCommand == nil { - c.helpCommand = &Command{ - Use: "help [command]", - Short: "Help about any command", - Long: `Help provides help for any command in the application. -Simply type ` + c.Name() + ` help [path to command] for full details.`, - - Run: func(c *Command, args []string) { - cmd, _, e := c.Root().Find(args) - if cmd == nil || e != nil { - c.Printf("Unknown help topic %#q\n", args) - c.Root().Usage() - } else { - cmd.InitDefaultHelpFlag() // make possible 'help' flag to be shown - cmd.Help() - } - }, - } - } - c.RemoveCommand(c.helpCommand) - c.AddCommand(c.helpCommand) -} - -// ResetCommands delete parent, subcommand and help command from c. -func (c *Command) ResetCommands() { - c.parent = nil - c.commands = nil - c.helpCommand = nil - c.parentsPflags = nil -} - -// Sorts commands by their names. -type commandSorterByName []*Command - -func (c commandSorterByName) Len() int { return len(c) } -func (c commandSorterByName) Swap(i, j int) { c[i], c[j] = c[j], c[i] } -func (c commandSorterByName) Less(i, j int) bool { return c[i].Name() < c[j].Name() } - -// Commands returns a sorted slice of child commands. -func (c *Command) Commands() []*Command { - // do not sort commands if it already sorted or sorting was disabled - if EnableCommandSorting && !c.commandsAreSorted { - sort.Sort(commandSorterByName(c.commands)) - c.commandsAreSorted = true - } - return c.commands -} - -// AddCommand adds one or more commands to this parent command. -func (c *Command) AddCommand(cmds ...*Command) { - for i, x := range cmds { - if cmds[i] == c { - panic("Command can't be a child of itself") - } - cmds[i].parent = c - // update max lengths - usageLen := len(x.Use) - if usageLen > c.commandsMaxUseLen { - c.commandsMaxUseLen = usageLen - } - commandPathLen := len(x.CommandPath()) - if commandPathLen > c.commandsMaxCommandPathLen { - c.commandsMaxCommandPathLen = commandPathLen - } - nameLen := len(x.Name()) - if nameLen > c.commandsMaxNameLen { - c.commandsMaxNameLen = nameLen - } - // If global normalization function exists, update all children - if c.globNormFunc != nil { - x.SetGlobalNormalizationFunc(c.globNormFunc) - } - c.commands = append(c.commands, x) - c.commandsAreSorted = false - } -} - -// RemoveCommand removes one or more commands from a parent command. -func (c *Command) RemoveCommand(cmds ...*Command) { - commands := []*Command{} -main: - for _, command := range c.commands { - for _, cmd := range cmds { - if command == cmd { - command.parent = nil - continue main - } - } - commands = append(commands, command) - } - c.commands = commands - // recompute all lengths - c.commandsMaxUseLen = 0 - c.commandsMaxCommandPathLen = 0 - c.commandsMaxNameLen = 0 - for _, command := range c.commands { - usageLen := len(command.Use) - if usageLen > c.commandsMaxUseLen { - c.commandsMaxUseLen = usageLen - } - commandPathLen := len(command.CommandPath()) - if commandPathLen > c.commandsMaxCommandPathLen { - c.commandsMaxCommandPathLen = commandPathLen - } - nameLen := len(command.Name()) - if nameLen > c.commandsMaxNameLen { - c.commandsMaxNameLen = nameLen - } - } -} - -// Print is a convenience method to Print to the defined output, fallback to Stderr if not set. -func (c *Command) Print(i ...interface{}) { - fmt.Fprint(c.OutOrStderr(), i...) -} - -// Println is a convenience method to Println to the defined output, fallback to Stderr if not set. -func (c *Command) Println(i ...interface{}) { - c.Print(fmt.Sprintln(i...)) -} - -// Printf is a convenience method to Printf to the defined output, fallback to Stderr if not set. -func (c *Command) Printf(format string, i ...interface{}) { - c.Print(fmt.Sprintf(format, i...)) -} - -// CommandPath returns the full path to this command. -func (c *Command) CommandPath() string { - if c.HasParent() { - return c.Parent().CommandPath() + " " + c.Name() - } - return c.Name() -} - -// UseLine puts out the full usage for a given command (including parents). -func (c *Command) UseLine() string { - var useline string - if c.HasParent() { - useline = c.parent.CommandPath() + " " + c.Use - } else { - useline = c.Use - } - if c.DisableFlagsInUseLine { - return useline - } - if c.HasAvailableFlags() && !strings.Contains(useline, "[flags]") { - useline += " [flags]" - } - return useline -} - -// DebugFlags used to determine which flags have been assigned to which commands -// and which persist. -func (c *Command) DebugFlags() { - c.Println("DebugFlags called on", c.Name()) - var debugflags func(*Command) - - debugflags = func(x *Command) { - if x.HasFlags() || x.HasPersistentFlags() { - c.Println(x.Name()) - } - if x.HasFlags() { - x.flags.VisitAll(func(f *flag.Flag) { - if x.HasPersistentFlags() && x.persistentFlag(f.Name) != nil { - c.Println(" -"+f.Shorthand+",", "--"+f.Name, "["+f.DefValue+"]", "", f.Value, " [LP]") - } else { - c.Println(" -"+f.Shorthand+",", "--"+f.Name, "["+f.DefValue+"]", "", f.Value, " [L]") - } - }) - } - if x.HasPersistentFlags() { - x.pflags.VisitAll(func(f *flag.Flag) { - if x.HasFlags() { - if x.flags.Lookup(f.Name) == nil { - c.Println(" -"+f.Shorthand+",", "--"+f.Name, "["+f.DefValue+"]", "", f.Value, " [P]") - } - } else { - c.Println(" -"+f.Shorthand+",", "--"+f.Name, "["+f.DefValue+"]", "", f.Value, " [P]") - } - }) - } - c.Println(x.flagErrorBuf) - if x.HasSubCommands() { - for _, y := range x.commands { - debugflags(y) - } - } - } - - debugflags(c) -} - -// Name returns the command's name: the first word in the use line. -func (c *Command) Name() string { - name := c.Use - i := strings.Index(name, " ") - if i >= 0 { - name = name[:i] - } - return name -} - -// HasAlias determines if a given string is an alias of the command. -func (c *Command) HasAlias(s string) bool { - for _, a := range c.Aliases { - if a == s { - return true - } - } - return false -} - -// CalledAs returns the command name or alias that was used to invoke -// this command or an empty string if the command has not been called. -func (c *Command) CalledAs() string { - if c.commandCalledAs.called { - return c.commandCalledAs.name - } - return "" -} - -// hasNameOrAliasPrefix returns true if the Name or any of aliases start -// with prefix -func (c *Command) hasNameOrAliasPrefix(prefix string) bool { - if strings.HasPrefix(c.Name(), prefix) { - c.commandCalledAs.name = c.Name() - return true - } - for _, alias := range c.Aliases { - if strings.HasPrefix(alias, prefix) { - c.commandCalledAs.name = alias - return true - } - } - return false -} - -// NameAndAliases returns a list of the command name and all aliases -func (c *Command) NameAndAliases() string { - return strings.Join(append([]string{c.Name()}, c.Aliases...), ", ") -} - -// HasExample determines if the command has example. -func (c *Command) HasExample() bool { - return len(c.Example) > 0 -} - -// Runnable determines if the command is itself runnable. -func (c *Command) Runnable() bool { - return c.Run != nil || c.RunE != nil -} - -// HasSubCommands determines if the command has children commands. -func (c *Command) HasSubCommands() bool { - return len(c.commands) > 0 -} - -// IsAvailableCommand determines if a command is available as a non-help command -// (this includes all non deprecated/hidden commands). -func (c *Command) IsAvailableCommand() bool { - if len(c.Deprecated) != 0 || c.Hidden { - return false - } - - if c.HasParent() && c.Parent().helpCommand == c { - return false - } - - if c.Runnable() || c.HasAvailableSubCommands() { - return true - } - - return false -} - -// IsAdditionalHelpTopicCommand determines if a command is an additional -// help topic command; additional help topic command is determined by the -// fact that it is NOT runnable/hidden/deprecated, and has no sub commands that -// are runnable/hidden/deprecated. -// Concrete example: https://github.com/spf13/cobra/issues/393#issuecomment-282741924. -func (c *Command) IsAdditionalHelpTopicCommand() bool { - // if a command is runnable, deprecated, or hidden it is not a 'help' command - if c.Runnable() || len(c.Deprecated) != 0 || c.Hidden { - return false - } - - // if any non-help sub commands are found, the command is not a 'help' command - for _, sub := range c.commands { - if !sub.IsAdditionalHelpTopicCommand() { - return false - } - } - - // the command either has no sub commands, or no non-help sub commands - return true -} - -// HasHelpSubCommands determines if a command has any available 'help' sub commands -// that need to be shown in the usage/help default template under 'additional help -// topics'. -func (c *Command) HasHelpSubCommands() bool { - // return true on the first found available 'help' sub command - for _, sub := range c.commands { - if sub.IsAdditionalHelpTopicCommand() { - return true - } - } - - // the command either has no sub commands, or no available 'help' sub commands - return false -} - -// HasAvailableSubCommands determines if a command has available sub commands that -// need to be shown in the usage/help default template under 'available commands'. -func (c *Command) HasAvailableSubCommands() bool { - // return true on the first found available (non deprecated/help/hidden) - // sub command - for _, sub := range c.commands { - if sub.IsAvailableCommand() { - return true - } - } - - // the command either has no sub commands, or no available (non deprecated/help/hidden) - // sub commands - return false -} - -// HasParent determines if the command is a child command. -func (c *Command) HasParent() bool { - return c.parent != nil -} - -// GlobalNormalizationFunc returns the global normalization function or nil if it doesn't exist. -func (c *Command) GlobalNormalizationFunc() func(f *flag.FlagSet, name string) flag.NormalizedName { - return c.globNormFunc -} - -// Flags returns the complete FlagSet that applies -// to this command (local and persistent declared here and by all parents). -func (c *Command) Flags() *flag.FlagSet { - if c.flags == nil { - c.flags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) - if c.flagErrorBuf == nil { - c.flagErrorBuf = new(bytes.Buffer) - } - c.flags.SetOutput(c.flagErrorBuf) - } - - return c.flags -} - -// LocalNonPersistentFlags are flags specific to this command which will NOT persist to subcommands. -func (c *Command) LocalNonPersistentFlags() *flag.FlagSet { - persistentFlags := c.PersistentFlags() - - out := flag.NewFlagSet(c.Name(), flag.ContinueOnError) - c.LocalFlags().VisitAll(func(f *flag.Flag) { - if persistentFlags.Lookup(f.Name) == nil { - out.AddFlag(f) - } - }) - return out -} - -// LocalFlags returns the local FlagSet specifically set in the current command. -func (c *Command) LocalFlags() *flag.FlagSet { - c.mergePersistentFlags() - - if c.lflags == nil { - c.lflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) - if c.flagErrorBuf == nil { - c.flagErrorBuf = new(bytes.Buffer) - } - c.lflags.SetOutput(c.flagErrorBuf) - } - c.lflags.SortFlags = c.Flags().SortFlags - if c.globNormFunc != nil { - c.lflags.SetNormalizeFunc(c.globNormFunc) - } - - addToLocal := func(f *flag.Flag) { - if c.lflags.Lookup(f.Name) == nil && c.parentsPflags.Lookup(f.Name) == nil { - c.lflags.AddFlag(f) - } - } - c.Flags().VisitAll(addToLocal) - c.PersistentFlags().VisitAll(addToLocal) - return c.lflags -} - -// InheritedFlags returns all flags which were inherited from parents commands. -func (c *Command) InheritedFlags() *flag.FlagSet { - c.mergePersistentFlags() - - if c.iflags == nil { - c.iflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) - if c.flagErrorBuf == nil { - c.flagErrorBuf = new(bytes.Buffer) - } - c.iflags.SetOutput(c.flagErrorBuf) - } - - local := c.LocalFlags() - if c.globNormFunc != nil { - c.iflags.SetNormalizeFunc(c.globNormFunc) - } - - c.parentsPflags.VisitAll(func(f *flag.Flag) { - if c.iflags.Lookup(f.Name) == nil && local.Lookup(f.Name) == nil { - c.iflags.AddFlag(f) - } - }) - return c.iflags -} - -// NonInheritedFlags returns all flags which were not inherited from parent commands. -func (c *Command) NonInheritedFlags() *flag.FlagSet { - return c.LocalFlags() -} - -// PersistentFlags returns the persistent FlagSet specifically set in the current command. -func (c *Command) PersistentFlags() *flag.FlagSet { - if c.pflags == nil { - c.pflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) - if c.flagErrorBuf == nil { - c.flagErrorBuf = new(bytes.Buffer) - } - c.pflags.SetOutput(c.flagErrorBuf) - } - return c.pflags -} - -// ResetFlags deletes all flags from command. -func (c *Command) ResetFlags() { - c.flagErrorBuf = new(bytes.Buffer) - c.flagErrorBuf.Reset() - c.flags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) - c.flags.SetOutput(c.flagErrorBuf) - c.pflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) - c.pflags.SetOutput(c.flagErrorBuf) - - c.lflags = nil - c.iflags = nil - c.parentsPflags = nil -} - -// HasFlags checks if the command contains any flags (local plus persistent from the entire structure). -func (c *Command) HasFlags() bool { - return c.Flags().HasFlags() -} - -// HasPersistentFlags checks if the command contains persistent flags. -func (c *Command) HasPersistentFlags() bool { - return c.PersistentFlags().HasFlags() -} - -// HasLocalFlags checks if the command has flags specifically declared locally. -func (c *Command) HasLocalFlags() bool { - return c.LocalFlags().HasFlags() -} - -// HasInheritedFlags checks if the command has flags inherited from its parent command. -func (c *Command) HasInheritedFlags() bool { - return c.InheritedFlags().HasFlags() -} - -// HasAvailableFlags checks if the command contains any flags (local plus persistent from the entire -// structure) which are not hidden or deprecated. -func (c *Command) HasAvailableFlags() bool { - return c.Flags().HasAvailableFlags() -} - -// HasAvailablePersistentFlags checks if the command contains persistent flags which are not hidden or deprecated. -func (c *Command) HasAvailablePersistentFlags() bool { - return c.PersistentFlags().HasAvailableFlags() -} - -// HasAvailableLocalFlags checks if the command has flags specifically declared locally which are not hidden -// or deprecated. -func (c *Command) HasAvailableLocalFlags() bool { - return c.LocalFlags().HasAvailableFlags() -} - -// HasAvailableInheritedFlags checks if the command has flags inherited from its parent command which are -// not hidden or deprecated. -func (c *Command) HasAvailableInheritedFlags() bool { - return c.InheritedFlags().HasAvailableFlags() -} - -// Flag climbs up the command tree looking for matching flag. -func (c *Command) Flag(name string) (flag *flag.Flag) { - flag = c.Flags().Lookup(name) - - if flag == nil { - flag = c.persistentFlag(name) - } - - return -} - -// Recursively find matching persistent flag. -func (c *Command) persistentFlag(name string) (flag *flag.Flag) { - if c.HasPersistentFlags() { - flag = c.PersistentFlags().Lookup(name) - } - - if flag == nil { - c.updateParentsPflags() - flag = c.parentsPflags.Lookup(name) - } - return -} - -// ParseFlags parses persistent flag tree and local flags. -func (c *Command) ParseFlags(args []string) error { - if c.DisableFlagParsing { - return nil - } - - if c.flagErrorBuf == nil { - c.flagErrorBuf = new(bytes.Buffer) - } - beforeErrorBufLen := c.flagErrorBuf.Len() - c.mergePersistentFlags() - - //do it here after merging all flags and just before parse - c.Flags().ParseErrorsWhitelist = flag.ParseErrorsWhitelist(c.FParseErrWhitelist) - - err := c.Flags().Parse(args) - // Print warnings if they occurred (e.g. deprecated flag messages). - if c.flagErrorBuf.Len()-beforeErrorBufLen > 0 && err == nil { - c.Print(c.flagErrorBuf.String()) - } - - return err -} - -// Parent returns a commands parent command. -func (c *Command) Parent() *Command { - return c.parent -} - -// mergePersistentFlags merges c.PersistentFlags() to c.Flags() -// and adds missing persistent flags of all parents. -func (c *Command) mergePersistentFlags() { - c.updateParentsPflags() - c.Flags().AddFlagSet(c.PersistentFlags()) - c.Flags().AddFlagSet(c.parentsPflags) -} - -// updateParentsPflags updates c.parentsPflags by adding -// new persistent flags of all parents. -// If c.parentsPflags == nil, it makes new. -func (c *Command) updateParentsPflags() { - if c.parentsPflags == nil { - c.parentsPflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) - c.parentsPflags.SetOutput(c.flagErrorBuf) - c.parentsPflags.SortFlags = false - } - - if c.globNormFunc != nil { - c.parentsPflags.SetNormalizeFunc(c.globNormFunc) - } - - c.Root().PersistentFlags().AddFlagSet(flag.CommandLine) - - c.VisitParents(func(parent *Command) { - c.parentsPflags.AddFlagSet(parent.PersistentFlags()) - }) -} diff --git a/vendor/github.com/spf13/cobra/command_notwin.go b/vendor/github.com/spf13/cobra/command_notwin.go deleted file mode 100644 index 6159c1cc19d..00000000000 --- a/vendor/github.com/spf13/cobra/command_notwin.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build !windows - -package cobra - -var preExecHookFn func(*Command) diff --git a/vendor/github.com/spf13/cobra/command_win.go b/vendor/github.com/spf13/cobra/command_win.go deleted file mode 100644 index edec728e4f5..00000000000 --- a/vendor/github.com/spf13/cobra/command_win.go +++ /dev/null @@ -1,20 +0,0 @@ -// +build windows - -package cobra - -import ( - "os" - "time" - - "github.com/inconshreveable/mousetrap" -) - -var preExecHookFn = preExecHook - -func preExecHook(c *Command) { - if MousetrapHelpText != "" && mousetrap.StartedByExplorer() { - c.Print(MousetrapHelpText) - time.Sleep(5 * time.Second) - os.Exit(1) - } -} diff --git a/vendor/github.com/spf13/cobra/zsh_completions.go b/vendor/github.com/spf13/cobra/zsh_completions.go deleted file mode 100644 index 889c22e273c..00000000000 --- a/vendor/github.com/spf13/cobra/zsh_completions.go +++ /dev/null @@ -1,126 +0,0 @@ -package cobra - -import ( - "bytes" - "fmt" - "io" - "os" - "strings" -) - -// GenZshCompletionFile generates zsh completion file. -func (c *Command) GenZshCompletionFile(filename string) error { - outFile, err := os.Create(filename) - if err != nil { - return err - } - defer outFile.Close() - - return c.GenZshCompletion(outFile) -} - -// GenZshCompletion generates a zsh completion file and writes to the passed writer. -func (c *Command) GenZshCompletion(w io.Writer) error { - buf := new(bytes.Buffer) - - writeHeader(buf, c) - maxDepth := maxDepth(c) - writeLevelMapping(buf, maxDepth) - writeLevelCases(buf, maxDepth, c) - - _, err := buf.WriteTo(w) - return err -} - -func writeHeader(w io.Writer, cmd *Command) { - fmt.Fprintf(w, "#compdef %s\n\n", cmd.Name()) -} - -func maxDepth(c *Command) int { - if len(c.Commands()) == 0 { - return 0 - } - maxDepthSub := 0 - for _, s := range c.Commands() { - subDepth := maxDepth(s) - if subDepth > maxDepthSub { - maxDepthSub = subDepth - } - } - return 1 + maxDepthSub -} - -func writeLevelMapping(w io.Writer, numLevels int) { - fmt.Fprintln(w, `_arguments \`) - for i := 1; i <= numLevels; i++ { - fmt.Fprintf(w, ` '%d: :->level%d' \`, i, i) - fmt.Fprintln(w) - } - fmt.Fprintf(w, ` '%d: :%s'`, numLevels+1, "_files") - fmt.Fprintln(w) -} - -func writeLevelCases(w io.Writer, maxDepth int, root *Command) { - fmt.Fprintln(w, "case $state in") - defer fmt.Fprintln(w, "esac") - - for i := 1; i <= maxDepth; i++ { - fmt.Fprintf(w, " level%d)\n", i) - writeLevel(w, root, i) - fmt.Fprintln(w, " ;;") - } - fmt.Fprintln(w, " *)") - fmt.Fprintln(w, " _arguments '*: :_files'") - fmt.Fprintln(w, " ;;") -} - -func writeLevel(w io.Writer, root *Command, i int) { - fmt.Fprintf(w, " case $words[%d] in\n", i) - defer fmt.Fprintln(w, " esac") - - commands := filterByLevel(root, i) - byParent := groupByParent(commands) - - for p, c := range byParent { - names := names(c) - fmt.Fprintf(w, " %s)\n", p) - fmt.Fprintf(w, " _arguments '%d: :(%s)'\n", i, strings.Join(names, " ")) - fmt.Fprintln(w, " ;;") - } - fmt.Fprintln(w, " *)") - fmt.Fprintln(w, " _arguments '*: :_files'") - fmt.Fprintln(w, " ;;") - -} - -func filterByLevel(c *Command, l int) []*Command { - cs := make([]*Command, 0) - if l == 0 { - cs = append(cs, c) - return cs - } - for _, s := range c.Commands() { - cs = append(cs, filterByLevel(s, l-1)...) - } - return cs -} - -func groupByParent(commands []*Command) map[string][]*Command { - m := make(map[string][]*Command) - for _, c := range commands { - parent := c.Parent() - if parent == nil { - continue - } - m[parent.Name()] = append(m[parent.Name()], c) - } - return m -} - -func names(commands []*Command) []string { - ns := make([]string, len(commands)) - for i, c := range commands { - ns[i] = c.Name() - } - return ns -} diff --git a/vendor/gopkg.in/fsnotify.v1/AUTHORS b/vendor/gopkg.in/fsnotify/fsnotify.v1/AUTHORS similarity index 100% rename from vendor/gopkg.in/fsnotify.v1/AUTHORS rename to vendor/gopkg.in/fsnotify/fsnotify.v1/AUTHORS diff --git a/vendor/gopkg.in/fsnotify.v1/LICENSE b/vendor/gopkg.in/fsnotify/fsnotify.v1/LICENSE similarity index 95% rename from vendor/gopkg.in/fsnotify.v1/LICENSE rename to vendor/gopkg.in/fsnotify/fsnotify.v1/LICENSE index f21e5408009..e180c8fb059 100644 --- a/vendor/gopkg.in/fsnotify.v1/LICENSE +++ b/vendor/gopkg.in/fsnotify/fsnotify.v1/LICENSE @@ -1,5 +1,5 @@ Copyright (c) 2012 The Go Authors. All rights reserved. -Copyright (c) 2012 fsnotify Authors. All rights reserved. +Copyright (c) 2012-2019 fsnotify Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/vendor/gopkg.in/fsnotify.v1/fen.go b/vendor/gopkg.in/fsnotify/fsnotify.v1/fen.go similarity index 100% rename from vendor/gopkg.in/fsnotify.v1/fen.go rename to vendor/gopkg.in/fsnotify/fsnotify.v1/fen.go diff --git a/vendor/gopkg.in/fsnotify.v1/fsnotify.go b/vendor/gopkg.in/fsnotify/fsnotify.v1/fsnotify.go similarity index 95% rename from vendor/gopkg.in/fsnotify.v1/fsnotify.go rename to vendor/gopkg.in/fsnotify/fsnotify.v1/fsnotify.go index 190bf0de575..89cab046d12 100644 --- a/vendor/gopkg.in/fsnotify.v1/fsnotify.go +++ b/vendor/gopkg.in/fsnotify/fsnotify.v1/fsnotify.go @@ -63,4 +63,6 @@ func (e Event) String() string { } // Common errors that can be reported by a watcher -var ErrEventOverflow = errors.New("fsnotify queue overflow") +var ( + ErrEventOverflow = errors.New("fsnotify queue overflow") +) diff --git a/vendor/gopkg.in/fsnotify.v1/inotify.go b/vendor/gopkg.in/fsnotify/fsnotify.v1/inotify.go similarity index 100% rename from vendor/gopkg.in/fsnotify.v1/inotify.go rename to vendor/gopkg.in/fsnotify/fsnotify.v1/inotify.go diff --git a/vendor/gopkg.in/fsnotify.v1/inotify_poller.go b/vendor/gopkg.in/fsnotify/fsnotify.v1/inotify_poller.go similarity index 97% rename from vendor/gopkg.in/fsnotify.v1/inotify_poller.go rename to vendor/gopkg.in/fsnotify/fsnotify.v1/inotify_poller.go index cc7db4b22ef..b33f2b4d4b7 100644 --- a/vendor/gopkg.in/fsnotify.v1/inotify_poller.go +++ b/vendor/gopkg.in/fsnotify/fsnotify.v1/inotify_poller.go @@ -40,12 +40,12 @@ func newFdPoller(fd int) (*fdPoller, error) { poller.fd = fd // Create epoll fd - poller.epfd, errno = unix.EpollCreate1(0) + poller.epfd, errno = unix.EpollCreate1(unix.EPOLL_CLOEXEC) if poller.epfd == -1 { return nil, errno } // Create pipe; pipe[0] is the read end, pipe[1] the write end. - errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK) + errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK|unix.O_CLOEXEC) if errno != nil { return nil, errno } diff --git a/vendor/gopkg.in/fsnotify.v1/kqueue.go b/vendor/gopkg.in/fsnotify/fsnotify.v1/kqueue.go similarity index 100% rename from vendor/gopkg.in/fsnotify.v1/kqueue.go rename to vendor/gopkg.in/fsnotify/fsnotify.v1/kqueue.go diff --git a/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go b/vendor/gopkg.in/fsnotify/fsnotify.v1/open_mode_bsd.go similarity index 79% rename from vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go rename to vendor/gopkg.in/fsnotify/fsnotify.v1/open_mode_bsd.go index 7d8de14513e..2306c4620bf 100644 --- a/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go +++ b/vendor/gopkg.in/fsnotify/fsnotify.v1/open_mode_bsd.go @@ -8,4 +8,4 @@ package fsnotify import "golang.org/x/sys/unix" -const openMode = unix.O_NONBLOCK | unix.O_RDONLY +const openMode = unix.O_NONBLOCK | unix.O_RDONLY | unix.O_CLOEXEC diff --git a/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go b/vendor/gopkg.in/fsnotify/fsnotify.v1/open_mode_darwin.go similarity index 84% rename from vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go rename to vendor/gopkg.in/fsnotify/fsnotify.v1/open_mode_darwin.go index 9139e17161b..870c4d6d184 100644 --- a/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go +++ b/vendor/gopkg.in/fsnotify/fsnotify.v1/open_mode_darwin.go @@ -9,4 +9,4 @@ package fsnotify import "golang.org/x/sys/unix" // note: this constant is not defined on BSD -const openMode = unix.O_EVTONLY +const openMode = unix.O_EVTONLY | unix.O_CLOEXEC diff --git a/vendor/gopkg.in/fsnotify.v1/windows.go b/vendor/gopkg.in/fsnotify/fsnotify.v1/windows.go similarity index 100% rename from vendor/gopkg.in/fsnotify.v1/windows.go rename to vendor/gopkg.in/fsnotify/fsnotify.v1/windows.go diff --git a/vendor/sigs.k8s.io/controller-tools/LICENSE b/vendor/sigs.k8s.io/controller-tools/LICENSE deleted file mode 100644 index 8dada3edaf5..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go b/vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go deleted file mode 100644 index 6be7df13e24..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go +++ /dev/null @@ -1,194 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -package main - -import ( - "fmt" - "log" - "os" - "path/filepath" - - "github.com/spf13/cobra" - crdgenerator "sigs.k8s.io/controller-tools/pkg/crd/generator" - "sigs.k8s.io/controller-tools/pkg/rbac" - "sigs.k8s.io/controller-tools/pkg/webhook" -) - -func main() { - rootCmd := &cobra.Command{ - Use: "controller-gen", - Short: "A reference implementation generation tool for Kubernetes APIs.", - Long: `A reference implementation generation tool for Kubernetes APIs.`, - Example: ` # Generate RBAC manifests for a project - controller-gen rbac - - # Generate CRD manifests for a project - controller-gen crd - - # Run all the generators for a given project - controller-gen all -`, - } - - rootCmd.AddCommand( - newRBACCmd(), - newCRDCmd(), - newWebhookCmd(), - newAllSubCmd(), - ) - - if err := rootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func newRBACCmd() *cobra.Command { - o := &rbac.ManifestOptions{} - o.SetDefaults() - - cmd := &cobra.Command{ - Use: "rbac", - Short: "Generates RBAC manifests", - Long: `Generate RBAC manifests from the RBAC annotations in Go source files. -Usage: -# controller-gen rbac [--name manager] [--input-dir input_dir] [--output-dir output_dir] -`, - Run: func(cmd *cobra.Command, args []string) { - if err := rbac.Generate(o); err != nil { - log.Fatal(err) - } - fmt.Printf("RBAC manifests generated under '%s' directory\n", o.OutputDir) - }, - } - - f := cmd.Flags() - f.StringVar(&o.Name, "name", o.Name, "Name to be used as prefix in identifier for manifests") - f.StringVar(&o.InputDir, "input-dir", o.InputDir, "input directory pointing to Go source files") - f.StringVar(&o.OutputDir, "output-dir", o.OutputDir, "output directory where generated manifests will be saved.") - - return cmd -} - -func newCRDCmd() *cobra.Command { - g := &crdgenerator.Generator{} - - cmd := &cobra.Command{ - Use: "crd", - Short: "Generates CRD manifests", - Long: `Generate CRD manifests from the Type definitions in Go source files. -Usage: -# controller-gen crd [--domain k8s.io] [--root-path input_dir] [--output-dir output_dir] -`, - Run: func(cmd *cobra.Command, args []string) { - if err := g.ValidateAndInitFields(); err != nil { - log.Fatal(err) - } - if err := g.Do(); err != nil { - log.Fatal(err) - } - fmt.Printf("CRD files generated, files can be found under path %s.\n", g.OutputDir) - }, - } - - f := cmd.Flags() - f.StringVar(&g.RootPath, "root-path", "", "working dir, must have PROJECT file under the path or parent path if domain not set") - f.StringVar(&g.OutputDir, "output-dir", "", "output directory, default to 'config/crds' under root path") - f.StringVar(&g.Domain, "domain", "", "domain of the resources, will try to fetch it from PROJECT file if not specified") - f.StringVar(&g.Namespace, "namespace", "", "CRD namespace, treat it as cluster scoped if not set") - f.BoolVar(&g.SkipMapValidation, "skip-map-validation", true, "if set to true, skip generating OpenAPI validation schema for map type in CRD.") - - return cmd -} - -func newAllSubCmd() *cobra.Command { - var ( - projectDir, namespace string - ) - - cmd := &cobra.Command{ - Use: "all", - Short: "runs all generators for a project", - Long: `Run all available generators for a given project -Usage: -# controller-gen all -`, - Run: func(cmd *cobra.Command, args []string) { - if projectDir == "" { - currDir, err := os.Getwd() - if err != nil { - log.Fatalf("project-dir missing, failed to use current directory: %v", err) - } - projectDir = currDir - } - crdGen := &crdgenerator.Generator{ - RootPath: projectDir, - OutputDir: filepath.Join(projectDir, "config", "crds"), - Namespace: namespace, - SkipMapValidation: true, - } - if err := crdGen.ValidateAndInitFields(); err != nil { - log.Fatal(err) - } - if err := crdGen.Do(); err != nil { - log.Fatal(err) - } - fmt.Printf("CRD manifests generated under '%s' \n", crdGen.OutputDir) - - // RBAC generation - rbacOptions := &rbac.ManifestOptions{ - InputDir: filepath.Join(projectDir, "pkg"), - OutputDir: filepath.Join(projectDir, "config", "rbac"), - Name: "manager", - } - if err := rbac.Generate(rbacOptions); err != nil { - log.Fatal(err) - } - fmt.Printf("RBAC manifests generated under '%s' \n", rbacOptions.OutputDir) - }, - } - f := cmd.Flags() - f.StringVar(&projectDir, "project-dir", "", "project directory, it must have PROJECT file") - f.StringVar(&namespace, "namespace", "", "CRD namespace, treat it as cluster scoped if not set") - return cmd -} - -func newWebhookCmd() *cobra.Command { - o := &webhook.ManifestOptions{} - o.SetDefaults() - - cmd := &cobra.Command{ - Use: "webhook", - Short: "Generates webhook related manifests", - Long: `Generate webhook related manifests from the webhook annotations in Go source files. -Usage: -# controller-gen webhook [--input-dir input_dir] [--output-dir output_dir] [--patch-output-dir patch-output_dir] -`, - Run: func(cmd *cobra.Command, args []string) { - if err := webhook.Generate(o); err != nil { - log.Fatal(err) - } - fmt.Printf("webhook manifests generated under '%s' directory\n", o.OutputDir) - }, - } - - f := cmd.Flags() - f.StringVar(&o.InputDir, "input-dir", o.InputDir, "input directory pointing to Go source files") - f.StringVar(&o.OutputDir, "output-dir", o.OutputDir, "output directory where generated manifests will be saved.") - f.StringVar(&o.PatchOutputDir, "patch-output-dir", o.PatchOutputDir, "output directory where generated kustomize patch will be saved.") - - return cmd -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/crd/generator/generator.go b/vendor/sigs.k8s.io/controller-tools/pkg/crd/generator/generator.go deleted file mode 100644 index 51231187320..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/crd/generator/generator.go +++ /dev/null @@ -1,187 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package generator - -import ( - "fmt" - "log" - "os" - "path" - "strings" - - "github.com/ghodss/yaml" - "github.com/spf13/afero" - extensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" - "k8s.io/gengo/args" - "k8s.io/gengo/types" - crdutil "sigs.k8s.io/controller-tools/pkg/crd/util" - "sigs.k8s.io/controller-tools/pkg/internal/codegen" - "sigs.k8s.io/controller-tools/pkg/internal/codegen/parse" - "sigs.k8s.io/controller-tools/pkg/util" -) - -// Generator generates CRD manifests from API resource definitions defined in Go source files. -type Generator struct { - RootPath string - OutputDir string - Domain string - Namespace string - SkipMapValidation bool - - // OutFs is filesystem to be used for writing out the result - OutFs afero.Fs - - // apisPkg is the absolute Go pkg name for current project's 'pkg/apis' pkg. - // This is needed to determine if a Type belongs to the project or it is a referred Type. - apisPkg string -} - -// ValidateAndInitFields validate and init generator fields. -func (c *Generator) ValidateAndInitFields() error { - var err error - - if c.OutFs == nil { - c.OutFs = afero.NewOsFs() - } - - if len(c.RootPath) == 0 { - // Take current path as root path if not specified. - c.RootPath, err = os.Getwd() - if err != nil { - return err - } - } - - // Validate root path is under go src path - if !crdutil.IsUnderGoSrcPath(c.RootPath) { - return fmt.Errorf("command must be run from path under $GOPATH/src/") - } - - // If Domain is not explicitly specified, - // try to search for PROJECT file as a basis. - if len(c.Domain) == 0 { - if !crdutil.PathHasProjectFile(c.RootPath) { - return fmt.Errorf("PROJECT file missing in dir %s", c.RootPath) - } - c.Domain = crdutil.GetDomainFromProject(c.RootPath) - } - - // Validate apis directory exists under working path - apisPath := path.Join(c.RootPath, "pkg/apis") - if _, err := os.Stat(apisPath); err != nil { - return fmt.Errorf("error validating apis path %s: %v", apisPath, err) - } - - c.apisPkg, err = crdutil.DirToGoPkg(apisPath) - if err != nil { - return err - } - - // Init output directory - if c.OutputDir == "" { - c.OutputDir = path.Join(c.RootPath, "config/crds") - } - - return nil -} - -// Do manages CRD generation. -func (c *Generator) Do() error { - arguments := args.Default() - b, err := arguments.NewBuilder() - if err != nil { - return fmt.Errorf("failed making a parser: %v", err) - } - - // Switch working directory to root path. - if err := os.Chdir(c.RootPath); err != nil { - return fmt.Errorf("failed switching working dir: %v", err) - } - - if err := b.AddDirRecursive("./pkg/apis"); err != nil { - return fmt.Errorf("failed making a parser: %v", err) - } - ctx, err := parse.NewContext(b) - if err != nil { - return fmt.Errorf("failed making a context: %v", err) - } - - arguments.CustomArgs = &parse.Options{SkipMapValidation: c.SkipMapValidation} - - // TODO: find an elegant way to fulfill the domain in APIs. - p := parse.NewAPIs(ctx, arguments, c.Domain, c.apisPkg) - crds := c.getCrds(p) - - return c.writeCRDs(crds) -} - -func (c *Generator) writeCRDs(crds map[string][]byte) error { - // Ensure output dir exists. - if err := c.OutFs.MkdirAll(c.OutputDir, os.FileMode(0700)); err != nil { - return err - } - - for file, crd := range crds { - outFile := path.Join(c.OutputDir, file) - if err := (&util.FileWriter{Fs: c.OutFs}).WriteFile(outFile, crd); err != nil { - return err - } - } - return nil -} - -func getCRDFileName(resource *codegen.APIResource) string { - elems := []string{resource.Group, resource.Version, strings.ToLower(resource.Kind)} - return strings.Join(elems, "_") + ".yaml" -} - -func (c *Generator) getCrds(p *parse.APIs) map[string][]byte { - crds := map[string]extensionsv1beta1.CustomResourceDefinition{} - for _, g := range p.APIs.Groups { - for _, v := range g.Versions { - for _, r := range v.Resources { - crd := r.CRD - // ignore types which do not belong to this project - if !c.belongsToAPIsPkg(r.Type) { - continue - } - if len(c.Namespace) > 0 { - crd.Namespace = c.Namespace - } - fileName := getCRDFileName(r) - crds[fileName] = crd - } - } - } - - result := map[string][]byte{} - for file, crd := range crds { - b, err := yaml.Marshal(crd) - if err != nil { - log.Fatalf("Error: %v", err) - } - result[file] = b - } - - return result -} - -// belongsToAPIsPkg returns true if type t is defined under pkg/apis pkg of -// current project. -func (c *Generator) belongsToAPIsPkg(t *types.Type) bool { - return strings.HasPrefix(t.Name.Package, c.apisPkg) -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/crd/util/util.go b/vendor/sigs.k8s.io/controller-tools/pkg/crd/util/util.go deleted file mode 100644 index 821aab5d257..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/crd/util/util.go +++ /dev/null @@ -1,117 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package util - -import ( - "bufio" - "fmt" - gobuild "go/build" - "log" - "os" - "path" - "path/filepath" - "strings" -) - -// IsGoSrcPath validate if given path is of path $GOPATH/src. -func IsGoSrcPath(filePath string) bool { - for _, gopath := range getGoPaths() { - goSrc := path.Join(gopath, "src") - if filePath == goSrc { - return true - } - } - - return false -} - -// IsUnderGoSrcPath validate if given path is under path $GOPATH/src. -func IsUnderGoSrcPath(filePath string) bool { - for _, gopath := range getGoPaths() { - goSrc := path.Join(gopath, "src") - if strings.HasPrefix(filepath.Dir(filePath), goSrc) { - return true - } - } - - return false -} - -// DirToGoPkg returns the Gopkg for the given directory if it exists -// under a GOPATH otherwise returns error. For example, -// /Users/x/go/src/github.com/y/z ==> github.com/y/z -func DirToGoPkg(dir string) (pkg string, err error) { - goPaths := getGoPaths() - for _, gopath := range goPaths { - goSrc := path.Join(gopath, "src") - if !strings.HasPrefix(dir, goSrc) { - continue - } - pkg, err := filepath.Rel(goSrc, dir) - if err == nil { - return pkg, err - } - } - - return "", fmt.Errorf("dir '%s' does not exist under any GOPATH %v", dir, goPaths) -} - -func getGoPaths() []string { - gopaths := os.Getenv("GOPATH") - if len(gopaths) == 0 { - gopaths = gobuild.Default.GOPATH - } - return filepath.SplitList(gopaths) -} - -// PathHasProjectFile validate if PROJECT file exists under the path. -func PathHasProjectFile(filePath string) bool { - if _, err := os.Stat(path.Join(filePath, "PROJECT")); os.IsNotExist(err) { - return false - } - - return true -} - -// GetDomainFromProject get domain information from the PROJECT file under the path. -func GetDomainFromProject(rootPath string) string { - var domain string - - file, err := os.Open(path.Join(rootPath, "PROJECT")) - if err != nil { - log.Fatal(err) - } - defer func() { - if err := file.Close(); err != nil { - log.Fatal(err) - } - }() - - scanner := bufio.NewScanner(file) - for scanner.Scan() { - if strings.HasPrefix(scanner.Text(), "domain:") { - domainInfo := strings.Split(scanner.Text(), ":") - if len(domainInfo) != 2 { - log.Fatalf("Unexpected domain info: %s", scanner.Text()) - } - domain = strings.Replace(domainInfo[1], " ", "", -1) - break - } - } - - return domain -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/apis.go b/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/apis.go deleted file mode 100644 index c953b4b3b61..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/apis.go +++ /dev/null @@ -1,287 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package parse - -import ( - "fmt" - "path" - "path/filepath" - "strings" - - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/gengo/types" - "sigs.k8s.io/controller-tools/pkg/internal/codegen" -) - -type genUnversionedType struct { - Type *types.Type - Resource *codegen.APIResource -} - -func (b *APIs) parseAPIs() { - apis := &codegen.APIs{ - Domain: b.Domain, - Package: b.APIsPkg, - Groups: map[string]*codegen.APIGroup{}, - Rules: b.Rules, - Informers: b.Informers, - } - - for group, versionMap := range b.ByGroupVersionKind { - apiGroup := &codegen.APIGroup{ - Group: group, - GroupTitle: strings.Title(group), - Domain: b.Domain, - Versions: map[string]*codegen.APIVersion{}, - UnversionedResources: map[string]*codegen.APIResource{}, - } - - for version, kindMap := range versionMap { - apiVersion := &codegen.APIVersion{ - Domain: b.Domain, - Group: group, - Version: version, - Resources: map[string]*codegen.APIResource{}, - } - for kind, resource := range kindMap { - apiResource := &codegen.APIResource{ - Domain: resource.Domain, - Version: resource.Version, - Group: resource.Group, - Resource: resource.Resource, - Type: resource.Type, - REST: resource.REST, - Kind: resource.Kind, - Subresources: resource.Subresources, - StatusStrategy: resource.StatusStrategy, - Strategy: resource.Strategy, - NonNamespaced: resource.NonNamespaced, - ShortName: resource.ShortName, - } - parseDoc(resource, apiResource) - apiVersion.Resources[kind] = apiResource - // Set the package for the api version - apiVersion.Pkg = b.context.Universe[resource.Type.Name.Package] - // Set the package for the api group - apiGroup.Pkg = b.context.Universe[filepath.Dir(resource.Type.Name.Package)] - if apiGroup.Pkg != nil { - apiGroup.PkgPath = apiGroup.Pkg.Path - } - - apiGroup.UnversionedResources[kind] = apiResource - } - - apiGroup.Versions[version] = apiVersion - } - b.parseStructs(apiGroup) - apis.Groups[group] = apiGroup - } - apis.Pkg = b.context.Universe[b.APIsPkg] - b.APIs = apis -} - -func (b *APIs) parseStructs(apigroup *codegen.APIGroup) { - remaining := []genUnversionedType{} - for _, version := range apigroup.Versions { - for _, resource := range version.Resources { - remaining = append(remaining, genUnversionedType{resource.Type, resource}) - } - } - for _, version := range b.SubByGroupVersionKind[apigroup.Group] { - for _, kind := range version { - remaining = append(remaining, genUnversionedType{kind, nil}) - } - } - - done := sets.String{} - for len(remaining) > 0 { - // Pop the next element from the list - next := remaining[0] - remaining[0] = remaining[len(remaining)-1] - remaining = remaining[:len(remaining)-1] - - // Already processed this type. Skip it - if done.Has(next.Type.Name.Name) { - continue - } - done.Insert(next.Type.Name.Name) - - // Generate the struct and append to the list - result, additionalTypes := parseType(next.Type) - - // This is a resource, so generate the client - if b.genClient(next.Type) { - result.GenClient = true - result.GenDeepCopy = true - } - - if next.Resource != nil { - result.NonNamespaced = IsNonNamespaced(next.Type) - } - - if b.genDeepCopy(next.Type) { - result.GenDeepCopy = true - } - apigroup.Structs = append(apigroup.Structs, result) - - // Add the newly discovered subtypes - for _, at := range additionalTypes { - remaining = append(remaining, genUnversionedType{at, nil}) - } - } -} - -// parseType parses the type into a Struct, and returns a list of types that -// need to be parsed -func parseType(t *types.Type) (*codegen.Struct, []*types.Type) { - remaining := []*types.Type{} - - s := &codegen.Struct{ - Name: t.Name.Name, - GenClient: false, - GenUnversioned: true, // Generate unversioned structs by default - } - - for _, c := range t.CommentLines { - if strings.Contains(c, "+genregister:unversioned=false") { - // Don't generate the unversioned struct - s.GenUnversioned = false - } - } - - for _, member := range t.Members { - uType := member.Type.Name.Name - memberName := member.Name - uImport := "" - - // Use the element type for Pointers, Maps and Slices - mSubType := member.Type - hasElem := false - for mSubType.Elem != nil { - mSubType = mSubType.Elem - hasElem = true - } - if hasElem { - // Strip the package from the field type - uType = strings.Replace(member.Type.String(), mSubType.Name.Package+".", "", 1) - } - - base := filepath.Base(member.Type.String()) - samepkg := t.Name.Package == mSubType.Name.Package - - // If not in the same package, calculate the import pkg - if !samepkg { - parts := strings.Split(base, ".") - if len(parts) > 1 { - // Don't generate unversioned types for core types, just use the versioned types - if strings.HasPrefix(mSubType.Name.Package, "k8s.io/api/") { - // Import the package under an alias so it doesn't conflict with other groups - // having the same version - importAlias := path.Base(path.Dir(mSubType.Name.Package)) + path.Base(mSubType.Name.Package) - uImport = fmt.Sprintf("%s \"%s\"", importAlias, mSubType.Name.Package) - if hasElem { - // Replace the full package with the alias when referring to the type - uType = strings.Replace(member.Type.String(), mSubType.Name.Package, importAlias, 1) - } else { - // Replace the full package with the alias when referring to the type - uType = fmt.Sprintf("%s.%s", importAlias, parts[1]) - } - } else { - switch member.Type.Name.Package { - case "k8s.io/apimachinery/pkg/apis/meta/v1": - // Use versioned types for meta/v1 - uImport = fmt.Sprintf("%s \"%s\"", "metav1", "k8s.io/apimachinery/pkg/apis/meta/v1") - uType = "metav1." + parts[1] - default: - // Use unversioned types for everything else - t := member.Type - - if t.Elem != nil { - // handle Pointers, Maps, Slices - - // We need to parse the package from the Type String - t = t.Elem - str := member.Type.String() - startPkg := strings.LastIndexAny(str, "*]") - endPkg := strings.LastIndexAny(str, ".") - pkg := str[startPkg+1 : endPkg] - name := str[endPkg+1:] - prefix := str[:startPkg+1] - - uImportBase := path.Base(pkg) - uImportName := path.Base(path.Dir(pkg)) + uImportBase - uImport = fmt.Sprintf("%s \"%s\"", uImportName, pkg) - - uType = prefix + uImportName + "." + name - } else { - // handle non- Pointer, Maps, Slices - pkg := t.Name.Package - name := t.Name.Name - - // Come up with the alias the package is imported under - // Concatenate with directory package to reduce naming collisions - uImportBase := path.Base(pkg) - uImportName := path.Base(path.Dir(pkg)) + uImportBase - - // Create the import statement - uImport = fmt.Sprintf("%s \"%s\"", uImportName, pkg) - - // Create the field type name - should be . - uType = uImportName + "." + name - } - } - } - } - } - - if member.Embedded { - memberName = "" - } - - s.Fields = append(s.Fields, &codegen.Field{ - Name: memberName, - VersionedPackage: member.Type.Name.Package, - UnversionedImport: uImport, - UnversionedType: uType, - }) - - // Add this member Type for processing if it isn't a primitive and - // is part of the same API group - if !mSubType.IsPrimitive() && GetGroup(mSubType) == GetGroup(t) { - remaining = append(remaining, mSubType) - } - } - return s, remaining -} - -func (b *APIs) genClient(c *types.Type) bool { - comments := Comments(c.CommentLines) - resource := comments.getTag("resource", ":") + comments.getTag("kubebuilder:resource", ":") - return len(resource) > 0 -} - -func (b *APIs) genDeepCopy(c *types.Type) bool { - comments := Comments(c.CommentLines) - return comments.hasTag("subresource-request") -} - -func parseDoc(resource, apiResource *codegen.APIResource) { - if HasDocAnnotation(resource.Type) { - resource.DocAnnotation = getDocAnnotation(resource.Type, "warning", "note") - apiResource.DocAnnotation = resource.DocAnnotation - } -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/context.go b/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/context.go deleted file mode 100644 index 98493540f90..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/context.go +++ /dev/null @@ -1,42 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package parse - -import ( - "k8s.io/gengo/generator" - "k8s.io/gengo/namer" - "k8s.io/gengo/parser" -) - -// NewContext returns a new Context from the builder -func NewContext(p *parser.Builder) (*generator.Context, error) { - return generator.NewContext(p, NameSystems(), DefaultNameSystem()) -} - -// DefaultNameSystem returns public by default. -func DefaultNameSystem() string { - return "public" -} - -// NameSystems returns the name system used by the generators in this package. -// e.g. black-magic -func NameSystems() namer.NameSystems { - return namer.NameSystems{ - "public": namer.NewPublicNamer(1), - "raw": namer.NewRawNamer("", nil), - } -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/crd.go b/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/crd.go deleted file mode 100644 index 0e079e209cf..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/crd.go +++ /dev/null @@ -1,607 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package parse - -import ( - "bytes" - "encoding/json" - "fmt" - "log" - "regexp" - "strconv" - "strings" - "text/template" - - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/gengo/types" -) - -// parseCRDs populates the CRD field of each Group.Version.Resource, -// creating validations using the annotations on type fields. -func (b *APIs) parseCRDs() { - for _, group := range b.APIs.Groups { - for _, version := range group.Versions { - for _, resource := range version.Resources { - if IsAPIResource(resource.Type) { - resource.JSONSchemaProps, resource.Validation = - b.typeToJSONSchemaProps(resource.Type, sets.NewString(), []string{}, true) - - // Note: Drop the Type field at the root level of validation - // schema. Refer to following issue for details. - // https://github.com/kubernetes/kubernetes/issues/65293 - resource.JSONSchemaProps.Type = "" - j, err := json.MarshalIndent(resource.JSONSchemaProps, "", " ") - if err != nil { - log.Fatalf("Could not Marshall validation %v\n", err) - } - resource.ValidationComments = string(j) - - resource.CRD = v1beta1.CustomResourceDefinition{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "apiextensions.k8s.io/v1beta1", - Kind: "CustomResourceDefinition", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("%s.%s.%s", resource.Resource, resource.Group, resource.Domain), - Labels: map[string]string{"controller-tools.k8s.io": "1.0"}, - }, - Spec: v1beta1.CustomResourceDefinitionSpec{ - Group: fmt.Sprintf("%s.%s", resource.Group, resource.Domain), - Version: resource.Version, - Names: v1beta1.CustomResourceDefinitionNames{ - Kind: resource.Kind, - Plural: resource.Resource, - }, - Validation: &v1beta1.CustomResourceValidation{ - OpenAPIV3Schema: &resource.JSONSchemaProps, - }, - }, - } - if resource.NonNamespaced { - resource.CRD.Spec.Scope = "Cluster" - } else { - resource.CRD.Spec.Scope = "Namespaced" - } - - if hasCategories(resource.Type) { - categoriesTag := getCategoriesTag(resource.Type) - categories := strings.Split(categoriesTag, ",") - resource.CRD.Spec.Names.Categories = categories - resource.Categories = categories - } - - if hasStatusSubresource(resource.Type) { - if resource.CRD.Spec.Subresources == nil { - resource.CRD.Spec.Subresources = &v1beta1.CustomResourceSubresources{} - } - resource.CRD.Spec.Subresources.Status = &v1beta1.CustomResourceSubresourceStatus{} - } - - resource.CRD.Status.Conditions = []v1beta1.CustomResourceDefinitionCondition{} - resource.CRD.Status.StoredVersions = []string{} - - if hasScaleSubresource(resource.Type) { - if resource.CRD.Spec.Subresources == nil { - resource.CRD.Spec.Subresources = &v1beta1.CustomResourceSubresources{} - } - jsonPath, err := parseScaleParams(resource.Type) - if err != nil { - log.Fatalf("failed in parsing CRD, error: %v", err.Error()) - } - resource.CRD.Spec.Subresources.Scale = &v1beta1.CustomResourceSubresourceScale{ - SpecReplicasPath: jsonPath[specReplicasPath], - StatusReplicasPath: jsonPath[statusReplicasPath], - } - labelSelctor, ok := jsonPath[labelSelectorPath] - if ok && labelSelctor != "" { - resource.CRD.Spec.Subresources.Scale.LabelSelectorPath = &labelSelctor - } - } - if hasPrintColumn(resource.Type) { - result, err := parsePrintColumnParams(resource.Type) - if err != nil { - log.Fatalf("failed to parse printcolumn annotations, error: %v", err.Error()) - } - resource.CRD.Spec.AdditionalPrinterColumns = result - } - if len(resource.ShortName) > 0 { - resource.CRD.Spec.Names.ShortNames = []string{resource.ShortName} - } - } - } - } - } -} - -func (b *APIs) getTime() string { - return `v1beta1.JSONSchemaProps{ - Type: "string", - Format: "date-time", -}` -} - -func (b *APIs) objSchema() string { - return `v1beta1.JSONSchemaProps{ - Type: "object", -}` -} - -// typeToJSONSchemaProps returns a JSONSchemaProps object and its serialization -// in Go that describe the JSONSchema validations for the given type. -func (b *APIs) typeToJSONSchemaProps(t *types.Type, found sets.String, comments []string, isRoot bool) (v1beta1.JSONSchemaProps, string) { - // Special cases - time := types.Name{Name: "Time", Package: "k8s.io/apimachinery/pkg/apis/meta/v1"} - meta := types.Name{Name: "ObjectMeta", Package: "k8s.io/apimachinery/pkg/apis/meta/v1"} - unstructured := types.Name{Name: "Unstructured", Package: "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"} - intOrString := types.Name{Name: "IntOrString", Package: "k8s.io/apimachinery/pkg/util/intstr"} - switch t.Name { - case time: - return v1beta1.JSONSchemaProps{ - Type: "string", - Format: "date-time", - Description: parseDescription(comments), - }, b.getTime() - case meta: - return v1beta1.JSONSchemaProps{ - Type: "object", - Description: parseDescription(comments), - }, b.objSchema() - case unstructured: - return v1beta1.JSONSchemaProps{ - Type: "object", - Description: parseDescription(comments), - }, b.objSchema() - case intOrString: - return v1beta1.JSONSchemaProps{ - OneOf: []v1beta1.JSONSchemaProps{ - { - Type: "string", - }, - { - Type: "integer", - }, - }, - Description: parseDescription(comments), - }, b.objSchema() - } - - var v v1beta1.JSONSchemaProps - var s string - switch t.Kind { - case types.Builtin: - v, s = b.parsePrimitiveValidation(t, found, comments) - case types.Struct: - v, s = b.parseObjectValidation(t, found, comments, isRoot) - case types.Map: - v, s = b.parseMapValidation(t, found, comments) - case types.Slice: - v, s = b.parseArrayValidation(t, found, comments) - case types.Array: - v, s = b.parseArrayValidation(t, found, comments) - case types.Pointer: - v, s = b.typeToJSONSchemaProps(t.Elem, found, comments, false) - case types.Alias: - v, s = b.typeToJSONSchemaProps(t.Underlying, found, comments, false) - default: - log.Fatalf("Unknown supported Kind %v\n", t.Kind) - } - - return v, s -} - -var jsonRegex = regexp.MustCompile("json:\"([a-zA-Z,]+)\"") - -type primitiveTemplateArgs struct { - v1beta1.JSONSchemaProps - Value string - Format string - EnumValue string // TODO check type of enum value to match the type of field - Description string -} - -var primitiveTemplate = template.Must(template.New("map-template").Parse( - `v1beta1.JSONSchemaProps{ - {{ if .Pattern -}} - Pattern: "{{ .Pattern }}", - {{ end -}} - {{ if .Maximum -}} - Maximum: getFloat({{ .Maximum }}), - {{ end -}} - {{ if .ExclusiveMaximum -}} - ExclusiveMaximum: {{ .ExclusiveMaximum }}, - {{ end -}} - {{ if .Minimum -}} - Minimum: getFloat({{ .Minimum }}), - {{ end -}} - {{ if .ExclusiveMinimum -}} - ExclusiveMinimum: {{ .ExclusiveMinimum }}, - {{ end -}} - Type: "{{ .Value }}", - {{ if .Format -}} - Format: "{{ .Format }}", - {{ end -}} - {{ if .EnumValue -}} - Enum: {{ .EnumValue }}, - {{ end -}} - {{ if .MaxLength -}} - MaxLength: getInt({{ .MaxLength }}), - {{ end -}} - {{ if .MinLength -}} - MinLength: getInt({{ .MinLength }}), - {{ end -}} -}`)) - -// parsePrimitiveValidation returns a JSONSchemaProps object and its -// serialization in Go that describe the validations for the given primitive -// type. -func (b *APIs) parsePrimitiveValidation(t *types.Type, found sets.String, comments []string) (v1beta1.JSONSchemaProps, string) { - props := v1beta1.JSONSchemaProps{Type: string(t.Name.Name)} - - for _, l := range comments { - getValidation(l, &props) - } - - buff := &bytes.Buffer{} - - var n, f, s, d string - switch t.Name.Name { - case "int", "int64", "uint64": - n = "integer" - f = "int64" - case "int32", "uint32": - n = "integer" - f = "int32" - case "float", "float32": - n = "number" - f = "float" - case "float64": - n = "number" - f = "double" - case "bool": - n = "boolean" - case "string": - n = "string" - default: - n = t.Name.Name - } - if props.Enum != nil { - s = parseEnumToString(props.Enum) - } - d = parseDescription(comments) - if err := primitiveTemplate.Execute(buff, primitiveTemplateArgs{props, n, f, s, d}); err != nil { - log.Fatalf("%v", err) - } - props.Type = n - props.Format = f - props.Description = d - return props, buff.String() -} - -type mapTempateArgs struct { - Result string - SkipMapValidation bool -} - -var mapTemplate = template.Must(template.New("map-template").Parse( - `v1beta1.JSONSchemaProps{ - Type: "object", - {{if not .SkipMapValidation}}AdditionalProperties: &v1beta1.JSONSchemaPropsOrBool{ - Allows: true, - Schema: &{{.Result}}, - },{{end}} -}`)) - -// parseMapValidation returns a JSONSchemaProps object and its serialization in -// Go that describe the validations for the given map type. -func (b *APIs) parseMapValidation(t *types.Type, found sets.String, comments []string) (v1beta1.JSONSchemaProps, string) { - additionalProps, result := b.typeToJSONSchemaProps(t.Elem, found, comments, false) - additionalProps.Description = "" - props := v1beta1.JSONSchemaProps{ - Type: "object", - Description: parseDescription(comments), - } - parseOption := b.arguments.CustomArgs.(*Options) - if !parseOption.SkipMapValidation { - props.AdditionalProperties = &v1beta1.JSONSchemaPropsOrBool{ - Allows: true, - Schema: &additionalProps} - } - buff := &bytes.Buffer{} - if err := mapTemplate.Execute(buff, mapTempateArgs{Result: result, SkipMapValidation: parseOption.SkipMapValidation}); err != nil { - log.Fatalf("%v", err) - } - return props, buff.String() -} - -var arrayTemplate = template.Must(template.New("array-template").Parse( - `v1beta1.JSONSchemaProps{ - Type: "{{.Type}}", - {{ if .Format -}} - Format: "{{.Format}}", - {{ end -}} - {{ if .MaxItems -}} - MaxItems: getInt({{ .MaxItems }}), - {{ end -}} - {{ if .MinItems -}} - MinItems: getInt({{ .MinItems }}), - {{ end -}} - {{ if .UniqueItems -}} - UniqueItems: {{ .UniqueItems }}, - {{ end -}} - {{ if .Items -}} - Items: &v1beta1.JSONSchemaPropsOrArray{ - Schema: &{{.ItemsSchema}}, - }, - {{ end -}} -}`)) - -type arrayTemplateArgs struct { - v1beta1.JSONSchemaProps - ItemsSchema string -} - -// parseArrayValidation returns a JSONSchemaProps object and its serialization in -// Go that describe the validations for the given array type. -func (b *APIs) parseArrayValidation(t *types.Type, found sets.String, comments []string) (v1beta1.JSONSchemaProps, string) { - items, result := b.typeToJSONSchemaProps(t.Elem, found, comments, false) - items.Description = "" - props := v1beta1.JSONSchemaProps{ - Type: "array", - Items: &v1beta1.JSONSchemaPropsOrArray{Schema: &items}, - Description: parseDescription(comments), - } - // To represent byte arrays in the generated code, the property of the OpenAPI definition - // should have string as its type and byte as its format. - if t.Name.Name == "[]byte" { - props.Type = "string" - props.Format = "byte" - props.Items = nil - props.Description = parseDescription(comments) - } - for _, l := range comments { - getValidation(l, &props) - } - buff := &bytes.Buffer{} - if err := arrayTemplate.Execute(buff, arrayTemplateArgs{props, result}); err != nil { - log.Fatalf("%v", err) - } - return props, buff.String() -} - -type objectTemplateArgs struct { - v1beta1.JSONSchemaProps - Fields map[string]string - Required []string - IsRoot bool -} - -var objectTemplate = template.Must(template.New("object-template").Parse( - `v1beta1.JSONSchemaProps{ - {{ if not .IsRoot -}} - Type: "object", - {{ end -}} - Properties: map[string]v1beta1.JSONSchemaProps{ - {{ range $k, $v := .Fields -}} - "{{ $k }}": {{ $v }}, - {{ end -}} - }, - {{if .Required}}Required: []string{ - {{ range $k, $v := .Required -}} - "{{ $v }}", - {{ end -}} - },{{ end -}} -}`)) - -// parseObjectValidation returns a JSONSchemaProps object and its serialization in -// Go that describe the validations for the given object type. -func (b *APIs) parseObjectValidation(t *types.Type, found sets.String, comments []string, isRoot bool) (v1beta1.JSONSchemaProps, string) { - buff := &bytes.Buffer{} - props := v1beta1.JSONSchemaProps{ - Type: "object", - Description: parseDescription(comments), - } - - if strings.HasPrefix(t.Name.String(), "k8s.io/api") { - if err := objectTemplate.Execute(buff, objectTemplateArgs{props, nil, nil, false}); err != nil { - log.Fatalf("%v", err) - } - } else { - m, result, required := b.getMembers(t, found) - props.Properties = m - props.Required = required - - // Only add field validation for non-inlined fields - for _, l := range comments { - getValidation(l, &props) - } - - if err := objectTemplate.Execute(buff, objectTemplateArgs{props, result, required, isRoot}); err != nil { - log.Fatalf("%v", err) - } - } - return props, buff.String() -} - -// getValidation parses the validation tags from the comment and sets the -// validation rules on the given JSONSchemaProps. -func getValidation(comment string, props *v1beta1.JSONSchemaProps) { - comment = strings.TrimLeft(comment, " ") - if !strings.HasPrefix(comment, "+kubebuilder:validation:") { - return - } - c := strings.Replace(comment, "+kubebuilder:validation:", "", -1) - parts := strings.Split(c, "=") - if len(parts) != 2 { - log.Fatalf("Expected +kubebuilder:validation:= actual: %s", comment) - return - } - switch parts[0] { - case "Maximum": - f, err := strconv.ParseFloat(parts[1], 64) - if err != nil { - log.Fatalf("Could not parse float from %s: %v", comment, err) - return - } - props.Maximum = &f - case "ExclusiveMaximum": - b, err := strconv.ParseBool(parts[1]) - if err != nil { - log.Fatalf("Could not parse bool from %s: %v", comment, err) - return - } - props.ExclusiveMaximum = b - case "Minimum": - f, err := strconv.ParseFloat(parts[1], 64) - if err != nil { - log.Fatalf("Could not parse float from %s: %v", comment, err) - return - } - props.Minimum = &f - case "ExclusiveMinimum": - b, err := strconv.ParseBool(parts[1]) - if err != nil { - log.Fatalf("Could not parse bool from %s: %v", comment, err) - return - } - props.ExclusiveMinimum = b - case "MaxLength": - i, err := strconv.Atoi(parts[1]) - v := int64(i) - if err != nil { - log.Fatalf("Could not parse int from %s: %v", comment, err) - return - } - props.MaxLength = &v - case "MinLength": - i, err := strconv.Atoi(parts[1]) - v := int64(i) - if err != nil { - log.Fatalf("Could not parse int from %s: %v", comment, err) - return - } - props.MinLength = &v - case "Pattern": - props.Pattern = parts[1] - case "MaxItems": - if props.Type == "array" { - i, err := strconv.Atoi(parts[1]) - v := int64(i) - if err != nil { - log.Fatalf("Could not parse int from %s: %v", comment, err) - return - } - props.MaxItems = &v - } - case "MinItems": - if props.Type == "array" { - i, err := strconv.Atoi(parts[1]) - v := int64(i) - if err != nil { - log.Fatalf("Could not parse int from %s: %v", comment, err) - return - } - props.MinItems = &v - } - case "UniqueItems": - if props.Type == "array" { - b, err := strconv.ParseBool(parts[1]) - if err != nil { - log.Fatalf("Could not parse bool from %s: %v", comment, err) - return - } - props.UniqueItems = b - } - case "MultipleOf": - f, err := strconv.ParseFloat(parts[1], 64) - if err != nil { - log.Fatalf("Could not parse float from %s: %v", comment, err) - return - } - props.MultipleOf = &f - case "Enum": - if props.Type != "array" { - value := strings.Split(parts[1], ",") - enums := []v1beta1.JSON{} - for _, s := range value { - checkType(props, s, &enums) - } - props.Enum = enums - } - case "Format": - props.Format = parts[1] - default: - log.Fatalf("Unsupport validation: %s", comment) - } -} - -// getMembers builds maps by field name of the JSONSchemaProps and their Go -// serializations. -func (b *APIs) getMembers(t *types.Type, found sets.String) (map[string]v1beta1.JSONSchemaProps, map[string]string, []string) { - members := map[string]v1beta1.JSONSchemaProps{} - result := map[string]string{} - required := []string{} - - // Don't allow recursion until we support it through refs - // TODO: Support recursion - if found.Has(t.Name.String()) { - fmt.Printf("Breaking recursion for type %s", t.Name.String()) - return members, result, required - } - found.Insert(t.Name.String()) - - for _, member := range t.Members { - tags := jsonRegex.FindStringSubmatch(member.Tags) - if len(tags) == 0 { - // Skip fields without json tags - //fmt.Printf("Skipping member %s %s\n", member.Name, member.Type.Name.String()) - continue - } - ts := strings.Split(tags[1], ",") - name := member.Name - strat := "" - if len(ts) > 0 && len(ts[0]) > 0 { - name = ts[0] - } - if len(ts) > 1 { - strat = ts[1] - } - - // Inline "inline" structs - if strat == "inline" { - m, r, re := b.getMembers(member.Type, found) - for n, v := range m { - members[n] = v - } - for n, v := range r { - result[n] = v - } - required = append(required, re...) - } else { - m, r := b.typeToJSONSchemaProps(member.Type, found, member.CommentLines, false) - members[name] = m - result[name] = r - if !strings.HasSuffix(strat, "omitempty") { - required = append(required, name) - } - } - } - - defer found.Delete(t.Name.String()) - return members, result, required -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/index.go b/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/index.go deleted file mode 100644 index 067ba9a488c..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/index.go +++ /dev/null @@ -1,160 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package parse - -import ( - "fmt" - "log" - "strings" - - "github.com/markbates/inflect" - "k8s.io/gengo/types" - "sigs.k8s.io/controller-tools/pkg/internal/codegen" - "sigs.k8s.io/controller-tools/pkg/internal/general" -) - -// parseIndex indexes all types with the comment "// +resource=RESOURCE" by GroupVersionKind and -// GroupKindVersion -func (b *APIs) parseIndex() { - // Index resource by group, version, kind - b.ByGroupVersionKind = map[string]map[string]map[string]*codegen.APIResource{} - - // Index resources by group, kind, version - b.ByGroupKindVersion = map[string]map[string]map[string]*codegen.APIResource{} - - // Index subresources by group, version, kind - b.SubByGroupVersionKind = map[string]map[string]map[string]*types.Type{} - - for _, c := range b.context.Order { - // The type is a subresource, add it to the subresource index - if IsAPISubresource(c) { - group := GetGroup(c) - version := GetVersion(c, group) - kind := GetKind(c, group) - if _, f := b.SubByGroupVersionKind[group]; !f { - b.SubByGroupVersionKind[group] = map[string]map[string]*types.Type{} - } - if _, f := b.SubByGroupVersionKind[group][version]; !f { - b.SubByGroupVersionKind[group][version] = map[string]*types.Type{} - } - b.SubByGroupVersionKind[group][version][kind] = c - } - - // If it isn't a subresource or resource, continue to the next type - if !IsAPIResource(c) { - continue - } - - // Parse out the resource information - r := &codegen.APIResource{ - Type: c, - NonNamespaced: IsNonNamespaced(c), - } - r.Group = GetGroup(c) - r.Version = GetVersion(c, r.Group) - r.Kind = GetKind(c, r.Group) - r.Domain = b.Domain - - // TODO: revisit the part... - if r.Resource == "" { - r.Resource = strings.ToLower(inflect.Pluralize(r.Kind)) - } - rt, err := parseResourceAnnotation(c) - if err != nil { - log.Fatalf("failed to parse resource annotations, error: %v", err.Error()) - } - if rt.Resource != "" { - r.Resource = rt.Resource - } - r.ShortName = rt.ShortName - - // Copy the Status strategy to mirror the non-status strategy - r.StatusStrategy = strings.TrimSuffix(r.Strategy, "Strategy") - r.StatusStrategy = fmt.Sprintf("%sStatusStrategy", r.StatusStrategy) - - // Initialize the map entries so they aren't nill - if _, f := b.ByGroupKindVersion[r.Group]; !f { - b.ByGroupKindVersion[r.Group] = map[string]map[string]*codegen.APIResource{} - } - if _, f := b.ByGroupKindVersion[r.Group][r.Kind]; !f { - b.ByGroupKindVersion[r.Group][r.Kind] = map[string]*codegen.APIResource{} - } - if _, f := b.ByGroupVersionKind[r.Group]; !f { - b.ByGroupVersionKind[r.Group] = map[string]map[string]*codegen.APIResource{} - } - if _, f := b.ByGroupVersionKind[r.Group][r.Version]; !f { - b.ByGroupVersionKind[r.Group][r.Version] = map[string]*codegen.APIResource{} - } - - // Add the resource to the map - b.ByGroupKindVersion[r.Group][r.Kind][r.Version] = r - b.ByGroupVersionKind[r.Group][r.Version][r.Kind] = r - r.Type = c - } -} - -// resourceTags contains the tags present in a "+resource=" comment -type resourceTags struct { - Resource string - REST string - Strategy string - ShortName string -} - -// resourceAnnotationValue is a helper function to extract resource annotation. -func resourceAnnotationValue(tag string) (resourceTags, error) { - res := resourceTags{} - for _, elem := range strings.Split(tag, ",") { - key, value, err := general.ParseKV(elem) - if err != nil { - return resourceTags{}, fmt.Errorf("// +kubebuilder:resource: tags must be key value pairs. Expected "+ - "keys [path=] "+ - "Got string: [%s]", tag) - } - switch key { - case "path": - res.Resource = value - case "shortName": - res.ShortName = value - default: - return resourceTags{}, fmt.Errorf("The given input %s is invalid", value) - } - } - return res, nil -} - -// parseResourceAnnotation parses the tags in a "+resource=" comment into a resourceTags struct. -func parseResourceAnnotation(t *types.Type) (resourceTags, error) { - finalResult := resourceTags{} - var resourceAnnotationFound bool - for _, comment := range t.CommentLines { - anno := general.GetAnnotation(comment, "kubebuilder:resource") - if len(anno) == 0 { - continue - } - result, err := resourceAnnotationValue(anno) - if err != nil { - return resourceTags{}, err - } - if resourceAnnotationFound { - return resourceTags{}, fmt.Errorf("resource annotation should only exists once per type") - } - resourceAnnotationFound = true - finalResult = result - } - return finalResult, nil -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/parser.go b/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/parser.go deleted file mode 100644 index c7a55dd3dec..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/parser.go +++ /dev/null @@ -1,151 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package parse - -import ( - "bufio" - "go/build" - "log" - "os" - "path/filepath" - "strings" - - "github.com/pkg/errors" - rbacv1 "k8s.io/api/rbac/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/gengo/args" - "k8s.io/gengo/generator" - "k8s.io/gengo/types" - "sigs.k8s.io/controller-tools/pkg/internal/codegen" -) - -// APIs is the information of a collection of API -type APIs struct { - context *generator.Context - arguments *args.GeneratorArgs - Domain string - VersionedPkgs sets.String - UnversionedPkgs sets.String - APIsPkg string - APIsPkgRaw *types.Package - GroupNames sets.String - - APIs *codegen.APIs - Controllers []codegen.Controller - - ByGroupKindVersion map[string]map[string]map[string]*codegen.APIResource - ByGroupVersionKind map[string]map[string]map[string]*codegen.APIResource - SubByGroupVersionKind map[string]map[string]map[string]*types.Type - Groups map[string]types.Package - Rules []rbacv1.PolicyRule - Informers map[v1.GroupVersionKind]bool -} - -// NewAPIs returns a new APIs instance with given context. -func NewAPIs(context *generator.Context, arguments *args.GeneratorArgs, domain, apisPkg string) *APIs { - b := &APIs{ - context: context, - arguments: arguments, - Domain: domain, - APIsPkg: apisPkg, - } - b.parsePackages() - b.parseGroupNames() - b.parseIndex() - b.parseAPIs() - b.parseCRDs() - if len(b.Domain) == 0 { - b.parseDomain() - } - return b -} - -// parseGroupNames initializes b.GroupNames with the set of all groups -func (b *APIs) parseGroupNames() { - b.GroupNames = sets.String{} - for p := range b.UnversionedPkgs { - pkg := b.context.Universe[p] - if pkg == nil { - // If the input had no Go files, for example. - continue - } - b.GroupNames.Insert(filepath.Base(p)) - } -} - -// parsePackages parses out the sets of Versioned, Unversioned packages and identifies the root Apis package. -func (b *APIs) parsePackages() { - b.VersionedPkgs = sets.NewString() - b.UnversionedPkgs = sets.NewString() - for _, o := range b.context.Order { - if IsAPIResource(o) { - versioned := o.Name.Package - b.VersionedPkgs.Insert(versioned) - - unversioned := filepath.Dir(versioned) - b.UnversionedPkgs.Insert(unversioned) - } - } -} - -// parseDomain parses the domain from the apis/doc.go file comment "// +domain=YOUR_DOMAIN". -func (b *APIs) parseDomain() { - pkg := b.context.Universe[b.APIsPkg] - if pkg == nil { - // If the input had no Go files, for example. - panic(errors.Errorf("Missing apis package.")) - } - comments := Comments(pkg.Comments) - b.Domain = comments.getTag("domain", "=") - if len(b.Domain) == 0 { - b.Domain = parseDomainFromFiles(b.context.Inputs) - if len(b.Domain) == 0 { - panic("Could not find string matching // +domain=.+ in apis/doc.go") - } - } -} - -func parseDomainFromFiles(paths []string) string { - var domain string - for _, path := range paths { - if strings.HasSuffix(path, "pkg/apis") { - filePath := strings.Join([]string{build.Default.GOPATH, "src", path, "doc.go"}, "/") - lines := []string{} - - file, err := os.Open(filePath) - if err != nil { - log.Fatal(err) - } - defer file.Close() - scanner := bufio.NewScanner(file) - for scanner.Scan() { - if strings.HasPrefix(scanner.Text(), "//") { - lines = append(lines, strings.Replace(scanner.Text(), "// ", "", 1)) - } - } - if err := scanner.Err(); err != nil { - log.Fatal(err) - } - - comments := Comments(lines) - domain = comments.getTag("domain", "=") - break - } - } - return domain -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/util.go b/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/util.go deleted file mode 100644 index eb9dfa35a8b..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/util.go +++ /dev/null @@ -1,521 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package parse - -import ( - "fmt" - "log" - "path/filepath" - "strconv" - "strings" - - "github.com/pkg/errors" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" - "k8s.io/gengo/types" -) - -const ( - specReplicasPath = "specpath" - statusReplicasPath = "statuspath" - labelSelectorPath = "selectorpath" - jsonPathError = "invalid scale path. specpath, statuspath key-value pairs are required, only selectorpath key-value is optinal. For example: // +kubebuilder:subresource:scale:specpath=.spec.replica,statuspath=.status.replica,selectorpath=.spec.Label" - printColumnName = "name" - printColumnType = "type" - printColumnDescr = "description" - printColumnPath = "JSONPath" - printColumnFormat = "format" - printColumnPri = "priority" - printColumnError = "invalid printcolumn path. name,type, and JSONPath are required kye-value pairs and rest of the fields are optinal. For example: // +kubebuilder:printcolumn:name=abc,type=string,JSONPath=status" -) - -// Options contains the parser options -type Options struct { - SkipMapValidation bool - - // SkipRBACValidation flag determines whether to check RBAC annotations - // for the controller or not at parse stage. - SkipRBACValidation bool -} - -// IsAPIResource returns true if either of the two conditions become true: -// 1. t has a +resource/+kubebuilder:resource comment tag -// 2. t has TypeMeta and ObjectMeta in its member list. -func IsAPIResource(t *types.Type) bool { - for _, c := range t.CommentLines { - if strings.Contains(c, "+resource") || strings.Contains(c, "+kubebuilder:resource") { - return true - } - } - - typeMetaFound, objMetaFound := false, false - for _, m := range t.Members { - if m.Name == "TypeMeta" && m.Type.String() == "k8s.io/apimachinery/pkg/apis/meta/v1.TypeMeta" { - typeMetaFound = true - } - if m.Name == "ObjectMeta" && m.Type.String() == "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta" { - objMetaFound = true - } - if typeMetaFound && objMetaFound { - return true - } - } - return false -} - -// IsNonNamespaced returns true if t has a +nonNamespaced comment tag -func IsNonNamespaced(t *types.Type) bool { - if !IsAPIResource(t) { - return false - } - - for _, c := range t.CommentLines { - if strings.Contains(c, "+genclient:nonNamespaced") { - return true - } - } - - for _, c := range t.SecondClosestCommentLines { - if strings.Contains(c, "+genclient:nonNamespaced") { - return true - } - } - - return false -} - -// IsController returns true if t has a +controller or +kubebuilder:controller tag -func IsController(t *types.Type) bool { - for _, c := range t.CommentLines { - if strings.Contains(c, "+controller") || strings.Contains(c, "+kubebuilder:controller") { - return true - } - } - return false -} - -// IsRBAC returns true if t has a +rbac or +kubebuilder:rbac tag -func IsRBAC(t *types.Type) bool { - for _, c := range t.CommentLines { - if strings.Contains(c, "+rbac") || strings.Contains(c, "+kubebuilder:rbac") { - return true - } - } - return false -} - -// hasPrintColumn returns true if t has a +printcolumn or +kubebuilder:printcolumn annotation. -func hasPrintColumn(t *types.Type) bool { - for _, c := range t.CommentLines { - if strings.Contains(c, "+printcolumn") || strings.Contains(c, "+kubebuilder:printcolumn") { - return true - } - } - return false -} - -// IsInformer returns true if t has a +informers or +kubebuilder:informers tag -func IsInformer(t *types.Type) bool { - for _, c := range t.CommentLines { - if strings.Contains(c, "+informers") || strings.Contains(c, "+kubebuilder:informers") { - return true - } - } - return false -} - -// IsAPISubresource returns true if t has a +subresource-request comment tag -func IsAPISubresource(t *types.Type) bool { - for _, c := range t.CommentLines { - if strings.Contains(c, "+subresource-request") { - return true - } - } - return false -} - -// HasSubresource returns true if t is an APIResource with one or more Subresources -func HasSubresource(t *types.Type) bool { - if !IsAPIResource(t) { - return false - } - for _, c := range t.CommentLines { - if strings.Contains(c, "subresource") { - return true - } - } - return false -} - -// hasStatusSubresource returns true if t is an APIResource annotated with -// +kubebuilder:subresource:status -func hasStatusSubresource(t *types.Type) bool { - if !IsAPIResource(t) { - return false - } - for _, c := range t.CommentLines { - if strings.Contains(c, "+kubebuilder:subresource:status") { - return true - } - } - return false -} - -// hasScaleSubresource returns true if t is an APIResource annotated with -// +kubebuilder:subresource:scale -func hasScaleSubresource(t *types.Type) bool { - if !IsAPIResource(t) { - return false - } - for _, c := range t.CommentLines { - if strings.Contains(c, "+kubebuilder:subresource:scale") { - return true - } - } - return false -} - -// hasCategories returns true if t is an APIResource annotated with -// +kubebuilder:categories -func hasCategories(t *types.Type) bool { - if !IsAPIResource(t) { - return false - } - - for _, c := range t.CommentLines { - if strings.Contains(c, "+kubebuilder:categories") { - return true - } - } - return false -} - -// HasDocAnnotation returns true if t is an APIResource with doc annotation -// +kubebuilder:doc -func HasDocAnnotation(t *types.Type) bool { - if !IsAPIResource(t) { - return false - } - for _, c := range t.CommentLines { - if strings.Contains(c, "+kubebuilder:doc") { - return true - } - } - return false -} - -// IsUnversioned returns true if t is in given group, and not in versioned path. -func IsUnversioned(t *types.Type, group string) bool { - return IsApisDir(filepath.Base(filepath.Dir(t.Name.Package))) && GetGroup(t) == group -} - -// IsVersioned returns true if t is in given group, and in versioned path. -func IsVersioned(t *types.Type, group string) bool { - dir := filepath.Base(filepath.Dir(filepath.Dir(t.Name.Package))) - return IsApisDir(dir) && GetGroup(t) == group -} - -// GetVersion returns version of t. -func GetVersion(t *types.Type, group string) string { - if !IsVersioned(t, group) { - panic(errors.Errorf("Cannot get version for unversioned type %v", t.Name)) - } - return filepath.Base(t.Name.Package) -} - -// GetGroup returns group of t. -func GetGroup(t *types.Type) string { - return filepath.Base(GetGroupPackage(t)) -} - -// GetGroupPackage returns group package of t. -func GetGroupPackage(t *types.Type) string { - if IsApisDir(filepath.Base(filepath.Dir(t.Name.Package))) { - return t.Name.Package - } - return filepath.Dir(t.Name.Package) -} - -// GetKind returns kind of t. -func GetKind(t *types.Type, group string) string { - if !IsVersioned(t, group) && !IsUnversioned(t, group) { - panic(errors.Errorf("Cannot get kind for type not in group %v", t.Name)) - } - return t.Name.Name -} - -// IsApisDir returns true if a directory path is a Kubernetes api directory -func IsApisDir(dir string) bool { - return dir == "apis" || dir == "api" -} - -// Comments is a structure for using comment tags on go structs and fields -type Comments []string - -// GetTags returns the value for the first comment with a prefix matching "+name=" -// e.g. "+name=foo\n+name=bar" would return "foo" -func (c Comments) getTag(name, sep string) string { - for _, c := range c { - prefix := fmt.Sprintf("+%s%s", name, sep) - if strings.HasPrefix(c, prefix) { - return strings.Replace(c, prefix, "", 1) - } - } - return "" -} - -// hasTag returns true if the Comments has a tag with the given name -func (c Comments) hasTag(name string) bool { - for _, c := range c { - prefix := fmt.Sprintf("+%s", name) - if strings.HasPrefix(c, prefix) { - return true - } - } - return false -} - -// GetTags returns the value for all comments with a prefix and separator. E.g. for "name" and "=" -// "+name=foo\n+name=bar" would return []string{"foo", "bar"} -func (c Comments) getTags(name, sep string) []string { - tags := []string{} - for _, c := range c { - prefix := fmt.Sprintf("+%s%s", name, sep) - if strings.HasPrefix(c, prefix) { - tags = append(tags, strings.Replace(c, prefix, "", 1)) - } - } - return tags -} - -// getCategoriesTag returns the value of the +kubebuilder:categories tags -func getCategoriesTag(c *types.Type) string { - comments := Comments(c.CommentLines) - resource := comments.getTag("kubebuilder:categories", "=") - if len(resource) == 0 { - panic(errors.Errorf("Must specify +kubebuilder:categories comment for type %v", c.Name)) - } - return resource -} - -// getDocAnnotation parse annotations of "+kubebuilder:doc:" with tags of "warning" or "doc" for control generating doc config. -// E.g. +kubebuilder:doc:warning=foo +kubebuilder:doc:note=bar -func getDocAnnotation(t *types.Type, tags ...string) map[string]string { - annotation := make(map[string]string) - for _, tag := range tags { - for _, c := range t.CommentLines { - prefix := fmt.Sprintf("+kubebuilder:doc:%s=", tag) - if strings.HasPrefix(c, prefix) { - annotation[tag] = strings.Replace(c, prefix, "", 1) - } - } - } - return annotation -} - -// parseByteValue returns the literal digital number values from a byte array -func parseByteValue(b []byte) string { - elem := strings.Join(strings.Fields(fmt.Sprintln(b)), ",") - elem = strings.TrimPrefix(elem, "[") - elem = strings.TrimSuffix(elem, "]") - return elem -} - -// parseDescription parse comments above each field in the type definition. -func parseDescription(res []string) string { - var temp strings.Builder - var desc string - for _, comment := range res { - if !(strings.Contains(comment, "+kubebuilder") || strings.Contains(comment, "+optional")) { - temp.WriteString(comment) - temp.WriteString(" ") - desc = strings.TrimRight(temp.String(), " ") - } - } - return desc -} - -// parseEnumToString returns a representive validated go format string from JSONSchemaProps schema -func parseEnumToString(value []v1beta1.JSON) string { - res := "[]v1beta1.JSON{" - prefix := "v1beta1.JSON{[]byte{" - for _, v := range value { - res = res + prefix + parseByteValue(v.Raw) + "}}," - } - return strings.TrimSuffix(res, ",") + "}" -} - -// check type of enum element value to match type of field -func checkType(props *v1beta1.JSONSchemaProps, s string, enums *[]v1beta1.JSON) { - - // TODO support more types check - switch props.Type { - case "int", "int64", "uint64": - if _, err := strconv.ParseInt(s, 0, 64); err != nil { - log.Fatalf("Invalid integer value [%v] for a field of integer type", s) - } - *enums = append(*enums, v1beta1.JSON{Raw: []byte(fmt.Sprintf("%v", s))}) - case "int32", "unit32": - if _, err := strconv.ParseInt(s, 0, 32); err != nil { - log.Fatalf("Invalid integer value [%v] for a field of integer32 type", s) - } - *enums = append(*enums, v1beta1.JSON{Raw: []byte(fmt.Sprintf("%v", s))}) - case "float", "float32": - if _, err := strconv.ParseFloat(s, 32); err != nil { - log.Fatalf("Invalid float value [%v] for a field of float32 type", s) - } - *enums = append(*enums, v1beta1.JSON{Raw: []byte(fmt.Sprintf("%v", s))}) - case "float64": - if _, err := strconv.ParseFloat(s, 64); err != nil { - log.Fatalf("Invalid float value [%v] for a field of float type", s) - } - *enums = append(*enums, v1beta1.JSON{Raw: []byte(fmt.Sprintf("%v", s))}) - case "string": - *enums = append(*enums, v1beta1.JSON{Raw: []byte(`"` + s + `"`)}) - } -} - -// Scale subresource requires specpath, statuspath, selectorpath key values, represents for JSONPath of -// SpecReplicasPath, StatusReplicasPath, LabelSelectorPath separately. e.g. -// +kubebuilder:subresource:scale:specpath=.spec.replica,statuspath=.status.replica,selectorpath= -func parseScaleParams(t *types.Type) (map[string]string, error) { - jsonPath := make(map[string]string) - for _, c := range t.CommentLines { - if strings.Contains(c, "+kubebuilder:subresource:scale") { - paths := strings.Replace(c, "+kubebuilder:subresource:scale:", "", -1) - path := strings.Split(paths, ",") - if len(path) < 2 { - return nil, fmt.Errorf(jsonPathError) - } - for _, s := range path { - fmt.Printf("\n[debug] %s", s) - } - for _, s := range path { - kv := strings.Split(s, "=") - if kv[0] == specReplicasPath || kv[0] == statusReplicasPath || kv[0] == labelSelectorPath { - jsonPath[kv[0]] = kv[1] - } else { - return nil, fmt.Errorf(jsonPathError) - } - } - var ok bool - _, ok = jsonPath[specReplicasPath] - if !ok { - return nil, fmt.Errorf(jsonPathError) - } - _, ok = jsonPath[statusReplicasPath] - if !ok { - return nil, fmt.Errorf(jsonPathError) - } - return jsonPath, nil - } - } - return nil, fmt.Errorf(jsonPathError) -} - -// printColumnKV parses key-value string formatted as "foo=bar" and returns key and value. -func printColumnKV(s string) (key, value string, err error) { - kv := strings.SplitN(s, "=", 2) - if len(kv) != 2 { - err = fmt.Errorf("invalid key value pair") - return key, value, err - } - key, value = kv[0], kv[1] - if strings.HasPrefix(value, "\"") && strings.HasSuffix(value, "\"") { - value = value[1 : len(value)-1] - } - return key, value, err -} - -// helperPrintColumn is a helper function for the parsePrintColumnParams to compute printer columns. -func helperPrintColumn(parts string, comment string) (v1beta1.CustomResourceColumnDefinition, error) { - config := v1beta1.CustomResourceColumnDefinition{} - var count int - part := strings.Split(parts, ",") - if len(part) < 3 { - return v1beta1.CustomResourceColumnDefinition{}, fmt.Errorf(printColumnError) - } - - for _, s := range part { - fmt.Printf("\n[debug] %s", s) - } - for _, elem := range strings.Split(parts, ",") { - key, value, err := printColumnKV(elem) - if err != nil { - return v1beta1.CustomResourceColumnDefinition{}, - fmt.Errorf("//+kubebuilder:printcolumn: tags must be key value pairs.Expected "+ - "keys [name=,type=,description=,format=] "+ - "Got string: [%s]", parts) - } - if key == printColumnName || key == printColumnType || key == printColumnPath { - count++ - } - switch key { - case printColumnName: - config.Name = value - case printColumnType: - if value == "integer" || value == "number" || value == "string" || value == "boolean" || value == "date" { - config.Type = value - } else { - return v1beta1.CustomResourceColumnDefinition{}, fmt.Errorf("invalid value for %s printcolumn", printColumnType) - } - case printColumnFormat: - if config.Type == "integer" && (value == "int32" || value == "int64") { - config.Format = value - } else if config.Type == "number" && (value == "float" || value == "double") { - config.Format = value - } else if config.Type == "string" && (value == "byte" || value == "date" || value == "date-time" || value == "password") { - config.Format = value - } else { - return v1beta1.CustomResourceColumnDefinition{}, fmt.Errorf("invalid value for %s printcolumn", printColumnFormat) - } - case printColumnPath: - config.JSONPath = value - case printColumnPri: - i, err := strconv.Atoi(value) - v := int32(i) - if err != nil { - return v1beta1.CustomResourceColumnDefinition{}, fmt.Errorf("invalid value for %s printcolumn", printColumnPri) - } - config.Priority = v - case printColumnDescr: - config.Description = value - default: - return v1beta1.CustomResourceColumnDefinition{}, fmt.Errorf(printColumnError) - } - } - if count != 3 { - return v1beta1.CustomResourceColumnDefinition{}, fmt.Errorf(printColumnError) - } - return config, nil -} - -// printcolumn requires name,type,JSONPath fields and rest of the field are optional -// +kubebuilder:printcolumn:name=,type=,description=,JSONPath:<.spec.Name>,priority=,format= -func parsePrintColumnParams(t *types.Type) ([]v1beta1.CustomResourceColumnDefinition, error) { - result := []v1beta1.CustomResourceColumnDefinition{} - for _, comment := range t.CommentLines { - if strings.Contains(comment, "+kubebuilder:printcolumn") { - parts := strings.Replace(comment, "+kubebuilder:printcolumn:", "", -1) - res, err := helperPrintColumn(parts, comment) - if err != nil { - return []v1beta1.CustomResourceColumnDefinition{}, err - } - result = append(result, res) - } - } - return result, nil -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/types.go b/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/types.go deleted file mode 100644 index ebfaf620d0f..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/types.go +++ /dev/null @@ -1,213 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package codegen - -import ( - "sort" - - rbacv1 "k8s.io/api/rbac/v1" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" - "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/gengo/types" -) - -// APIs is the information of a collection of API -type APIs struct { - // Domain is the domain portion of the group - e.g. k8s.io - Domain string - - // Package is the name of the root API package - e.g. github.com/my-org/my-repo/pkg/apis - Package string - - // Pkg the Package for the root API package - Pkg *types.Package - - // Groups is the list of API groups found under the apis package - Groups map[string]*APIGroup - - Rules []rbacv1.PolicyRule - - Informers map[v1.GroupVersionKind]bool -} - -// GetRules get rules of the APIs -func (apis *APIs) GetRules() []rbacv1.PolicyRule { - rules := []rbacv1.PolicyRule{} - rulesIndex := map[v1.GroupResource]sets.String{} - for _, rule := range apis.Rules { - for _, g := range rule.APIGroups { - for _, r := range rule.Resources { - gr := v1.GroupResource{ - Group: g, - Resource: r, - } - if _, found := rulesIndex[gr]; !found { - rulesIndex[gr] = sets.NewString() - } - rulesIndex[gr].Insert(rule.Verbs...) - } - } - } - for gr, v := range rulesIndex { - verbs := v.List() - sort.Strings(verbs) - rule := rbacv1.PolicyRule{ - Resources: []string{gr.Resource}, - APIGroups: []string{gr.Group}, - Verbs: verbs, - } - rules = append(rules, rule) - } - return rules -} - -// APIGroup contains information of an API group. -type APIGroup struct { - // Package is the name of the go package the api group is under - e.g. github.com/me/apiserver-helloworld/apis - Package string - // Domain is the domain portion of the group - e.g. k8s.io - Domain string - // Group is the short name of the group - e.g. mushroomkingdom - Group string - GroupTitle string - // Versions is the list of all versions for this group keyed by name - Versions map[string]*APIVersion - - UnversionedResources map[string]*APIResource - - // Structs is a list of unversioned definitions that must be generated - Structs []*Struct - Pkg *types.Package - PkgPath string -} - -// Struct contains information of a struct. -type Struct struct { - // Name is the name of the type - Name string - // genClient - GenClient bool - GenDeepCopy bool - NonNamespaced bool - - GenUnversioned bool - // Fields is the list of fields appearing in the struct - Fields []*Field -} - -// Field contains information of a field. -type Field struct { - // Name is the name of the field - Name string - // For versioned Kubernetes types, this is the versioned package - VersionedPackage string - // For versioned Kubernetes types, this is the unversioned package - UnversionedImport string - UnversionedType string -} - -// APIVersion contains information of an API version. -type APIVersion struct { - // Domain is the group domain - e.g. k8s.io - Domain string - // Group is the group name - e.g. mushroomkingdom - Group string - // Version is the api version - e.g. v1beta1 - Version string - // Resources is a list of resources appearing in the API version keyed by name - Resources map[string]*APIResource - // Pkg is the Package object from code-gen - Pkg *types.Package -} - -// APIResource contains information of an API resource. -type APIResource struct { - // Domain is the group domain - e.g. k8s.io - Domain string - // Group is the group name - e.g. mushroomkingdom - Group string - // Version is the api version - e.g. v1beta1 - Version string - // Kind is the resource name - e.g. PeachesCastle - Kind string - // Resource is the resource name - e.g. peachescastles - Resource string - // REST is the rest.Storage implementation used to handle requests - // This field is optional. The standard REST implementation will be used - // by default. - REST string - // Subresources is a map of subresources keyed by name - Subresources map[string]*APISubresource - // Type is the Type object from code-gen - Type *types.Type - // Strategy is name of the struct to use for the strategy - Strategy string - // Strategy is name of the struct to use for the strategy - StatusStrategy string - // NonNamespaced indicates that the resource kind is non namespaced - NonNamespaced bool - - ShortName string - - JSONSchemaProps v1beta1.JSONSchemaProps - CRD v1beta1.CustomResourceDefinition - Validation string - ValidationComments string - // DocAnnotation is a map of annotations by name for doc. e.g. warning, notes message - DocAnnotation map[string]string - // Categories is a list of categories the resource is part of. - Categories []string -} - -// APISubresource contains information of an API subresource. -type APISubresource struct { - // Domain is the group domain - e.g. k8s.io - Domain string - // Group is the group name - e.g. mushroomkingdom - Group string - // Version is the api version - e.g. v1beta1 - Version string - // Kind is the resource name - e.g. PeachesCastle - Kind string - // Resource is the resource name - e.g. peachescastles - Resource string - // Request is the subresource request type - e.g. ScaleCastle - Request string - // REST is the rest.Storage implementation used to handle requests - REST string - // Path is the subresource path - e.g. scale - Path string - - // ImportPackage is the import statement that must appear for the Request - ImportPackage string - - // RequestType is the type of the request - RequestType *types.Type - - // RESTType is the type of the request handler - RESTType *types.Type -} - -// Controller contains information of a controller. -type Controller struct { - Target schema.GroupVersionKind - Resource string - Pkg *types.Package - Repo string -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/internal/general/util.go b/vendor/sigs.k8s.io/controller-tools/pkg/internal/general/util.go deleted file mode 100644 index 3a81529a7a9..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/internal/general/util.go +++ /dev/null @@ -1,102 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package general - -import ( - "fmt" - "go/ast" - "go/parser" - "go/token" - "os" - "path/filepath" - "strings" -) - -// isGoFile filters files from parsing. -func isGoFile(f os.FileInfo) bool { - // ignore non-Go or Go test files - name := f.Name() - return !f.IsDir() && - !strings.HasPrefix(name, ".") && - !strings.HasSuffix(name, "_test.go") && - strings.HasSuffix(name, ".go") -} - -// GetAnnotation extracts the annotation from comment text. -// It will return "foo" for comment "+kubebuilder:webhook:foo" . -func GetAnnotation(c, name string) string { - prefix := fmt.Sprintf("+%s:", name) - if strings.HasPrefix(c, prefix) { - return strings.TrimPrefix(c, prefix) - } - return "" -} - -// ParseKV parses key-value string formatted as "foo=bar" and returns key and value. -func ParseKV(s string) (key, value string, err error) { - kv := strings.Split(s, "=") - if len(kv) != 2 { - err = fmt.Errorf("invalid key value pair") - return key, value, err - } - key, value = kv[0], kv[1] - if strings.HasPrefix(value, "\"") && strings.HasSuffix(value, "\"") { - value = value[1 : len(value)-1] - } - return key, value, err -} - -// ParseDir parses the Go files under given directory and parses the annotation by -// invoking the parseFn function on each comment group (multi-lines comments). -// TODO(droot): extend it to multiple dirs -func ParseDir(dir string, parseFn func(string) error) error { - fset := token.NewFileSet() - - err := filepath.Walk(dir, - func(path string, info os.FileInfo, err error) error { - if !isGoFile(info) { - // TODO(droot): enable this output based on verbose flag - // fmt.Println("skipping non-go file", path) - return nil - } - return ParseFile(fset, path, nil, parseFn) - }) - return err -} - -// ParseFile parses given filename or content src and parses annotations by -// invoking the parseFn function on each comment group (multi-lines comments). -func ParseFile(fset *token.FileSet, filename string, src interface{}, parseFn func(string) error) error { - f, err := parser.ParseFile(fset, filename, src, parser.ParseComments) - if err != nil { - fmt.Printf("error from parse.ParseFile: %v", err) - return err - } - - // using commentMaps here because it sanitizes the comment text by removing - // comment markers, compresses newlines etc. - cmap := ast.NewCommentMap(fset, f, f.Comments) - - for _, commentGroup := range cmap.Comments() { - err = parseFn(commentGroup.Text()) - if err != nil { - fmt.Print("error when parsing annotation") - return err - } - } - return nil -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/rbac/manifests.go b/vendor/sigs.k8s.io/controller-tools/pkg/rbac/manifests.go deleted file mode 100644 index a49b862fda2..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/rbac/manifests.go +++ /dev/null @@ -1,152 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package rbac - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - - "github.com/ghodss/yaml" - rbacv1 "k8s.io/api/rbac/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/controller-tools/pkg/internal/general" -) - -// ManifestOptions represent options for generating the RBAC manifests. -type ManifestOptions struct { - InputDir string - OutputDir string - Name string - Labels map[string]string -} - -// SetDefaults sets up the default options for RBAC Manifest generator. -func (o *ManifestOptions) SetDefaults() { - o.Name = "manager" - o.InputDir = filepath.Join(".", "pkg") - o.OutputDir = filepath.Join(".", "config", "rbac") -} - -// RoleName returns the RBAC role name to be used in the manifests. -func (o *ManifestOptions) RoleName() string { - return o.Name + "-role" -} - -// RoleBindingName returns the RBAC role binding name to be used in the manifests. -func (o *ManifestOptions) RoleBindingName() string { - return o.Name + "-rolebinding" -} - -// Namespace returns the namespace to be used in the RBAC manifests. -func (o *ManifestOptions) Namespace() string { - // TODO(droot): define this as a constant and share it with scaffold pkg. - return "system" -} - -// Validate validates the input options. -func (o *ManifestOptions) Validate() error { - if _, err := os.Stat(o.InputDir); err != nil { - return fmt.Errorf("invalid input directory '%s' %v", o.InputDir, err) - } - return nil -} - -// Generate generates RBAC manifests by parsing the RBAC annotations in Go source -// files specified in the input directory. -func Generate(o *ManifestOptions) error { - if err := o.Validate(); err != nil { - return err - } - - ops := parserOptions{ - rules: []rbacv1.PolicyRule{}, - } - err := general.ParseDir(o.InputDir, ops.parseAnnotation) - if err != nil { - return fmt.Errorf("failed to parse the input dir %v", err) - } - if len(ops.rules) == 0 { - return nil - } - roleManifest, err := getClusterRoleManifest(ops.rules, o) - if err != nil { - return fmt.Errorf("failed to generate role manifest %v", err) - } - - roleBindingManifest, err := getClusterRoleBindingManifest(o) - if err != nil { - return fmt.Errorf("failed to generate role binding manifests %v", err) - } - - err = os.MkdirAll(o.OutputDir, os.ModePerm) - if err != nil { - return fmt.Errorf("failed to create output dir %v", err) - } - roleManifestFile := filepath.Join(o.OutputDir, "rbac_role.yaml") - if err := ioutil.WriteFile(roleManifestFile, roleManifest, 0666); err != nil { - return fmt.Errorf("failed to write role manifest YAML file %v", err) - } - - roleBindingManifestFile := filepath.Join(o.OutputDir, "rbac_role_binding.yaml") - if err := ioutil.WriteFile(roleBindingManifestFile, roleBindingManifest, 0666); err != nil { - return fmt.Errorf("failed to write role manifest YAML file %v", err) - } - return nil -} - -func getClusterRoleManifest(rules []rbacv1.PolicyRule, o *ManifestOptions) ([]byte, error) { - role := rbacv1.ClusterRole{ - TypeMeta: metav1.TypeMeta{ - Kind: "ClusterRole", - APIVersion: "rbac.authorization.k8s.io/v1", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: o.RoleName(), - Labels: o.Labels, - }, - Rules: rules, - } - return yaml.Marshal(role) -} - -func getClusterRoleBindingManifest(o *ManifestOptions) ([]byte, error) { - rolebinding := &rbacv1.ClusterRoleBinding{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "rbac.authorization.k8s.io/v1", - Kind: "ClusterRoleBinding", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: o.RoleBindingName(), - Labels: o.Labels, - }, - Subjects: []rbacv1.Subject{ - { - Name: "default", - Namespace: o.Namespace(), - Kind: "ServiceAccount", - }, - }, - RoleRef: rbacv1.RoleRef{ - Name: o.RoleName(), - Kind: "ClusterRole", - APIGroup: "rbac.authorization.k8s.io", - }, - } - return yaml.Marshal(rolebinding) -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/rbac/parser.go b/vendor/sigs.k8s.io/controller-tools/pkg/rbac/parser.go deleted file mode 100644 index d28cfd9e673..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/rbac/parser.go +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package rbac contain libraries for generating RBAC manifests from RBAC -// annotations in Go source files. -package rbac - -import ( - "log" - "strings" - - rbacv1 "k8s.io/api/rbac/v1" - "sigs.k8s.io/controller-tools/pkg/internal/general" -) - -type parserOptions struct { - rules []rbacv1.PolicyRule -} - -// parseAnnotation parses RBAC annotations -func (o *parserOptions) parseAnnotation(commentText string) error { - for _, comment := range strings.Split(commentText, "\n") { - comment := strings.TrimSpace(comment) - if strings.HasPrefix(comment, "+rbac") { - if ann := general.GetAnnotation(comment, "rbac"); ann != "" { - o.rules = append(o.rules, parseRBACTag(ann)) - } - } - if strings.HasPrefix(comment, "+kubebuilder:rbac") { - if ann := general.GetAnnotation(comment, "kubebuilder:rbac"); ann != "" { - o.rules = append(o.rules, parseRBACTag(ann)) - } - } - } - return nil -} - -// parseRBACTag parses the given RBAC annotation in to an RBAC PolicyRule. -// This is copied from Kubebuilder code. -func parseRBACTag(tag string) rbacv1.PolicyRule { - result := rbacv1.PolicyRule{} - for _, elem := range strings.Split(tag, ",") { - key, value, err := general.ParseKV(elem) - if err != nil { - log.Fatalf("// +kubebuilder:rbac: tags must be key value pairs. Expected "+ - "keys [groups=,resources=,verbs=] "+ - "Got string: [%s]", tag) - } - values := strings.Split(value, ";") - switch key { - case "groups": - normalized := []string{} - for _, v := range values { - if v == "core" { - normalized = append(normalized, "") - } else { - normalized = append(normalized, v) - } - } - result.APIGroups = normalized - case "resources": - result.Resources = values - case "verbs": - result.Verbs = values - case "urls": - result.NonResourceURLs = values - } - } - return result -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/util/util.go b/vendor/sigs.k8s.io/controller-tools/pkg/util/util.go deleted file mode 100644 index 9649913b389..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/util/util.go +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package util - -import ( - "fmt" - "io" - "log" - "os" - "path/filepath" - - "github.com/spf13/afero" -) - -// FileWriter is a io wrapper to write files -type FileWriter struct { - Fs afero.Fs -} - -// WriteCloser returns a WriteCloser to write to given path -func (fw *FileWriter) WriteCloser(path string) (io.Writer, error) { - if fw.Fs == nil { - fw.Fs = afero.NewOsFs() - } - dir := filepath.Dir(path) - err := fw.Fs.MkdirAll(dir, 0700) - if err != nil { - return nil, err - } - - fi, err := fw.Fs.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - if err != nil { - return nil, err - } - - return fi, nil -} - -// WriteFile write given content to the file path -func (fw *FileWriter) WriteFile(filePath string, content []byte) error { - if fw.Fs == nil { - fw.Fs = afero.NewOsFs() - } - f, err := fw.WriteCloser(filePath) - if err != nil { - return fmt.Errorf("failed to create %s: %v", filePath, err) - } - - if c, ok := f.(io.Closer); ok { - defer func() { - if err := c.Close(); err != nil { - log.Fatal(err) - } - }() - } - - _, err = f.Write(content) - if err != nil { - return fmt.Errorf("failed to write %s: %v", filePath, err) - } - - return nil -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/webhook/internal/client.go b/vendor/sigs.k8s.io/controller-tools/pkg/webhook/internal/client.go deleted file mode 100644 index 7c043a4d2b1..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/webhook/internal/client.go +++ /dev/null @@ -1,189 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package internal - -import ( - "bytes" - "context" - "errors" - "sort" - - "github.com/ghodss/yaml" - "github.com/spf13/afero" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/kubernetes/scheme" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -var decoder = scheme.Codecs.UniversalDeserializer() - -// NewManifestClient constructs a new manifestClient. -func NewManifestClient(file string) client.Client { - return &manifestClient{ - ManifestFile: file, - fs: afero.NewOsFs(), - } -} - -// manifestClient reads from and writes to the file specified by ManifestFile. -type manifestClient struct { - ManifestFile string - - objects map[schema.GroupVersionKind][]byte - fs afero.Fs -} - -var _ client.Client = &manifestClient{} - -func (c *manifestClient) index() error { - c.objects = map[schema.GroupVersionKind][]byte{} - - _, err := c.fs.Stat(c.ManifestFile) - if err != nil { - return nil - } - - b, err := afero.ReadFile(c.fs, c.ManifestFile) - if err != nil { - return err - } - objs := bytes.Split(b, []byte("---\n")) - for _, objectB := range objs { - objB := bytes.TrimSpace(objectB) - if len(objB) == 0 { - continue - } - _, gvk, err := decoder.Decode(objB, nil, nil) - if err != nil { - return err - } - c.objects[*gvk] = objectB - } - return nil -} - -// Get read from the target file. -func (c *manifestClient) Get(ctx context.Context, key client.ObjectKey, obj runtime.Object) error { - if obj == nil { - return errors.New("obj should not be nil") - } - err := c.index() - if err != nil { - return err - } - gvk := obj.GetObjectKind().GroupVersionKind() - objectB, found := c.objects[gvk] - if !found { - return apierrors.NewNotFound(schema.GroupResource{}, key.Name) - } - _, _, err = decoder.Decode(objectB, nil, obj) - return err -} - -// List does nothing, it should not be invoked. -func (c *manifestClient) List(ctx context.Context, opts *client.ListOptions, list runtime.Object) error { - return errors.New("method List is not implemented") -} - -// Create creates an object and write it to the target file with other objects if any. -// If the object needs to be written already exists, it will error out. -func (c *manifestClient) Create(ctx context.Context, obj runtime.Object) error { - if obj == nil { - return errors.New("obj should not be nil") - } - err := c.index() - if err != nil { - return err - } - - gvk := obj.GetObjectKind().GroupVersionKind() - _, found := c.objects[gvk] - if found { - accessor, err := meta.Accessor(obj) - if err != nil { - return err - } - return apierrors.NewAlreadyExists(schema.GroupResource{}, accessor.GetName()) - } - b, err := yaml.Marshal(obj) - if err != nil { - return err - } - c.objects[gvk] = b - return c.writeObjects() -} - -// Delete does nothing, it should not be invoked. -func (c *manifestClient) Delete(ctx context.Context, obj runtime.Object, opts ...client.DeleteOptionFunc) error { - return errors.New("method Delete is not implemented") -} - -// Update replace the object if it already exists on the target file. -// Otherwise, it creates the object. -func (c *manifestClient) Update(ctx context.Context, obj runtime.Object) error { - if obj == nil { - return errors.New("obj should not be nil") - } - err := c.index() - if err != nil { - return err - } - - gvk := obj.GetObjectKind().GroupVersionKind() - m, err := yaml.Marshal(obj) - if err != nil { - return err - } - c.objects[gvk] = m - return c.writeObjects() -} - -// writeObjects writes objects to the target file in yaml format separated by `---`. -func (c *manifestClient) writeObjects() error { - needSeparator := false - buf := bytes.NewBuffer(nil) - - var gvks []schema.GroupVersionKind - for gvk := range c.objects { - gvks = append(gvks, gvk) - } - - sort.Slice(gvks, func(i, j int) bool { - return gvks[i].String() < gvks[j].String() - }) - - for _, gvk := range gvks { - if needSeparator { - buf.WriteString("---\n") - } - needSeparator = true - _, err := buf.Write(c.objects[gvk]) - if err != nil { - return err - } - } - return afero.WriteFile(c.fs, c.ManifestFile, buf.Bytes(), 0666) -} - -// Status returns a nil client.StatusWriter. -func (c *manifestClient) Status() client.StatusWriter { - return nil -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/webhook/internal/manager.go b/vendor/sigs.k8s.io/controller-tools/pkg/webhook/internal/manager.go deleted file mode 100644 index c4f7a5800f8..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/webhook/internal/manager.go +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package internal - -import ( - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/record" - "sigs.k8s.io/controller-runtime/pkg/cache" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission/types" -) - -// Manager is a dummy manager that does nothing. -type Manager struct{} - -var _ manager.Manager = &Manager{} - -// Add will set reqeusted dependencies on the component, and cause the component to be -// started when Start is called. Add will inject any dependencies for which the argument -// implements the inject interface - e.g. inject.Client -func (m *Manager) Add(manager.Runnable) error { return nil } - -// SetFields will set any dependencies on an object for which the object has implemented the inject -// interface - e.g. inject.Client. -func (m *Manager) SetFields(interface{}) error { return nil } - -// Start starts all registered Controllers and blocks until the Stop channel is closed. -// Returns an error if there is an error starting any controller. -func (m *Manager) Start(<-chan struct{}) error { return nil } - -// GetConfig returns an initialized Config -func (m *Manager) GetConfig() *rest.Config { return nil } - -// GetScheme returns and initialized Scheme -func (m *Manager) GetScheme() *runtime.Scheme { return nil } - -// GetAdmissionDecoder returns the runtime.Decoder based on the scheme. -func (m *Manager) GetAdmissionDecoder() types.Decoder { return nil } - -// GetClient returns a client configured with the Config -func (m *Manager) GetClient() client.Client { return nil } - -// GetFieldIndexer returns a client.FieldIndexer configured with the client -func (m *Manager) GetFieldIndexer() client.FieldIndexer { return nil } - -// GetCache returns a cache.Cache -func (m *Manager) GetCache() cache.Cache { return nil } - -// GetRecorder returns a new EventRecorder for the provided name -func (m *Manager) GetRecorder(name string) record.EventRecorder { return nil } - -// GetRESTMapper returns a RESTMapper -func (m *Manager) GetRESTMapper() meta.RESTMapper { return nil } diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/webhook/manifests.go b/vendor/sigs.k8s.io/controller-tools/pkg/webhook/manifests.go deleted file mode 100644 index dc6c57a5802..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/webhook/manifests.go +++ /dev/null @@ -1,163 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package webhook - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "path" - "path/filepath" - "strings" - "text/template" - - "github.com/ghodss/yaml" - - "sigs.k8s.io/controller-runtime/pkg/webhook" - generateinteral "sigs.k8s.io/controller-tools/pkg/internal/general" - "sigs.k8s.io/controller-tools/pkg/webhook/internal" -) - -// ManifestOptions represent options for generating the webhook manifests. -type ManifestOptions struct { - InputDir string - OutputDir string - PatchOutputDir string - - webhooks []webhook.Webhook - svrOps *webhook.ServerOptions - svr *webhook.Server -} - -// SetDefaults sets up the default options for RBAC Manifest generator. -func (o *ManifestOptions) SetDefaults() { - o.InputDir = filepath.Join(".", "pkg", "webhook") - o.OutputDir = filepath.Join(".", "config", "webhook") - o.PatchOutputDir = filepath.Join(".", "config", "default") -} - -// Validate validates the input options. -func (o *ManifestOptions) Validate() error { - if _, err := os.Stat(o.InputDir); err != nil { - return fmt.Errorf("invalid input directory '%s' %v", o.InputDir, err) - } - return nil -} - -// Generate generates RBAC manifests by parsing the RBAC annotations in Go source -// files specified in the input directory. -func Generate(o *ManifestOptions) error { - if err := o.Validate(); err != nil { - return err - } - - _, err := os.Stat(o.OutputDir) - if os.IsNotExist(err) { - err = os.MkdirAll(o.OutputDir, 0766) - if err != nil { - return err - } - } else if err != nil { - return err - } - - o.webhooks = []webhook.Webhook{} - o.svrOps = &webhook.ServerOptions{ - Client: internal.NewManifestClient(path.Join(o.OutputDir, "webhook.yaml")), - } - err = generateinteral.ParseDir(o.InputDir, o.parseAnnotation) - if err != nil { - return fmt.Errorf("failed to parse the input dir: %v", err) - } - - o.svr, err = webhook.NewServer("generator", &internal.Manager{}, *o.svrOps) - if err != nil { - return err - } - err = o.svr.Register(o.webhooks...) - if err != nil { - return fmt.Errorf("failed to process the input before generating: %v", err) - } - - err = o.svr.InstallWebhookManifests() - if err != nil { - return err - } - - return o.labelPatch() -} - -func (o *ManifestOptions) labelPatch() error { - var kustomizeLabelPatch = `apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: controller-manager -spec: - template: - metadata: -{{- with .Labels }} - labels: -{{ toYaml . | indent 8 }} -{{- end }} -` - - type KustomizeLabelPatch struct { - Labels map[string]string - } - - p := KustomizeLabelPatch{Labels: o.svrOps.Service.Selectors} - funcMap := template.FuncMap{ - "toYaml": toYAML, - "indent": indent, - } - temp, err := template.New("kustomizeLabelPatch").Funcs(funcMap).Parse(kustomizeLabelPatch) - if err != nil { - return err - } - buf := bytes.NewBuffer(nil) - if err := temp.Execute(buf, p); err != nil { - return err - } - return ioutil.WriteFile(path.Join(o.PatchOutputDir, "manager_label_patch.yaml"), buf.Bytes(), 0644) -} - -func toYAML(m map[string]string) (string, error) { - d, err := yaml.Marshal(m) - return string(d), err -} - -func indent(n int, s string) (string, error) { - buf := bytes.NewBuffer(nil) - for _, elem := range strings.Split(s, "\n") { - for i := 0; i < n; i++ { - _, err := buf.WriteRune(' ') - if err != nil { - return "", err - } - } - _, err := buf.WriteString(elem) - if err != nil { - return "", err - } - _, err = buf.WriteRune('\n') - if err != nil { - return "", err - } - } - return strings.TrimRight(buf.String(), " \n"), nil -} diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/webhook/parser.go b/vendor/sigs.k8s.io/controller-tools/pkg/webhook/parser.go deleted file mode 100644 index dc8a63adff4..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/webhook/parser.go +++ /dev/null @@ -1,255 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package webhook - -import ( - "errors" - "fmt" - "log" - "strconv" - "strings" - - admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/sets" - "sigs.k8s.io/controller-runtime/pkg/webhook" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" - webhooktypes "sigs.k8s.io/controller-runtime/pkg/webhook/types" - "sigs.k8s.io/controller-tools/pkg/internal/general" -) - -const webhookAnnotationPrefix = "kubebuilder:webhook" - -var ( - webhookTags = sets.NewString([]string{"groups", "versions", "resources", "verbs", "type", "name", "path", "failure-policy"}...) - serverTags = sets.NewString([]string{"port", "cert-dir", "service", "selector", "secret", "host", "mutating-webhook-config-name", "validating-webhook-config-name"}...) -) - -// parseAnnotation parses webhook annotations -func (o *ManifestOptions) parseAnnotation(commentText string) error { - webhookKVMap, serverKVMap := map[string]string{}, map[string]string{} - for _, comment := range strings.Split(commentText, "\n") { - comment := strings.TrimSpace(comment) - anno := general.GetAnnotation(comment, webhookAnnotationPrefix) - if len(anno) == 0 { - continue - } - for _, elem := range strings.Split(anno, ",") { - key, value, err := general.ParseKV(elem) - if err != nil { - log.Fatalf("// +kubebuilder:webhook: tags must be key value pairs. Example "+ - "keys [groups=,resources=,verbs=] "+ - "Got string: [%s]", anno) - } - switch { - case webhookTags.Has(key): - webhookKVMap[key] = value - case serverTags.Has(key): - serverKVMap[key] = value - } - } - } - - if err := o.parseWebhookAnnotation(webhookKVMap); err != nil { - return err - } - return o.parseServerAnnotation(serverKVMap) -} - -// parseWebhookAnnotation parses webhook annotations in the same comment group -// nolint: gocyclo -func (o *ManifestOptions) parseWebhookAnnotation(kvMap map[string]string) error { - if len(kvMap) == 0 { - return nil - } - rule := admissionregistrationv1beta1.RuleWithOperations{} - w := &admission.Webhook{} - for key, value := range kvMap { - switch key { - case "groups": - values := strings.Split(value, ";") - normalized := []string{} - for _, v := range values { - if v == "core" { - normalized = append(normalized, "") - } else { - normalized = append(normalized, v) - } - } - rule.APIGroups = values - - case "versions": - values := strings.Split(value, ";") - rule.APIVersions = values - - case "resources": - values := strings.Split(value, ";") - rule.Resources = values - - case "verbs": - values := strings.Split(value, ";") - var ops []admissionregistrationv1beta1.OperationType - for _, v := range values { - switch strings.ToLower(v) { - case strings.ToLower(string(admissionregistrationv1beta1.Create)): - ops = append(ops, admissionregistrationv1beta1.Create) - case strings.ToLower(string(admissionregistrationv1beta1.Update)): - ops = append(ops, admissionregistrationv1beta1.Update) - case strings.ToLower(string(admissionregistrationv1beta1.Delete)): - ops = append(ops, admissionregistrationv1beta1.Delete) - case strings.ToLower(string(admissionregistrationv1beta1.Connect)): - ops = append(ops, admissionregistrationv1beta1.Connect) - case strings.ToLower(string(admissionregistrationv1beta1.OperationAll)): - ops = append(ops, admissionregistrationv1beta1.OperationAll) - default: - return fmt.Errorf("unknown operation: %v", v) - } - } - rule.Operations = ops - - case "type": - switch strings.ToLower(value) { - case "mutating": - w.Type = webhooktypes.WebhookTypeMutating - case "validating": - w.Type = webhooktypes.WebhookTypeValidating - default: - return fmt.Errorf("unknown webhook type: %v", value) - } - - case "name": - w.Name = value - - case "path": - w.Path = value - - case "failure-policy": - switch strings.ToLower(value) { - case strings.ToLower(string(admissionregistrationv1beta1.Ignore)): - fp := admissionregistrationv1beta1.Ignore - w.FailurePolicy = &fp - case strings.ToLower(string(admissionregistrationv1beta1.Fail)): - fp := admissionregistrationv1beta1.Fail - w.FailurePolicy = &fp - default: - return fmt.Errorf("unknown webhook failure policy: %v", value) - } - } - } - w.Rules = []admissionregistrationv1beta1.RuleWithOperations{rule} - w.Handlers = []admission.Handler{admission.HandlerFunc(nil)} - o.webhooks = append(o.webhooks, w) - return nil -} - -// parseWebhookAnnotation parses webhook server annotations in the same comment group -// nolint: gocyclo -func (o *ManifestOptions) parseServerAnnotation(kvMap map[string]string) error { - if len(kvMap) == 0 { - return nil - } - for key, value := range kvMap { - switch key { - case "port": - port, err := strconv.Atoi(value) - if err != nil { - return err - } - o.svrOps.Port = int32(port) - case "cert-dir": - o.svrOps.CertDir = value - case "service": - // format: - split := strings.Split(value, ":") - if len(split) != 2 || len(split[0]) == 0 || len(split[1]) == 0 { - return fmt.Errorf("invalid service format: expect , but got %q", value) - } - if o.svrOps.BootstrapOptions == nil { - o.svrOps.BootstrapOptions = &webhook.BootstrapOptions{} - } - if o.svrOps.Service == nil { - o.svrOps.Service = &webhook.Service{} - } - o.svrOps.Service.Namespace = split[0] - o.svrOps.Service.Name = split[1] - case "selector": - // selector of the service. Format: - split := strings.Split(value, ";") - if len(split) == 0 { - return fmt.Errorf("invalid selector format: expect , but got %q", value) - } - if o.svrOps.BootstrapOptions == nil { - o.svrOps.BootstrapOptions = &webhook.BootstrapOptions{} - } - if o.svrOps.Service == nil { - o.svrOps.Service = &webhook.Service{} - } - for _, v := range split { - l := strings.Split(v, ":") - if len(l) != 2 || len(l[0]) == 0 || len(l[1]) == 0 { - return fmt.Errorf("invalid selector format: expect , but got %q", value) - } - if o.svrOps.Service.Selectors == nil { - o.svrOps.Service.Selectors = map[string]string{} - } - o.svrOps.Service.Selectors[l[0]] = l[1] - } - case "host": - if len(value) == 0 { - return errors.New("host should not be empty if specified") - } - if o.svrOps.BootstrapOptions == nil { - o.svrOps.BootstrapOptions = &webhook.BootstrapOptions{} - } - o.svrOps.Host = &value - - case "mutating-webhook-config-name": - if len(value) == 0 { - return errors.New("mutating-webhook-config-name should not be empty if specified") - } - if o.svrOps.BootstrapOptions == nil { - o.svrOps.BootstrapOptions = &webhook.BootstrapOptions{} - } - o.svrOps.MutatingWebhookConfigName = value - - case "validating-webhook-config-name": - if len(value) == 0 { - return errors.New("validating-webhook-config-name should not be empty if specified") - } - if o.svrOps.BootstrapOptions == nil { - o.svrOps.BootstrapOptions = &webhook.BootstrapOptions{} - } - o.svrOps.ValidatingWebhookConfigName = value - - case "secret": - // format: - split := strings.Split(value, ":") - if len(split) != 2 || len(split[0]) == 0 || len(split[1]) == 0 { - return fmt.Errorf("invalid secret format: expect , but got %q", value) - } - if o.svrOps.BootstrapOptions == nil { - o.svrOps.BootstrapOptions = &webhook.BootstrapOptions{} - } - if o.svrOps.Secret == nil { - o.svrOps.Secret = &types.NamespacedName{} - } - o.svrOps.Secret.Namespace = split[0] - o.svrOps.Secret.Name = split[1] - } - } - return nil -} From 68ba3e60a2898fc9a99b0cdefdefefd122f1b8e9 Mon Sep 17 00:00:00 2001 From: avelichk Date: Fri, 27 Nov 2020 10:43:02 +0000 Subject: [PATCH 2/3] Modify SDK --- hack/gen-python-sdk/gen-sdk.sh | 1 + hack/gen-python-sdk/post_gen.py | 36 +++- hack/gen-python-sdk/swagger_config.json | 8 +- sdk/python/v1beta1/docs/KatibClient.md | 157 ++++++++++++++++++ .../v1beta1/docs/V1beta1CollectorSpec.md | 2 +- sdk/python/v1beta1/docs/V1beta1Experiment.md | 2 +- .../docs/V1beta1ExperimentCondition.md | 4 +- .../v1beta1/docs/V1beta1ExperimentList.md | 2 +- .../v1beta1/docs/V1beta1ExperimentStatus.md | 6 +- sdk/python/v1beta1/docs/V1beta1SourceSpec.md | 2 +- sdk/python/v1beta1/docs/V1beta1Suggestion.md | 2 +- .../docs/V1beta1SuggestionCondition.md | 4 +- .../v1beta1/docs/V1beta1SuggestionList.md | 2 +- .../v1beta1/docs/V1beta1SuggestionStatus.md | 6 +- sdk/python/v1beta1/docs/V1beta1Trial.md | 2 +- .../v1beta1/docs/V1beta1TrialCondition.md | 4 +- sdk/python/v1beta1/docs/V1beta1TrialList.md | 2 +- sdk/python/v1beta1/docs/V1beta1TrialSource.md | 2 +- sdk/python/v1beta1/docs/V1beta1TrialSpec.md | 2 +- sdk/python/v1beta1/docs/V1beta1TrialStatus.md | 6 +- .../v1beta1/docs/V1beta1TrialTemplate.md | 2 +- .../models/v1beta1_experiment_condition.py | 13 +- .../katib/models/v1beta1_experiment_status.py | 19 +-- .../models/v1beta1_suggestion_condition.py | 13 +- .../katib/models/v1beta1_suggestion_status.py | 19 +-- .../katib/models/v1beta1_trial_condition.py | 13 +- .../katib/models/v1beta1_trial_source.py | 7 +- .../katib/models/v1beta1_trial_spec.py | 7 +- .../katib/models/v1beta1_trial_status.py | 19 +-- .../katib/models/v1beta1_trial_template.py | 7 +- sdk/python/v1beta1/setup.py | 2 +- 31 files changed, 278 insertions(+), 95 deletions(-) create mode 100644 sdk/python/v1beta1/docs/KatibClient.md diff --git a/hack/gen-python-sdk/gen-sdk.sh b/hack/gen-python-sdk/gen-sdk.sh index 5f623fe6ec2..fd25941aba8 100755 --- a/hack/gen-python-sdk/gen-sdk.sh +++ b/hack/gen-python-sdk/gen-sdk.sh @@ -36,6 +36,7 @@ for VERSION in ${KATIB_VERSIONS[@]}; do TMP_PATH=${TMP_CODEGEN_PATH/KATIB_VERSION/$VERSION} java -jar ${SWAGGER_CODEGEN_JAR} generate -i ${SWAGGER_FILE} -l python -o ${TMP_PATH} -c ${SWAGGER_CODEGEN_CONF} + # Run post gen script. python ${POST_GEN_PYTHON_HANDLER} ${TMP_PATH} ${SDK_OUTPUT_PATH}/${VERSION} done diff --git a/hack/gen-python-sdk/post_gen.py b/hack/gen-python-sdk/post_gen.py index 6a4b9186209..a43bb2a0144 100644 --- a/hack/gen-python-sdk/post_gen.py +++ b/hack/gen-python-sdk/post_gen.py @@ -2,6 +2,11 @@ import shutil import sys +IGNORE_LINES = [ + "from kubeflow.katib.models.v1_unstructured_unstructured import V1UnstructuredUnstructured", + "from kubeflow.katib.models.v1_time import V1Time" +] + def _rewrite_helper(input_file, output_file, rewrite_rules): rules = rewrite_rules or [] @@ -11,9 +16,12 @@ def _rewrite_helper(input_file, output_file, rewrite_rules): line = f.readline() if not line: break + # Apply rewrite rules to the line. for rule in rules: line = rule(line) - lines.append(line) + # Remove ignored lines. + if not any(l in line for l in IGNORE_LINES): + lines.append(line) # Add Katib client to init file if (output_file == "sdk/python/v1beta1/kubeflow/katib/__init__.py"): @@ -30,8 +38,29 @@ def _rewrite_helper(input_file, output_file, rewrite_rules): def update_python_sdk(src, dest, versions=('v1beta1')): # tiny transformers to refine generated codes rewrite_rules = [ + # Models rules. lambda l: l.replace('import katib', 'import kubeflow.katib'), lambda l: l.replace('from katib', 'from kubeflow.katib'), + # Doc rules. + lambda l: l.replace('[**datetime**](V1Time.md)', '**datetime**'), + lambda l: l.replace('[**dict()**](V1UnstructuredUnstructured.md)', '**dict()**'), + + lambda l: l.replace('[**V1Container**](V1Container.md)', + '[**V1Container**](https://github.com/kubernetes-client/' + 'python/blob/master/kubernetes/docs/V1Container.md)'), + + lambda l: l.replace('[**V1ObjectMeta**](V1ObjectMeta.md)', + '[**V1ObjectMeta**](https://github.com/kubernetes-client/' + 'python/blob/master/kubernetes/docs/V1ObjectMeta.md)'), + + lambda l: l.replace('[**V1ListMeta**](V1ListMeta.md)', + '[**V1ListMeta**](https://github.com/kubernetes-client/' + 'python/blob/master/kubernetes/docs/V1ListMeta.md)'), + + lambda l: l.replace('[**V1HTTPGetAction**](V1HTTPGetAction.md)', + '[**V1HTTPGetAction**](https://github.com/kubernetes-client/' + 'python/blob/master/kubernetes/docs/V1HTTPGetAction.md)') + ] src_dirs = [ @@ -48,10 +77,11 @@ def update_python_sdk(src, dest, versions=('v1beta1')): ] for src_dir, dest_dir in zip(src_dirs, dest_dirs): - # remove previous generated files explicitly, in case of deprecated instances + # Remove previous generated files explicitly, in case of deprecated instances. for file in os.listdir(dest_dir): path = os.path.join(dest_dir, file) - if not os.path.isfile(path): + # We should not remove KatibClient doc. + if not os.path.isfile(path) or "/docs/KatibClient.md" in path: continue for v in versions: if v in file.lower(): diff --git a/hack/gen-python-sdk/swagger_config.json b/hack/gen-python-sdk/swagger_config.json index 6c77ced6eb9..3fdcf6f5c33 100644 --- a/hack/gen-python-sdk/swagger_config.json +++ b/hack/gen-python-sdk/swagger_config.json @@ -1,11 +1,15 @@ { - "packageName" : "katib", - "projectName" : "katib", + "packageName": "katib", + "projectName": "katib", "packageVersion": "0.1", "importMappings": { "V1Container": "from kubernetes.client import V1Container", "V1ListMeta": "from kubernetes.client import V1ListMeta", "V1ObjectMeta": "from kubernetes.client import V1ObjectMeta", "V1HTTPGetAction": "from kubernetes.client import V1HTTPGetAction" + }, + "typeMappings": { + "V1Time": "datetime", + "V1UnstructuredUnstructured": "dict()" } } diff --git a/sdk/python/v1beta1/docs/KatibClient.md b/sdk/python/v1beta1/docs/KatibClient.md new file mode 100644 index 00000000000..4f3d2766d51 --- /dev/null +++ b/sdk/python/v1beta1/docs/KatibClient.md @@ -0,0 +1,157 @@ +# KatibClient + +> KatibClient(config_file=None, context=None, client_configuration=None, persist_config=True) + +User can load authentication and cluster information from kube-config file and stores them in kubernetes.client.configuration. Parameters are as following: + +| Parameter | Description | +| --- | --- | +| config_file | Location of kube-config file. Defaults to `~/.kube/config`. Note that the config_file is needed if user want to operate katib SDK in another remote cluster, user must set `config_file` to load kube-config file explicitly, e.g. `KatibClient(config_file="~/.kube/config")`. | +| context | Set the active context. If is set to None, current_context from config file will be used. | +| client_configuration | The kubernetes.client.Configuration to set configs to. | +| persist_config | If True, config file will be updated when changed (e.g GCP token refresh). | + +The APIs for KatibClient are as following: + +| Class | Method | Description | +| ----------- | ----------------------------------------------------------- | ------------------------------------------------------------------------- | +| KatibClient | [create_experiment](#create_experiment) | Create Katib Experiment | +| KatibClient | [get_experiment](#get_experiment) | Get or watch the specified Experiment or all Experiments in the namespace | +| KatibClient | [delete_experiment](#delete_experiment) | Delete specified Experiment | +| KatibClient | [list_experiments](#list_experiments) | List all Experiments with status | +| KatibClient | [get_experiment_status](#get_experiment_status) | Get Experiment status | +| KatibClient | [is_experiment_succeeded](#is_experiment_succeeded) | Check if Experiment status is Succeeded | +| KatibClient | [list_trials](#list_trials) | List all Trials of specified Experiment with status | +| KatibClient | [get_optimal_hyperparameters](#get_optimal_hyperparameters) | Get currentOptimalTrial with parameterAssignments of an Experiment | + +## create_experiment + +> create_experiment(experiment, namespace=None) + +### Parameters + +| Name | Type | Description | Notes | +| --- | --- | --- | --- | +| experiment | [V1beta1Experiment](V1beta1Experiment.md) | experiment definition | Required | +| namespace | str | Namespace for experiment deploying to. If the `namespace` is not defined, will align with experiment definition, or use current or default namespace if namespace is not specified in experiment definition. | Optional | + + +### Return type + +object + +## get_experiment + +> get_experiment(name=None, namespace=None) + +Get Experiment in the specified namespace + +### Parameters + +| Name | Type | Description | Notes | +| --- | --- | --- | --- | +| name | str | Experiment name. If the `name` is not specified, will get all experiments in the namespace. | Optional | +| namespace | str | Experiment's namespace. Defaults to current or default namespace. | Optional | + +### Return type + +object + +## delete_experiment + +> delete_experiment(name, namespace=None) + +### Parameters + +| Name | Type | Description | Notes | +| --------- | ---- | --------------------------------------------------------------- | -------- | +| name | str | Experiment name. | Required | +| namespace | str | Experiment namespace. Defaults to current or default namespace. | Optional | + +### Return type + +object + +## list_experiments + +> list_experiments(namespace=None) + +List all Experiments with status + +### Parameters + +| Name | Type | Description | Notes | +| --------- | ---- | --------------------------------------------------------------- | -------- | +| namespace | str | Experiment namespace. Defaults to current or default namespace. | Optional | + +### Return type + +List + +## get_experiment_status + +> get_experiment_status(name, namespace=None) + +Returns Experiment status, such as Created, Running, Failed, Succeeded or Restarting. + +### Parameters + +| Name | Type | Description | Notes | +| --------- | ---- | --------------------------------------------------------------- | -------- | +| name | str | Experiment name. | Required | +| namespace | str | Experiment namespace. Defaults to current or default namespace. | Optional | + +### Return type + +Str + +## is_experiment_succeeded + +> is_experiment_succeeded(name, namespace=None) + +Returns True if Experiment succeeded; false otherwise. + +### Parameters + +| Name | Type | Description | Notes | +| --------- | ---- | --------------------------------------------------------------- | -------- | +| name | str | Experiment name. | Required | +| namespace | str | Experiment namespace. Defaults to current or default namespace. | Optional | + +### Return type + +Bool + +## list_trials + +> list_trials(name, namespace=None) + +List all Trials of an Experiment with status + +### Parameters + +| Name | Type | Description | Notes | +| --------- | ---- | --------------------------------------------------------------- | -------- | +| name | str | Experiment name. | Required | +| namespace | str | Experiment namespace. Defaults to current or default namespace. | Optional | + +### Return type + +List + +## get_optimal_hyperparameters + +> get_optimal_hyperparameters(name, namespace=None) + +Get currentOptimalTrial with parameterAssignments of an Experiment + +### Parameters + +| Name | Type | Description | Notes | +| --------- | ---- | --------------------------------------------------------------- | -------- | +| name | str | Experiment name. | Required | +| namespace | str | Experiment namespace. Defaults to current or default namespace. | Optional | + +### Return type + +Dict diff --git a/sdk/python/v1beta1/docs/V1beta1CollectorSpec.md b/sdk/python/v1beta1/docs/V1beta1CollectorSpec.md index 8eb640d6606..81ddb8d30a9 100644 --- a/sdk/python/v1beta1/docs/V1beta1CollectorSpec.md +++ b/sdk/python/v1beta1/docs/V1beta1CollectorSpec.md @@ -3,7 +3,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**custom_collector** | [**V1Container**](V1Container.md) | When kind is \"customCollector\", this field will be used | [optional] +**custom_collector** | [**V1Container**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Container.md) | When kind is \"customCollector\", this field will be used | [optional] **kind** | **str** | | [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/docs/V1beta1Experiment.md b/sdk/python/v1beta1/docs/V1beta1Experiment.md index 1a481de0d66..7c48927c037 100644 --- a/sdk/python/v1beta1/docs/V1beta1Experiment.md +++ b/sdk/python/v1beta1/docs/V1beta1Experiment.md @@ -5,7 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **api_version** | **str** | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources | [optional] **kind** | **str** | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds | [optional] -**metadata** | [**V1ObjectMeta**](V1ObjectMeta.md) | | [optional] +**metadata** | [**V1ObjectMeta**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ObjectMeta.md) | | [optional] **spec** | [**V1beta1ExperimentSpec**](V1beta1ExperimentSpec.md) | | [optional] **status** | [**V1beta1ExperimentStatus**](V1beta1ExperimentStatus.md) | | [optional] diff --git a/sdk/python/v1beta1/docs/V1beta1ExperimentCondition.md b/sdk/python/v1beta1/docs/V1beta1ExperimentCondition.md index d1aae13adc8..a19d3930588 100644 --- a/sdk/python/v1beta1/docs/V1beta1ExperimentCondition.md +++ b/sdk/python/v1beta1/docs/V1beta1ExperimentCondition.md @@ -3,8 +3,8 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**last_transition_time** | [**V1Time**](V1Time.md) | Last time the condition transitioned from one status to another. | [optional] -**last_update_time** | [**V1Time**](V1Time.md) | The last time this condition was updated. | [optional] +**last_transition_time** | **datetime** | Last time the condition transitioned from one status to another. | [optional] +**last_update_time** | **datetime** | The last time this condition was updated. | [optional] **message** | **str** | A human readable message indicating details about the transition. | [optional] **reason** | **str** | The reason for the condition's last transition. | [optional] **status** | **str** | Status of the condition, one of True, False, Unknown. | diff --git a/sdk/python/v1beta1/docs/V1beta1ExperimentList.md b/sdk/python/v1beta1/docs/V1beta1ExperimentList.md index ba1ffb6a002..107e1673122 100644 --- a/sdk/python/v1beta1/docs/V1beta1ExperimentList.md +++ b/sdk/python/v1beta1/docs/V1beta1ExperimentList.md @@ -6,7 +6,7 @@ Name | Type | Description | Notes **api_version** | **str** | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources | [optional] **items** | [**list[V1beta1Experiment]**](V1beta1Experiment.md) | | **kind** | **str** | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds | [optional] -**metadata** | [**V1ListMeta**](V1ListMeta.md) | | [optional] +**metadata** | [**V1ListMeta**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ListMeta.md) | | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/docs/V1beta1ExperimentStatus.md b/sdk/python/v1beta1/docs/V1beta1ExperimentStatus.md index 069d2d08ee0..7425e8dd7d6 100644 --- a/sdk/python/v1beta1/docs/V1beta1ExperimentStatus.md +++ b/sdk/python/v1beta1/docs/V1beta1ExperimentStatus.md @@ -3,16 +3,16 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**completion_time** | [**V1Time**](V1Time.md) | Represents time when the Experiment was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] +**completion_time** | **datetime** | Represents time when the Experiment was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] **conditions** | [**list[V1beta1ExperimentCondition]**](V1beta1ExperimentCondition.md) | List of observed runtime conditions for this Experiment. | [optional] **current_optimal_trial** | [**V1beta1OptimalTrial**](V1beta1OptimalTrial.md) | Current optimal trial parameters and observations. | [optional] **early_stopped_trial_list** | **list[str]** | List of trial names which have been early stopped. | [optional] **failed_trial_list** | **list[str]** | List of trial names which have already failed. | [optional] **killed_trial_list** | **list[str]** | List of trial names which have been killed. | [optional] -**last_reconcile_time** | [**V1Time**](V1Time.md) | Represents last time when the Experiment was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] +**last_reconcile_time** | **datetime** | Represents last time when the Experiment was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] **pending_trial_list** | **list[str]** | List of trial names which are pending. | [optional] **running_trial_list** | **list[str]** | List of trial names which are running. | [optional] -**start_time** | [**V1Time**](V1Time.md) | Represents time when the Experiment was acknowledged by the Experiment controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] +**start_time** | **datetime** | Represents time when the Experiment was acknowledged by the Experiment controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] **succeeded_trial_list** | **list[str]** | List of trial names which have already succeeded. | [optional] **trials** | **int** | Trials is the total number of trials owned by the experiment. | [optional] **trials_early_stopped** | **int** | How many trials are currently early stopped. | [optional] diff --git a/sdk/python/v1beta1/docs/V1beta1SourceSpec.md b/sdk/python/v1beta1/docs/V1beta1SourceSpec.md index 42f42acbf20..efeb352d574 100644 --- a/sdk/python/v1beta1/docs/V1beta1SourceSpec.md +++ b/sdk/python/v1beta1/docs/V1beta1SourceSpec.md @@ -5,7 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **file_system_path** | [**V1beta1FileSystemPath**](V1beta1FileSystemPath.md) | During training model, metrics may be persisted into local file in source code, such as tfEvent use case | [optional] **filter** | [**V1beta1FilterSpec**](V1beta1FilterSpec.md) | Default metric output format is {\"metric\": \"<metric_name>\", \"value\": <int_or_float>, \"epoch\": <int>, \"step\": <int>}, but if the output doesn't follow default format, please extend it here | [optional] -**http_get** | [**V1HTTPGetAction**](V1HTTPGetAction.md) | Model-train source code can expose metrics by http, such as HTTP endpoint in prometheus metric format | [optional] +**http_get** | [**V1HTTPGetAction**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1HTTPGetAction.md) | Model-train source code can expose metrics by http, such as HTTP endpoint in prometheus metric format | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/docs/V1beta1Suggestion.md b/sdk/python/v1beta1/docs/V1beta1Suggestion.md index 86aa2c3fb67..a17c90aeb10 100644 --- a/sdk/python/v1beta1/docs/V1beta1Suggestion.md +++ b/sdk/python/v1beta1/docs/V1beta1Suggestion.md @@ -5,7 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **api_version** | **str** | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources | [optional] **kind** | **str** | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds | [optional] -**metadata** | [**V1ObjectMeta**](V1ObjectMeta.md) | | [optional] +**metadata** | [**V1ObjectMeta**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ObjectMeta.md) | | [optional] **spec** | [**V1beta1SuggestionSpec**](V1beta1SuggestionSpec.md) | | [optional] **status** | [**V1beta1SuggestionStatus**](V1beta1SuggestionStatus.md) | | [optional] diff --git a/sdk/python/v1beta1/docs/V1beta1SuggestionCondition.md b/sdk/python/v1beta1/docs/V1beta1SuggestionCondition.md index e1505908738..81e3699dd77 100644 --- a/sdk/python/v1beta1/docs/V1beta1SuggestionCondition.md +++ b/sdk/python/v1beta1/docs/V1beta1SuggestionCondition.md @@ -3,8 +3,8 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**last_transition_time** | [**V1Time**](V1Time.md) | Last time the condition transitioned from one status to another. | [optional] -**last_update_time** | [**V1Time**](V1Time.md) | The last time this condition was updated. | [optional] +**last_transition_time** | **datetime** | Last time the condition transitioned from one status to another. | [optional] +**last_update_time** | **datetime** | The last time this condition was updated. | [optional] **message** | **str** | A human readable message indicating details about the transition. | [optional] **reason** | **str** | The reason for the condition's last transition. | [optional] **status** | **str** | Status of the condition, one of True, False, Unknown. | diff --git a/sdk/python/v1beta1/docs/V1beta1SuggestionList.md b/sdk/python/v1beta1/docs/V1beta1SuggestionList.md index 34df986abb7..0f434d5bd53 100644 --- a/sdk/python/v1beta1/docs/V1beta1SuggestionList.md +++ b/sdk/python/v1beta1/docs/V1beta1SuggestionList.md @@ -6,7 +6,7 @@ Name | Type | Description | Notes **api_version** | **str** | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources | [optional] **items** | [**list[V1beta1Suggestion]**](V1beta1Suggestion.md) | | **kind** | **str** | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds | [optional] -**metadata** | [**V1ListMeta**](V1ListMeta.md) | | [optional] +**metadata** | [**V1ListMeta**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ListMeta.md) | | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/docs/V1beta1SuggestionStatus.md b/sdk/python/v1beta1/docs/V1beta1SuggestionStatus.md index 6061ca199e3..9d725aa3670 100644 --- a/sdk/python/v1beta1/docs/V1beta1SuggestionStatus.md +++ b/sdk/python/v1beta1/docs/V1beta1SuggestionStatus.md @@ -4,10 +4,10 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **algorithm_settings** | [**list[V1beta1AlgorithmSetting]**](V1beta1AlgorithmSetting.md) | AlgorithmSettings defines HP or NAS algorithm settings which suggestion gRPC service returns. These settings overwrites Experiment's settings before the gRPC request. It can be empty if settings haven't been changed. | [optional] -**completion_time** | [**V1Time**](V1Time.md) | Represents time when the Suggestion was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] +**completion_time** | **datetime** | Represents time when the Suggestion was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] **conditions** | [**list[V1beta1SuggestionCondition]**](V1beta1SuggestionCondition.md) | List of observed runtime conditions for this Suggestion. | [optional] -**last_reconcile_time** | [**V1Time**](V1Time.md) | Represents last time when the Suggestion was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] -**start_time** | [**V1Time**](V1Time.md) | Represents time when the Suggestion was acknowledged by the Suggestion controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] +**last_reconcile_time** | **datetime** | Represents last time when the Suggestion was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] +**start_time** | **datetime** | Represents time when the Suggestion was acknowledged by the Suggestion controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] **suggestion_count** | **int** | Number of suggestion results | [optional] **suggestions** | [**list[V1beta1TrialAssignment]**](V1beta1TrialAssignment.md) | Suggestion results | [optional] diff --git a/sdk/python/v1beta1/docs/V1beta1Trial.md b/sdk/python/v1beta1/docs/V1beta1Trial.md index 2695b930ca0..c55a7ae377e 100644 --- a/sdk/python/v1beta1/docs/V1beta1Trial.md +++ b/sdk/python/v1beta1/docs/V1beta1Trial.md @@ -5,7 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **api_version** | **str** | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources | [optional] **kind** | **str** | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds | [optional] -**metadata** | [**V1ObjectMeta**](V1ObjectMeta.md) | | [optional] +**metadata** | [**V1ObjectMeta**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ObjectMeta.md) | | [optional] **spec** | [**V1beta1TrialSpec**](V1beta1TrialSpec.md) | | [optional] **status** | [**V1beta1TrialStatus**](V1beta1TrialStatus.md) | | [optional] diff --git a/sdk/python/v1beta1/docs/V1beta1TrialCondition.md b/sdk/python/v1beta1/docs/V1beta1TrialCondition.md index 5bb504ca331..523b81d21b4 100644 --- a/sdk/python/v1beta1/docs/V1beta1TrialCondition.md +++ b/sdk/python/v1beta1/docs/V1beta1TrialCondition.md @@ -3,8 +3,8 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**last_transition_time** | [**V1Time**](V1Time.md) | Last time the condition transitioned from one status to another. | [optional] -**last_update_time** | [**V1Time**](V1Time.md) | The last time this condition was updated. | [optional] +**last_transition_time** | **datetime** | Last time the condition transitioned from one status to another. | [optional] +**last_update_time** | **datetime** | The last time this condition was updated. | [optional] **message** | **str** | A human readable message indicating details about the transition. | [optional] **reason** | **str** | The reason for the condition's last transition. | [optional] **status** | **str** | Status of the condition, one of True, False, Unknown. | diff --git a/sdk/python/v1beta1/docs/V1beta1TrialList.md b/sdk/python/v1beta1/docs/V1beta1TrialList.md index 383008b87fe..172ed28d409 100644 --- a/sdk/python/v1beta1/docs/V1beta1TrialList.md +++ b/sdk/python/v1beta1/docs/V1beta1TrialList.md @@ -6,7 +6,7 @@ Name | Type | Description | Notes **api_version** | **str** | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources | [optional] **items** | [**list[V1beta1Trial]**](V1beta1Trial.md) | | **kind** | **str** | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds | [optional] -**metadata** | [**V1ListMeta**](V1ListMeta.md) | | [optional] +**metadata** | [**V1ListMeta**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ListMeta.md) | | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/docs/V1beta1TrialSource.md b/sdk/python/v1beta1/docs/V1beta1TrialSource.md index ea9206332c8..784b190ba78 100644 --- a/sdk/python/v1beta1/docs/V1beta1TrialSource.md +++ b/sdk/python/v1beta1/docs/V1beta1TrialSource.md @@ -4,7 +4,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **config_map** | [**V1beta1ConfigMapSource**](V1beta1ConfigMapSource.md) | ConfigMap spec represents a reference to ConfigMap | [optional] -**trial_spec** | [**V1UnstructuredUnstructured**](V1UnstructuredUnstructured.md) | TrialSpec represents trial template in unstructured format | [optional] +**trial_spec** | **dict()** | TrialSpec represents trial template in unstructured format | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/docs/V1beta1TrialSpec.md b/sdk/python/v1beta1/docs/V1beta1TrialSpec.md index a5cda13bcb3..9d0b613c921 100644 --- a/sdk/python/v1beta1/docs/V1beta1TrialSpec.md +++ b/sdk/python/v1beta1/docs/V1beta1TrialSpec.md @@ -11,7 +11,7 @@ Name | Type | Description | Notes **primary_container_name** | **str** | Name of training container where actual model training is running | [optional] **primary_pod_labels** | **dict(str, str)** | Label that determines if pod needs to be injected by Katib sidecar container | [optional] **retain_run** | **bool** | Whether to retain the trial run object after completed. | [optional] -**run_spec** | [**V1UnstructuredUnstructured**](V1UnstructuredUnstructured.md) | Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest. | [optional] +**run_spec** | **dict()** | Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest. | [optional] **success_condition** | **str** | Condition when trial custom resource is succeeded. Condition must be in GJSON format, ref https://github.com/tidwall/gjson. For example for BatchJob: status.conditions.#(type==\"Complete\")#|#(status==\"True\")# | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/docs/V1beta1TrialStatus.md b/sdk/python/v1beta1/docs/V1beta1TrialStatus.md index 42f9f94eef2..074ec07642d 100644 --- a/sdk/python/v1beta1/docs/V1beta1TrialStatus.md +++ b/sdk/python/v1beta1/docs/V1beta1TrialStatus.md @@ -3,11 +3,11 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**completion_time** | [**V1Time**](V1Time.md) | Represents time when the Trial was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC | [optional] +**completion_time** | **datetime** | Represents time when the Trial was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC | [optional] **conditions** | [**list[V1beta1TrialCondition]**](V1beta1TrialCondition.md) | List of observed runtime conditions for this Trial. | [optional] -**last_reconcile_time** | [**V1Time**](V1Time.md) | Represents last time when the Trial was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] +**last_reconcile_time** | **datetime** | Represents last time when the Trial was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. | [optional] **observation** | [**V1beta1Observation**](V1beta1Observation.md) | Results of the Trial - objectives and other metrics values. | [optional] -**start_time** | [**V1Time**](V1Time.md) | Represents time when the Trial was acknowledged by the Trial controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC | [optional] +**start_time** | **datetime** | Represents time when the Trial was acknowledged by the Trial controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/docs/V1beta1TrialTemplate.md b/sdk/python/v1beta1/docs/V1beta1TrialTemplate.md index 2a1bc06f6e6..c041141b32e 100644 --- a/sdk/python/v1beta1/docs/V1beta1TrialTemplate.md +++ b/sdk/python/v1beta1/docs/V1beta1TrialTemplate.md @@ -10,7 +10,7 @@ Name | Type | Description | Notes **retain** | **bool** | Retain indicates that trial resources must be not cleanup | [optional] **success_condition** | **str** | Condition when trial custom resource is succeeded. Condition must be in GJSON format, ref https://github.com/tidwall/gjson. For example for BatchJob: status.conditions.#(type==\"Complete\")#|#(status==\"True\")# | [optional] **trial_parameters** | [**list[V1beta1TrialParameterSpec]**](V1beta1TrialParameterSpec.md) | List of parameters that are used in trial template | [optional] -**trial_spec** | [**V1UnstructuredUnstructured**](V1UnstructuredUnstructured.md) | TrialSpec represents trial template in unstructured format | [optional] +**trial_spec** | **dict()** | TrialSpec represents trial template in unstructured format | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_experiment_condition.py b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_experiment_condition.py index 45416c2af60..89ef0ef2e5d 100644 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_experiment_condition.py +++ b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_experiment_condition.py @@ -16,7 +16,6 @@ import six -from kubeflow.katib.models.v1_time import V1Time # noqa: F401,E501 class V1beta1ExperimentCondition(object): @@ -33,8 +32,8 @@ class V1beta1ExperimentCondition(object): and the value is json key in definition. """ swagger_types = { - 'last_transition_time': 'V1Time', - 'last_update_time': 'V1Time', + 'last_transition_time': 'datetime', + 'last_update_time': 'datetime', 'message': 'str', 'reason': 'str', 'status': 'str', @@ -79,7 +78,7 @@ def last_transition_time(self): Last time the condition transitioned from one status to another. # noqa: E501 :return: The last_transition_time of this V1beta1ExperimentCondition. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._last_transition_time @@ -90,7 +89,7 @@ def last_transition_time(self, last_transition_time): Last time the condition transitioned from one status to another. # noqa: E501 :param last_transition_time: The last_transition_time of this V1beta1ExperimentCondition. # noqa: E501 - :type: V1Time + :type: datetime """ self._last_transition_time = last_transition_time @@ -102,7 +101,7 @@ def last_update_time(self): The last time this condition was updated. # noqa: E501 :return: The last_update_time of this V1beta1ExperimentCondition. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._last_update_time @@ -113,7 +112,7 @@ def last_update_time(self, last_update_time): The last time this condition was updated. # noqa: E501 :param last_update_time: The last_update_time of this V1beta1ExperimentCondition. # noqa: E501 - :type: V1Time + :type: datetime """ self._last_update_time = last_update_time diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_experiment_status.py b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_experiment_status.py index 45220c85ce9..3f3d8bd68fe 100644 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_experiment_status.py +++ b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_experiment_status.py @@ -16,7 +16,6 @@ import six -from kubeflow.katib.models.v1_time import V1Time # noqa: F401,E501 from kubeflow.katib.models.v1beta1_experiment_condition import V1beta1ExperimentCondition # noqa: F401,E501 from kubeflow.katib.models.v1beta1_optimal_trial import V1beta1OptimalTrial # noqa: F401,E501 @@ -35,16 +34,16 @@ class V1beta1ExperimentStatus(object): and the value is json key in definition. """ swagger_types = { - 'completion_time': 'V1Time', + 'completion_time': 'datetime', 'conditions': 'list[V1beta1ExperimentCondition]', 'current_optimal_trial': 'V1beta1OptimalTrial', 'early_stopped_trial_list': 'list[str]', 'failed_trial_list': 'list[str]', 'killed_trial_list': 'list[str]', - 'last_reconcile_time': 'V1Time', + 'last_reconcile_time': 'datetime', 'pending_trial_list': 'list[str]', 'running_trial_list': 'list[str]', - 'start_time': 'V1Time', + 'start_time': 'datetime', 'succeeded_trial_list': 'list[str]', 'trials': 'int', 'trials_early_stopped': 'int', @@ -143,7 +142,7 @@ def completion_time(self): Represents time when the Experiment was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :return: The completion_time of this V1beta1ExperimentStatus. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._completion_time @@ -154,7 +153,7 @@ def completion_time(self, completion_time): Represents time when the Experiment was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :param completion_time: The completion_time of this V1beta1ExperimentStatus. # noqa: E501 - :type: V1Time + :type: datetime """ self._completion_time = completion_time @@ -281,7 +280,7 @@ def last_reconcile_time(self): Represents last time when the Experiment was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :return: The last_reconcile_time of this V1beta1ExperimentStatus. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._last_reconcile_time @@ -292,7 +291,7 @@ def last_reconcile_time(self, last_reconcile_time): Represents last time when the Experiment was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :param last_reconcile_time: The last_reconcile_time of this V1beta1ExperimentStatus. # noqa: E501 - :type: V1Time + :type: datetime """ self._last_reconcile_time = last_reconcile_time @@ -350,7 +349,7 @@ def start_time(self): Represents time when the Experiment was acknowledged by the Experiment controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :return: The start_time of this V1beta1ExperimentStatus. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._start_time @@ -361,7 +360,7 @@ def start_time(self, start_time): Represents time when the Experiment was acknowledged by the Experiment controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :param start_time: The start_time of this V1beta1ExperimentStatus. # noqa: E501 - :type: V1Time + :type: datetime """ self._start_time = start_time diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_suggestion_condition.py b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_suggestion_condition.py index 168ecca19c4..93e3eb63c50 100644 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_suggestion_condition.py +++ b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_suggestion_condition.py @@ -16,7 +16,6 @@ import six -from kubeflow.katib.models.v1_time import V1Time # noqa: F401,E501 class V1beta1SuggestionCondition(object): @@ -33,8 +32,8 @@ class V1beta1SuggestionCondition(object): and the value is json key in definition. """ swagger_types = { - 'last_transition_time': 'V1Time', - 'last_update_time': 'V1Time', + 'last_transition_time': 'datetime', + 'last_update_time': 'datetime', 'message': 'str', 'reason': 'str', 'status': 'str', @@ -79,7 +78,7 @@ def last_transition_time(self): Last time the condition transitioned from one status to another. # noqa: E501 :return: The last_transition_time of this V1beta1SuggestionCondition. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._last_transition_time @@ -90,7 +89,7 @@ def last_transition_time(self, last_transition_time): Last time the condition transitioned from one status to another. # noqa: E501 :param last_transition_time: The last_transition_time of this V1beta1SuggestionCondition. # noqa: E501 - :type: V1Time + :type: datetime """ self._last_transition_time = last_transition_time @@ -102,7 +101,7 @@ def last_update_time(self): The last time this condition was updated. # noqa: E501 :return: The last_update_time of this V1beta1SuggestionCondition. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._last_update_time @@ -113,7 +112,7 @@ def last_update_time(self, last_update_time): The last time this condition was updated. # noqa: E501 :param last_update_time: The last_update_time of this V1beta1SuggestionCondition. # noqa: E501 - :type: V1Time + :type: datetime """ self._last_update_time = last_update_time diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_suggestion_status.py b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_suggestion_status.py index 82dc773d54c..b5bb1ecb1d6 100644 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_suggestion_status.py +++ b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_suggestion_status.py @@ -16,7 +16,6 @@ import six -from kubeflow.katib.models.v1_time import V1Time # noqa: F401,E501 from kubeflow.katib.models.v1beta1_algorithm_setting import V1beta1AlgorithmSetting # noqa: F401,E501 from kubeflow.katib.models.v1beta1_suggestion_condition import V1beta1SuggestionCondition # noqa: F401,E501 from kubeflow.katib.models.v1beta1_trial_assignment import V1beta1TrialAssignment # noqa: F401,E501 @@ -37,10 +36,10 @@ class V1beta1SuggestionStatus(object): """ swagger_types = { 'algorithm_settings': 'list[V1beta1AlgorithmSetting]', - 'completion_time': 'V1Time', + 'completion_time': 'datetime', 'conditions': 'list[V1beta1SuggestionCondition]', - 'last_reconcile_time': 'V1Time', - 'start_time': 'V1Time', + 'last_reconcile_time': 'datetime', + 'start_time': 'datetime', 'suggestion_count': 'int', 'suggestions': 'list[V1beta1TrialAssignment]' } @@ -112,7 +111,7 @@ def completion_time(self): Represents time when the Suggestion was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :return: The completion_time of this V1beta1SuggestionStatus. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._completion_time @@ -123,7 +122,7 @@ def completion_time(self, completion_time): Represents time when the Suggestion was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :param completion_time: The completion_time of this V1beta1SuggestionStatus. # noqa: E501 - :type: V1Time + :type: datetime """ self._completion_time = completion_time @@ -158,7 +157,7 @@ def last_reconcile_time(self): Represents last time when the Suggestion was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :return: The last_reconcile_time of this V1beta1SuggestionStatus. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._last_reconcile_time @@ -169,7 +168,7 @@ def last_reconcile_time(self, last_reconcile_time): Represents last time when the Suggestion was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :param last_reconcile_time: The last_reconcile_time of this V1beta1SuggestionStatus. # noqa: E501 - :type: V1Time + :type: datetime """ self._last_reconcile_time = last_reconcile_time @@ -181,7 +180,7 @@ def start_time(self): Represents time when the Suggestion was acknowledged by the Suggestion controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :return: The start_time of this V1beta1SuggestionStatus. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._start_time @@ -192,7 +191,7 @@ def start_time(self, start_time): Represents time when the Suggestion was acknowledged by the Suggestion controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :param start_time: The start_time of this V1beta1SuggestionStatus. # noqa: E501 - :type: V1Time + :type: datetime """ self._start_time = start_time diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_condition.py b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_condition.py index bfc030a0923..df95718d620 100644 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_condition.py +++ b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_condition.py @@ -16,7 +16,6 @@ import six -from kubeflow.katib.models.v1_time import V1Time # noqa: F401,E501 class V1beta1TrialCondition(object): @@ -33,8 +32,8 @@ class V1beta1TrialCondition(object): and the value is json key in definition. """ swagger_types = { - 'last_transition_time': 'V1Time', - 'last_update_time': 'V1Time', + 'last_transition_time': 'datetime', + 'last_update_time': 'datetime', 'message': 'str', 'reason': 'str', 'status': 'str', @@ -79,7 +78,7 @@ def last_transition_time(self): Last time the condition transitioned from one status to another. # noqa: E501 :return: The last_transition_time of this V1beta1TrialCondition. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._last_transition_time @@ -90,7 +89,7 @@ def last_transition_time(self, last_transition_time): Last time the condition transitioned from one status to another. # noqa: E501 :param last_transition_time: The last_transition_time of this V1beta1TrialCondition. # noqa: E501 - :type: V1Time + :type: datetime """ self._last_transition_time = last_transition_time @@ -102,7 +101,7 @@ def last_update_time(self): The last time this condition was updated. # noqa: E501 :return: The last_update_time of this V1beta1TrialCondition. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._last_update_time @@ -113,7 +112,7 @@ def last_update_time(self, last_update_time): The last time this condition was updated. # noqa: E501 :param last_update_time: The last_update_time of this V1beta1TrialCondition. # noqa: E501 - :type: V1Time + :type: datetime """ self._last_update_time = last_update_time diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_source.py b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_source.py index 9c4f45432d2..10ca5a1baf6 100644 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_source.py +++ b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_source.py @@ -16,7 +16,6 @@ import six -from kubeflow.katib.models.v1_unstructured_unstructured import V1UnstructuredUnstructured # noqa: F401,E501 from kubeflow.katib.models.v1beta1_config_map_source import V1beta1ConfigMapSource # noqa: F401,E501 @@ -35,7 +34,7 @@ class V1beta1TrialSource(object): """ swagger_types = { 'config_map': 'V1beta1ConfigMapSource', - 'trial_spec': 'V1UnstructuredUnstructured' + 'trial_spec': 'dict()' } attribute_map = { @@ -85,7 +84,7 @@ def trial_spec(self): TrialSpec represents trial template in unstructured format # noqa: E501 :return: The trial_spec of this V1beta1TrialSource. # noqa: E501 - :rtype: V1UnstructuredUnstructured + :rtype: dict() """ return self._trial_spec @@ -96,7 +95,7 @@ def trial_spec(self, trial_spec): TrialSpec represents trial template in unstructured format # noqa: E501 :param trial_spec: The trial_spec of this V1beta1TrialSource. # noqa: E501 - :type: V1UnstructuredUnstructured + :type: dict() """ self._trial_spec = trial_spec diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_spec.py b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_spec.py index a3dbfd8a205..e929e70291b 100644 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_spec.py +++ b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_spec.py @@ -16,7 +16,6 @@ import six -from kubeflow.katib.models.v1_unstructured_unstructured import V1UnstructuredUnstructured # noqa: F401,E501 from kubeflow.katib.models.v1beta1_early_stopping_rule import V1beta1EarlyStoppingRule # noqa: F401,E501 from kubeflow.katib.models.v1beta1_metrics_collector_spec import V1beta1MetricsCollectorSpec # noqa: F401,E501 from kubeflow.katib.models.v1beta1_objective_spec import V1beta1ObjectiveSpec # noqa: F401,E501 @@ -45,7 +44,7 @@ class V1beta1TrialSpec(object): 'primary_container_name': 'str', 'primary_pod_labels': 'dict(str, str)', 'retain_run': 'bool', - 'run_spec': 'V1UnstructuredUnstructured', + 'run_spec': 'dict()', 'success_condition': 'str' } @@ -290,7 +289,7 @@ def run_spec(self): Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest. # noqa: E501 :return: The run_spec of this V1beta1TrialSpec. # noqa: E501 - :rtype: V1UnstructuredUnstructured + :rtype: dict() """ return self._run_spec @@ -301,7 +300,7 @@ def run_spec(self, run_spec): Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest. # noqa: E501 :param run_spec: The run_spec of this V1beta1TrialSpec. # noqa: E501 - :type: V1UnstructuredUnstructured + :type: dict() """ self._run_spec = run_spec diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_status.py b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_status.py index bae2c39a461..5d7145ff758 100644 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_status.py +++ b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_status.py @@ -16,7 +16,6 @@ import six -from kubeflow.katib.models.v1_time import V1Time # noqa: F401,E501 from kubeflow.katib.models.v1beta1_observation import V1beta1Observation # noqa: F401,E501 from kubeflow.katib.models.v1beta1_trial_condition import V1beta1TrialCondition # noqa: F401,E501 @@ -35,11 +34,11 @@ class V1beta1TrialStatus(object): and the value is json key in definition. """ swagger_types = { - 'completion_time': 'V1Time', + 'completion_time': 'datetime', 'conditions': 'list[V1beta1TrialCondition]', - 'last_reconcile_time': 'V1Time', + 'last_reconcile_time': 'datetime', 'observation': 'V1beta1Observation', - 'start_time': 'V1Time' + 'start_time': 'datetime' } attribute_map = { @@ -78,7 +77,7 @@ def completion_time(self): Represents time when the Trial was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC # noqa: E501 :return: The completion_time of this V1beta1TrialStatus. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._completion_time @@ -89,7 +88,7 @@ def completion_time(self, completion_time): Represents time when the Trial was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC # noqa: E501 :param completion_time: The completion_time of this V1beta1TrialStatus. # noqa: E501 - :type: V1Time + :type: datetime """ self._completion_time = completion_time @@ -124,7 +123,7 @@ def last_reconcile_time(self): Represents last time when the Trial was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :return: The last_reconcile_time of this V1beta1TrialStatus. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._last_reconcile_time @@ -135,7 +134,7 @@ def last_reconcile_time(self, last_reconcile_time): Represents last time when the Trial was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. # noqa: E501 :param last_reconcile_time: The last_reconcile_time of this V1beta1TrialStatus. # noqa: E501 - :type: V1Time + :type: datetime """ self._last_reconcile_time = last_reconcile_time @@ -170,7 +169,7 @@ def start_time(self): Represents time when the Trial was acknowledged by the Trial controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC # noqa: E501 :return: The start_time of this V1beta1TrialStatus. # noqa: E501 - :rtype: V1Time + :rtype: datetime """ return self._start_time @@ -181,7 +180,7 @@ def start_time(self, start_time): Represents time when the Trial was acknowledged by the Trial controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC # noqa: E501 :param start_time: The start_time of this V1beta1TrialStatus. # noqa: E501 - :type: V1Time + :type: datetime """ self._start_time = start_time diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_template.py b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_template.py index 4402c7b3a67..a1b3a682e69 100644 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_template.py +++ b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_template.py @@ -16,7 +16,6 @@ import six -from kubeflow.katib.models.v1_unstructured_unstructured import V1UnstructuredUnstructured # noqa: F401,E501 from kubeflow.katib.models.v1beta1_config_map_source import V1beta1ConfigMapSource # noqa: F401,E501 from kubeflow.katib.models.v1beta1_trial_parameter_spec import V1beta1TrialParameterSpec # noqa: F401,E501 @@ -42,7 +41,7 @@ class V1beta1TrialTemplate(object): 'retain': 'bool', 'success_condition': 'str', 'trial_parameters': 'list[V1beta1TrialParameterSpec]', - 'trial_spec': 'V1UnstructuredUnstructured' + 'trial_spec': 'dict()' } attribute_map = { @@ -254,7 +253,7 @@ def trial_spec(self): TrialSpec represents trial template in unstructured format # noqa: E501 :return: The trial_spec of this V1beta1TrialTemplate. # noqa: E501 - :rtype: V1UnstructuredUnstructured + :rtype: dict() """ return self._trial_spec @@ -265,7 +264,7 @@ def trial_spec(self, trial_spec): TrialSpec represents trial template in unstructured format # noqa: E501 :param trial_spec: The trial_spec of this V1beta1TrialTemplate. # noqa: E501 - :type: V1UnstructuredUnstructured + :type: dict() """ self._trial_spec = trial_spec diff --git a/sdk/python/v1beta1/setup.py b/sdk/python/v1beta1/setup.py index 98060e4c9cb..48e22900327 100644 --- a/sdk/python/v1beta1/setup.py +++ b/sdk/python/v1beta1/setup.py @@ -19,7 +19,7 @@ setuptools.setup( name='kubeflow-katib', - version='0.10.0', + version='0.10.1', author="Kubeflow Authors", author_email='premnath.vel@gmail.com', license="Apache License Version 2.0", From 9f5f65bdf8fe9c172efc88b4993ded1a5d060c01 Mon Sep 17 00:00:00 2001 From: avelichk Date: Fri, 27 Nov 2020 19:12:16 +0000 Subject: [PATCH 3/3] Change dict() to object --- hack/gen-python-sdk/post_gen.py | 20 +++++++++++++------ hack/gen-python-sdk/swagger_config.json | 2 +- sdk/python/v1beta1/docs/V1beta1TrialSource.md | 2 +- sdk/python/v1beta1/docs/V1beta1TrialSpec.md | 2 +- .../v1beta1/docs/V1beta1TrialTemplate.md | 2 +- sdk/python/v1beta1/kubeflow/katib/__init__.py | 2 +- .../v1beta1/kubeflow/katib/api_client.py | 2 +- .../v1beta1/kubeflow/katib/models/__init__.py | 6 ++++++ .../katib/models/v1beta1_trial_source.py | 6 +++--- .../katib/models/v1beta1_trial_spec.py | 6 +++--- .../katib/models/v1beta1_trial_template.py | 6 +++--- 11 files changed, 35 insertions(+), 21 deletions(-) diff --git a/hack/gen-python-sdk/post_gen.py b/hack/gen-python-sdk/post_gen.py index a43bb2a0144..065fc58178d 100644 --- a/hack/gen-python-sdk/post_gen.py +++ b/hack/gen-python-sdk/post_gen.py @@ -23,13 +23,20 @@ def _rewrite_helper(input_file, output_file, rewrite_rules): if not any(l in line for l in IGNORE_LINES): lines.append(line) - # Add Katib client to init file + # Add Katib client to init file. if (output_file == "sdk/python/v1beta1/kubeflow/katib/__init__.py"): lines.append("\n") - lines.append("# Import Katib API client") - lines.append("\n") - lines.append("from kubeflow.katib.api.katib_client import KatibClient") + lines.append("# Import Katib API client.\n") + lines.append("from kubeflow.katib.api.katib_client import KatibClient\n") + + # Add Kubernetes models to proper deserialization of Katib models. + if (output_file == "sdk/python/v1beta1/kubeflow/katib/models/__init__.py"): lines.append("\n") + lines.append("# Import Kubernetes models.\n") + lines.append("from kubernetes.client import V1ObjectMeta\n") + lines.append("from kubernetes.client import V1ListMeta\n") + lines.append("from kubernetes.client import V1Container\n") + lines.append("from kubernetes.client import V1HTTPGetAction\n") with open(output_file, 'w') as f: f.writelines(lines) @@ -41,9 +48,11 @@ def update_python_sdk(src, dest, versions=('v1beta1')): # Models rules. lambda l: l.replace('import katib', 'import kubeflow.katib'), lambda l: l.replace('from katib', 'from kubeflow.katib'), + # For the api_client.py. + lambda l: l.replace('klass = getattr(katib.models, klass)', 'klass = getattr(kubeflow.katib.models, klass)'), # Doc rules. lambda l: l.replace('[**datetime**](V1Time.md)', '**datetime**'), - lambda l: l.replace('[**dict()**](V1UnstructuredUnstructured.md)', '**dict()**'), + lambda l: l.replace('[**object**](V1UnstructuredUnstructured.md)', '**object**'), lambda l: l.replace('[**V1Container**](V1Container.md)', '[**V1Container**](https://github.com/kubernetes-client/' @@ -60,7 +69,6 @@ def update_python_sdk(src, dest, versions=('v1beta1')): lambda l: l.replace('[**V1HTTPGetAction**](V1HTTPGetAction.md)', '[**V1HTTPGetAction**](https://github.com/kubernetes-client/' 'python/blob/master/kubernetes/docs/V1HTTPGetAction.md)') - ] src_dirs = [ diff --git a/hack/gen-python-sdk/swagger_config.json b/hack/gen-python-sdk/swagger_config.json index 3fdcf6f5c33..ebdfcf1faec 100644 --- a/hack/gen-python-sdk/swagger_config.json +++ b/hack/gen-python-sdk/swagger_config.json @@ -10,6 +10,6 @@ }, "typeMappings": { "V1Time": "datetime", - "V1UnstructuredUnstructured": "dict()" + "V1UnstructuredUnstructured": "object" } } diff --git a/sdk/python/v1beta1/docs/V1beta1TrialSource.md b/sdk/python/v1beta1/docs/V1beta1TrialSource.md index 784b190ba78..1f3a6a23186 100644 --- a/sdk/python/v1beta1/docs/V1beta1TrialSource.md +++ b/sdk/python/v1beta1/docs/V1beta1TrialSource.md @@ -4,7 +4,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **config_map** | [**V1beta1ConfigMapSource**](V1beta1ConfigMapSource.md) | ConfigMap spec represents a reference to ConfigMap | [optional] -**trial_spec** | **dict()** | TrialSpec represents trial template in unstructured format | [optional] +**trial_spec** | **object** | TrialSpec represents trial template in unstructured format | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/docs/V1beta1TrialSpec.md b/sdk/python/v1beta1/docs/V1beta1TrialSpec.md index 9d0b613c921..0b960b25a4f 100644 --- a/sdk/python/v1beta1/docs/V1beta1TrialSpec.md +++ b/sdk/python/v1beta1/docs/V1beta1TrialSpec.md @@ -11,7 +11,7 @@ Name | Type | Description | Notes **primary_container_name** | **str** | Name of training container where actual model training is running | [optional] **primary_pod_labels** | **dict(str, str)** | Label that determines if pod needs to be injected by Katib sidecar container | [optional] **retain_run** | **bool** | Whether to retain the trial run object after completed. | [optional] -**run_spec** | **dict()** | Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest. | [optional] +**run_spec** | **object** | Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest. | [optional] **success_condition** | **str** | Condition when trial custom resource is succeeded. Condition must be in GJSON format, ref https://github.com/tidwall/gjson. For example for BatchJob: status.conditions.#(type==\"Complete\")#|#(status==\"True\")# | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/docs/V1beta1TrialTemplate.md b/sdk/python/v1beta1/docs/V1beta1TrialTemplate.md index c041141b32e..5f76d9cefdd 100644 --- a/sdk/python/v1beta1/docs/V1beta1TrialTemplate.md +++ b/sdk/python/v1beta1/docs/V1beta1TrialTemplate.md @@ -10,7 +10,7 @@ Name | Type | Description | Notes **retain** | **bool** | Retain indicates that trial resources must be not cleanup | [optional] **success_condition** | **str** | Condition when trial custom resource is succeeded. Condition must be in GJSON format, ref https://github.com/tidwall/gjson. For example for BatchJob: status.conditions.#(type==\"Complete\")#|#(status==\"True\")# | [optional] **trial_parameters** | [**list[V1beta1TrialParameterSpec]**](V1beta1TrialParameterSpec.md) | List of parameters that are used in trial template | [optional] -**trial_spec** | **dict()** | TrialSpec represents trial template in unstructured format | [optional] +**trial_spec** | **object** | TrialSpec represents trial template in unstructured format | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdk/python/v1beta1/kubeflow/katib/__init__.py b/sdk/python/v1beta1/kubeflow/katib/__init__.py index 52f772b8f9b..27c10de80bb 100644 --- a/sdk/python/v1beta1/kubeflow/katib/__init__.py +++ b/sdk/python/v1beta1/kubeflow/katib/__init__.py @@ -63,5 +63,5 @@ from kubeflow.katib.models.v1beta1_trial_status import V1beta1TrialStatus from kubeflow.katib.models.v1beta1_trial_template import V1beta1TrialTemplate -# Import Katib API client +# Import Katib API client. from kubeflow.katib.api.katib_client import KatibClient diff --git a/sdk/python/v1beta1/kubeflow/katib/api_client.py b/sdk/python/v1beta1/kubeflow/katib/api_client.py index 01194d8c25f..c7cfd7a24a5 100644 --- a/sdk/python/v1beta1/kubeflow/katib/api_client.py +++ b/sdk/python/v1beta1/kubeflow/katib/api_client.py @@ -266,7 +266,7 @@ def __deserialize(self, data, klass): if klass in self.NATIVE_TYPES_MAPPING: klass = self.NATIVE_TYPES_MAPPING[klass] else: - klass = getattr(katib.models, klass) + klass = getattr(kubeflow.katib.models, klass) if klass in self.PRIMITIVE_TYPES: return self.__deserialize_primitive(data, klass) diff --git a/sdk/python/v1beta1/kubeflow/katib/models/__init__.py b/sdk/python/v1beta1/kubeflow/katib/models/__init__.py index d5c069a6c36..32350e9b6c9 100644 --- a/sdk/python/v1beta1/kubeflow/katib/models/__init__.py +++ b/sdk/python/v1beta1/kubeflow/katib/models/__init__.py @@ -56,3 +56,9 @@ from kubeflow.katib.models.v1beta1_trial_spec import V1beta1TrialSpec from kubeflow.katib.models.v1beta1_trial_status import V1beta1TrialStatus from kubeflow.katib.models.v1beta1_trial_template import V1beta1TrialTemplate + +# Import Kubernetes models. +from kubernetes.client import V1ObjectMeta +from kubernetes.client import V1ListMeta +from kubernetes.client import V1Container +from kubernetes.client import V1HTTPGetAction diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_source.py b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_source.py index 10ca5a1baf6..339439ae89b 100644 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_source.py +++ b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_source.py @@ -34,7 +34,7 @@ class V1beta1TrialSource(object): """ swagger_types = { 'config_map': 'V1beta1ConfigMapSource', - 'trial_spec': 'dict()' + 'trial_spec': 'object' } attribute_map = { @@ -84,7 +84,7 @@ def trial_spec(self): TrialSpec represents trial template in unstructured format # noqa: E501 :return: The trial_spec of this V1beta1TrialSource. # noqa: E501 - :rtype: dict() + :rtype: object """ return self._trial_spec @@ -95,7 +95,7 @@ def trial_spec(self, trial_spec): TrialSpec represents trial template in unstructured format # noqa: E501 :param trial_spec: The trial_spec of this V1beta1TrialSource. # noqa: E501 - :type: dict() + :type: object """ self._trial_spec = trial_spec diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_spec.py b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_spec.py index e929e70291b..4f9f3015beb 100644 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_spec.py +++ b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_spec.py @@ -44,7 +44,7 @@ class V1beta1TrialSpec(object): 'primary_container_name': 'str', 'primary_pod_labels': 'dict(str, str)', 'retain_run': 'bool', - 'run_spec': 'dict()', + 'run_spec': 'object', 'success_condition': 'str' } @@ -289,7 +289,7 @@ def run_spec(self): Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest. # noqa: E501 :return: The run_spec of this V1beta1TrialSpec. # noqa: E501 - :rtype: dict() + :rtype: object """ return self._run_spec @@ -300,7 +300,7 @@ def run_spec(self, run_spec): Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest. # noqa: E501 :param run_spec: The run_spec of this V1beta1TrialSpec. # noqa: E501 - :type: dict() + :type: object """ self._run_spec = run_spec diff --git a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_template.py b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_template.py index a1b3a682e69..9e309e1ece6 100644 --- a/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_template.py +++ b/sdk/python/v1beta1/kubeflow/katib/models/v1beta1_trial_template.py @@ -41,7 +41,7 @@ class V1beta1TrialTemplate(object): 'retain': 'bool', 'success_condition': 'str', 'trial_parameters': 'list[V1beta1TrialParameterSpec]', - 'trial_spec': 'dict()' + 'trial_spec': 'object' } attribute_map = { @@ -253,7 +253,7 @@ def trial_spec(self): TrialSpec represents trial template in unstructured format # noqa: E501 :return: The trial_spec of this V1beta1TrialTemplate. # noqa: E501 - :rtype: dict() + :rtype: object """ return self._trial_spec @@ -264,7 +264,7 @@ def trial_spec(self, trial_spec): TrialSpec represents trial template in unstructured format # noqa: E501 :param trial_spec: The trial_spec of this V1beta1TrialTemplate. # noqa: E501 - :type: dict() + :type: object """ self._trial_spec = trial_spec