diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 0000000..286aed4 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 7e76fb2d63321ec3c347e52311e09cea +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..48c55b5 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +scope.ztf.dev diff --git a/_images/beta_lyr.png b/_images/beta_lyr.png new file mode 100644 index 0000000..5450acc Binary files /dev/null and b/_images/beta_lyr.png differ diff --git a/_images/bogus_1.png b/_images/bogus_1.png new file mode 100644 index 0000000..1363a89 Binary files /dev/null and b/_images/bogus_1.png differ diff --git a/_images/bogus_2.png b/_images/bogus_2.png new file mode 100644 index 0000000..26b8811 Binary files /dev/null and b/_images/bogus_2.png differ diff --git a/_images/cepheid_1O.png b/_images/cepheid_1O.png new file mode 100644 index 0000000..3328ed7 Binary files /dev/null and b/_images/cepheid_1O.png differ diff --git a/_images/cepheid_F.png b/_images/cepheid_F.png new file mode 100644 index 0000000..a2c06f8 Binary files /dev/null and b/_images/cepheid_F.png differ diff --git a/_images/cepheid_F1O.png b/_images/cepheid_F1O.png new file mode 100644 index 0000000..652ae92 Binary files /dev/null and b/_images/cepheid_F1O.png differ diff --git a/_images/cepheid_F_1.png b/_images/cepheid_F_1.png new file mode 100644 index 0000000..7135754 Binary files /dev/null and b/_images/cepheid_F_1.png differ diff --git a/_images/cv_Novalike.png b/_images/cv_Novalike.png new file mode 100644 index 0000000..cd15550 Binary files /dev/null and b/_images/cv_Novalike.png differ diff --git a/_images/cv_SU_UMa.png b/_images/cv_SU_UMa.png new file mode 100644 index 0000000..b529c57 Binary files /dev/null and b/_images/cv_SU_UMa.png differ diff --git a/_images/cv_U_Gem.png b/_images/cv_U_Gem.png new file mode 100644 index 0000000..8da1027 Binary files /dev/null and b/_images/cv_U_Gem.png differ diff --git a/_images/cv_Z_Cam.png b/_images/cv_Z_Cam.png new file mode 100644 index 0000000..18fac5f Binary files /dev/null and b/_images/cv_Z_Cam.png differ diff --git a/_images/delta_scuti.png b/_images/delta_scuti.png new file mode 100644 index 0000000..5b4666b Binary files /dev/null and b/_images/delta_scuti.png differ diff --git a/_images/flaring_dwarfnova.png b/_images/flaring_dwarfnova.png new file mode 100644 index 0000000..d3d6250 Binary files /dev/null and b/_images/flaring_dwarfnova.png differ diff --git a/_images/flaring_mdwarf.png b/_images/flaring_mdwarf.png new file mode 100644 index 0000000..ae6db6e Binary files /dev/null and b/_images/flaring_mdwarf.png differ diff --git a/_images/hr__beta_lyr.png b/_images/hr__beta_lyr.png new file mode 100644 index 0000000..415bc11 Binary files /dev/null and b/_images/hr__beta_lyr.png differ diff --git a/_images/hr__cepheid.png b/_images/hr__cepheid.png new file mode 100644 index 0000000..5a51a71 Binary files /dev/null and b/_images/hr__cepheid.png differ diff --git a/_images/hr__cv.png b/_images/hr__cv.png new file mode 100644 index 0000000..515ff9d Binary files /dev/null and b/_images/hr__cv.png differ diff --git a/_images/hr__delta_scuti.png b/_images/hr__delta_scuti.png new file mode 100644 index 0000000..7dc9898 Binary files /dev/null and b/_images/hr__delta_scuti.png differ diff --git a/_images/hr__flaring.png b/_images/hr__flaring.png new file mode 100644 index 0000000..22f1e5a Binary files /dev/null and b/_images/hr__flaring.png differ diff --git a/_images/hr__lpv.png b/_images/hr__lpv.png new file mode 100644 index 0000000..330b68c Binary files /dev/null and b/_images/hr__lpv.png differ diff --git a/_images/hr__periodic.png b/_images/hr__periodic.png new file mode 100644 index 0000000..10c6f0e Binary files /dev/null and b/_images/hr__periodic.png differ diff --git a/_images/hr__rr_lyr.png b/_images/hr__rr_lyr.png new file mode 100644 index 0000000..e35f698 Binary files /dev/null and b/_images/hr__rr_lyr.png differ diff --git a/_images/hr__variable.png b/_images/hr__variable.png new file mode 100644 index 0000000..b03d667 Binary files /dev/null and b/_images/hr__variable.png differ diff --git a/_images/hr__w_uma.png b/_images/hr__w_uma.png new file mode 100644 index 0000000..9cdd257 Binary files /dev/null and b/_images/hr__w_uma.png differ diff --git a/_images/mira.png b/_images/mira.png new file mode 100644 index 0000000..c67de0c Binary files /dev/null and b/_images/mira.png differ diff --git a/_images/period__beta_lyr.png b/_images/period__beta_lyr.png new file mode 100644 index 0000000..9ff2edc Binary files /dev/null and b/_images/period__beta_lyr.png differ diff --git a/_images/period__cepheid.png b/_images/period__cepheid.png new file mode 100644 index 0000000..8a3b8c5 Binary files /dev/null and b/_images/period__cepheid.png differ diff --git a/_images/periodic.png b/_images/periodic.png new file mode 100644 index 0000000..8b41dd1 Binary files /dev/null and b/_images/periodic.png differ diff --git a/_images/radec__cepheid.png b/_images/radec__cepheid.png new file mode 100644 index 0000000..0e98b4e Binary files /dev/null and b/_images/radec__cepheid.png differ diff --git a/_images/radec__delta_scuti.png b/_images/radec__delta_scuti.png new file mode 100644 index 0000000..1bc8649 Binary files /dev/null and b/_images/radec__delta_scuti.png differ diff --git a/_images/radec__flaring.png b/_images/radec__flaring.png new file mode 100644 index 0000000..c4ab7b5 Binary files /dev/null and b/_images/radec__flaring.png differ diff --git a/_images/radec__lpv.png b/_images/radec__lpv.png new file mode 100644 index 0000000..c24db87 Binary files /dev/null and b/_images/radec__lpv.png differ diff --git a/_images/radec__periodic.png b/_images/radec__periodic.png new file mode 100644 index 0000000..f582ed3 Binary files /dev/null and b/_images/radec__periodic.png differ diff --git a/_images/radec__rr_lyr.png b/_images/radec__rr_lyr.png new file mode 100644 index 0000000..7e7caff Binary files /dev/null and b/_images/radec__rr_lyr.png differ diff --git a/_images/radec__variable.png b/_images/radec__variable.png new file mode 100644 index 0000000..aeeaf98 Binary files /dev/null and b/_images/radec__variable.png differ diff --git a/_images/radec__w_uma.png b/_images/radec__w_uma.png new file mode 100644 index 0000000..51a942c Binary files /dev/null and b/_images/radec__w_uma.png differ diff --git a/_images/rr_lyr_ab.png b/_images/rr_lyr_ab.png new file mode 100644 index 0000000..602b5ae Binary files /dev/null and b/_images/rr_lyr_ab.png differ diff --git a/_images/rr_lyr_c.png b/_images/rr_lyr_c.png new file mode 100644 index 0000000..cd49b61 Binary files /dev/null and b/_images/rr_lyr_c.png differ diff --git a/_images/srv.png b/_images/srv.png new file mode 100644 index 0000000..dc5d42f Binary files /dev/null and b/_images/srv.png differ diff --git a/_images/variable.png b/_images/variable.png new file mode 100644 index 0000000..761523f Binary files /dev/null and b/_images/variable.png differ diff --git a/_images/w_uma.png b/_images/w_uma.png new file mode 100644 index 0000000..8507ccb Binary files /dev/null and b/_images/w_uma.png differ diff --git a/_sources/allocation.md.txt b/_sources/allocation.md.txt new file mode 100644 index 0000000..02f3ad6 --- /dev/null +++ b/_sources/allocation.md.txt @@ -0,0 +1,25 @@ +# ACCESS allocation management + +This project (and others in the group) are supported in large part by computing resource allocations, e.g. from NSF ACCESS. When our group is granted ACCESS credits, we need to exchange them for the resources our group requires. This guide explains some details about that process. + +## Viewing Resources + +Users with the Allocation Manager role can view available allocations on the [ACCESS website](https://allocations.access-ci.org/). The different tabs show available resources, current users, and request history. The figure below shows the "Credits + Resouces" tab that is useful for viewing how much of each allocated resource remains. + +ACCESS Allocation UI + +## Making Requests + +To request more resources, increase the associated "Balance" box on the right to the desired amount. Doing this will preview the exchange of credits for resources in the visualization of the balances. To submit the request, add a 1-2 sentence justification in the explanation box near the bottom of the page. This justification should mention what efforts the exchange will support and the basic reasons why the resources are being requested (at an approximate level). For example, the justification below accompanied a request for 5,000 Expanse GPUh: + +*We will continue to perform GPU-accelerated time series feature generation on 20 more ZTF fields containing ~56 million light curves. At ~0.25s per lightcurve, and considering the added memory requirements of some fields leading to greater credit expenditure, we request an additional 5,000 Expanse GPUh.* + +Note that it is always possible to turn unused resources back into the equivalent amount of credits. Use the [Exchange Calculator](https://allocations.access-ci.org/exchange_calculator) to calculate the exchange rates between credits and resources. From experience, ACCESS prefers not to allocate vast quantities of a single resource at once. Instead, more manageable requests should be made at regular intervals. + +## Anticipating Trends + +Clicking the chart buttons under the Usage column will show which users used how much of each resource. Over time, trends will tend to stabilize and make subsequent exchange requests more predictible. When managing the allocation, try to keep resources consistently available so projects do not get interrupted. If a resource is nearing exhaustion, Allocation Managers will receive an email from ACCESS with this information. + +### Optimizing resource usage + +If users seem to be using more resources than they need for their given project, reach out to ensure they are optimizing their slurm scripts. Many ACCESS resources have a basic unit that they consider to be 1 Service Unit (SU); for example, on SDSC Expanse 1 CPU SU = 1 core with 2GB of memory for one hour. Any additional memory used will scale up the CPU SU accounting charge by the ratio of the requested memory amount to 2 GB. 1 Expanse GPU SU is 1 GPU, <10CPUs, and <92G of memory. Additional GPUs/CPUs/memory beyond these levels will likewise scale up the GPU SUs charged to the group account. diff --git a/_sources/developer.md.txt b/_sources/developer.md.txt new file mode 100644 index 0000000..0a9e6cf --- /dev/null +++ b/_sources/developer.md.txt @@ -0,0 +1,218 @@ +# Installation/Developer Guidelines + +## Science users +- Create and activate a virtual/conda environment with Python 3.11, e.g: + ```shell script + conda create -n scope-env python=3.11 + conda activate scope-env + ``` +- Install the latest release of `scope-ml` from PyPI: + ```shell script + pip install scope-ml + ``` +- In the directory of your choice, run the initialization script. This will create the required directories and copy the necessary files to run the code: + ```shell script + scope-initialize + ``` +- Change directories to `scope` and modify `config.yaml` to finish the initialization process. This config file is used by default when running all scripts. You can also specify another config file using the `--config-path` argument. + + +## Developers/contributors + +- Create your own fork the [scope repository](https://github.com/ZwickyTransientFacility/scope) by clicking the "fork" button. Then, decide whether you would like to use HTTPS (easier for beginners) or SSH. +- Following one set of instructions below, clone (download) your copy of the repository, and set up a remote called `upstream` that points to the main `scope` repository. + +### HTTPS: + +```shell script +git clone https://github.com//scope.git && cd scope +git remote add upstream https://github.com/ZwickyTransientFacility/scope.git +``` + +### SSH: + +- [Set up SSH authentication with GitHub](https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh). + +```shell script +git clone git@github.com:/scope.git && cd scope +git remote add upstream git@github.com:ZwickyTransientFacility/scope.git +``` + +### Setting up your environment (Windows/Linux/macOS) + +#### Use a package manager for installation + +We currently recommend running `scope` with Python 3.11. You may want to begin your installation by creating/activating a virtual environment, for example using conda. We specifically recommend installing miniforge3 (https://github.com/conda-forge/miniforge). + +Once you have a package manager installed, run: + +```bash +conda create -n scope-env -c conda-forge python=3.11 +conda activate scope-env +``` + +#### (Optional): Update your `PYTHONPATH` + +If you plan to import from `scope`, ensure that Python can import from `scope` by modifying the `PYTHONPATH` environment variable. Use a simple text editor like `nano` to modify the appropriate file (depending on which shell you are using). For example, if using bash, run `nano ~/.bash_profile` and add the following line: + +```bash +export PYTHONPATH="$PYTHONPATH:$HOME/scope" +``` + +Save the updated file (`Ctrl+O` in `nano`) and close/reopen your terminal for this change to be recognized. Then `cd` back into scope and activate your `scope-env` again. + +### Install required packages + +Ensure you are in the `scope` directory that contains `pyproject.toml`. Then, install the required python packages by running: +```bash +pip install . +``` + +#### Install dev requirements, pre-commit hook + +We use `black` to format the code and `flake8` to verify that code complies with [PEP8](https://www.python.org/dev/peps/pep-0008/). +Please install our dev requirements and pre-commit hook as follows: + +```shell script +pip install -r dev-requirements.txt +pre-commit install +``` + +This will check your changes before each commit to ensure that they +conform with our code style standards. We use black to reformat Python +code. + +The pre-commit hook will lint *changes* made to the source. + +#### Create and modify config.yaml + +From the included config.defaults.yaml, make a copy called config.yaml: + +```bash +cp config.defaults.yaml config.yaml +``` + +Edit config.yaml to include Kowalski instance and Fritz tokens in the associated empty `token:` fields. + +#### Testing +Run `scope-test` to test your installation. Note that for the test to pass, you will need access to the Kowalski database. If you do not have Kowalski access, you can run `scope-test-limited` to run a more limited (but still useful) set of tests. + +### Troubleshooting +Upon encountering installation/testing errors, manually install the package in question using `conda install xxx` , and remove it from `.requirements/dev.txt`. After that, re-run `pip install -r requirements.txt` to continue. + +#### Known issues +- If using GPU-accelerated period-finding algorithms for feature generation, you will need to install [periodfind](https://github.com/ZwickyTransientFacility/periodfind) separately from the source. +- Across all platforms, we are currently aware of `scope` dependency issues with Python 3.12. +- Anaconda continues to cause problems with environment setup. +- Using `pip` to install `healpy` on an arm64 Mac can raise an error upon import. We recommend including `h5py` as a requirement during the creation of your `conda` environment. +- On Windows machines, `healpy` and `cesium` raise errors upon installation. + - For `healpy`, see [this](https://healpy.readthedocs.io/en/latest/install.html#installation-on-windows-through-the-windows-subsystem-for-linux) guide for a potential workaround. + - For `cesium`, try to install from the source (https://cesium-ml.org/docs/install.html#from-source) within `scope`. If you will not be running feature generation, this is not a critical error, but there will be points in the code that fail (e.g. `scope.py test`, `tools/generate_features.py`) + +If the installation continues to raise errors, update the conda environment and try again. + +### How to contribute + +Contributions to `scope` are made through [GitHub Pull Requests](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests), a set of proposed commits (or patches): + +1. Download the latest version of `scope`, and create a new branch for your work. + + Here, let's say we want to contribute some documentation fixes; we'll call our branch `rewrite-contributor-guide`. + + ```shell script + git checkout main + git pull upstream main + git checkout -b rewrite-contributor-guide + ``` + +2. Make modifications to `scope` and commit your changes using `git add` and `git commit`. +Each commit message should consist of a summary line and a longer description, e.g.: + + ```text + Rewrite the contributor guide + While reading through the contributor guide, I noticed several places + in which instructions were out of order. I therefore reorganized all + sections to follow logically, and fixed several grammar mistakes along + the way. + ``` + +1. When ready, push your branch to GitHub: + + ```shell script + git push origin rewrite-contributor-guide + ``` + + Once the branch is uploaded, GitHub should print a URL for turning your branch into a pull request. + Open that URL in your browser, write an informative title and description for your pull request, and submit it. + +2. The team will now review your contribution, and suggest changes. +*To simplify review, please limit pull requests to one logical set of changes.* +To incorporate changes recommended by the reviewers, commit edits to your branch, and push to the branch again +(there is no need to re-create the pull request, it will automatically track modifications to your branch). + +1. Sometimes, while you were working on your feature, the `main` branch is updated with new commits, potentially +resulting in conflicts with your feature branch. The are two ways to resolve this situation - merging and rebasing, +please look [here](https://www.atlassian.com/git/tutorials/merging-vs-rebasing) for a detailed discussion. +While both ways are acceptable, since we are squashing commits from a PR before merging, we prefer the first option: + + ```shell script + git merge rewrite-contributor-guide upstream/main + ``` +Developers may merge `main` into their branch as many times as they want to. + +1. Once the pull request has been reviewed and approved by at least one team member, it will be merged into `scope`. + +#### Releasing on PyPI + +As new features are added to the code, maintainers should occasionally initiate a new release of the `scope-ml` [PyPI](https://pypi.org/project/scope-ml/) package. To do this, first bump the version of the package in `pyproject.toml` and `scope/__init__.py` to the intended `vX.Y.Z` format. Then, navigate to "Releases" in the SCoPe GitHub repo and click "Draft a new release". Enter the version number in "Choose a tag" and click "Generate release notes". It is also advisable to check the box creating a discussion for the release before clicking "Publish release". + +Upon release, the `publish-to-pypi.yml` workflow will use GitHub Actions to publish a new version of the package to PyPI automatically. **Note that if the version number has not yet been manually updated in `pyproject.toml`, this workflow will fail.** + +### Contributing Field Guide sections + +If you would like to contribute a Field Guide section, please follow the steps below. + +- Make sure to follow the steps described above in the "How to contribute" section! + +- Add sections to `config.defaults.yaml` under `docs.field_guide.`. + - Use `docs.field_guide.rr_lyr_ab` as an example. You need to specify the object's + coordinates and a title for the generated light curve plot. Optionally, + you may specify a period [days] - then a phase-folded light curve will also be rendered. + +- Make sure your `config.yaml` file contains a valid Kowalski token. + - See [here](https://github.com/dmitryduev/penquins) on how to generate one + (Kowalski account required). + - You can use `config.defaults.yaml` as a template. + +- Make sure the structure of your config file is the same as the default, + i.e. you propagated the changes in `config.defaults.yaml`. + (otherwise the `scope.py` utility will later complain and ask you to fix that). + +- Add a Markdown file to `doc/` and call it `field_guide__.md`. + - Use [`doc/field_guide__rr_lyrae.md`](field_guide__rr_lyrae.md) as a template. + - Light curve examples will be generated as `data/.png` files using the info + you provided in the config. + - Add the following include statements to [`doc/field_guide.md`](field_guide.md): + +``` +{include} ./field_guide__.md +``` + +- If you wish to render a sample Gaia-based HR diagram, you need to create a "Golden" data set + for that class of objects and put it under `data/golden` as `.csv` + - The `csv` file must follow the same structure as [`data/golden/rr_lyr.csv`]. + Please keep the `csv` header ("ra,dec") and provide object coordinates in degrees. + - The HR diagram will be generated as `data/hr__.png` + +- Run the `./scope.py doc` command to generate the imagery and build the documentation. + - If the build is successful, you can check the results in + [`doc/_build/html/index.html`](_build/html/index.html) + +- Once you're happy with the result, commit the changes to a branch on your fork + and open a pull request on GitHub (see the "How to contribute" section above). + - The GitHub Actions CI will run a subset of the testing/deployment pipeline + for each commit you make to your branch - + make sure you get a green checkmark next to the commit hash. + - Once the PR is reviewed, approved, and merged, + the CI will automatically build and deploy the docs to + [`https://scope.ztf.dev`](https://scope.ztf.dev) diff --git a/_sources/field_guide.md.txt b/_sources/field_guide.md.txt new file mode 100644 index 0000000..3d8bf2c --- /dev/null +++ b/_sources/field_guide.md.txt @@ -0,0 +1,40 @@ +# Field guide + +This guide provides detailed information about the different types of variable sources along with examples of bogus variability. + +Proceed here to interactively inspect the taxonomy +tree we are employing in SCoPe. Please refer to [arXiv:2102.11304](https://arxiv.org/pdf/2102.11304.pdf) +for more details on the taxonomy. + +```{include} ./field_guide__variable.md +``` + +```{include} ./field_guide__periodic.md +``` + +```{include} ./field_guide__rr_lyrae.md +``` + +```{include} ./field_guide__w_uma.md +``` + +```{include} ./field_guide__delta_scuti.md +``` + +```{include} ./field_guide__cepheid.md +``` + +```{include} ./field_guide__CVs.md +``` + +```{include} ./field_guide__flaring.md +``` + +```{include} ./field_guide__beta_lyr.md +``` + +```{include} ./field_guide__lpv.md +``` + +```{include} ./field_guide__bogus.md +``` diff --git a/_sources/field_guide__CVs.md.txt b/_sources/field_guide__CVs.md.txt new file mode 100644 index 0000000..709b45b --- /dev/null +++ b/_sources/field_guide__CVs.md.txt @@ -0,0 +1,55 @@ +## Cataclysmic Variables (cv) +Cataclysmic variables are close binaries with active mass transfer from a late +type main sequence star or brown dwarf to a white dwarf. There are several different +types of CVs, depending on their causes of variability. These include novae (which +have 9-15 mag outbursts from thermonuclear events on the white dwarf surface), dwarf novae which have 2-9 mag outbursts on weeks to decades timescales due to disk instabilities) and novalikes which do not have outbursts but have high and low states of accretion which cause several magnitudes of brightness change. + +### Classification and numbers +- Supertypes + - variable + - aperiodic outbursts + - aperiodic high and low states + - periodic orbital variability +- Subtypes + - Nova + - U Gem dwarf nova + - Z Cam dwarf nova + - SU UMa/WZ Sge dwarf nova + - Novalike + +- Occurrence rate: common, several thousand expected in ZTF data + + +### ZTF light curves +![ZTF CV U Gem](data/cv_U_Gem.png) +![ZTF CV Z Cam](data/cv_Z_Cam.png) +![ZTF CV SU UMa](data/cv_SU_UMa.png) +![ZTF CV Novalike](data/cv_Novalike.png) + +#### Description +CVs are easy to recognize by their distinctive light curve shape, colors and +high amplitude variability. The outbursts are non-periodic. +They can sometimes be confused with supernovae, flare stars or long period variables. + +#### Light curve characteristics +- non-periodic variable but recur on some timescale +- outburst timescale range: days to decades +- amplitude: 9-15 mag (nova), 2-9 mag (dwarf nova), 1-4 mag (novalike) +- light curve shape: + - sawtooth; steep rise and slow decay (subtype nova) + - symmetrical to slightly sawtooth (subtype U Gem) + - standstills about 1 mag below outburst level for weeks (subtype Z Cam) + - fast rise and extended plateau for 1-2 weeks followed by steeper decline (subtype SU UMa/WZ Sge) + - extended (days-weeks) states at either high or low brightness +- can show periodic modulation of the light curve on orbital timescales of hours + + +#### Other characteristics and selection methods +- intrinsic CV colors: blue, (g-r < 0.6). + Reddening is usually not important except for places in the galactic plane. +- absolute magnitude at quiescence: 85 expected in ZTF data + +### ZTF light curves +![ZTF betalyr](data/beta_lyr.png) + +#### Description +Any type of star can be in an eclipsing binary (so they may be small, large, hot, cool, etc.), which in turn can lead to a large range in eclipse amplitudes (though typically these are between 0.1 and ~1 mag, with most in the ~0.3 to 0.75 mag range) or eclipse periods (though our observations are typically only sensitive to periods between 0.1 to ~20 days). + +#### Light curve characteristics +- periodic variable +- Range of amplitudes (~0.2 to >1 mag) +- Intermediate periods (log Period between -0.5 and 1.4) +- light curve shape: EB, round or sinusoidal light curves, with imposed "V-shape" dips in the phase folded light curve + +![HR diagram of Beta Lyrae](data/hr__beta_lyr.png) + +![Period histogram of Beta Lyrae](data/period__beta_lyr.png) + +### References and further reading: +- Sterken & Jasschek: Light curves of variable stars diff --git a/_sources/field_guide__bogus.md.txt b/_sources/field_guide__bogus.md.txt new file mode 100644 index 0000000..97ffd74 --- /dev/null +++ b/_sources/field_guide__bogus.md.txt @@ -0,0 +1,16 @@ +## Bogus variability (bogus) + +Not all light curve variability pertains to a source's intrinsic astrophysical nature. Some is caused by nearby extended objects, bright stars, blends and image artifacts, and being aware of how such bogus light curves appear can help avoid confusion. + +### ZTF light curves +![ZTF bogus](data/bogus_1.png) +![ZTF bogus](data/bogus_2.png) + +#### Description +The first light curve above demonstrates a saturation ghost artifact, and the second light curve suffers from another kind of artifact. These artifacts were identified and affected data masked after ZTF began, but data from earlier releases were not retroactively masked. This produces the apparent cutoff in variability after a certain point in time. + +#### Light curve characteristics +The light curves appear to be "flaring" with departures from the median by multiple magnitudes which suddenly stop in later data. This cutoff corresponds to the time when a new method of processing the data was used to mask affected points. + +### References and further reading: +- [ZTF Explanatory Supplement (esp. Appendix B)](https://irsa.ipac.caltech.edu/data/ZTF/docs/ztf_explanatory_supplement.pdf) diff --git a/_sources/field_guide__cepheid.md.txt b/_sources/field_guide__cepheid.md.txt new file mode 100644 index 0000000..e9d7b49 --- /dev/null +++ b/_sources/field_guide__cepheid.md.txt @@ -0,0 +1,44 @@ +## Classical Cepheids (ceph) +Classical Cepheids are young, bright (100-10,000 solar luminosities) supergiant stars that pulsate with periods of 1 to 100 days (typically several days). They are located in the main instability strip in the H-R diagram. Cepheids follow a famous pulsation period-luminosity relation, allowing the absolute magnitude of a Cepheid, and thus its distance, to be inferred from the pulsation period. Thus, Cepheids are used to measure distances to nearby galaxies. + +### Classification and numbers +- Supertypes + - variable + - periodic + - pulsator +- Occurrence rate: rare, about 103 expected in ZTF data, mostly in the Galactic plane and in M31 + + +### ZTF light curves +![ZTF cepheids](data/cepheid_F.png) +![ZTF cepheids](data/cepheid_F_1.png) +![ZTF cepheids](data/cepheid_1O.png) +![ZTF cepheids](data/cepheid_F1O.png) + +#### Description +Fundamental-mode Cepheids are easy to recognise by their distinctive sawtooth light curve shape (with a rapid rise to maximum light and a slower decline) and period range (from 1 to 100 days). A secondary bump may be seen in the light curves of some Cepheids with periods in the range 6-20 days. Cepheids pulsating in the first overtone have lower amplitudes and more symmetric light curves than fundamental-mode Cepheids. Their periods (in the Milky Way) range from 0.24 to 8 days. The lower period limit is arbitrary since there is no natural boundary between first-overtone Cepheids and delta Scuti stars. Some Cepheids pulsate both in the fundamental mode and first overtone, the period ratio ranges from 0.68 to 0.77. + +#### Light curve characteristics +- periodic variable +- period range: 1-100 days (fundamental-mode pulsators), 0.24-8 days (first-overtone pulsators) +- amplitude: moderate amplitude (~0.3 to 0.8 mag) +- light curve shape: + - smooth, sawtooth variations (blue/green filters show stronger sawtooth pattern); steep rise and slow decay + - Classical Cepheids with pulsation periods 6-20 days may have a secondary bump + +#### Other characteristics and selection methods +- intrinsic Cepheids colors: Bp-Rp = 0.8 -- 2.0 mag, but as these stars are located near the Galactic plane, the reddening may be significant +- absolute magnitude: -6The Optical Gravitational Lensing Experiment. The OGLE-III Catalog of Variable Stars. I. Classical Cepheids in the Large Magellanic Cloud +- Udalski, A. et al. (2018) OGLE Collection of Galactic Cepheids +- Rimoldini, L. et al. (2019) Gaia Data Release 2. All-sky classification of high-amplitude pulsating stars +- Skowron, D. et al. (2020) A three-dimensional map of the Milky Way using classical Cepheid variable stars diff --git a/_sources/field_guide__delta_scuti.md.txt b/_sources/field_guide__delta_scuti.md.txt new file mode 100644 index 0000000..824ae28 --- /dev/null +++ b/_sources/field_guide__delta_scuti.md.txt @@ -0,0 +1,35 @@ +## Delta Scuti (dscu) +Delta Scuti variables are classic pulsating stars (i.e., they are stars passing through the [instability strip](https://en.wikipedia.org/wiki/Instability_strip)). As these stars expand and contract (i.e. pulsate) their size and temperature changes leading to regular, smooth variations in their brightness. Delta Scuti stars are smaller than both Cepheids and RR Lyrae stars, which leads to a short period of oscillations (typically anywhere between 0.03 days and 0.3 days). + +### Classification and numbers +- Supertypes + - variable + - periodic + - pulsator +- Occurrence rate: very common, about 104 expected in ZTF data + + +### ZTF light curves +![ZTF delta_scuti](data/delta_scuti.png) + +#### Description +Delta Scuti are easy to recognise by their distinctive light curve shape and period range, which distinguishes them from RR Lyrae and Cepheids. + +#### Light curve characteristics +- periodic variable +- period range: 0.03-0.3 days +- amplitude: Small amplitude (between 0.05 and 0.3) +- light curve shape: + - smooth, sawtooth variations (blue/green filters show stronger sawtooth pattern); steep rise and slow decay + +#### Other characteristics and selection methods +- intrinsic Delta Scuti colors: blue, that of A/F type main sequence stars (g-r = -0.1 -- 0.5). + Reddening can be significant since these stars can be detected at large distances. +- absolute magnitude: 05 expected in ZTF data +- Non LPV wth Long Periods + - RV Tau - Cepheid IIs +- Other possible confusions + - YSOs - their variations tend to be over shorter periods + +### ZTF light curves +![ZTF lpv](data/mira.png) +![ZTF lpv](data/srv.png) + +#### Description +Long period variables have periods from several tens of days to over thousand day and are +easy to identify due to the slow variations. + +#### Light curve characteristics +- periodic variable +- period range: 100-1000 days +- amplitude: over a mag (Mira), or a few tenths of a mag to 1 or 2 mags (semiregulars) +- light curve shape: + - periodic sinusoidal (Mira) + - semiregular (Semiregular) + +#### Other characteristics and selection methods +- intrinsic lpv colors: red +- absolute magnitude: + +![HR diagram of LPV](data/hr__lpv.png) + +![RA/Dec diagram of LPV](data/radec__lpv.png) + +### References and further reading: +- Mowlawi et al., 2018, A&A 618, A58, The first Gaia catalogue of long-period variable candidates [arxiv:1805.02035](https://arxiv.org/pdf/1805.02035.pdf) +- Soszynski et al., 2009, AcA, 59, 239S, The Optical Gravitational Lensing Experiment. The OGLE-III Catalog of Variable Stars. IV. Long-Period Variables in the Large Magellanic Cloud [arxix:0910.1354](https://arxiv.org/pdf/0910.1354.pdf) +- Soszynski et al., 2008, AcA, 58, 293S, The Optical Gravitational Lensing Experiment. The OGLE-III Catalog of Variable Stars. II.Type II Cepheids and Anomalous Cepheids in the Large Magellanic Cloud [arxiv:0811.3636](https://arxiv.org/pdf/0811.3636.pdf) diff --git a/_sources/field_guide__periodic.md.txt b/_sources/field_guide__periodic.md.txt new file mode 100644 index 0000000..5d1ff8d --- /dev/null +++ b/_sources/field_guide__periodic.md.txt @@ -0,0 +1,30 @@ +## Periodic Variables (pnp) +Periodic Variables are objects that exhibit repeating sequences of values over a fixed length of time, known as the period. +Many astrophysical objects exhibit periodic behavior, including eclipsing binaries, pulsators, etc. + +### Classification and numbers +- Supertypes + - variable +- Subtypes + - Eclipsing + - Sinusoidal + - Sawtooth + - Elliptical + +### ZTF light curves +![ZTF periodic](data/periodic.png) + +#### Description +Periodic variables have periods ranging from minutes to over a thousand days with millimagnitude to magnitude level variations. + +#### Light curve characteristics +- periodic variable: objects that exhibit repeating sequences of values over a fixed length of time +- period range: 0.001-1000 days +- amplitude: varies from survey precision to more than a magnitude + +![HR diagram of Periodic](data/hr__periodic.png) + +![RA/Dec diagram of Periodic](data/radec__periodic.png) + +### References and further reading: +- Drake et al., 2014, ApJS 618 213 9, The Catalina Surveys Periodic Variable Catalog [arxiv:1405.4290](https://arxiv.org/pdf/1405.4290.pdf) diff --git a/_sources/field_guide__rr_lyrae.md.txt b/_sources/field_guide__rr_lyrae.md.txt new file mode 100644 index 0000000..bc9a5e5 --- /dev/null +++ b/_sources/field_guide__rr_lyrae.md.txt @@ -0,0 +1,49 @@ +## RR Lyrae (rrlyr) +RR Lyrae are pulsating horizontal branch dA/dF stars with a mass 0.5 of Solar masses. +They are part of the main 'instability strip' in the HR-diagram, +where stars pulsate due to the double ionisation of He. +The two main subtypes are `ab` and `c`, + +### Classification and numbers +- Supertypes + - variable + - periodic + - pulsator +- Subtypes + - RR Lyrae ab + - RR Lyrae c +- Occurrence rate: very common, about 105 expected in ZTF data + + +### ZTF light curves +![ZTF rrlyr ab](data/rr_lyr_ab.png) +![ZTF rrlyr c](data/rr_lyr_c.png) + +#### Description +RR Lyrae (ab) are easy to recognise by their distinctive light curve shape and +high amplitude variability. +RR Lyrae (c) are a bit more of a challenge since their light curve shape is more sinusoidal. +For low-SNR cases they can sometimes be confused with contact binaries (EW), +which occur at similar periods and have sinusoidal-like light curves. + +#### Light curve characteristics +- periodic variable +- period range: 0.2-1 days +- amplitude: up to 1 mag (subtype ab), or 0.5 mag (subtype c) +- light curve shape: + - sawtooth; steep rise and slow decay (subtype ab) + - periodic sinusoidal (subtype c) +- can show modulation of the light curve shape on timescales of ~100 days (Blazhko effect) + + +#### Other characteristics and selection methods +- intrinsic RR Lyrae colors: blue, that of A/F type main sequence stars (g-r = -0.1 -- 0.5). + Reddening can be significant since these stars can be detected at large distances. +- absolute magnitude: -10.1 mag for objects near the detection limit. +Many astrophysical objects exhibit variable behavior, including periodic variables such as eclipsing binaries, pulsators, etc, and non-periodic variables such as AGN and YSOs. + +### Classification and numbers +- Subtypes + - Irregular + - Flaring + - Periodic + - Dipping + - Long Time Scale + +### ZTF light curves +![ZTF variable](data/variable.png) + +#### Description +Most stars are likely to be variable at some level. Therefore, variable is defined to be those varying at a statistically varying level, with millimagnitude to magnitude level variations. + +#### Light curve characteristics +- amplitude: varies from survey precision to more than a magnitude + +![HR diagram of Variable](data/hr__variable.png) + +![RA/Dec diagram of Variable](data/radec__variable.png) + +### References and further reading: +- Jayasinghe et al., 2018, MNRAS 447 3, The ASAS-SN catalogue of variable stars I: The Serendipitous Survey [arxiv:1803.01001](https://arxiv.org/pdf/1803.01001.pdf) diff --git a/_sources/field_guide__w_uma.md.txt b/_sources/field_guide__w_uma.md.txt new file mode 100644 index 0000000..7e75e24 --- /dev/null +++ b/_sources/field_guide__w_uma.md.txt @@ -0,0 +1,35 @@ +## W Uma (wuma) +W UMa stars are main-sequence overcontact binaries. In overcontact binaries both stars are too large for their Roche lobe share a common envelope and can exchange mass and energy. The mass-ratio of the system ranges from 1 to 10 in extreme cases. Components can have different raddii and surface brightness with temperatures ranging from 4000 to 9000K. + +### Classification and numbers +- Supertypes + - variable + - periodic + - binary + - eclipsing +- Occurrence rate: very common, about 105 expected in ZTF data + +### ZTF light curves +![ZTF wuma](data/w_uma.png) + +#### Description +Contact binary lightcurves show a distinctive shape that shows two eclipses which do smoothly transition over. Eclipses can have a flat bottom. The eclipse depth is often identical, but can be show slightly different depths. In rare cases there can be differences in the maxima of the lightcurves (e.g. due to starspots). + +#### Light curve characteristics +- periodic variable +- period range: 0.22-0.8 days +- amplitude: up to 0.75 mag +- light curve shape: EW, two 'V'-shaped eclipses with smooth transitions +- eclipses often equal depth, within 0.1mag + +#### Other characteristics and selection methods +- g-r = -0.1 -- 1.0. Short period systems are typically redder. +- absolute magnitudes are similar to main-sequence stars + +![HR diagram of W Uma](data/hr__w_uma.png) + +![RA/Dec diagram of W Uma](data/radec__w_uma.png) + +### References and further reading: +- Sterken & Jasschek: Light curves of variable stars +- Marsh et al, MNRAS 465, 4678–4689, 2017 diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 0000000..1849a5e --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,14 @@ +ZTF Variable Source Classification Project +========================================== + +.. toctree:: + :maxdepth: 2 + + developer + quickstart + usage + scanner + field_guide + allocation + zenodo + license diff --git a/_sources/license.md.txt b/_sources/license.md.txt new file mode 100644 index 0000000..1f8761f --- /dev/null +++ b/_sources/license.md.txt @@ -0,0 +1,4 @@ +# License + +```{include} ../LICENSE +``` diff --git a/_sources/quickstart.md.txt b/_sources/quickstart.md.txt new file mode 100644 index 0000000..c3184e7 --- /dev/null +++ b/_sources/quickstart.md.txt @@ -0,0 +1,119 @@ +# Quick Start Guide + +This guide is intended to facilitate quick interactions with SCoPe code after you have completed the **Installation/Developer Guidelines** section. More detailed usage info can be found in the **Usage** section. + +## Modify `config.yaml` +To start out, provide SCoPe your training set's filepath using the `training:` `dataset:` field in `config.yaml`. The path should be a partial one starting within the `scope` directory. For example, if your training set `trainingSet.parquet` is within the `tools` directory (which itself is within `scope`), provide `tools/trainingSet.parquet` in the `dataset:` field. + +When running scripts, `scope` will by default use the `config.yaml` file in your current directory. You can specify a different config file by providing its path to any installed script using the `--config-path` argument. + +## Training + +Train an XGBoost binary classifier using the following code: + +``` +scope-train --tag vnv --algorithm xgb --group ss23 --period-suffix ELS_ECE_EAOV --epochs 30 --verbose --save --plot --skip-cv +``` + +### Arguments: +`--tag`: the abbreviated name of the classification to train a binary classifier. A list of abbreviations and definitions can be found in the **Guide for Fritz Scanners** section. + +`--algorithm`: SCoPe currently supports neural network (dnn) and XGBoost (xgb) algorithms. + +`--group`: if `--save` is passed, training results are saved to the group/directory named here. + +`--period-suffix`: SCoPe determines light curve periods using GPU-accelerated algorithms. These algorithms include a Lomb-Scargle approach (ELS), Conditional Entropy (ECE), Analysis of Variance (AOV), and an approach nesting all three (ELS_ECE_EAOV). Periodic features are stored with the suffix specified here. + +`--min-count`: requires at least min_count positive examples to run training. + +`--epochs`: neural network training takes an --epochs argument that is set to 30 here. + +***Notes:*** +- *The above training runs the XGB algorithm by default and skips cross-validation in the interest of time. For a full run, you can remove the `--skip-cv` argument to run a cross-validated grid search of XGB hyperparameters during training.* + +- *DNN hyperparameters are optimized using a different approach - Weights and Biases Sweeps (https://docs.wandb.ai/guides/sweeps). The results of these sweeps are the default hyperparameters in the config file. To run another round of sweeps for DNN, create a WandB account and set the `--run-sweeps` keyword in the call to `scope-train`.* + +- *SCoPe DNN training does not provide feature importance information (due to the hidden layers of the network). Feature importance is possible to estimate for neural networks, but it is more computationally expensive compared to this "free" information from XGB.* + +### Train multiple classifiers with one script + +Create a shell script that contains multiple calls to `scope-train`: +``` +create-training-script --filename train_xgb.sh --min-count 1000 --algorithm xgb --period-suffix ELS_ECE_EAOV --add-keywords "--save --plot --group ss23 --epochs 30 --skip-cv" +``` + +Modify the permissions of this script by running `chmod +x train_xgb.sh`. Run the generated training script in a terminal window (using e.g. `./train_xgb.sh`) to train multiple classifers sequentially. + +***Note:*** +- *The code will raise an error if the training script filename already exists.* + +### Running training on HPC resources + +`train-algorithm-slurm` and `train-algorithm-job-submission` can be used generate and submit `slurm` scripts to train all classifiers in parallel using HPC resources. + +## Plotting Classifier Performance +SCoPe saves diagnostic plots and json files to report each classifier's performance. The below code shows the location of the validation set results for one classifier. + +``` +import pathlib +import json + +path_model = pathlib.Path.home() / "scope/models_xgb/ss23/vnv" +path_stats = [x for x in path_model.glob("*plots/val/*stats.json")][0] + +with open(path_stats) as f: + stats = json.load(f) +``` + +The code below makes a bar plot of the precision and recall for this classifier: +``` +import matplotlib.pyplot as plt + +plt.figure(figsize=(6,4)) +plt.rcParams['font.size']=13 +plt.title(f"XGB performance (vnv)") +plt.bar("vnv", stats['precision'], color='blue',width=1,label='precision') +plt.bar("vnv", stats['recall'], color='red',width=0.6, label='recall') +plt.legend(ncol=2,loc=0) +plt.ylim(0,1.15) +plt.xlim(-3,3) +plt.ylabel('Score') + +``` +This code may also be placed in a loop over multiple labels to compare each classifier's performance. + +## Inference + +Use `run-inference` to run inference on a field (297) of features (in this example, located in a directory called `generated_features`). The classifiers used for this inference are within the `ss23` directory/group specified during training. + +``` +create-inference-script --filename get_all_preds_xgb.sh --group-name ss23 --algorithm xgb --period-suffix ELS_ECE_EAOV --feature-directory generated_features +``` + +Modify the permissions of this script using `chmod +x get_all_preds_xgb.sh`, then run on the desired field: +``` +./get_all_preds_xgb.sh 297 +``` + +***Notes:*** +- *`create-inference-script` will raise an error if the inference script filename already exists.* +- *Inference begins by imputing missing features using the strategies specified in the `features:` section of the config file.* + +### Running inference on HPC resources + +`run-inference-slurm` and `run-inference-job-submission` can be used generate and submit `slurm` scripts to run inference for all classifiers in parallel using HPC resources.* + +## Examining predictions + +The result of running the inference script will be a parquet file containing some descriptive columns followed by columns containing for each classification's probability for each source in the field. By default, the file is located as follows: + +``` +path_preds = pathlib.Path.home() / "scope/preds_xgb/field_297/field_297.parquet" +``` + +SCoPe's `read_parquet` utility offers an easy way to read the predictions file and provide it as a `pandas` DataFrame. + +``` +from scope.utils import read_parquet +preds = read_parquet(path_preds) +``` diff --git a/_sources/scanner.md.txt b/_sources/scanner.md.txt new file mode 100644 index 0000000..0e60738 --- /dev/null +++ b/_sources/scanner.md.txt @@ -0,0 +1,90 @@ +# Guide for Fritz Scanners +This page is a guide the SCoPe classification process. It contains sections on the classification taxonomies we use, definitions of each classification that may be posted to Fritz, An explanation of the binary classifier algorithms we train and the workflow we run on transient candidates, and plots of each classifer's current precision and recall scores. + +## Two classification taxonomies +The goal of SCoPe is to use machine learning algorithms to reliably classify each ZTF source with as much detail as possible. The level of classification detail will vary across the broad range of ZTF sources. Factors that can affect the level of source classification include the quantity and quality of the data, the similarity of the training set to the source in question, and the existence of new kinds of variable sources in the data. With this in mind, we adopt two kinds of taxonomies which contain the labels we use to classify ZTF sources. + +### Ontological classifications +The first taxonomy is ontological and contains specific kinds of astrophysical sources. On Fritz, this is called `Sitewide Taxonomy`. See the table below for the current ontological classifications, training set abbreviations and definitions, ordered by low to high detail: + +| classification | abbreviation | definition | +| -------------- | ------------ | ---------- | +| pulsator | `puls` | Pulsating star | +| AGN | `agn` | Active Galactic Nucleus | +| YSO | `yso` | Young Stellar Object | +| CV | `cv` | Cataclysmic Variable | +| binary | `bis` | binary system | +| Cepheid | `ceph` | Cepheid variable star | +| Delta Scu | `dscu` | Delta Scu star | +| Pop II Cepheid | `ceph2` | Population II Cepheid variable star | +| RR Lyr | `rrlyr` | RR Lyr star | +| LPV | `lpv` | Long Period Variable star | +| MS-MS | `emsms` | Eclipsing MS-MS binary | +| W UMa | `wuma` | W UMa binary system | +| Beta Lyr | `blyr` | Beta Lyr binary | +| RS CVn | `rscvn` | RS CVn binary | +| BL Her | `blher` | BL Her-type Cepheid variable star | +| RRab | `rrab` | RR Lyr ab star | +| RRc | `rrc` | RR Lyr c star | +| RRd | `rrd` | RR Lyr d star | +| Mira | `mir` | Mira variable star | +| SRV | `srv` | Semi-regular variable star | +| OSARG | `osarg` | OGLE small-amplitude red giant star | +| W Vir | `wvir` | W Vir-type Cepheid variable star | + +*Refer to the field guide for more information about these classes.* + +### Phenomenological classifications +In consideration of the importance of having some information about a source (even if not a definitive ontological classification), we also employ a phenomenological taxonomy with labels that describe light curve-based features. This taxonomy is called `SCoPe Phenomenological Taxonomy` on Fritz. See the table below for the current phenomenological classifications, training set abbreviations and definitions: + +| classification | abbreviation | definition | +| -------------- | ------------ | ---------- | +| variable | `vnv` | Light curve shows variability | +| periodic | `pnp` | periodic variability | +| irregular | `i` | irregular variability | +| eclipsing | `e` | eclipsing phenomenology | +| sinusoidal | `sin` | sinusoidal phenomenology | +| sawtooth | `saw` | sawtooth phenomenology | +| long timescale | `longt` | long timescale variability | +| flaring | `fla` | flaring phenomenology | +| EA | `ea` | EA eclipsing phenomenology | +| EB | `eb` | EB eclipsing phenomenology | +| EW | `ew` | EW eclipsing phenomenology | +| bogus | `bogus` | bogus variability | +| blend | `blend` | blended sources phenomenology | +| extended | `ext` | extended source | + +*Refer to the field guide for more information about these classes.* + +## Independent binary classifiers +We train a binary classifier for every label in these taxonomies. This choice allows more than one classification to be assigned to a source, often with varying levels of detail. This is important not only due to the practical challenges outlined above, but also because some sources merit more than one classification (e.g. an eclipsing binary system containing a flaring star). The independence of binary classifiers allows for future updates to the taxonomies without a revision of the current results from each existing classifier. + +We classify each ZTF light curve separately in recognition of systematics that may exist between ZTF fields and bands. Before posting results to Fritz, we aggregate these classification results on a source-by-source basis. The details of this workflow are described in the next section. + +## Classification process + +### Machine learning algorithms/training +We currently employ a convolutional/dense neural network (DNN) and gradient-boosted decision trees (XGBoost, XGB) to perform classification. The process is initially a regression problem, with classifiers assigning a classification probability that ranges between 0 and 1 for each source. We then apply a probability threshold to determine whether to include each source as a positive or negative example when minimizing the binary cross-entropy loss function. + +We trained each binary classifier algorithm using a training set containing ~80,000 sources labeled manually (~170,000 light curves). The training set is available on Fritz in group 1458 (Golden Dataset Unique Sources). + +### Repeated workflow for transients +The following SCoPe workflow currently runs every two hours as a cron job: + +- Query Fritz for GCN events within the last 7 days +- For each event, query all candidates within the 95% confidence localization +- For each candidate, query existing ZTF DR16 light curves within 0.5 arcsec +- For ZTF light curves with 50 or more epochs of data, generate SCoPe features and run through all trained binary classifiers (DNN and XGB) +- Consolidate light curve classifications by matching Gaia, AllWISE or Pan-STARRS1 IDs, computing the mean probabilities among all light curves for a source. + - Each source will now have a set of classifications from both the DNN and XGB algorithms. +- For each ZTF source, compute mean classification probabilities between DNN and XGB results. +- For classifications having a mean probability ≥ 0.7, post to the candidate page. + - SCoPe classifications will be color-coded with blue text (instead of the default black) and will be preceded by the `ML: ` prefix. + - ***Note that these classifications do not pertain to the candidate itself, but persistent ZTF sources within 0.5 arcsec.*** + - The time series and phase-folded ZTF light curves used for classification are posted as comments on their associated candidate. + + +## Classifier performance +The bar plots below show the precision and recall metrics for the DNN and XGB classifiers. 'Missing' bars indicate classifiers which did not have enough examples to train successfully. +dnn classifier precision/recall +xgb classifier precision/recall diff --git a/_sources/usage.md.txt b/_sources/usage.md.txt new file mode 100644 index 0000000..a143e68 --- /dev/null +++ b/_sources/usage.md.txt @@ -0,0 +1,518 @@ +# Usage + +## Download ids for ZTF fields/CCDs/quadrants + +- Create HDF5 file for single CCD/quad pair in a field: + +```sh +get-quad-ids --catalog ZTF_source_features_DR16 --field 301 --ccd 2 --quad 3 --minobs 20 --skip 0 --limit 10000 +``` + +- Create multiple HDF5 files for some CCD/quad pairs in a field: + +```sh +get-quad-ids --catalog ZTF_source_features_DR16 --field 301 --multi-quads --ccd-range 1 8 --quad-range 2 4 --minobs 20 --limit 10000 +``` + +- Create multiple HDF5 files for all CCD/quad pairs in a field: + +```sh +get-quad-ids --catalog ZTF_source_features_DR16 --field 301 --multi-quads --minobs 20 --limit 10000 +``` + +- Create single HDF5 file for all sources in a field: + +```sh +get-quad-ids --catalog ZTF_source_features_DR16 --field 301 --whole-field +``` + +## Download SCoPe features for ZTF fields/CCDs/quadrants + +- First, run `get-quad_ids` for desired fields/ccds/quads. + +- Download features for all sources in a field: +```sh +get-features --field 301 --whole-field +``` + +- Download features for all sources in a field, imputing missing features using the strategies in `config.yaml`: +```sh +get-features --field 301 --whole-field --impute-missing-features +``` + +- Download features for a range of ccd/quads individually: +```sh +get-features --field 301 --ccd-range 1 2 --quad-range 3 4 +``` + +- Download features for a single pair of ccd/quad: +```sh +get-features --field 301 --ccd-range 1 --quad-range 2 +``` + + +## Training deep learning models + +For details on the SCoPe taxonomy and architecture, +please refer to [arxiv:2102.11304](https://arxiv.org/pdf/2102.11304.pdf). + +- The training pipeline can be invoked with the `scope.py` utility. For example: + +```sh +scope-train --tag vnv --path-dataset data/training/dataset.d15.csv --batch-size 64 --epochs 100 --verbose 1 --pre-trained-model models/experiment/vnv/vnv.20221117_001502.h5 +``` + +Refer to `scope-train --help` for details. + +- All the necessary metadata/configuration could be defined in `config.yaml` under `training`, +but could also be overridden with optional `scope-train` arguments, e.g. +`scope-train ... --batch-size 32 --threshold 0.6 ...`. + +- By default, the pipeline uses the `DNN` models defined in `scope/nn.py` using the tensorflow's `keras` functional API. SCoPe also supports an implementation of XGBoost (set `--algorithm xgb`; see `scope/xgb.py`). +- If `--save` is specified during `DNN` training, an HDF5 file of the model's layers and weights will be saved. This file can be directly used for additional training and inferencing. For `XGB`, a json file will save the model along with a `.params` file with the model parameters. +- The `Dataset` class defined in `scope.utils` hides the complexity of our dataset handling "under the rug". +- You can request access to a Google Drive folder containing the latest trained models [here](https://drive.google.com/drive/folders/1_oLBxveioKtw7LyMJfism745USe9tEGZ?usp=sharing). + +- Feature name sets are specified in `config.yaml` under `features`. + These are referenced in `config.yaml` under `training.classes..features`. + +- Feature stats to be used for feature scaling/standardization before training + are either computed by the code (default) or defined in `config.yaml` under `feature_stats`. + +- We use [Weights & Biases](https://wandb.com) to track experiments. + Project details and access credentials can be defined in `config.yaml` under `wandb`. + +Initially, SCoPe used a `bash` script to train all classifier families, e.g: + +```sh +for class in pnp longt i fla ew eb ea e agn bis blyr ceph dscu lpv mir puls rrlyr rscvn srv wuma yso; \ + do echo $class; \ + for state in 1 2 3 4 5 6 7 8 9 42; \ + do scope-train \ + --tag $class --path-dataset data/training/dataset.d15.csv \ + --scale-features min_max --batch-size 64 \ + --epochs 300 --patience 30 --random-state $state \ + --verbose 1 --gpu 1 --conv-branch --save; \ + done; \ +done; +``` + +Now, a training script containing one line per class to be trained can be generated by running `create-training-script`, for example: +```bash +create-training-script --filename train_dnn.sh --min-count 100 --pre-trained-group-name experiment --add-keywords '--save --batch-size 32 --group new_experiment --period-suffix ELS_ECE_EAOV' +``` +A path to the training set may be provided as input to this method or otherwise taken from `config.yaml` (`training: dataset:`). To continue training on existing models, specify the `--pre-trained-group-name` keyword containing the models in `create-training-script`. If training on a feature collection containing multiple sets of periodic features (from different algorithms), set the suffix corresponding to the desired algorithm using `--period-suffix` or the `features: info: period_suffix:` field in the config file. The string specified in `--add-keywords` serves as a catch-all for additional keywords that the user wishes to be included in each line of the script. + +If `--pre-trained-group-name` is specified and the `--train-all` keyword is set, the output script will train all classes specified in `config.yaml` regardless of whether they have a pre-trained model. If `--train-all` is not set (the default), the script will limit training to classes that have an existing trained model. + +## Running inference + +Running inference requires the following steps: download ids of a field, download (or generate) features for all downloaded ids, run inference for all available trained models, e.g: +``` +get-quad-ids --field --whole-field +get-features --field --whole-field --impute-missing-features +``` +OR +``` +generate-features --field --ccd --quad --doGPU +``` + +The optimal way to run inference is through an inference script generated by running `create-inference-script` with the appropriate arguments. After creating the script and adding the needed permissions (e.g. using `chmod +x`), the commands to run inference on the field `` are (in order): +``` +./get_all_preds.sh +``` + +* Requires `models_dnn/` or `models_xgb/` folder in the root directory containing the pre-trained models for DNN and XGBoost, respectively. +* In a `preds_dnn` or `preds_xgb` directory, creates a single `.parquet` (and optionally `.csv`) file containing all ids of the field in the rows and inference scores for different classes across the columns. +* If running inference on specific ids instead of a field/ccd/quad (e.g. on GCN sources), run `./get_all_preds.sh specific_ids` + +## Handling different file formats +When our manipulations of `pandas` dataframes is complete, we want to save them in an appropriate file format with the desired metadata. Our code works with multiple formats, each of which have advantages and drawbacks: + +- Comma Separated Values (CSV, .csv): in this format, data are plain text and columns are separated by commas. While this format offers a high level of human readability, it also takes more space to store and a longer time to write and read than other formats. + + `pandas` offers the `read_csv()` function and `to_csv()` method to perform I/O operations with this format. Metadata must be included as plain text in the file. + +- Hierarchical Data Format (HDF5, .h5): this format stores data in binary form, so it is not human-readable. It takes up less space on disk than CSV files, and it writes/reads faster for numerical data. HDF5 does not serialize data columns containing structures like a `numpy` array, so file size improvements over CSV can be diminished if these structures exist in the data. + + `pandas` includes `read_hdf()` and `to_hdf()` to handle this format, and they require a package like [`PyTables`](https://www.pytables.org/) to work. `pandas` does not currently support the reading and writing of metadata using the above function and method. See `scope/utils.py` for code that handles metadata in HDF5 files. + +- Apache Parquet (.parquet): this format stores data in binary form like HDF5, so it is not human-readable. Like HDF5, Parquet also offers significant disk space savings over CSV. Unlike HDF5, Parquet supports structures like `numpy` arrays in data columns. + + While `pandas` offers `read_parquet()` and `to_parquet()` to support this format (requiring e.g. [`PyArrow`](https://arrow.apache.org/docs/python/) to work), these again do not support the reading and writing of metadata associated with the dataframe. See `scope/utils.py` for code that reads and writes metadata in Parquet files. + +## Mapping between column names and Fritz taxonomies +The column names of training set files and Fritz taxonomy classifications are not the same by default. Training sets may also contain columns that are not meant to be uploaded to Fritz. To address both of these issues, we use a 'taxonomy mapper' file to connect local data and Fritz taxonomies. + +This file must currently be generated manually, entry by entry. Each entry's key corresponds to a column name in the local file. The set of all keys is used to establish the columns of interest for upload or download. For example, if the training set includes columns that are not classifications, like RA and Dec, these columns should not be included among the entries in the mapper file. The code will then ignore these columns for the purpose of classification. + +The fields associated with each key are `fritz_label` (containing the associated Fritz classification name) and `taxonomy_id` identifying the classification's taxonomy system. The mapper must have the following format, also demonstrated in `golden_dataset_mapper.json` and `DNN_AL_mapper.json`: + +``` +{ +"variable": + {"fritz_label": "variable", + "taxonomy_id": 1012 + }, + +"periodic": + {"fritz_label": "periodic", + "taxonomy_id": 1012 + }, + + . + . [add more entries here] + . + +"CV": + {"fritz_label": "Cataclysmic", + "taxonomy_id": 1011 + } +} + +``` + +## Generating features +Code has been adapted from [ztfperiodic](https://github.com/mcoughlin/ztfperiodic) and other sources to calculate basic and Fourier stats for light curves along with other features. This allows new features to be generated with SCoPe, both locally and using GPU cluster resources. The feature generation script is run using the `generate-features` command. + +Currently, the basic stats are calculated via `tools/featureGeneration/lcstats.py`, and a host of period-finding algorithms are available in `tools/featureGeneration/periodsearch.py`. Among the CPU-based period-finding algorithms, there is not yet support for `AOV_cython`. For the `AOV` algorithm to work, run `source build.sh` in the `tools/featureGeneration/pyaov/` directory, then copy the newly created `.so` file (`aov.cpython-310-darwin.so` or similar) to `lib/python3.10/site-packages/` or equivalent within your environment. The GPU-based algorithms require CUDA support (so Mac GPUs are not supported). + +inputs: +1. --source-catalog* : name of Kowalski catalog containing ZTF sources (str) +2. --alerts-catalog* : name of Kowalski catalog containing ZTF alerts (str) +3. --gaia-catalog* : name of Kowalski catalog containing Gaia data (str) +4. --bright-star-query-radius-arcsec : maximum angular distance from ZTF sources to query nearby bright stars in Gaia (float) +5. --xmatch-radius-arcsec : maximum angular distance from ZTF sources to match external catalog sources (float) +6. --limit : maximum number of sources to process in batch queries / statistics calculations (int) +7. --period-algorithms* : dictionary containing names of period algorithms to run. Normally specified in config - if specified here, should be a (list) +8. --period-batch-size : maximum number of sources to simultaneously perform period finding (int) +9. --doCPU : flag to run config-specified CPU period algorithms (bool) +10. --doGPU : flag to run config-specified GPU period algorithms (bool) +11. --samples_per_peak : number of samples per periodogram peak (int) +12. --doScaleMinPeriod : for period finding, scale min period based on min-cadence-minutes (bool). Otherwise, set --max-freq to desired value +13. --doRemoveTerrestrial : remove terrestrial frequencies from period-finding analysis (bool) +14. --Ncore : number of CPU cores to parallelize queries (int) +15. --field : ZTF field to run (int) +16. --ccd : ZTF ccd to run (int) +17. --quad : ZTF quadrant to run (int) +18. --min-n-lc-points : minimum number of points required to generate features for a light curve (int) +19. --min-cadence-minutes : minimum cadence between light curve points. Higher-cadence data are dropped except for the first point in the sequence (float) +20. --dirname : name of generated feature directory (str) +21. --filename : prefix of each feature filename (str) +22. --doCesium : flag to compute config-specified cesium features in addition to default list (bool) +23. --doNotSave : flag to avoid saving generated features (bool) +24. --stop-early : flag to stop feature generation before entire quadrant is run. Pair with --limit to run small-scale tests (bool) +25. --doQuadrantFile : flag to use a generated file containing [jobID, field, ccd, quad] columns instead of specifying --field, --ccd and --quad (bool) +26. --quadrant-file : name of quadrant file in the generated_features/slurm directory or equivalent (str) +27. --quadrant-index : number of job in quadrant file to run (int) +28. --doSpecificIDs: flag to perform feature generation for ztf_id column in config-specified file (bool) +29. --skipCloseSources: flag to skip removal of sources too close to bright stars via Gaia (bool) +30. --top-n-periods: number of (E)LS, (E)CE periods to pass to (E)AOV if using (E)LS_(E)CE_(E)AOV algorithm (int) +31. --max-freq: maximum frequency [1 / days] to use for period finding (float). Overridden by --doScaleMinPeriod +32. --fg-dataset*: path to parquet, hdf5 or csv file containing specific sources for feature generation (str) +33. --max-timestamp-hjd*: maximum timestamp of queried light curves, HJD (float) + +output: +feature_df : dataframe containing generated features + +\* - specified in config.yaml + +### Example usage +The following is an example of running the feature generation script locally: + +``` +generate-features --field 301 --ccd 2 --quad 4 --source-catalog ZTF_sources_20230109 --alerts-catalog ZTF_alerts --gaia-catalog Gaia_EDR3 --bright-star-query-radius-arcsec 300.0 --xmatch-radius-arcsec 2.0 --query-size-limit 10000 --period-batch-size 1000 --samples-per-peak 10 --Ncore 4 --min-n-lc-points 50 --min-cadence-minutes 30.0 --dirname generated_features --filename gen_features --doCPU --doRemoveTerrestrial --doCesium +``` + +Setting `--doCPU` will run the config-specified CPU period algorithms on each source. Setting `--doGPU` instead will do likewise with the specified GPU algorithms. If neither of these keywords is set, the code will assign a value of `1.0` to each period and compute Fourier statistics using that number. + +Below is an example run the script using a job/quadrant file (containing [job id, field, ccd, quad] columns) instead of specifying field/ccd/quad directly: + +``` +generate-features --source-catalog ZTF_sources_20230109 --alerts-catalog ZTF_alerts --gaia-catalog Gaia_EDR3 --bright-star-query-radius-arcsec 300.0 --xmatch-radius-arcsec 2.0 --query-size-limit 10000 --period-batch-size 1000 --samples-per-peak 10 --Ncore 20 --min-n-lc-points 50 --min-cadence-minutes 30.0 --dirname generated_features_DR15 --filename gen_features --doGPU --doRemoveTerrestrial --doCesium --doQuadrantFile --quadrant-file slurm.dat --quadrant-index 5738 +``` + +### Slurm scripts +For large-scale feature generation, `generate-features` is intended to be run on a high-performance computing cluster. Often these clusters require jobs to be submitted using a utility like `slurm` (Simple Linux Utility for Resource Management) to generate scripts. These scripts contain information about the type, amount and duration of computing resources to allocate to the user. + +Scope's `generate-features-slurm` code creates two slurm scripts: (1) runs single instance of `generate-features`, and (2) runs the `generate-features-job-submission` which submits multiple jobs in parallel, periodically checking to see if additional jobs can be started. See below for more information about these components of feature generation. + +`generate-features-slurm` can receive all of the arguments used by `generate-features`. These arguments are passed to the instances of feature generation begun by running slurm script (1). There are also additional arguments specific to cluster resource management: + +inputs: +1. --job-name : name of submitted jobs (str) +2. --cluster-name : name of HPC cluster (str) +3. --partition-type : cluster partition to use (str) +4. --nodes : number of nodes to request (int) +5. --gpus : number of GPUs to request (int) +6. --memory-GB : amount of memory to request in GB (int) +7. --submit-memory-GB : Memory allocation to request for job submission (int) +8. --time : amount of time before instance times out (str) +9. --mail-user: user's email address for job updates (str) +10. --account-name : name of account having HPC allocation (str) +11. --python-env-name : name of Python environment to activate before running `generate_features.py` (str) +12. --generateQuadrantFile : flag to map fields/ccds/quads containing sources to job numbers, save file (bool) +13. --field-list : space-separated list of fields for which to generate quadrant file. If None, all populated fields included (int) +14. --max-instances : maximum number of HPC instances to run in parallel (int) +15. --wait-time-minutes : amount of time to wait between status checks in minutes (float) +16. --doSubmitLoop : flag to run loop initiating instances until out of jobs (hard on Kowalski) +17. --runParallel : flag to run jobs in parallel using slurm [recommended]. Otherwise, run in series on a single instance +18. --user : if using slurm, your username. This will be used to periodically run `squeue` and list your running jobs (str) +19. --submit-interval-minutes : Time to wait between job submissions, minutes (float) + +## Feature definitions +### Selected phenomenological feature definitions + +| name | definition | +| ---- | ---------- | +|ad | Anderson-Darling statistic | +|chi2red | Reduced chi^2 after mean subtraction | +|f1_BIC | Bayesian information criterion of best-fitting series (Fourier analysis) | +|f1_a | a coefficient of best-fitting series (Fourier analysis) | +|f1_amp | Amplitude of best-fitting series (Fourier analysis) | +|f1_b | b coefficient of best-fitting series (Fourier analysis) | +|f1_phi0 | Zero-phase of best-fitting series (Fourier analysis) | +|f1_power | Normalized chi^2 of best-fitting series (Fourier analysis) | +|f1_relamp1 | Relative amplitude, first harmonic (Fourier analysis) | +|f1_relamp2 | Relative amplitude, second harmonic (Fourier analysis) | +|f1_relamp3 | Relative amplitude, third harmonic (Fourier analysis) | +|f1_relamp4 | Relative amplitude, fourth harmonic (Fourier analysis) | +|f1_relphi1 | Relative phase, first harmonic (Fourier analysis) | +|f1_relphi2 | Relative phase, second harmonic (Fourier analysis) | +|f1_relphi3 | Relative phase, third harmonic (Fourier analysis) | +|f1_relphi4 | Relative phase, fourth harmonic (Fourier analysis) | +|i60r | Mag ratio between 20th, 80th percentiles | +|i70r | Mag ratio between 15th, 85th percentiles | +|i80r | Mag ratio between 10th, 90th percentiles | +|i90r | Mag ratio between 5th, 95th percentiles | +|inv_vonneumannratio | Inverse of Von Neumann ratio | +|iqr | Mag ratio between 25th, 75th percentiles | +|median | Median magnitude | +|median_abs_dev | Median absolute deviation of magnitudes | +|norm_excess_var | Normalized excess variance | +|norm_peak_to_peak_amp | Normalized peak-to-peak amplitude | +|roms | Root of mean magnitudes squared | +|skew | Skew of magnitudes | +|smallkurt | Kurtosis of magnitudes | +|stetson_j | Stetson J coefficient | +|stetson_k | Stetson K coefficient | +|sw | Shapiro-Wilk statistic | +|welch_i | Welch I statistic | +|wmean | Weighted mean of magtnidues | +|wstd | Weighted standard deviation of magnitudes | +|dmdt | Magnitude-time histograms (26x26) | + +### Selected ontological feature definitions +| name | definition | +| ---- | ---------- | +| mean_ztf_alert_braai | Mean significance of ZTF alerts for this source | +| n_ztf_alerts | Number of ZTF alerts for this source | +| period | Period determined by subscripted algorithms (e.g. ELS_ECE_EAOV) | +| significance | Significance of period | +| AllWISE_w1mpro | AllWISE W1 mag | +| AllWISE_w1sigmpro | AllWISE W1 mag error | +| AllWISE_w2mpro | AllWISE W2 mag | +| AllWISE_w2sigmpro | AllWISE W2 mag error | +| AllWISE_w3mpro | AllWISE W3 mag | +| AllWISE_w4mpro | AllWISE W4 mag | +| Gaia_EDR3__parallax | Gaia parallax | +| Gaia_EDR3__parallax_error | Gaia parallax error | +| Gaia_EDR3__phot_bp_mean_mag | Gaia BP mag | +| Gaia_EDR3__phot_bp_rp_excess_factor | Gaia BP-RP excess factor | +| Gaia_EDR3__phot_g_mean_mag | Gaia G mag | +| Gaia_EDR3__phot_rp_mean_mag | Gaia RP mag | +| PS1_DR1__gMeanPSFMag | PS1 g mag | +| PS1_DR1__gMeanPSFMagErr | PS1 g mag error | +| PS1_DR1__rMeanPSFMag | PS1 r mag | +| PS1_DR1__rMeanPSFMagErr | PS1 r mag error | +| PS1_DR1__iMeanPSFMag | PS1 i mag | +| PS1_DR1__iMeanPSFMagErr | PS1 i mag error | +| PS1_DR1__zMeanPSFMag | PS1 z mag | +| PS1_DR1__zMeanPSFMagErr | PS1 z mag error | +| PS1_DR1__yMeanPSFMag | PS1 y mag | +| PS1_DR1__yMeanPSFMagErr | PS1 y mag error | + +## Running automated analyses +The primary deliverable of SCoPe is a catalog of variable source classifications across all of ZTF. Since ZTF contains billions of light curves, this catalog requires significant compute resources to assemble. We may still want to study ZTF's expansive collection of data with SCoPe before the classification catalog is complete. For example, SCoPe classifiers can be applied to the realm of transient follow-up. + +It is useful to know the classifications of any persistent ZTF sources that are close to transient candidates on the sky. Once SCoPe's primary deliverable is complete, obtaining these classifications will involve a straightforward database query. Presently, however, we must run the SCoPe workflow on a custom list of sources repeatedly to account for the rapidly changing landscape of transient events. See "Guide for Fritz Scanners" for a more detailed explanation of the workflow itself. This section continues with a discussion of how the automated analysis in `gcn_cronjob.py` is implemented using `cron`. + +### `cron` job basics +`cron` runs scripts at specific time intervals in a simple environment. While this simplicity fosters compatibility between different operating systems, the trade-off is that some extra steps are required to run scripts compared to more familiar coding environments (e.g. within `scope-env` for this project). + +To set up a `cron` job, first run `EDITOR=emacs crontab -e`. You can replace `emacs` with your text editor of choice as long as it is installed on your machine. This command will open a text file in which to place `cron` commands. An example command is as follows: +```bash +0 */2 * * * cd scope && ~/miniforge3/envs/scope-env/bin/python ~/scope/gcn_cronjob.py > ~/scope/log_gcn_cronjob.txt 2>&1 + +``` +Above, the `0 */2 * * *` means that this command will run every two hours, on minute 0 of that hour. Time increments increase from left to right; in this example, the five numbers are minute, hour, day (of month), month, day (of week). The `*/2` means that the hour has to be divisible by 2 for the job to run. Check out [crontab.guru](https://crontab.guru) to learn more about `cron` timing syntax. + +Next in the line, we change directories to `scope` in order for the code to access our `config.yaml` file located in this directory. Then, `~/miniforge3/envs/scope-env/bin/python ~/scope/gcn_cronjob.py` is the command that gets run (using the Python environment installed in `scope-env`). The `>` character forwards the output from the command (e.g. what your script prints) into a log file in a specific location (here `~/scope/log_gcn_cronjob.txt`). Finally, the `2>&1` suppresses 'emails' from `cron` about the status of your job (unnecessary since the log is being saved to the user-specified file). + +Save the text file once you finish modifying it to install the cron job. **Ensure that the last line of your file is a newline to avoid issues when running.** Your computer may pop up a window to which you should respond in the affirmative in order to successfully initialize the job. To check which `cron` jobs have been installed, run `crontab -l`. To uninstall your jobs, run `crontab -r`. + +### Additional details for `cron` environment +Because `cron` runs in a simple environment, the usual details of environment setup and paths cannot be overlooked. In order for the above job to work, we need to add more information when we run `EDITOR=emacs crontab -e`. The lines below will produce a successful run (if SCoPe is installed in your home directory): + +``` +PYTHONPATH = /Users/username/scope + +0 */2 * * * /opt/homebrew/bin/gtimeout 2h ~/miniforge3/envs/scope-env/bin/python scope-gcn-cronjob > ~/scope/log_gcn_cronjob.txt 2>&1 + +``` +In the first line above, the `PYTHONPATH` environment variable is defined to include the `scope` directory. Without this line, any code that imports from `scope` will throw an error, since the user's usual `PYTHONPATH` variable is not accessed in the `cron` environment. + +The second line begins with the familiar `cron` timing pattern described above. It continues by specifying the a maximum runtime of 2 hours before timing out using the `gtimeout` command. On a Mac, this can be installed with `homebrew` by running `brew install coreutils`. Note that the full path to `gtimeout` must be specified. After the timeout comes the call to the `gcn_cronjob.py` script. Note that the usual `#/usr/bin/env python` line at the top of SCoPe's python scripts does not work within the `cron` environment. Instead, `python` must be explicitly specified, and in order to have access to the modules and scripts installed in `scope-env` we must provide a full path like the one above (`~/miniforge3/envs/scope-env/bin/python`). The line concludes by sending the script's output to a dedicated log file. This file gets overwritten each time the script runs. + +### Check if `cron` job is running +It can be useful to know whether the script within a cron job is currently running. One way to do this for `gcn_cronjob.py` is to run the command `ps aux | grep gcn_cronjob.py`. This will always return one item (representing the command you just ran), but if the script is currently running you will see more than one item. + +## Local feature generation/inference +SCoPe contains a script that runs local feature generation and inference on sources specified in an input file. Example input files are contained within the `tools` directory (`local_scope_radec.csv` and `local_scope_ztfid.csv`). After receiving either ra/dec coordinates or ZTF light curve IDs (plus an object ID for each entry), the `run-scope-local` script will generate features and run inference using existing trained models, saving the results to timestamped directories. This script accepts most arguments from `generate-features` and `scope-inference`. Additional inputs specific to this script are listed below. + +inputs: +1. --path-dataset : path (from base scope directory or fully qualified) to parquet, hdf5 or csv file containing specific sources (str) +2. --cone-radius-arcsec : radius of cone search query for ZTF lightcurve IDs, if inputting ra/dec (float) +3. --save-sources-filepath : path to parquet, hdf5 or csv file to save specific sources (str) +4. --algorithms : ML algorithms to run (currently dnn/xgb) +5. --group-names : group names of trained models (with order corresponding to --algorithms input) + +output: +current_dt : formatted datetime string used to label output directories + +### Example usage +``` +run-scope-local --path-dataset tools/local_scope_ztfid.csv --doCPU --doRemoveTerrestrial --scale_features min_max --group-names DR16_stats nobalance_DR16_DNN_stats --algorithms xgb + +run-scope-local --path-dataset tools/local_scope_radec.csv --doCPU --write_csv --doRemoveTerrestrial --group-names DR16_stats nobalance_DR16_DNN_stats --algorithms xgb dnn +``` + +## scope-download-classification +inputs: +1. --file : CSV file containing obj_id and/or ra dec coordinates. Set to "parse" to download sources by group id. +2. --group-ids : target group id(s) on Fritz for download, space-separated (if CSV file not provided) +3. --start : Index or page number (if in "parse" mode) to begin downloading (optional) +4. --merge-features : Flag to merge features from Kowalski with downloaded sources +5. --features-catalog : Name of features catalog to query +6. --features-limit : Limit on number of sources to query at once +7. --taxonomy-map : Filename of taxonomy mapper (JSON format) +8. --output-dir : Name of directory to save downloaded files +9. --output-filename : Name of file containing merged classifications and features +10. --output-format : Output format of saved files, if not specified in (9). Must be one of parquet, h5, or csv. +11. --get-ztf-filters : Flag to add ZTF filter IDs (separate catalog query) to default features +12. --impute-missing-features : Flag to impute missing features using scope.utils.impute_features +13. --update-training-set : if downloading an active learning sample, update the training set with the new classification based on votes +14. --updated-training-set-prefix : Prefix to add to updated training set file +15. --min-vote-diff : Minimum number of net votes (upvotes - downvotes) to keep an active learning classification. Caution: if zero, all classifications of reviewed sources will be added + +process: +1. if CSV file provided, query by object ids or ra, dec +2. if CSV file not provided, bulk query based on group id(s) +3. get the classification/probabilities/periods of the objects in the dataset from Fritz +4. append these values as new columns on the dataset, save to new file +5. if merge_features, query Kowalski and merge sources with features, saving new CSV file +6. Fritz sources with multiple associated ZTF IDs will generate multiple rows in the merged feature file +7. To skip the source download part of the code, provide an input CSV file containing columns named 'obj_id', 'classification', 'probability', 'period_origin', 'period', 'ztf_id_origin', and 'ztf_id'. +8. Set `--update-training-set` to read the config-specified training set and merge new sources/classifications from an active learning group + +output: data with new columns appended. + +```sh +scope-download-classification --file sample.csv --group-ids 360 361 --start 10 --merge-features True --features-catalog ZTF_source_features_DR16 --features-limit 5000 --taxonomy-map golden_dataset_mapper.json --output-dir fritzDownload --output-filename merged_classifications_features --output-format parquet -get-ztf-filters --impute-missing-features +``` + +## scope-download-gcn-sources +inputs: +1. --dateobs: unique dateObs of GCN event (str) +2. --group-ids: group ids to query sources, space-separated [all if not specified] (list) +3. --days-range: max days past event to search for sources (float) +4. --radius-arcsec: radius [arcsec] around new sources to search for existing ZTF sources (float) +5. --save-filename: filename to save source ids/coordinates (str) + +process: +1. query all sources associated with GCN event +2. get fritz names, ras and decs for each page of sources +3. save json file in a useful format to use with `generate-features --doSpecificIDs` + +```sh +scope-download-gcn-sources --dateobs 2023-05-21T05:30:43 +``` + +## scope-upload-classification +inputs: +1. --file : path to CSV, HDF5 or Parquet file containing ra, dec, period, and labels +2. --group-ids : target group id(s) on Fritz for upload, space-separated +3. --classification : Name(s) of input file columns containing classification probabilities (one column per label). Set this to "read" to automatically upload all classes specified in the taxonomy mapper at once. +4. --taxonomy-map : Filename of taxonomy mapper (JSON format) +5. --comment : Comment to post (if specified) +6. --start : Index to start uploading (zero-based) +7. --stop : Index to stop uploading (inclusive) +8. --classification-origin: origin of classifications. If 'SCoPe' (default), Fritz will apply custom color-coding +9. --skip-phot : flag to skip photometry upload (skips for existing sources only) +10. --post-survey-id : flag to post an annotation for the Gaia, AllWISE or PS1 id associated with each source +11. --survey-id-origin : Annotation origin name for survey_id +12. --p-threshold : Probability threshold for posted classification (values must be >= than this number to post) +13. --match-ids : flag to match input and existing survey_id values during upload. It is recommended to instead match obj_ids (see next line) +14. --use-existing-obj-id : flag to use existing source names in a column named 'obj_id' (a coordinate-based ID is otherwise generated by default) +15. --post-upvote : flag to post an upvote to newly uploaded classifications. Not recommended when posting automated classifications for active learning. +16. --check-labelled-box : flag to check the 'labelled' box for each source when uploading classifications. Not recommended when posting automated classifications for active learning. +17. --write-obj-id : flag to output a copy of the input file with an 'obj_id' column containing the coordinate-based IDs for each posted object. Use this file as input for future uploads to add to this column. +18. --result-dir : name of directory where upload results file is saved. Default is 'fritzUpload' within the tools directory. +19. --result-filetag: name of tag appended to the result filename. Default is 'fritzUpload'. +20. --result-format : result file format; one of csv, h5 or parquet. Default is parquet. +21. --replace-classifications : flag to delete each source's existing classifications before posting new ones. +22. --radius-arcsec: photometry search radius for uploaded sources. +23. --no-ml: flag to post classifications that do not originate from an ML classifier. +24. --post-phot-as-comment: flag to post photometry as a comment on the source (bool) +25. --post-phasefolded-phot: flag to post phase-folded photometry as comment in addition to time series (bool) +26. --phot-dirname: name of directory in which to save photometry plots (str) +27. --instrument-name: name of instrument used for observations (str) + +process: +0. include Kowalski host, port, protocol, and token or username+password in config.yaml +1. check if each input source exists by comparing input and existing obj_ids and/or survey_ids +2. save the objects to Fritz group if new +3. in batches, upload the classifications of the objects in the dataset to target group on Fritz +4. duplicate classifications will not be uploaded to Fritz. If n classifications are manually specified, probabilities will be sourced from the last n columns of the dataset. +5. post survey_id annotations +6. (post comment to each uploaded source) + +```sh +scope-upload-classification --file sample.csv --group-ids 500 250 750 --classification variable flaring --taxonomy-map map.json --comment confident --start 35 --stop 50 --skip-phot --p-threshold 0.9 --write-obj-id --result-format csv --use-existing-obj-id --post-survey-id --replace-classifications +``` + +## scope-manage-annotation +inputs: +1. --action : one of "post", "update", or "delete" +2. --source : ZTF ID or path to .csv file with multiple objects (ID column "obj_id") +3. --group-ids : target group id(s) on Fritz, space-separated +4. --origin : name of annotation +5. --key : name of annotation +6. --value : value of annotation (required for "post" and "update" - if source is a .csv file, value will auto-populate from `source[key]`) + +process: +1. for each source, find existing annotations (for "update" and "delete" actions) +2. interact with API to make desired changes to annotations +3. confirm changes with printed messages + +```sh +scope-manage-annotation --action post --source sample.csv --group_ids 200 300 400 --origin revisedperiod --key period +``` + +## Scope Upload Disagreements (deprecated) +inputs: +1. dataset +2. group id on Fritz +3. gloria object + +process: +1. read in the csv dataset to pandas dataframe +2. get high scoring objects on DNN or on XGBoost from Fritz +3. get objects that have high confidence on DNN but low confidence on XGBoost and vice versa +4. get different statistics of those disagreeing objects and combine to a dataframe +5. filter those disagreeing objects that are contained in the training set and remove them +6. upload the remaining disagreeing objects to target group on Fritz + +```sh +./scope_upload_disagreements.py -file dataset.d15.csv -id 360 -token sample_token +``` diff --git a/_sources/zenodo.md.txt b/_sources/zenodo.md.txt new file mode 100644 index 0000000..1619512 --- /dev/null +++ b/_sources/zenodo.md.txt @@ -0,0 +1,31 @@ +# Data Releases on Zenodo + +As more ZTF fields receive SCoPe classifications, we make them public on Zenodo. This page describes the data products available and provides a guide to preparing/publishing new data releases. The permanent link for the SCoPe III repository on Zenodo is [https://zenodo.org/doi/10.5281/zenodo.8410825](https://zenodo.org/doi/10.5281/zenodo.8410825). This link will always resolve to the latest data release. + +## Data product description + +The most recent data release contains these components: + +| file | description | +| -------------- | ------------ | +| field_296_100rows.csv | Demo predictions file containing 100 classified light curves | +| fields.json | List of fields in classification catalog, generated when running `combine-preds` | +| predictions_dnn_xgb_*N*_fields.zip | Zip file containing classification catalog (contains *N* combined DNN/XGB prediction files in CSV format) | +| SCoPe_classification_demo.ipynb | Notebook interacting with demo predictions | +| trained_dnn_models.zip | Zip file containing trained DNN models | +| trained_xgb_models.zip | Zip file containing trained XGB models | +| training_set.parquet | Parquet file containing training set | + +## Preparing a new release + +To begin a new release draft, click "New version" on the current release. The main difference between releases is the classification catalog Zip file, which adds more ZTF fields over time, along with `fields.json`. Other unchanged elements of the release may be imported from the previous release by clicking "Import files". + +## Publishing a new release + +To publish a new release after uploading the latest classification catalog, first ensure that all desired files are in place. Then, click "Get a DOI now!" to reserve a version-specific DOI for this release. Additionally, specify the publication date and version in `vX.Y.Z` format. + +Finally, create release notes by clicking "Add description" and choosing "Notes" under the "Type" dropdown. These release notes should specify what has changed from one version to the next. + +## Adding new users + +The "ZTF Source Classification Project" community [ztf-scope](https://zenodo.org/communities/ztf-scope) contains the current data repository. Inviting additional Zenodo users to this community as Curators will allow them to manage the repository and create new versions. diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 0000000..30fee9d --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 0000000..7e4c114 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000..a858a41 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 0000000..250f566 --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000..d96755f Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000..7107cec Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 0000000..f4af905 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,79 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #4f424c } +.highlight { background: #2f1e2e; color: #e7e9db } +.highlight .c { color: #776e71 } /* Comment */ +.highlight .err { color: #ef6155 } /* Error */ +.highlight .k { color: #815ba4 } /* Keyword */ +.highlight .l { color: #f99b15 } /* Literal */ +.highlight .n { color: #e7e9db } /* Name */ +.highlight .o { color: #5bc4bf } /* Operator */ +.highlight .p { color: #e7e9db } /* Punctuation */ +.highlight .ch { color: #776e71 } /* Comment.Hashbang */ +.highlight .cm { color: #776e71 } /* Comment.Multiline */ +.highlight .cp { color: #776e71 } /* Comment.Preproc */ +.highlight .cpf { color: #776e71 } /* Comment.PreprocFile */ +.highlight .c1 { color: #776e71 } /* Comment.Single */ +.highlight .cs { color: #776e71 } /* Comment.Special */ +.highlight .gd { color: #ef6155 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gh { color: #e7e9db; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #48b685 } /* Generic.Inserted */ +.highlight .gp { color: #776e71; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #5bc4bf; font-weight: bold } /* Generic.Subheading */ +.highlight .kc { color: #815ba4 } /* Keyword.Constant */ +.highlight .kd { color: #815ba4 } /* Keyword.Declaration */ +.highlight .kn { color: #5bc4bf } /* Keyword.Namespace */ +.highlight .kp { color: #815ba4 } /* Keyword.Pseudo */ +.highlight .kr { color: #815ba4 } /* Keyword.Reserved */ +.highlight .kt { color: #fec418 } /* Keyword.Type */ +.highlight .ld { color: #48b685 } /* Literal.Date */ +.highlight .m { color: #f99b15 } /* Literal.Number */ +.highlight .s { color: #48b685 } /* Literal.String */ +.highlight .na { color: #06b6ef } /* Name.Attribute */ +.highlight .nb { color: #e7e9db } /* Name.Builtin */ +.highlight .nc { color: #fec418 } /* Name.Class */ +.highlight .no { color: #ef6155 } /* Name.Constant */ +.highlight .nd { color: #5bc4bf } /* Name.Decorator */ +.highlight .ni { color: #e7e9db } /* Name.Entity */ +.highlight .ne { color: #ef6155 } /* Name.Exception */ +.highlight .nf { color: #06b6ef } /* Name.Function */ +.highlight .nl { color: #e7e9db } /* Name.Label */ +.highlight .nn { color: #fec418 } /* Name.Namespace */ +.highlight .nx { color: #06b6ef } /* Name.Other */ +.highlight .py { color: #e7e9db } /* Name.Property */ +.highlight .nt { color: #5bc4bf } /* Name.Tag */ +.highlight .nv { color: #ef6155 } /* Name.Variable */ +.highlight .ow { color: #5bc4bf } /* Operator.Word */ +.highlight .pm { color: #e7e9db } /* Punctuation.Marker */ +.highlight .w { color: #e7e9db } /* Text.Whitespace */ +.highlight .mb { color: #f99b15 } /* Literal.Number.Bin */ +.highlight .mf { color: #f99b15 } /* Literal.Number.Float */ +.highlight .mh { color: #f99b15 } /* Literal.Number.Hex */ +.highlight .mi { color: #f99b15 } /* Literal.Number.Integer */ +.highlight .mo { color: #f99b15 } /* Literal.Number.Oct */ +.highlight .sa { color: #48b685 } /* Literal.String.Affix */ +.highlight .sb { color: #48b685 } /* Literal.String.Backtick */ +.highlight .sc { color: #e7e9db } /* Literal.String.Char */ +.highlight .dl { color: #48b685 } /* Literal.String.Delimiter */ +.highlight .sd { color: #776e71 } /* Literal.String.Doc */ +.highlight .s2 { color: #48b685 } /* Literal.String.Double */ +.highlight .se { color: #f99b15 } /* Literal.String.Escape */ +.highlight .sh { color: #48b685 } /* Literal.String.Heredoc */ +.highlight .si { color: #f99b15 } /* Literal.String.Interpol */ +.highlight .sx { color: #48b685 } /* Literal.String.Other */ +.highlight .sr { color: #48b685 } /* Literal.String.Regex */ +.highlight .s1 { color: #48b685 } /* Literal.String.Single */ +.highlight .ss { color: #48b685 } /* Literal.String.Symbol */ +.highlight .bp { color: #e7e9db } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06b6ef } /* Name.Function.Magic */ +.highlight .vc { color: #ef6155 } /* Name.Variable.Class */ +.highlight .vg { color: #ef6155 } /* Name.Variable.Global */ +.highlight .vi { color: #ef6155 } /* Name.Variable.Instance */ +.highlight .vm { color: #ef6155 } /* Name.Variable.Magic */ +.highlight .il { color: #f99b15 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 0000000..7918c3f --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_static/taxonomy.html b/_static/taxonomy.html new file mode 100644 index 0000000..93e0fa8 --- /dev/null +++ b/_static/taxonomy.html @@ -0,0 +1,270 @@ + + + + + + +

Time-Domain Taxonomy

+ +
+2024-04-09 01:11:43.546211 Version: 0.1.6 +
+ + + + + diff --git a/_static/theme.css b/_static/theme.css new file mode 100644 index 0000000..16c9136 --- /dev/null +++ b/_static/theme.css @@ -0,0 +1 @@ +.theme-default-content code{color:var(--text-color-l20);padding:.25rem .5rem;margin:0;font-size:.85em;border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:var(--code-bg-color);border-radius:6px;overflow:auto}.theme-default-content pre code,.theme-default-content pre[class*=language-] code{color:var(--grey3);padding:0;background-color:transparent!important;border-radius:0}div[class*=language-]{position:relative;background-color:var(--code-bg-color);border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:#000000a8}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;background-color:var(--code-bg-color)}div[class~="language-$codeLang"]:before{content:"$codeLang"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.theme-light .theme-default-content code{background-color:var(--grey14)}.theme-light code[class*=language-],.theme-light pre[class*=language-]{color:#000;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.theme-light pre[class*=language-]::-moz-selection,.theme-light pre[class*=language-] ::-moz-selection,.theme-light code[class*=language-]::-moz-selection,.theme-light code[class*=language-] ::-moz-selection{background:#b3d4fc}.theme-light pre[class*=language-]::selection,.theme-light pre[class*=language-] ::selection,.theme-light code[class*=language-]::selection,.theme-light code[class*=language-] ::selection{background:#b3d4fc}.theme-light pre[class*=language-]{margin:.5em 0;overflow:auto}.theme-light :not(pre)>code[class*=language-],.theme-light pre[class*=language-]{background:#f5f2f0}.theme-light :not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.theme-light .token.comment,.theme-light .token.prolog,.theme-light .token.doctype,.theme-light .token.cdata{color:#708090}.theme-light .token.punctuation{color:#5f6364}.theme-light .token.property,.theme-light .token.tag,.theme-light .token.boolean,.theme-light .token.number,.theme-light .token.function-name,.theme-light .token.constant,.theme-light .token.symbol,.theme-light .token.deleted{color:#c92c2c}.theme-light .token.selector,.theme-light .token.attr-name,.theme-light .token.string,.theme-light .token.char,.theme-light .token.function,.theme-light .token.builtin,.theme-light .token.inserted{color:#2f9c0a}.theme-light .token.operator,.theme-light .token.entity,.theme-light .token.url,.theme-light .token.variable{color:#a67f59;background:#ffffff80}.theme-light .token.atrule,.theme-light .token.attr-value,.theme-light .token.keyword,.theme-light .token.class-name{color:#1990b8}.theme-light .token.regex,.theme-light .token.important{color:#e90}.theme-light .language-css .token.string,.theme-light .style .token.string{color:#a67f59;background:#ffffff80}.theme-light .token.important{font-weight:400}.theme-light .token.bold{font-weight:700}.theme-light .token.italic{font-style:italic}.theme-light .token.entity{cursor:help}.theme-light .token.namespace{opacity:.7}.theme-light div[class*=language-] .highlight-lines .highlighted{background-color:#d7e9f7}.theme-light div[class*=language-] pre,.theme-light div[class*=language-] pre[class*=language-]{background:transparent}.theme-light div[class*=language-]:before{color:#0006}.theme-light div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{background-color:#d7e9f7}.theme-light div[class*=language-].line-numbers-mode .line-numbers-wrapper{color:#0000004d}.theme-light div[class*=language-].line-numbers-mode:after{border-right:1px solid #c2def3}.theme-dark .theme-default-content code{background-color:var(--grey12)}.theme-dark code[class*=language-],.theme-dark pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.theme-dark pre[class*=language-]{margin:.5em 0;overflow:auto}.theme-dark :not(pre)>code[class*=language-],.theme-dark pre[class*=language-]{background:#2d2d2d}.theme-dark :not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.theme-dark .token.comment,.theme-dark .token.block-comment,.theme-dark .token.prolog,.theme-dark .token.doctype,.theme-dark .token.cdata{color:#999}.theme-dark .token.punctuation{color:#ccc}.theme-dark .token.tag,.theme-dark .token.attr-name,.theme-dark .token.namespace,.theme-dark .token.deleted{color:#e2777a}.theme-dark .token.function-name{color:#6196cc}.theme-dark .token.boolean,.theme-dark .token.number,.theme-dark .token.function{color:#f08d49}.theme-dark .token.property,.theme-dark .token.class-name,.theme-dark .token.constant,.theme-dark .token.symbol{color:#f8c555}.theme-dark .token.selector,.theme-dark .token.important,.theme-dark .token.atrule,.theme-dark .token.keyword,.theme-dark .token.builtin{color:#cc99cd}.theme-dark .token.string,.theme-dark .token.char,.theme-dark .token.attr-value,.theme-dark .token.regex,.theme-dark .token.variable{color:#7ec699}.theme-dark .token.operator,.theme-dark .token.entity,.theme-dark .token.url{color:#67cdcc}.theme-dark .token.important,.theme-dark .token.bold{font-weight:700}.theme-dark .token.italic{font-style:italic}.theme-dark .token.entity{cursor:help}.theme-dark .token.inserted{color:green}.theme-dark div[class*=language-] .highlight-lines .highlighted{background-color:#1d2128}.theme-dark div[class*=language-] pre,.theme-dark div[class*=language-] pre[class*=language-]{background:transparent}.theme-dark div[class*=language-]:before{color:#fff6}.theme-dark div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{background-color:#1d2128}.theme-dark div[class*=language-].line-numbers-mode .line-numbers-wrapper{color:#ffffff4d}.theme-dark div[class*=language-].line-numbers-mode:after{border-right:1px solid #191d22}.theme-light{--text-color: #2c3e50;--background-color: #fff;--border-color: #eaecef;--code-bg-color: #ecf4fa;--arrow-bg-color: #ccc;--box-shadow-color: #f0f1f2;--card-shadow-color: $cardShadowColor;--text-color-l10: #3a5169;--text-color-l20: #476582;--text-color-l25: #4e6e8e;--text-color-l40: #6a8bad;--black: #000;--dark-grey: #666;--light-grey: #999;--white: #fff;--grey3: #333;--grey12: #bbb;--grey14: #eee}.theme-dark{--text-color: #9e9e9e;--background-color: #1e1e1e;--border-color: #302d28;--code-bg-color: #282c34;--arrow-bg-color: #333;--box-shadow-color: #0f0e0d;--card-shadow-color: $nightCardShadowColor;--text-color-l10: #a8a8a8;--text-color-l20: #b1b1b1;--text-color-l25: #b6b6b6;--text-color-l40: #c5c5c5;--black: #fff;--dark-grey: #999;--light-grey: #666;--white: #000;--grey3: #ccc;--grey12: #333;--grey14: #111}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.tip,.custom-block.warning,.custom-block.danger{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{border-color:#42b983}.custom-block.warning{border-color:#e7c000}.custom-block.danger{border-color:#c00}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.theme-light .custom-block.tip{background-color:#f3f5f7}.theme-light .custom-block.warning{background-color:#ffe5644d;color:#6b5900}.theme-light .custom-block.warning .custom-block-title{color:#b29400}.theme-light .custom-block.warning a{color:var(--text-color)}.theme-light .custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.theme-light .custom-block.danger .custom-block-title{color:#900}.theme-light .custom-block.danger a{color:var(--text-color)}.theme-light .custom-block.details{background-color:#eee}.theme-dark .custom-block.tip,.theme-dark .custom-block.warning,.theme-dark .custom-block.danger,.theme-dark .custom-block.details{background-color:#404040}.theme-dark .custom-block.tip a,.theme-dark .custom-block.warning a,.theme-dark .custom-block.danger a,.theme-dark .custom-block.details a{color:#3eaf7c}.theme-dark .custom-block.warning{color:#b29400}.theme-dark .custom-block.warning .custom-block-title{color:#d5b100}.theme-dark .custom-block.danger{color:#b30000}.theme-dark .custom-block.danger .custom-block-title{color:#c00}.theme-dark .custom-block.details{color:var(--text-color)}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:6px solid var(--arrow-bg-color)}.arrow.down{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid var(--arrow-bg-color)}.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:6px solid var(--arrow-bg-color)}.arrow.left{border-top:4px solid transparent;border-bottom:4px solid transparent;border-right:6px solid var(--arrow-bg-color)}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width: 419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}html,body{padding:0;margin:0;background-color:var(--background-color)}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:var(--text-color);-webkit-tap-highlight-color:transparent}.page{padding-left:20rem}.navbar{position:fixed;z-index:20;top:0;left:0;right:0;height:3.6rem;background-color:var(--background-color);box-sizing:border-box;border-bottom:1px solid var(--box-shadow-color)}.sidebar-mask{position:fixed;z-index:9;top:0;left:0;width:100vw;height:100vh;display:none}.vp-sidebar{font-size:16px;background-color:var(--background-color);width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid var(--border-color);overflow-y:auto}.theme-default-content:not(.custom)>*:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;color:#3eaf7c;text-decoration:none}p a code{font-weight:400;color:#3eaf7c}kbd{background:#eee;border:solid .15rem #ddd;border-bottom:solid .25rem #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ul,ol{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+pre,.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+.custom-block{margin-top:2rem}h1:focus .header-anchor,h2:focus .header-anchor,h3:focus .header-anchor,h4:focus .header-anchor,h5:focus .header-anchor,h6:focus .header-anchor,h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid var(--border-color)}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:focus,a.header-anchor:hover{text-decoration:none}code,kbd,.line-number{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}p,ul,ol{line-height:1.7}hr{border:0;border-top:1px solid var(--border-color)}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}th,td{border:1px solid var(--grey14);padding:.6em 1em}.theme-dark tr:nth-child(2n){background-color:#252322}.theme-dark th,.theme-dark td{border:1px solid var(--grey12)}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .vp-sidebar{top:0}@media (min-width: 720px){.theme-container.no-sidebar .vp-sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}::-webkit-scrollbar,Mister-Hope marked this conversation as resolved.{width:6px;height:6px}::-webkit-scrollbar-track-piece{background-color:#0000001a;-webkit-border-radius:6px}::-webkit-scrollbar-thumb:vertical{height:6px;background-color:#3eaf7c;-webkit-border-radius:6px}::-webkit-scrollbar-thumb:horizontal{width:6px;background-color:#3eaf7c;-webkit-border-radius:6px}@media (max-width: 959px){.vp-sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width: 719px){.vp-sidebar{top:0;padding-top:3.6rem;transform:translate(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .vp-sidebar{transform:translate(0)}.theme-container.no-navbar .vp-sidebar{padding-top:0}}@media (max-width: 419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.page{margin-left:10px;margin-right:10px}table p,dd p,li p{margin:0}.content{max-width:840px;margin:0 auto}.content pre{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:#1b1f230d;border-radius:3px}.content .footnote-reference,.content .label,.content .reference{scroll-margin-top:3.6rem}.content a:focus{outline:none}.content:not(.custom){max-width:840px}.content section{scroll-margin-top:4.1rem;margin-bottom:0}.content section:hover .headerlink{opacity:1}h1:hover a.headerlink:after,h2:hover a.headerlink:after,h3:hover a.headerlink:after,h4:hover a.headerlink:after,h5:hover a.headerlink:after,h6:hover a.headerlink:after{visibility:visible;content:"#"}a.headerlink{font-size:.85em;visibility:hidden}a.headerlink:hover{text-decoration:none}ul.page-nav{list-style:none}ul.page-nav li{display:inline-block}.body-header{display:flex}.body-header ul.page-nav{flex-grow:1;list-style:none;list-style-position:inside;text-align:right;margin-right:30px}.body-header ul.page-nav li+li:before{content:"|";padding:0 1em}ul.breadcrumbs{list-style:none}ul.breadcrumbs li{display:inline-block;margin-right:5px}.toc-backref{color:inherit}.contents.topic p.topic-title{display:none}.contents.topic{margin-bottom:3em}aside.sidebar{margin:0 0 .5em 1em;border:1px solid #ddb;padding:7px;background-color:#ffe;width:40%;float:right;clear:right;overflow-x:auto}p.sidebar-title{font-weight:700}div.admonition,div.topic,blockquote{clear:left}pre,div[class*=highlight-]{clear:both}.toctree-wrapper .caption{font-weight:600;line-height:1.25;font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}.footer{clear:both;min-height:2rem;padding-top:1rem;overflow:auto;color:gray;font-size:small;line-height:1.5rem}.content .highlight{border-radius:6px}.content .highlight pre{background-color:inherit}.content .highlighted{background-color:#fbe54e;font-weight:700;padding:0 4px}.admonition{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0;background-color:#e2e2e2;border-color:#787878}.admonition .admonition-title{font-weight:600;margin-bottom:-.4rem}.admonition.tip,.admonition.hint{background-color:#f3f5f7;border-color:#42b983}.admonition.important,.admonition.note{background-color:#e5f1fb;border-color:#5faaea}.admonition.warning,.admonition.caution{background-color:#ffe5644d;border-color:#e7c000;color:#6b5900}.admonition.warning .custom-block-title,.admonition.caution .custom-block-title{color:#b29400}.admonition.warning a,.admonition.caution a{color:var(--text-color)}.admonition.danger,.admonition.error{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.admonition.danger .custom-block-title,.admonition.error .custom-block-title{color:#900}.admonition.danger a,.admonition.error a{color:var(--text-color)}.line-block{display:block;margin-top:1em;margin-bottom:1em}.line-block .line-block{margin-top:0;margin-bottom:0;margin-left:1.5em}.guilabel,.menuselection{font-family:sans-serif}.accelerator{text-decoration:underline}.classifier{font-style:oblique}.classifier:before{font-style:normal;margin:.5em;content:":"}abbr,acronym{border-bottom:dotted 1px;cursor:help}div.topic{border:1px solid #ccc;padding:7px;margin:10px 0;background-color:var(--bg-color)}p.topic-title{font-size:1.1em;font-weight:700;margin-top:10px}a.brackets:before,span.brackets>a:before{content:"["}a.brackets:after,span.brackets>a:after{content:"]"}p.rubric{margin-top:30px;font-weight:700}code,pre,kbd,samp,.pre{font-family:SFMono-Regular,Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace}@media (max-width: 1200px){pre{font-size:.95em}}blockquote{font-size:inherit}blockquote h2{margin-left:1em}.sig .property{color:#4d6a86;padding-right:.25rem}.sig-name.descname{font-size:1.2em;font-weight:700;padding:0 0 3px}.sig-param,.sig-paren{margin-left:.3em}dt{line-height:1.5em;margin-top:1em;font-weight:700}dt.field-odd,dt.field-even,p.rubric{font-size:1.2em;font-weight:700;color:#4d6a86}dd{margin-inline-start:10px}dd.field-odd p strong{margin-left:1em}dl.method,dl.function{margin-top:1em;margin-bottom:2em}.viewcode-link{margin-left:1em;color:#9ad8bc}dl.field-list{display:grid;grid-template-columns:fit-content(30%) auto}dl.field-list dt{margin-top:0}dl.field-list dd{margin-bottom:1em}dl.field-list>dt{font-weight:700;word-break:break-word;padding-left:.5em;padding-right:5px}dl.field-list>dt:after{content:":"}dl.field-list>dd{padding-left:.5em;margin-top:0;margin-left:0;margin-bottom:0}dl{margin-bottom:15px}img.align-left,figure.align-left,.figure.align-left,object.align-left{clear:left;float:left;margin-right:1em}img.align-right,figure.align-right,.figure.align-right,object.align-right{clear:right;float:right;margin-left:1em}img.align-center,figure.align-center,.figure.align-center,object.align-center{display:block;margin-left:auto;margin-right:auto}img.align-default,figure.align-default,.figure.align-default{display:block;margin-left:auto;margin-right:auto}.align-left{text-align:left}.align-center,.align-default{text-align:center}.align-right{text-align:right}.content .section,.section{opacity:1!important}.icon.outbound{color:#aaa;display:inline-block}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width: $MQMobile){.sidebar-button{display:block}}.darkmode-switch{position:fixed;bottom:3rem;right:2rem;height:24px;display:flex}.darkmode-switch:hover{cursor:pointer}.darkmode-switch .item{padding:4px;line-height:1;border:1px solid #3eaf7c;border-left:none}.darkmode-switch .item:first-child{border-left:1px solid #3eaf7c}.darkmode-switch .item.day{border-top-left-radius:4px;border-bottom-left-radius:4px}.darkmode-switch .item.night{border-top-right-radius:4px;border-bottom-right-radius:4px}.darkmode-switch .item .icon{width:16px;height:16px;fill:#3eaf7c}.darkmode-switch .item.active{background-color:#3eaf7c}.darkmode-switch .item.active:hover{cursor:default}.darkmode-switch .item.active .icon{fill:var(--white)}.navbar{padding:.7rem 1.5rem;line-height:2.2rem;position:fixed}.navbar a,.navbar span,.navbar img{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:var(--text-color);position:relative}.navbar .links{font-size:.9rem;position:absolute;right:1.5rem;top:.7rem}@media (max-width: 719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.sidebar-button{display:block}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a:hover,.nav-links a.router-link-active{color:#3eaf7c}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .repo-link{margin-left:1.5rem}@media (max-width: 719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width: 719px){.nav-links a:hover,.nav-links a.router-link-active{color:var(--text-color)}.nav-item>a:not(.external):hover,.nav-item>a:not(.external).router-link-active{margin-bottom:-2px;border-bottom:2px solid #46bd87}}.vp-sidebar ul{padding:0;margin:0;list-style-type:none}.vp-sidebar a{display:inline-block}.vp-sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.vp-sidebar .nav-links a{font-weight:600}.vp-sidebar .nav-links .nav-item,.vp-sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.vp-sidebar .searchbox{font-weight:600;font-size:1.1em;line-height:1.5rem;padding:1rem 0 1.5rem .75rem;border-bottom:1px solid #eaecef}.vp-sidebar .sidebar-links{padding:1.5rem 0}@media (max-width: 719px){.vp-sidebar .nav-links{display:block}.vp-sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.vp-sidebar .sidebar-links{padding:1rem 0}}.sidebar-group:not(.first){margin-top:1em}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .caption{cursor:auto;color:inherit}.sidebar-group .caption{color:#999;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:0 1.5rem;margin-top:0;margin-bottom:.5rem}.sidebar-group .caption.open,.sidebar-group .caption:hover{color:inherit}.sidebar-group .caption .arrow{position:relative;top:-.12em;left:.5em}.sidebar-group .caption:.open .arrow{top:-.18em}.sidebar-group-items{transition:height .1s ease-out;overflow:hidden}.vp-sidebar .toctree-l1 ul{font-size:.95em}.vp-sidebar .toctree-l1 a,.vp-sidebar .toctree-l2 a{font-weight:400;display:inline-block;color:var(--text-color);line-height:1.4;width:100%;box-sizing:border-box;border-left:.5rem solid transparent}.vp-sidebar .toctree-l1 a.current,.vp-sidebar .toctree-l2 a.current{color:#3eaf7c;font-weight:600}.vp-sidebar .toctree-l1 a:hover,.vp-sidebar .toctree-l2 a:hover{color:#3eaf7c}.vp-sidebar .toctree-l1.current a{border-left:.5rem solid #86d4b1}.vp-sidebar .toctree-l1 a{padding:.35rem 1rem .35rem 1.25rem}.vp-sidebar .toctree-l1 a.current{border-left-color:#3eaf7c}.vp-sidebar .toctree-l2 a{padding:.25rem 1rem .25rem 1.75rem}.page-edit,.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.page-edit,.page-nav{padding:2rem}}@media (max-width: 419px){.page-edit,.page-nav{padding:1.5rem}}.page{padding-top:3.6rem;padding-bottom:2rem}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:var(--text-color, #2c3e50);margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:var(--text-color, #2c3e50)}.page-edit .last-updated .time{font-weight:400;color:#aaa}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}@media (max-width: 719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}} diff --git a/_static/theme.js b/_static/theme.js new file mode 100644 index 0000000..e3b3ce3 --- /dev/null +++ b/_static/theme.js @@ -0,0 +1,38 @@ +(function(){"use strict";/** +* @vue/shared v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function $e(e,t){const n=new Set(e.split(","));return t?s=>n.has(s.toLowerCase()):s=>n.has(s)}const ie={},hn=[],ge=()=>{},ys=()=>!1,Dt=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),ki=e=>e.startsWith("onUpdate:"),ne=Object.assign,Ri=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},mf=Object.prototype.hasOwnProperty,se=(e,t)=>mf.call(e,t),V=Array.isArray,dn=e=>pn(e)==="[object Map]",Vt=e=>pn(e)==="[object Set]",bo=e=>pn(e)==="[object Date]",gf=e=>pn(e)==="[object RegExp]",W=e=>typeof e=="function",J=e=>typeof e=="string",Ye=e=>typeof e=="symbol",oe=e=>e!==null&&typeof e=="object",Mi=e=>(oe(e)||W(e))&&W(e.then)&&W(e.catch),So=Object.prototype.toString,pn=e=>So.call(e),yf=e=>pn(e).slice(8,-1),vo=e=>pn(e)==="[object Object]",Pi=e=>J(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,yt=$e(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),_f=$e("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),_s=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},bf=/-(\w)/g,ue=_s(e=>e.replace(bf,(t,n)=>n?n.toUpperCase():"")),Sf=/\B([A-Z])/g,De=_s(e=>e.replace(Sf,"-$1").toLowerCase()),Bt=_s(e=>e.charAt(0).toUpperCase()+e.slice(1)),mn=_s(e=>e?`on${Bt(e)}`:""),Xe=(e,t)=>!Object.is(e,t),gn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Pn=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Ss=e=>{const t=J(e)?Number(e):NaN;return isNaN(t)?e:t};let Eo;const Co=()=>Eo||(Eo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),vf=$e("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error");function Ln(e){if(V(e)){const t={};for(let n=0;n{if(n){const s=n.split(Cf);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function _t(e){let t="";if(J(e))t=e;else if(V(e))for(let n=0;nbt(n,t))}const Ff=e=>J(e)?e:e==null?"":V(e)||oe(e)&&(e.toString===So||!W(e.toString))?JSON.stringify(e,wo,2):String(e),wo=(e,t)=>t&&t.__v_isRef?wo(e,t.value):dn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,i],r)=>(n[Li(s,r)+" =>"]=i,n),{})}:Vt(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Li(n))}:Ye(t)?Li(t):oe(t)&&!V(t)&&!vo(t)?String(t):t,Li=(e,t="")=>{var n;return Ye(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Ve;class Fi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Ve,!t&&Ve&&(this.index=(Ve.scopes||(Ve.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Ve;try{return Ve=this,t()}finally{Ve=n}}}on(){Ve=this}off(){Ve=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),Et()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=St,n=Ht;try{return St=!0,Ht=this,this._runnings++,xo(this),this.fn()}finally{Oo(this),this._runnings--,Ht=n,St=t}}stop(){var t;this.active&&(xo(this),Oo(this),(t=this.onStop)==null||t.call(this),this.active=!1)}}function Vf(e){return e.value}function xo(e){e._trackId++,e._depsLength=0}function Oo(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{n.dirty&&n.run()});t&&(ne(n,t),t.scope&&No(n,t.scope)),(!t||!t.lazy)&&n.run();const s=n.run.bind(n);return s.effect=n,s}function Hf(e){e.effect.stop()}let St=!0,$i=0;const Ro=[];function vt(){Ro.push(St),St=!1}function Et(){const e=Ro.pop();St=e===void 0?!0:e}function Di(){$i++}function Vi(){for($i--;!$i&&Bi.length;)Bi.shift()()}function Mo(e,t,n){if(t.get(e)!==e._trackId){t.set(e,e._trackId);const s=e.deps[e._depsLength];s!==t?(s&&ko(s,e),e.deps[e._depsLength++]=t):e._depsLength++}}const Bi=[];function Po(e,t,n){Di();for(const s of e.keys()){let i;s._dirtyLevel{const n=new Map;return n.cleanup=e,n.computed=t,n},Es=new WeakMap,Ut=Symbol(""),Hi=Symbol("");function Re(e,t,n){if(St&&Ht){let s=Es.get(e);s||Es.set(e,s=new Map);let i=s.get(n);i||s.set(n,i=Lo(()=>s.delete(n))),Mo(Ht,i)}}function at(e,t,n,s,i,r){const o=Es.get(e);if(!o)return;let l=[];if(t==="clear")l=[...o.values()];else if(n==="length"&&V(e)){const c=Number(s);o.forEach((a,u)=>{(u==="length"||!Ye(u)&&u>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(o.get(n)),t){case"add":V(e)?Pi(n)&&l.push(o.get("length")):(l.push(o.get(Ut)),dn(e)&&l.push(o.get(Hi)));break;case"delete":V(e)||(l.push(o.get(Ut)),dn(e)&&l.push(o.get(Hi)));break;case"set":dn(e)&&l.push(o.get(Ut));break}Di();for(const c of l)c&&Po(c,4);Vi()}function Uf(e,t){var n;return(n=Es.get(e))==null?void 0:n.get(t)}const Kf=$e("__proto__,__v_isRef,__isVue"),Fo=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ye)),$o=jf();function jf(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=Z(this);for(let r=0,o=this.length;r{e[t]=function(...n){vt(),Di();const s=Z(this)[t].apply(this,n);return Vi(),Et(),s}}),e}function qf(e){const t=Z(this);return Re(t,"has",e),t.hasOwnProperty(e)}class Do{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){const i=this._isReadonly,r=this._isShallow;if(n==="__v_isReactive")return!i;if(n==="__v_isReadonly")return i;if(n==="__v_isShallow")return r;if(n==="__v_raw")return s===(i?r?zo:Go:r?Wo:qo).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=V(t);if(!i){if(o&&se($o,n))return Reflect.get($o,n,s);if(n==="hasOwnProperty")return qf}const l=Reflect.get(t,n,s);return(Ye(n)?Fo.has(n):Kf(n))||(i||Re(t,"get",n),r)?l:Se(l)?o&&Pi(n)?l:l.value:oe(l)?i?Ki(l):Os(l):l}}class Vo extends Do{constructor(t=!1){super(!1,t)}set(t,n,s,i){let r=t[n];if(!this._isShallow){const c=jt(r);if(!Fn(s)&&!jt(s)&&(r=Z(r),s=Z(s)),!V(t)&&Se(r)&&!Se(s))return c?!1:(r.value=s,!0)}const o=V(t)&&Pi(n)?Number(n)e,Cs=e=>Reflect.getPrototypeOf(e);function Ts(e,t,n=!1,s=!1){e=e.__v_raw;const i=Z(e),r=Z(t);n||(Xe(t,r)&&Re(i,"get",t),Re(i,"get",r));const{has:o}=Cs(i),l=s?Ui:n?Wi:$n;if(o.call(i,t))return l(e.get(t));if(o.call(i,r))return l(e.get(r));e!==i&&e.get(t)}function As(e,t=!1){const n=this.__v_raw,s=Z(n),i=Z(e);return t||(Xe(e,i)&&Re(s,"has",e),Re(s,"has",i)),e===i?n.has(e):n.has(e)||n.has(i)}function ws(e,t=!1){return e=e.__v_raw,!t&&Re(Z(e),"iterate",Ut),Reflect.get(e,"size",e)}function Ho(e){e=Z(e);const t=Z(this);return Cs(t).has.call(t,e)||(t.add(e),at(t,"add",e,e)),this}function Uo(e,t){t=Z(t);const n=Z(this),{has:s,get:i}=Cs(n);let r=s.call(n,e);r||(e=Z(e),r=s.call(n,e));const o=i.call(n,e);return n.set(e,t),r?Xe(t,o)&&at(n,"set",e,t):at(n,"add",e,t),this}function Ko(e){const t=Z(this),{has:n,get:s}=Cs(t);let i=n.call(t,e);i||(e=Z(e),i=n.call(t,e)),s&&s.call(t,e);const r=t.delete(e);return i&&at(t,"delete",e,void 0),r}function jo(){const e=Z(this),t=e.size!==0,n=e.clear();return t&&at(e,"clear",void 0,void 0),n}function Ns(e,t){return function(s,i){const r=this,o=r.__v_raw,l=Z(o),c=t?Ui:e?Wi:$n;return!e&&Re(l,"iterate",Ut),o.forEach((a,u)=>s.call(i,c(a),c(u),r))}}function Is(e,t,n){return function(...s){const i=this.__v_raw,r=Z(i),o=dn(r),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,a=i[e](...s),u=n?Ui:t?Wi:$n;return!t&&Re(r,"iterate",c?Hi:Ut),{next(){const{value:f,done:d}=a.next();return d?{value:f,done:d}:{value:l?[u(f[0]),u(f[1])]:u(f),done:d}},[Symbol.iterator](){return this}}}}function Ct(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Yf(){const e={get(r){return Ts(this,r)},get size(){return ws(this)},has:As,add:Ho,set:Uo,delete:Ko,clear:jo,forEach:Ns(!1,!1)},t={get(r){return Ts(this,r,!1,!0)},get size(){return ws(this)},has:As,add:Ho,set:Uo,delete:Ko,clear:jo,forEach:Ns(!1,!0)},n={get(r){return Ts(this,r,!0)},get size(){return ws(this,!0)},has(r){return As.call(this,r,!0)},add:Ct("add"),set:Ct("set"),delete:Ct("delete"),clear:Ct("clear"),forEach:Ns(!0,!1)},s={get(r){return Ts(this,r,!0,!0)},get size(){return ws(this,!0)},has(r){return As.call(this,r,!0)},add:Ct("add"),set:Ct("set"),delete:Ct("delete"),clear:Ct("clear"),forEach:Ns(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(r=>{e[r]=Is(r,!1,!1),n[r]=Is(r,!0,!1),t[r]=Is(r,!1,!0),s[r]=Is(r,!0,!0)}),[e,n,t,s]}const[Xf,Zf,Qf,eu]=Yf();function xs(e,t){const n=t?e?eu:Qf:e?Zf:Xf;return(s,i,r)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?s:Reflect.get(se(n,i)&&i in s?n:s,i,r)}const tu={get:xs(!1,!1)},nu={get:xs(!1,!0)},su={get:xs(!0,!1)},iu={get:xs(!0,!0)},qo=new WeakMap,Wo=new WeakMap,Go=new WeakMap,zo=new WeakMap;function ru(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ou(e){return e.__v_skip||!Object.isExtensible(e)?0:ru(yf(e))}function Os(e){return jt(e)?e:ks(e,!1,Wf,tu,qo)}function Jo(e){return ks(e,!1,zf,nu,Wo)}function Ki(e){return ks(e,!0,Gf,su,Go)}function lu(e){return ks(e,!0,Jf,iu,zo)}function ks(e,t,n,s,i){if(!oe(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const r=i.get(e);if(r)return r;const o=ou(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return i.set(e,l),l}function Kt(e){return jt(e)?Kt(e.__v_raw):!!(e&&e.__v_isReactive)}function jt(e){return!!(e&&e.__v_isReadonly)}function Fn(e){return!!(e&&e.__v_isShallow)}function ji(e){return Kt(e)||jt(e)}function Z(e){const t=e&&e.__v_raw;return t?Z(t):e}function qi(e){return Object.isExtensible(e)&&bs(e,"__v_skip",!0),e}const $n=e=>oe(e)?Os(e):e,Wi=e=>oe(e)?Ki(e):e;class Yo{constructor(t,n,s,i){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new yn(()=>t(this._value),()=>_n(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!i,this.__v_isReadonly=s}get value(){const t=Z(this);return(!t._cacheable||t.effect.dirty)&&Xe(t._value,t._value=t.effect.run())&&_n(t,4),Gi(t),t.effect._dirtyLevel>=2&&_n(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function cu(e,t,n=!1){let s,i;const r=W(e);return r?(s=e,i=ge):(s=e.get,i=e.set),new Yo(s,i,r||!i,n)}function Gi(e){var t;St&&Ht&&(e=Z(e),Mo(Ht,(t=e.dep)!=null?t:e.dep=Lo(()=>e.dep=void 0,e instanceof Yo?e:void 0)))}function _n(e,t=4,n){e=Z(e);const s=e.dep;s&&Po(s,t)}function Se(e){return!!(e&&e.__v_isRef===!0)}function Dn(e){return Xo(e,!1)}function au(e){return Xo(e,!0)}function Xo(e,t){return Se(e)?e:new fu(e,t)}class fu{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Z(t),this._value=n?t:$n(t)}get value(){return Gi(this),this._value}set value(t){const n=this.__v_isShallow||Fn(t)||jt(t);t=n?t:Z(t),Xe(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:$n(t),_n(this,4))}}function uu(e){_n(e,4)}function zi(e){return Se(e)?e.value:e}function hu(e){return W(e)?e():zi(e)}const du={get:(e,t,n)=>zi(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const i=e[t];return Se(i)&&!Se(n)?(i.value=n,!0):Reflect.set(e,t,n,s)}};function Ji(e){return Kt(e)?e:new Proxy(e,du)}class pu{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:s}=t(()=>Gi(this),()=>_n(this));this._get=n,this._set=s}get value(){return this._get()}set value(t){this._set(t)}}function Zo(e){return new pu(e)}function mu(e){const t=V(e)?new Array(e.length):{};for(const n in e)t[n]=Qo(e,n);return t}class gu{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Uf(Z(this._object),this._key)}}class yu{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function _u(e,t,n){return Se(e)?e:W(e)?new yu(e):oe(e)&&arguments.length>1?Qo(e,t,n):Dn(e)}function Qo(e,t,n){const s=e[t];return Se(s)?s:new gu(e,t,n)}const bu={GET:"get",HAS:"has",ITERATE:"iterate"},Su={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"};/** +* @vue/runtime-core v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const Vn=[];function vg(e,...t){vt();const n=Vn.length?Vn[Vn.length-1].component:null,s=n&&n.appContext.config.warnHandler,i=vu();if(s)st(s,n,11,[e+t.map(r=>{var o,l;return(l=(o=r.toString)==null?void 0:o.call(r))!=null?l:JSON.stringify(r)}).join(""),n&&n.proxy,i.map(({vnode:r})=>`at <${hc(n,r.type)}>`).join(` +`),i]);else{const r=[`[Vue warn]: ${e}`,...t];i.length&&r.push(` +`,...Eu(i)),console.warn(...r)}Et()}function vu(){let e=Vn[Vn.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const s=e.component&&e.component.parent;e=s&&s.vnode}return t}function Eu(e){const t=[];return e.forEach((n,s)=>{t.push(...s===0?[]:[` +`],...Cu(n))}),t}function Cu({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",s=e.component?e.component.parent==null:!1,i=` at <${hc(e.component,e.type,s)}`,r=">"+n;return e.props?[i,...Tu(e.props),r]:[i+r]}function Tu(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach(s=>{t.push(...el(s,e[s]))}),n.length>3&&t.push(" ..."),t}function el(e,t,n){return J(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):typeof t=="number"||typeof t=="boolean"||t==null?n?t:[`${e}=${t}`]:Se(t)?(t=el(e,Z(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):W(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=Z(t),n?t:[`${e}=`,t])}function Au(e,t){}const wu={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",WATCH_GETTER:2,2:"WATCH_GETTER",WATCH_CALLBACK:3,3:"WATCH_CALLBACK",WATCH_CLEANUP:4,4:"WATCH_CLEANUP",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER"},Nu={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush. This is likely a Vue internals bug. Please open an issue at https://github.com/vuejs/core ."};function st(e,t,n,s){try{return s?e(...s):e()}catch(i){qt(i,t,n)}}function Be(e,t,n,s){if(W(e)){const r=st(e,t,n,s);return r&&Mi(r)&&r.catch(o=>{qt(o,t,n)}),r}const i=[];for(let r=0;r>>1,i=Ae[s],r=Hn(i);rit&&Ae.splice(t,1)}function Ps(e){V(e)?bn.push(...e):(!Tt||!Tt.includes(e,e.allowRecurse?Wt+1:Wt))&&bn.push(e),nl()}function sl(e,t,n=Bn?it+1:0){for(;nHn(n)-Hn(s));if(bn.length=0,Tt){Tt.push(...t);return}for(Tt=t,Wt=0;Wte.id==null?1/0:e.id,ku=(e,t)=>{const n=Hn(e)-Hn(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function il(e){Yi=!1,Bn=!0,Ae.sort(ku);try{for(it=0;itSn.emit(i,...r)),Fs=[]):typeof window<"u"&&window.HTMLElement&&!((s=(n=window.navigator)==null?void 0:n.userAgent)!=null&&s.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(r=>{rl(r,t)}),setTimeout(()=>{Sn||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,Fs=[])},3e3)):Fs=[]}function Ru(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||ie;let i=n;const r=t.startsWith("update:"),o=r&&t.slice(7);if(o&&o in s){const u=`${o==="modelValue"?"model":o}Modifiers`,{number:f,trim:d}=s[u]||ie;d&&(i=n.map(g=>J(g)?g.trim():g)),f&&(i=n.map(Pn))}let l,c=s[l=mn(t)]||s[l=mn(ue(t))];!c&&r&&(c=s[l=mn(De(t))]),c&&Be(c,e,6,i);const a=s[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Be(a,e,6,i)}}function ol(e,t,n=!1){const s=t.emitsCache,i=s.get(e);if(i!==void 0)return i;const r=e.emits;let o={},l=!1;if(!W(e)){const c=a=>{const u=ol(a,t,!0);u&&(l=!0,ne(o,u))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!r&&!l?(oe(e)&&s.set(e,null),null):(V(r)?r.forEach(c=>o[c]=null):ne(o,r),oe(e)&&s.set(e,o),o)}function $s(e,t){return!e||!Dt(t)?!1:(t=t.slice(2).replace(/Once$/,""),se(e,t[0].toLowerCase()+t.slice(1))||se(e,De(t))||se(e,t))}let me=null,Ds=null;function Un(e){const t=me;return me=e,Ds=e&&e.type.__scopeId||null,t}function Mu(e){Ds=e}function Pu(){Ds=null}const Lu=e=>Zi;function Zi(e,t=me,n){if(!t||e._n)return e;const s=(...i)=>{s._d&&Cr(-1);const r=Un(t);let o;try{o=e(...i)}finally{Un(r),s._d&&Cr(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function Eg(){}function Vs(e){const{type:t,vnode:n,proxy:s,withProxy:i,props:r,propsOptions:[o],slots:l,attrs:c,emit:a,render:u,renderCache:f,data:d,setupState:g,ctx:_,inheritAttrs:x}=e;let M,P;const A=Un(e);try{if(n.shapeFlag&4){const y=i||s,S=y;M=He(u.call(S,y,f,r,g,d,_)),P=c}else{const y=t;M=He(y.length>1?y(r,{attrs:c,slots:l,emit:a}):y(r,null)),P=t.props?c:$u(c)}}catch(y){es.length=0,qt(y,e,1),M=ce(we)}let m=M;if(P&&x!==!1){const y=Object.keys(P),{shapeFlag:S}=m;y.length&&S&7&&(o&&y.some(ki)&&(P=Du(P,o)),m=ot(m,P))}return n.dirs&&(m=ot(m),m.dirs=m.dirs?m.dirs.concat(n.dirs):n.dirs),n.transition&&(m.transition=n.transition),M=m,Un(A),M}function Fu(e,t=!0){let n;for(let s=0;s{let t;for(const n in e)(n==="class"||n==="style"||Dt(n))&&((t||(t={}))[n]=e[n]);return t},Du=(e,t)=>{const n={};for(const s in e)(!ki(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Vu(e,t,n){const{props:s,children:i,component:r}=e,{props:o,children:l,patchFlag:c}=t,a=r.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?ll(s,o,a):!!o;if(c&8){const u=t.dynamicProps;for(let f=0;fe.__isSuspense;let sr=0;const Ku={name:"Suspense",__isSuspense:!0,process(e,t,n,s,i,r,o,l,c,a){if(e==null)ju(t,n,s,i,r,o,l,c,a);else{if(r&&r.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}qu(e,t,n,s,i,o,l,c,a)}},hydrate:Wu,create:ir,normalize:Gu};function Kn(e,t){const n=e.props&&e.props[t];W(n)&&n()}function ju(e,t,n,s,i,r,o,l,c){const{p:a,o:{createElement:u}}=c,f=u("div"),d=e.suspense=ir(e,i,s,t,f,n,r,o,l,c);a(null,d.pendingBranch=e.ssContent,f,null,s,d,r,o),d.deps>0?(Kn(e,"onPending"),Kn(e,"onFallback"),a(null,e.ssFallback,t,n,s,null,r,o),vn(d,e.ssFallback)):d.resolve(!1,!0)}function qu(e,t,n,s,i,r,o,l,{p:c,um:a,o:{createElement:u}}){const f=t.suspense=e.suspense;f.vnode=t,t.el=e.el;const d=t.ssContent,g=t.ssFallback,{activeBranch:_,pendingBranch:x,isInFallback:M,isHydrating:P}=f;if(x)f.pendingBranch=d,Qe(d,x)?(c(x,d,f.hiddenContainer,null,i,f,r,o,l),f.deps<=0?f.resolve():M&&(P||(c(_,g,n,s,i,null,r,o,l),vn(f,g)))):(f.pendingId=sr++,P?(f.isHydrating=!1,f.activeBranch=x):a(x,i,f),f.deps=0,f.effects.length=0,f.hiddenContainer=u("div"),M?(c(null,d,f.hiddenContainer,null,i,f,r,o,l),f.deps<=0?f.resolve():(c(_,g,n,s,i,null,r,o,l),vn(f,g))):_&&Qe(d,_)?(c(_,d,n,s,i,f,r,o,l),f.resolve(!0)):(c(null,d,f.hiddenContainer,null,i,f,r,o,l),f.deps<=0&&f.resolve()));else if(_&&Qe(d,_))c(_,d,n,s,i,f,r,o,l),vn(f,d);else if(Kn(t,"onPending"),f.pendingBranch=d,d.shapeFlag&512?f.pendingId=d.component.suspenseId:f.pendingId=sr++,c(null,d,f.hiddenContainer,null,i,f,r,o,l),f.deps<=0)f.resolve();else{const{timeout:A,pendingId:m}=f;A>0?setTimeout(()=>{f.pendingId===m&&f.fallback(g)},A):A===0&&f.fallback(g)}}function ir(e,t,n,s,i,r,o,l,c,a,u=!1){const{p:f,m:d,um:g,n:_,o:{parentNode:x,remove:M}}=a;let P;const A=zu(e);A&&t!=null&&t.pendingBranch&&(P=t.pendingId,t.deps++);const m=e.props?Ss(e.props.timeout):void 0,y=r,S={vnode:e,parent:t,parentComponent:n,namespace:o,container:s,hiddenContainer:i,deps:0,pendingId:sr++,timeout:typeof m=="number"?m:-1,activeBranch:null,pendingBranch:null,isInFallback:!u,isHydrating:u,isUnmounted:!1,effects:[],resolve(C=!1,F=!1){const{vnode:b,activeBranch:E,pendingBranch:T,pendingId:k,effects:w,parentComponent:B,container:G}=S;let Q=!1;S.isHydrating?S.isHydrating=!1:C||(Q=E&&T.transition&&T.transition.mode==="out-in",Q&&(E.transition.afterLeave=()=>{k===S.pendingId&&(d(T,G,r===y?_(E):r,0),Ps(w))}),E&&(x(E.el)!==S.hiddenContainer&&(r=_(E)),g(E,B,S,!0)),Q||d(T,G,r,0)),vn(S,T),S.pendingBranch=null,S.isInFallback=!1;let H=S.parent,Y=!1;for(;H;){if(H.pendingBranch){H.effects.push(...w),Y=!0;break}H=H.parent}!Y&&!Q&&Ps(w),S.effects=[],A&&t&&t.pendingBranch&&P===t.pendingId&&(t.deps--,t.deps===0&&!F&&t.resolve()),Kn(b,"onResolve")},fallback(C){if(!S.pendingBranch)return;const{vnode:F,activeBranch:b,parentComponent:E,container:T,namespace:k}=S;Kn(F,"onFallback");const w=_(b),B=()=>{S.isInFallback&&(f(null,C,T,w,E,null,k,l,c),vn(S,C))},G=C.transition&&C.transition.mode==="out-in";G&&(b.transition.afterLeave=B),S.isInFallback=!0,g(b,E,null,!0),G||B()},move(C,F,b){S.activeBranch&&d(S.activeBranch,C,F,b),S.container=C},next(){return S.activeBranch&&_(S.activeBranch)},registerDep(C,F){const b=!!S.pendingBranch;b&&S.deps++;const E=C.vnode.el;C.asyncDep.catch(T=>{qt(T,C,0)}).then(T=>{if(C.isUnmounted||S.isUnmounted||S.pendingId!==C.suspenseId)return;C.asyncResolved=!0;const{vnode:k}=C;xr(C,T,!1),E&&(k.el=E);const w=!E&&C.subTree.el;F(C,k,x(E||C.subTree.el),E?null:_(C.subTree),S,o,c),w&&M(w),Qi(C,k.el),b&&--S.deps===0&&S.resolve()})},unmount(C,F){S.isUnmounted=!0,S.activeBranch&&g(S.activeBranch,n,C,F),S.pendingBranch&&g(S.pendingBranch,n,C,F)}};return S}function Wu(e,t,n,s,i,r,o,l,c){const a=t.suspense=ir(t,s,n,e.parentNode,document.createElement("div"),null,i,r,o,l,!0),u=c(e,a.pendingBranch=t.ssContent,n,a,r,o);return a.deps===0&&a.resolve(!1,!0),u}function Gu(e){const{shapeFlag:t,children:n}=e,s=t&32;e.ssContent=ul(s?n.default:n),e.ssFallback=s?ul(n.fallback):ce(we)}function ul(e){let t;if(W(e)){const n=Qt&&e._c;n&&(e._d=!1,Ze()),e=e(),n&&(e._d=!0,t=Me,tc())}return V(e)&&(e=Fu(e)),e=He(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function hl(e,t){t&&t.pendingBranch?V(e)?t.effects.push(...e):t.effects.push(e):Ps(e)}function vn(e,t){e.activeBranch=t;const{vnode:n,parentComponent:s}=e;let i=t.el;for(;!i&&t.component;)t=t.component.subTree,i=t.el;n.el=i,s&&s.subTree===n&&(s.vnode.el=i,Qi(s,i))}function zu(e){var t;return((t=e.props)==null?void 0:t.suspensible)!=null&&e.props.suspensible!==!1}const dl=Symbol.for("v-scx"),pl=()=>Zn(dl);function Ju(e,t){return qn(e,null,t)}function ml(e,t){return qn(e,null,{flush:"post"})}function gl(e,t){return qn(e,null,{flush:"sync"})}const Bs={};function jn(e,t,n){return qn(e,t,n)}function qn(e,t,{immediate:n,deep:s,flush:i,once:r,onTrack:o,onTrigger:l}=ie){if(t&&r){const C=t;t=(...F)=>{C(...F),S()}}const c=ye,a=C=>s===!0?C:Gt(C,s===!1?1:void 0);let u,f=!1,d=!1;if(Se(e)?(u=()=>e.value,f=Fn(e)):Kt(e)?(u=()=>a(e),f=!0):V(e)?(d=!0,f=e.some(C=>Kt(C)||Fn(C)),u=()=>e.map(C=>{if(Se(C))return C.value;if(Kt(C))return a(C);if(W(C))return st(C,c,2)})):W(e)?t?u=()=>st(e,c,2):u=()=>(g&&g(),Be(e,c,3,[_])):u=ge,t&&s){const C=u;u=()=>Gt(C())}let g,_=C=>{g=m.onStop=()=>{st(C,c,4),g=m.onStop=void 0}},x;if(ts)if(_=ge,t?n&&Be(t,c,3,[u(),d?[]:void 0,_]):u(),i==="sync"){const C=pl();x=C.__watcherHandles||(C.__watcherHandles=[])}else return ge;let M=d?new Array(e.length).fill(Bs):Bs;const P=()=>{if(!(!m.active||!m.dirty))if(t){const C=m.run();(s||f||(d?C.some((F,b)=>Xe(F,M[b])):Xe(C,M)))&&(g&&g(),Be(t,c,3,[C,M===Bs?void 0:d&&M[0]===Bs?[]:M,_]),M=C)}else m.run()};P.allowRecurse=!!t;let A;i==="sync"?A=P:i==="post"?A=()=>Ee(P,c&&c.suspense):(P.pre=!0,c&&(P.id=c.uid),A=()=>Ms(P));const m=new yn(u,ge,A),y=Io(),S=()=>{m.stop(),y&&Ri(y.effects,m)};return t?n?P():M=m.run():i==="post"?Ee(m.run.bind(m),c&&c.suspense):m.run(),x&&x.push(S),S}function Yu(e,t,n){const s=this.proxy,i=J(e)?e.includes(".")?yl(s,e):()=>s[e]:e.bind(s,s);let r;W(t)?r=t:(r=t.handler,n=t);const o=en(this),l=qn(i,r.bind(s),n);return o(),l}function yl(e,t){const n=t.split(".");return()=>{let s=e;for(let i=0;i0){if(n>=t)return e;n++}if(s=s||new Set,s.has(e))return e;if(s.add(e),Se(e))Gt(e.value,t,n,s);else if(V(e))for(let i=0;i{Gt(i,t,n,s)});else if(vo(e))for(const i in e)Gt(e[i],t,n,s);return e}function Xu(e,t){if(me===null)return e;const n=ni(me)||me.proxy,s=e.dirs||(e.dirs=[]);for(let i=0;i{e.isMounted=!0}),qs(()=>{e.isUnmounting=!0}),e}const We=[Function,Array],or={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:We,onEnter:We,onAfterEnter:We,onEnterCancelled:We,onBeforeLeave:We,onLeave:We,onAfterLeave:We,onLeaveCancelled:We,onBeforeAppear:We,onAppear:We,onAfterAppear:We,onAppearCancelled:We},_l={name:"BaseTransition",props:or,setup(e,{slots:t}){const n=ut(),s=rr();return()=>{const i=t.default&&Us(t.default(),!0);if(!i||!i.length)return;let r=i[0];if(i.length>1){for(const d of i)if(d.type!==we){r=d;break}}const o=Z(e),{mode:l}=o;if(s.isLeaving)return lr(r);const c=Sl(r);if(!c)return lr(r);const a=En(c,o,s,n);zt(c,a);const u=n.subTree,f=u&&Sl(u);if(f&&f.type!==we&&!Qe(c,f)){const d=En(f,o,s,n);if(zt(f,d),l==="out-in")return s.isLeaving=!0,d.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},lr(r);l==="in-out"&&c.type!==we&&(d.delayLeave=(g,_,x)=>{const M=bl(s,f);M[String(f.key)]=f,g[At]=()=>{_(),g[At]=void 0,delete a.delayedLeave},a.delayedLeave=x})}return r}}};function bl(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function En(e,t,n,s){const{appear:i,mode:r,persisted:o=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:u,onBeforeLeave:f,onLeave:d,onAfterLeave:g,onLeaveCancelled:_,onBeforeAppear:x,onAppear:M,onAfterAppear:P,onAppearCancelled:A}=t,m=String(e.key),y=bl(n,e),S=(b,E)=>{b&&Be(b,s,9,E)},C=(b,E)=>{const T=E[1];S(b,E),V(b)?b.every(k=>k.length<=1)&&T():b.length<=1&&T()},F={mode:r,persisted:o,beforeEnter(b){let E=l;if(!n.isMounted)if(i)E=x||l;else return;b[At]&&b[At](!0);const T=y[m];T&&Qe(e,T)&&T.el[At]&&T.el[At](),S(E,[b])},enter(b){let E=c,T=a,k=u;if(!n.isMounted)if(i)E=M||c,T=P||a,k=A||u;else return;let w=!1;const B=b[Hs]=G=>{w||(w=!0,G?S(k,[b]):S(T,[b]),F.delayedLeave&&F.delayedLeave(),b[Hs]=void 0)};E?C(E,[b,B]):B()},leave(b,E){const T=String(e.key);if(b[Hs]&&b[Hs](!0),n.isUnmounting)return E();S(f,[b]);let k=!1;const w=b[At]=B=>{k||(k=!0,E(),B?S(_,[b]):S(g,[b]),b[At]=void 0,y[T]===e&&delete y[T])};y[T]=e,d?C(d,[b,w]):w()},clone(b){return En(b,t,n,s)}};return F}function lr(e){if(Wn(e))return e=ot(e),e.children=null,e}function Sl(e){return Wn(e)?e.children?e.children[0]:void 0:e}function zt(e,t){e.shapeFlag&6&&e.component?zt(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Us(e,t=!1,n){let s=[],i=0;for(let r=0;r1)for(let r=0;r!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Zu(e){W(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:i=200,timeout:r,suspensible:o=!0,onError:l}=e;let c=null,a,u=0;const f=()=>(u++,c=null,d()),d=()=>{let g;return c||(g=c=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),l)return new Promise((x,M)=>{l(_,()=>x(f()),()=>M(_),u+1)});throw _}).then(_=>g!==c&&c?c:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),a=_,_)))};return cr({name:"AsyncComponentWrapper",__asyncLoader:d,get __asyncResolved(){return a},setup(){const g=ye;if(a)return()=>ar(a,g);const _=A=>{c=null,qt(A,g,13,!s)};if(o&&g.suspense||ts)return d().then(A=>()=>ar(A,g)).catch(A=>(_(A),()=>s?ce(s,{error:A}):null));const x=Dn(!1),M=Dn(),P=Dn(!!i);return i&&setTimeout(()=>{P.value=!1},i),r!=null&&setTimeout(()=>{if(!x.value&&!M.value){const A=new Error(`Async component timed out after ${r}ms.`);_(A),M.value=A}},r),d().then(()=>{x.value=!0,g.parent&&Wn(g.parent.vnode)&&(g.parent.effect.dirty=!0,Ms(g.parent.update))}).catch(A=>{_(A),M.value=A}),()=>{if(x.value&&a)return ar(a,g);if(M.value&&s)return ce(s,{error:M.value});if(n&&!P.value)return ce(n)}}})}function ar(e,t){const{ref:n,props:s,children:i,ce:r}=t.vnode,o=ce(e,s,i);return o.ref=n,o.ce=r,delete t.vnode.ce,o}const Wn=e=>e.type.__isKeepAlive,Qu={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=ut(),s=n.ctx;if(!s.renderer)return()=>{const A=t.default&&t.default();return A&&A.length===1?A[0]:A};const i=new Map,r=new Set;let o=null;const l=n.suspense,{renderer:{p:c,m:a,um:u,o:{createElement:f}}}=s,d=f("div");s.activate=(A,m,y,S,C)=>{const F=A.component;a(A,m,y,0,l),c(F.vnode,A,m,y,F,l,S,A.slotScopeIds,C),Ee(()=>{F.isDeactivated=!1,F.a&&gn(F.a);const b=A.props&&A.props.onVnodeMounted;b&&Pe(b,F.parent,A)},l)},s.deactivate=A=>{const m=A.component;a(A,d,null,1,l),Ee(()=>{m.da&&gn(m.da);const y=A.props&&A.props.onVnodeUnmounted;y&&Pe(y,m.parent,A),m.isDeactivated=!0},l)};function g(A){fr(A),u(A,n,l,!0)}function _(A){i.forEach((m,y)=>{const S=si(m.type);S&&(!A||!A(S))&&x(y)})}function x(A){const m=i.get(A);!o||!Qe(m,o)?g(m):o&&fr(o),i.delete(A),r.delete(A)}jn(()=>[e.include,e.exclude],([A,m])=>{A&&_(y=>Gn(A,y)),m&&_(y=>!Gn(m,y))},{flush:"post",deep:!0});let M=null;const P=()=>{M!=null&&i.set(M,ur(n.subTree))};return zn(P),js(P),qs(()=>{i.forEach(A=>{const{subTree:m,suspense:y}=n,S=ur(m);if(A.type===S.type&&A.key===S.key){fr(S);const C=S.component.da;C&&Ee(C,y);return}g(A)})}),()=>{if(M=null,!t.default)return null;const A=t.default(),m=A[0];if(A.length>1)return o=null,A;if(!It(m)||!(m.shapeFlag&4)&&!(m.shapeFlag&128))return o=null,m;let y=ur(m);const S=y.type,C=si(Jt(y)?y.type.__asyncResolved||{}:S),{include:F,exclude:b,max:E}=e;if(F&&(!C||!Gn(F,C))||b&&C&&Gn(b,C))return o=y,m;const T=y.key==null?S:y.key,k=i.get(T);return y.el&&(y=ot(y),m.shapeFlag&128&&(m.ssContent=y)),M=T,k?(y.el=k.el,y.component=k.component,y.transition&&zt(y,y.transition),y.shapeFlag|=512,r.delete(T),r.add(T)):(r.add(T),E&&r.size>parseInt(E,10)&&x(r.values().next().value)),y.shapeFlag|=256,o=y,fl(m.type)?m:y}}};function Gn(e,t){return V(e)?e.some(n=>Gn(n,t)):J(e)?e.split(",").includes(t):gf(e)?e.test(t):!1}function vl(e,t){Cl(e,"a",t)}function El(e,t){Cl(e,"da",t)}function Cl(e,t,n=ye){const s=e.__wdc||(e.__wdc=()=>{let i=n;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(Ks(t,s,n),n){let i=n.parent;for(;i&&i.parent;)Wn(i.parent.vnode)&&eh(s,t,n,i),i=i.parent}}function eh(e,t,n,s){const i=Ks(t,e,s,!0);Ws(()=>{Ri(s[t],i)},n)}function fr(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function ur(e){return e.shapeFlag&128?e.ssContent:e}function Ks(e,t,n=ye,s=!1){if(n){const i=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;vt();const l=en(n),c=Be(t,n,e,o);return l(),Et(),c});return s?i.unshift(r):i.push(r),r}}const ft=e=>(t,n=ye)=>(!ts||e==="sp")&&Ks(e,(...s)=>t(...s),n),Tl=ft("bm"),zn=ft("m"),Al=ft("bu"),js=ft("u"),qs=ft("bum"),Ws=ft("um"),wl=ft("sp"),Nl=ft("rtg"),Il=ft("rtc");function xl(e,t=ye){Ks("ec",e,t)}function th(e,t,n,s){let i;const r=n&&n[s];if(V(e)||J(e)){i=new Array(e.length);for(let o=0,l=e.length;ot(o,l,void 0,r&&r[l]));else{const o=Object.keys(e);i=new Array(o.length);for(let l=0,c=o.length;l{const r=s.fn(...i);return r&&(r.key=s.key),r}:s.fn)}return e}function Cn(e,t,n={},s,i){if(me.isCE||me.parent&&Jt(me.parent)&&me.parent.isCE)return t!=="default"&&(n.name=t),ce("slot",n,s&&s());let r=e[t];r&&r._c&&(r._d=!1),Ze();const o=r&&Ol(r(n)),l=Tr(Ce,{key:n.key||o&&o.key||`_${t}`},o||(s?s():[]),o&&e._===1?64:-2);return!i&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),r&&r._c&&(r._d=!0),l}function Ol(e){return e.some(t=>It(t)?!(t.type===we||t.type===Ce&&!Ol(t.children)):!0)?e:null}function sh(e,t){const n={};for(const s in e)n[t&&/[A-Z]/.test(s)?`on:${s}`:mn(s)]=e[s];return n}const hr=e=>e?lc(e)?ni(e)||e.proxy:hr(e.parent):null,Jn=ne(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>hr(e.parent),$root:e=>hr(e.root),$emit:e=>e.emit,$options:e=>gr(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,Ms(e.update)}),$nextTick:e=>e.n||(e.n=Rs.bind(e.proxy)),$watch:e=>Yu.bind(e)}),dr=(e,t)=>e!==ie&&!e.__isScriptSetup&&se(e,t),pr={get({_:e},t){const{ctx:n,setupState:s,data:i,props:r,accessCache:o,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const g=o[t];if(g!==void 0)switch(g){case 1:return s[t];case 2:return i[t];case 4:return n[t];case 3:return r[t]}else{if(dr(s,t))return o[t]=1,s[t];if(i!==ie&&se(i,t))return o[t]=2,i[t];if((a=e.propsOptions[0])&&se(a,t))return o[t]=3,r[t];if(n!==ie&&se(n,t))return o[t]=4,n[t];mr&&(o[t]=0)}}const u=Jn[t];let f,d;if(u)return t==="$attrs"&&Re(e,"get",t),u(e);if((f=l.__cssModules)&&(f=f[t]))return f;if(n!==ie&&se(n,t))return o[t]=4,n[t];if(d=c.config.globalProperties,se(d,t))return d[t]},set({_:e},t,n){const{data:s,setupState:i,ctx:r}=e;return dr(i,t)?(i[t]=n,!0):s!==ie&&se(s,t)?(s[t]=n,!0):se(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:i,propsOptions:r}},o){let l;return!!n[o]||e!==ie&&se(e,o)||dr(t,o)||(l=r[0])&&se(l,o)||se(s,o)||se(Jn,o)||se(i.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:se(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},ih=ne({},pr,{get(e,t){if(t!==Symbol.unscopables)return pr.get(e,t,e)},has(e,t){return t[0]!=="_"&&!vf(t)}});function rh(){return null}function oh(){return null}function lh(e){}function ch(e){}function ah(){return null}function fh(){}function uh(e,t){return null}function hh(){return kl().slots}function dh(){return kl().attrs}function kl(){const e=ut();return e.setupContext||(e.setupContext=uc(e))}function Yn(e){return V(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function ph(e,t){const n=Yn(e);for(const s in t){if(s.startsWith("__skip"))continue;let i=n[s];i?V(i)||W(i)?i=n[s]={type:i,default:t[s]}:i.default=t[s]:i===null&&(i=n[s]={default:t[s]}),i&&t[`__skip_${s}`]&&(i.skipFactory=!0)}return n}function mh(e,t){return!e||!t?e||t:V(e)&&V(t)?e.concat(t):ne({},Yn(e),Yn(t))}function gh(e,t){const n={};for(const s in e)t.includes(s)||Object.defineProperty(n,s,{enumerable:!0,get:()=>e[s]});return n}function yh(e){const t=ut();let n=e();return Ir(),Mi(n)&&(n=n.catch(s=>{throw en(t),s})),[n,()=>en(t)]}let mr=!0;function _h(e){const t=gr(e),n=e.proxy,s=e.ctx;mr=!1,t.beforeCreate&&Rl(t.beforeCreate,e,"bc");const{data:i,computed:r,methods:o,watch:l,provide:c,inject:a,created:u,beforeMount:f,mounted:d,beforeUpdate:g,updated:_,activated:x,deactivated:M,beforeDestroy:P,beforeUnmount:A,destroyed:m,unmounted:y,render:S,renderTracked:C,renderTriggered:F,errorCaptured:b,serverPrefetch:E,expose:T,inheritAttrs:k,components:w,directives:B,filters:G}=t;if(a&&bh(a,s,null),o)for(const Y in o){const K=o[Y];W(K)&&(s[Y]=K.bind(n))}if(i){const Y=i.call(n,n);oe(Y)&&(e.data=Os(Y))}if(mr=!0,r)for(const Y in r){const K=r[Y],je=W(K)?K.bind(n,n):W(K.get)?K.get.bind(n,n):ge,$t=!W(K)&&W(K.set)?K.set.bind(n):ge,un=dc({get:je,set:$t});Object.defineProperty(s,Y,{enumerable:!0,configurable:!0,get:()=>un.value,set:lt=>un.value=lt})}if(l)for(const Y in l)Ml(l[Y],s,n,Y);if(c){const Y=W(c)?c.call(n):c;Reflect.ownKeys(Y).forEach(K=>{$l(K,Y[K])})}u&&Rl(u,e,"c");function H(Y,K){V(K)?K.forEach(je=>Y(je.bind(n))):K&&Y(K.bind(n))}if(H(Tl,f),H(zn,d),H(Al,g),H(js,_),H(vl,x),H(El,M),H(xl,b),H(Il,C),H(Nl,F),H(qs,A),H(Ws,y),H(wl,E),V(T))if(T.length){const Y=e.exposed||(e.exposed={});T.forEach(K=>{Object.defineProperty(Y,K,{get:()=>n[K],set:je=>n[K]=je})})}else e.exposed||(e.exposed={});S&&e.render===ge&&(e.render=S),k!=null&&(e.inheritAttrs=k),w&&(e.components=w),B&&(e.directives=B)}function bh(e,t,n=ge){V(e)&&(e=yr(e));for(const s in e){const i=e[s];let r;oe(i)?"default"in i?r=Zn(i.from||s,i.default,!0):r=Zn(i.from||s):r=Zn(i),Se(r)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>r.value,set:o=>r.value=o}):t[s]=r}}function Rl(e,t,n){Be(V(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ml(e,t,n,s){const i=s.includes(".")?yl(n,s):()=>n[s];if(J(e)){const r=t[e];W(r)&&jn(i,r)}else if(W(e))jn(i,e.bind(n));else if(oe(e))if(V(e))e.forEach(r=>Ml(r,t,n,s));else{const r=W(e.handler)?e.handler.bind(n):t[e.handler];W(r)&&jn(i,r,e)}}function gr(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:i,optionsCache:r,config:{optionMergeStrategies:o}}=e.appContext,l=r.get(t);let c;return l?c=l:!i.length&&!n&&!s?c=t:(c={},i.length&&i.forEach(a=>Gs(c,a,o,!0)),Gs(c,t,o)),oe(t)&&r.set(t,c),c}function Gs(e,t,n,s=!1){const{mixins:i,extends:r}=t;r&&Gs(e,r,n,!0),i&&i.forEach(o=>Gs(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Sh[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Sh={data:Pl,props:Ll,emits:Ll,methods:Xn,computed:Xn,beforeCreate:ke,created:ke,beforeMount:ke,mounted:ke,beforeUpdate:ke,updated:ke,beforeDestroy:ke,beforeUnmount:ke,destroyed:ke,unmounted:ke,activated:ke,deactivated:ke,errorCaptured:ke,serverPrefetch:ke,components:Xn,directives:Xn,watch:Eh,provide:Pl,inject:vh};function Pl(e,t){return t?e?function(){return ne(W(e)?e.call(this,this):e,W(t)?t.call(this,this):t)}:t:e}function vh(e,t){return Xn(yr(e),yr(t))}function yr(e){if(V(e)){const t={};for(let n=0;n1)return n&&W(t)?t.call(s&&s.proxy):t}}function Ah(){return!!(ye||me||Tn)}function wh(e,t,n,s=!1){const i={},r={};bs(r,Zs,1),e.propsDefaults=Object.create(null),Dl(e,t,i,r);for(const o in e.propsOptions[0])o in i||(i[o]=void 0);n?e.props=s?i:Jo(i):e.type.props?e.props=i:e.props=r,e.attrs=r}function Nh(e,t,n,s){const{props:i,attrs:r,vnode:{patchFlag:o}}=e,l=Z(i),[c]=e.propsOptions;let a=!1;if((s||o>0)&&!(o&16)){if(o&8){const u=e.vnode.dynamicProps;for(let f=0;f{c=!0;const[d,g]=Vl(f,t,!0);ne(o,d),g&&l.push(...g)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!r&&!c)return oe(e)&&s.set(e,hn),hn;if(V(r))for(let u=0;u-1,g[1]=x<0||_-1||se(g,"default"))&&l.push(f)}}}const a=[o,l];return oe(e)&&s.set(e,a),a}function Bl(e){return e[0]!=="$"&&!yt(e)}function Hl(e){return e===null?"null":typeof e=="function"?e.name||"":typeof e=="object"&&e.constructor&&e.constructor.name||""}function Ul(e,t){return Hl(e)===Hl(t)}function Kl(e,t){return V(t)?t.findIndex(n=>Ul(n,e)):W(t)&&Ul(t,e)?0:-1}const jl=e=>e[0]==="_"||e==="$stable",br=e=>V(e)?e.map(He):[He(e)],Ih=(e,t,n)=>{if(t._n)return t;const s=Zi((...i)=>br(t(...i)),n);return s._c=!1,s},ql=(e,t,n)=>{const s=e._ctx;for(const i in e){if(jl(i))continue;const r=e[i];if(W(r))t[i]=Ih(i,r,s);else if(r!=null){const o=br(r);t[i]=()=>o}}},Wl=(e,t)=>{const n=br(t);e.slots.default=()=>n},xh=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=Z(t),bs(t,"_",n)):ql(t,e.slots={})}else e.slots={},t&&Wl(e,t);bs(e.slots,Zs,1)},Oh=(e,t,n)=>{const{vnode:s,slots:i}=e;let r=!0,o=ie;if(s.shapeFlag&32){const l=t._;l?n&&l===1?r=!1:(ne(i,t),!n&&l===1&&delete i._):(r=!t.$stable,ql(t,i)),o=t}else t&&(Wl(e,t),o={default:1});if(r)for(const l in i)!jl(l)&&o[l]==null&&delete i[l]};function zs(e,t,n,s,i=!1){if(V(e)){e.forEach((d,g)=>zs(d,t&&(V(t)?t[g]:t),n,s,i));return}if(Jt(s)&&!i)return;const r=s.shapeFlag&4?ni(s.component)||s.component.proxy:s.el,o=i?null:r,{i:l,r:c}=e,a=t&&t.r,u=l.refs===ie?l.refs={}:l.refs,f=l.setupState;if(a!=null&&a!==c&&(J(a)?(u[a]=null,se(f,a)&&(f[a]=null)):Se(a)&&(a.value=null)),W(c))st(c,l,12,[o,u]);else{const d=J(c),g=Se(c);if(d||g){const _=()=>{if(e.f){const x=d?se(f,c)?f[c]:u[c]:c.value;i?V(x)&&Ri(x,r):V(x)?x.includes(r)||x.push(r):d?(u[c]=[r],se(f,c)&&(f[c]=u[c])):(c.value=[r],e.k&&(u[e.k]=c.value))}else d?(u[c]=o,se(f,c)&&(f[c]=o)):g&&(c.value=o,e.k&&(u[e.k]=o))};o?(_.id=-1,Ee(_,n)):_()}}}let wt=!1;const kh=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Rh=e=>e.namespaceURI.includes("MathML"),Js=e=>{if(kh(e))return"svg";if(Rh(e))return"mathml"},Ys=e=>e.nodeType===8;function Mh(e){const{mt:t,p:n,o:{patchProp:s,createText:i,nextSibling:r,parentNode:o,remove:l,insert:c,createComment:a}}=e,u=(m,y)=>{if(!y.hasChildNodes()){n(null,m,y),Ls(),y._vnode=m;return}wt=!1,f(y.firstChild,m,null,null,null),Ls(),y._vnode=m,wt&&console.error("Hydration completed but contains mismatches.")},f=(m,y,S,C,F,b=!1)=>{const E=Ys(m)&&m.data==="[",T=()=>x(m,y,S,C,F,E),{type:k,ref:w,shapeFlag:B,patchFlag:G}=y;let Q=m.nodeType;y.el=m,G===-2&&(b=!1,y.dynamicChildren=null);let H=null;switch(k){case Xt:Q!==3?y.children===""?(c(y.el=i(""),o(m),m),H=m):H=T():(m.data!==y.children&&(wt=!0,m.data=y.children),H=r(m));break;case we:A(m)?(H=r(m),P(y.el=m.content.firstChild,m,S)):Q!==8||E?H=T():H=r(m);break;case Zt:if(E&&(m=r(m),Q=m.nodeType),Q===1||Q===3){H=m;const Y=!y.children.length;for(let K=0;K{b=b||!!y.dynamicChildren;const{type:E,props:T,patchFlag:k,shapeFlag:w,dirs:B,transition:G}=y,Q=E==="input"||E==="option";if(Q||k!==-1){B&&rt(y,null,S,"created");let H=!1;if(A(m)){H=Yl(C,G)&&S&&S.vnode.props&&S.vnode.props.appear;const K=m.content.firstChild;H&&G.beforeEnter(K),P(K,m,S),y.el=m=K}if(w&16&&!(T&&(T.innerHTML||T.textContent))){let K=g(m.firstChild,y,m,S,C,F,b);for(;K;){wt=!0;const je=K;K=K.nextSibling,l(je)}}else w&8&&m.textContent!==y.children&&(wt=!0,m.textContent=y.children);if(T)if(Q||!b||k&48)for(const K in T)(Q&&(K.endsWith("value")||K==="indeterminate")||Dt(K)&&!yt(K)||K[0]===".")&&s(m,K,null,T[K],void 0,void 0,S);else T.onClick&&s(m,"onClick",null,T.onClick,void 0,void 0,S);let Y;(Y=T&&T.onVnodeBeforeMount)&&Pe(Y,S,y),B&&rt(y,null,S,"beforeMount"),((Y=T&&T.onVnodeMounted)||B||H)&&hl(()=>{Y&&Pe(Y,S,y),H&&G.enter(m),B&&rt(y,null,S,"mounted")},C)}return m.nextSibling},g=(m,y,S,C,F,b,E)=>{E=E||!!y.dynamicChildren;const T=y.children,k=T.length;for(let w=0;w{const{slotScopeIds:E}=y;E&&(F=F?F.concat(E):E);const T=o(m),k=g(r(m),y,T,S,C,F,b);return k&&Ys(k)&&k.data==="]"?r(y.anchor=k):(wt=!0,c(y.anchor=a("]"),T,k),k)},x=(m,y,S,C,F,b)=>{if(wt=!0,y.el=null,b){const k=M(m);for(;;){const w=r(m);if(w&&w!==k)l(w);else break}}const E=r(m),T=o(m);return l(m),n(null,y,T,E,S,C,Js(T),F),E},M=(m,y="[",S="]")=>{let C=0;for(;m;)if(m=r(m),m&&Ys(m)&&(m.data===y&&C++,m.data===S)){if(C===0)return r(m);C--}return m},P=(m,y,S)=>{const C=y.parentNode;C&&C.replaceChild(m,y);let F=S;for(;F;)F.vnode.el===y&&(F.vnode.el=F.subTree.el=m),F=F.parent},A=m=>m.nodeType===1&&m.tagName.toLowerCase()==="template";return[u,f]}const Ee=hl;function Gl(e){return Jl(e)}function zl(e){return Jl(e,Mh)}function Jl(e,t){const n=Co();n.__VUE__=!0;const{insert:s,remove:i,patchProp:r,createElement:o,createText:l,createComment:c,setText:a,setElementText:u,parentNode:f,nextSibling:d,setScopeId:g=ge,insertStaticContent:_}=e,x=(h,p,v,N=null,I=null,L=null,D=void 0,R=null,$=!!p.dynamicChildren)=>{if(h===p)return;h&&!Qe(h,p)&&(N=Oi(h),lt(h,I,L,!0),h=null),p.patchFlag===-2&&($=!1,p.dynamicChildren=null);const{type:O,ref:U,shapeFlag:q}=p;switch(O){case Xt:M(h,p,v,N);break;case we:P(h,p,v,N);break;case Zt:h==null&&A(p,v,N,D);break;case Ce:w(h,p,v,N,I,L,D,R,$);break;default:q&1?S(h,p,v,N,I,L,D,R,$):q&6?B(h,p,v,N,I,L,D,R,$):(q&64||q&128)&&O.process(h,p,v,N,I,L,D,R,$,Rn)}U!=null&&I&&zs(U,h&&h.ref,L,p||h,!p)},M=(h,p,v,N)=>{if(h==null)s(p.el=l(p.children),v,N);else{const I=p.el=h.el;p.children!==h.children&&a(I,p.children)}},P=(h,p,v,N)=>{h==null?s(p.el=c(p.children||""),v,N):p.el=h.el},A=(h,p,v,N)=>{[h.el,h.anchor]=_(h.children,p,v,N,h.el,h.anchor)},m=({el:h,anchor:p},v,N)=>{let I;for(;h&&h!==p;)I=d(h),s(h,v,N),h=I;s(p,v,N)},y=({el:h,anchor:p})=>{let v;for(;h&&h!==p;)v=d(h),i(h),h=v;i(p)},S=(h,p,v,N,I,L,D,R,$)=>{p.type==="svg"?D="svg":p.type==="math"&&(D="mathml"),h==null?C(p,v,N,I,L,D,R,$):E(h,p,I,L,D,R,$)},C=(h,p,v,N,I,L,D,R)=>{let $,O;const{props:U,shapeFlag:q,transition:j,dirs:z}=h;if($=h.el=o(h.type,L,U&&U.is,U),q&8?u($,h.children):q&16&&b(h.children,$,null,N,I,Sr(h,L),D,R),z&&rt(h,null,N,"created"),F($,h,h.scopeId,D,N),U){for(const le in U)le!=="value"&&!yt(le)&&r($,le,null,U[le],L,h.children,N,I,gt);"value"in U&&r($,"value",null,U.value,L),(O=U.onVnodeBeforeMount)&&Pe(O,N,h)}z&&rt(h,null,N,"beforeMount");const ee=Yl(I,j);ee&&j.beforeEnter($),s($,p,v),((O=U&&U.onVnodeMounted)||ee||z)&&Ee(()=>{O&&Pe(O,N,h),ee&&j.enter($),z&&rt(h,null,N,"mounted")},I)},F=(h,p,v,N,I)=>{if(v&&g(h,v),N)for(let L=0;L{for(let O=$;O{const R=p.el=h.el;let{patchFlag:$,dynamicChildren:O,dirs:U}=p;$|=h.patchFlag&16;const q=h.props||ie,j=p.props||ie;let z;if(v&&Yt(v,!1),(z=j.onVnodeBeforeUpdate)&&Pe(z,v,p,h),U&&rt(p,h,v,"beforeUpdate"),v&&Yt(v,!0),O?T(h.dynamicChildren,O,R,v,N,Sr(p,I),L):D||K(h,p,R,null,v,N,Sr(p,I),L,!1),$>0){if($&16)k(R,p,q,j,v,N,I);else if($&2&&q.class!==j.class&&r(R,"class",null,j.class,I),$&4&&r(R,"style",q.style,j.style,I),$&8){const ee=p.dynamicProps;for(let le=0;le{z&&Pe(z,v,p,h),U&&rt(p,h,v,"updated")},N)},T=(h,p,v,N,I,L,D)=>{for(let R=0;R{if(v!==N){if(v!==ie)for(const R in v)!yt(R)&&!(R in N)&&r(h,R,v[R],null,D,p.children,I,L,gt);for(const R in N){if(yt(R))continue;const $=N[R],O=v[R];$!==O&&R!=="value"&&r(h,R,O,$,D,p.children,I,L,gt)}"value"in N&&r(h,"value",v.value,N.value,D)}},w=(h,p,v,N,I,L,D,R,$)=>{const O=p.el=h?h.el:l(""),U=p.anchor=h?h.anchor:l("");let{patchFlag:q,dynamicChildren:j,slotScopeIds:z}=p;z&&(R=R?R.concat(z):z),h==null?(s(O,v,N),s(U,v,N),b(p.children||[],v,U,I,L,D,R,$)):q>0&&q&64&&j&&h.dynamicChildren?(T(h.dynamicChildren,j,v,I,L,D,R),(p.key!=null||I&&p===I.subTree)&&vr(h,p,!0)):K(h,p,v,U,I,L,D,R,$)},B=(h,p,v,N,I,L,D,R,$)=>{p.slotScopeIds=R,h==null?p.shapeFlag&512?I.ctx.activate(p,v,N,D,$):G(p,v,N,I,L,D,$):Q(h,p,$)},G=(h,p,v,N,I,L,D)=>{const R=h.component=oc(h,N,I);if(Wn(h)&&(R.ctx.renderer=Rn),cc(R),R.asyncDep){if(I&&I.registerDep(R,H),!h.el){const $=R.subTree=ce(we);P(null,$,p,v)}}else H(R,h,p,v,I,L,D)},Q=(h,p,v)=>{const N=p.component=h.component;if(Vu(h,p,v))if(N.asyncDep&&!N.asyncResolved){Y(N,p,v);return}else N.next=p,Ou(N.update),N.effect.dirty=!0,N.update();else p.el=h.el,N.vnode=p},H=(h,p,v,N,I,L,D)=>{const R=()=>{if(h.isMounted){let{next:U,bu:q,u:j,parent:z,vnode:ee}=h;{const Mn=Xl(h);if(Mn){U&&(U.el=ee.el,Y(h,U,D)),Mn.asyncDep.then(()=>{h.isUnmounted||R()});return}}let le=U,fe;Yt(h,!1),U?(U.el=ee.el,Y(h,U,D)):U=ee,q&&gn(q),(fe=U.props&&U.props.onVnodeBeforeUpdate)&&Pe(fe,z,U,ee),Yt(h,!0);const ve=Vs(h),nt=h.subTree;h.subTree=ve,x(nt,ve,f(nt.el),Oi(nt),h,I,L),U.el=ve.el,le===null&&Qi(h,ve.el),j&&Ee(j,I),(fe=U.props&&U.props.onVnodeUpdated)&&Ee(()=>Pe(fe,z,U,ee),I)}else{let U;const{el:q,props:j}=p,{bm:z,m:ee,parent:le}=h,fe=Jt(p);if(Yt(h,!1),z&&gn(z),!fe&&(U=j&&j.onVnodeBeforeMount)&&Pe(U,le,p),Yt(h,!0),q&&_o){const ve=()=>{h.subTree=Vs(h),_o(q,h.subTree,h,I,null)};fe?p.type.__asyncLoader().then(()=>!h.isUnmounted&&ve()):ve()}else{const ve=h.subTree=Vs(h);x(null,ve,v,N,h,I,L),p.el=ve.el}if(ee&&Ee(ee,I),!fe&&(U=j&&j.onVnodeMounted)){const ve=p;Ee(()=>Pe(U,le,ve),I)}(p.shapeFlag&256||le&&Jt(le.vnode)&&le.vnode.shapeFlag&256)&&h.a&&Ee(h.a,I),h.isMounted=!0,p=v=N=null}},$=h.effect=new yn(R,ge,()=>Ms(O),h.scope),O=h.update=()=>{$.dirty&&$.run()};O.id=h.uid,Yt(h,!0),O()},Y=(h,p,v)=>{p.component=h;const N=h.vnode.props;h.vnode=p,h.next=null,Nh(h,p.props,N,v),Oh(h,p.children,v),vt(),sl(h),Et()},K=(h,p,v,N,I,L,D,R,$=!1)=>{const O=h&&h.children,U=h?h.shapeFlag:0,q=p.children,{patchFlag:j,shapeFlag:z}=p;if(j>0){if(j&128){$t(O,q,v,N,I,L,D,R,$);return}else if(j&256){je(O,q,v,N,I,L,D,R,$);return}}z&8?(U&16&>(O,I,L),q!==O&&u(v,q)):U&16?z&16?$t(O,q,v,N,I,L,D,R,$):gt(O,I,L,!0):(U&8&&u(v,""),z&16&&b(q,v,N,I,L,D,R,$))},je=(h,p,v,N,I,L,D,R,$)=>{h=h||hn,p=p||hn;const O=h.length,U=p.length,q=Math.min(O,U);let j;for(j=0;jU?gt(h,I,L,!0,!1,q):b(p,v,N,I,L,D,R,$,q)},$t=(h,p,v,N,I,L,D,R,$)=>{let O=0;const U=p.length;let q=h.length-1,j=U-1;for(;O<=q&&O<=j;){const z=h[O],ee=p[O]=$?xt(p[O]):He(p[O]);if(Qe(z,ee))x(z,ee,v,null,I,L,D,R,$);else break;O++}for(;O<=q&&O<=j;){const z=h[q],ee=p[j]=$?xt(p[j]):He(p[j]);if(Qe(z,ee))x(z,ee,v,null,I,L,D,R,$);else break;q--,j--}if(O>q){if(O<=j){const z=j+1,ee=zj)for(;O<=q;)lt(h[O],I,L,!0),O++;else{const z=O,ee=O,le=new Map;for(O=ee;O<=j;O++){const qe=p[O]=$?xt(p[O]):He(p[O]);qe.key!=null&&le.set(qe.key,O)}let fe,ve=0;const nt=j-ee+1;let Mn=!1,hf=0;const gs=new Array(nt);for(O=0;O=nt){lt(qe,I,L,!0);continue}let ct;if(qe.key!=null)ct=le.get(qe.key);else for(fe=ee;fe<=j;fe++)if(gs[fe-ee]===0&&Qe(qe,p[fe])){ct=fe;break}ct===void 0?lt(qe,I,L,!0):(gs[ct-ee]=O+1,ct>=hf?hf=ct:Mn=!0,x(qe,p[ct],v,null,I,L,D,R,$),ve++)}const df=Mn?Ph(gs):hn;for(fe=df.length-1,O=nt-1;O>=0;O--){const qe=ee+O,ct=p[qe],pf=qe+1{const{el:L,type:D,transition:R,children:$,shapeFlag:O}=h;if(O&6){un(h.component.subTree,p,v,N);return}if(O&128){h.suspense.move(p,v,N);return}if(O&64){D.move(h,p,v,Rn);return}if(D===Ce){s(L,p,v);for(let q=0;q<$.length;q++)un($[q],p,v,N);s(h.anchor,p,v);return}if(D===Zt){m(h,p,v);return}if(N!==2&&O&1&&R)if(N===0)R.beforeEnter(L),s(L,p,v),Ee(()=>R.enter(L),I);else{const{leave:q,delayLeave:j,afterLeave:z}=R,ee=()=>s(L,p,v),le=()=>{q(L,()=>{ee(),z&&z()})};j?j(L,ee,le):le()}else s(L,p,v)},lt=(h,p,v,N=!1,I=!1)=>{const{type:L,props:D,ref:R,children:$,dynamicChildren:O,shapeFlag:U,patchFlag:q,dirs:j}=h;if(R!=null&&zs(R,null,v,h,!0),U&256){p.ctx.deactivate(h);return}const z=U&1&&j,ee=!Jt(h);let le;if(ee&&(le=D&&D.onVnodeBeforeUnmount)&&Pe(le,p,h),U&6)_g(h.component,v,N);else{if(U&128){h.suspense.unmount(v,N);return}z&&rt(h,null,p,"beforeUnmount"),U&64?h.type.remove(h,p,v,I,Rn,N):O&&(L!==Ce||q>0&&q&64)?gt(O,p,v,!1,!0):(L===Ce&&q&384||!I&&U&16)&>($,p,v),N&&ff(h)}(ee&&(le=D&&D.onVnodeUnmounted)||z)&&Ee(()=>{le&&Pe(le,p,h),z&&rt(h,null,p,"unmounted")},v)},ff=h=>{const{type:p,el:v,anchor:N,transition:I}=h;if(p===Ce){yg(v,N);return}if(p===Zt){y(h);return}const L=()=>{i(v),I&&!I.persisted&&I.afterLeave&&I.afterLeave()};if(h.shapeFlag&1&&I&&!I.persisted){const{leave:D,delayLeave:R}=I,$=()=>D(v,L);R?R(h.el,L,$):$()}else L()},yg=(h,p)=>{let v;for(;h!==p;)v=d(h),i(h),h=v;i(p)},_g=(h,p,v)=>{const{bum:N,scope:I,update:L,subTree:D,um:R}=h;N&&gn(N),I.stop(),L&&(L.active=!1,lt(D,h,p,v)),R&&Ee(R,p),Ee(()=>{h.isUnmounted=!0},p),p&&p.pendingBranch&&!p.isUnmounted&&h.asyncDep&&!h.asyncResolved&&h.suspenseId===p.pendingId&&(p.deps--,p.deps===0&&p.resolve())},gt=(h,p,v,N=!1,I=!1,L=0)=>{for(let D=L;Dh.shapeFlag&6?Oi(h.component.subTree):h.shapeFlag&128?h.suspense.next():d(h.anchor||h.el);let go=!1;const uf=(h,p,v)=>{h==null?p._vnode&<(p._vnode,null,null,!0):x(p._vnode||null,h,p,null,null,null,v),go||(go=!0,sl(),Ls(),go=!1),p._vnode=h},Rn={p:x,um:lt,m:un,r:ff,mt:G,mc:b,pc:K,pbc:T,n:Oi,o:e};let yo,_o;return t&&([yo,_o]=t(Rn)),{render:uf,hydrate:yo,createApp:Th(uf,yo)}}function Sr({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Yt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Yl(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function vr(e,t,n=!1){const s=e.children,i=t.children;if(V(s)&&V(i))for(let r=0;r>1,e[n[l]]0&&(t[s]=n[r-1]),n[r]=s)}}for(r=n.length,o=n[r-1];r-- >0;)n[r]=o,o=t[o];return n}function Xl(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Xl(t)}const Lh=e=>e.__isTeleport,Qn=e=>e&&(e.disabled||e.disabled===""),Zl=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Ql=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Er=(e,t)=>{const n=e&&e.to;return J(n)?t?t(n):null:n},Fh={name:"Teleport",__isTeleport:!0,process(e,t,n,s,i,r,o,l,c,a){const{mc:u,pc:f,pbc:d,o:{insert:g,querySelector:_,createText:x,createComment:M}}=a,P=Qn(t.props);let{shapeFlag:A,children:m,dynamicChildren:y}=t;if(e==null){const S=t.el=x(""),C=t.anchor=x("");g(S,n,s),g(C,n,s);const F=t.target=Er(t.props,_),b=t.targetAnchor=x("");F&&(g(b,F),o==="svg"||Zl(F)?o="svg":(o==="mathml"||Ql(F))&&(o="mathml"));const E=(T,k)=>{A&16&&u(m,T,k,i,r,o,l,c)};P?E(n,C):F&&E(F,b)}else{t.el=e.el;const S=t.anchor=e.anchor,C=t.target=e.target,F=t.targetAnchor=e.targetAnchor,b=Qn(e.props),E=b?n:C,T=b?S:F;if(o==="svg"||Zl(C)?o="svg":(o==="mathml"||Ql(C))&&(o="mathml"),y?(d(e.dynamicChildren,y,E,i,r,o,l),vr(e,t,!0)):c||f(e,t,E,T,i,r,o,l,!1),P)b?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):Xs(t,n,S,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const k=t.target=Er(t.props,_);k&&Xs(t,k,null,a,0)}else b&&Xs(t,C,F,a,1)}ec(t)},remove(e,t,n,s,{um:i,o:{remove:r}},o){const{shapeFlag:l,children:c,anchor:a,targetAnchor:u,target:f,props:d}=e;if(f&&r(u),o&&r(a),l&16){const g=o||!Qn(d);for(let _=0;_0?Me||hn:null,tc(),Qt>0&&Me&&Me.push(e),e}function Nt(e,t,n,s,i,r){return nc(Ne(e,t,n,s,i,r,!0))}function Tr(e,t,n,s,i){return nc(ce(e,t,n,s,i,!0))}function It(e){return e?e.__v_isVNode===!0:!1}function Qe(e,t){return e.type===t.type&&e.key===t.key}function Vh(e){}const Zs="__vInternal",sc=({key:e})=>e??null,Qs=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?J(e)||Se(e)||W(e)?{i:me,r:e,k:t,f:!!n}:e:null);function Ne(e,t=null,n=null,s=0,i=null,r=e===Ce?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&sc(t),ref:t&&Qs(t),scopeId:Ds,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:s,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:me};return l?(wr(c,n),r&128&&e.normalize(c)):n&&(c.shapeFlag|=J(n)?8:16),Qt>0&&!o&&Me&&(c.patchFlag>0||r&6)&&c.patchFlag!==32&&Me.push(c),c}const ce=Bh;function Bh(e,t=null,n=null,s=0,i=null,r=!1){if((!e||e===cl)&&(e=we),It(e)){const l=ot(e,t,!0);return n&&wr(l,n),Qt>0&&!r&&Me&&(l.shapeFlag&6?Me[Me.indexOf(e)]=l:Me.push(l)),l.patchFlag|=-2,l}if(Yh(e)&&(e=e.__vccOpts),t){t=ic(t);let{class:l,style:c}=t;l&&!J(l)&&(t.class=_t(l)),oe(c)&&(ji(c)&&!V(c)&&(c=ne({},c)),t.style=Ln(c))}const o=J(e)?1:fl(e)?128:Lh(e)?64:oe(e)?4:W(e)?2:0;return Ne(e,t,n,s,i,o,r,!0)}function ic(e){return e?ji(e)||Zs in e?ne({},e):e:null}function ot(e,t,n=!1){const{props:s,ref:i,patchFlag:r,children:o}=e,l=t?rc(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&sc(l),ref:t&&t.ref?n&&i?V(i)?i.concat(Qs(t)):[i,Qs(t)]:Qs(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ce?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ot(e.ssContent),ssFallback:e.ssFallback&&ot(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Ar(e=" ",t=0){return ce(Xt,null,e,t)}function Hh(e,t){const n=ce(Zt,null,e);return n.staticCount=t,n}function Uh(e="",t=!1){return t?(Ze(),Tr(we,null,e)):ce(we,null,e)}function He(e){return e==null||typeof e=="boolean"?ce(we):V(e)?ce(Ce,null,e.slice()):typeof e=="object"?xt(e):ce(Xt,null,String(e))}function xt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ot(e)}function wr(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(V(t))n=16;else if(typeof t=="object")if(s&65){const i=t.default;i&&(i._c&&(i._d=!1),wr(e,i()),i._c&&(i._d=!0));return}else{n=32;const i=t._;!i&&!(Zs in t)?t._ctx=me:i===3&&me&&(me.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else W(t)?(t={default:t,_ctx:me},n=32):(t=String(t),s&64?(n=16,t=[Ar(t)]):n=8);e.children=t,e.shapeFlag|=n}function rc(...e){const t={};for(let n=0;nye||me;let ei,Nr;{const e=Co(),t=(n,s)=>{let i;return(i=e[n])||(i=e[n]=[]),i.push(s),r=>{i.length>1?i.forEach(o=>o(r)):i[0](r)}};ei=t("__VUE_INSTANCE_SETTERS__",n=>ye=n),Nr=t("__VUE_SSR_SETTERS__",n=>ts=n)}const en=e=>{const t=ye;return ei(e),e.scope.on(),()=>{e.scope.off(),ei(t)}},Ir=()=>{ye&&ye.scope.off(),ei(null)};function lc(e){return e.vnode.shapeFlag&4}let ts=!1;function cc(e,t=!1){t&&Nr(t);const{props:n,children:s}=e.vnode,i=lc(e);wh(e,n,i,t),xh(e,s);const r=i?qh(e,t):void 0;return t&&Nr(!1),r}function qh(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=qi(new Proxy(e.ctx,pr));const{setup:s}=n;if(s){const i=e.setupContext=s.length>1?uc(e):null,r=en(e);vt();const o=st(s,e,0,[e.props,i]);if(Et(),r(),Mi(o)){if(o.then(Ir,Ir),t)return o.then(l=>{xr(e,l,t)}).catch(l=>{qt(l,e,0)});e.asyncDep=o}else xr(e,o,t)}else fc(e,t)}function xr(e,t,n){W(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:oe(t)&&(e.setupState=Ji(t)),fc(e,n)}let ti,Or;function ac(e){ti=e,Or=t=>{t.render._rc&&(t.withProxy=new Proxy(t.ctx,ih))}}const Wh=()=>!ti;function fc(e,t,n){const s=e.type;if(!e.render){if(!t&&ti&&!s.render){const i=s.template||gr(e).template;if(i){const{isCustomElement:r,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,a=ne(ne({isCustomElement:r,delimiters:l},o),c);s.render=ti(i,a)}}e.render=s.render||ge,Or&&Or(e)}{const i=en(e);vt();try{_h(e)}finally{Et(),i()}}}function Gh(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return Re(e,"get","$attrs"),t[n]}}))}function uc(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return Gh(e)},slots:e.slots,emit:e.emit,expose:t}}function ni(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Ji(qi(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Jn)return Jn[n](e)},has(t,n){return n in t||n in Jn}}))}const zh=/(?:^|[-_])(\w)/g,Jh=e=>e.replace(zh,t=>t.toUpperCase()).replace(/[-_]/g,"");function si(e,t=!0){return W(e)?e.displayName||e.name:e.name||t&&e.__name}function hc(e,t,n=!1){let s=si(t);if(!s&&t.__file){const i=t.__file.match(/([^/\\]+)\.\w+$/);i&&(s=i[1])}if(!s&&e&&e.parent){const i=r=>{for(const o in r)if(r[o]===t)return o};s=i(e.components||e.parent.type.components)||i(e.appContext.components)}return s?Jh(s):n?"App":"Anonymous"}function Yh(e){return W(e)&&"__vccOpts"in e}const dc=(e,t)=>cu(e,t,ts);function Xh(e,t,n=ie){const s=ut(),i=ue(t),r=De(t),o=Zo((c,a)=>{let u;return gl(()=>{const f=e[t];Xe(u,f)&&(u=f,a())}),{get(){return c(),n.get?n.get(u):u},set(f){const d=s.vnode.props;!(d&&(t in d||i in d||r in d)&&(`onUpdate:${t}`in d||`onUpdate:${i}`in d||`onUpdate:${r}`in d))&&Xe(f,u)&&(u=f,a()),s.emit(`update:${t}`,n.set?n.set(f):f)}}}),l=t==="modelValue"?"modelModifiers":`${t}Modifiers`;return o[Symbol.iterator]=()=>{let c=0;return{next(){return c<2?{value:c++?e[l]||{}:o,done:!1}:{done:!0}}}},o}function pc(e,t,n){const s=arguments.length;return s===2?oe(t)&&!V(t)?It(t)?ce(e,null,[t]):ce(e,t):ce(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&It(n)&&(n=[n]),ce(e,t,n))}function Zh(){}function Qh(e,t,n,s){const i=n[s];if(i&&mc(i,e))return i;const r=t();return r.memo=e.slice(),n[s]=r}function mc(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let s=0;s0&&Me&&Me.push(e),!0}const gc="3.4.21",ed=ge,td=Nu,nd=Sn,sd=rl,id={createComponentInstance:oc,setupComponent:cc,renderComponentRoot:Vs,setCurrentRenderingInstance:Un,isVNode:It,normalizeVNode:He},rd=null,od=null,ld=null;/** +* @vue/runtime-dom v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const cd="http://www.w3.org/2000/svg",ad="http://www.w3.org/1998/Math/MathML",Ot=typeof document<"u"?document:null,yc=Ot&&Ot.createElement("template"),fd={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const i=t==="svg"?Ot.createElementNS(cd,e):t==="mathml"?Ot.createElementNS(ad,e):Ot.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&i.setAttribute("multiple",s.multiple),i},createText:e=>Ot.createTextNode(e),createComment:e=>Ot.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ot.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,i,r){const o=n?n.previousSibling:t.lastChild;if(i&&(i===r||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===r||!(i=i.nextSibling)););else{yc.innerHTML=s==="svg"?`${e}`:s==="mathml"?`${e}`:e;const l=yc.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},kt="transition",ns="animation",An=Symbol("_vtc"),kr=(e,{slots:t})=>pc(_l,Sc(e),t);kr.displayName="Transition";const _c={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},ud=kr.props=ne({},or,_c),tn=(e,t=[])=>{V(e)?e.forEach(n=>n(...t)):e&&e(...t)},bc=e=>e?V(e)?e.some(t=>t.length>1):e.length>1:!1;function Sc(e){const t={};for(const w in e)w in _c||(t[w]=e[w]);if(e.css===!1)return t;const{name:n="v",type:s,duration:i,enterFromClass:r=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=r,appearActiveClass:a=o,appearToClass:u=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,_=hd(i),x=_&&_[0],M=_&&_[1],{onBeforeEnter:P,onEnter:A,onEnterCancelled:m,onLeave:y,onLeaveCancelled:S,onBeforeAppear:C=P,onAppear:F=A,onAppearCancelled:b=m}=t,E=(w,B,G)=>{Rt(w,B?u:l),Rt(w,B?a:o),G&&G()},T=(w,B)=>{w._isLeaving=!1,Rt(w,f),Rt(w,g),Rt(w,d),B&&B()},k=w=>(B,G)=>{const Q=w?F:A,H=()=>E(B,w,G);tn(Q,[B,H]),vc(()=>{Rt(B,w?c:r),ht(B,w?u:l),bc(Q)||Ec(B,s,x,H)})};return ne(t,{onBeforeEnter(w){tn(P,[w]),ht(w,r),ht(w,o)},onBeforeAppear(w){tn(C,[w]),ht(w,c),ht(w,a)},onEnter:k(!1),onAppear:k(!0),onLeave(w,B){w._isLeaving=!0;const G=()=>T(w,B);ht(w,f),wc(),ht(w,d),vc(()=>{w._isLeaving&&(Rt(w,f),ht(w,g),bc(y)||Ec(w,s,M,G))}),tn(y,[w,G])},onEnterCancelled(w){E(w,!1),tn(m,[w])},onAppearCancelled(w){E(w,!0),tn(b,[w])},onLeaveCancelled(w){T(w),tn(S,[w])}})}function hd(e){if(e==null)return null;if(oe(e))return[Rr(e.enter),Rr(e.leave)];{const t=Rr(e);return[t,t]}}function Rr(e){return Ss(e)}function ht(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[An]||(e[An]=new Set)).add(t)}function Rt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[An];n&&(n.delete(t),n.size||(e[An]=void 0))}function vc(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let dd=0;function Ec(e,t,n,s){const i=e._endId=++dd,r=()=>{i===e._endId&&s()};if(n)return setTimeout(r,n);const{type:o,timeout:l,propCount:c}=Cc(e,t);if(!o)return s();const a=o+"end";let u=0;const f=()=>{e.removeEventListener(a,d),r()},d=g=>{g.target===e&&++u>=c&&f()};setTimeout(()=>{u(n[_]||"").split(", "),i=s(`${kt}Delay`),r=s(`${kt}Duration`),o=Tc(i,r),l=s(`${ns}Delay`),c=s(`${ns}Duration`),a=Tc(l,c);let u=null,f=0,d=0;t===kt?o>0&&(u=kt,f=o,d=r.length):t===ns?a>0&&(u=ns,f=a,d=c.length):(f=Math.max(o,a),u=f>0?o>a?kt:ns:null,d=u?u===kt?r.length:c.length:0);const g=u===kt&&/\b(transform|all)(,|$)/.test(s(`${kt}Property`).toString());return{type:u,timeout:f,propCount:d,hasTransform:g}}function Tc(e,t){for(;e.lengthAc(n)+Ac(e[s])))}function Ac(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function wc(){return document.body.offsetHeight}function pd(e,t,n){const s=e[An];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const ii=Symbol("_vod"),Nc=Symbol("_vsh"),Ic={beforeMount(e,{value:t},{transition:n}){e[ii]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):ss(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),ss(e,!0),s.enter(e)):s.leave(e,()=>{ss(e,!1)}):ss(e,t))},beforeUnmount(e,{value:t}){ss(e,t)}};function ss(e,t){e.style.display=t?e[ii]:"none",e[Nc]=!t}function md(){Ic.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}}}const xc=Symbol("");function gd(e){const t=ut();if(!t)return;const n=t.ut=(i=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(r=>Pr(r,i))},s=()=>{const i=e(t.proxy);Mr(t.subTree,i),n(i)};ml(s),zn(()=>{const i=new MutationObserver(s);i.observe(t.subTree.el.parentNode,{childList:!0}),Ws(()=>i.disconnect())})}function Mr(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{Mr(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)Pr(e.el,t);else if(e.type===Ce)e.children.forEach(n=>Mr(n,t));else if(e.type===Zt){let{el:n,anchor:s}=e;for(;n&&(Pr(n,t),n!==s);)n=n.nextSibling}}function Pr(e,t){if(e.nodeType===1){const n=e.style;let s="";for(const i in t)n.setProperty(`--${i}`,t[i]),s+=`--${i}: ${t[i]};`;n[xc]=s}}const yd=/(^|;)\s*display\s*:/;function _d(e,t,n){const s=e.style,i=J(n);let r=!1;if(n&&!i){if(t)if(J(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&ri(s,l,"")}else for(const o in t)n[o]==null&&ri(s,o,"");for(const o in n)o==="display"&&(r=!0),ri(s,o,n[o])}else if(i){if(t!==n){const o=s[xc];o&&(n+=";"+o),s.cssText=n,r=yd.test(n)}}else t&&e.removeAttribute("style");ii in e&&(e[ii]=r?s.display:"",e[Nc]&&(s.display="none"))}const Oc=/\s*!important$/;function ri(e,t,n){if(V(n))n.forEach(s=>ri(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=bd(e,t);Oc.test(n)?e.setProperty(De(s),n.replace(Oc,""),"important"):e[s]=n}}const kc=["Webkit","Moz","ms"],Lr={};function bd(e,t){const n=Lr[t];if(n)return n;let s=ue(t);if(s!=="filter"&&s in e)return Lr[t]=s;s=Bt(s);for(let i=0;iFr||(Ad.then(()=>Fr=0),Fr=Date.now());function Nd(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Be(Id(s,n.value),t,5,[s])};return n.value=e,n.attached=wd(),n}function Id(e,t){if(V(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>i=>!i._stopped&&s&&s(i))}else return t}const Lc=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,xd=(e,t,n,s,i,r,o,l,c)=>{const a=i==="svg";t==="class"?pd(e,s,a):t==="style"?_d(e,n,s):Dt(t)?ki(t)||Cd(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Od(e,t,s,a))?vd(e,t,s,r,o,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Sd(e,t,s,a))};function Od(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Lc(t)&&W(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const i=e.tagName;if(i==="IMG"||i==="VIDEO"||i==="CANVAS"||i==="SOURCE")return!1}return Lc(t)&&J(n)?!1:t in e}/*! #__NO_SIDE_EFFECTS__ */function Fc(e,t){const n=cr(e);class s extends oi{constructor(r){super(n,r,t)}}return s.def=n,s}/*! #__NO_SIDE_EFFECTS__ */const kd=e=>Fc(e,Zc),Rd=typeof HTMLElement<"u"?HTMLElement:class{};class oi extends Rd{constructor(t,n={},s){super(),this._def=t,this._props=n,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this._ob=null,this.shadowRoot&&s?s(this._createVNode(),this.shadowRoot):(this.attachShadow({mode:"open"}),this._def.__asyncLoader||this._resolveProps(this._def))}connectedCallback(){this._connected=!0,this._instance||(this._resolved?this._update():this._resolveDef())}disconnectedCallback(){this._connected=!1,this._ob&&(this._ob.disconnect(),this._ob=null),Rs(()=>{this._connected||(Vr(null,this.shadowRoot),this._instance=null)})}_resolveDef(){this._resolved=!0;for(let s=0;s{for(const i of s)this._setAttr(i.attributeName)}),this._ob.observe(this,{attributes:!0});const t=(s,i=!1)=>{const{props:r,styles:o}=s;let l;if(r&&!V(r))for(const c in r){const a=r[c];(a===Number||a&&a.type===Number)&&(c in this._props&&(this._props[c]=Ss(this._props[c])),(l||(l=Object.create(null)))[ue(c)]=!0)}this._numberProps=l,i&&this._resolveProps(s),this._applyStyles(o),this._update()},n=this._def.__asyncLoader;n?n().then(s=>t(s,!0)):t(this._def)}_resolveProps(t){const{props:n}=t,s=V(n)?n:Object.keys(n||{});for(const i of Object.keys(this))i[0]!=="_"&&s.includes(i)&&this._setProp(i,this[i],!0,!1);for(const i of s.map(ue))Object.defineProperty(this,i,{get(){return this._getProp(i)},set(r){this._setProp(i,r)}})}_setAttr(t){let n=this.getAttribute(t);const s=ue(t);this._numberProps&&this._numberProps[s]&&(n=Ss(n)),this._setProp(s,n,!1)}_getProp(t){return this._props[t]}_setProp(t,n,s=!0,i=!0){n!==this._props[t]&&(this._props[t]=n,i&&this._instance&&this._update(),s&&(n===!0?this.setAttribute(De(t),""):typeof n=="string"||typeof n=="number"?this.setAttribute(De(t),n+""):n||this.removeAttribute(De(t))))}_update(){Vr(this._createVNode(),this.shadowRoot)}_createVNode(){const t=ce(this._def,ne({},this._props));return this._instance||(t.ce=n=>{this._instance=n,n.isCE=!0;const s=(r,o)=>{this.dispatchEvent(new CustomEvent(r,{detail:o}))};n.emit=(r,...o)=>{s(r,o),De(r)!==r&&s(De(r),o)};let i=this;for(;i=i&&(i.parentNode||i.host);)if(i instanceof oi){n.parent=i._instance,n.provides=i._instance.provides;break}}),t}_applyStyles(t){t&&t.forEach(n=>{const s=document.createElement("style");s.textContent=n,this.shadowRoot.appendChild(s)})}}function Md(e="$style"){{const t=ut();if(!t)return ie;const n=t.type.__cssModules;if(!n)return ie;const s=n[e];return s||ie}}const $c=new WeakMap,Dc=new WeakMap,li=Symbol("_moveCb"),Vc=Symbol("_enterCb"),Bc={name:"TransitionGroup",props:ne({},ud,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=ut(),s=rr();let i,r;return js(()=>{if(!i.length)return;const o=e.moveClass||`${e.name||"v"}-move`;if(!Vd(i[0].el,n.vnode.el,o))return;i.forEach(Fd),i.forEach($d);const l=i.filter(Dd);wc(),l.forEach(c=>{const a=c.el,u=a.style;ht(a,o),u.transform=u.webkitTransform=u.transitionDuration="";const f=a[li]=d=>{d&&d.target!==a||(!d||/transform$/.test(d.propertyName))&&(a.removeEventListener("transitionend",f),a[li]=null,Rt(a,o))};a.addEventListener("transitionend",f)})}),()=>{const o=Z(e),l=Sc(o);let c=o.tag||Ce;i=r,r=t.default?Us(t.default()):[];for(let a=0;adelete e.mode;Bc.props;const Ld=Bc;function Fd(e){const t=e.el;t[li]&&t[li](),t[Vc]&&t[Vc]()}function $d(e){Dc.set(e,e.el.getBoundingClientRect())}function Dd(e){const t=$c.get(e),n=Dc.get(e),s=t.left-n.left,i=t.top-n.top;if(s||i){const r=e.el.style;return r.transform=r.webkitTransform=`translate(${s}px,${i}px)`,r.transitionDuration="0s",e}}function Vd(e,t,n){const s=e.cloneNode(),i=e[An];i&&i.forEach(l=>{l.split(/\s+/).forEach(c=>c&&s.classList.remove(c))}),n.split(/\s+/).forEach(l=>l&&s.classList.add(l)),s.style.display="none";const r=t.nodeType===1?t:t.parentNode;r.appendChild(s);const{hasTransform:o}=Cc(s);return r.removeChild(s),o}const Mt=e=>{const t=e.props["onUpdate:modelValue"]||!1;return V(t)?n=>gn(t,n):t};function Bd(e){e.target.composing=!0}function Hc(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Ge=Symbol("_assign"),ci={created(e,{modifiers:{lazy:t,trim:n,number:s}},i){e[Ge]=Mt(i);const r=s||i.props&&i.props.type==="number";dt(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),r&&(l=Pn(l)),e[Ge](l)}),n&&dt(e,"change",()=>{e.value=e.value.trim()}),t||(dt(e,"compositionstart",Bd),dt(e,"compositionend",Hc),dt(e,"change",Hc))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:i}},r){if(e[Ge]=Mt(r),e.composing)return;const o=i||e.type==="number"?Pn(e.value):e.value,l=t??"";o!==l&&(document.activeElement===e&&e.type!=="range"&&(n||s&&e.value.trim()===l)||(e.value=l))}},$r={deep:!0,created(e,t,n){e[Ge]=Mt(n),dt(e,"change",()=>{const s=e._modelValue,i=wn(e),r=e.checked,o=e[Ge];if(V(s)){const l=vs(s,i),c=l!==-1;if(r&&!c)o(s.concat(i));else if(!r&&c){const a=[...s];a.splice(l,1),o(a)}}else if(Vt(s)){const l=new Set(s);r?l.add(i):l.delete(i),o(l)}else o(qc(e,r))})},mounted:Uc,beforeUpdate(e,t,n){e[Ge]=Mt(n),Uc(e,t,n)}};function Uc(e,{value:t,oldValue:n},s){e._modelValue=t,V(t)?e.checked=vs(t,s.props.value)>-1:Vt(t)?e.checked=t.has(s.props.value):t!==n&&(e.checked=bt(t,qc(e,!0)))}const Dr={created(e,{value:t},n){e.checked=bt(t,n.props.value),e[Ge]=Mt(n),dt(e,"change",()=>{e[Ge](wn(e))})},beforeUpdate(e,{value:t,oldValue:n},s){e[Ge]=Mt(s),t!==n&&(e.checked=bt(t,s.props.value))}},Kc={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const i=Vt(t);dt(e,"change",()=>{const r=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>n?Pn(wn(o)):wn(o));e[Ge](e.multiple?i?new Set(r):r:r[0]),e._assigning=!0,Rs(()=>{e._assigning=!1})}),e[Ge]=Mt(s)},mounted(e,{value:t,modifiers:{number:n}}){jc(e,t,n)},beforeUpdate(e,t,n){e[Ge]=Mt(n)},updated(e,{value:t,modifiers:{number:n}}){e._assigning||jc(e,t,n)}};function jc(e,t,n){const s=e.multiple,i=V(t);if(!(s&&!i&&!Vt(t))){for(let r=0,o=e.options.length;r-1}else l.selected=t.has(c);else if(bt(wn(l),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function wn(e){return"_value"in e?e._value:e.value}function qc(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Wc={created(e,t,n){ai(e,t,n,null,"created")},mounted(e,t,n){ai(e,t,n,null,"mounted")},beforeUpdate(e,t,n,s){ai(e,t,n,s,"beforeUpdate")},updated(e,t,n,s){ai(e,t,n,s,"updated")}};function Gc(e,t){switch(e){case"SELECT":return Kc;case"TEXTAREA":return ci;default:switch(t){case"checkbox":return $r;case"radio":return Dr;default:return ci}}}function ai(e,t,n,s,i){const o=Gc(e.tagName,n.props&&n.props.type)[i];o&&o(e,t,n,s)}function Hd(){ci.getSSRProps=({value:e})=>({value:e}),Dr.getSSRProps=({value:e},t)=>{if(t.props&&bt(t.props.value,e))return{checked:!0}},$r.getSSRProps=({value:e},t)=>{if(V(e)){if(t.props&&vs(e,t.props.value)>-1)return{checked:!0}}else if(Vt(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},Wc.getSSRProps=(e,t)=>{if(typeof t.type!="string")return;const n=Gc(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)}}const Ud=["ctrl","shift","alt","meta"],Kd={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Ud.some(n=>e[`${n}Key`]&&!t.includes(n))},jd=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(i,...r)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=i=>{if(!("key"in i))return;const r=De(i.key);if(t.some(o=>o===r||qd[o]===r))return e(i)})},zc=ne({patchProp:xd},fd);let is,Jc=!1;function Yc(){return is||(is=Gl(zc))}function Xc(){return is=Jc?is:zl(zc),Jc=!0,is}const Vr=(...e)=>{Yc().render(...e)},Zc=(...e)=>{Xc().hydrate(...e)},Qc=(...e)=>{const t=Yc().createApp(...e),{mount:n}=t;return t.mount=s=>{const i=ta(s);if(!i)return;const r=t._component;!W(r)&&!r.render&&!r.template&&(r.template=i.innerHTML),i.innerHTML="";const o=n(i,!1,ea(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),o},t},Gd=(...e)=>{const t=Xc().createApp(...e),{mount:n}=t;return t.mount=s=>{const i=ta(s);if(i)return n(i,!0,ea(i))},t};function ea(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ta(e){return J(e)?document.querySelector(e):e}let na=!1;const zd=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:_l,BaseTransitionPropsValidators:or,Comment:we,DeprecationTypes:ld,EffectScope:Fi,ErrorCodes:wu,ErrorTypeStrings:td,Fragment:Ce,KeepAlive:Qu,ReactiveEffect:yn,Static:Zt,Suspense:Ku,Teleport:Dh,Text:Xt,TrackOpTypes:bu,Transition:kr,TransitionGroup:Ld,TriggerOpTypes:Su,VueElement:oi,assertNumber:Au,callWithAsyncErrorHandling:Be,callWithErrorHandling:st,camelize:ue,capitalize:Bt,cloneVNode:ot,compatUtils:od,computed:dc,createApp:Qc,createBlock:Tr,createCommentVNode:Uh,createElementBlock:Nt,createElementVNode:Ne,createHydrationRenderer:zl,createPropsRestProxy:gh,createRenderer:Gl,createSSRApp:Gd,createSlots:nh,createStaticVNode:Hh,createTextVNode:Ar,createVNode:ce,customRef:Zo,defineAsyncComponent:Zu,defineComponent:cr,defineCustomElement:Fc,defineEmits:oh,defineExpose:lh,defineModel:fh,defineOptions:ch,defineProps:rh,defineSSRCustomElement:kd,defineSlots:ah,devtools:nd,effect:Bf,effectScope:$f,getCurrentInstance:ut,getCurrentScope:Io,getTransitionRawChildren:Us,guardReactiveProps:ic,h:pc,handleError:qt,hasInjectionContext:Ah,hydrate:Zc,initCustomFormatter:Zh,initDirectivesForSSR:()=>{na||(na=!0,Hd(),md())},inject:Zn,isMemoSame:mc,isProxy:ji,isReactive:Kt,isReadonly:jt,isRef:Se,isRuntimeOnly:Wh,isShallow:Fn,isVNode:It,markRaw:qi,mergeDefaults:ph,mergeModels:mh,mergeProps:rc,nextTick:Rs,normalizeClass:_t,normalizeProps:Af,normalizeStyle:Ln,onActivated:vl,onBeforeMount:Tl,onBeforeUnmount:qs,onBeforeUpdate:Al,onDeactivated:El,onErrorCaptured:xl,onMounted:zn,onRenderTracked:Il,onRenderTriggered:Nl,onScopeDispose:Df,onServerPrefetch:wl,onUnmounted:Ws,onUpdated:js,openBlock:Ze,popScopeId:Pu,provide:$l,proxyRefs:Ji,pushScopeId:Mu,queuePostFlushCb:Ps,reactive:Os,readonly:Ki,ref:Dn,registerRuntimeCompiler:ac,render:Vr,renderList:th,renderSlot:Cn,resolveComponent:tr,resolveDirective:Uu,resolveDynamicComponent:Hu,resolveFilter:rd,resolveTransitionHooks:En,setBlockTracking:Cr,setDevtoolsHook:sd,setTransitionHooks:zt,shallowReactive:Jo,shallowReadonly:lu,shallowRef:au,ssrContextKey:dl,ssrUtils:id,stop:Hf,toDisplayString:Ff,toHandlerKey:mn,toHandlers:sh,toRaw:Z,toRef:_u,toRefs:mu,toValue:hu,transformVNodeArgs:Vh,triggerRef:uu,unref:zi,useAttrs:dh,useCssModule:Md,useCssVars:gd,useModel:Xh,useSSRContext:pl,useSlots:hh,useTransitionState:rr,vModelCheckbox:$r,vModelDynamic:Wc,vModelRadio:Dr,vModelSelect:Kc,vModelText:ci,vShow:Ic,version:gc,warn:ed,watch:jn,watchEffect:Ju,watchPostEffect:ml,watchSyncEffect:gl,withAsyncContext:yh,withCtx:Zi,withDefaults:uh,withDirectives:Xu,withKeys:Wd,withMemo:Qh,withModifiers:jd,withScopeId:Lu},Symbol.toStringTag,{value:"Module"}));/** +* @vue/compiler-core v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const rs=Symbol(""),os=Symbol(""),Br=Symbol(""),fi=Symbol(""),sa=Symbol(""),nn=Symbol(""),ia=Symbol(""),ra=Symbol(""),Hr=Symbol(""),Ur=Symbol(""),ls=Symbol(""),Kr=Symbol(""),oa=Symbol(""),jr=Symbol(""),qr=Symbol(""),Wr=Symbol(""),Gr=Symbol(""),zr=Symbol(""),Jr=Symbol(""),la=Symbol(""),ca=Symbol(""),ui=Symbol(""),hi=Symbol(""),Yr=Symbol(""),Xr=Symbol(""),cs=Symbol(""),as=Symbol(""),Zr=Symbol(""),Qr=Symbol(""),Jd=Symbol(""),eo=Symbol(""),di=Symbol(""),Yd=Symbol(""),Xd=Symbol(""),to=Symbol(""),Zd=Symbol(""),Qd=Symbol(""),no=Symbol(""),aa=Symbol(""),Nn={[rs]:"Fragment",[os]:"Teleport",[Br]:"Suspense",[fi]:"KeepAlive",[sa]:"BaseTransition",[nn]:"openBlock",[ia]:"createBlock",[ra]:"createElementBlock",[Hr]:"createVNode",[Ur]:"createElementVNode",[ls]:"createCommentVNode",[Kr]:"createTextVNode",[oa]:"createStaticVNode",[jr]:"resolveComponent",[qr]:"resolveDynamicComponent",[Wr]:"resolveDirective",[Gr]:"resolveFilter",[zr]:"withDirectives",[Jr]:"renderList",[la]:"renderSlot",[ca]:"createSlots",[ui]:"toDisplayString",[hi]:"mergeProps",[Yr]:"normalizeClass",[Xr]:"normalizeStyle",[cs]:"normalizeProps",[as]:"guardReactiveProps",[Zr]:"toHandlers",[Qr]:"camelize",[Jd]:"capitalize",[eo]:"toHandlerKey",[di]:"setBlockTracking",[Yd]:"pushScopeId",[Xd]:"popScopeId",[to]:"withCtx",[Zd]:"unref",[Qd]:"isRef",[no]:"withMemo",[aa]:"isMemoSame"};function ep(e){Object.getOwnPropertySymbols(e).forEach(t=>{Nn[t]=e[t]})}const Ue={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:""};function tp(e,t=""){return{type:0,source:t,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:Ue}}function fs(e,t,n,s,i,r,o,l=!1,c=!1,a=!1,u=Ue){return e&&(l?(e.helper(nn),e.helper(On(e.inSSR,a))):e.helper(xn(e.inSSR,a)),o&&e.helper(zr)),{type:13,tag:t,props:n,children:s,patchFlag:i,dynamicProps:r,directives:o,isBlock:l,disableTracking:c,isComponent:a,loc:u}}function us(e,t=Ue){return{type:17,loc:t,elements:e}}function ze(e,t=Ue){return{type:15,loc:t,properties:e}}function he(e,t){return{type:16,loc:Ue,key:J(e)?X(e,!0):e,value:t}}function X(e,t=!1,n=Ue,s=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:s}}function et(e,t=Ue){return{type:8,loc:t,children:e}}function _e(e,t=[],n=Ue){return{type:14,loc:n,callee:e,arguments:t}}function In(e,t=void 0,n=!1,s=!1,i=Ue){return{type:18,params:e,returns:t,newline:n,isSlot:s,loc:i}}function so(e,t,n,s=!0){return{type:19,test:e,consequent:t,alternate:n,newline:s,loc:Ue}}function np(e,t,n=!1){return{type:20,index:e,value:t,isVNode:n,loc:Ue}}function sp(e){return{type:21,body:e,loc:Ue}}function xn(e,t){return e||t?Hr:Ur}function On(e,t){return e||t?ia:ra}function io(e,{helper:t,removeHelper:n,inSSR:s}){e.isBlock||(e.isBlock=!0,n(xn(s,e.isComponent)),t(nn),t(On(s,e.isComponent)))}const fa=new Uint8Array([123,123]),ua=new Uint8Array([125,125]);function ha(e){return e>=97&&e<=122||e>=65&&e<=90}function Ke(e){return e===32||e===10||e===9||e===12||e===13}function Pt(e){return e===47||e===62||Ke(e)}function pi(e){const t=new Uint8Array(e.length);for(let n=0;n=0;i--){const r=this.newlines[i];if(t>r){n=i+2,s=t-r;break}}return{column:s,line:n,offset:t}}peek(){return this.buffer.charCodeAt(this.index+1)}stateText(t){t===60?(this.index>this.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=5,this.sectionStart=this.index):!this.inVPre&&t===this.delimiterOpen[0]&&(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(t))}stateInterpolationOpen(t){if(t===this.delimiterOpen[this.delimiterIndex])if(this.delimiterIndex===this.delimiterOpen.length-1){const n=this.index+1-this.delimiterOpen.length;n>this.sectionStart&&this.cbs.ontext(this.sectionStart,n),this.state=3,this.sectionStart=n}else this.delimiterIndex++;else this.inRCDATA?(this.state=32,this.stateInRCDATA(t)):(this.state=1,this.stateText(t))}stateInterpolation(t){t===this.delimiterClose[0]&&(this.state=4,this.delimiterIndex=0,this.stateInterpolationClose(t))}stateInterpolationClose(t){t===this.delimiterClose[this.delimiterIndex]?this.delimiterIndex===this.delimiterClose.length-1?(this.cbs.oninterpolation(this.sectionStart,this.index+1),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):this.delimiterIndex++:(this.state=3,this.stateInterpolation(t))}stateSpecialStartSequence(t){const n=this.sequenceIndex===this.currentSequence.length;if(!(n?Pt(t):(t|32)===this.currentSequence[this.sequenceIndex]))this.inRCDATA=!1;else if(!n){this.sequenceIndex++;return}this.sequenceIndex=0,this.state=6,this.stateInTagName(t)}stateInRCDATA(t){if(this.sequenceIndex===this.currentSequence.length){if(t===62||Ke(t)){const n=this.index-this.currentSequence.length;if(this.sectionStart=t||(this.state===28?this.currentSequence===Ie.CdataEnd?this.cbs.oncdata(this.sectionStart,t):this.cbs.oncomment(this.sectionStart,t):this.state===6||this.state===11||this.state===18||this.state===17||this.state===12||this.state===13||this.state===14||this.state===15||this.state===16||this.state===20||this.state===19||this.state===21||this.state===9||this.cbs.ontext(this.sectionStart,t))}emitCodePoint(t,n){}}function da(e,{compatConfig:t}){const n=t&&t[e];return e==="MODE"?n||3:n}function sn(e,t){const n=da("MODE",t),s=da(e,t);return n===3?s===!0:s!==!1}function hs(e,t,n,...s){return sn(e,t)}function ro(e){throw e}function pa(e){}function ae(e,t,n,s){const i=`https://vuejs.org/error-reference/#compiler-${e}`,r=new SyntaxError(String(i));return r.code=e,r.loc=t,r}const Le=e=>e.type===4&&e.isStatic;function ma(e){switch(e){case"Teleport":case"teleport":return os;case"Suspense":case"suspense":return Br;case"KeepAlive":case"keep-alive":return fi;case"BaseTransition":case"base-transition":return sa}}const rp=/^\d|[^\$\w]/,oo=e=>!rp.test(e),op=/[A-Za-z_$\xA0-\uFFFF]/,lp=/[\.\?\w$\xA0-\uFFFF]/,cp=/\s+[.[]\s*|\s*[.[]\s+/g,ga=e=>{e=e.trim().replace(cp,o=>o.trim());let t=0,n=[],s=0,i=0,r=null;for(let o=0;ot.type===7&&t.name==="bind"&&(!t.arg||t.arg.type!==4||!t.arg.isStatic))}function lo(e){return e.type===5||e.type===2}function fp(e){return e.type===7&&e.name==="slot"}function gi(e){return e.type===1&&e.tagType===3}function yi(e){return e.type===1&&e.tagType===2}const up=new Set([cs,as]);function ya(e,t=[]){if(e&&!J(e)&&e.type===14){const n=e.callee;if(!J(n)&&up.has(n))return ya(e.arguments[0],t.concat(e))}return[e,t]}function _i(e,t,n){let s,i=e.type===13?e.props:e.arguments[2],r=[],o;if(i&&!J(i)&&i.type===14){const l=ya(i);i=l[0],r=l[1],o=r[r.length-1]}if(i==null||J(i))s=ze([t]);else if(i.type===14){const l=i.arguments[0];!J(l)&&l.type===15?_a(t,l)||l.properties.unshift(t):i.callee===Zr?s=_e(n.helper(hi),[ze([t]),i]):i.arguments.unshift(ze([t])),!s&&(s=i)}else i.type===15?(_a(t,i)||i.properties.unshift(t),s=i):(s=_e(n.helper(hi),[ze([t]),i]),o&&o.callee===as&&(o=r[r.length-2]));e.type===13?o?o.arguments[0]=s:e.props=s:o?o.arguments[0]=s:e.arguments[2]=s}function _a(e,t){let n=!1;if(e.key.type===4){const s=e.key.content;n=t.properties.some(i=>i.key.type===4&&i.key.content===s)}return n}function ds(e,t){return`_${t}_${e.replace(/[^\w]/g,(n,s)=>n==="-"?"_":e.charCodeAt(s).toString())}`}function hp(e){return e.type===14&&e.callee===no?e.arguments[1].returns:e}const dp=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,ba={parseMode:"base",ns:0,delimiters:["{{","}}"],getNamespace:()=>0,isVoidTag:ys,isPreTag:ys,isCustomElement:ys,onError:ro,onWarn:pa,comments:!1,prefixIdentifiers:!1};let re=ba,ps=null,on="",xe=null,te=null,Fe="",pt=-1,ln=-1,bi=0,Lt=!1,co=null;const de=[],pe=new ip(de,{onerr:mt,ontext(e,t){Si(Te(e,t),e,t)},ontextentity(e,t,n){Si(e,t,n)},oninterpolation(e,t){if(Lt)return Si(Te(e,t),e,t);let n=e+pe.delimiterOpen.length,s=t-pe.delimiterClose.length;for(;Ke(on.charCodeAt(n));)n++;for(;Ke(on.charCodeAt(s-1));)s--;let i=Te(n,s);i.includes("&")&&(i=re.decodeEntities(i,!1)),ao({type:5,content:Ei(i,!1,be(n,s)),loc:be(e,t)})},onopentagname(e,t){const n=Te(e,t);xe={type:1,tag:n,ns:re.getNamespace(n,de[0],re.ns),tagType:0,props:[],children:[],loc:be(e-1,t),codegenNode:void 0}},onopentagend(e){va(e)},onclosetag(e,t){const n=Te(e,t);if(!re.isVoidTag(n)){let s=!1;for(let i=0;i0&&mt(24,de[0].loc.start.offset);for(let o=0;o<=i;o++){const l=de.shift();vi(l,t,o(s.type===7?s.rawName:s.name)===n)&&mt(2,t)},onattribend(e,t){if(xe&&te){if(cn(te.loc,t),e!==0)if(Fe.includes("&")&&(Fe=re.decodeEntities(Fe,!0)),te.type===6)te.name==="class"&&(Fe=Aa(Fe).trim()),e===1&&!Fe&&mt(13,t),te.value={type:2,content:Fe,loc:e===1?be(pt,ln):be(pt-1,ln+1)},pe.inSFCRoot&&xe.tag==="template"&&te.name==="lang"&&Fe&&Fe!=="html"&&pe.enterRCDATA(pi("-1&&hs("COMPILER_V_BIND_SYNC",re,te.loc,te.rawName)&&(te.name="model",te.modifiers.splice(s,1))}(te.type!==7||te.name!=="pre")&&xe.props.push(te)}Fe="",pt=ln=-1},oncomment(e,t){re.comments&&ao({type:3,content:Te(e,t),loc:be(e-4,t+3)})},onend(){const e=on.length;for(let t=0;t{const _=t.start.offset+d,x=_+f.length;return Ei(f,!1,be(_,x),0,g?1:0)},l={source:o(r.trim(),n.indexOf(r,i.length)),value:void 0,key:void 0,index:void 0,finalized:!1};let c=i.trim().replace(pp,"").trim();const a=i.indexOf(c),u=c.match(Sa);if(u){c=c.replace(Sa,"").trim();const f=u[1].trim();let d;if(f&&(d=n.indexOf(f,a+c.length),l.key=o(f,d,!0)),u[2]){const g=u[2].trim();g&&(l.index=o(g,n.indexOf(g,l.key?d+f.length:a+c.length),!0))}}return c&&(l.value=o(c,a,!0)),l}function Te(e,t){return on.slice(e,t)}function va(e){pe.inSFCRoot&&(xe.innerLoc=be(e+1,e+1)),ao(xe);const{tag:t,ns:n}=xe;n===0&&re.isPreTag(t)&&bi++,re.isVoidTag(t)?vi(xe,e):(de.unshift(xe),(n===1||n===2)&&(pe.inXML=!0)),xe=null}function Si(e,t,n){var s;{const o=(s=de[0])==null?void 0:s.tag;o!=="script"&&o!=="style"&&e.includes("&")&&(e=re.decodeEntities(e,!1))}const i=de[0]||ps,r=i.children[i.children.length-1];(r==null?void 0:r.type)===2?(r.content+=e,cn(r.loc,n)):i.children.push({type:2,content:e,loc:be(t,n)})}function vi(e,t,n=!1){n?cn(e.loc,Ea(t,60)):cn(e.loc,t+1),pe.inSFCRoot&&(e.children.length?e.innerLoc.end=ne({},e.children[e.children.length-1].loc.end):e.innerLoc.end=ne({},e.innerLoc.start),e.innerLoc.source=Te(e.innerLoc.start.offset,e.innerLoc.end.offset));const{tag:s,ns:i}=e;Lt||(s==="slot"?e.tagType=2:Ca(e)?e.tagType=3:yp(e)&&(e.tagType=1)),pe.inRCDATA||(e.children=Ta(e.children,e.tag)),i===0&&re.isPreTag(s)&&bi--,co===e&&(Lt=pe.inVPre=!1,co=null),pe.inXML&&(de[0]?de[0].ns:re.ns)===0&&(pe.inXML=!1);{const r=e.props;if(!pe.inSFCRoot&&sn("COMPILER_NATIVE_TEMPLATE",re)&&e.tag==="template"&&!Ca(e)){const l=de[0]||ps,c=l.children.indexOf(e);l.children.splice(c,1,...e.children)}const o=r.find(l=>l.type===6&&l.name==="inline-template");o&&hs("COMPILER_INLINE_TEMPLATE",re,o.loc)&&e.children.length&&(o.value={type:2,content:Te(e.children[0].loc.start.offset,e.children[e.children.length-1].loc.end.offset),loc:o.loc})}}function Ea(e,t){let n=e;for(;on.charCodeAt(n)!==t&&n>=0;)n--;return n}const gp=new Set(["if","else","else-if","for","slot"]);function Ca({tag:e,props:t}){if(e==="template"){for(let n=0;n64&&e<91}const bp=/\r\n/g;function Ta(e,t){var n,s;const i=re.whitespace!=="preserve";let r=!1;for(let o=0;o0){if(c>=2){l.codegenNode.patchFlag="-1",l.codegenNode=t.hoist(l.codegenNode),r++;continue}}else{const a=l.codegenNode;if(a.type===13){const u=Oa(a);if((!u||u===512||u===1)&&Ia(l,t)>=2){const f=xa(l);f&&(a.props=t.hoist(f))}a.dynamicProps&&(a.dynamicProps=t.hoist(a.dynamicProps))}}}if(l.type===1){const c=l.tagType===1;c&&t.scopes.vSlot++,Ci(l,t),c&&t.scopes.vSlot--}else if(l.type===11)Ci(l,t,l.children.length===1);else if(l.type===9)for(let c=0;c1)for(let a=0;ak&&(b.childIndex--,b.onNodeRemoved()),b.parent.children.splice(k,1)},onNodeRemoved:ge,addIdentifiers(E){},removeIdentifiers(E){},hoist(E){J(E)&&(E=X(E)),b.hoists.push(E);const T=X(`_hoisted_${b.hoists.length}`,!1,E.loc,2);return T.hoisted=E,T},cache(E,T=!1){return np(b.cached++,E,T)}};return b.filters=new Set,b}function Ip(e,t){const n=Np(e,t);Ti(e,n),t.hoistStatic&&Ap(e,n),t.ssr||xp(e,n),e.helpers=new Set([...n.helpers.keys()]),e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached,e.transformed=!0,e.filters=[...n.filters]}function xp(e,t){const{helper:n}=t,{children:s}=e;if(s.length===1){const i=s[0];if(wa(e,i)&&i.codegenNode){const r=i.codegenNode;r.type===13&&io(r,t),e.codegenNode=r}else e.codegenNode=i}else if(s.length>1){let i=64;e.codegenNode=fs(t,n(rs),void 0,e.children,i+"",void 0,void 0,!0,void 0,!1)}}function Op(e,t){let n=0;const s=()=>{n--};for(;ns===e:s=>e.test(s);return(s,i)=>{if(s.type===1){const{props:r}=s;if(s.tagType===3&&r.some(fp))return;const o=[];for(let l=0;l`${Nn[e]}: _${Nn[e]}`;function kp(e,{mode:t="function",prefixIdentifiers:n=t==="module",sourceMap:s=!1,filename:i="template.vue.html",scopeId:r=null,optimizeImports:o=!1,runtimeGlobalName:l="Vue",runtimeModuleName:c="vue",ssrRuntimeModuleName:a="vue/server-renderer",ssr:u=!1,isTS:f=!1,inSSR:d=!1}){const g={mode:t,prefixIdentifiers:n,sourceMap:s,filename:i,scopeId:r,optimizeImports:o,runtimeGlobalName:l,runtimeModuleName:c,ssrRuntimeModuleName:a,ssr:u,isTS:f,inSSR:d,source:e.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper(x){return`_${Nn[x]}`},push(x,M=-2,P){g.code+=x},indent(){_(++g.indentLevel)},deindent(x=!1){x?--g.indentLevel:_(--g.indentLevel)},newline(){_(g.indentLevel)}};function _(x){g.push(` +`+" ".repeat(x),0)}return g}function Rp(e,t={}){const n=kp(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:s,push:i,prefixIdentifiers:r,indent:o,deindent:l,newline:c,scopeId:a,ssr:u}=n,f=Array.from(e.helpers),d=f.length>0,g=!r&&s!=="module";Mp(e,n);const x=u?"ssrRender":"render",P=(u?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"]).join(", ");if(i(`function ${x}(${P}) {`),o(),g&&(i("with (_ctx) {"),o(),d&&(i(`const { ${f.map(Ra).join(", ")} } = _Vue +`,-1),c())),e.components.length&&(fo(e.components,"component",n),(e.directives.length||e.temps>0)&&c()),e.directives.length&&(fo(e.directives,"directive",n),e.temps>0&&c()),e.filters&&e.filters.length&&(c(),fo(e.filters,"filter",n),c()),e.temps>0){i("let ");for(let A=0;A0?", ":""}_temp${A}`)}return(e.components.length||e.directives.length||e.temps)&&(i(` +`,0),c()),u||i("return "),e.codegenNode?Oe(e.codegenNode,n):i("null"),g&&(l(),i("}")),l(),i("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}function Mp(e,t){const{ssr:n,prefixIdentifiers:s,push:i,newline:r,runtimeModuleName:o,runtimeGlobalName:l,ssrRuntimeModuleName:c}=t,a=l,u=Array.from(e.helpers);if(u.length>0&&(i(`const _Vue = ${a} +`,-1),e.hoists.length)){const f=[Hr,Ur,ls,Kr,oa].filter(d=>u.includes(d)).map(Ra).join(", ");i(`const { ${f} } = _Vue +`,-1)}Pp(e.hoists,t),r(),i("return ")}function fo(e,t,{helper:n,push:s,newline:i,isTS:r}){const o=n(t==="filter"?Gr:t==="component"?jr:Wr);for(let l=0;l3||!1;t.push("["),n&&t.indent(),ms(e,t,n),n&&t.deindent(),t.push("]")}function ms(e,t,n=!1,s=!0){const{push:i,newline:r}=t;for(let o=0;on||"null")}function Hp(e,t){const{push:n,helper:s,pure:i}=t,r=J(e.callee)?e.callee:s(e.callee);i&&n(Ai),n(r+"(",-2,e),ms(e.arguments,t),n(")")}function Up(e,t){const{push:n,indent:s,deindent:i,newline:r}=t,{properties:o}=e;if(!o.length){n("{}",-2,e);return}const l=o.length>1||!1;n(l?"{":"{ "),l&&s();for(let c=0;c "),(c||l)&&(n("{"),s()),o?(c&&n("return "),V(o)?uo(o,t):Oe(o,t)):l&&Oe(l,t),(c||l)&&(i(),n("}")),a&&(e.isNonScopedSlot&&n(", undefined, true"),n(")"))}function qp(e,t){const{test:n,consequent:s,alternate:i,newline:r}=e,{push:o,indent:l,deindent:c,newline:a}=t;if(n.type===4){const f=!oo(n.content);f&&o("("),Ma(n,t),f&&o(")")}else o("("),Oe(n,t),o(")");r&&l(),t.indentLevel++,r||o(" "),o("? "),Oe(s,t),t.indentLevel--,r&&a(),r||o(" "),o(": ");const u=i.type===19;u||t.indentLevel++,Oe(i,t),u||t.indentLevel--,r&&c(!0)}function Wp(e,t){const{push:n,helper:s,indent:i,deindent:r,newline:o}=t;n(`_cache[${e.index}] || (`),e.isVNode&&(i(),n(`${s(di)}(-1),`),o()),n(`_cache[${e.index}] = `),Oe(e.value,t),e.isVNode&&(n(","),o(),n(`${s(di)}(1),`),o(),n(`_cache[${e.index}]`),r()),n(")")}new RegExp("\\b"+"arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield".split(",").join("\\b|\\b")+"\\b");const Gp=ka(/^(if|else|else-if)$/,(e,t,n)=>zp(e,t,n,(s,i,r)=>{const o=n.parent.children;let l=o.indexOf(s),c=0;for(;l-->=0;){const a=o[l];a&&a.type===9&&(c+=a.branches.length)}return()=>{if(r)s.codegenNode=Fa(i,c,n);else{const a=Jp(s.codegenNode);a.alternate=Fa(i,c+s.branches.length-1,n)}}}));function zp(e,t,n,s){if(t.name!=="else"&&(!t.exp||!t.exp.content.trim())){const i=t.exp?t.exp.loc:e.loc;n.onError(ae(28,t.loc)),t.exp=X("true",!1,i)}if(t.name==="if"){const i=La(e,t),r={type:9,loc:e.loc,branches:[i]};if(n.replaceNode(r),s)return s(r,i,!0)}else{const i=n.parent.children;let r=i.indexOf(e);for(;r-->=-1;){const o=i[r];if(o&&o.type===3){n.removeNode(o);continue}if(o&&o.type===2&&!o.content.trim().length){n.removeNode(o);continue}if(o&&o.type===9){t.name==="else-if"&&o.branches[o.branches.length-1].condition===void 0&&n.onError(ae(30,e.loc)),n.removeNode();const l=La(e,t);o.branches.push(l);const c=s&&s(o,l,!1);Ti(l,n),c&&c(),n.currentNode=null}else n.onError(ae(30,e.loc));break}}}function La(e,t){const n=e.tagType===3;return{type:10,loc:e.loc,condition:t.name==="else"?void 0:t.exp,children:n&&!tt(e,"for")?e.children:[e],userKey:mi(e,"key"),isTemplateIf:n}}function Fa(e,t,n){return e.condition?so(e.condition,$a(e,t,n),_e(n.helper(ls),['""',"true"])):$a(e,t,n)}function $a(e,t,n){const{helper:s}=n,i=he("key",X(`${t}`,!1,Ue,2)),{children:r}=e,o=r[0];if(r.length!==1||o.type!==1)if(r.length===1&&o.type===11){const c=o.codegenNode;return _i(c,i,n),c}else return fs(n,s(rs),ze([i]),r,64+"",void 0,void 0,!0,!1,!1,e.loc);else{const c=o.codegenNode,a=hp(c);return a.type===13&&io(a,n),_i(a,i,n),c}}function Jp(e){for(;;)if(e.type===19)if(e.alternate.type===19)e=e.alternate;else return e;else e.type===20&&(e=e.value)}const Yp=ka("for",(e,t,n)=>{const{helper:s,removeHelper:i}=n;return Xp(e,t,n,r=>{const o=_e(s(Jr),[r.source]),l=gi(e),c=tt(e,"memo"),a=mi(e,"key"),u=a&&(a.type===6?X(a.value.content,!0):a.exp),f=a?he("key",u):null,d=r.source.type===4&&r.source.constType>0,g=d?64:a?128:256;return r.codegenNode=fs(n,s(rs),void 0,o,g+"",void 0,void 0,!0,!d,!1,e.loc),()=>{let _;const{children:x}=r,M=x.length!==1||x[0].type!==1,P=yi(e)?e:l&&e.children.length===1&&yi(e.children[0])?e.children[0]:null;if(P?(_=P.codegenNode,l&&f&&_i(_,f,n)):M?_=fs(n,s(rs),f?ze([f]):void 0,e.children,"64",void 0,void 0,!0,void 0,!1):(_=x[0].codegenNode,l&&f&&_i(_,f,n),_.isBlock!==!d&&(_.isBlock?(i(nn),i(On(n.inSSR,_.isComponent))):i(xn(n.inSSR,_.isComponent))),_.isBlock=!d,_.isBlock?(s(nn),s(On(n.inSSR,_.isComponent))):s(xn(n.inSSR,_.isComponent))),c){const A=In(ho(r.parseResult,[X("_cached")]));A.body=sp([et(["const _memo = (",c.exp,")"]),et(["if (_cached",...u?[" && _cached.key === ",u]:[],` && ${n.helperString(aa)}(_cached, _memo)) return _cached`]),et(["const _item = ",_]),X("_item.memo = _memo"),X("return _item")]),o.arguments.push(A,X("_cache"),X(String(n.cached++)))}else o.arguments.push(In(ho(r.parseResult),_,!0))}})});function Xp(e,t,n,s){if(!t.exp){n.onError(ae(31,t.loc));return}const i=t.forParseResult;if(!i){n.onError(ae(32,t.loc));return}Da(i);const{addIdentifiers:r,removeIdentifiers:o,scopes:l}=n,{source:c,value:a,key:u,index:f}=i,d={type:11,loc:t.loc,source:c,valueAlias:a,keyAlias:u,objectIndexAlias:f,parseResult:i,children:gi(e)?e.children:[e]};n.replaceNode(d),l.vFor++;const g=s&&s(d);return()=>{l.vFor--,g&&g()}}function Da(e,t){e.finalized||(e.finalized=!0)}function ho({value:e,key:t,index:n},s=[]){return Zp([e,t,n,...s])}function Zp(e){let t=e.length;for(;t--&&!e[t];);return e.slice(0,t+1).map((n,s)=>n||X("_".repeat(s+1),!1))}const Va=X("undefined",!1),Qp=(e,t)=>{if(e.type===1&&(e.tagType===1||e.tagType===3)){const n=tt(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},em=(e,t,n,s)=>In(e,n,!1,!0,n.length?n[0].loc:s);function tm(e,t,n=em){t.helper(to);const{children:s,loc:i}=e,r=[],o=[];let l=t.scopes.vSlot>0||t.scopes.vFor>0;const c=tt(e,"slot",!0);if(c){const{arg:M,exp:P}=c;M&&!Le(M)&&(l=!0),r.push(he(M||X("default",!0),n(P,void 0,s,i)))}let a=!1,u=!1;const f=[],d=new Set;let g=0;for(let M=0;M{const m=n(P,void 0,A,i);return t.compatConfig&&(m.isNonScopedSlot=!0),he("default",m)};a?f.length&&f.some(P=>Ba(P))&&(u?t.onError(ae(39,f[0].loc)):r.push(M(void 0,f))):r.push(M(void 0,s))}const _=l?2:Ni(e.children)?3:1;let x=ze(r.concat(he("_",X(_+"",!1))),i);return o.length&&(x=_e(t.helper(ca),[x,us(o)])),{slots:x,hasDynamicSlots:l}}function wi(e,t,n){const s=[he("name",e),he("fn",t)];return n!=null&&s.push(he("key",X(String(n),!0))),ze(s)}function Ni(e){for(let t=0;tfunction(){if(e=t.currentNode,!(e.type===1&&(e.tagType===0||e.tagType===1)))return;const{tag:s,props:i}=e,r=e.tagType===1;let o=r?sm(e,t):`"${s}"`;const l=oe(o)&&o.callee===qr;let c,a,u,f=0,d,g,_,x=l||o===os||o===Br||!r&&(s==="svg"||s==="foreignObject");if(i.length>0){const M=Ua(e,t,void 0,r,l);c=M.props,f=M.patchFlag,g=M.dynamicPropNames;const P=M.directives;_=P&&P.length?us(P.map(A=>rm(A,t))):void 0,M.shouldUseBlock&&(x=!0)}if(e.children.length>0)if(o===fi&&(x=!0,f|=1024),r&&o!==os&&o!==fi){const{slots:P,hasDynamicSlots:A}=tm(e,t);a=P,A&&(f|=1024)}else if(e.children.length===1&&o!==os){const P=e.children[0],A=P.type,m=A===5||A===8;m&&Je(P,t)===0&&(f|=1),m||A===2?a=P:a=e.children}else a=e.children;f!==0&&(u=String(f),g&&g.length&&(d=om(g))),e.codegenNode=fs(t,o,c,a,u,d,_,!!x,!1,r,e.loc)};function sm(e,t,n=!1){let{tag:s}=e;const i=po(s),r=mi(e,"is");if(r)if(i||sn("COMPILER_IS_ON_ELEMENT",t)){const l=r.type===6?r.value&&X(r.value.content,!0):r.exp;if(l)return _e(t.helper(qr),[l])}else r.type===6&&r.value.content.startsWith("vue:")&&(s=r.value.content.slice(4));const o=ma(s)||t.isBuiltInComponent(s);return o?(n||t.helper(o),o):(t.helper(jr),t.components.add(s),ds(s,"component"))}function Ua(e,t,n=e.props,s,i,r=!1){const{tag:o,loc:l,children:c}=e;let a=[];const u=[],f=[],d=c.length>0;let g=!1,_=0,x=!1,M=!1,P=!1,A=!1,m=!1,y=!1;const S=[],C=E=>{a.length&&(u.push(ze(Ka(a),l)),a=[]),E&&u.push(E)},F=({key:E,value:T})=>{if(Le(E)){const k=E.content,w=Dt(k);if(w&&(!s||i)&&k.toLowerCase()!=="onclick"&&k!=="onUpdate:modelValue"&&!yt(k)&&(A=!0),w&&yt(k)&&(y=!0),w&&T.type===14&&(T=T.arguments[0]),T.type===20||(T.type===4||T.type===8)&&Je(T,t)>0)return;k==="ref"?x=!0:k==="class"?M=!0:k==="style"?P=!0:k!=="key"&&!S.includes(k)&&S.push(k),s&&(k==="class"||k==="style")&&!S.includes(k)&&S.push(k)}else m=!0};for(let E=0;E0&&a.push(he(X("ref_for",!0),X("true")))),w==="is"&&(po(o)||G&&G.content.startsWith("vue:")||sn("COMPILER_IS_ON_ELEMENT",t)))continue;a.push(he(X(w,!0,B),X(G?G.content:"",Q,G?G.loc:k)))}else{const{name:k,arg:w,exp:B,loc:G,modifiers:Q}=T,H=k==="bind",Y=k==="on";if(k==="slot"){s||t.onError(ae(40,G));continue}if(k==="once"||k==="memo"||k==="is"||H&&rn(w,"is")&&(po(o)||sn("COMPILER_IS_ON_ELEMENT",t))||Y&&r)continue;if((H&&rn(w,"key")||Y&&d&&rn(w,"vue:before-update"))&&(g=!0),H&&rn(w,"ref")&&t.scopes.vFor>0&&a.push(he(X("ref_for",!0),X("true"))),!w&&(H||Y)){if(m=!0,B)if(H){if(C(),sn("COMPILER_V_BIND_OBJECT_ORDER",t)){u.unshift(B);continue}u.push(B)}else C({type:14,loc:G,callee:t.helper(Zr),arguments:s?[B]:[B,"true"]});else t.onError(ae(H?34:35,G));continue}H&&Q.includes("prop")&&(_|=32);const K=t.directiveTransforms[k];if(K){const{props:je,needRuntime:$t}=K(T,e,t);!r&&je.forEach(F),Y&&w&&!Le(w)?C(ze(je,l)):a.push(...je),$t&&(f.push(T),Ye($t)&&Ha.set(T,$t))}else _f(k)||(f.push(T),d&&(g=!0))}}let b;if(u.length?(C(),u.length>1?b=_e(t.helper(hi),u,l):b=u[0]):a.length&&(b=ze(Ka(a),l)),m?_|=16:(M&&!s&&(_|=2),P&&!s&&(_|=4),S.length&&(_|=8),A&&(_|=32)),!g&&(_===0||_===32)&&(x||y||f.length>0)&&(_|=512),!t.inSSR&&b)switch(b.type){case 15:let E=-1,T=-1,k=!1;for(let G=0;Ghe(o,r)),i))}return us(n,e.loc)}function om(e){let t="[";for(let n=0,s=e.length;n{if(yi(e)){const{children:n,loc:s}=e,{slotName:i,slotProps:r}=cm(e,t),o=[t.prefixIdentifiers?"_ctx.$slots":"$slots",i,"{}","undefined","true"];let l=2;r&&(o[2]=r,l=3),n.length&&(o[3]=In([],n,!1,!1,s),l=4),t.scopeId&&!t.slotted&&(l=5),o.splice(l),e.codegenNode=_e(t.helper(la),o,s)}};function cm(e,t){let n='"default"',s;const i=[];for(let r=0;r0){const{props:r,directives:o}=Ua(e,t,i,!1,!1);s=r,o.length&&t.onError(ae(36,o[0].loc))}return{slotName:n,slotProps:s}}const am=/^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*(:[^=]+)?=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/,ja=(e,t,n,s)=>{const{loc:i,modifiers:r,arg:o}=e;!e.exp&&!r.length&&n.onError(ae(35,i));let l;if(o.type===4)if(o.isStatic){let f=o.content;f.startsWith("vue:")&&(f=`vnode-${f.slice(4)}`);const d=t.tagType!==0||f.startsWith("vnode")||!/[A-Z]/.test(f)?mn(ue(f)):`on:${f}`;l=X(d,!0,o.loc)}else l=et([`${n.helperString(eo)}(`,o,")"]);else l=o,l.children.unshift(`${n.helperString(eo)}(`),l.children.push(")");let c=e.exp;c&&!c.content.trim()&&(c=void 0);let a=n.cacheHandlers&&!c&&!n.inVOnce;if(c){const f=ga(c.content),d=!(f||am.test(c.content)),g=c.content.includes(";");(d||a&&f)&&(c=et([`${d?"$event":"(...args)"} => ${g?"{":"("}`,c,g?"}":")"]))}let u={props:[he(l,c||X("() => {}",!1,i))]};return s&&(u=s(u)),a&&(u.props[0].value=n.cache(u.props[0].value)),u.props.forEach(f=>f.key.isHandlerKey=!0),u},fm=(e,t,n)=>{const{modifiers:s,loc:i}=e,r=e.arg;let{exp:o}=e;if(o&&o.type===4&&!o.content.trim()&&(o=void 0),!o){if(r.type!==4||!r.isStatic)return n.onError(ae(52,r.loc)),{props:[he(r,X("",!0,i))]};const l=ue(r.content);o=e.exp=X(l,!1,r.loc)}return r.type!==4?(r.children.unshift("("),r.children.push(') || ""')):r.isStatic||(r.content=`${r.content} || ""`),s.includes("camel")&&(r.type===4?r.isStatic?r.content=ue(r.content):r.content=`${n.helperString(Qr)}(${r.content})`:(r.children.unshift(`${n.helperString(Qr)}(`),r.children.push(")"))),n.inSSR||(s.includes("prop")&&qa(r,"."),s.includes("attr")&&qa(r,"^")),{props:[he(r,o)]}},qa=(e,t)=>{e.type===4?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},um=(e,t)=>{if(e.type===0||e.type===1||e.type===11||e.type===10)return()=>{const n=e.children;let s,i=!1;for(let r=0;rr.type===7&&!t.directiveTransforms[r.name])&&e.tag!=="template")))for(let r=0;r{if(e.type===1&&tt(e,"once",!0))return Wa.has(e)||t.inVOnce||t.inSSR?void 0:(Wa.add(e),t.inVOnce=!0,t.helper(di),()=>{t.inVOnce=!1;const n=t.currentNode;n.codegenNode&&(n.codegenNode=t.cache(n.codegenNode,!0))})},Ga=(e,t,n)=>{const{exp:s,arg:i}=e;if(!s)return n.onError(ae(41,e.loc)),Ii();const r=s.loc.source,o=s.type===4?s.content:r,l=n.bindingMetadata[r];if(l==="props"||l==="props-aliased")return n.onError(ae(44,s.loc)),Ii();if(!o.trim()||!ga(o)&&!!1)return n.onError(ae(42,s.loc)),Ii();const a=i||X("modelValue",!0),u=i?Le(i)?`onUpdate:${ue(i.content)}`:et(['"onUpdate:" + ',i]):"onUpdate:modelValue";let f;const d=n.isTS?"($event: any)":"$event";f=et([`${d} => ((`,s,") = $event)"]);const g=[he(a,e.exp),he(u,f)];if(e.modifiers.length&&t.tagType===1){const _=e.modifiers.map(M=>(oo(M)?M:JSON.stringify(M))+": true").join(", "),x=i?Le(i)?`${i.content}Modifiers`:et([i,' + "Modifiers"']):"modelModifiers";g.push(he(x,X(`{ ${_} }`,!1,e.loc,2)))}return Ii(g)};function Ii(e=[]){return{props:e}}const dm=/[\w).+\-_$\]]/,pm=(e,t)=>{sn("COMPILER_FILTERS",t)&&(e.type===5&&xi(e.content,t),e.type===1&&e.props.forEach(n=>{n.type===7&&n.name!=="for"&&n.exp&&xi(n.exp,t)}))};function xi(e,t){if(e.type===4)za(e,t);else for(let n=0;n=0&&(A=n.charAt(P),A===" ");P--);(!A||!dm.test(A))&&(o=!0)}}_===void 0?_=n.slice(0,g).trim():u!==0&&M();function M(){x.push(n.slice(u,g).trim()),u=g+1}if(x.length){for(g=0;g{if(e.type===1){const n=tt(e,"memo");return!n||Ja.has(e)?void 0:(Ja.add(e),()=>{const s=e.codegenNode||t.currentNode.codegenNode;s&&s.type===13&&(e.tagType!==1&&io(s,t),e.codegenNode=_e(t.helper(no),[n.exp,In(void 0,s),"_cache",String(t.cached++)]))})}};function ym(e){return[[hm,Gp,gm,Yp,pm,lm,nm,Qp,um],{on:ja,bind:fm,model:Ga}]}function _m(e,t={}){const n=t.onError||ro,s=t.mode==="module";t.prefixIdentifiers===!0?n(ae(47)):s&&n(ae(48));const i=!1;t.cacheHandlers&&n(ae(49)),t.scopeId&&!s&&n(ae(50));const r=ne({},t,{prefixIdentifiers:i}),o=J(e)?Tp(e,r):e,[l,c]=ym();return Ip(o,ne({},r,{nodeTransforms:[...l,...t.nodeTransforms||[]],directiveTransforms:ne({},c,t.directiveTransforms||{})})),Rp(o,r)}const bm=()=>({props:[]});/** +* @vue/compiler-dom v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const Ya=Symbol(""),Xa=Symbol(""),Za=Symbol(""),Qa=Symbol(""),mo=Symbol(""),ef=Symbol(""),tf=Symbol(""),nf=Symbol(""),sf=Symbol(""),rf=Symbol("");ep({[Ya]:"vModelRadio",[Xa]:"vModelCheckbox",[Za]:"vModelText",[Qa]:"vModelSelect",[mo]:"vModelDynamic",[ef]:"withModifiers",[tf]:"withKeys",[nf]:"vShow",[sf]:"Transition",[rf]:"TransitionGroup"});let kn;function Sm(e,t=!1){return kn||(kn=document.createElement("div")),t?(kn.innerHTML=`
`,kn.children[0].getAttribute("foo")):(kn.innerHTML=e,kn.textContent)}const vm={parseMode:"html",isVoidTag:Mf,isNativeTag:e=>Of(e)||kf(e)||Rf(e),isPreTag:e=>e==="pre",decodeEntities:Sm,isBuiltInComponent:e=>{if(e==="Transition"||e==="transition")return sf;if(e==="TransitionGroup"||e==="transition-group")return rf},getNamespace(e,t,n){let s=t?t.ns:n;if(t&&s===2)if(t.tag==="annotation-xml"){if(e==="svg")return 1;t.props.some(i=>i.type===6&&i.name==="encoding"&&i.value!=null&&(i.value.content==="text/html"||i.value.content==="application/xhtml+xml"))&&(s=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&e!=="mglyph"&&e!=="malignmark"&&(s=0);else t&&s===1&&(t.tag==="foreignObject"||t.tag==="desc"||t.tag==="title")&&(s=0);if(s===0){if(e==="svg")return 1;if(e==="math")return 2}return s}},Em=e=>{e.type===1&&e.props.forEach((t,n)=>{t.type===6&&t.name==="style"&&t.value&&(e.props[n]={type:7,name:"bind",arg:X("style",!0,t.loc),exp:Cm(t.value.content,t.loc),modifiers:[],loc:t.loc})})},Cm=(e,t)=>{const n=To(e);return X(JSON.stringify(n),!1,t,3)};function Ft(e,t){return ae(e,t)}const Tm=(e,t,n)=>{const{exp:s,loc:i}=e;return s||n.onError(Ft(53,i)),t.children.length&&(n.onError(Ft(54,i)),t.children.length=0),{props:[he(X("innerHTML",!0,i),s||X("",!0))]}},Am=(e,t,n)=>{const{exp:s,loc:i}=e;return s||n.onError(Ft(55,i)),t.children.length&&(n.onError(Ft(56,i)),t.children.length=0),{props:[he(X("textContent",!0),s?Je(s,n)>0?s:_e(n.helperString(ui),[s],i):X("",!0))]}},wm=(e,t,n)=>{const s=Ga(e,t,n);if(!s.props.length||t.tagType===1)return s;e.arg&&n.onError(Ft(58,e.arg.loc));const{tag:i}=t,r=n.isCustomElement(i);if(i==="input"||i==="textarea"||i==="select"||r){let o=Za,l=!1;if(i==="input"||r){const c=mi(t,"type");if(c){if(c.type===7)o=mo;else if(c.value)switch(c.value.content){case"radio":o=Ya;break;case"checkbox":o=Xa;break;case"file":l=!0,n.onError(Ft(59,e.loc));break}}else ap(t)&&(o=mo)}else i==="select"&&(o=Qa);l||(s.needRuntime=n.helper(o))}else n.onError(Ft(57,e.loc));return s.props=s.props.filter(o=>!(o.key.type===4&&o.key.content==="modelValue")),s},Nm=$e("passive,once,capture"),Im=$e("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),xm=$e("left,right"),of=$e("onkeyup,onkeydown,onkeypress",!0),Om=(e,t,n,s)=>{const i=[],r=[],o=[];for(let l=0;lLe(e)&&e.content.toLowerCase()==="onclick"?X(t,!0):e.type!==4?et(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e,km=(e,t,n)=>ja(e,t,n,s=>{const{modifiers:i}=e;if(!i.length)return s;let{key:r,value:o}=s.props[0];const{keyModifiers:l,nonKeyModifiers:c,eventOptionModifiers:a}=Om(r,i,n,e.loc);if(c.includes("right")&&(r=lf(r,"onContextmenu")),c.includes("middle")&&(r=lf(r,"onMouseup")),c.length&&(o=_e(n.helper(ef),[o,JSON.stringify(c)])),l.length&&(!Le(r)||of(r.content))&&(o=_e(n.helper(tf),[o,JSON.stringify(l)])),a.length){const u=a.map(Bt).join("");r=Le(r)?X(`${r.content}${u}`,!0):et(["(",r,`) + "${u}"`])}return{props:[he(r,o)]}}),Rm=(e,t,n)=>{const{exp:s,loc:i}=e;return s||n.onError(Ft(61,i)),{props:[],needRuntime:n.helper(nf)}},Mm=(e,t)=>{e.type===1&&e.tagType===0&&(e.tag==="script"||e.tag==="style")&&t.removeNode()},Pm=[Em],Lm={cloak:bm,html:Tm,text:Am,model:wm,on:km,show:Rm};function Fm(e,t={}){return _m(e,ne({},vm,t,{nodeTransforms:[Mm,...Pm,...t.nodeTransforms||[]],directiveTransforms:ne({},Lm,t.directiveTransforms||{}),transformHoist:null}))}/** +* vue v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const cf=new WeakMap;function $m(e){let t=cf.get(e??ie);return t||(t=Object.create(null),cf.set(e??ie,t)),t}function Dm(e,t){if(!J(e))if(e.nodeType)e=e.innerHTML;else return ge;const n=e,s=$m(t),i=s[n];if(i)return i;if(e[0]==="#"){const c=document.querySelector(e);e=c?c.innerHTML:""}const r=ne({hoistStatic:!0,onError:void 0,onWarn:ge},t);!r.isCustomElement&&typeof customElements<"u"&&(r.isCustomElement=c=>!!customElements.get(c));const{code:o}=Fm(e,r),l=new Function("Vue",o)(zd);return l._rc=!0,s[n]=l}ac(Dm);const Vm={name:"App",data(){return{isSidebarOpen:!1,swUpdateEvent:null}},computed:{pageClasses(){return[{"sidebar-open":this.isSidebarOpen}]}},methods:{toggleSidebar(e){this.isSidebarOpen=typeof e=="boolean"?e:!this.isSidebarOpen}}},an=(e,t)=>{const n=e.__vccOpts||e;for(const[s,i]of t)n[s]=i;return n},Bm={},Hm={class:"icon outbound",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},Um=[Ne("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"},null,-1),Ne("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"},null,-1)];function Km(e,t){return Ze(),Nt("svg",Hm,Um)}const jm=an(Bm,[["render",Km]]),qm={},Wm=[Ne("svg",{class:"icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"},[Ne("path",{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z",class:""})],-1)];function Gm(e,t){return Ze(),Nt("div",{class:"sidebar-button",onClick:t[0]||(t[0]=n=>e.$emit("toggle-sidebar"))},Wm)}const zm=an(qm,[["render",Gm]]);function af(e,t,n){e.remove(...n);const s=[...e];e.value="",e.add(...t,...s)}const Jm={data(){return{darkmode:"auto"}},mounted(){const e=localStorage.getItem("darkmode");this.setDarkmode(e||"auto")},methods:{setDarkmode(e){if(console.log(e),e==="on")this.toggleDarkmode(!0);else if(e==="off")this.toggleDarkmode(!1);else{const t=window.matchMedia("(prefers-color-scheme: dark)").matches,n=window.matchMedia("(prefers-color-scheme: light)").matches;if(window.matchMedia("(prefers-color-scheme: dark)").addListener(s=>s.matches&&this.toggleDarkmode(!0)),window.matchMedia("(prefers-color-scheme: light)").addListener(s=>s.matches&&this.toggleDarkmode(!1)),t)this.toggleDarkmode(!0);else if(n)this.toggleDarkmode(!1);else{const s=new Date().getHours();this.toggleDarkmode(s<6||s>=18)}}this.darkmode=e,localStorage.setItem("darkmode",e)},toggleDarkmode(e){const t=document.body.classList;e?af(t,["theme-dark"],["theme-light"]):af(t,["theme-light"],["theme-dark"])}}},Ym={class:"darkmode-switch"},Xm=[Ne("svg",{class:"icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[Ne("path",{d:"M512 256a42.666667 42.666667 0 0 0 42.666667-42.666667V128a42.666667 42.666667 0 0 0-85.333334 0v85.333333a42.666667 42.666667 0 0 0 42.666667 42.666667zM896 469.333333h-85.333333a42.666667 42.666667 0 0 0 0 85.333334h85.333333a42.666667 42.666667 0 0 0 0-85.333334zM256 512a42.666667 42.666667 0 0 0-42.666667-42.666667H128a42.666667 42.666667 0 0 0 0 85.333334h85.333333a42.666667 42.666667 0 0 0 42.666667-42.666667zM265.386667 213.333333a42.666667 42.666667 0 0 0-59.306667 62.72l61.44 59.306667a42.666667 42.666667 0 0 0 31.146667 11.946667 42.666667 42.666667 0 0 0 30.72-13.226667 42.666667 42.666667 0 0 0 0-60.16zM725.333333 347.306667a42.666667 42.666667 0 0 0 29.44-11.946667l61.44-59.306667A42.666667 42.666667 0 0 0 758.613333 213.333333l-61.44 60.586667a42.666667 42.666667 0 0 0 0 60.16 42.666667 42.666667 0 0 0 28.16 13.226667zM512 768a42.666667 42.666667 0 0 0-42.666667 42.666667v85.333333a42.666667 42.666667 0 0 0 85.333334 0v-85.333333a42.666667 42.666667 0 0 0-42.666667-42.666667zM756.48 688.64a42.666667 42.666667 0 0 0-59.306667 61.44L758.613333 810.666667a42.666667 42.666667 0 0 0 29.44 11.946666 42.666667 42.666667 0 0 0 30.72-12.8 42.666667 42.666667 0 0 0 0-60.586666zM267.52 688.64l-61.44 59.306667a42.666667 42.666667 0 0 0 0 60.586666 42.666667 42.666667 0 0 0 30.72 12.8 42.666667 42.666667 0 0 0 28.586667-10.666666l61.44-59.306667a42.666667 42.666667 0 0 0-59.306667-61.44zM512 341.333333a170.666667 170.666667 0 1 0 170.666667 170.666667 170.666667 170.666667 0 0 0-170.666667-170.666667z"})],-1)],Zm=[Ne("svg",{class:"icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[Ne("path",{d:"M460.864 539.072h103.936l-54.208-163.072-49.728 163.072z m411.136-176.704V149.504h-212.352L510.528 0l-149.12 149.504H149.12v212.928L0 511.872l149.12 149.504v212.928h212.352l149.12 149.504 149.12-149.504h212.352v-212.928l149.12-149.504-149.184-149.504zM614.464 693.12l-31.616-90.624H438.272l-31.616 90.624H320.768l144.576-407.68h90.368l144.576 407.68H614.464z m0 0"})],-1)],Qm=[Ne("svg",{class:"icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[Ne("path",{d:"M935.538601 630.40178c-11.43005-11.432249-28.673759-14.738607-43.531086-8.353536-46.733115 20.10317-96.362866 30.296859-147.50719 30.296859-99.589478 0-193.221796-38.783705-263.640252-109.20316-108.636744-108.636744-139.609745-270.022125-78.9083-411.148441 6.388069-14.85233 3.078713-32.098837-8.353536-43.532285-11.432249-11.432249-28.675758-14.743604-43.532285-8.354536-52.637312 22.64025-100.017388 54.809439-140.82552 95.616372-85.346135 85.346135-132.346869 198.821199-132.346869 319.519766 0 120.699566 47.001733 234.172631 132.347868 319.518766s198.821199 132.349067 319.517567 132.349067c120.699566 0 234.172431-47.002932 319.520765-132.351066 40.808132-40.810131 72.977122-88.190207 95.615373-140.82552C950.282205 659.081735 946.971849 641.834029 935.538601 630.40178z","p-id":"3638"})],-1)];function eg(e,t,n,s,i,r){return Ze(),Nt("div",Ym,[Ne("div",{class:_t(["item day",{active:i.darkmode==="off"}]),onClick:t[0]||(t[0]=o=>r.setDarkmode("off"))},Xm,2),Ne("div",{class:_t(["item auto",{active:i.darkmode==="auto"}]),onClick:t[1]||(t[1]=o=>r.setDarkmode("auto"))},Zm,2),Ne("div",{class:_t(["item night",{active:i.darkmode==="on"}]),onClick:t[2]||(t[2]=o=>r.setDarkmode("on"))},Qm,2)])}const tg={components:{SidebarButton:zm,DarkmodeSwitch:an(Jm,[["render",eg]])}},ng={class:"navbar"};function sg(e,t,n,s,i,r){const o=tr("SidebarButton"),l=tr("DarkmodeSwitch");return Ze(),Nt("header",ng,[ce(o,{onToggleSidebar:t[0]||(t[0]=c=>e.$emit("toggle-sidebar"))}),Cn(e.$slots,"default"),ce(l)])}const ig=an(tg,[["render",sg]]),rg={},og={class:"nav-links"};function lg(e,t,n,s,i,r){return Ze(),Nt("nav",og,[Cn(e.$slots,"default")])}const cg=an(rg,[["render",lg]]),ag={},fg={class:"vp-sidebar"};function ug(e,t,n,s,i,r){return Ze(),Nt("div",fg,[Cn(e.$slots,"default")])}const hg=an(ag,[["render",ug]]),dg={},pg={class:"page"};function mg(e,t,n,s,i,r){return Ze(),Nt("div",pg,[Cn(e.$slots,"default"),Cn(e.$slots,"bottom")])}const gg=an(dg,[["render",mg]]),fn=Qc(Vm);fn.component("outboundlink",jm),fn.component("navbar",ig),fn.component("navlinks",cg),fn.component("sidebar",hg),fn.component("page",gg),fn.component("router-link",{props:["to"],template:''}),fn.mount("#app",!0)})(); diff --git a/allocation.html b/allocation.html new file mode 100644 index 0000000..c149d5b --- /dev/null +++ b/allocation.html @@ -0,0 +1,238 @@ + + + + + + + ACCESS allocation management + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

ACCESS allocation management

+

This project (and others in the group) are supported in large part by computing resource allocations, e.g. from NSF ACCESS. When our group is granted ACCESS credits, we need to exchange them for the resources our group requires. This guide explains some details about that process.

+
+

Viewing Resources

+

Users with the Allocation Manager role can view available allocations on the ACCESS website. The different tabs show available resources, current users, and request history. The figure below shows the “Credits + Resouces” tab that is useful for viewing how much of each allocated resource remains.

+ACCESS Allocation UI +
+
+

Making Requests

+

To request more resources, increase the associated “Balance” box on the right to the desired amount. Doing this will preview the exchange of credits for resources in the visualization of the balances. To submit the request, add a 1-2 sentence justification in the explanation box near the bottom of the page. This justification should mention what efforts the exchange will support and the basic reasons why the resources are being requested (at an approximate level). For example, the justification below accompanied a request for 5,000 Expanse GPUh:

+

We will continue to perform GPU-accelerated time series feature generation on 20 more ZTF fields containing ~56 million light curves. At ~0.25s per lightcurve, and considering the added memory requirements of some fields leading to greater credit expenditure, we request an additional 5,000 Expanse GPUh.

+

Note that it is always possible to turn unused resources back into the equivalent amount of credits. Use the Exchange Calculator to calculate the exchange rates between credits and resources. From experience, ACCESS prefers not to allocate vast quantities of a single resource at once. Instead, more manageable requests should be made at regular intervals.

+
+ +
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/data/DNN_performance.png b/data/DNN_performance.png new file mode 100644 index 0000000..966ec24 Binary files /dev/null and b/data/DNN_performance.png differ diff --git a/data/XGB_performance.png b/data/XGB_performance.png new file mode 100644 index 0000000..d8707d2 Binary files /dev/null and b/data/XGB_performance.png differ diff --git a/data/access_credit_view.png b/data/access_credit_view.png new file mode 100644 index 0000000..7e0de90 Binary files /dev/null and b/data/access_credit_view.png differ diff --git a/data/beta_lyr.png b/data/beta_lyr.png new file mode 100644 index 0000000..5450acc Binary files /dev/null and b/data/beta_lyr.png differ diff --git a/data/bogus_1.png b/data/bogus_1.png new file mode 100644 index 0000000..1363a89 Binary files /dev/null and b/data/bogus_1.png differ diff --git a/data/bogus_2.png b/data/bogus_2.png new file mode 100644 index 0000000..26b8811 Binary files /dev/null and b/data/bogus_2.png differ diff --git a/data/cepheid_1O.png b/data/cepheid_1O.png new file mode 100644 index 0000000..3328ed7 Binary files /dev/null and b/data/cepheid_1O.png differ diff --git a/data/cepheid_F.png b/data/cepheid_F.png new file mode 100644 index 0000000..a2c06f8 Binary files /dev/null and b/data/cepheid_F.png differ diff --git a/data/cepheid_F1O.png b/data/cepheid_F1O.png new file mode 100644 index 0000000..652ae92 Binary files /dev/null and b/data/cepheid_F1O.png differ diff --git a/data/cepheid_F_1.png b/data/cepheid_F_1.png new file mode 100644 index 0000000..7135754 Binary files /dev/null and b/data/cepheid_F_1.png differ diff --git a/data/cv_Novalike.png b/data/cv_Novalike.png new file mode 100644 index 0000000..cd15550 Binary files /dev/null and b/data/cv_Novalike.png differ diff --git a/data/cv_SU_UMa.png b/data/cv_SU_UMa.png new file mode 100644 index 0000000..b529c57 Binary files /dev/null and b/data/cv_SU_UMa.png differ diff --git a/data/cv_U_Gem.png b/data/cv_U_Gem.png new file mode 100644 index 0000000..8da1027 Binary files /dev/null and b/data/cv_U_Gem.png differ diff --git a/data/cv_Z_Cam.png b/data/cv_Z_Cam.png new file mode 100644 index 0000000..18fac5f Binary files /dev/null and b/data/cv_Z_Cam.png differ diff --git a/data/delta_scuti.png b/data/delta_scuti.png new file mode 100644 index 0000000..5b4666b Binary files /dev/null and b/data/delta_scuti.png differ diff --git a/data/flaring_dwarfnova.png b/data/flaring_dwarfnova.png new file mode 100644 index 0000000..d3d6250 Binary files /dev/null and b/data/flaring_dwarfnova.png differ diff --git a/data/flaring_mdwarf.png b/data/flaring_mdwarf.png new file mode 100644 index 0000000..ae6db6e Binary files /dev/null and b/data/flaring_mdwarf.png differ diff --git a/data/gaia_hr_histogram.dat b/data/gaia_hr_histogram.dat new file mode 100644 index 0000000..e771fc2 --- /dev/null +++ b/data/gaia_hr_histogram.dat @@ -0,0 +1,200 @@ +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 3.400000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.100000000000000000e+01 3.700000000000000000e+01 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.700000000000000000e+01 6.200000000000000000e+01 4.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.300000000000000000e+01 5.700000000000000000e+01 6.300000000000000000e+01 3.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.400000000000000000e+01 9.100000000000000000e+01 9.700000000000000000e+01 4.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.500000000000000000e+01 9.600000000000000000e+01 1.360000000000000000e+02 8.200000000000000000e+01 4.800000000000000000e+01 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.800000000000000000e+01 1.030000000000000000e+02 1.240000000000000000e+02 8.500000000000000000e+01 5.900000000000000000e+01 3.700000000000000000e+01 nan 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.400000000000000000e+01 9.100000000000000000e+01 1.450000000000000000e+02 1.190000000000000000e+02 5.200000000000000000e+01 4.600000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.300000000000000000e+01 8.700000000000000000e+01 1.200000000000000000e+02 9.900000000000000000e+01 6.500000000000000000e+01 2.900000000000000000e+01 nan 3.100000000000000000e+01 3.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.400000000000000000e+01 9.900000000000000000e+01 1.220000000000000000e+02 1.070000000000000000e+02 5.700000000000000000e+01 5.400000000000000000e+01 3.400000000000000000e+01 2.700000000000000000e+01 3.800000000000000000e+01 3.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.900000000000000000e+01 9.500000000000000000e+01 1.390000000000000000e+02 1.090000000000000000e+02 8.100000000000000000e+01 5.100000000000000000e+01 2.600000000000000000e+01 2.500000000000000000e+01 3.300000000000000000e+01 2.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 5.900000000000000000e+01 1.140000000000000000e+02 1.840000000000000000e+02 1.220000000000000000e+02 8.400000000000000000e+01 6.200000000000000000e+01 4.600000000000000000e+01 4.000000000000000000e+01 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 6.600000000000000000e+01 1.390000000000000000e+02 1.420000000000000000e+02 1.110000000000000000e+02 9.900000000000000000e+01 6.200000000000000000e+01 4.200000000000000000e+01 4.200000000000000000e+01 3.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 6.400000000000000000e+01 1.370000000000000000e+02 1.350000000000000000e+02 9.100000000000000000e+01 7.000000000000000000e+01 7.100000000000000000e+01 5.800000000000000000e+01 4.500000000000000000e+01 4.300000000000000000e+01 3.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.200000000000000000e+01 nan 2.700000000000000000e+01 2.900000000000000000e+01 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.600000000000000000e+01 8.200000000000000000e+01 1.450000000000000000e+02 1.280000000000000000e+02 1.030000000000000000e+02 6.800000000000000000e+01 7.000000000000000000e+01 7.200000000000000000e+01 5.300000000000000000e+01 3.400000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 nan nan nan 2.700000000000000000e+01 2.900000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.200000000000000000e+01 9.500000000000000000e+01 1.390000000000000000e+02 9.800000000000000000e+01 9.500000000000000000e+01 7.700000000000000000e+01 1.000000000000000000e+02 7.200000000000000000e+01 6.100000000000000000e+01 4.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 nan 3.200000000000000000e+01 2.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.100000000000000000e+01 1.120000000000000000e+02 1.370000000000000000e+02 9.800000000000000000e+01 7.600000000000000000e+01 7.100000000000000000e+01 7.500000000000000000e+01 7.100000000000000000e+01 6.500000000000000000e+01 5.900000000000000000e+01 2.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.900000000000000000e+01 2.800000000000000000e+01 3.000000000000000000e+01 3.000000000000000000e+01 3.400000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.400000000000000000e+01 9.800000000000000000e+01 1.460000000000000000e+02 9.700000000000000000e+01 9.100000000000000000e+01 6.300000000000000000e+01 9.000000000000000000e+01 8.800000000000000000e+01 7.400000000000000000e+01 5.500000000000000000e+01 3.200000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 2.500000000000000000e+01 2.900000000000000000e+01 2.600000000000000000e+01 2.700000000000000000e+01 4.100000000000000000e+01 3.400000000000000000e+01 3.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.300000000000000000e+01 7.200000000000000000e+01 9.900000000000000000e+01 1.300000000000000000e+02 9.800000000000000000e+01 6.600000000000000000e+01 6.600000000000000000e+01 8.000000000000000000e+01 8.800000000000000000e+01 6.800000000000000000e+01 4.500000000000000000e+01 3.800000000000000000e+01 3.400000000000000000e+01 2.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 nan nan 3.300000000000000000e+01 3.200000000000000000e+01 4.200000000000000000e+01 2.800000000000000000e+01 3.900000000000000000e+01 4.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.500000000000000000e+01 5.200000000000000000e+01 1.050000000000000000e+02 1.440000000000000000e+02 9.500000000000000000e+01 9.300000000000000000e+01 8.600000000000000000e+01 8.000000000000000000e+01 9.500000000000000000e+01 6.500000000000000000e+01 4.200000000000000000e+01 3.800000000000000000e+01 3.400000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 nan 2.500000000000000000e+01 3.500000000000000000e+01 3.800000000000000000e+01 5.500000000000000000e+01 4.700000000000000000e+01 4.000000000000000000e+01 3.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.600000000000000000e+01 6.600000000000000000e+01 1.000000000000000000e+02 1.540000000000000000e+02 9.700000000000000000e+01 8.100000000000000000e+01 8.000000000000000000e+01 9.700000000000000000e+01 1.020000000000000000e+02 6.200000000000000000e+01 4.800000000000000000e+01 4.300000000000000000e+01 4.000000000000000000e+01 3.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.800000000000000000e+01 2.700000000000000000e+01 nan nan 3.100000000000000000e+01 3.700000000000000000e+01 2.600000000000000000e+01 4.400000000000000000e+01 4.700000000000000000e+01 4.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 4.500000000000000000e+01 5.200000000000000000e+01 1.110000000000000000e+02 1.450000000000000000e+02 1.030000000000000000e+02 7.600000000000000000e+01 8.100000000000000000e+01 9.300000000000000000e+01 8.400000000000000000e+01 6.000000000000000000e+01 6.600000000000000000e+01 3.800000000000000000e+01 3.500000000000000000e+01 3.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 3.300000000000000000e+01 3.600000000000000000e+01 3.800000000000000000e+01 4.600000000000000000e+01 5.700000000000000000e+01 7.700000000000000000e+01 4.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 5.900000000000000000e+01 1.010000000000000000e+02 1.430000000000000000e+02 9.600000000000000000e+01 9.000000000000000000e+01 8.200000000000000000e+01 9.600000000000000000e+01 8.400000000000000000e+01 7.200000000000000000e+01 5.300000000000000000e+01 4.800000000000000000e+01 4.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 2.900000000000000000e+01 3.600000000000000000e+01 2.500000000000000000e+01 4.300000000000000000e+01 3.500000000000000000e+01 3.500000000000000000e+01 3.700000000000000000e+01 5.100000000000000000e+01 6.100000000000000000e+01 3.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.400000000000000000e+01 6.900000000000000000e+01 9.600000000000000000e+01 1.190000000000000000e+02 1.160000000000000000e+02 9.000000000000000000e+01 9.800000000000000000e+01 8.200000000000000000e+01 9.600000000000000000e+01 4.900000000000000000e+01 4.700000000000000000e+01 3.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.300000000000000000e+01 3.600000000000000000e+01 4.000000000000000000e+01 3.700000000000000000e+01 5.300000000000000000e+01 5.700000000000000000e+01 6.500000000000000000e+01 5.500000000000000000e+01 3.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.700000000000000000e+01 7.900000000000000000e+01 1.140000000000000000e+02 1.150000000000000000e+02 1.050000000000000000e+02 1.030000000000000000e+02 7.700000000000000000e+01 8.200000000000000000e+01 8.000000000000000000e+01 4.900000000000000000e+01 4.700000000000000000e+01 4.600000000000000000e+01 2.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.200000000000000000e+01 3.300000000000000000e+01 4.200000000000000000e+01 3.700000000000000000e+01 6.000000000000000000e+01 3.900000000000000000e+01 7.400000000000000000e+01 6.300000000000000000e+01 6.400000000000000000e+01 3.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.100000000000000000e+01 4.300000000000000000e+01 8.500000000000000000e+01 1.100000000000000000e+02 1.270000000000000000e+02 1.070000000000000000e+02 8.900000000000000000e+01 8.300000000000000000e+01 9.000000000000000000e+01 7.300000000000000000e+01 7.400000000000000000e+01 5.800000000000000000e+01 4.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.700000000000000000e+01 4.000000000000000000e+01 5.200000000000000000e+01 5.200000000000000000e+01 6.900000000000000000e+01 5.400000000000000000e+01 8.000000000000000000e+01 1.040000000000000000e+02 7.000000000000000000e+01 3.400000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 4.500000000000000000e+01 8.200000000000000000e+01 1.070000000000000000e+02 1.080000000000000000e+02 9.600000000000000000e+01 8.200000000000000000e+01 8.700000000000000000e+01 8.600000000000000000e+01 6.700000000000000000e+01 6.400000000000000000e+01 5.500000000000000000e+01 3.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 3.100000000000000000e+01 2.700000000000000000e+01 4.000000000000000000e+01 4.900000000000000000e+01 4.800000000000000000e+01 6.500000000000000000e+01 6.500000000000000000e+01 8.900000000000000000e+01 8.200000000000000000e+01 9.400000000000000000e+01 1.050000000000000000e+02 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.800000000000000000e+01 3.800000000000000000e+01 8.500000000000000000e+01 1.200000000000000000e+02 1.080000000000000000e+02 1.010000000000000000e+02 7.900000000000000000e+01 9.100000000000000000e+01 7.500000000000000000e+01 6.700000000000000000e+01 6.000000000000000000e+01 5.500000000000000000e+01 3.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.000000000000000000e+01 3.300000000000000000e+01 4.600000000000000000e+01 4.400000000000000000e+01 7.400000000000000000e+01 7.000000000000000000e+01 5.400000000000000000e+01 1.050000000000000000e+02 9.600000000000000000e+01 1.150000000000000000e+02 1.170000000000000000e+02 7.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 4.700000000000000000e+01 8.500000000000000000e+01 1.180000000000000000e+02 1.180000000000000000e+02 9.500000000000000000e+01 8.800000000000000000e+01 7.400000000000000000e+01 8.000000000000000000e+01 6.300000000000000000e+01 5.400000000000000000e+01 5.500000000000000000e+01 3.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.500000000000000000e+01 3.000000000000000000e+01 4.400000000000000000e+01 3.200000000000000000e+01 6.300000000000000000e+01 5.800000000000000000e+01 5.500000000000000000e+01 8.900000000000000000e+01 1.030000000000000000e+02 9.900000000000000000e+01 1.330000000000000000e+02 1.530000000000000000e+02 8.800000000000000000e+01 2.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 3.900000000000000000e+01 7.900000000000000000e+01 1.200000000000000000e+02 1.130000000000000000e+02 9.100000000000000000e+01 6.900000000000000000e+01 7.600000000000000000e+01 7.100000000000000000e+01 7.700000000000000000e+01 7.900000000000000000e+01 3.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 3.500000000000000000e+01 3.700000000000000000e+01 5.000000000000000000e+01 6.200000000000000000e+01 5.600000000000000000e+01 8.000000000000000000e+01 7.700000000000000000e+01 8.900000000000000000e+01 9.800000000000000000e+01 1.060000000000000000e+02 1.410000000000000000e+02 1.860000000000000000e+02 1.150000000000000000e+02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.800000000000000000e+01 7.800000000000000000e+01 8.500000000000000000e+01 1.010000000000000000e+02 7.200000000000000000e+01 1.000000000000000000e+02 9.500000000000000000e+01 6.500000000000000000e+01 6.800000000000000000e+01 5.000000000000000000e+01 2.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.700000000000000000e+01 3.200000000000000000e+01 3.900000000000000000e+01 4.900000000000000000e+01 5.800000000000000000e+01 7.000000000000000000e+01 7.600000000000000000e+01 1.040000000000000000e+02 1.220000000000000000e+02 1.290000000000000000e+02 1.430000000000000000e+02 1.920000000000000000e+02 2.650000000000000000e+02 2.030000000000000000e+02 7.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.600000000000000000e+01 4.400000000000000000e+01 7.000000000000000000e+01 1.090000000000000000e+02 8.700000000000000000e+01 8.200000000000000000e+01 7.600000000000000000e+01 6.500000000000000000e+01 7.800000000000000000e+01 6.500000000000000000e+01 3.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.800000000000000000e+01 2.900000000000000000e+01 4.100000000000000000e+01 6.600000000000000000e+01 6.600000000000000000e+01 7.100000000000000000e+01 8.900000000000000000e+01 9.900000000000000000e+01 1.070000000000000000e+02 1.360000000000000000e+02 1.880000000000000000e+02 2.470000000000000000e+02 2.970000000000000000e+02 3.520000000000000000e+02 3.030000000000000000e+02 1.770000000000000000e+02 6.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 4.600000000000000000e+01 8.000000000000000000e+01 9.600000000000000000e+01 7.800000000000000000e+01 7.400000000000000000e+01 6.700000000000000000e+01 6.700000000000000000e+01 5.900000000000000000e+01 6.400000000000000000e+01 3.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.400000000000000000e+01 3.800000000000000000e+01 4.000000000000000000e+01 5.200000000000000000e+01 6.500000000000000000e+01 8.600000000000000000e+01 1.020000000000000000e+02 1.140000000000000000e+02 1.260000000000000000e+02 1.670000000000000000e+02 2.070000000000000000e+02 2.340000000000000000e+02 2.970000000000000000e+02 3.520000000000000000e+02 4.000000000000000000e+02 3.880000000000000000e+02 3.610000000000000000e+02 1.820000000000000000e+02 5.400000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.800000000000000000e+01 5.900000000000000000e+01 8.600000000000000000e+01 1.040000000000000000e+02 8.800000000000000000e+01 6.700000000000000000e+01 7.900000000000000000e+01 6.900000000000000000e+01 7.500000000000000000e+01 3.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.600000000000000000e+01 3.100000000000000000e+01 3.000000000000000000e+01 5.000000000000000000e+01 6.600000000000000000e+01 5.900000000000000000e+01 8.100000000000000000e+01 8.400000000000000000e+01 1.100000000000000000e+02 1.140000000000000000e+02 1.510000000000000000e+02 1.810000000000000000e+02 2.060000000000000000e+02 2.600000000000000000e+02 2.680000000000000000e+02 2.900000000000000000e+02 3.820000000000000000e+02 4.450000000000000000e+02 4.920000000000000000e+02 5.570000000000000000e+02 3.940000000000000000e+02 1.780000000000000000e+02 4.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.100000000000000000e+01 4.300000000000000000e+01 6.700000000000000000e+01 9.900000000000000000e+01 7.000000000000000000e+01 7.200000000000000000e+01 6.200000000000000000e+01 7.300000000000000000e+01 5.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 3.300000000000000000e+01 3.600000000000000000e+01 5.400000000000000000e+01 5.000000000000000000e+01 6.200000000000000000e+01 9.000000000000000000e+01 8.700000000000000000e+01 1.110000000000000000e+02 1.310000000000000000e+02 1.600000000000000000e+02 1.830000000000000000e+02 2.510000000000000000e+02 2.600000000000000000e+02 2.880000000000000000e+02 3.100000000000000000e+02 3.820000000000000000e+02 4.910000000000000000e+02 5.770000000000000000e+02 6.480000000000000000e+02 6.440000000000000000e+02 4.120000000000000000e+02 1.660000000000000000e+02 4.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.200000000000000000e+01 5.000000000000000000e+01 8.100000000000000000e+01 8.700000000000000000e+01 5.800000000000000000e+01 7.300000000000000000e+01 5.600000000000000000e+01 6.300000000000000000e+01 3.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 2.900000000000000000e+01 4.000000000000000000e+01 5.200000000000000000e+01 7.300000000000000000e+01 8.500000000000000000e+01 7.900000000000000000e+01 1.040000000000000000e+02 1.270000000000000000e+02 1.720000000000000000e+02 1.860000000000000000e+02 2.170000000000000000e+02 2.450000000000000000e+02 2.720000000000000000e+02 3.280000000000000000e+02 3.310000000000000000e+02 4.860000000000000000e+02 4.980000000000000000e+02 5.730000000000000000e+02 6.990000000000000000e+02 7.470000000000000000e+02 7.020000000000000000e+02 4.540000000000000000e+02 1.830000000000000000e+02 7.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.800000000000000000e+01 5.300000000000000000e+01 9.100000000000000000e+01 6.700000000000000000e+01 6.700000000000000000e+01 5.700000000000000000e+01 6.500000000000000000e+01 3.000000000000000000e+01 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.900000000000000000e+01 2.600000000000000000e+01 4.900000000000000000e+01 3.900000000000000000e+01 5.200000000000000000e+01 8.200000000000000000e+01 1.020000000000000000e+02 9.000000000000000000e+01 1.430000000000000000e+02 1.640000000000000000e+02 1.620000000000000000e+02 2.100000000000000000e+02 2.400000000000000000e+02 2.830000000000000000e+02 3.560000000000000000e+02 3.840000000000000000e+02 4.450000000000000000e+02 5.040000000000000000e+02 5.660000000000000000e+02 7.460000000000000000e+02 8.230000000000000000e+02 9.390000000000000000e+02 7.950000000000000000e+02 4.680000000000000000e+02 2.240000000000000000e+02 6.900000000000000000e+01 3.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.200000000000000000e+01 5.000000000000000000e+01 8.500000000000000000e+01 5.600000000000000000e+01 6.500000000000000000e+01 5.600000000000000000e+01 4.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 nan 4.000000000000000000e+01 5.900000000000000000e+01 5.100000000000000000e+01 8.600000000000000000e+01 9.700000000000000000e+01 1.300000000000000000e+02 1.430000000000000000e+02 1.670000000000000000e+02 2.230000000000000000e+02 2.060000000000000000e+02 2.750000000000000000e+02 3.220000000000000000e+02 3.670000000000000000e+02 4.750000000000000000e+02 4.980000000000000000e+02 5.420000000000000000e+02 6.610000000000000000e+02 8.650000000000000000e+02 9.560000000000000000e+02 1.034000000000000000e+03 8.590000000000000000e+02 4.790000000000000000e+02 2.070000000000000000e+02 9.000000000000000000e+01 3.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.500000000000000000e+01 7.100000000000000000e+01 7.300000000000000000e+01 6.700000000000000000e+01 5.000000000000000000e+01 5.100000000000000000e+01 3.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.400000000000000000e+01 3.200000000000000000e+01 4.400000000000000000e+01 5.600000000000000000e+01 7.500000000000000000e+01 9.900000000000000000e+01 1.250000000000000000e+02 1.320000000000000000e+02 1.480000000000000000e+02 1.590000000000000000e+02 2.290000000000000000e+02 2.720000000000000000e+02 3.410000000000000000e+02 3.810000000000000000e+02 4.230000000000000000e+02 4.900000000000000000e+02 5.700000000000000000e+02 6.600000000000000000e+02 7.730000000000000000e+02 9.220000000000000000e+02 1.127000000000000000e+03 1.098000000000000000e+03 8.700000000000000000e+02 4.850000000000000000e+02 2.260000000000000000e+02 7.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 3.200000000000000000e+01 6.400000000000000000e+01 6.500000000000000000e+01 6.000000000000000000e+01 5.300000000000000000e+01 3.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 3.300000000000000000e+01 3.600000000000000000e+01 5.000000000000000000e+01 6.600000000000000000e+01 8.800000000000000000e+01 8.300000000000000000e+01 1.240000000000000000e+02 1.350000000000000000e+02 1.780000000000000000e+02 2.210000000000000000e+02 2.600000000000000000e+02 3.140000000000000000e+02 4.140000000000000000e+02 4.570000000000000000e+02 5.260000000000000000e+02 5.670000000000000000e+02 6.840000000000000000e+02 8.150000000000000000e+02 9.600000000000000000e+02 1.109000000000000000e+03 1.243000000000000000e+03 1.167000000000000000e+03 7.050000000000000000e+02 4.060000000000000000e+02 1.910000000000000000e+02 5.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 3.800000000000000000e+01 6.100000000000000000e+01 6.100000000000000000e+01 5.100000000000000000e+01 3.700000000000000000e+01 3.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.100000000000000000e+01 3.000000000000000000e+01 5.200000000000000000e+01 5.200000000000000000e+01 7.100000000000000000e+01 8.400000000000000000e+01 1.270000000000000000e+02 1.350000000000000000e+02 1.880000000000000000e+02 2.260000000000000000e+02 2.680000000000000000e+02 3.650000000000000000e+02 3.860000000000000000e+02 4.310000000000000000e+02 4.750000000000000000e+02 5.640000000000000000e+02 6.470000000000000000e+02 7.180000000000000000e+02 9.060000000000000000e+02 1.060000000000000000e+03 1.307000000000000000e+03 1.319000000000000000e+03 1.070000000000000000e+03 7.100000000000000000e+02 3.360000000000000000e+02 1.520000000000000000e+02 4.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.400000000000000000e+01 4.900000000000000000e+01 5.500000000000000000e+01 5.000000000000000000e+01 3.700000000000000000e+01 2.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.100000000000000000e+01 3.900000000000000000e+01 5.700000000000000000e+01 7.000000000000000000e+01 7.100000000000000000e+01 9.800000000000000000e+01 1.190000000000000000e+02 1.490000000000000000e+02 2.120000000000000000e+02 2.500000000000000000e+02 2.940000000000000000e+02 3.700000000000000000e+02 3.740000000000000000e+02 4.460000000000000000e+02 4.830000000000000000e+02 5.350000000000000000e+02 6.760000000000000000e+02 8.300000000000000000e+02 1.022000000000000000e+03 1.203000000000000000e+03 1.359000000000000000e+03 1.308000000000000000e+03 9.500000000000000000e+02 4.830000000000000000e+02 2.400000000000000000e+02 7.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.200000000000000000e+01 5.200000000000000000e+01 4.800000000000000000e+01 4.900000000000000000e+01 5.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.700000000000000000e+01 3.800000000000000000e+01 4.700000000000000000e+01 7.100000000000000000e+01 6.400000000000000000e+01 1.030000000000000000e+02 1.060000000000000000e+02 1.670000000000000000e+02 2.050000000000000000e+02 2.080000000000000000e+02 2.410000000000000000e+02 2.510000000000000000e+02 2.900000000000000000e+02 3.550000000000000000e+02 3.780000000000000000e+02 4.650000000000000000e+02 5.700000000000000000e+02 6.790000000000000000e+02 8.840000000000000000e+02 1.132000000000000000e+03 1.372000000000000000e+03 1.496000000000000000e+03 1.167000000000000000e+03 6.750000000000000000e+02 3.840000000000000000e+02 1.230000000000000000e+02 4.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.500000000000000000e+01 4.300000000000000000e+01 5.200000000000000000e+01 4.800000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 2.500000000000000000e+01 3.800000000000000000e+01 4.900000000000000000e+01 6.600000000000000000e+01 7.300000000000000000e+01 8.100000000000000000e+01 9.400000000000000000e+01 1.260000000000000000e+02 1.580000000000000000e+02 1.290000000000000000e+02 1.450000000000000000e+02 1.810000000000000000e+02 2.120000000000000000e+02 2.520000000000000000e+02 3.090000000000000000e+02 3.640000000000000000e+02 4.520000000000000000e+02 5.860000000000000000e+02 7.160000000000000000e+02 9.890000000000000000e+02 1.396000000000000000e+03 1.577000000000000000e+03 1.320000000000000000e+03 8.380000000000000000e+02 4.660000000000000000e+02 2.300000000000000000e+02 8.300000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.800000000000000000e+01 4.700000000000000000e+01 5.300000000000000000e+01 3.500000000000000000e+01 2.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 3.000000000000000000e+01 4.500000000000000000e+01 4.300000000000000000e+01 5.000000000000000000e+01 4.900000000000000000e+01 7.700000000000000000e+01 1.070000000000000000e+02 6.600000000000000000e+01 7.100000000000000000e+01 7.500000000000000000e+01 1.010000000000000000e+02 1.020000000000000000e+02 1.500000000000000000e+02 1.570000000000000000e+02 2.520000000000000000e+02 3.010000000000000000e+02 3.700000000000000000e+02 4.910000000000000000e+02 6.600000000000000000e+02 8.830000000000000000e+02 1.230000000000000000e+03 1.515000000000000000e+03 1.499000000000000000e+03 1.052000000000000000e+03 5.770000000000000000e+02 3.150000000000000000e+02 9.600000000000000000e+01 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.400000000000000000e+01 4.400000000000000000e+01 4.600000000000000000e+01 3.900000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 3.800000000000000000e+01 3.200000000000000000e+01 4.200000000000000000e+01 3.700000000000000000e+01 5.600000000000000000e+01 6.400000000000000000e+01 7.400000000000000000e+01 4.000000000000000000e+01 3.800000000000000000e+01 3.700000000000000000e+01 5.100000000000000000e+01 5.100000000000000000e+01 6.500000000000000000e+01 1.240000000000000000e+02 1.340000000000000000e+02 1.940000000000000000e+02 2.470000000000000000e+02 3.050000000000000000e+02 4.240000000000000000e+02 5.760000000000000000e+02 8.080000000000000000e+02 1.107000000000000000e+03 1.449000000000000000e+03 1.526000000000000000e+03 1.211000000000000000e+03 5.900000000000000000e+02 3.460000000000000000e+02 1.280000000000000000e+02 2.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.300000000000000000e+01 5.800000000000000000e+01 3.400000000000000000e+01 3.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 nan 2.800000000000000000e+01 2.600000000000000000e+01 nan 3.900000000000000000e+01 3.500000000000000000e+01 4.100000000000000000e+01 6.400000000000000000e+01 6.400000000000000000e+01 3.700000000000000000e+01 2.900000000000000000e+01 nan 3.200000000000000000e+01 3.900000000000000000e+01 4.500000000000000000e+01 5.300000000000000000e+01 7.600000000000000000e+01 1.150000000000000000e+02 1.600000000000000000e+02 1.880000000000000000e+02 2.580000000000000000e+02 2.930000000000000000e+02 4.950000000000000000e+02 7.280000000000000000e+02 1.057000000000000000e+03 1.423000000000000000e+03 1.617000000000000000e+03 1.325000000000000000e+03 7.600000000000000000e+02 3.750000000000000000e+02 1.620000000000000000e+02 4.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.100000000000000000e+01 4.300000000000000000e+01 3.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 nan 2.500000000000000000e+01 3.000000000000000000e+01 3.400000000000000000e+01 nan 2.700000000000000000e+01 3.000000000000000000e+01 4.300000000000000000e+01 4.100000000000000000e+01 3.200000000000000000e+01 nan nan nan nan 2.800000000000000000e+01 3.900000000000000000e+01 4.200000000000000000e+01 6.200000000000000000e+01 7.900000000000000000e+01 1.490000000000000000e+02 1.490000000000000000e+02 2.260000000000000000e+02 2.580000000000000000e+02 3.980000000000000000e+02 6.130000000000000000e+02 9.510000000000000000e+02 1.378000000000000000e+03 1.554000000000000000e+03 1.379000000000000000e+03 8.480000000000000000e+02 4.470000000000000000e+02 1.730000000000000000e+02 5.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.400000000000000000e+01 3.500000000000000000e+01 3.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 nan nan nan 2.600000000000000000e+01 2.700000000000000000e+01 3.400000000000000000e+01 3.000000000000000000e+01 3.400000000000000000e+01 3.800000000000000000e+01 3.800000000000000000e+01 4.200000000000000000e+01 nan nan nan nan nan nan nan 3.800000000000000000e+01 4.300000000000000000e+01 5.600000000000000000e+01 9.200000000000000000e+01 1.330000000000000000e+02 1.500000000000000000e+02 1.810000000000000000e+02 2.140000000000000000e+02 3.180000000000000000e+02 5.530000000000000000e+02 8.330000000000000000e+02 1.358000000000000000e+03 1.512000000000000000e+03 1.502000000000000000e+03 9.360000000000000000e+02 4.860000000000000000e+02 1.980000000000000000e+02 6.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.700000000000000000e+01 3.700000000000000000e+01 3.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 nan 3.000000000000000000e+01 3.500000000000000000e+01 3.300000000000000000e+01 4.100000000000000000e+01 3.600000000000000000e+01 2.700000000000000000e+01 3.800000000000000000e+01 3.000000000000000000e+01 3.800000000000000000e+01 2.900000000000000000e+01 3.200000000000000000e+01 3.600000000000000000e+01 nan nan nan nan nan nan nan nan nan 3.900000000000000000e+01 6.400000000000000000e+01 7.400000000000000000e+01 1.080000000000000000e+02 1.640000000000000000e+02 1.740000000000000000e+02 2.020000000000000000e+02 2.990000000000000000e+02 4.720000000000000000e+02 7.700000000000000000e+02 1.250000000000000000e+03 1.609000000000000000e+03 1.497000000000000000e+03 9.380000000000000000e+02 4.570000000000000000e+02 2.030000000000000000e+02 5.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.800000000000000000e+01 4.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.300000000000000000e+01 3.400000000000000000e+01 2.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.500000000000000000e+01 2.700000000000000000e+01 3.000000000000000000e+01 3.000000000000000000e+01 nan 3.400000000000000000e+01 2.600000000000000000e+01 3.800000000000000000e+01 3.700000000000000000e+01 2.700000000000000000e+01 4.700000000000000000e+01 4.000000000000000000e+01 nan 3.800000000000000000e+01 nan 2.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan 3.900000000000000000e+01 6.200000000000000000e+01 7.700000000000000000e+01 1.040000000000000000e+02 1.550000000000000000e+02 1.510000000000000000e+02 1.910000000000000000e+02 2.480000000000000000e+02 4.630000000000000000e+02 7.690000000000000000e+02 1.163000000000000000e+03 1.594000000000000000e+03 1.502000000000000000e+03 9.780000000000000000e+02 4.720000000000000000e+02 2.130000000000000000e+02 7.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.100000000000000000e+01 4.600000000000000000e+01 4.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 7.400000000000000000e+01 4.100000000000000000e+01 3.200000000000000000e+01 nan 2.700000000000000000e+01 nan 2.600000000000000000e+01 nan nan nan nan nan nan nan nan 2.500000000000000000e+01 nan 2.500000000000000000e+01 nan 2.500000000000000000e+01 nan nan 3.800000000000000000e+01 3.200000000000000000e+01 2.700000000000000000e+01 3.200000000000000000e+01 2.800000000000000000e+01 2.600000000000000000e+01 2.800000000000000000e+01 3.600000000000000000e+01 3.100000000000000000e+01 3.100000000000000000e+01 3.100000000000000000e+01 2.800000000000000000e+01 3.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan 3.400000000000000000e+01 3.900000000000000000e+01 7.800000000000000000e+01 1.080000000000000000e+02 1.360000000000000000e+02 1.480000000000000000e+02 1.720000000000000000e+02 2.120000000000000000e+02 3.860000000000000000e+02 7.080000000000000000e+02 1.119000000000000000e+03 1.607000000000000000e+03 1.535000000000000000e+03 8.890000000000000000e+02 4.940000000000000000e+02 2.090000000000000000e+02 5.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 3.800000000000000000e+01 3.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 8.000000000000000000e+01 7.700000000000000000e+01 4.300000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 nan nan 2.600000000000000000e+01 2.800000000000000000e+01 2.900000000000000000e+01 4.100000000000000000e+01 2.600000000000000000e+01 3.300000000000000000e+01 3.000000000000000000e+01 nan 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 4.200000000000000000e+01 7.100000000000000000e+01 9.100000000000000000e+01 1.260000000000000000e+02 1.520000000000000000e+02 1.600000000000000000e+02 2.080000000000000000e+02 3.740000000000000000e+02 6.950000000000000000e+02 1.145000000000000000e+03 1.604000000000000000e+03 1.527000000000000000e+03 9.220000000000000000e+02 4.450000000000000000e+02 1.770000000000000000e+02 5.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.600000000000000000e+01 4.500000000000000000e+01 2.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.800000000000000000e+01 1.070000000000000000e+02 6.400000000000000000e+01 3.100000000000000000e+01 nan 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.500000000000000000e+01 6.500000000000000000e+01 1.100000000000000000e+02 1.150000000000000000e+02 1.340000000000000000e+02 1.480000000000000000e+02 1.940000000000000000e+02 3.000000000000000000e+02 6.680000000000000000e+02 1.113000000000000000e+03 1.534000000000000000e+03 1.420000000000000000e+03 8.280000000000000000e+02 4.270000000000000000e+02 1.700000000000000000e+02 3.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.400000000000000000e+01 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 6.700000000000000000e+01 1.110000000000000000e+02 5.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.500000000000000000e+01 6.200000000000000000e+01 1.120000000000000000e+02 1.100000000000000000e+02 1.370000000000000000e+02 1.340000000000000000e+02 1.810000000000000000e+02 3.870000000000000000e+02 6.860000000000000000e+02 1.137000000000000000e+03 1.516000000000000000e+03 1.394000000000000000e+03 7.510000000000000000e+02 3.220000000000000000e+02 1.610000000000000000e+02 4.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.500000000000000000e+01 9.800000000000000000e+01 8.900000000000000000e+01 nan nan 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.900000000000000000e+01 3.200000000000000000e+01 4.600000000000000000e+01 1.040000000000000000e+02 1.510000000000000000e+02 1.180000000000000000e+02 1.300000000000000000e+02 1.820000000000000000e+02 3.370000000000000000e+02 7.560000000000000000e+02 1.221000000000000000e+03 1.572000000000000000e+03 1.391000000000000000e+03 6.610000000000000000e+02 3.090000000000000000e+02 1.110000000000000000e+02 3.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.100000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 4.300000000000000000e+01 7.700000000000000000e+01 4.300000000000000000e+01 nan nan nan 2.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.000000000000000000e+01 5.100000000000000000e+01 9.300000000000000000e+01 1.070000000000000000e+02 1.280000000000000000e+02 1.340000000000000000e+02 1.710000000000000000e+02 3.320000000000000000e+02 7.810000000000000000e+02 1.178000000000000000e+03 1.637000000000000000e+03 1.206000000000000000e+03 5.730000000000000000e+02 2.770000000000000000e+02 1.170000000000000000e+02 2.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.000000000000000000e+01 3.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.900000000000000000e+01 7.400000000000000000e+01 1.030000000000000000e+02 1.140000000000000000e+02 1.080000000000000000e+02 1.210000000000000000e+02 1.680000000000000000e+02 3.580000000000000000e+02 8.070000000000000000e+02 1.337000000000000000e+03 1.509000000000000000e+03 1.112000000000000000e+03 5.260000000000000000e+02 2.230000000000000000e+02 8.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 3.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.700000000000000000e+01 5.400000000000000000e+01 1.030000000000000000e+02 1.040000000000000000e+02 8.400000000000000000e+01 1.220000000000000000e+02 1.990000000000000000e+02 4.140000000000000000e+02 8.590000000000000000e+02 1.399000000000000000e+03 1.464000000000000000e+03 9.750000000000000000e+02 4.400000000000000000e+02 1.820000000000000000e+02 6.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 7.300000000000000000e+01 9.100000000000000000e+01 1.100000000000000000e+02 1.110000000000000000e+02 1.190000000000000000e+02 2.030000000000000000e+02 4.650000000000000000e+02 9.620000000000000000e+02 1.492000000000000000e+03 1.463000000000000000e+03 8.660000000000000000e+02 3.830000000000000000e+02 1.660000000000000000e+02 3.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.800000000000000000e+01 8.100000000000000000e+01 9.300000000000000000e+01 8.700000000000000000e+01 8.800000000000000000e+01 1.250000000000000000e+02 2.240000000000000000e+02 5.470000000000000000e+02 9.910000000000000000e+02 1.486000000000000000e+03 1.304000000000000000e+03 7.440000000000000000e+02 3.170000000000000000e+02 1.230000000000000000e+02 3.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 3.500000000000000000e+01 7.400000000000000000e+01 9.100000000000000000e+01 1.010000000000000000e+02 8.100000000000000000e+01 1.250000000000000000e+02 2.410000000000000000e+02 6.120000000000000000e+02 1.177000000000000000e+03 1.439000000000000000e+03 1.206000000000000000e+03 6.440000000000000000e+02 2.810000000000000000e+02 1.050000000000000000e+02 3.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.400000000000000000e+01 8.100000000000000000e+01 8.800000000000000000e+01 1.000000000000000000e+02 9.000000000000000000e+01 1.370000000000000000e+02 2.920000000000000000e+02 7.540000000000000000e+02 1.201000000000000000e+03 1.515000000000000000e+03 1.156000000000000000e+03 5.000000000000000000e+02 2.430000000000000000e+02 8.100000000000000000e+01 2.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.400000000000000000e+01 5.600000000000000000e+01 8.500000000000000000e+01 8.500000000000000000e+01 9.000000000000000000e+01 1.100000000000000000e+02 1.210000000000000000e+02 3.720000000000000000e+02 8.170000000000000000e+02 1.344000000000000000e+03 1.479000000000000000e+03 9.830000000000000000e+02 4.620000000000000000e+02 2.130000000000000000e+02 6.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 6.000000000000000000e+01 9.300000000000000000e+01 1.040000000000000000e+02 9.100000000000000000e+01 1.040000000000000000e+02 1.680000000000000000e+02 4.620000000000000000e+02 9.470000000000000000e+02 1.436000000000000000e+03 1.460000000000000000e+03 8.370000000000000000e+02 3.770000000000000000e+02 1.600000000000000000e+02 3.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.700000000000000000e+01 6.800000000000000000e+01 8.400000000000000000e+01 9.000000000000000000e+01 7.700000000000000000e+01 1.090000000000000000e+02 1.860000000000000000e+02 5.510000000000000000e+02 1.034000000000000000e+03 1.461000000000000000e+03 1.268000000000000000e+03 7.020000000000000000e+02 3.430000000000000000e+02 1.190000000000000000e+02 4.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.000000000000000000e+01 8.400000000000000000e+01 1.040000000000000000e+02 9.300000000000000000e+01 1.120000000000000000e+02 1.100000000000000000e+02 2.570000000000000000e+02 6.560000000000000000e+02 1.263000000000000000e+03 1.534000000000000000e+03 1.217000000000000000e+03 6.480000000000000000e+02 3.210000000000000000e+02 1.340000000000000000e+02 4.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.800000000000000000e+01 5.400000000000000000e+01 9.200000000000000000e+01 1.090000000000000000e+02 8.300000000000000000e+01 9.700000000000000000e+01 1.540000000000000000e+02 3.190000000000000000e+02 8.170000000000000000e+02 1.344000000000000000e+03 1.431000000000000000e+03 1.082000000000000000e+03 5.730000000000000000e+02 2.690000000000000000e+02 7.200000000000000000e+01 3.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.700000000000000000e+01 5.400000000000000000e+01 9.400000000000000000e+01 7.500000000000000000e+01 7.800000000000000000e+01 1.080000000000000000e+02 1.550000000000000000e+02 3.910000000000000000e+02 8.510000000000000000e+02 1.436000000000000000e+03 1.452000000000000000e+03 9.250000000000000000e+02 4.220000000000000000e+02 2.540000000000000000e+02 7.800000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.500000000000000000e+01 7.500000000000000000e+01 8.300000000000000000e+01 7.800000000000000000e+01 8.600000000000000000e+01 1.260000000000000000e+02 1.790000000000000000e+02 5.320000000000000000e+02 1.072000000000000000e+03 1.510000000000000000e+03 1.324000000000000000e+03 8.190000000000000000e+02 4.200000000000000000e+02 2.000000000000000000e+02 5.800000000000000000e+01 3.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.900000000000000000e+01 7.700000000000000000e+01 1.000000000000000000e+02 9.200000000000000000e+01 1.070000000000000000e+02 1.310000000000000000e+02 2.560000000000000000e+02 6.910000000000000000e+02 1.096000000000000000e+03 1.454000000000000000e+03 1.278000000000000000e+03 6.870000000000000000e+02 3.720000000000000000e+02 2.100000000000000000e+02 7.100000000000000000e+01 2.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.900000000000000000e+01 7.000000000000000000e+01 9.500000000000000000e+01 9.000000000000000000e+01 1.090000000000000000e+02 1.450000000000000000e+02 3.770000000000000000e+02 7.690000000000000000e+02 1.312000000000000000e+03 1.446000000000000000e+03 1.229000000000000000e+03 6.420000000000000000e+02 3.730000000000000000e+02 2.090000000000000000e+02 7.000000000000000000e+01 2.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 5.300000000000000000e+01 9.800000000000000000e+01 9.200000000000000000e+01 9.500000000000000000e+01 1.090000000000000000e+02 1.570000000000000000e+02 4.830000000000000000e+02 8.330000000000000000e+02 1.287000000000000000e+03 1.432000000000000000e+03 1.077000000000000000e+03 5.930000000000000000e+02 3.370000000000000000e+02 2.210000000000000000e+02 8.500000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 5.900000000000000000e+01 9.400000000000000000e+01 8.800000000000000000e+01 9.800000000000000000e+01 1.120000000000000000e+02 2.150000000000000000e+02 5.710000000000000000e+02 1.019000000000000000e+03 1.495000000000000000e+03 1.437000000000000000e+03 9.450000000000000000e+02 5.700000000000000000e+02 3.620000000000000000e+02 1.940000000000000000e+02 8.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 3.700000000000000000e+01 7.000000000000000000e+01 9.300000000000000000e+01 1.140000000000000000e+02 1.000000000000000000e+02 1.320000000000000000e+02 2.740000000000000000e+02 6.690000000000000000e+02 1.159000000000000000e+03 1.513000000000000000e+03 1.390000000000000000e+03 8.660000000000000000e+02 5.630000000000000000e+02 3.130000000000000000e+02 1.910000000000000000e+02 9.400000000000000000e+01 3.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.600000000000000000e+01 7.500000000000000000e+01 9.800000000000000000e+01 1.010000000000000000e+02 1.070000000000000000e+02 1.510000000000000000e+02 3.780000000000000000e+02 8.030000000000000000e+02 1.194000000000000000e+03 1.479000000000000000e+03 1.319000000000000000e+03 8.040000000000000000e+02 4.760000000000000000e+02 3.290000000000000000e+02 1.920000000000000000e+02 1.040000000000000000e+02 3.700000000000000000e+01 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.100000000000000000e+01 6.400000000000000000e+01 8.200000000000000000e+01 1.120000000000000000e+02 1.130000000000000000e+02 1.410000000000000000e+02 2.030000000000000000e+02 5.050000000000000000e+02 8.510000000000000000e+02 1.344000000000000000e+03 1.484000000000000000e+03 1.196000000000000000e+03 7.630000000000000000e+02 5.100000000000000000e+02 3.260000000000000000e+02 1.740000000000000000e+02 1.050000000000000000e+02 4.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.400000000000000000e+01 7.400000000000000000e+01 9.900000000000000000e+01 1.000000000000000000e+02 1.180000000000000000e+02 1.320000000000000000e+02 2.350000000000000000e+02 6.140000000000000000e+02 9.690000000000000000e+02 1.333000000000000000e+03 1.459000000000000000e+03 1.098000000000000000e+03 7.330000000000000000e+02 4.840000000000000000e+02 3.520000000000000000e+02 1.870000000000000000e+02 9.600000000000000000e+01 4.500000000000000000e+01 3.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.000000000000000000e+01 6.100000000000000000e+01 1.010000000000000000e+02 1.040000000000000000e+02 1.270000000000000000e+02 1.580000000000000000e+02 3.260000000000000000e+02 6.970000000000000000e+02 1.073000000000000000e+03 1.409000000000000000e+03 1.377000000000000000e+03 1.090000000000000000e+03 7.720000000000000000e+02 4.470000000000000000e+02 3.370000000000000000e+02 2.120000000000000000e+02 9.600000000000000000e+01 4.900000000000000000e+01 3.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 6.500000000000000000e+01 6.700000000000000000e+01 1.050000000000000000e+02 1.070000000000000000e+02 1.270000000000000000e+02 1.900000000000000000e+02 4.460000000000000000e+02 7.830000000000000000e+02 1.109000000000000000e+03 1.517000000000000000e+03 1.406000000000000000e+03 9.880000000000000000e+02 6.960000000000000000e+02 4.990000000000000000e+02 3.550000000000000000e+02 2.180000000000000000e+02 1.230000000000000000e+02 5.700000000000000000e+01 3.400000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.800000000000000000e+01 4.100000000000000000e+01 8.500000000000000000e+01 1.080000000000000000e+02 1.070000000000000000e+02 1.510000000000000000e+02 2.460000000000000000e+02 5.470000000000000000e+02 8.340000000000000000e+02 1.223000000000000000e+03 1.462000000000000000e+03 1.369000000000000000e+03 9.700000000000000000e+02 6.850000000000000000e+02 5.030000000000000000e+02 3.640000000000000000e+02 2.280000000000000000e+02 1.050000000000000000e+02 6.500000000000000000e+01 3.300000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.400000000000000000e+01 7.600000000000000000e+01 8.100000000000000000e+01 1.230000000000000000e+02 1.240000000000000000e+02 1.650000000000000000e+02 3.360000000000000000e+02 6.210000000000000000e+02 9.050000000000000000e+02 1.415000000000000000e+03 1.470000000000000000e+03 1.254000000000000000e+03 9.210000000000000000e+02 6.570000000000000000e+02 4.480000000000000000e+02 3.680000000000000000e+02 2.320000000000000000e+02 1.430000000000000000e+02 6.200000000000000000e+01 4.000000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.600000000000000000e+01 4.800000000000000000e+01 7.000000000000000000e+01 8.800000000000000000e+01 1.250000000000000000e+02 1.470000000000000000e+02 1.970000000000000000e+02 4.100000000000000000e+02 6.940000000000000000e+02 9.640000000000000000e+02 1.412000000000000000e+03 1.440000000000000000e+03 1.252000000000000000e+03 8.910000000000000000e+02 6.870000000000000000e+02 5.000000000000000000e+02 3.680000000000000000e+02 2.480000000000000000e+02 1.390000000000000000e+02 9.300000000000000000e+01 5.000000000000000000e+01 2.600000000000000000e+01 2.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.700000000000000000e+01 5.900000000000000000e+01 9.300000000000000000e+01 9.900000000000000000e+01 9.800000000000000000e+01 1.880000000000000000e+02 2.380000000000000000e+02 5.270000000000000000e+02 7.380000000000000000e+02 1.067000000000000000e+03 1.389000000000000000e+03 1.468000000000000000e+03 1.193000000000000000e+03 9.130000000000000000e+02 6.410000000000000000e+02 4.990000000000000000e+02 3.470000000000000000e+02 2.540000000000000000e+02 1.610000000000000000e+02 9.600000000000000000e+01 4.900000000000000000e+01 3.000000000000000000e+01 3.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.400000000000000000e+01 5.700000000000000000e+01 6.900000000000000000e+01 1.200000000000000000e+02 1.290000000000000000e+02 1.730000000000000000e+02 2.890000000000000000e+02 5.680000000000000000e+02 8.320000000000000000e+02 1.190000000000000000e+03 1.452000000000000000e+03 1.403000000000000000e+03 1.224000000000000000e+03 8.500000000000000000e+02 6.160000000000000000e+02 5.270000000000000000e+02 3.480000000000000000e+02 3.050000000000000000e+02 1.920000000000000000e+02 1.010000000000000000e+02 4.800000000000000000e+01 3.400000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.300000000000000000e+01 5.100000000000000000e+01 5.600000000000000000e+01 8.400000000000000000e+01 1.270000000000000000e+02 1.400000000000000000e+02 2.080000000000000000e+02 3.850000000000000000e+02 6.500000000000000000e+02 9.200000000000000000e+02 1.255000000000000000e+03 1.430000000000000000e+03 1.366000000000000000e+03 1.122000000000000000e+03 8.470000000000000000e+02 6.330000000000000000e+02 5.170000000000000000e+02 4.060000000000000000e+02 2.840000000000000000e+02 2.170000000000000000e+02 1.360000000000000000e+02 6.400000000000000000e+01 5.900000000000000000e+01 3.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.400000000000000000e+01 4.300000000000000000e+01 8.900000000000000000e+01 1.000000000000000000e+02 1.420000000000000000e+02 1.590000000000000000e+02 2.370000000000000000e+02 4.470000000000000000e+02 6.790000000000000000e+02 9.740000000000000000e+02 1.320000000000000000e+03 1.421000000000000000e+03 1.347000000000000000e+03 1.166000000000000000e+03 8.500000000000000000e+02 6.640000000000000000e+02 4.910000000000000000e+02 3.980000000000000000e+02 3.230000000000000000e+02 2.170000000000000000e+02 1.550000000000000000e+02 8.400000000000000000e+01 3.800000000000000000e+01 4.000000000000000000e+01 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.100000000000000000e+01 4.300000000000000000e+01 8.200000000000000000e+01 1.210000000000000000e+02 1.560000000000000000e+02 1.630000000000000000e+02 2.920000000000000000e+02 5.380000000000000000e+02 7.610000000000000000e+02 1.062000000000000000e+03 1.347000000000000000e+03 1.462000000000000000e+03 1.268000000000000000e+03 1.075000000000000000e+03 8.790000000000000000e+02 6.270000000000000000e+02 5.730000000000000000e+02 4.610000000000000000e+02 3.360000000000000000e+02 2.370000000000000000e+02 1.490000000000000000e+02 9.400000000000000000e+01 6.100000000000000000e+01 4.100000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.100000000000000000e+01 6.500000000000000000e+01 8.400000000000000000e+01 1.090000000000000000e+02 1.590000000000000000e+02 1.970000000000000000e+02 3.750000000000000000e+02 5.540000000000000000e+02 8.090000000000000000e+02 1.131000000000000000e+03 1.444000000000000000e+03 1.461000000000000000e+03 1.259000000000000000e+03 1.030000000000000000e+03 8.450000000000000000e+02 6.980000000000000000e+02 5.160000000000000000e+02 4.450000000000000000e+02 3.410000000000000000e+02 2.440000000000000000e+02 1.730000000000000000e+02 1.050000000000000000e+02 6.200000000000000000e+01 6.000000000000000000e+01 3.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.400000000000000000e+01 4.000000000000000000e+01 7.700000000000000000e+01 1.060000000000000000e+02 1.220000000000000000e+02 1.810000000000000000e+02 2.310000000000000000e+02 4.530000000000000000e+02 6.310000000000000000e+02 9.060000000000000000e+02 1.224000000000000000e+03 1.453000000000000000e+03 1.407000000000000000e+03 1.232000000000000000e+03 9.830000000000000000e+02 8.350000000000000000e+02 6.780000000000000000e+02 5.670000000000000000e+02 4.980000000000000000e+02 3.430000000000000000e+02 2.790000000000000000e+02 1.590000000000000000e+02 1.370000000000000000e+02 8.000000000000000000e+01 6.800000000000000000e+01 4.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.100000000000000000e+01 4.700000000000000000e+01 8.400000000000000000e+01 1.030000000000000000e+02 1.310000000000000000e+02 1.910000000000000000e+02 2.560000000000000000e+02 5.390000000000000000e+02 7.290000000000000000e+02 1.000000000000000000e+03 1.337000000000000000e+03 1.508000000000000000e+03 1.397000000000000000e+03 1.234000000000000000e+03 1.068000000000000000e+03 9.490000000000000000e+02 7.700000000000000000e+02 5.730000000000000000e+02 5.110000000000000000e+02 3.940000000000000000e+02 2.710000000000000000e+02 2.460000000000000000e+02 1.660000000000000000e+02 1.260000000000000000e+02 6.500000000000000000e+01 5.100000000000000000e+01 3.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.100000000000000000e+01 6.300000000000000000e+01 1.090000000000000000e+02 1.300000000000000000e+02 1.770000000000000000e+02 2.170000000000000000e+02 3.650000000000000000e+02 5.840000000000000000e+02 7.690000000000000000e+02 1.129000000000000000e+03 1.391000000000000000e+03 1.472000000000000000e+03 1.424000000000000000e+03 1.310000000000000000e+03 1.086000000000000000e+03 9.610000000000000000e+02 7.240000000000000000e+02 6.710000000000000000e+02 5.460000000000000000e+02 4.320000000000000000e+02 2.940000000000000000e+02 3.140000000000000000e+02 1.980000000000000000e+02 1.140000000000000000e+02 6.200000000000000000e+01 5.200000000000000000e+01 3.800000000000000000e+01 3.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.900000000000000000e+01 4.500000000000000000e+01 8.200000000000000000e+01 1.090000000000000000e+02 1.550000000000000000e+02 1.640000000000000000e+02 2.470000000000000000e+02 4.090000000000000000e+02 6.180000000000000000e+02 7.990000000000000000e+02 1.158000000000000000e+03 1.480000000000000000e+03 1.530000000000000000e+03 1.395000000000000000e+03 1.345000000000000000e+03 1.129000000000000000e+03 9.700000000000000000e+02 8.120000000000000000e+02 6.910000000000000000e+02 5.780000000000000000e+02 4.010000000000000000e+02 3.950000000000000000e+02 2.720000000000000000e+02 2.150000000000000000e+02 1.350000000000000000e+02 9.300000000000000000e+01 5.300000000000000000e+01 3.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.900000000000000000e+01 5.700000000000000000e+01 7.600000000000000000e+01 1.220000000000000000e+02 1.690000000000000000e+02 1.860000000000000000e+02 2.860000000000000000e+02 4.540000000000000000e+02 7.000000000000000000e+02 9.240000000000000000e+02 1.195000000000000000e+03 1.555000000000000000e+03 1.573000000000000000e+03 1.471000000000000000e+03 1.361000000000000000e+03 1.152000000000000000e+03 1.010000000000000000e+03 8.500000000000000000e+02 7.990000000000000000e+02 4.850000000000000000e+02 4.450000000000000000e+02 4.450000000000000000e+02 2.910000000000000000e+02 2.450000000000000000e+02 1.750000000000000000e+02 1.130000000000000000e+02 6.900000000000000000e+01 3.300000000000000000e+01 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 2.700000000000000000e+01 3.900000000000000000e+01 5.300000000000000000e+01 8.300000000000000000e+01 1.310000000000000000e+02 1.570000000000000000e+02 2.460000000000000000e+02 3.370000000000000000e+02 5.300000000000000000e+02 7.650000000000000000e+02 1.041000000000000000e+03 1.294000000000000000e+03 1.544000000000000000e+03 1.618000000000000000e+03 1.550000000000000000e+03 1.380000000000000000e+03 1.215000000000000000e+03 1.020000000000000000e+03 9.000000000000000000e+02 7.180000000000000000e+02 5.960000000000000000e+02 5.810000000000000000e+02 4.410000000000000000e+02 3.360000000000000000e+02 2.370000000000000000e+02 1.870000000000000000e+02 1.340000000000000000e+02 7.000000000000000000e+01 4.800000000000000000e+01 3.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.600000000000000000e+01 3.400000000000000000e+01 6.300000000000000000e+01 1.000000000000000000e+02 1.190000000000000000e+02 1.640000000000000000e+02 2.340000000000000000e+02 4.200000000000000000e+02 5.840000000000000000e+02 8.640000000000000000e+02 1.077000000000000000e+03 1.425000000000000000e+03 1.616000000000000000e+03 1.664000000000000000e+03 1.562000000000000000e+03 1.442000000000000000e+03 1.297000000000000000e+03 1.157000000000000000e+03 9.530000000000000000e+02 6.800000000000000000e+02 7.310000000000000000e+02 5.940000000000000000e+02 4.760000000000000000e+02 3.630000000000000000e+02 2.670000000000000000e+02 1.880000000000000000e+02 1.280000000000000000e+02 9.300000000000000000e+01 5.700000000000000000e+01 4.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.000000000000000000e+01 3.500000000000000000e+01 6.700000000000000000e+01 1.220000000000000000e+02 1.540000000000000000e+02 1.920000000000000000e+02 2.890000000000000000e+02 4.280000000000000000e+02 6.370000000000000000e+02 8.720000000000000000e+02 1.124000000000000000e+03 1.518000000000000000e+03 1.648000000000000000e+03 1.740000000000000000e+03 1.664000000000000000e+03 1.545000000000000000e+03 1.376000000000000000e+03 1.240000000000000000e+03 7.420000000000000000e+02 8.540000000000000000e+02 7.680000000000000000e+02 6.240000000000000000e+02 5.170000000000000000e+02 4.130000000000000000e+02 2.710000000000000000e+02 2.230000000000000000e+02 1.580000000000000000e+02 7.100000000000000000e+01 4.600000000000000000e+01 4.200000000000000000e+01 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.300000000000000000e+01 4.800000000000000000e+01 8.900000000000000000e+01 1.100000000000000000e+02 1.720000000000000000e+02 2.010000000000000000e+02 3.510000000000000000e+02 5.880000000000000000e+02 7.260000000000000000e+02 9.910000000000000000e+02 1.257000000000000000e+03 1.646000000000000000e+03 1.744000000000000000e+03 1.777000000000000000e+03 1.723000000000000000e+03 1.588000000000000000e+03 1.524000000000000000e+03 1.157000000000000000e+03 9.550000000000000000e+02 9.580000000000000000e+02 8.350000000000000000e+02 7.080000000000000000e+02 4.950000000000000000e+02 4.500000000000000000e+02 3.010000000000000000e+02 2.480000000000000000e+02 1.580000000000000000e+02 8.600000000000000000e+01 4.300000000000000000e+01 4.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 2.600000000000000000e+01 3.500000000000000000e+01 7.900000000000000000e+01 1.000000000000000000e+02 1.360000000000000000e+02 1.890000000000000000e+02 2.610000000000000000e+02 4.160000000000000000e+02 5.530000000000000000e+02 8.390000000000000000e+02 9.750000000000000000e+02 1.320000000000000000e+03 1.589000000000000000e+03 1.898000000000000000e+03 1.818000000000000000e+03 1.756000000000000000e+03 1.713000000000000000e+03 1.494000000000000000e+03 1.208000000000000000e+03 1.145000000000000000e+03 1.018000000000000000e+03 8.290000000000000000e+02 6.580000000000000000e+02 5.480000000000000000e+02 4.370000000000000000e+02 3.380000000000000000e+02 2.460000000000000000e+02 1.540000000000000000e+02 1.010000000000000000e+02 7.700000000000000000e+01 3.600000000000000000e+01 3.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 2.900000000000000000e+01 2.800000000000000000e+01 3.600000000000000000e+01 6.700000000000000000e+01 9.600000000000000000e+01 1.580000000000000000e+02 1.840000000000000000e+02 2.870000000000000000e+02 4.540000000000000000e+02 6.250000000000000000e+02 9.440000000000000000e+02 1.142000000000000000e+03 1.434000000000000000e+03 1.776000000000000000e+03 1.965000000000000000e+03 1.936000000000000000e+03 1.903000000000000000e+03 1.707000000000000000e+03 1.333000000000000000e+03 1.346000000000000000e+03 1.275000000000000000e+03 1.021000000000000000e+03 8.860000000000000000e+02 6.780000000000000000e+02 5.630000000000000000e+02 4.480000000000000000e+02 3.380000000000000000e+02 2.480000000000000000e+02 1.550000000000000000e+02 9.200000000000000000e+01 7.200000000000000000e+01 2.600000000000000000e+01 2.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.900000000000000000e+01 4.300000000000000000e+01 6.000000000000000000e+01 9.100000000000000000e+01 1.200000000000000000e+02 1.620000000000000000e+02 1.970000000000000000e+02 3.340000000000000000e+02 4.780000000000000000e+02 7.280000000000000000e+02 9.440000000000000000e+02 1.207000000000000000e+03 1.440000000000000000e+03 1.790000000000000000e+03 1.978000000000000000e+03 1.957000000000000000e+03 2.001000000000000000e+03 1.563000000000000000e+03 1.594000000000000000e+03 1.585000000000000000e+03 1.283000000000000000e+03 1.130000000000000000e+03 8.690000000000000000e+02 7.120000000000000000e+02 5.940000000000000000e+02 4.350000000000000000e+02 3.670000000000000000e+02 2.890000000000000000e+02 1.700000000000000000e+02 1.260000000000000000e+02 6.800000000000000000e+01 3.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 nan nan 3.600000000000000000e+01 6.000000000000000000e+01 1.030000000000000000e+02 1.400000000000000000e+02 1.890000000000000000e+02 2.320000000000000000e+02 3.600000000000000000e+02 5.810000000000000000e+02 7.770000000000000000e+02 1.044000000000000000e+03 1.382000000000000000e+03 1.623000000000000000e+03 1.853000000000000000e+03 1.973000000000000000e+03 2.141000000000000000e+03 1.906000000000000000e+03 1.716000000000000000e+03 1.787000000000000000e+03 1.632000000000000000e+03 1.275000000000000000e+03 1.200000000000000000e+03 9.800000000000000000e+02 7.510000000000000000e+02 5.730000000000000000e+02 4.730000000000000000e+02 3.650000000000000000e+02 2.490000000000000000e+02 1.720000000000000000e+02 1.040000000000000000e+02 6.500000000000000000e+01 4.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 3.500000000000000000e+01 3.200000000000000000e+01 5.200000000000000000e+01 8.800000000000000000e+01 1.180000000000000000e+02 1.510000000000000000e+02 1.890000000000000000e+02 2.810000000000000000e+02 4.060000000000000000e+02 6.090000000000000000e+02 7.870000000000000000e+02 1.114000000000000000e+03 1.322000000000000000e+03 1.636000000000000000e+03 1.975000000000000000e+03 2.265000000000000000e+03 2.091000000000000000e+03 1.959000000000000000e+03 1.949000000000000000e+03 1.799000000000000000e+03 1.572000000000000000e+03 1.350000000000000000e+03 1.140000000000000000e+03 9.860000000000000000e+02 7.820000000000000000e+02 5.910000000000000000e+02 4.600000000000000000e+02 3.550000000000000000e+02 2.360000000000000000e+02 1.280000000000000000e+02 1.000000000000000000e+02 6.900000000000000000e+01 5.400000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 nan 3.300000000000000000e+01 3.800000000000000000e+01 6.400000000000000000e+01 7.700000000000000000e+01 1.140000000000000000e+02 1.600000000000000000e+02 2.180000000000000000e+02 2.780000000000000000e+02 3.840000000000000000e+02 6.500000000000000000e+02 8.710000000000000000e+02 1.184000000000000000e+03 1.454000000000000000e+03 1.732000000000000000e+03 2.066000000000000000e+03 2.150000000000000000e+03 2.037000000000000000e+03 2.028000000000000000e+03 1.945000000000000000e+03 1.901000000000000000e+03 1.615000000000000000e+03 1.381000000000000000e+03 1.178000000000000000e+03 9.470000000000000000e+02 7.640000000000000000e+02 6.190000000000000000e+02 4.590000000000000000e+02 3.430000000000000000e+02 2.560000000000000000e+02 1.520000000000000000e+02 1.020000000000000000e+02 4.900000000000000000e+01 4.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 2.500000000000000000e+01 4.000000000000000000e+01 4.600000000000000000e+01 6.900000000000000000e+01 1.040000000000000000e+02 1.370000000000000000e+02 1.560000000000000000e+02 2.350000000000000000e+02 3.210000000000000000e+02 5.020000000000000000e+02 6.760000000000000000e+02 9.150000000000000000e+02 1.239000000000000000e+03 1.503000000000000000e+03 1.801000000000000000e+03 2.093000000000000000e+03 2.002000000000000000e+03 2.244000000000000000e+03 2.134000000000000000e+03 2.068000000000000000e+03 1.875000000000000000e+03 1.636000000000000000e+03 1.462000000000000000e+03 1.176000000000000000e+03 1.020000000000000000e+03 7.730000000000000000e+02 5.810000000000000000e+02 4.740000000000000000e+02 3.560000000000000000e+02 2.210000000000000000e+02 1.490000000000000000e+02 9.700000000000000000e+01 5.500000000000000000e+01 4.000000000000000000e+01 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 2.700000000000000000e+01 4.100000000000000000e+01 3.500000000000000000e+01 4.400000000000000000e+01 5.200000000000000000e+01 1.010000000000000000e+02 1.330000000000000000e+02 1.950000000000000000e+02 2.470000000000000000e+02 3.290000000000000000e+02 5.060000000000000000e+02 7.530000000000000000e+02 9.950000000000000000e+02 1.300000000000000000e+03 1.496000000000000000e+03 1.871000000000000000e+03 1.852000000000000000e+03 2.173000000000000000e+03 2.204000000000000000e+03 2.161000000000000000e+03 2.025000000000000000e+03 1.860000000000000000e+03 1.617000000000000000e+03 1.464000000000000000e+03 1.186000000000000000e+03 9.920000000000000000e+02 7.500000000000000000e+02 5.660000000000000000e+02 4.710000000000000000e+02 2.990000000000000000e+02 2.030000000000000000e+02 1.360000000000000000e+02 7.700000000000000000e+01 4.100000000000000000e+01 2.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.300000000000000000e+01 4.300000000000000000e+01 4.500000000000000000e+01 6.000000000000000000e+01 6.800000000000000000e+01 9.600000000000000000e+01 1.760000000000000000e+02 1.820000000000000000e+02 2.640000000000000000e+02 3.500000000000000000e+02 5.690000000000000000e+02 7.880000000000000000e+02 1.068000000000000000e+03 1.338000000000000000e+03 1.549000000000000000e+03 1.676000000000000000e+03 1.994000000000000000e+03 2.068000000000000000e+03 2.309000000000000000e+03 2.172000000000000000e+03 2.048000000000000000e+03 1.908000000000000000e+03 1.617000000000000000e+03 1.375000000000000000e+03 1.150000000000000000e+03 8.960000000000000000e+02 7.110000000000000000e+02 5.370000000000000000e+02 4.460000000000000000e+02 3.470000000000000000e+02 1.980000000000000000e+02 1.190000000000000000e+02 5.900000000000000000e+01 3.600000000000000000e+01 2.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.100000000000000000e+01 2.600000000000000000e+01 2.700000000000000000e+01 2.700000000000000000e+01 6.000000000000000000e+01 5.400000000000000000e+01 8.800000000000000000e+01 1.190000000000000000e+02 1.460000000000000000e+02 2.140000000000000000e+02 2.770000000000000000e+02 4.090000000000000000e+02 5.740000000000000000e+02 8.300000000000000000e+02 1.100000000000000000e+03 1.269000000000000000e+03 1.556000000000000000e+03 1.780000000000000000e+03 1.972000000000000000e+03 2.081000000000000000e+03 2.270000000000000000e+03 2.272000000000000000e+03 2.051000000000000000e+03 1.908000000000000000e+03 1.595000000000000000e+03 1.358000000000000000e+03 1.119000000000000000e+03 8.750000000000000000e+02 6.840000000000000000e+02 5.340000000000000000e+02 4.000000000000000000e+02 3.020000000000000000e+02 1.640000000000000000e+02 1.150000000000000000e+02 5.000000000000000000e+01 3.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 3.700000000000000000e+01 4.400000000000000000e+01 4.900000000000000000e+01 7.900000000000000000e+01 8.500000000000000000e+01 1.170000000000000000e+02 1.630000000000000000e+02 2.130000000000000000e+02 3.220000000000000000e+02 4.050000000000000000e+02 6.030000000000000000e+02 8.600000000000000000e+02 1.084000000000000000e+03 1.331000000000000000e+03 1.566000000000000000e+03 1.717000000000000000e+03 1.897000000000000000e+03 2.003000000000000000e+03 2.291000000000000000e+03 2.239000000000000000e+03 2.142000000000000000e+03 1.899000000000000000e+03 1.608000000000000000e+03 1.297000000000000000e+03 1.158000000000000000e+03 8.270000000000000000e+02 6.690000000000000000e+02 5.410000000000000000e+02 3.450000000000000000e+02 2.600000000000000000e+02 1.520000000000000000e+02 9.100000000000000000e+01 3.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 3.500000000000000000e+01 4.200000000000000000e+01 4.200000000000000000e+01 5.000000000000000000e+01 7.500000000000000000e+01 1.100000000000000000e+02 1.280000000000000000e+02 1.720000000000000000e+02 2.100000000000000000e+02 3.040000000000000000e+02 4.110000000000000000e+02 5.930000000000000000e+02 8.450000000000000000e+02 1.071000000000000000e+03 1.293000000000000000e+03 1.517000000000000000e+03 1.657000000000000000e+03 1.817000000000000000e+03 2.061000000000000000e+03 2.173000000000000000e+03 2.229000000000000000e+03 2.048000000000000000e+03 1.871000000000000000e+03 1.666000000000000000e+03 1.321000000000000000e+03 1.055000000000000000e+03 8.390000000000000000e+02 6.270000000000000000e+02 4.400000000000000000e+02 3.420000000000000000e+02 2.230000000000000000e+02 1.240000000000000000e+02 7.800000000000000000e+01 3.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.800000000000000000e+01 4.500000000000000000e+01 4.700000000000000000e+01 5.500000000000000000e+01 6.200000000000000000e+01 1.060000000000000000e+02 1.240000000000000000e+02 1.480000000000000000e+02 2.290000000000000000e+02 2.910000000000000000e+02 4.090000000000000000e+02 6.230000000000000000e+02 8.520000000000000000e+02 1.018000000000000000e+03 1.366000000000000000e+03 1.468000000000000000e+03 1.656000000000000000e+03 1.924000000000000000e+03 2.029000000000000000e+03 2.197000000000000000e+03 2.295000000000000000e+03 2.066000000000000000e+03 1.765000000000000000e+03 1.587000000000000000e+03 1.233000000000000000e+03 9.920000000000000000e+02 7.820000000000000000e+02 5.760000000000000000e+02 3.960000000000000000e+02 3.150000000000000000e+02 1.810000000000000000e+02 1.030000000000000000e+02 5.500000000000000000e+01 3.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 3.500000000000000000e+01 4.000000000000000000e+01 5.200000000000000000e+01 6.300000000000000000e+01 7.800000000000000000e+01 1.300000000000000000e+02 1.430000000000000000e+02 1.760000000000000000e+02 2.570000000000000000e+02 3.370000000000000000e+02 4.260000000000000000e+02 6.240000000000000000e+02 8.230000000000000000e+02 1.076000000000000000e+03 1.183000000000000000e+03 1.384000000000000000e+03 1.531000000000000000e+03 1.863000000000000000e+03 1.966000000000000000e+03 2.116000000000000000e+03 2.218000000000000000e+03 2.022000000000000000e+03 1.794000000000000000e+03 1.510000000000000000e+03 1.172000000000000000e+03 9.460000000000000000e+02 7.190000000000000000e+02 5.440000000000000000e+02 3.560000000000000000e+02 2.260000000000000000e+02 1.300000000000000000e+02 9.300000000000000000e+01 3.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.300000000000000000e+01 4.100000000000000000e+01 4.000000000000000000e+01 4.500000000000000000e+01 5.600000000000000000e+01 8.800000000000000000e+01 1.170000000000000000e+02 1.750000000000000000e+02 1.790000000000000000e+02 2.050000000000000000e+02 3.120000000000000000e+02 4.500000000000000000e+02 6.110000000000000000e+02 8.410000000000000000e+02 1.096000000000000000e+03 1.177000000000000000e+03 1.411000000000000000e+03 1.650000000000000000e+03 1.832000000000000000e+03 2.039000000000000000e+03 2.074000000000000000e+03 2.106000000000000000e+03 1.964000000000000000e+03 1.725000000000000000e+03 1.446000000000000000e+03 1.187000000000000000e+03 8.780000000000000000e+02 6.180000000000000000e+02 4.340000000000000000e+02 2.560000000000000000e+02 1.800000000000000000e+02 9.600000000000000000e+01 5.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 2.900000000000000000e+01 4.900000000000000000e+01 4.900000000000000000e+01 5.400000000000000000e+01 5.200000000000000000e+01 1.050000000000000000e+02 1.170000000000000000e+02 1.480000000000000000e+02 1.990000000000000000e+02 2.400000000000000000e+02 3.210000000000000000e+02 4.040000000000000000e+02 5.480000000000000000e+02 8.270000000000000000e+02 8.890000000000000000e+02 1.136000000000000000e+03 1.418000000000000000e+03 1.622000000000000000e+03 1.716000000000000000e+03 1.928000000000000000e+03 2.036000000000000000e+03 2.076000000000000000e+03 1.949000000000000000e+03 1.638000000000000000e+03 1.442000000000000000e+03 1.011000000000000000e+03 7.590000000000000000e+02 5.600000000000000000e+02 3.920000000000000000e+02 2.220000000000000000e+02 1.370000000000000000e+02 8.200000000000000000e+01 3.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.900000000000000000e+01 2.900000000000000000e+01 4.200000000000000000e+01 4.300000000000000000e+01 5.300000000000000000e+01 6.800000000000000000e+01 8.100000000000000000e+01 1.170000000000000000e+02 1.460000000000000000e+02 1.970000000000000000e+02 2.220000000000000000e+02 2.910000000000000000e+02 4.140000000000000000e+02 5.720000000000000000e+02 7.290000000000000000e+02 9.580000000000000000e+02 1.178000000000000000e+03 1.309000000000000000e+03 1.524000000000000000e+03 1.715000000000000000e+03 1.857000000000000000e+03 1.985000000000000000e+03 2.004000000000000000e+03 1.816000000000000000e+03 1.582000000000000000e+03 1.221000000000000000e+03 9.640000000000000000e+02 6.370000000000000000e+02 4.790000000000000000e+02 2.700000000000000000e+02 1.560000000000000000e+02 1.230000000000000000e+02 5.200000000000000000e+01 2.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 nan 4.300000000000000000e+01 3.100000000000000000e+01 5.800000000000000000e+01 6.400000000000000000e+01 7.700000000000000000e+01 1.030000000000000000e+02 1.040000000000000000e+02 1.580000000000000000e+02 1.900000000000000000e+02 2.400000000000000000e+02 3.580000000000000000e+02 3.940000000000000000e+02 5.050000000000000000e+02 6.980000000000000000e+02 8.750000000000000000e+02 1.044000000000000000e+03 1.314000000000000000e+03 1.531000000000000000e+03 1.627000000000000000e+03 1.755000000000000000e+03 1.937000000000000000e+03 1.869000000000000000e+03 1.657000000000000000e+03 1.393000000000000000e+03 1.070000000000000000e+03 8.400000000000000000e+02 5.730000000000000000e+02 3.870000000000000000e+02 2.270000000000000000e+02 1.330000000000000000e+02 6.600000000000000000e+01 3.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.900000000000000000e+01 3.600000000000000000e+01 4.800000000000000000e+01 5.900000000000000000e+01 6.600000000000000000e+01 8.800000000000000000e+01 1.190000000000000000e+02 1.530000000000000000e+02 1.770000000000000000e+02 2.390000000000000000e+02 3.130000000000000000e+02 3.770000000000000000e+02 5.080000000000000000e+02 7.110000000000000000e+02 8.610000000000000000e+02 1.020000000000000000e+03 1.179000000000000000e+03 1.379000000000000000e+03 1.541000000000000000e+03 1.696000000000000000e+03 1.867000000000000000e+03 1.754000000000000000e+03 1.589000000000000000e+03 1.244000000000000000e+03 9.530000000000000000e+02 6.910000000000000000e+02 4.550000000000000000e+02 3.100000000000000000e+02 1.890000000000000000e+02 8.700000000000000000e+01 5.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.800000000000000000e+01 nan 2.500000000000000000e+01 3.900000000000000000e+01 4.800000000000000000e+01 5.300000000000000000e+01 6.800000000000000000e+01 9.400000000000000000e+01 1.150000000000000000e+02 1.170000000000000000e+02 1.690000000000000000e+02 2.190000000000000000e+02 3.070000000000000000e+02 3.740000000000000000e+02 4.600000000000000000e+02 5.910000000000000000e+02 8.070000000000000000e+02 9.870000000000000000e+02 1.134000000000000000e+03 1.268000000000000000e+03 1.492000000000000000e+03 1.606000000000000000e+03 1.711000000000000000e+03 1.580000000000000000e+03 1.408000000000000000e+03 1.134000000000000000e+03 7.990000000000000000e+02 5.730000000000000000e+02 3.560000000000000000e+02 2.430000000000000000e+02 1.350000000000000000e+02 5.800000000000000000e+01 3.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 2.700000000000000000e+01 3.900000000000000000e+01 5.700000000000000000e+01 6.000000000000000000e+01 6.900000000000000000e+01 7.300000000000000000e+01 8.700000000000000000e+01 1.220000000000000000e+02 1.350000000000000000e+02 1.550000000000000000e+02 2.300000000000000000e+02 2.770000000000000000e+02 3.630000000000000000e+02 4.310000000000000000e+02 5.820000000000000000e+02 7.320000000000000000e+02 8.680000000000000000e+02 1.026000000000000000e+03 1.212000000000000000e+03 1.332000000000000000e+03 1.468000000000000000e+03 1.563000000000000000e+03 1.482000000000000000e+03 1.234000000000000000e+03 9.620000000000000000e+02 6.450000000000000000e+02 4.540000000000000000e+02 2.670000000000000000e+02 1.590000000000000000e+02 8.500000000000000000e+01 5.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.100000000000000000e+01 3.400000000000000000e+01 4.900000000000000000e+01 4.300000000000000000e+01 5.100000000000000000e+01 7.300000000000000000e+01 8.000000000000000000e+01 1.240000000000000000e+02 1.330000000000000000e+02 1.570000000000000000e+02 2.170000000000000000e+02 2.960000000000000000e+02 3.440000000000000000e+02 4.060000000000000000e+02 5.290000000000000000e+02 6.840000000000000000e+02 7.910000000000000000e+02 9.540000000000000000e+02 1.103000000000000000e+03 1.252000000000000000e+03 1.354000000000000000e+03 1.369000000000000000e+03 1.295000000000000000e+03 1.008000000000000000e+03 7.590000000000000000e+02 5.570000000000000000e+02 3.170000000000000000e+02 1.960000000000000000e+02 1.070000000000000000e+02 5.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 3.800000000000000000e+01 3.200000000000000000e+01 3.800000000000000000e+01 5.400000000000000000e+01 6.700000000000000000e+01 8.600000000000000000e+01 1.060000000000000000e+02 1.330000000000000000e+02 1.510000000000000000e+02 2.060000000000000000e+02 2.560000000000000000e+02 3.140000000000000000e+02 3.890000000000000000e+02 4.850000000000000000e+02 5.880000000000000000e+02 7.130000000000000000e+02 8.640000000000000000e+02 1.048000000000000000e+03 1.160000000000000000e+03 1.172000000000000000e+03 1.213000000000000000e+03 1.093000000000000000e+03 8.660000000000000000e+02 6.180000000000000000e+02 4.200000000000000000e+02 2.250000000000000000e+02 1.550000000000000000e+02 8.300000000000000000e+01 3.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 3.300000000000000000e+01 3.100000000000000000e+01 4.300000000000000000e+01 4.000000000000000000e+01 6.200000000000000000e+01 6.500000000000000000e+01 7.900000000000000000e+01 1.020000000000000000e+02 1.260000000000000000e+02 1.680000000000000000e+02 1.840000000000000000e+02 2.420000000000000000e+02 3.080000000000000000e+02 3.750000000000000000e+02 4.620000000000000000e+02 5.090000000000000000e+02 5.770000000000000000e+02 7.870000000000000000e+02 9.190000000000000000e+02 9.610000000000000000e+02 1.090000000000000000e+03 1.032000000000000000e+03 8.960000000000000000e+02 7.650000000000000000e+02 4.880000000000000000e+02 3.040000000000000000e+02 2.210000000000000000e+02 1.090000000000000000e+02 4.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 nan 3.300000000000000000e+01 3.500000000000000000e+01 3.300000000000000000e+01 4.800000000000000000e+01 5.400000000000000000e+01 6.300000000000000000e+01 9.200000000000000000e+01 1.130000000000000000e+02 1.090000000000000000e+02 1.420000000000000000e+02 1.830000000000000000e+02 2.360000000000000000e+02 2.940000000000000000e+02 3.280000000000000000e+02 3.580000000000000000e+02 4.670000000000000000e+02 5.870000000000000000e+02 6.910000000000000000e+02 7.990000000000000000e+02 8.810000000000000000e+02 9.210000000000000000e+02 8.740000000000000000e+02 7.570000000000000000e+02 5.730000000000000000e+02 3.930000000000000000e+02 2.120000000000000000e+02 1.410000000000000000e+02 6.100000000000000000e+01 2.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.800000000000000000e+01 3.400000000000000000e+01 nan 3.200000000000000000e+01 4.600000000000000000e+01 3.200000000000000000e+01 4.700000000000000000e+01 4.200000000000000000e+01 8.000000000000000000e+01 1.140000000000000000e+02 1.290000000000000000e+02 1.350000000000000000e+02 1.840000000000000000e+02 2.200000000000000000e+02 2.690000000000000000e+02 2.750000000000000000e+02 3.240000000000000000e+02 4.000000000000000000e+02 5.050000000000000000e+02 6.210000000000000000e+02 7.370000000000000000e+02 7.970000000000000000e+02 8.460000000000000000e+02 7.590000000000000000e+02 6.350000000000000000e+02 4.410000000000000000e+02 2.710000000000000000e+02 1.560000000000000000e+02 7.300000000000000000e+01 4.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 nan 2.800000000000000000e+01 3.400000000000000000e+01 3.300000000000000000e+01 3.200000000000000000e+01 3.800000000000000000e+01 4.500000000000000000e+01 4.700000000000000000e+01 6.700000000000000000e+01 7.900000000000000000e+01 9.700000000000000000e+01 1.370000000000000000e+02 1.800000000000000000e+02 1.960000000000000000e+02 2.960000000000000000e+02 2.940000000000000000e+02 3.040000000000000000e+02 3.710000000000000000e+02 4.610000000000000000e+02 5.230000000000000000e+02 6.260000000000000000e+02 7.000000000000000000e+02 6.770000000000000000e+02 6.810000000000000000e+02 5.100000000000000000e+02 3.340000000000000000e+02 2.040000000000000000e+02 1.030000000000000000e+02 5.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 3.700000000000000000e+01 3.500000000000000000e+01 3.900000000000000000e+01 5.500000000000000000e+01 5.900000000000000000e+01 5.900000000000000000e+01 9.600000000000000000e+01 9.700000000000000000e+01 1.210000000000000000e+02 1.460000000000000000e+02 1.910000000000000000e+02 2.250000000000000000e+02 2.260000000000000000e+02 2.580000000000000000e+02 2.960000000000000000e+02 3.500000000000000000e+02 4.770000000000000000e+02 5.380000000000000000e+02 6.020000000000000000e+02 5.980000000000000000e+02 5.420000000000000000e+02 4.240000000000000000e+02 2.350000000000000000e+02 1.470000000000000000e+02 7.300000000000000000e+01 3.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 nan 2.800000000000000000e+01 3.500000000000000000e+01 3.100000000000000000e+01 6.000000000000000000e+01 6.600000000000000000e+01 9.500000000000000000e+01 9.100000000000000000e+01 1.190000000000000000e+02 1.420000000000000000e+02 1.670000000000000000e+02 2.220000000000000000e+02 2.330000000000000000e+02 1.940000000000000000e+02 2.430000000000000000e+02 2.800000000000000000e+02 3.830000000000000000e+02 4.800000000000000000e+02 5.120000000000000000e+02 5.220000000000000000e+02 4.070000000000000000e+02 3.300000000000000000e+02 1.910000000000000000e+02 1.020000000000000000e+02 6.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 nan nan 2.500000000000000000e+01 3.200000000000000000e+01 3.800000000000000000e+01 4.900000000000000000e+01 6.300000000000000000e+01 9.300000000000000000e+01 8.900000000000000000e+01 1.270000000000000000e+02 1.630000000000000000e+02 1.630000000000000000e+02 1.700000000000000000e+02 1.860000000000000000e+02 1.890000000000000000e+02 2.810000000000000000e+02 3.450000000000000000e+02 4.450000000000000000e+02 4.670000000000000000e+02 4.140000000000000000e+02 3.350000000000000000e+02 2.160000000000000000e+02 1.240000000000000000e+02 5.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 2.700000000000000000e+01 2.600000000000000000e+01 nan 2.600000000000000000e+01 nan 4.400000000000000000e+01 3.700000000000000000e+01 4.100000000000000000e+01 6.800000000000000000e+01 8.500000000000000000e+01 1.040000000000000000e+02 1.220000000000000000e+02 1.540000000000000000e+02 1.240000000000000000e+02 1.390000000000000000e+02 1.500000000000000000e+02 1.810000000000000000e+02 2.460000000000000000e+02 3.290000000000000000e+02 3.550000000000000000e+02 4.120000000000000000e+02 3.750000000000000000e+02 2.280000000000000000e+02 1.700000000000000000e+02 7.800000000000000000e+01 4.400000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 nan 3.600000000000000000e+01 3.700000000000000000e+01 3.200000000000000000e+01 5.500000000000000000e+01 6.900000000000000000e+01 7.900000000000000000e+01 9.100000000000000000e+01 1.170000000000000000e+02 1.210000000000000000e+02 1.250000000000000000e+02 1.100000000000000000e+02 1.310000000000000000e+02 1.670000000000000000e+02 2.290000000000000000e+02 2.740000000000000000e+02 3.520000000000000000e+02 3.370000000000000000e+02 2.830000000000000000e+02 2.070000000000000000e+02 9.200000000000000000e+01 6.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.400000000000000000e+01 nan 3.300000000000000000e+01 3.600000000000000000e+01 3.600000000000000000e+01 3.500000000000000000e+01 5.500000000000000000e+01 7.100000000000000000e+01 9.000000000000000000e+01 9.000000000000000000e+01 8.500000000000000000e+01 1.060000000000000000e+02 1.050000000000000000e+02 1.060000000000000000e+02 1.390000000000000000e+02 1.920000000000000000e+02 2.520000000000000000e+02 2.760000000000000000e+02 3.000000000000000000e+02 2.160000000000000000e+02 1.180000000000000000e+02 6.600000000000000000e+01 4.100000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 3.700000000000000000e+01 4.900000000000000000e+01 6.000000000000000000e+01 6.400000000000000000e+01 7.500000000000000000e+01 7.200000000000000000e+01 7.200000000000000000e+01 7.600000000000000000e+01 5.600000000000000000e+01 9.300000000000000000e+01 1.200000000000000000e+02 1.790000000000000000e+02 2.460000000000000000e+02 2.820000000000000000e+02 2.600000000000000000e+02 1.600000000000000000e+02 8.800000000000000000e+01 3.900000000000000000e+01 2.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 nan nan nan 4.000000000000000000e+01 3.000000000000000000e+01 5.200000000000000000e+01 3.600000000000000000e+01 5.900000000000000000e+01 6.900000000000000000e+01 6.900000000000000000e+01 8.800000000000000000e+01 6.400000000000000000e+01 7.200000000000000000e+01 1.090000000000000000e+02 1.810000000000000000e+02 2.130000000000000000e+02 2.430000000000000000e+02 1.860000000000000000e+02 1.220000000000000000e+02 7.300000000000000000e+01 2.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.200000000000000000e+01 3.200000000000000000e+01 3.700000000000000000e+01 5.400000000000000000e+01 7.200000000000000000e+01 6.100000000000000000e+01 5.700000000000000000e+01 5.400000000000000000e+01 7.000000000000000000e+01 1.150000000000000000e+02 1.750000000000000000e+02 1.920000000000000000e+02 1.810000000000000000e+02 1.360000000000000000e+02 7.800000000000000000e+01 3.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 nan 2.900000000000000000e+01 5.200000000000000000e+01 5.800000000000000000e+01 5.100000000000000000e+01 5.900000000000000000e+01 3.400000000000000000e+01 3.400000000000000000e+01 6.100000000000000000e+01 1.180000000000000000e+02 1.800000000000000000e+02 1.880000000000000000e+02 1.560000000000000000e+02 9.700000000000000000e+01 3.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.100000000000000000e+01 5.200000000000000000e+01 3.400000000000000000e+01 4.100000000000000000e+01 4.600000000000000000e+01 3.400000000000000000e+01 5.100000000000000000e+01 6.200000000000000000e+01 1.330000000000000000e+02 1.610000000000000000e+02 1.290000000000000000e+02 1.070000000000000000e+02 5.600000000000000000e+01 2.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.800000000000000000e+01 3.600000000000000000e+01 3.900000000000000000e+01 2.900000000000000000e+01 2.500000000000000000e+01 nan 3.300000000000000000e+01 7.600000000000000000e+01 1.070000000000000000e+02 1.370000000000000000e+02 1.110000000000000000e+02 5.600000000000000000e+01 3.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.600000000000000000e+01 3.800000000000000000e+01 3.700000000000000000e+01 2.700000000000000000e+01 nan nan 3.500000000000000000e+01 7.000000000000000000e+01 1.190000000000000000e+02 1.340000000000000000e+02 7.200000000000000000e+01 3.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e+01 nan 2.800000000000000000e+01 3.100000000000000000e+01 2.900000000000000000e+01 nan 2.600000000000000000e+01 4.800000000000000000e+01 8.500000000000000000e+01 1.070000000000000000e+02 1.170000000000000000e+02 6.400000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.700000000000000000e+01 nan nan nan nan 4.900000000000000000e+01 8.200000000000000000e+01 1.040000000000000000e+02 5.900000000000000000e+01 3.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.700000000000000000e+01 7.400000000000000000e+01 8.800000000000000000e+01 7.600000000000000000e+01 3.900000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.500000000000000000e+01 6.700000000000000000e+01 8.800000000000000000e+01 6.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.100000000000000000e+01 7.100000000000000000e+01 7.300000000000000000e+01 3.300000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 6.600000000000000000e+01 7.900000000000000000e+01 5.800000000000000000e+01 2.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.400000000000000000e+01 4.900000000000000000e+01 3.500000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.200000000000000000e+01 4.600000000000000000e+01 2.800000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.400000000000000000e+01 5.400000000000000000e+01 4.600000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.400000000000000000e+01 2.700000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 3.200000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.000000000000000000e+01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan diff --git a/data/hr__beta_lyr.png b/data/hr__beta_lyr.png new file mode 100644 index 0000000..415bc11 Binary files /dev/null and b/data/hr__beta_lyr.png differ diff --git a/data/hr__cepheid.png b/data/hr__cepheid.png new file mode 100644 index 0000000..5a51a71 Binary files /dev/null and b/data/hr__cepheid.png differ diff --git a/data/hr__cv.png b/data/hr__cv.png new file mode 100644 index 0000000..515ff9d Binary files /dev/null and b/data/hr__cv.png differ diff --git a/data/hr__delta_scuti.png b/data/hr__delta_scuti.png new file mode 100644 index 0000000..7dc9898 Binary files /dev/null and b/data/hr__delta_scuti.png differ diff --git a/data/hr__flaring.png b/data/hr__flaring.png new file mode 100644 index 0000000..22f1e5a Binary files /dev/null and b/data/hr__flaring.png differ diff --git a/data/hr__lpv.png b/data/hr__lpv.png new file mode 100644 index 0000000..330b68c Binary files /dev/null and b/data/hr__lpv.png differ diff --git a/data/hr__periodic.png b/data/hr__periodic.png new file mode 100644 index 0000000..10c6f0e Binary files /dev/null and b/data/hr__periodic.png differ diff --git a/data/hr__rr_lyr.png b/data/hr__rr_lyr.png new file mode 100644 index 0000000..e35f698 Binary files /dev/null and b/data/hr__rr_lyr.png differ diff --git a/data/hr__variable.png b/data/hr__variable.png new file mode 100644 index 0000000..b03d667 Binary files /dev/null and b/data/hr__variable.png differ diff --git a/data/hr__w_uma.png b/data/hr__w_uma.png new file mode 100644 index 0000000..9cdd257 Binary files /dev/null and b/data/hr__w_uma.png differ diff --git a/data/mira.png b/data/mira.png new file mode 100644 index 0000000..c67de0c Binary files /dev/null and b/data/mira.png differ diff --git a/data/period__beta_lyr.png b/data/period__beta_lyr.png new file mode 100644 index 0000000..9ff2edc Binary files /dev/null and b/data/period__beta_lyr.png differ diff --git a/data/period__cepheid.png b/data/period__cepheid.png new file mode 100644 index 0000000..8a3b8c5 Binary files /dev/null and b/data/period__cepheid.png differ diff --git a/data/period__cv.png b/data/period__cv.png new file mode 100644 index 0000000..2b836d8 Binary files /dev/null and b/data/period__cv.png differ diff --git a/data/period__delta_scuti.png b/data/period__delta_scuti.png new file mode 100644 index 0000000..40036fd Binary files /dev/null and b/data/period__delta_scuti.png differ diff --git a/data/period__flaring.png b/data/period__flaring.png new file mode 100644 index 0000000..f1aa4fb Binary files /dev/null and b/data/period__flaring.png differ diff --git a/data/period__lpv.png b/data/period__lpv.png new file mode 100644 index 0000000..b7f365e Binary files /dev/null and b/data/period__lpv.png differ diff --git a/data/period__periodic.png b/data/period__periodic.png new file mode 100644 index 0000000..8fdacda Binary files /dev/null and b/data/period__periodic.png differ diff --git a/data/period__rr_lyr.png b/data/period__rr_lyr.png new file mode 100644 index 0000000..8a739a2 Binary files /dev/null and b/data/period__rr_lyr.png differ diff --git a/data/period__variable.png b/data/period__variable.png new file mode 100644 index 0000000..38155f9 Binary files /dev/null and b/data/period__variable.png differ diff --git a/data/period__w_uma.png b/data/period__w_uma.png new file mode 100644 index 0000000..412fd0b Binary files /dev/null and b/data/period__w_uma.png differ diff --git a/data/periodic.png b/data/periodic.png new file mode 100644 index 0000000..8b41dd1 Binary files /dev/null and b/data/periodic.png differ diff --git a/data/radec__beta_lyr.png b/data/radec__beta_lyr.png new file mode 100644 index 0000000..d5ffb4d Binary files /dev/null and b/data/radec__beta_lyr.png differ diff --git a/data/radec__cepheid.png b/data/radec__cepheid.png new file mode 100644 index 0000000..0e98b4e Binary files /dev/null and b/data/radec__cepheid.png differ diff --git a/data/radec__cv.png b/data/radec__cv.png new file mode 100644 index 0000000..ed3e0be Binary files /dev/null and b/data/radec__cv.png differ diff --git a/data/radec__delta_scuti.png b/data/radec__delta_scuti.png new file mode 100644 index 0000000..1bc8649 Binary files /dev/null and b/data/radec__delta_scuti.png differ diff --git a/data/radec__flaring.png b/data/radec__flaring.png new file mode 100644 index 0000000..c4ab7b5 Binary files /dev/null and b/data/radec__flaring.png differ diff --git a/data/radec__lpv.png b/data/radec__lpv.png new file mode 100644 index 0000000..c24db87 Binary files /dev/null and b/data/radec__lpv.png differ diff --git a/data/radec__periodic.png b/data/radec__periodic.png new file mode 100644 index 0000000..f582ed3 Binary files /dev/null and b/data/radec__periodic.png differ diff --git a/data/radec__rr_lyr.png b/data/radec__rr_lyr.png new file mode 100644 index 0000000..7e7caff Binary files /dev/null and b/data/radec__rr_lyr.png differ diff --git a/data/radec__variable.png b/data/radec__variable.png new file mode 100644 index 0000000..aeeaf98 Binary files /dev/null and b/data/radec__variable.png differ diff --git a/data/radec__w_uma.png b/data/radec__w_uma.png new file mode 100644 index 0000000..51a942c Binary files /dev/null and b/data/radec__w_uma.png differ diff --git a/data/rr_lyr_ab.png b/data/rr_lyr_ab.png new file mode 100644 index 0000000..602b5ae Binary files /dev/null and b/data/rr_lyr_ab.png differ diff --git a/data/rr_lyr_c.png b/data/rr_lyr_c.png new file mode 100644 index 0000000..cd49b61 Binary files /dev/null and b/data/rr_lyr_c.png differ diff --git a/data/srv.png b/data/srv.png new file mode 100644 index 0000000..dc5d42f Binary files /dev/null and b/data/srv.png differ diff --git a/data/variable.png b/data/variable.png new file mode 100644 index 0000000..761523f Binary files /dev/null and b/data/variable.png differ diff --git a/data/w_uma.png b/data/w_uma.png new file mode 100644 index 0000000..8507ccb Binary files /dev/null and b/data/w_uma.png differ diff --git a/developer.html b/developer.html new file mode 100644 index 0000000..cde016f --- /dev/null +++ b/developer.html @@ -0,0 +1,448 @@ + + + + + + + Installation/Developer Guidelines + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Installation/Developer Guidelines

+
+

Science users

+
    +
  • Create and activate a virtual/conda environment with Python 3.11, e.g:

    +
    conda create -n scope-env python=3.11
    +conda activate scope-env
    +
    +
    +
  • +
  • Install the latest release of scope-ml from PyPI:

    +
    pip install scope-ml
    +
    +
    +
  • +
  • In the directory of your choice, run the initialization script. This will create the required directories and copy the necessary files to run the code:

    +
    scope-initialize
    +
    +
    +
  • +
  • Change directories to scope and modify config.yaml to finish the initialization process. This config file is used by default when running all scripts. You can also specify another config file using the --config-path argument.

  • +
+
+
+

Developers/contributors

+
    +
  • Create your own fork the scope repository by clicking the “fork” button. Then, decide whether you would like to use HTTPS (easier for beginners) or SSH.

  • +
  • Following one set of instructions below, clone (download) your copy of the repository, and set up a remote called upstream that points to the main scope repository.

  • +
+
+

HTTPS:

+
git clone https://github.com/<yourname>/scope.git && cd scope
+git remote add upstream https://github.com/ZwickyTransientFacility/scope.git
+
+
+
+
+

SSH:

+ +
git clone git@github.com:<yourname>/scope.git && cd scope
+git remote add upstream git@github.com:ZwickyTransientFacility/scope.git
+
+
+
+
+

Setting up your environment (Windows/Linux/macOS)

+
+

Use a package manager for installation

+

We currently recommend running scope with Python 3.11. You may want to begin your installation by creating/activating a virtual environment, for example using conda. We specifically recommend installing miniforge3 (https://github.com/conda-forge/miniforge).

+

Once you have a package manager installed, run:

+
conda create -n scope-env -c conda-forge python=3.11
+conda activate scope-env
+
+
+
+
+

(Optional): Update your PYTHONPATH

+

If you plan to import from scope, ensure that Python can import from scope by modifying the PYTHONPATH environment variable. Use a simple text editor like nano to modify the appropriate file (depending on which shell you are using). For example, if using bash, run nano ~/.bash_profile and add the following line:

+
export PYTHONPATH="$PYTHONPATH:$HOME/scope"
+
+
+

Save the updated file (Ctrl+O in nano) and close/reopen your terminal for this change to be recognized. Then cd back into scope and activate your scope-env again.

+
+
+
+

Install required packages

+

Ensure you are in the scope directory that contains pyproject.toml. Then, install the required python packages by running:

+
pip install .
+
+
+
+

Install dev requirements, pre-commit hook

+

We use black to format the code and flake8 to verify that code complies with PEP8. +Please install our dev requirements and pre-commit hook as follows:

+
pip install -r dev-requirements.txt
+pre-commit install
+
+
+

This will check your changes before each commit to ensure that they +conform with our code style standards. We use black to reformat Python +code.

+

The pre-commit hook will lint changes made to the source.

+
+
+

Create and modify config.yaml

+

From the included config.defaults.yaml, make a copy called config.yaml:

+
cp config.defaults.yaml config.yaml
+
+
+

Edit config.yaml to include Kowalski instance and Fritz tokens in the associated empty token: fields.

+
+
+

Testing

+

Run scope-test to test your installation. Note that for the test to pass, you will need access to the Kowalski database. If you do not have Kowalski access, you can run scope-test-limited to run a more limited (but still useful) set of tests.

+
+
+
+

Troubleshooting

+

Upon encountering installation/testing errors, manually install the package in question using conda install xxx , and remove it from .requirements/dev.txt. After that, re-run pip install -r requirements.txt to continue.

+
+

Known issues

+
    +
  • If using GPU-accelerated period-finding algorithms for feature generation, you will need to install periodfind separately from the source.

  • +
  • Across all platforms, we are currently aware of scope dependency issues with Python 3.12.

  • +
  • Anaconda continues to cause problems with environment setup.

  • +
  • Using pip to install healpy on an arm64 Mac can raise an error upon import. We recommend including h5py as a requirement during the creation of your conda environment.

  • +
  • On Windows machines, healpy and cesium raise errors upon installation.

    +
      +
    • For healpy, see this guide for a potential workaround.

    • +
    • For cesium, try to install from the source (https://cesium-ml.org/docs/install.html#from-source) within scope. If you will not be running feature generation, this is not a critical error, but there will be points in the code that fail (e.g. scope.py test, tools/generate_features.py)

    • +
    +
  • +
+

If the installation continues to raise errors, update the conda environment and try again.

+
+
+
+

How to contribute

+

Contributions to scope are made through GitHub Pull Requests, a set of proposed commits (or patches):

+
    +
  1. Download the latest version of scope, and create a new branch for your work.

    +

    Here, let’s say we want to contribute some documentation fixes; we’ll call our branch rewrite-contributor-guide.

    +
    git checkout main
    +git pull upstream main
    +git checkout -b rewrite-contributor-guide
    +
    +
    +
  2. +
  3. Make modifications to scope and commit your changes using git add and git commit. +Each commit message should consist of a summary line and a longer description, e.g.:

    +
    Rewrite the contributor guide
    +While reading through the contributor guide, I noticed several places
    +in which instructions were out of order. I therefore reorganized all
    +sections to follow logically, and fixed several grammar mistakes along
    +the way.
    +
    +
    +
  4. +
  5. When ready, push your branch to GitHub:

    +
    git push origin rewrite-contributor-guide
    +
    +
    +

    Once the branch is uploaded, GitHub should print a URL for turning your branch into a pull request. +Open that URL in your browser, write an informative title and description for your pull request, and submit it.

    +
  6. +
  7. The team will now review your contribution, and suggest changes. +To simplify review, please limit pull requests to one logical set of changes. +To incorporate changes recommended by the reviewers, commit edits to your branch, and push to the branch again +(there is no need to re-create the pull request, it will automatically track modifications to your branch).

  8. +
  9. Sometimes, while you were working on your feature, the main branch is updated with new commits, potentially +resulting in conflicts with your feature branch. The are two ways to resolve this situation - merging and rebasing, +please look here for a detailed discussion. +While both ways are acceptable, since we are squashing commits from a PR before merging, we prefer the first option:

    +
    git merge rewrite-contributor-guide upstream/main
    +
    +
    +
  10. +
+

Developers may merge main into their branch as many times as they want to.

+
    +
  1. Once the pull request has been reviewed and approved by at least one team member, it will be merged into scope.

  2. +
+
+

Releasing on PyPI

+

As new features are added to the code, maintainers should occasionally initiate a new release of the scope-ml PyPI package. To do this, first bump the version of the package in pyproject.toml and scope/__init__.py to the intended vX.Y.Z format. Then, navigate to “Releases” in the SCoPe GitHub repo and click “Draft a new release”. Enter the version number in “Choose a tag” and click “Generate release notes”. It is also advisable to check the box creating a discussion for the release before clicking “Publish release”.

+

Upon release, the publish-to-pypi.yml workflow will use GitHub Actions to publish a new version of the package to PyPI automatically. Note that if the version number has not yet been manually updated in pyproject.toml, this workflow will fail.

+
+
+
+

Contributing Field Guide sections

+

If you would like to contribute a Field Guide section, please follow the steps below.

+
    +
  • Make sure to follow the steps described above in the “How to contribute” section!

  • +
  • Add sections to config.defaults.yaml under docs.field_guide.<object_class_type>.

    +
      +
    • Use docs.field_guide.rr_lyr_ab as an example. You need to specify the object’s +coordinates and a title for the generated light curve plot. Optionally, +you may specify a period [days] - then a phase-folded light curve will also be rendered.

    • +
    +
  • +
  • Make sure your config.yaml file contains a valid Kowalski token.

    +
      +
    • See here on how to generate one +(Kowalski account required).

    • +
    • You can use config.defaults.yaml as a template.

    • +
    +
  • +
  • Make sure the structure of your config file is the same as the default, +i.e. you propagated the changes in config.defaults.yaml. +(otherwise the scope.py utility will later complain and ask you to fix that).

  • +
  • Add a Markdown file to doc/ and call it field_guide__<object_class>.md.

    +
      +
    • Use doc/field_guide__rr_lyrae.md as a template.

    • +
    • Light curve examples will be generated as data/<object_class_type>.png files using the info +you provided in the config.

    • +
    • Add the following include statements to doc/field_guide.md:

    • +
    +
  • +
+
{include} ./field_guide__<object_class>.md
+
+
+
    +
  • If you wish to render a sample Gaia-based HR diagram, you need to create a “Golden” data set +for that class of objects and put it under data/golden as <object_class>.csv

    +
      +
    • The csv file must follow the same structure as [data/golden/rr_lyr.csv]. +Please keep the csv header (“ra,dec”) and provide object coordinates in degrees.

    • +
    • The HR diagram will be generated as data/hr__<object_class>.png

    • +
    +
  • +
  • Run the ./scope.py doc command to generate the imagery and build the documentation.

    + +
  • +
  • Once you’re happy with the result, commit the changes to a branch on your fork +and open a pull request on GitHub (see the “How to contribute” section above).

    +
      +
    • The GitHub Actions CI will run a subset of the testing/deployment pipeline +for each commit you make to your branch - +make sure you get a green checkmark next to the commit hash.

    • +
    • Once the PR is reviewed, approved, and merged, +the CI will automatically build and deploy the docs to +https://scope.ztf.dev

    • +
    +
  • +
+
+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/field_guide.html b/field_guide.html new file mode 100644 index 0000000..a233f61 --- /dev/null +++ b/field_guide.html @@ -0,0 +1,825 @@ + + + + + + + Field guide + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Field guide

+

This guide provides detailed information about the different types of variable sources along with examples of bogus variability.

+

Proceed here to interactively inspect the taxonomy +tree we are employing in SCoPe. Please refer to arXiv:2102.11304 +for more details on the taxonomy.

+
+

Variable stars (vnv)

+

Variable stars are objects whose brightness is varying at a statistically significant level. +ZTF has statistical measurements depend on magnitude: down to ~10 millimagnitudes for bright stars and >0.1 mag for objects near the detection limit. +Many astrophysical objects exhibit variable behavior, including periodic variables such as eclipsing binaries, pulsators, etc, and non-periodic variables such as AGN and YSOs.

+
+

Classification and numbers

+
    +
  • Subtypes

    +
      +
    • Irregular

    • +
    • Flaring

    • +
    • Periodic

    • +
    • Dipping

    • +
    • Long Time Scale

    • +
    +
  • +
+
+
+

ZTF light curves

+

ZTF variable

+
+

Description

+

Most stars are likely to be variable at some level. Therefore, variable is defined to be those varying at a statistically varying level, with millimagnitude to magnitude level variations.

+
+
+

Light curve characteristics

+
    +
  • amplitude: varies from survey precision to more than a magnitude

  • +
+

HR diagram of Variable

+

RA/Dec diagram of Variable

+
+
+
+

References and further reading:

+
    +
  • Jayasinghe et al., 2018, MNRAS 447 3, The ASAS-SN catalogue of variable stars I: The Serendipitous Survey arxiv:1803.01001

  • +
+
+
+
+

Periodic Variables (pnp)

+

Periodic Variables are objects that exhibit repeating sequences of values over a fixed length of time, known as the period. +Many astrophysical objects exhibit periodic behavior, including eclipsing binaries, pulsators, etc.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    +
  • +
  • Subtypes

    +
      +
    • Eclipsing

    • +
    • Sinusoidal

    • +
    • Sawtooth

    • +
    • Elliptical

    • +
    +
  • +
+
+
+

ZTF light curves

+

ZTF periodic

+
+

Description

+

Periodic variables have periods ranging from minutes to over a thousand days with millimagnitude to magnitude level variations.

+
+
+

Light curve characteristics

+
    +
  • periodic variable: objects that exhibit repeating sequences of values over a fixed length of time

  • +
  • period range: 0.001-1000 days

  • +
  • amplitude: varies from survey precision to more than a magnitude

  • +
+

HR diagram of Periodic

+

RA/Dec diagram of Periodic

+
+
+
+

References and further reading:

+
    +
  • Drake et al., 2014, ApJS 618 213 9, The Catalina Surveys Periodic Variable Catalog arxiv:1405.4290

  • +
+
+
+
+

RR Lyrae (rrlyr)

+

RR Lyrae are pulsating horizontal branch dA/dF stars with a mass 0.5 of Solar masses. +They are part of the main ‘instability strip’ in the HR-diagram, +where stars pulsate due to the double ionisation of He. +The two main subtypes are ab and c,

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • periodic

    • +
    • pulsator

    • +
    +
  • +
  • Subtypes

    +
      +
    • RR Lyrae ab

    • +
    • RR Lyrae c

    • +
    +
  • +
  • Occurrence rate: very common, about 105 expected in ZTF data

  • +
+
+
+

ZTF light curves

+

ZTF rrlyr ab +ZTF rrlyr c

+
+

Description

+

RR Lyrae (ab) are easy to recognise by their distinctive light curve shape and +high amplitude variability. +RR Lyrae (c) are a bit more of a challenge since their light curve shape is more sinusoidal. +For low-SNR cases they can sometimes be confused with contact binaries (EW), +which occur at similar periods and have sinusoidal-like light curves.

+
+
+

Light curve characteristics

+
    +
  • periodic variable

  • +
  • period range: 0.2-1 days

  • +
  • amplitude: up to 1 mag (subtype ab), or 0.5 mag (subtype c)

  • +
  • light curve shape:

    +
      +
    • sawtooth; steep rise and slow decay (subtype ab)

    • +
    • periodic sinusoidal (subtype c)

    • +
    +
  • +
  • can show modulation of the light curve shape on timescales of ~100 days (Blazhko effect)

  • +
+
+
+

Other characteristics and selection methods

+
    +
  • intrinsic RR Lyrae colors: blue, that of A/F type main sequence stars (g-r = -0.1 – 0.5). +Reddening can be significant since these stars can be detected at large distances.

  • +
  • absolute magnitude: -1<G<1

  • +
+

HR diagram of RRlyrae

+

RA/Dec diagram of RRlyrae

+
+
+
+

References and further reading:

+
    +
  • Sterken & Jasschek: Light curves of variable stars

  • +
+
+
+
+

W Uma (wuma)

+

W UMa stars are main-sequence overcontact binaries. In overcontact binaries both stars are too large for their Roche lobe share a common envelope and can exchange mass and energy. The mass-ratio of the system ranges from 1 to 10 in extreme cases. Components can have different raddii and surface brightness with temperatures ranging from 4000 to 9000K.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • periodic

    • +
    • binary

    • +
    • eclipsing

    • +
    +
  • +
  • Occurrence rate: very common, about 105 expected in ZTF data

  • +
+
+
+

ZTF light curves

+

ZTF wuma

+
+

Description

+

Contact binary lightcurves show a distinctive shape that shows two eclipses which do smoothly transition over. Eclipses can have a flat bottom. The eclipse depth is often identical, but can be show slightly different depths. In rare cases there can be differences in the maxima of the lightcurves (e.g. due to starspots).

+
+
+

Light curve characteristics

+
    +
  • periodic variable

  • +
  • period range: 0.22-0.8 days

  • +
  • amplitude: up to 0.75 mag

  • +
  • light curve shape: EW, two ‘V’-shaped eclipses with smooth transitions

  • +
  • eclipses often equal depth, within 0.1mag

  • +
+
+
+

Other characteristics and selection methods

+
    +
  • g-r = -0.1 – 1.0. Short period systems are typically redder.

  • +
  • absolute magnitudes are similar to main-sequence stars

  • +
+

HR diagram of W Uma

+

RA/Dec diagram of W Uma

+
+
+
+

References and further reading:

+
    +
  • Sterken & Jasschek: Light curves of variable stars

  • +
  • Marsh et al, MNRAS 465, 4678–4689, 2017

  • +
+
+
+
+

Delta Scuti (dscu)

+

Delta Scuti variables are classic pulsating stars (i.e., they are stars passing through the instability strip). As these stars expand and contract (i.e. pulsate) their size and temperature changes leading to regular, smooth variations in their brightness. Delta Scuti stars are smaller than both Cepheids and RR Lyrae stars, which leads to a short period of oscillations (typically anywhere between 0.03 days and 0.3 days).

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • periodic

    • +
    • pulsator

    • +
    +
  • +
  • Occurrence rate: very common, about 104 expected in ZTF data

  • +
+
+
+

ZTF light curves

+

ZTF delta_scuti

+
+

Description

+

Delta Scuti are easy to recognise by their distinctive light curve shape and period range, which distinguishes them from RR Lyrae and Cepheids.

+
+
+

Light curve characteristics

+
    +
  • periodic variable

  • +
  • period range: 0.03-0.3 days

  • +
  • amplitude: Small amplitude (between 0.05 and 0.3)

  • +
  • light curve shape:

    +
      +
    • smooth, sawtooth variations (blue/green filters show stronger sawtooth pattern); steep rise and slow decay

    • +
    +
  • +
+
+
+

Other characteristics and selection methods

+
    +
  • intrinsic Delta Scuti colors: blue, that of A/F type main sequence stars (g-r = -0.1 – 0.5). +Reddening can be significant since these stars can be detected at large distances.

  • +
  • absolute magnitude: 0<G<5

  • +
+

HR diagram of Delta Scuti

+

RA/Dec diagram of Delta Scuti

+
+
+
+

References and further reading:

+
    +
  • Sterken & Jasschek: Light curves of variable stars

  • +
+
+
+
+

Classical Cepheids (ceph)

+

Classical Cepheids are young, bright (100-10,000 solar luminosities) supergiant stars that pulsate with periods of 1 to 100 days (typically several days). They are located in the main instability strip in the H-R diagram. Cepheids follow a famous pulsation period-luminosity relation, allowing the absolute magnitude of a Cepheid, and thus its distance, to be inferred from the pulsation period. Thus, Cepheids are used to measure distances to nearby galaxies.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • periodic

    • +
    • pulsator

    • +
    +
  • +
  • Occurrence rate: rare, about 103 expected in ZTF data, mostly in the Galactic plane and in M31

  • +
+
+
+

ZTF light curves

+

ZTF cepheids +ZTF cepheids +ZTF cepheids +ZTF cepheids

+
+

Description

+

Fundamental-mode Cepheids are easy to recognise by their distinctive sawtooth light curve shape (with a rapid rise to maximum light and a slower decline) and period range (from 1 to 100 days). A secondary bump may be seen in the light curves of some Cepheids with periods in the range 6-20 days. Cepheids pulsating in the first overtone have lower amplitudes and more symmetric light curves than fundamental-mode Cepheids. Their periods (in the Milky Way) range from 0.24 to 8 days. The lower period limit is arbitrary since there is no natural boundary between first-overtone Cepheids and delta Scuti stars. Some Cepheids pulsate both in the fundamental mode and first overtone, the period ratio ranges from 0.68 to 0.77.

+
+
+

Light curve characteristics

+
    +
  • periodic variable

  • +
  • period range: 1-100 days (fundamental-mode pulsators), 0.24-8 days (first-overtone pulsators)

  • +
  • amplitude: moderate amplitude (~0.3 to 0.8 mag)

  • +
  • light curve shape:

    +
      +
    • smooth, sawtooth variations (blue/green filters show stronger sawtooth pattern); steep rise and slow decay

    • +
    • Classical Cepheids with pulsation periods 6-20 days may have a secondary bump

    • +
    +
  • +
+
+
+

Other characteristics and selection methods

+
    +
  • intrinsic Cepheids colors: Bp-Rp = 0.8 – 2.0 mag, but as these stars are located near the Galactic plane, the reddening may be significant

  • +
  • absolute magnitude: -6<G<-2

  • +
  • located close to the Galactic plane (within ~10 degrees)

  • +
+

HR diagram of classical Cepheids

+

RA/Dec diagram of classical Cepheids

+

Period histogram of classical Cepheids

+
+
+
+

References and further reading:

+ +
+
+
+

Cataclysmic Variables (cv)

+

Cataclysmic variables are close binaries with active mass transfer from a late +type main sequence star or brown dwarf to a white dwarf. There are several different +types of CVs, depending on their causes of variability. These include novae (which +have 9-15 mag outbursts from thermonuclear events on the white dwarf surface), dwarf novae which have 2-9 mag outbursts on weeks to decades timescales due to disk instabilities) and novalikes which do not have outbursts but have high and low states of accretion which cause several magnitudes of brightness change.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • aperiodic outbursts

    • +
    • aperiodic high and low states

    • +
    • periodic orbital variability

    • +
    +
  • +
  • Subtypes

    +
      +
    • Nova

    • +
    • U Gem dwarf nova

    • +
    • Z Cam dwarf nova

    • +
    • SU UMa/WZ Sge dwarf nova

    • +
    • Novalike

    • +
    +
  • +
  • Occurrence rate: common, several thousand expected in ZTF data

  • +
+
+
+

ZTF light curves

+

ZTF CV U Gem +ZTF CV Z Cam +ZTF CV SU UMa +ZTF CV Novalike

+
+

Description

+

CVs are easy to recognize by their distinctive light curve shape, colors and +high amplitude variability. The outbursts are non-periodic. +They can sometimes be confused with supernovae, flare stars or long period variables.

+
+
+

Light curve characteristics

+
    +
  • non-periodic variable but recur on some timescale

  • +
  • outburst timescale range: days to decades

  • +
  • amplitude: 9-15 mag (nova), 2-9 mag (dwarf nova), 1-4 mag (novalike)

  • +
  • light curve shape:

    +
      +
    • sawtooth; steep rise and slow decay (subtype nova)

    • +
    • symmetrical to slightly sawtooth (subtype U Gem)

    • +
    • standstills about 1 mag below outburst level for weeks (subtype Z Cam)

    • +
    • fast rise and extended plateau for 1-2 weeks followed by steeper decline (subtype SU UMa/WZ Sge)

    • +
    • extended (days-weeks) states at either high or low brightness

    • +
    +
  • +
  • can show periodic modulation of the light curve on orbital timescales of hours

  • +
+
+
+

Other characteristics and selection methods

+
    +
  • intrinsic CV colors: blue, (g-r < 0.6). +Reddening is usually not important except for places in the galactic plane.

  • +
  • absolute magnitude at quiescence: 8<G<14

  • +
+

HR diagram of CVs

+
+
+
+

References and further reading:

+
    +
  • Warner 1995: Cataclysmic Variable Stars

  • +
+
+
+
+

Flaring variables (fla)

+

The phenomelogical classification of flaring is any kind of outbursting source, where a variable star (or binary system) dramatically increases in brightness for minutes to hours before returning to quiescence. Most flare stars are red dwarfs, while RS Canum Venaticorum variables (RS CVn) are also known to flare due to a companion star in the binary system. Other possible sources of flaring include dwarf novae, which arise from accretion disk activity in a cataclysmic variable star.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    +
  • +
  • Occurrence rate: very common, for a given red dwarf, flares 10³¹ - 10³² ergs occur about once per day, and flares 10³³ - 10³⁴ ergs occur about once per 10-100 days.

  • +
+
+
+

ZTF light curves

+

ZTF flaring_dwarfnova

+

ZTF flaring_mdwarf

+
+

Description

+

Flaring stars are easy to recognise by their increase in brightness from quiescent levels, rapidly returning to that same level shortly thereafter.

+
+
+

Light curve characteristics

+
    +
  • variable

  • +
  • increase in brightness before returning to quiescence.

  • +
  • amplitude: at the bright end, flares can be many magnitudes, while at the dim end, flare detection is limited by survey photometric precision.

  • +
+

HR diagram of Flaring

+

RA/Dec diagram of Flaring

+
+
+
+

References and further reading:

+
    +
  • Taichi Kato, WZ Sge-type dwarf novae, Publications of the Astronomical Society of Japan, Volume 67, Issue 6, December 2015, 108 arxiv:1507.07659

  • +
  • Maximilian N. Günther et al 2020 AJ 159 60, arxiv:1901.00443

  • +
+
+
+
+

Beta Lyr (blyr)

+

Semi-detached eclipsing binaries (also called beta Lyrae variables) are binary star systems (i.e. two stars that are in orbit around each other) that are aligned such that they eclipse each other relative to our line of sight from the Earth. Unlike detached EBs, semi-detatched systems are so close to each other that the shape of (at least one of) the stars in the system are distorted, giving rise to the smooth periodic variations even when the system is not eclipsing.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • periodic

    • +
    • binary

    • +
    • eclipsing

    • +
    +
  • +
  • Occurrence rate: very common, about 105 expected in ZTF data

  • +
+
+
+

ZTF light curves

+

ZTF betalyr

+
+

Description

+

Any type of star can be in an eclipsing binary (so they may be small, large, hot, cool, etc.), which in turn can lead to a large range in eclipse amplitudes (though typically these are between 0.1 and ~1 mag, with most in the ~0.3 to 0.75 mag range) or eclipse periods (though our observations are typically only sensitive to periods between 0.1 to ~20 days).

+
+
+

Light curve characteristics

+
    +
  • periodic variable

  • +
  • Range of amplitudes (~0.2 to >1 mag)

  • +
  • Intermediate periods (log Period between -0.5 and 1.4)

  • +
  • light curve shape: EB, round or sinusoidal light curves, with imposed “V-shape” dips in the phase folded light curve

  • +
+

HR diagram of Beta Lyrae

+

Period histogram of Beta Lyrae

+
+
+
+

References and further reading:

+
    +
  • Sterken & Jasschek: Light curves of variable stars

  • +
+
+
+
+

Long Period Variables (lpv)

+

Long Period Variables have periods over several tens of days. +They incorporate various groups of cool luminous pulsators. +The canonical example is Mira.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • periodic

    • +
    • pulsator

    • +
    +
  • +
  • Subtypes

    +
      +
    • Miras

    • +
    • Semiregulars

    • +
    • OSARGs - OGLE Small Amplitude Red Giants (some astronomers do not include these under LPVs)

    • +
    +
  • +
  • Occurrence rate: very common, about 105 expected in ZTF data

  • +
  • Non LPV wth Long Periods

    +
      +
    • RV Tau - Cepheid IIs

    • +
    +
  • +
  • Other possible confusions

    +
      +
    • YSOs - their variations tend to be over shorter periods

    • +
    +
  • +
+
+
+

ZTF light curves

+

ZTF lpv +ZTF lpv

+
+

Description

+

Long period variables have periods from several tens of days to over thousand day and are +easy to identify due to the slow variations.

+
+
+

Light curve characteristics

+
    +
  • periodic variable

  • +
  • period range: 100-1000 days

  • +
  • amplitude: over a mag (Mira), or a few tenths of a mag to 1 or 2 mags (semiregulars)

  • +
  • light curve shape:

    +
      +
    • periodic sinusoidal (Mira)

    • +
    • semiregular (Semiregular)

    • +
    +
  • +
+
+
+

Other characteristics and selection methods

+
    +
  • intrinsic lpv colors: red

  • +
  • absolute magnitude:

  • +
+

HR diagram of LPV

+

RA/Dec diagram of LPV

+
+
+
+

References and further reading:

+
    +
  • Mowlawi et al., 2018, A&A 618, A58, The first Gaia catalogue of long-period variable candidates arxiv:1805.02035

  • +
  • Soszynski et al., 2009, AcA, 59, 239S, The Optical Gravitational Lensing Experiment. The OGLE-III Catalog of Variable Stars. IV. Long-Period Variables in the Large Magellanic Cloud arxix:0910.1354

  • +
  • Soszynski et al., 2008, AcA, 58, 293S, The Optical Gravitational Lensing Experiment. The OGLE-III Catalog of Variable Stars. II.Type II Cepheids and Anomalous Cepheids in the Large Magellanic Cloud arxiv:0811.3636

  • +
+
+
+
+

Bogus variability (bogus)

+

Not all light curve variability pertains to a source’s intrinsic astrophysical nature. Some is caused by nearby extended objects, bright stars, blends and image artifacts, and being aware of how such bogus light curves appear can help avoid confusion.

+
+

ZTF light curves

+

ZTF bogus +ZTF bogus

+
+

Description

+

The first light curve above demonstrates a saturation ghost artifact, and the second light curve suffers from another kind of artifact. These artifacts were identified and affected data masked after ZTF began, but data from earlier releases were not retroactively masked. This produces the apparent cutoff in variability after a certain point in time.

+
+
+

Light curve characteristics

+

The light curves appear to be “flaring” with departures from the median by multiple magnitudes which suddenly stop in later data. This cutoff corresponds to the time when a new method of processing the data was used to mask affected points.

+
+
+
+

References and further reading:

+ +
+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/field_guide__CVs.html b/field_guide__CVs.html new file mode 100644 index 0000000..665bc29 --- /dev/null +++ b/field_guide__CVs.html @@ -0,0 +1,263 @@ + + + + + + + Cataclysmic Variables (cv) + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Cataclysmic Variables (cv)

+

Cataclysmic variables are close binaries with active mass transfer from a late +type main sequence star or brown dwarf to a white dwarf. There are several different +types of CVs, depending on their causes of variability. These include novae (which +have 9-15 mag outbursts from thermonuclear events on the white dwarf surface), dwarf novae which have 2-9 mag outbursts on weeks to decades timescales due to disk instabilities) and novalikes which do not have outbursts but have high and low states of accretion which cause several magnitudes of brightness change.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • aperiodic outbursts

    • +
    • aperiodic high and low states

    • +
    • periodic orbital variability

    • +
    +
  • +
  • Subtypes

    +
      +
    • Nova

    • +
    • U Gem dwarf nova

    • +
    • Z Cam dwarf nova

    • +
    • SU UMa/WZ Sge dwarf nova

    • +
    • Novalike

    • +
    +
  • +
  • Occurrence rate: common, several thousand expected in ZTF data

  • +
+
+
+

ZTF light curves

+

ZTF CV U Gem +ZTF CV Z Cam +ZTF CV SU UMa +ZTF CV Novalike

+
+

Description

+

CVs are easy to recognize by their distinctive light curve shape, colors and +high amplitude variability. The outbursts are non-periodic. +They can sometimes be confused with supernovae, flare stars or long period variables.

+
+
+

Light curve characteristics

+
    +
  • non-periodic variable but recur on some timescale

  • +
  • outburst timescale range: days to decades

  • +
  • amplitude: 9-15 mag (nova), 2-9 mag (dwarf nova), 1-4 mag (novalike)

  • +
  • light curve shape:

    +
      +
    • sawtooth; steep rise and slow decay (subtype nova)

    • +
    • symmetrical to slightly sawtooth (subtype U Gem)

    • +
    • standstills about 1 mag below outburst level for weeks (subtype Z Cam)

    • +
    • fast rise and extended plateau for 1-2 weeks followed by steeper decline (subtype SU UMa/WZ Sge)

    • +
    • extended (days-weeks) states at either high or low brightness

    • +
    +
  • +
  • can show periodic modulation of the light curve on orbital timescales of hours

  • +
+
+
+

Other characteristics and selection methods

+
    +
  • intrinsic CV colors: blue, (g-r < 0.6). +Reddening is usually not important except for places in the galactic plane.

  • +
  • absolute magnitude at quiescence: 8<G<14

  • +
+

HR diagram of CVs

+
+
+
+

References and further reading:

+
    +
  • Warner 1995: Cataclysmic Variable Stars

  • +
+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/field_guide__beta_lyr.html b/field_guide__beta_lyr.html new file mode 100644 index 0000000..bd88ae2 --- /dev/null +++ b/field_guide__beta_lyr.html @@ -0,0 +1,230 @@ + + + + + + + Beta Lyr (blyr) + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Beta Lyr (blyr)

+

Semi-detached eclipsing binaries (also called beta Lyrae variables) are binary star systems (i.e. two stars that are in orbit around each other) that are aligned such that they eclipse each other relative to our line of sight from the Earth. Unlike detached EBs, semi-detatched systems are so close to each other that the shape of (at least one of) the stars in the system are distorted, giving rise to the smooth periodic variations even when the system is not eclipsing.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • periodic

    • +
    • binary

    • +
    • eclipsing

    • +
    +
  • +
  • Occurrence rate: very common, about 105 expected in ZTF data

  • +
+
+
+

ZTF light curves

+

ZTF betalyr

+
+

Description

+

Any type of star can be in an eclipsing binary (so they may be small, large, hot, cool, etc.), which in turn can lead to a large range in eclipse amplitudes (though typically these are between 0.1 and ~1 mag, with most in the ~0.3 to 0.75 mag range) or eclipse periods (though our observations are typically only sensitive to periods between 0.1 to ~20 days).

+
+
+

Light curve characteristics

+
    +
  • periodic variable

  • +
  • Range of amplitudes (~0.2 to >1 mag)

  • +
  • Intermediate periods (log Period between -0.5 and 1.4)

  • +
  • light curve shape: EB, round or sinusoidal light curves, with imposed “V-shape” dips in the phase folded light curve

  • +
+

HR diagram of Beta Lyrae

+

Period histogram of Beta Lyrae

+
+
+
+

References and further reading:

+
    +
  • Sterken & Jasschek: Light curves of variable stars

  • +
+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/field_guide__bogus.html b/field_guide__bogus.html new file mode 100644 index 0000000..b861c3f --- /dev/null +++ b/field_guide__bogus.html @@ -0,0 +1,210 @@ + + + + + + + Bogus variability (bogus) + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Bogus variability (bogus)

+

Not all light curve variability pertains to a source’s intrinsic astrophysical nature. Some is caused by nearby extended objects, bright stars, blends and image artifacts, and being aware of how such bogus light curves appear can help avoid confusion.

+
+

ZTF light curves

+

ZTF bogus +ZTF bogus

+
+

Description

+

The first light curve above demonstrates a saturation ghost artifact, and the second light curve suffers from another kind of artifact. These artifacts were identified and affected data masked after ZTF began, but data from earlier releases were not retroactively masked. This produces the apparent cutoff in variability after a certain point in time.

+
+
+

Light curve characteristics

+

The light curves appear to be “flaring” with departures from the median by multiple magnitudes which suddenly stop in later data. This cutoff corresponds to the time when a new method of processing the data was used to mask affected points.

+
+
+
+

References and further reading:

+ +
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/field_guide__cepheid.html b/field_guide__cepheid.html new file mode 100644 index 0000000..941a55d --- /dev/null +++ b/field_guide__cepheid.html @@ -0,0 +1,249 @@ + + + + + + + Classical Cepheids (ceph) + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Classical Cepheids (ceph)

+

Classical Cepheids are young, bright (100-10,000 solar luminosities) supergiant stars that pulsate with periods of 1 to 100 days (typically several days). They are located in the main instability strip in the H-R diagram. Cepheids follow a famous pulsation period-luminosity relation, allowing the absolute magnitude of a Cepheid, and thus its distance, to be inferred from the pulsation period. Thus, Cepheids are used to measure distances to nearby galaxies.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • periodic

    • +
    • pulsator

    • +
    +
  • +
  • Occurrence rate: rare, about 103 expected in ZTF data, mostly in the Galactic plane and in M31

  • +
+
+
+

ZTF light curves

+

ZTF cepheids +ZTF cepheids +ZTF cepheids +ZTF cepheids

+
+

Description

+

Fundamental-mode Cepheids are easy to recognise by their distinctive sawtooth light curve shape (with a rapid rise to maximum light and a slower decline) and period range (from 1 to 100 days). A secondary bump may be seen in the light curves of some Cepheids with periods in the range 6-20 days. Cepheids pulsating in the first overtone have lower amplitudes and more symmetric light curves than fundamental-mode Cepheids. Their periods (in the Milky Way) range from 0.24 to 8 days. The lower period limit is arbitrary since there is no natural boundary between first-overtone Cepheids and delta Scuti stars. Some Cepheids pulsate both in the fundamental mode and first overtone, the period ratio ranges from 0.68 to 0.77.

+
+
+

Light curve characteristics

+
    +
  • periodic variable

  • +
  • period range: 1-100 days (fundamental-mode pulsators), 0.24-8 days (first-overtone pulsators)

  • +
  • amplitude: moderate amplitude (~0.3 to 0.8 mag)

  • +
  • light curve shape:

    +
      +
    • smooth, sawtooth variations (blue/green filters show stronger sawtooth pattern); steep rise and slow decay

    • +
    • Classical Cepheids with pulsation periods 6-20 days may have a secondary bump

    • +
    +
  • +
+
+
+

Other characteristics and selection methods

+
    +
  • intrinsic Cepheids colors: Bp-Rp = 0.8 – 2.0 mag, but as these stars are located near the Galactic plane, the reddening may be significant

  • +
  • absolute magnitude: -6<G<-2

  • +
  • located close to the Galactic plane (within ~10 degrees)

  • +
+

HR diagram of classical Cepheids

+

RA/Dec diagram of classical Cepheids

+

Period histogram of classical Cepheids

+
+
+
+

References and further reading:

+ +
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/field_guide__delta_scuti.html b/field_guide__delta_scuti.html new file mode 100644 index 0000000..b2819be --- /dev/null +++ b/field_guide__delta_scuti.html @@ -0,0 +1,241 @@ + + + + + + + Delta Scuti (dscu) + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Delta Scuti (dscu)

+

Delta Scuti variables are classic pulsating stars (i.e., they are stars passing through the instability strip). As these stars expand and contract (i.e. pulsate) their size and temperature changes leading to regular, smooth variations in their brightness. Delta Scuti stars are smaller than both Cepheids and RR Lyrae stars, which leads to a short period of oscillations (typically anywhere between 0.03 days and 0.3 days).

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • periodic

    • +
    • pulsator

    • +
    +
  • +
  • Occurrence rate: very common, about 104 expected in ZTF data

  • +
+
+
+

ZTF light curves

+

ZTF delta_scuti

+
+

Description

+

Delta Scuti are easy to recognise by their distinctive light curve shape and period range, which distinguishes them from RR Lyrae and Cepheids.

+
+
+

Light curve characteristics

+
    +
  • periodic variable

  • +
  • period range: 0.03-0.3 days

  • +
  • amplitude: Small amplitude (between 0.05 and 0.3)

  • +
  • light curve shape:

    +
      +
    • smooth, sawtooth variations (blue/green filters show stronger sawtooth pattern); steep rise and slow decay

    • +
    +
  • +
+
+
+

Other characteristics and selection methods

+
    +
  • intrinsic Delta Scuti colors: blue, that of A/F type main sequence stars (g-r = -0.1 – 0.5). +Reddening can be significant since these stars can be detected at large distances.

  • +
  • absolute magnitude: 0<G<5

  • +
+

HR diagram of Delta Scuti

+

RA/Dec diagram of Delta Scuti

+
+
+
+

References and further reading:

+
    +
  • Sterken & Jasschek: Light curves of variable stars

  • +
+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/field_guide__flaring.html b/field_guide__flaring.html new file mode 100644 index 0000000..a93ff18 --- /dev/null +++ b/field_guide__flaring.html @@ -0,0 +1,228 @@ + + + + + + + Flaring variables (fla) + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Flaring variables (fla)

+

The phenomelogical classification of flaring is any kind of outbursting source, where a variable star (or binary system) dramatically increases in brightness for minutes to hours before returning to quiescence. Most flare stars are red dwarfs, while RS Canum Venaticorum variables (RS CVn) are also known to flare due to a companion star in the binary system. Other possible sources of flaring include dwarf novae, which arise from accretion disk activity in a cataclysmic variable star.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    +
  • +
  • Occurrence rate: very common, for a given red dwarf, flares 10³¹ - 10³² ergs occur about once per day, and flares 10³³ - 10³⁴ ergs occur about once per 10-100 days.

  • +
+
+
+

ZTF light curves

+

ZTF flaring_dwarfnova

+

ZTF flaring_mdwarf

+
+

Description

+

Flaring stars are easy to recognise by their increase in brightness from quiescent levels, rapidly returning to that same level shortly thereafter.

+
+
+

Light curve characteristics

+
    +
  • variable

  • +
  • increase in brightness before returning to quiescence.

  • +
  • amplitude: at the bright end, flares can be many magnitudes, while at the dim end, flare detection is limited by survey photometric precision.

  • +
+

HR diagram of Flaring

+

RA/Dec diagram of Flaring

+
+
+
+

References and further reading:

+
    +
  • Taichi Kato, WZ Sge-type dwarf novae, Publications of the Astronomical Society of Japan, Volume 67, Issue 6, December 2015, 108 arxiv:1507.07659

  • +
  • Maximilian N. Günther et al 2020 AJ 159 60, arxiv:1901.00443

  • +
+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/field_guide__lpv.html b/field_guide__lpv.html new file mode 100644 index 0000000..e13dfc1 --- /dev/null +++ b/field_guide__lpv.html @@ -0,0 +1,264 @@ + + + + + + + Long Period Variables (lpv) + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Long Period Variables (lpv)

+

Long Period Variables have periods over several tens of days. +They incorporate various groups of cool luminous pulsators. +The canonical example is Mira.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • periodic

    • +
    • pulsator

    • +
    +
  • +
  • Subtypes

    +
      +
    • Miras

    • +
    • Semiregulars

    • +
    • OSARGs - OGLE Small Amplitude Red Giants (some astronomers do not include these under LPVs)

    • +
    +
  • +
  • Occurrence rate: very common, about 105 expected in ZTF data

  • +
  • Non LPV wth Long Periods

    +
      +
    • RV Tau - Cepheid IIs

    • +
    +
  • +
  • Other possible confusions

    +
      +
    • YSOs - their variations tend to be over shorter periods

    • +
    +
  • +
+
+
+

ZTF light curves

+

ZTF lpv +ZTF lpv

+
+

Description

+

Long period variables have periods from several tens of days to over thousand day and are +easy to identify due to the slow variations.

+
+
+

Light curve characteristics

+
    +
  • periodic variable

  • +
  • period range: 100-1000 days

  • +
  • amplitude: over a mag (Mira), or a few tenths of a mag to 1 or 2 mags (semiregulars)

  • +
  • light curve shape:

    +
      +
    • periodic sinusoidal (Mira)

    • +
    • semiregular (Semiregular)

    • +
    +
  • +
+
+
+

Other characteristics and selection methods

+
    +
  • intrinsic lpv colors: red

  • +
  • absolute magnitude:

  • +
+

HR diagram of LPV

+

RA/Dec diagram of LPV

+
+
+
+

References and further reading:

+
    +
  • Mowlawi et al., 2018, A&A 618, A58, The first Gaia catalogue of long-period variable candidates arxiv:1805.02035

  • +
  • Soszynski et al., 2009, AcA, 59, 239S, The Optical Gravitational Lensing Experiment. The OGLE-III Catalog of Variable Stars. IV. Long-Period Variables in the Large Magellanic Cloud arxix:0910.1354

  • +
  • Soszynski et al., 2008, AcA, 58, 293S, The Optical Gravitational Lensing Experiment. The OGLE-III Catalog of Variable Stars. II.Type II Cepheids and Anomalous Cepheids in the Large Magellanic Cloud arxiv:0811.3636

  • +
+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/field_guide__periodic.html b/field_guide__periodic.html new file mode 100644 index 0000000..bca3340 --- /dev/null +++ b/field_guide__periodic.html @@ -0,0 +1,234 @@ + + + + + + + Periodic Variables (pnp) + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Periodic Variables (pnp)

+

Periodic Variables are objects that exhibit repeating sequences of values over a fixed length of time, known as the period. +Many astrophysical objects exhibit periodic behavior, including eclipsing binaries, pulsators, etc.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    +
  • +
  • Subtypes

    +
      +
    • Eclipsing

    • +
    • Sinusoidal

    • +
    • Sawtooth

    • +
    • Elliptical

    • +
    +
  • +
+
+
+

ZTF light curves

+

ZTF periodic

+
+

Description

+

Periodic variables have periods ranging from minutes to over a thousand days with millimagnitude to magnitude level variations.

+
+
+

Light curve characteristics

+
    +
  • periodic variable: objects that exhibit repeating sequences of values over a fixed length of time

  • +
  • period range: 0.001-1000 days

  • +
  • amplitude: varies from survey precision to more than a magnitude

  • +
+

HR diagram of Periodic

+

RA/Dec diagram of Periodic

+
+
+
+

References and further reading:

+
    +
  • Drake et al., 2014, ApJS 618 213 9, The Catalina Surveys Periodic Variable Catalog arxiv:1405.4290

  • +
+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/field_guide__rr_lyrae.html b/field_guide__rr_lyrae.html new file mode 100644 index 0000000..044c591 --- /dev/null +++ b/field_guide__rr_lyrae.html @@ -0,0 +1,257 @@ + + + + + + + RR Lyrae (rrlyr) + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

RR Lyrae (rrlyr)

+

RR Lyrae are pulsating horizontal branch dA/dF stars with a mass 0.5 of Solar masses. +They are part of the main ‘instability strip’ in the HR-diagram, +where stars pulsate due to the double ionisation of He. +The two main subtypes are ab and c,

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • periodic

    • +
    • pulsator

    • +
    +
  • +
  • Subtypes

    +
      +
    • RR Lyrae ab

    • +
    • RR Lyrae c

    • +
    +
  • +
  • Occurrence rate: very common, about 105 expected in ZTF data

  • +
+
+
+

ZTF light curves

+

ZTF rrlyr ab +ZTF rrlyr c

+
+

Description

+

RR Lyrae (ab) are easy to recognise by their distinctive light curve shape and +high amplitude variability. +RR Lyrae (c) are a bit more of a challenge since their light curve shape is more sinusoidal. +For low-SNR cases they can sometimes be confused with contact binaries (EW), +which occur at similar periods and have sinusoidal-like light curves.

+
+
+

Light curve characteristics

+
    +
  • periodic variable

  • +
  • period range: 0.2-1 days

  • +
  • amplitude: up to 1 mag (subtype ab), or 0.5 mag (subtype c)

  • +
  • light curve shape:

    +
      +
    • sawtooth; steep rise and slow decay (subtype ab)

    • +
    • periodic sinusoidal (subtype c)

    • +
    +
  • +
  • can show modulation of the light curve shape on timescales of ~100 days (Blazhko effect)

  • +
+
+
+

Other characteristics and selection methods

+
    +
  • intrinsic RR Lyrae colors: blue, that of A/F type main sequence stars (g-r = -0.1 – 0.5). +Reddening can be significant since these stars can be detected at large distances.

  • +
  • absolute magnitude: -1<G<1

  • +
+

HR diagram of RRlyrae

+

RA/Dec diagram of RRlyrae

+
+
+
+

References and further reading:

+
    +
  • Sterken & Jasschek: Light curves of variable stars

  • +
+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/field_guide__variable.html b/field_guide__variable.html new file mode 100644 index 0000000..c3ef8ec --- /dev/null +++ b/field_guide__variable.html @@ -0,0 +1,229 @@ + + + + + + + Variable stars (vnv) + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Variable stars (vnv)

+

Variable stars are objects whose brightness is varying at a statistically significant level. +ZTF has statistical measurements depend on magnitude: down to ~10 millimagnitudes for bright stars and >0.1 mag for objects near the detection limit. +Many astrophysical objects exhibit variable behavior, including periodic variables such as eclipsing binaries, pulsators, etc, and non-periodic variables such as AGN and YSOs.

+
+

Classification and numbers

+
    +
  • Subtypes

    +
      +
    • Irregular

    • +
    • Flaring

    • +
    • Periodic

    • +
    • Dipping

    • +
    • Long Time Scale

    • +
    +
  • +
+
+
+

ZTF light curves

+

ZTF variable

+
+

Description

+

Most stars are likely to be variable at some level. Therefore, variable is defined to be those varying at a statistically varying level, with millimagnitude to magnitude level variations.

+
+
+

Light curve characteristics

+
    +
  • amplitude: varies from survey precision to more than a magnitude

  • +
+

HR diagram of Variable

+

RA/Dec diagram of Variable

+
+
+
+

References and further reading:

+
    +
  • Jayasinghe et al., 2018, MNRAS 447 3, The ASAS-SN catalogue of variable stars I: The Serendipitous Survey arxiv:1803.01001

  • +
+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/field_guide__w_uma.html b/field_guide__w_uma.html new file mode 100644 index 0000000..3c87ac3 --- /dev/null +++ b/field_guide__w_uma.html @@ -0,0 +1,239 @@ + + + + + + + W Uma (wuma) + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

W Uma (wuma)

+

W UMa stars are main-sequence overcontact binaries. In overcontact binaries both stars are too large for their Roche lobe share a common envelope and can exchange mass and energy. The mass-ratio of the system ranges from 1 to 10 in extreme cases. Components can have different raddii and surface brightness with temperatures ranging from 4000 to 9000K.

+
+

Classification and numbers

+
    +
  • Supertypes

    +
      +
    • variable

    • +
    • periodic

    • +
    • binary

    • +
    • eclipsing

    • +
    +
  • +
  • Occurrence rate: very common, about 105 expected in ZTF data

  • +
+
+
+

ZTF light curves

+

ZTF wuma

+
+

Description

+

Contact binary lightcurves show a distinctive shape that shows two eclipses which do smoothly transition over. Eclipses can have a flat bottom. The eclipse depth is often identical, but can be show slightly different depths. In rare cases there can be differences in the maxima of the lightcurves (e.g. due to starspots).

+
+
+

Light curve characteristics

+
    +
  • periodic variable

  • +
  • period range: 0.22-0.8 days

  • +
  • amplitude: up to 0.75 mag

  • +
  • light curve shape: EW, two ‘V’-shaped eclipses with smooth transitions

  • +
  • eclipses often equal depth, within 0.1mag

  • +
+
+
+

Other characteristics and selection methods

+
    +
  • g-r = -0.1 – 1.0. Short period systems are typically redder.

  • +
  • absolute magnitudes are similar to main-sequence stars

  • +
+

HR diagram of W Uma

+

RA/Dec diagram of W Uma

+
+
+
+

References and further reading:

+
    +
  • Sterken & Jasschek: Light curves of variable stars

  • +
  • Marsh et al, MNRAS 465, 4678–4689, 2017

  • +
+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 0000000..5f423ce --- /dev/null +++ b/genindex.html @@ -0,0 +1,193 @@ + + + + + + + Index + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ + +

Index

+ +
+ +
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..ff9600a --- /dev/null +++ b/index.html @@ -0,0 +1,269 @@ + + + + + + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + \ No newline at end of file diff --git a/license.html b/license.html new file mode 100644 index 0000000..9856b68 --- /dev/null +++ b/license.html @@ -0,0 +1,222 @@ + + + + + + + License + + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

License

+

MIT License

+

Copyright (c) 2021 Zwicky Transient Facility

+

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.

+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000..1e7ffc4 Binary files /dev/null and b/objects.inv differ diff --git a/quickstart.html b/quickstart.html new file mode 100644 index 0000000..9050dd8 --- /dev/null +++ b/quickstart.html @@ -0,0 +1,328 @@ + + + + + + + Quick Start Guide + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Quick Start Guide

+

This guide is intended to facilitate quick interactions with SCoPe code after you have completed the Installation/Developer Guidelines section. More detailed usage info can be found in the Usage section.

+
+

Modify config.yaml

+

To start out, provide SCoPe your training set’s filepath using the training: dataset: field in config.yaml. The path should be a partial one starting within the scope directory. For example, if your training set trainingSet.parquet is within the tools directory (which itself is within scope), provide tools/trainingSet.parquet in the dataset: field.

+

When running scripts, scope will by default use the config.yaml file in your current directory. You can specify a different config file by providing its path to any installed script using the --config-path argument.

+
+
+

Training

+

Train an XGBoost binary classifier using the following code:

+
scope-train --tag vnv --algorithm xgb --group ss23 --period-suffix ELS_ECE_EAOV --epochs 30 --verbose --save --plot --skip-cv
+
+
+
+

Arguments:

+

--tag: the abbreviated name of the classification to train a binary classifier. A list of abbreviations and definitions can be found in the Guide for Fritz Scanners section.

+

--algorithm: SCoPe currently supports neural network (dnn) and XGBoost (xgb) algorithms.

+

--group: if --save is passed, training results are saved to the group/directory named here.

+

--period-suffix: SCoPe determines light curve periods using GPU-accelerated algorithms. These algorithms include a Lomb-Scargle approach (ELS), Conditional Entropy (ECE), Analysis of Variance (AOV), and an approach nesting all three (ELS_ECE_EAOV). Periodic features are stored with the suffix specified here.

+

--min-count: requires at least min_count positive examples to run training.

+

--epochs: neural network training takes an –epochs argument that is set to 30 here.

+

Notes:

+
    +
  • The above training runs the XGB algorithm by default and skips cross-validation in the interest of time. For a full run, you can remove the --skip-cv argument to run a cross-validated grid search of XGB hyperparameters during training.

  • +
  • DNN hyperparameters are optimized using a different approach - Weights and Biases Sweeps (https://docs.wandb.ai/guides/sweeps). The results of these sweeps are the default hyperparameters in the config file. To run another round of sweeps for DNN, create a WandB account and set the --run-sweeps keyword in the call to scope-train.

  • +
  • SCoPe DNN training does not provide feature importance information (due to the hidden layers of the network). Feature importance is possible to estimate for neural networks, but it is more computationally expensive compared to this “free” information from XGB.

  • +
+
+
+

Train multiple classifiers with one script

+

Create a shell script that contains multiple calls to scope-train:

+
create-training-script --filename train_xgb.sh --min-count 1000 --algorithm xgb --period-suffix ELS_ECE_EAOV --add-keywords "--save --plot --group ss23 --epochs 30 --skip-cv"
+
+
+

Modify the permissions of this script by running chmod +x train_xgb.sh. Run the generated training script in a terminal window (using e.g. ./train_xgb.sh) to train multiple classifers sequentially.

+

Note:

+
    +
  • The code will raise an error if the training script filename already exists.

  • +
+
+
+

Running training on HPC resources

+

train-algorithm-slurm and train-algorithm-job-submission can be used generate and submit slurm scripts to train all classifiers in parallel using HPC resources.

+
+
+
+

Plotting Classifier Performance

+

SCoPe saves diagnostic plots and json files to report each classifier’s performance. The below code shows the location of the validation set results for one classifier.

+
import pathlib
+import json
+
+path_model = pathlib.Path.home() / "scope/models_xgb/ss23/vnv"
+path_stats = [x for x in path_model.glob("*plots/val/*stats.json")][0]
+
+with open(path_stats) as f:
+    stats = json.load(f)
+
+
+

The code below makes a bar plot of the precision and recall for this classifier:

+
import matplotlib.pyplot as plt
+
+plt.figure(figsize=(6,4))
+plt.rcParams['font.size']=13
+plt.title(f"XGB performance (vnv)")
+plt.bar("vnv", stats['precision'], color='blue',width=1,label='precision')
+plt.bar("vnv", stats['recall'], color='red',width=0.6, label='recall')
+plt.legend(ncol=2,loc=0)
+plt.ylim(0,1.15)
+plt.xlim(-3,3)
+plt.ylabel('Score')
+
+
+
+

This code may also be placed in a loop over multiple labels to compare each classifier’s performance.

+
+
+

Inference

+

Use run-inference to run inference on a field (297) of features (in this example, located in a directory called generated_features). The classifiers used for this inference are within the ss23 directory/group specified during training.

+
create-inference-script --filename get_all_preds_xgb.sh --group-name ss23 --algorithm xgb --period-suffix ELS_ECE_EAOV --feature-directory generated_features
+
+
+

Modify the permissions of this script using chmod +x get_all_preds_xgb.sh, then run on the desired field:

+
./get_all_preds_xgb.sh 297
+
+
+

Notes:

+
    +
  • create-inference-script will raise an error if the inference script filename already exists.

  • +
  • Inference begins by imputing missing features using the strategies specified in the features: section of the config file.

  • +
+
+

Running inference on HPC resources

+

run-inference-slurm and run-inference-job-submission can be used generate and submit slurm scripts to run inference for all classifiers in parallel using HPC resources.*

+
+
+
+

Examining predictions

+

The result of running the inference script will be a parquet file containing some descriptive columns followed by columns containing for each classification’s probability for each source in the field. By default, the file is located as follows:

+
path_preds = pathlib.Path.home() / "scope/preds_xgb/field_297/field_297.parquet"
+
+
+

SCoPe’s read_parquet utility offers an easy way to read the predictions file and provide it as a pandas DataFrame.

+
from scope.utils import read_parquet
+preds = read_parquet(path_preds)
+
+
+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/scanner.html b/scanner.html new file mode 100644 index 0000000..8d8faf6 --- /dev/null +++ b/scanner.html @@ -0,0 +1,441 @@ + + + + + + + Guide for Fritz Scanners + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Guide for Fritz Scanners

+

This page is a guide the SCoPe classification process. It contains sections on the classification taxonomies we use, definitions of each classification that may be posted to Fritz, An explanation of the binary classifier algorithms we train and the workflow we run on transient candidates, and plots of each classifer’s current precision and recall scores.

+
+

Two classification taxonomies

+

The goal of SCoPe is to use machine learning algorithms to reliably classify each ZTF source with as much detail as possible. The level of classification detail will vary across the broad range of ZTF sources. Factors that can affect the level of source classification include the quantity and quality of the data, the similarity of the training set to the source in question, and the existence of new kinds of variable sources in the data. With this in mind, we adopt two kinds of taxonomies which contain the labels we use to classify ZTF sources.

+
+

Ontological classifications

+

The first taxonomy is ontological and contains specific kinds of astrophysical sources. On Fritz, this is called Sitewide Taxonomy. See the table below for the current ontological classifications, training set abbreviations and definitions, ordered by low to high detail:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

classification

abbreviation

definition

pulsator

puls

Pulsating star

AGN

agn

Active Galactic Nucleus

YSO

yso

Young Stellar Object

CV

cv

Cataclysmic Variable

binary

bis

binary system

Cepheid

ceph

Cepheid variable star

Delta Scu

dscu

Delta Scu star

Pop II Cepheid

ceph2

Population II Cepheid variable star

RR Lyr

rrlyr

RR Lyr star

LPV

lpv

Long Period Variable star

MS-MS

emsms

Eclipsing MS-MS binary

W UMa

wuma

W UMa binary system

Beta Lyr

blyr

Beta Lyr binary

RS CVn

rscvn

RS CVn binary

BL Her

blher

BL Her-type Cepheid variable star

RRab

rrab

RR Lyr ab star

RRc

rrc

RR Lyr c star

RRd

rrd

RR Lyr d star

Mira

mir

Mira variable star

SRV

srv

Semi-regular variable star

OSARG

osarg

OGLE small-amplitude red giant star

W Vir

wvir

W Vir-type Cepheid variable star

+

Refer to the field guide for more information about these classes.

+
+
+

Phenomenological classifications

+

In consideration of the importance of having some information about a source (even if not a definitive ontological classification), we also employ a phenomenological taxonomy with labels that describe light curve-based features. This taxonomy is called SCoPe Phenomenological Taxonomy on Fritz. See the table below for the current phenomenological classifications, training set abbreviations and definitions:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

classification

abbreviation

definition

variable

vnv

Light curve shows variability

periodic

pnp

periodic variability

irregular

i

irregular variability

eclipsing

e

eclipsing phenomenology

sinusoidal

sin

sinusoidal phenomenology

sawtooth

saw

sawtooth phenomenology

long timescale

longt

long timescale variability

flaring

fla

flaring phenomenology

EA

ea

EA eclipsing phenomenology

EB

eb

EB eclipsing phenomenology

EW

ew

EW eclipsing phenomenology

bogus

bogus

bogus variability

blend

blend

blended sources phenomenology

extended

ext

extended source

+

Refer to the field guide for more information about these classes.

+
+
+
+

Independent binary classifiers

+

We train a binary classifier for every label in these taxonomies. This choice allows more than one classification to be assigned to a source, often with varying levels of detail. This is important not only due to the practical challenges outlined above, but also because some sources merit more than one classification (e.g. an eclipsing binary system containing a flaring star). The independence of binary classifiers allows for future updates to the taxonomies without a revision of the current results from each existing classifier.

+

We classify each ZTF light curve separately in recognition of systematics that may exist between ZTF fields and bands. Before posting results to Fritz, we aggregate these classification results on a source-by-source basis. The details of this workflow are described in the next section.

+
+
+

Classification process

+
+

Machine learning algorithms/training

+

We currently employ a convolutional/dense neural network (DNN) and gradient-boosted decision trees (XGBoost, XGB) to perform classification. The process is initially a regression problem, with classifiers assigning a classification probability that ranges between 0 and 1 for each source. We then apply a probability threshold to determine whether to include each source as a positive or negative example when minimizing the binary cross-entropy loss function.

+

We trained each binary classifier algorithm using a training set containing ~80,000 sources labeled manually (~170,000 light curves). The training set is available on Fritz in group 1458 (Golden Dataset Unique Sources).

+
+
+

Repeated workflow for transients

+

The following SCoPe workflow currently runs every two hours as a cron job:

+
    +
  • Query Fritz for GCN events within the last 7 days

  • +
  • For each event, query all candidates within the 95% confidence localization

  • +
  • For each candidate, query existing ZTF DR16 light curves within 0.5 arcsec

  • +
  • For ZTF light curves with 50 or more epochs of data, generate SCoPe features and run through all trained binary classifiers (DNN and XGB)

  • +
  • Consolidate light curve classifications by matching Gaia, AllWISE or Pan-STARRS1 IDs, computing the mean probabilities among all light curves for a source.

    +
      +
    • Each source will now have a set of classifications from both the DNN and XGB algorithms.

    • +
    +
  • +
  • For each ZTF source, compute mean classification probabilities between DNN and XGB results.

  • +
  • For classifications having a mean probability ≥ 0.7, post to the candidate page.

    +
      +
    • SCoPe classifications will be color-coded with blue text (instead of the default black) and will be preceded by the ML: prefix.

    • +
    • Note that these classifications do not pertain to the candidate itself, but persistent ZTF sources within 0.5 arcsec.

    • +
    • The time series and phase-folded ZTF light curves used for classification are posted as comments on their associated candidate.

    • +
    +
  • +
+
+
+
+

Classifier performance

+

The bar plots below show the precision and recall metrics for the DNN and XGB classifiers. ‘Missing’ bars indicate classifiers which did not have enough examples to train successfully. +dnn classifier precision/recall +xgb classifier precision/recall

+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 0000000..6a94d8d --- /dev/null +++ b/search.html @@ -0,0 +1,218 @@ + + + + + + Search + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Search

+
+

+ Please activate JavaScript to enable the search + functionality. +

+
+

+ From here you can search these documents. Enter your search + words into the box below and click "search". Note that the search + function will automatically search for all of the words. Pages + containing fewer words won't appear in the result list. +

+
+ + + +
+ +
+ +
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 0000000..31f1514 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["allocation", "developer", "field_guide", "field_guide__CVs", "field_guide__beta_lyr", "field_guide__bogus", "field_guide__cepheid", "field_guide__delta_scuti", "field_guide__flaring", "field_guide__lpv", "field_guide__periodic", "field_guide__rr_lyrae", "field_guide__variable", "field_guide__w_uma", "index", "license", "quickstart", "scanner", "usage", "zenodo"], "filenames": ["allocation.md", "developer.md", "field_guide.md", "field_guide__CVs.md", "field_guide__beta_lyr.md", "field_guide__bogus.md", "field_guide__cepheid.md", "field_guide__delta_scuti.md", "field_guide__flaring.md", "field_guide__lpv.md", "field_guide__periodic.md", "field_guide__rr_lyrae.md", "field_guide__variable.md", "field_guide__w_uma.md", "index.rst", "license.md", "quickstart.md", "scanner.md", "usage.md", "zenodo.md"], "titles": ["ACCESS allocation management", "Installation/Developer Guidelines", "Field guide", "Cataclysmic Variables (cv)", "Beta Lyr (blyr)", "Bogus variability (bogus)", "Classical Cepheids (ceph)", "Delta Scuti (dscu)", "Flaring variables (fla)", "Long Period Variables (lpv)", "Periodic Variables (pnp)", "RR Lyrae (rrlyr)", "Variable stars (vnv)", "W Uma (wuma)", "ZTF Variable Source Classification Project", "License", "Quick Start Guide", "Guide for Fritz Scanners", "Usage", "Data Releases on Zenodo"], "terms": {"thi": [0, 1, 2, 5, 15, 16, 17, 18, 19], "project": [0, 18, 19], "other": [0, 4, 8, 15, 18, 19], "group": [0, 2, 9, 16, 17, 18], "ar": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19], "support": [0, 16, 18], "larg": [0, 2, 4, 6, 7, 9, 11, 13, 18], "part": [0, 2, 11, 18], "comput": [0, 17, 18], "e": [0, 1, 2, 4, 7, 13, 16, 17, 18], "g": [0, 1, 2, 3, 6, 7, 11, 13, 16, 17, 18], "from": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 16, 17, 18, 19], "nsf": 0, "when": [0, 1, 2, 4, 5, 16, 17, 18, 19], "our": [0, 1, 2, 4, 18], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15, 16, 17, 19], "grant": [0, 15], "credit": 0, "we": [0, 1, 2, 17, 18, 19], "need": [0, 1, 18], "exchang": [0, 2, 13], "them": [0, 2, 7, 18, 19], "requir": [0, 16, 18], "guid": [0, 14, 18, 19], "explain": 0, "some": [0, 1, 2, 3, 5, 6, 9, 12, 16, 17, 18], "detail": [0, 1, 2, 16, 17], "about": [0, 2, 3, 4, 6, 7, 8, 9, 11, 13, 17, 18], "process": [0, 1, 2, 5, 14, 18], "user": [0, 14, 18], "role": 0, "can": [0, 1, 2, 3, 4, 5, 7, 8, 11, 13, 16, 17, 18], "avail": [0, 17, 18, 19], "websit": 0, "The": [0, 1, 2, 3, 5, 6, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19], "differ": [0, 2, 3, 13, 14, 16, 19], "tab": 0, "show": [0, 2, 3, 6, 7, 11, 13, 16, 17], "current": [0, 1, 16, 17, 18, 19], "histori": 0, "figur": [0, 16], "below": [0, 1, 2, 3, 16, 17, 18], "resouc": 0, "us": [0, 2, 5, 6, 15, 16, 17, 18], "how": [0, 2, 5, 18], "much": [0, 17], "each": [0, 1, 2, 4, 16, 17, 18], "remain": [0, 18], "To": [0, 1, 16, 18, 19], "more": [0, 1, 2, 6, 10, 11, 12, 16, 17, 18, 19], "increas": [0, 2, 8, 18], "associ": [0, 1, 15, 17, 18], "balanc": 0, "box": [0, 1, 18], "right": [0, 15, 18], "desir": [0, 16, 18, 19], "amount": [0, 18], "do": [0, 1, 2, 3, 9, 13, 15, 17, 18], "preview": 0, "visual": 0, "submit": [0, 1, 16, 18], "add": [0, 1, 16, 18, 19], "1": [0, 2, 3, 4, 6, 7, 9, 11, 12, 13, 16, 17, 18], "2": [0, 2, 3, 4, 6, 9, 11, 16, 18], "sentenc": 0, "justif": 0, "explan": [0, 17, 18], "bottom": [0, 2, 13], "page": [0, 17, 18, 19], "should": [0, 1, 16, 18, 19], "mention": 0, "what": [0, 18, 19], "effort": 0, "basic": 0, "reason": 0, "why": 0, "being": [0, 2, 5, 18], "an": [0, 1, 2, 4, 15, 16, 17, 18], "approxim": 0, "level": [0, 2, 3, 8, 10, 12, 17, 18], "For": [0, 1, 2, 11, 16, 17, 18], "exampl": [0, 1, 2, 9, 16, 17], "accompani": 0, "5": [0, 2, 4, 7, 9, 11, 13, 17, 18], "000": [0, 2, 6, 17], "expans": [0, 18], "gpuh": 0, "continu": [0, 1, 18], "perform": [0, 14, 18], "gpu": [0, 1, 16, 18], "acceler": [0, 1, 16], "time": [0, 1, 2, 5, 10, 12, 16, 17, 18, 19], "seri": [0, 17, 18], "featur": [0, 1, 14, 16, 17], "gener": [0, 1, 14, 16, 17, 19], "20": [0, 2, 4, 6, 18], "ztf": [0, 1, 17, 19], "field": [0, 14, 16, 17, 19], "contain": [0, 1, 16, 17, 18, 19], "56": 0, "million": 0, "light": [0, 1, 16, 17, 18, 19], "curv": [0, 1, 16, 17, 18, 19], "At": 0, "0": [0, 2, 3, 4, 6, 7, 10, 11, 12, 13, 16, 17, 18], "25": 0, "per": [0, 2, 8, 18], "lightcurv": [0, 2, 13, 18], "consid": 0, "ad": [0, 1, 14, 18], "memori": [0, 18], "lead": [0, 2, 4, 7], "greater": 0, "expenditur": 0, "addit": [0, 19], "note": [0, 1, 16, 17, 18, 19], "alwai": [0, 18, 19], "possibl": [0, 2, 8, 9, 16, 17], "turn": [0, 1, 2, 4], "unus": 0, "back": [0, 1], "equival": [0, 18], "calcul": [0, 18], "rate": [0, 2, 3, 4, 6, 7, 8, 9, 11, 13], "between": [0, 2, 4, 6, 7, 14, 17, 19], "experi": [0, 2, 6, 9, 18], "prefer": [0, 1], "vast": 0, "quantiti": [0, 17], "singl": [0, 18], "onc": [0, 1, 2, 8, 18], "instead": [0, 17, 18], "made": [0, 1], "regular": [0, 2, 7, 17], "interv": [0, 18], "click": [0, 1, 19], "chart": 0, "button": [0, 1], "under": [0, 1, 2, 9, 18, 19], "column": [0, 14, 16], "which": [0, 1, 2, 3, 4, 5, 7, 8, 11, 13, 16, 17, 18, 19], "over": [0, 2, 9, 10, 13, 16, 18, 19], "tend": [0, 2, 9], "stabil": 0, "subsequ": 0, "predict": [0, 14, 19], "try": [0, 1], "keep": [0, 1, 18], "consist": [0, 1], "so": [0, 2, 4, 15, 18], "get": [0, 1, 18, 19], "interrupt": 0, "If": [0, 1, 18], "nearing": 0, "exhaust": 0, "receiv": [0, 18, 19], "email": [0, 18], "inform": [0, 1, 2, 16, 17, 18], "seem": 0, "than": [0, 2, 6, 7, 10, 12, 17, 18], "thei": [0, 1, 2, 3, 4, 6, 7, 9, 11, 18], "given": [0, 2, 8], "reach": 0, "out": [0, 1, 15, 16, 18], "ensur": [0, 1, 18, 19], "slurm": [0, 16], "script": [0, 1], "mani": [0, 1, 2, 8, 10, 12], "have": [0, 1, 2, 3, 6, 9, 10, 11, 13, 16, 17, 18], "unit": 0, "servic": 0, "su": [0, 2, 3], "sdsc": 0, "cpu": [0, 18], "core": [0, 18], "2gb": 0, "one": [0, 1, 2, 4, 17, 18, 19], "hour": [0, 2, 3, 8, 17, 18], "ani": [0, 2, 4, 8, 15, 16, 18], "scale": [0, 2, 12, 18], "up": [0, 2, 11, 13, 18], "account": [0, 1, 16, 18], "charg": [0, 15], "ratio": [0, 2, 6, 13, 18], "gb": [0, 18], "10cpu": 0, "92g": 0, "beyond": 0, "likewis": [0, 18], "activ": [1, 2, 3, 8, 17, 18], "virtual": 1, "conda": 1, "python": [1, 18], "3": [1, 2, 4, 6, 7, 12, 16, 18], "11": 1, "n": [1, 2, 8, 18, 19], "scope": [1, 2, 14, 16, 17, 19], "env": [1, 18], "latest": [1, 18, 19], "ml": [1, 17, 18], "pip": 1, "In": [1, 2, 13, 17, 18], "directori": [1, 16, 18], "choic": [1, 17, 18], "run": [1, 14, 17, 19], "initi": [1, 17, 18], "copi": [1, 15, 18], "necessari": [1, 18], "file": [1, 14, 15, 16, 19], "code": [1, 16, 17, 18], "chang": [1, 2, 3, 7, 18, 19], "finish": [1, 18], "default": [1, 16, 17, 18], "all": [1, 2, 5, 6, 15, 16, 17, 18, 19], "you": [1, 16, 18], "also": [1, 2, 4, 8, 16, 17, 18], "specifi": [1, 16, 18, 19], "anoth": [1, 2, 5, 16], "path": [1, 16, 18], "argument": [1, 18], "own": 1, "fork": 1, "repositori": [1, 19], "Then": [1, 18, 19], "decid": 1, "whether": [1, 15, 17, 18], "would": 1, "like": [1, 2, 11, 12, 18], "easier": 1, "beginn": 1, "follow": [1, 2, 3, 6, 15, 16, 17, 18], "instruct": 1, "clone": 1, "download": [1, 14], "remot": 1, "call": [1, 2, 4, 16, 17, 18], "upstream": 1, "point": [1, 2, 5, 18], "main": [1, 2, 3, 6, 7, 11, 13, 19], "git": 1, "github": 1, "com": 1, "yournam": 1, "cd": [1, 18], "zwickytransientfacil": 1, "authent": 1, "recommend": [1, 18], "mai": [1, 2, 4, 6, 16, 17, 18, 19], "want": [1, 18], "begin": [1, 16, 18, 19], "specif": [1, 17, 18, 19], "miniforge3": [1, 18], "forg": 1, "miniforg": 1, "c": [1, 2, 11, 15, 17], "plan": 1, "import": [1, 2, 3, 16, 17, 18, 19], "variabl": [1, 4, 6, 7, 11, 13, 17, 18], "simpl": [1, 18], "text": [1, 17, 18], "editor": [1, 18], "nano": 1, "appropri": [1, 18], "depend": [1, 2, 3, 12], "shell": [1, 16], "bash": [1, 18], "bash_profil": 1, "line": [1, 2, 4, 18], "export": 1, "home": [1, 16, 18], "save": [1, 16, 18], "ctrl": 1, "o": [1, 18], "close": [1, 2, 3, 4, 6, 18], "reopen": 1, "termin": [1, 16], "recogn": [1, 2, 3], "again": [1, 18], "pyproject": 1, "toml": 1, "black": [1, 17], "format": [1, 14, 19], "flake8": 1, "verifi": 1, "compli": 1, "pep8": 1, "pleas": [1, 2, 18], "r": [1, 2, 3, 6, 7, 8, 11, 13, 17, 18], "txt": [1, 18], "check": 1, "befor": [1, 2, 8, 17, 18], "conform": 1, "style": 1, "standard": [1, 18], "reformat": 1, "lint": 1, "sourc": [1, 2, 5, 8, 16, 17, 19], "includ": [1, 2, 3, 8, 9, 10, 12, 15, 16, 17, 18], "make": [1, 14, 16, 18, 19], "cp": 1, "edit": 1, "kowalski": [1, 18], "instanc": [1, 18], "fritz": [1, 14, 16], "token": [1, 18], "empti": 1, "pass": [1, 2, 7, 16, 18], "access": [1, 14, 18], "databas": [1, 18], "limit": [1, 2, 6, 8, 12, 15, 18], "still": [1, 18], "upon": 1, "encount": 1, "error": [1, 16, 18], "manual": [1, 17, 18], "question": [1, 17], "xxx": 1, "remov": [1, 16, 18], "after": [1, 2, 5, 16, 18, 19], "re": 1, "period": [1, 3, 4, 6, 7, 11, 12, 13, 14, 16, 17, 18], "find": [1, 18], "algorithm": [1, 16, 18], "periodfind": 1, "separ": [1, 17, 18], "across": [1, 17, 18], "platform": 1, "awar": [1, 2, 5], "12": 1, "anaconda": 1, "caus": [1, 2, 3, 5], "problem": [1, 17], "setup": [1, 18], "healpi": 1, "arm64": 1, "mac": [1, 18], "rais": [1, 16], "h5py": 1, "dure": [1, 16, 18], "creation": 1, "On": [1, 17, 18], "machin": [1, 18], "cesium": [1, 18], "see": [1, 17, 18], "potenti": 1, "workaround": 1, "org": [1, 19], "doc": [1, 16], "html": 1, "within": [1, 2, 6, 13, 16, 17, 18], "critic": 1, "fail": 1, "py": [1, 18], "tool": [1, 16, 18], "generate_featur": [1, 18], "through": [1, 2, 7, 17, 18], "pull": 1, "request": [1, 14, 18], "propos": 1, "patch": 1, "version": [1, 19], "new": [1, 2, 5, 14, 17, 18], "branch": [1, 2, 11, 18], "work": [1, 18], "here": [1, 2, 16, 18], "let": 1, "": [1, 2, 5, 16, 17, 18], "sai": 1, "document": [1, 15], "fix": [1, 2, 10], "ll": 1, "rewrit": 1, "checkout": 1, "b": [1, 2, 5, 18], "modif": 1, "messag": [1, 18], "summari": 1, "longer": [1, 18], "descript": [1, 14, 16], "while": [1, 2, 8, 18], "read": [1, 16, 18], "notic": [1, 15], "sever": [1, 2, 3, 6, 9], "place": [1, 2, 3, 16, 18, 19], "were": [1, 2, 5], "order": [1, 17, 18], "therefor": [1, 2, 12], "reorgan": 1, "logic": 1, "grammar": 1, "mistak": 1, "along": [1, 2, 18, 19], "wai": [1, 2, 6, 16, 18], "readi": 1, "push": 1, "origin": [1, 18], "upload": [1, 14, 19], "print": [1, 18], "url": 1, "open": [1, 16, 18], "browser": 1, "write": [1, 18], "titl": [1, 16], "team": 1, "now": [1, 17, 18, 19], "review": [1, 18], "suggest": 1, "simplifi": 1, "incorpor": [1, 2, 9], "automat": [1, 18], "track": [1, 18], "sometim": [1, 2, 3, 11], "result": [1, 16, 17, 18], "conflict": 1, "two": [1, 2, 4, 11, 13, 14, 18], "resolv": [1, 19], "situat": 1, "merg": [1, 15, 18], "rebas": 1, "look": 1, "discuss": [1, 18], "both": [1, 2, 6, 7, 13, 17, 18], "accept": [1, 18], "sinc": [1, 2, 6, 7, 11, 18], "squash": 1, "pr": 1, "first": [1, 2, 5, 6, 9, 17, 18, 19], "ha": [1, 2, 12, 18, 19], "been": [1, 18], "approv": 1, "least": [1, 2, 4, 16], "member": 1, "As": [1, 2, 7, 19], "maintain": 1, "occasion": 1, "bump": [1, 2, 6], "__init__": 1, "intend": [1, 16, 18], "vx": [1, 19], "y": [1, 18, 19], "z": [1, 2, 3, 18, 19], "navig": 1, "repo": 1, "draft": [1, 19], "enter": 1, "number": [1, 18], "choos": [1, 19], "tag": [1, 16, 18], "It": [1, 17, 18], "advis": 1, "publish": [1, 14, 15], "yml": 1, "workflow": [1, 18], "action": [1, 15, 18], "yet": [1, 18], "step": [1, 18], "sure": 1, "describ": [1, 17, 18, 19], "abov": [1, 2, 5, 15, 16, 17, 18], "field_guid": 1, "object_class_typ": 1, "rr_lyr_ab": 1, "object": [1, 2, 5, 10, 12, 17, 18], "coordin": [1, 18], "plot": [1, 14, 17, 18], "dai": [1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 17, 18], "phase": [1, 2, 4, 17, 18], "fold": [1, 2, 4, 17, 18], "render": 1, "valid": [1, 16], "templat": 1, "structur": [1, 18], "same": [1, 2, 8, 18], "propag": 1, "otherwis": [1, 15, 18], "util": [1, 16, 18], "later": [1, 2, 5], "complain": 1, "ask": 1, "markdown": 1, "field_guide__": 1, "object_class": 1, "md": 1, "field_guide__rr_lyra": 1, "data": [1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 14, 17, 18], "png": 1, "info": [1, 16, 18], "provid": [1, 2, 15, 16, 18, 19], "statement": 1, "wish": [1, 18], "sampl": [1, 18], "gaia": [1, 2, 6, 9, 17, 18], "base": [1, 17, 18], "hr": [1, 2, 11], "diagram": [1, 2, 6, 11], "golden": [1, 17], "class": [1, 17, 18], "put": 1, "csv": [1, 18, 19], "must": [1, 18], "rr_lyr": 1, "header": 1, "ra": [1, 18], "dec": [1, 18], "degre": [1, 2, 6], "hr__": 1, "command": [1, 18], "imageri": 1, "build": [1, 18], "success": [1, 18], "_build": 1, "index": [1, 18], "happi": 1, "ci": 1, "subset": 1, "deploy": 1, "pipelin": [1, 18], "green": [1, 2, 6, 7], "checkmark": 1, "next": [1, 17, 18, 19], "hash": 1, "deploi": 1, "type": [2, 3, 4, 7, 8, 9, 11, 17, 18, 19], "proce": 2, "interact": [2, 16, 18, 19], "inspect": 2, "taxonomi": [2, 14], "tree": [2, 17], "emploi": [2, 17], "arxiv": [2, 8, 9, 10, 12, 18], "2102": [2, 18], "11304": [2, 18], "whose": [2, 12], "bright": [2, 3, 5, 6, 7, 8, 12, 13, 18], "vari": [2, 10, 12, 17], "statist": [2, 12, 18], "signific": [2, 6, 7, 11, 12, 18], "measur": [2, 6, 12], "magnitud": [2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18], "down": [2, 12], "10": [2, 4, 6, 7, 8, 9, 11, 12, 13, 18, 19], "millimagnitud": [2, 10, 12], "mag": [2, 3, 4, 6, 9, 11, 12, 13, 18], "detect": [2, 7, 8, 11, 12], "astrophys": [2, 5, 10, 12, 17], "exhibit": [2, 10, 12], "behavior": [2, 10, 12], "eclips": [2, 4, 10, 12, 13, 17], "binari": [2, 3, 4, 8, 10, 11, 12, 13, 14, 16, 18], "pulsat": [2, 6, 7, 9, 10, 11, 12, 17], "etc": [2, 4, 10, 12], "non": [2, 3, 9, 12], "agn": [2, 12, 17, 18], "yso": [2, 9, 12, 17, 18], "subtyp": [2, 3, 9, 10, 11, 12], "irregular": [2, 12, 17], "dip": [2, 4, 12], "most": [2, 4, 8, 12, 18, 19], "defin": [2, 12, 18], "those": [2, 12, 18], "variat": [2, 4, 6, 7, 9, 10, 12], "amplitud": [2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 17, 18], "survei": [2, 8, 10, 12, 18], "precis": [2, 8, 10, 12, 16, 17], "jayasingh": [2, 12], "et": [2, 6, 8, 9, 10, 12, 13], "al": [2, 6, 8, 9, 10, 12, 13], "2018": [2, 6, 9, 12], "mnra": [2, 12, 13], "447": [2, 12], "asa": [2, 12], "sn": [2, 12], "catalogu": [2, 9, 12], "serendipit": [2, 12], "1803": [2, 12], "01001": [2, 12], "repeat": [2, 10], "sequenc": [2, 3, 7, 10, 11, 13, 18], "valu": [2, 10, 18], "length": [2, 10], "known": [2, 8, 10], "supertyp": [2, 3, 4, 6, 7, 8, 9, 10, 11, 13], "sinusoid": [2, 4, 9, 10, 11, 17], "sawtooth": [2, 3, 6, 7, 10, 11, 17], "ellipt": [2, 10], "rang": [2, 3, 4, 6, 7, 9, 10, 11, 13, 17, 18], "minut": [2, 8, 10, 18], "thousand": [2, 3, 9, 10], "001": [2, 10], "1000": [2, 9, 10, 16, 18], "drake": [2, 10], "2014": [2, 10], "apj": [2, 10], "618": [2, 9, 10], "213": [2, 10], "9": [2, 3, 10, 18], "catalina": [2, 10], "catalog": [2, 6, 9, 10, 18, 19], "1405": [2, 10], "4290": [2, 10], "horizont": [2, 11], "da": [2, 11], "df": [2, 11], "mass": [2, 3, 11, 13], "solar": [2, 6, 11], "instabl": [2, 3, 6, 7, 11], "strip": [2, 6, 7, 11], "where": [2, 8, 11, 18], "due": [2, 3, 8, 9, 11, 13, 16, 17], "doubl": [2, 11], "ionis": [2, 11], "he": [2, 11], "ab": [2, 11, 17], "occurr": [2, 3, 4, 6, 7, 8, 9, 11, 13], "veri": [2, 4, 7, 8, 9, 11, 13], "common": [2, 3, 4, 7, 8, 9, 11, 13], "expect": [2, 3, 4, 6, 7, 9, 11, 13], "easi": [2, 3, 6, 7, 8, 9, 11, 16], "recognis": [2, 6, 7, 8, 11], "distinct": [2, 3, 6, 7, 11, 13], "shape": [2, 3, 4, 6, 7, 9, 11, 13], "high": [2, 3, 6, 11, 17, 18], "bit": [2, 11], "challeng": [2, 11, 17], "low": [2, 3, 11, 17, 18], "snr": [2, 11], "case": [2, 11, 13], "confus": [2, 3, 5, 9, 11], "contact": [2, 11, 13], "ew": [2, 11, 13, 17, 18], "occur": [2, 8, 11], "similar": [2, 11, 13, 17, 18], "steep": [2, 3, 6, 7, 11], "rise": [2, 3, 4, 6, 7, 11], "slow": [2, 3, 6, 7, 9, 11], "decai": [2, 3, 6, 7, 11], "modul": [2, 3, 11, 18], "timescal": [2, 3, 11, 17], "100": [2, 6, 8, 9, 11, 18, 19], "blazhko": [2, 11], "effect": [2, 11], "intrins": [2, 3, 5, 6, 7, 9, 11], "color": [2, 3, 6, 7, 9, 11, 16, 17, 18], "blue": [2, 3, 6, 7, 11, 16, 17], "A": [2, 6, 7, 9, 11, 15, 16, 18], "f": [2, 7, 11, 16], "redden": [2, 3, 6, 7, 11], "distanc": [2, 6, 7, 11, 18], "absolut": [2, 3, 6, 7, 9, 11, 13, 18], "sterken": [2, 4, 7, 11, 13], "jasschek": [2, 4, 7, 11, 13], "overcontact": [2, 13], "too": [2, 13, 18], "roch": [2, 13], "lobe": [2, 13], "share": [2, 13], "envelop": [2, 13], "energi": [2, 13], "system": [2, 4, 8, 13, 17, 18], "extrem": [2, 13], "compon": [2, 13, 18, 19], "raddii": [2, 13], "surfac": [2, 3, 13], "temperatur": [2, 7, 13], "4000": [2, 13], "9000k": [2, 13], "smoothli": [2, 13], "transit": [2, 13], "flat": [2, 13], "depth": [2, 13], "often": [2, 13, 17, 18], "ident": [2, 13], "slightli": [2, 3, 13], "rare": [2, 6, 13], "maxima": [2, 13], "starspot": [2, 13], "22": [2, 13], "8": [2, 3, 6, 13, 18], "75": [2, 4, 13], "v": [2, 4, 13], "smooth": [2, 4, 6, 7, 13], "equal": [2, 13], "1mag": [2, 13], "short": [2, 7, 13], "typic": [2, 4, 6, 7, 13], "redder": [2, 13], "marsh": [2, 13], "465": [2, 13], "4678": [2, 13], "4689": [2, 13], "2017": [2, 13], "expand": [2, 7], "contract": [2, 7, 15], "size": [2, 7, 16, 18], "smaller": [2, 7], "oscil": [2, 7], "anywher": [2, 7], "03": [2, 7], "4": [2, 3, 4, 7, 16, 18], "distinguish": [2, 7], "small": [2, 4, 7, 9, 17, 18], "05": [2, 7, 18], "filter": [2, 6, 7, 18], "stronger": [2, 6, 7], "pattern": [2, 6, 7, 18], "young": [2, 6, 17], "luminos": [2, 6], "supergi": [2, 6], "locat": [2, 6, 16, 18], "h": [2, 6], "famou": [2, 6], "relat": [2, 6], "allow": [2, 6, 17, 18, 19], "thu": [2, 6], "its": [2, 6, 16], "infer": [2, 6, 14], "nearbi": [2, 5, 6, 18], "galaxi": [2, 6], "mostli": [2, 6], "galact": [2, 3, 6, 17], "plane": [2, 3, 6], "m31": [2, 6], "fundament": [2, 6], "mode": [2, 6, 18], "rapid": [2, 6], "maximum": [2, 6, 18], "slower": [2, 6], "declin": [2, 3, 6], "secondari": [2, 6], "seen": [2, 6], "6": [2, 3, 6, 8, 16, 18], "overton": [2, 6], "lower": [2, 6], "symmetr": [2, 3, 6], "Their": [2, 6], "milki": [2, 6], "24": [2, 6], "arbitrari": [2, 6], "natur": [2, 5, 6], "boundari": [2, 6], "68": [2, 6], "77": [2, 6], "moder": [2, 6], "bp": [2, 6, 18], "rp": [2, 6, 18], "soszynski": [2, 6, 9], "2008": [2, 6, 9], "optic": [2, 6, 9], "gravit": [2, 6, 9], "lens": [2, 6, 9], "ogl": [2, 6, 9, 17], "iii": [2, 6, 9, 19], "magellan": [2, 6, 9], "cloud": [2, 6, 9], "udalski": [2, 6], "collect": [2, 6, 18], "rimoldini": [2, 6], "l": [2, 6, 18], "2019": [2, 6], "releas": [2, 5, 6, 14], "sky": [2, 6, 18], "skowron": [2, 6], "d": [2, 6, 17], "2020": [2, 6, 8], "three": [2, 6, 16], "dimension": [2, 6], "map": [2, 6, 14], "transfer": [2, 3], "late": [2, 3], "brown": [2, 3], "dwarf": [2, 3, 8], "white": [2, 3], "There": [2, 3, 18], "These": [2, 3, 5, 16, 18, 19], "nova": [2, 3, 8], "15": [2, 3, 16], "outburst": [2, 3, 8], "thermonuclear": [2, 3], "event": [2, 3, 15, 17, 18], "week": [2, 3, 18], "decad": [2, 3], "disk": [2, 3, 8, 18], "novalik": [2, 3], "state": [2, 3, 18], "accret": [2, 3, 8], "aperiod": [2, 3], "orbit": [2, 3, 4], "u": [2, 3], "gem": [2, 3], "cam": [2, 3], "wz": [2, 3, 8], "sge": [2, 3, 8], "supernova": [2, 3], "recur": [2, 3], "standstil": [2, 3], "fast": [2, 3], "extend": [2, 3, 5, 17], "plateau": [2, 3], "steeper": [2, 3], "either": [2, 3, 18], "usual": [2, 3, 18], "except": [2, 3, 18], "quiescenc": [2, 3, 8], "14": [2, 3], "warner": [2, 3], "1995": [2, 3], "phenomelog": [2, 8], "kind": [2, 5, 8, 15, 17], "dramat": [2, 8], "return": [2, 8, 18], "red": [2, 8, 9, 16, 17], "canum": [2, 8], "venaticorum": [2, 8], "cvn": [2, 8, 17], "companion": [2, 8], "aris": [2, 8, 15], "10\u00b3\u00b9": [2, 8], "10\u00b3\u00b2": [2, 8], "erg": [2, 8], "10\u00b3\u00b3": [2, 8], "10\u00b3\u2074": [2, 8], "quiescent": [2, 8], "rapidli": [2, 8, 18], "shortli": [2, 8], "thereaft": [2, 8], "end": [2, 8], "dim": [2, 8], "photometr": [2, 8], "taichi": [2, 8], "kato": [2, 8], "public": [2, 8, 19], "astronom": [2, 8, 9], "societi": [2, 8], "japan": [2, 8], "volum": [2, 8], "67": [2, 8], "issu": [2, 8, 18], "decemb": [2, 8], "2015": [2, 8], "108": [2, 8], "1507": [2, 8], "07659": [2, 8], "maximilian": [2, 8], "g\u00fcnther": [2, 8], "aj": [2, 8], "159": [2, 8], "60": [2, 8], "1901": [2, 8], "00443": [2, 8], "semi": [2, 4, 17], "detach": [2, 4], "around": [2, 4, 18], "align": [2, 4], "rel": [2, 4, 18], "sight": [2, 4], "earth": [2, 4], "unlik": [2, 4, 18], "eb": [2, 4, 17, 18], "detatch": [2, 4], "distort": [2, 4], "give": [2, 4], "even": [2, 4, 17], "hot": [2, 4], "cool": [2, 4, 9], "though": [2, 4], "observ": [2, 4, 18], "onli": [2, 4, 17, 18], "sensit": [2, 4], "intermedi": [2, 4], "log": [2, 4, 18], "round": [2, 4, 16], "impos": [2, 4], "ten": [2, 9], "variou": [2, 9], "lumin": [2, 9], "canon": [2, 9], "mira": [2, 9, 17], "semiregular": [2, 9], "osarg": [2, 9, 17], "giant": [2, 9, 17], "wth": [2, 9], "rv": [2, 9], "tau": [2, 9], "ii": [2, 9, 17], "shorter": [2, 9], "identifi": [2, 5, 9, 18], "few": [2, 9], "tenth": [2, 9], "mowlawi": [2, 9], "a58": [2, 9], "candid": [2, 9, 17, 18], "1805": [2, 9], "02035": [2, 9], "2009": [2, 9], "aca": [2, 9], "59": [2, 9], "239": [2, 9], "iv": [2, 9], "arxix": [2, 9], "0910": [2, 9], "1354": [2, 9], "58": [2, 9], "293": [2, 9], "anomal": [2, 9], "0811": [2, 9], "3636": [2, 9], "Not": [2, 5, 18], "pertain": [2, 5, 17], "blend": [2, 5, 17], "imag": [2, 5], "artifact": [2, 5], "appear": [2, 5], "help": [2, 5, 18], "avoid": [2, 5, 18], "demonstr": [2, 5, 18], "satur": [2, 5], "ghost": [2, 5], "second": [2, 5, 18], "suffer": [2, 5], "affect": [2, 5, 17], "mask": [2, 5], "began": [2, 5], "earlier": [2, 5], "retroact": [2, 5], "produc": [2, 5, 18], "appar": [2, 5], "cutoff": [2, 5], "certain": [2, 5], "departur": [2, 5], "median": [2, 5, 18], "multipl": [2, 5, 18], "suddenli": [2, 5], "stop": [2, 5, 18], "correspond": [2, 5, 18], "wa": [2, 5], "explanatori": [2, 5], "supplement": [2, 5], "esp": [2, 5], "appendix": [2, 5], "star": [3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 17, 18], "uma": [3, 14, 17], "flare": [3, 5, 12, 14, 17, 18], "long": [3, 12, 14, 17, 18], "lyra": [4, 7, 14], "method": [5, 18], "delta": [6, 14, 17], "scuti": [6, 14], "classic": [7, 14], "cepheid": [7, 9, 14, 17], "rr": [7, 14, 17], "cataclysm": [8, 14, 17, 18], "instal": [14, 16, 18], "develop": [14, 16], "guidelin": [14, 16], "scienc": 14, "contributor": 14, "quick": 14, "start": [14, 18], "modifi": [14, 15, 18], "config": [14, 18], "yaml": [14, 18], "train": [14, 19], "classifi": [14, 18, 19], "examin": 14, "usag": [14, 16], "id": [14, 17], "ccd": 14, "quadrant": 14, "deep": 14, "learn": 14, "model": [14, 19], "handl": 14, "name": [14, 16], "definit": [14, 16, 17], "autom": 14, "analys": 14, "local": [14, 17], "gcn": [14, 17], "manag": [14, 19], "annot": 14, "disagr": 14, "deprec": 14, "scanner": [14, 16, 18], "independ": 14, "vnv": [14, 16, 17, 18], "pnp": [14, 17, 18], "rrlyr": [14, 17, 18], "w": [14, 17], "wuma": [14, 17, 18], "dscu": [14, 17, 18], "ceph": [14, 17, 18], "cv": [14, 16, 17, 18], "fla": [14, 17, 18], "beta": [14, 17], "lyr": [14, 17], "blyr": [14, 17, 18], "lpv": [14, 17, 18], "bogu": [14, 17], "alloc": [14, 18], "view": 14, "resourc": [14, 18], "anticip": 14, "trend": 14, "zenodo": 14, "product": 14, "prepar": 14, "licens": 14, "mit": 15, "copyright": 15, "2021": 15, "zwicki": 15, "transient": [15, 18], "facil": 15, "permiss": [15, 16, 18], "herebi": 15, "free": [15, 16], "person": 15, "obtain": [15, 18], "softwar": 15, "deal": 15, "without": [15, 17, 18], "restrict": 15, "distribut": 15, "sublicens": 15, "sell": 15, "permit": 15, "whom": 15, "furnish": 15, "subject": 15, "condit": [15, 16], "shall": 15, "substanti": 15, "portion": 15, "THE": 15, "AS": 15, "warranti": 15, "OF": 15, "express": 15, "OR": [15, 18], "impli": 15, "BUT": 15, "NOT": 15, "TO": 15, "merchant": 15, "fit": [15, 18], "FOR": 15, "particular": 15, "purpos": [15, 18], "AND": 15, "noninfring": 15, "IN": 15, "NO": 15, "author": 15, "holder": 15, "BE": 15, "liabl": 15, "claim": 15, "damag": 15, "liabil": 15, "tort": 15, "connect": [15, 18], "WITH": 15, "facilit": 16, "complet": [16, 18], "section": [16, 17, 18], "found": 16, "your": [16, 18], "set": [16, 17, 18, 19], "filepath": [16, 18], "dataset": [16, 17, 18], "partial": 16, "trainingset": 16, "parquet": [16, 18, 19], "itself": [16, 17, 18], "xgboost": [16, 17, 18], "xgb": [16, 17, 18, 19], "ss23": 16, "suffix": [16, 18], "els_ece_eaov": [16, 18], "epoch": [16, 17, 18], "30": [16, 18], "verbos": [16, 18], "skip": [16, 18], "abbrevi": [16, 17], "classif": [16, 19], "list": [16, 18, 19], "neural": [16, 17], "network": [16, 17], "dnn": [16, 17, 18, 19], "determin": [16, 17, 18], "lomb": 16, "scargl": 16, "approach": 16, "el": 16, "entropi": [16, 17], "ec": 16, "analysi": [16, 18], "varianc": [16, 18], "aov": [16, 18], "nest": 16, "store": [16, 18], "min": [16, 18], "count": [16, 18], "min_count": 16, "posit": [16, 17], "take": [16, 18], "cross": [16, 17], "interest": [16, 18], "full": [16, 18], "grid": 16, "search": [16, 18], "hyperparamet": 16, "optim": [16, 18], "weight": [16, 18], "bias": [16, 18], "sweep": 16, "http": [16, 19], "wandb": [16, 18], "ai": 16, "creat": [16, 18, 19], "keyword": [16, 18], "doe": [16, 18], "hidden": 16, "layer": [16, 18], "estim": 16, "computation": 16, "expens": 16, "compar": [16, 18], "filenam": [16, 18], "train_xgb": 16, "sh": [16, 18], "chmod": [16, 18], "x": [16, 18], "window": [16, 18], "sequenti": 16, "alreadi": 16, "exist": [16, 17, 18], "job": [16, 17], "submiss": [16, 18], "parallel": [16, 18], "diagnost": 16, "json": [16, 18, 19], "report": 16, "pathlib": 16, "path_model": 16, "models_xgb": [16, 18], "path_stat": 16, "glob": 16, "val": 16, "stat": [16, 18], "load": 16, "bar": [16, 17], "recal": [16, 17], "matplotlib": 16, "pyplot": 16, "plt": 16, "figsiz": 16, "rcparam": 16, "font": 16, "13": 16, "width": 16, "label": [16, 17, 18], "legend": 16, "ncol": 16, "loc": 16, "ylim": 16, "xlim": 16, "ylabel": 16, "score": [16, 17, 18], "loop": [16, 18], "297": 16, "generated_featur": [16, 18], "get_all_preds_xgb": 16, "imput": [16, 18], "miss": [16, 17, 18], "strategi": [16, 18], "probabl": [16, 17, 18], "By": [16, 18], "path_pr": 16, "preds_xgb": [16, 18], "field_297": 16, "read_parquet": [16, 18], "offer": [16, 18], "panda": [16, 18], "datafram": [16, 18], "pred": [16, 19], "post": [17, 18], "goal": 17, "reliabl": 17, "broad": 17, "factor": [17, 18], "qualiti": 17, "With": 17, "mind": 17, "adopt": 17, "sitewid": 17, "tabl": 17, "pul": [17, 18], "nucleu": 17, "stellar": 17, "bi": [17, 18], "scu": 17, "pop": [17, 18], "ceph2": 17, "popul": [17, 18], "m": 17, "emsm": 17, "rscvn": [17, 18], "bl": 17, "her": 17, "blher": 17, "rrab": 17, "rrc": 17, "rrd": 17, "mir": [17, 18], "srv": [17, 18], "vir": 17, "wvir": 17, "refer": [17, 18], "consider": 17, "phenomenologi": 17, "sin": 17, "saw": 17, "longt": [17, 18], "ea": [17, 18], "ext": 17, "everi": [17, 18], "assign": [17, 18], "practic": 17, "outlin": 17, "becaus": [17, 18], "merit": 17, "futur": [17, 18], "updat": [17, 18], "revis": 17, "recognit": 17, "systemat": 17, "band": 17, "aggreg": 17, "basi": 17, "convolut": 17, "dens": 17, "gradient": 17, "boost": 17, "decis": 17, "regress": 17, "appli": [17, 18], "threshold": [17, 18], "neg": 17, "minim": 17, "loss": 17, "function": [17, 18], "80": 17, "170": 17, "1458": 17, "uniqu": [17, 18], "cron": 17, "queri": [17, 18], "last": [17, 18], "7": [17, 18], "95": 17, "confid": [17, 18], "dr16": 17, "arcsec": [17, 18], "50": [17, 18], "consolid": 17, "match": [17, 18], "allwis": [17, 18], "pan": 17, "starrs1": 17, "mean": [17, 18], "among": [17, 18], "preced": 17, "prefix": [17, 18], "persist": [17, 18], "comment": [17, 18], "metric": 17, "indic": 17, "did": 17, "enough": 17, "successfulli": [17, 18], "hdf5": 18, "quad": 18, "pair": 18, "ztf_source_features_dr16": 18, "301": 18, "minob": 18, "10000": 18, "multi": 18, "whole": 18, "quad_id": 18, "individu": 18, "architectur": 18, "invok": 18, "d15": 18, "batch": 18, "64": 18, "pre": 18, "20221117_001502": 18, "h5": 18, "metadata": 18, "configur": 18, "could": 18, "overridden": 18, "option": 18, "32": 18, "nn": 18, "tensorflow": 18, "kera": 18, "api": 18, "implement": 18, "directli": 18, "inferenc": 18, "param": 18, "paramet": 18, "hide": 18, "complex": 18, "rug": 18, "googl": 18, "drive": 18, "folder": 18, "referenc": 18, "feature_stat": 18, "credenti": 18, "famili": 18, "echo": 18, "42": 18, "min_max": 18, "300": 18, "patienc": 18, "random": 18, "conv": 18, "done": 18, "train_dnn": 18, "new_experi": 18, "input": 18, "taken": 18, "period_suffix": 18, "string": 18, "serv": 18, "catch": 18, "output": 18, "regardless": 18, "field_numb": 18, "ccd_number": 18, "quad_numb": 18, "dogpu": 18, "get_all_pr": 18, "models_dnn": 18, "root": 18, "respect": 18, "preds_dnn": 18, "row": 18, "specific_id": 18, "manipul": 18, "advantag": 18, "drawback": 18, "comma": 18, "plain": 18, "human": 18, "readabl": 18, "space": 18, "read_csv": 18, "to_csv": 18, "oper": 18, "hierarch": 18, "form": 18, "less": 18, "faster": 18, "numer": 18, "serial": 18, "numpi": 18, "arrai": 18, "improv": 18, "diminish": 18, "read_hdf": 18, "to_hdf": 18, "packag": 18, "pytabl": 18, "apach": 18, "to_parquet": 18, "pyarrow": 18, "meant": 18, "address": 18, "mapper": 18, "entri": 18, "kei": 18, "establish": 18, "ignor": 18, "fritz_label": 18, "taxonomy_id": 18, "golden_dataset_mapp": 18, "dnn_al_mapp": 18, "1012": 18, "1011": 18, "adapt": 18, "ztfperiod": 18, "fourier": 18, "cluster": 18, "via": 18, "featuregener": 18, "lcstat": 18, "host": 18, "periodsearch": 18, "aov_cython": 18, "pyaov": 18, "newli": 18, "cpython": 18, "310": 18, "darwin": 18, "lib": 18, "python3": 18, "site": 18, "cuda": 18, "str": 18, "alert": 18, "radiu": 18, "angular": 18, "float": 18, "xmatch": 18, "extern": 18, "int": 18, "dictionari": 18, "normal": 18, "simultan": 18, "docpu": 18, "flag": 18, "bool": 18, "samples_per_peak": 18, "periodogram": 18, "peak": 18, "doscaleminperiod": 18, "cadenc": 18, "max": 18, "freq": 18, "doremoveterrestri": 18, "terrestri": 18, "frequenc": 18, "ncore": 18, "lc": 18, "minimum": 18, "higher": 18, "drop": 18, "dirnam": 18, "docesium": 18, "donotsav": 18, "earli": 18, "entir": 18, "test": 18, "doquadrantfil": 18, "jobid": 18, "dospecificid": 18, "ztf_id": 18, "skipclosesourc": 18, "top": 18, "ce": 18, "ls_": 18, "ce_": 18, "fg": 18, "timestamp": 18, "hjd": 18, "feature_df": 18, "ztf_sources_20230109": 18, "ztf_alert": 18, "gaia_edr3": 18, "gen_featur": 18, "neither": 18, "generated_features_dr15": 18, "dat": 18, "5738": 18, "linux": 18, "durat": 18, "begun": 18, "hpc": 18, "partit": 18, "node": 18, "mail": 18, "generatequadrantfil": 18, "none": 18, "wait": 18, "statu": 18, "dosubmitloop": 18, "until": 18, "hard": 18, "runparallel": 18, "usernam": 18, "squeue": 18, "anderson": 18, "darl": 18, "chi2r": 18, "reduc": 18, "chi": 18, "subtract": 18, "f1_bic": 18, "bayesian": 18, "criterion": 18, "best": 18, "f1_a": 18, "coeffici": 18, "f1_amp": 18, "f1_b": 18, "f1_phi0": 18, "zero": 18, "f1_power": 18, "f1_relamp1": 18, "harmon": 18, "f1_relamp2": 18, "f1_relamp3": 18, "third": 18, "f1_relamp4": 18, "fourth": 18, "f1_relphi1": 18, "f1_relphi2": 18, "f1_relphi3": 18, "f1_relphi4": 18, "i60r": 18, "20th": 18, "80th": 18, "percentil": 18, "i70r": 18, "15th": 18, "85th": 18, "i80r": 18, "10th": 18, "90th": 18, "i90r": 18, "5th": 18, "95th": 18, "inv_vonneumannratio": 18, "invers": 18, "von": 18, "neumann": 18, "iqr": 18, "25th": 18, "75th": 18, "median_abs_dev": 18, "deviat": 18, "norm_excess_var": 18, "excess": 18, "norm_peak_to_peak_amp": 18, "rom": 18, "squar": 18, "skew": 18, "smallkurt": 18, "kurtosi": 18, "stetson_j": 18, "stetson": 18, "j": 18, "stetson_k": 18, "k": 18, "sw": 18, "shapiro": 18, "wilk": 18, "welch_i": 18, "welch": 18, "wmean": 18, "magtnidu": 18, "wstd": 18, "dmdt": 18, "histogram": 18, "26x26": 18, "mean_ztf_alert_braai": 18, "n_ztf_alert": 18, "subscript": 18, "allwise_w1mpro": 18, "w1": 18, "allwise_w1sigmpro": 18, "allwise_w2mpro": 18, "w2": 18, "allwise_w2sigmpro": 18, "allwise_w3mpro": 18, "w3": 18, "allwise_w4mpro": 18, "w4": 18, "gaia_edr3__parallax": 18, "parallax": 18, "gaia_edr3__parallax_error": 18, "gaia_edr3__phot_bp_mean_mag": 18, "gaia_edr3__phot_bp_rp_excess_factor": 18, "gaia_edr3__phot_g_mean_mag": 18, "gaia_edr3__phot_rp_mean_mag": 18, "ps1_dr1__gmeanpsfmag": 18, "ps1": 18, "ps1_dr1__gmeanpsfmagerr": 18, "ps1_dr1__rmeanpsfmag": 18, "ps1_dr1__rmeanpsfmagerr": 18, "ps1_dr1__imeanpsfmag": 18, "ps1_dr1__imeanpsfmagerr": 18, "ps1_dr1__zmeanpsfmag": 18, "ps1_dr1__zmeanpsfmagerr": 18, "ps1_dr1__ymeanpsfmag": 18, "ps1_dr1__ymeanpsfmagerr": 18, "primari": 18, "deliver": 18, "billion": 18, "assembl": 18, "studi": 18, "realm": 18, "know": 18, "involv": 18, "straightforward": 18, "present": 18, "howev": 18, "custom": 18, "repeatedli": 18, "landscap": 18, "gcn_cronjob": 18, "simplic": 18, "foster": 18, "compat": 18, "trade": 18, "off": 18, "extra": 18, "familiar": 18, "emac": 18, "crontab": 18, "replac": 18, "bin": 18, "log_gcn_cronjob": 18, "increment": 18, "left": 18, "five": 18, "month": 18, "divis": 18, "guru": 18, "syntax": 18, "charact": 18, "forward": 18, "final": [18, 19], "suppress": 18, "unnecessari": 18, "newlin": 18, "respond": 18, "affirm": 18, "uninstal": 18, "cannot": 18, "overlook": 18, "pythonpath": 18, "opt": 18, "homebrew": 18, "gtimeout": 18, "2h": 18, "cronjob": 18, "throw": 18, "runtim": 18, "brew": 18, "coreutil": 18, "timeout": 18, "come": 18, "usr": 18, "explicitli": 18, "conclud": 18, "send": 18, "dedic": 18, "overwritten": 18, "One": 18, "p": 18, "aux": 18, "grep": 18, "item": 18, "repres": 18, "just": 18, "ran": 18, "local_scope_radec": 18, "local_scope_ztfid": 18, "plu": 18, "fulli": 18, "qualifi": 18, "cone": 18, "current_dt": 18, "datetim": 18, "scale_featur": 18, "dr16_stat": 18, "nobalance_dr16_dnn_stat": 18, "write_csv": 18, "obj_id": 18, "pars": 18, "target": 18, "dir": 18, "impute_featur": 18, "vote": 18, "diff": 18, "net": 18, "upvot": 18, "downvot": 18, "caution": 18, "bulk": 18, "append": 18, "merge_featur": 18, "period_origin": 18, "ztf_id_origin": 18, "360": 18, "361": 18, "true": 18, "5000": 18, "fritzdownload": 18, "merged_classifications_featur": 18, "dateob": 18, "past": 18, "2023": 18, "21t05": 18, "43": 18, "inclus": 18, "phot": 18, "photometri": 18, "survey_id": 18, "obj": 18, "fritzupload": 18, "filetag": 18, "delet": 18, "ones": 18, "phasefold": 18, "instrument": 18, "port": 18, "protocol": 18, "password": 18, "duplic": 18, "500": 18, "250": 18, "750": 18, "35": 18, "auto": 18, "confirm": 18, "group_id": 18, "200": 18, "400": 18, "revisedperiod": 18, "gloria": 18, "vice": 18, "versa": 18, "disagre": 18, "combin": [18, 19], "scope_upload_disagr": 18, "sample_token": 18, "perman": 19, "link": 19, "doi": 19, "5281": 19, "8410825": 19, "recent": 19, "field_296_100row": 19, "demo": 19, "predictions_dnn_xgb_": 19, "_field": 19, "zip": 19, "scope_classification_demo": 19, "ipynb": 19, "notebook": 19, "trained_dnn_model": 19, "trained_xgb_model": 19, "training_set": 19, "unchang": 19, "element": 19, "previou": 19, "reserv": 19, "addition": 19, "date": 19, "dropdown": 19, "commun": 19, "invit": 19, "curat": 19}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"access": 0, "alloc": 0, "manag": [0, 1, 18], "view": 0, "resourc": [0, 16], "make": 0, "request": 0, "anticip": 0, "trend": 0, "optim": 0, "usag": [0, 18], "instal": 1, "develop": 1, "guidelin": 1, "scienc": 1, "user": [1, 19], "contributor": 1, "http": 1, "ssh": 1, "set": 1, "up": 1, "your": 1, "environ": [1, 18], "window": 1, "linux": 1, "maco": 1, "us": 1, "packag": 1, "option": 1, "updat": 1, "pythonpath": 1, "requir": 1, "dev": 1, "pre": 1, "commit": 1, "hook": 1, "creat": 1, "modifi": [1, 16], "config": [1, 16], "yaml": [1, 16], "test": 1, "troubleshoot": 1, "known": 1, "issu": 1, "how": 1, "contribut": 1, "releas": [1, 19], "pypi": 1, "field": [1, 2, 18], "guid": [1, 2, 16, 17], "section": 1, "variabl": [2, 3, 5, 8, 9, 10, 12, 14], "star": [2, 12], "vnv": [2, 12], "classif": [2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18], "number": [2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13], "ztf": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18], "light": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "curv": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "descript": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 19], "characterist": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "refer": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "further": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "read": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "period": [2, 9, 10], "pnp": [2, 10], "rr": [2, 11], "lyra": [2, 11], "rrlyr": [2, 11], "other": [2, 3, 6, 7, 9, 11, 13], "select": [2, 3, 6, 7, 9, 11, 13, 18], "method": [2, 3, 6, 7, 9, 11, 13], "w": [2, 13], "uma": [2, 13], "wuma": [2, 13], "delta": [2, 7], "scuti": [2, 7], "dscu": [2, 7], "classic": [2, 6], "cepheid": [2, 6], "ceph": [2, 6], "cataclysm": [2, 3], "cv": [2, 3], "flare": [2, 8], "fla": [2, 8], "beta": [2, 4], "lyr": [2, 4], "blyr": [2, 4], "long": [2, 9], "lpv": [2, 9], "bogu": [2, 5], "sourc": [14, 18], "project": 14, "licens": 15, "quick": 16, "start": 16, "train": [16, 17, 18], "argument": 16, "multipl": 16, "classifi": [16, 17], "one": 16, "script": [16, 18], "run": [16, 18], "hpc": 16, "plot": 16, "perform": [16, 17], "infer": [16, 18], "examin": 16, "predict": 16, "fritz": [17, 18], "scanner": 17, "two": 17, "taxonomi": [17, 18], "ontolog": [17, 18], "phenomenolog": [17, 18], "independ": 17, "binari": 17, "process": 17, "machin": 17, "learn": [17, 18], "algorithm": 17, "repeat": 17, "workflow": 17, "transient": 17, "download": 18, "id": 18, "ccd": 18, "quadrant": 18, "scope": 18, "featur": 18, "deep": 18, "model": 18, "handl": 18, "differ": 18, "file": 18, "format": 18, "map": 18, "between": 18, "column": 18, "name": 18, "gener": 18, "exampl": 18, "slurm": 18, "definit": 18, "autom": 18, "analys": 18, "cron": 18, "job": 18, "basic": 18, "addit": 18, "detail": 18, "check": 18, "i": 18, "local": 18, "gcn": 18, "upload": 18, "annot": 18, "disagr": 18, "deprec": 18, "data": 19, "zenodo": 19, "product": 19, "prepar": 19, "new": 19, "publish": 19, "ad": 19}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"ACCESS allocation management": [[0, "access-allocation-management"]], "Viewing Resources": [[0, "viewing-resources"]], "Making Requests": [[0, "making-requests"]], "Anticipating Trends": [[0, "anticipating-trends"]], "Optimizing resource usage": [[0, "optimizing-resource-usage"]], "Installation/Developer Guidelines": [[1, "installation-developer-guidelines"]], "Science users": [[1, "science-users"]], "Developers/contributors": [[1, "developers-contributors"]], "HTTPS:": [[1, "https"]], "SSH:": [[1, "ssh"]], "Setting up your environment (Windows/Linux/macOS)": [[1, "setting-up-your-environment-windows-linux-macos"]], "Use a package manager for installation": [[1, "use-a-package-manager-for-installation"]], "(Optional): Update your PYTHONPATH": [[1, "optional-update-your-pythonpath"]], "Install required packages": [[1, "install-required-packages"]], "Install dev requirements, pre-commit hook": [[1, "install-dev-requirements-pre-commit-hook"]], "Create and modify config.yaml": [[1, "create-and-modify-config-yaml"]], "Testing": [[1, "testing"]], "Troubleshooting": [[1, "troubleshooting"]], "Known issues": [[1, "known-issues"]], "How to contribute": [[1, "how-to-contribute"]], "Releasing on PyPI": [[1, "releasing-on-pypi"]], "Contributing Field Guide sections": [[1, "contributing-field-guide-sections"]], "Field guide": [[2, "field-guide"]], "Variable stars (vnv)": [[2, "variable-stars-vnv"], [12, "variable-stars-vnv"]], "Classification and numbers": [[2, "classification-and-numbers"], [2, "id1"], [2, "id6"], [2, "id11"], [2, "id17"], [2, "id23"], [2, "id29"], [2, "id35"], [2, "id40"], [2, "id45"], [3, "classification-and-numbers"], [4, "classification-and-numbers"], [6, "classification-and-numbers"], [7, "classification-and-numbers"], [8, "classification-and-numbers"], [9, "classification-and-numbers"], [10, "classification-and-numbers"], [11, "classification-and-numbers"], [12, "classification-and-numbers"], [13, "classification-and-numbers"]], "ZTF light curves": [[2, "ztf-light-curves"], [2, "id2"], [2, "id7"], [2, "id12"], [2, "id18"], [2, "id24"], [2, "id30"], [2, "id36"], [2, "id41"], [2, "id46"], [2, "id51"], [3, "ztf-light-curves"], [4, "ztf-light-curves"], [5, "ztf-light-curves"], [6, "ztf-light-curves"], [7, "ztf-light-curves"], [8, "ztf-light-curves"], [9, "ztf-light-curves"], [10, "ztf-light-curves"], [11, "ztf-light-curves"], [12, "ztf-light-curves"], [13, "ztf-light-curves"]], "Description": [[2, "description"], [2, "id3"], [2, "id8"], [2, "id13"], [2, "id19"], [2, "id25"], [2, "id31"], [2, "id37"], [2, "id42"], [2, "id47"], [2, "id52"], [3, "description"], [4, "description"], [5, "description"], [6, "description"], [7, "description"], [8, "description"], [9, "description"], [10, "description"], [11, "description"], [12, "description"], [13, "description"]], "Light curve characteristics": [[2, "light-curve-characteristics"], [2, "id4"], [2, "id9"], [2, "id14"], [2, "id20"], [2, "id26"], [2, "id32"], [2, "id38"], [2, "id43"], [2, "id48"], [2, "id53"], [3, "light-curve-characteristics"], [4, "light-curve-characteristics"], [5, "light-curve-characteristics"], [6, "light-curve-characteristics"], [7, "light-curve-characteristics"], [8, "light-curve-characteristics"], [9, "light-curve-characteristics"], [10, "light-curve-characteristics"], [11, "light-curve-characteristics"], [12, "light-curve-characteristics"], [13, "light-curve-characteristics"]], "References and further reading:": [[2, "references-and-further-reading"], [2, "id5"], [2, "id10"], [2, "id16"], [2, "id22"], [2, "id28"], [2, "id34"], [2, "id39"], [2, "id44"], [2, "id50"], [2, "id54"], [3, "references-and-further-reading"], [4, "references-and-further-reading"], [5, "references-and-further-reading"], [6, "references-and-further-reading"], [7, "references-and-further-reading"], [8, "references-and-further-reading"], [9, "references-and-further-reading"], [10, "references-and-further-reading"], [11, "references-and-further-reading"], [12, "references-and-further-reading"], [13, "references-and-further-reading"]], "Periodic Variables (pnp)": [[2, "periodic-variables-pnp"], [10, "periodic-variables-pnp"]], "RR Lyrae (rrlyr)": [[2, "rr-lyrae-rrlyr"], [11, "rr-lyrae-rrlyr"]], "Other characteristics and selection methods": [[2, "other-characteristics-and-selection-methods"], [2, "id15"], [2, "id21"], [2, "id27"], [2, "id33"], [2, "id49"], [3, "other-characteristics-and-selection-methods"], [6, "other-characteristics-and-selection-methods"], [7, "other-characteristics-and-selection-methods"], [9, "other-characteristics-and-selection-methods"], [11, "other-characteristics-and-selection-methods"], [13, "other-characteristics-and-selection-methods"]], "W Uma (wuma)": [[2, "w-uma-wuma"], [13, "w-uma-wuma"]], "Delta Scuti (dscu)": [[2, "delta-scuti-dscu"], [7, "delta-scuti-dscu"]], "Classical Cepheids (ceph)": [[2, "classical-cepheids-ceph"], [6, "classical-cepheids-ceph"]], "Cataclysmic Variables (cv)": [[2, "cataclysmic-variables-cv"], [3, "cataclysmic-variables-cv"]], "Flaring variables (fla)": [[2, "flaring-variables-fla"], [8, "flaring-variables-fla"]], "Beta Lyr (blyr)": [[2, "beta-lyr-blyr"], [4, "beta-lyr-blyr"]], "Long Period Variables (lpv)": [[2, "long-period-variables-lpv"], [9, "long-period-variables-lpv"]], "Bogus variability (bogus)": [[2, "bogus-variability-bogus"], [5, "bogus-variability-bogus"]], "ZTF Variable Source Classification Project": [[14, "ztf-variable-source-classification-project"]], "License": [[15, "license"]], "Quick Start Guide": [[16, "quick-start-guide"]], "Modify config.yaml": [[16, "modify-config-yaml"]], "Training": [[16, "training"]], "Arguments:": [[16, "arguments"]], "Train multiple classifiers with one script": [[16, "train-multiple-classifiers-with-one-script"]], "Running training on HPC resources": [[16, "running-training-on-hpc-resources"]], "Plotting Classifier Performance": [[16, "plotting-classifier-performance"]], "Inference": [[16, "inference"]], "Running inference on HPC resources": [[16, "running-inference-on-hpc-resources"]], "Examining predictions": [[16, "examining-predictions"]], "Guide for Fritz Scanners": [[17, "guide-for-fritz-scanners"]], "Two classification taxonomies": [[17, "two-classification-taxonomies"]], "Ontological classifications": [[17, "ontological-classifications"]], "Phenomenological classifications": [[17, "phenomenological-classifications"]], "Independent binary classifiers": [[17, "independent-binary-classifiers"]], "Classification process": [[17, "classification-process"]], "Machine learning algorithms/training": [[17, "machine-learning-algorithms-training"]], "Repeated workflow for transients": [[17, "repeated-workflow-for-transients"]], "Classifier performance": [[17, "classifier-performance"]], "Usage": [[18, "usage"]], "Download ids for ZTF fields/CCDs/quadrants": [[18, "download-ids-for-ztf-fields-ccds-quadrants"]], "Download SCoPe features for ZTF fields/CCDs/quadrants": [[18, "download-scope-features-for-ztf-fields-ccds-quadrants"]], "Training deep learning models": [[18, "training-deep-learning-models"]], "Running inference": [[18, "running-inference"]], "Handling different file formats": [[18, "handling-different-file-formats"]], "Mapping between column names and Fritz taxonomies": [[18, "mapping-between-column-names-and-fritz-taxonomies"]], "Generating features": [[18, "generating-features"]], "Example usage": [[18, "example-usage"], [18, "id1"]], "Slurm scripts": [[18, "slurm-scripts"]], "Feature definitions": [[18, "feature-definitions"]], "Selected phenomenological feature definitions": [[18, "selected-phenomenological-feature-definitions"]], "Selected ontological feature definitions": [[18, "selected-ontological-feature-definitions"]], "Running automated analyses": [[18, "running-automated-analyses"]], "cron job basics": [[18, "cron-job-basics"]], "Additional details for cron environment": [[18, "additional-details-for-cron-environment"]], "Check if cron job is running": [[18, "check-if-cron-job-is-running"]], "Local feature generation/inference": [[18, "local-feature-generation-inference"]], "scope-download-classification": [[18, "scope-download-classification"]], "scope-download-gcn-sources": [[18, "scope-download-gcn-sources"]], "scope-upload-classification": [[18, "scope-upload-classification"]], "scope-manage-annotation": [[18, "scope-manage-annotation"]], "Scope Upload Disagreements (deprecated)": [[18, "scope-upload-disagreements-deprecated"]], "Data Releases on Zenodo": [[19, "data-releases-on-zenodo"]], "Data product description": [[19, "data-product-description"]], "Preparing a new release": [[19, "preparing-a-new-release"]], "Publishing a new release": [[19, "publishing-a-new-release"]], "Adding new users": [[19, "adding-new-users"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/usage.html b/usage.html new file mode 100644 index 0000000..a80655b --- /dev/null +++ b/usage.html @@ -0,0 +1,903 @@ + + + + + + + Usage + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Usage

+
+

Download ids for ZTF fields/CCDs/quadrants

+
    +
  • Create HDF5 file for single CCD/quad pair in a field:

  • +
+
get-quad-ids --catalog ZTF_source_features_DR16 --field 301 --ccd 2 --quad 3 --minobs 20 --skip 0 --limit 10000
+
+
+
    +
  • Create multiple HDF5 files for some CCD/quad pairs in a field:

  • +
+
get-quad-ids --catalog ZTF_source_features_DR16 --field 301 --multi-quads --ccd-range 1 8 --quad-range 2 4 --minobs 20 --limit 10000
+
+
+
    +
  • Create multiple HDF5 files for all CCD/quad pairs in a field:

  • +
+
get-quad-ids --catalog ZTF_source_features_DR16 --field 301 --multi-quads --minobs 20 --limit 10000
+
+
+
    +
  • Create single HDF5 file for all sources in a field:

  • +
+
get-quad-ids --catalog ZTF_source_features_DR16 --field 301 --whole-field
+
+
+
+
+

Download SCoPe features for ZTF fields/CCDs/quadrants

+
    +
  • First, run get-quad_ids for desired fields/ccds/quads.

  • +
  • Download features for all sources in a field:

  • +
+
get-features --field 301 --whole-field
+
+
+
    +
  • Download features for all sources in a field, imputing missing features using the strategies in config.yaml:

  • +
+
get-features --field 301 --whole-field --impute-missing-features
+
+
+
    +
  • Download features for a range of ccd/quads individually:

  • +
+
get-features --field 301 --ccd-range 1 2 --quad-range 3 4
+
+
+
    +
  • Download features for a single pair of ccd/quad:

  • +
+
get-features --field 301 --ccd-range 1 --quad-range 2
+
+
+
+
+

Training deep learning models

+

For details on the SCoPe taxonomy and architecture, +please refer to arxiv:2102.11304.

+
    +
  • The training pipeline can be invoked with the scope.py utility. For example:

  • +
+
scope-train --tag vnv --path-dataset data/training/dataset.d15.csv --batch-size 64 --epochs 100 --verbose 1 --pre-trained-model models/experiment/vnv/vnv.20221117_001502.h5
+
+
+

Refer to scope-train --help for details.

+
    +
  • All the necessary metadata/configuration could be defined in config.yaml under training, +but could also be overridden with optional scope-train arguments, e.g. +scope-train ... --batch-size 32 --threshold 0.6 ....

  • +
  • By default, the pipeline uses the DNN models defined in scope/nn.py using the tensorflow’s keras functional API. SCoPe also supports an implementation of XGBoost (set --algorithm xgb; see scope/xgb.py).

  • +
  • If --save is specified during DNN training, an HDF5 file of the model’s layers and weights will be saved. This file can be directly used for additional training and inferencing. For XGB, a json file will save the model along with a .params file with the model parameters.

  • +
  • The Dataset class defined in scope.utils hides the complexity of our dataset handling “under the rug”.

  • +
  • You can request access to a Google Drive folder containing the latest trained models here.

  • +
  • Feature name sets are specified in config.yaml under features. +These are referenced in config.yaml under training.classes.<class>.features.

  • +
  • Feature stats to be used for feature scaling/standardization before training +are either computed by the code (default) or defined in config.yaml under feature_stats.

  • +
  • We use Weights & Biases to track experiments. +Project details and access credentials can be defined in config.yaml under wandb.

  • +
+

Initially, SCoPe used a bash script to train all classifier families, e.g:

+
for class in pnp longt i fla ew eb ea e agn bis blyr ceph dscu lpv mir puls rrlyr rscvn srv wuma yso; \
+  do echo $class; \
+  for state in 1 2 3 4 5 6 7 8 9 42; \
+    do scope-train \
+      --tag $class --path-dataset data/training/dataset.d15.csv \
+      --scale-features min_max --batch-size 64 \
+      --epochs 300 --patience 30 --random-state $state \
+      --verbose 1 --gpu 1 --conv-branch --save; \
+  done; \
+done;
+
+
+

Now, a training script containing one line per class to be trained can be generated by running create-training-script, for example:

+
create-training-script --filename train_dnn.sh --min-count 100 --pre-trained-group-name experiment --add-keywords '--save --batch-size 32 --group new_experiment --period-suffix ELS_ECE_EAOV'
+
+
+

A path to the training set may be provided as input to this method or otherwise taken from config.yaml (training: dataset:). To continue training on existing models, specify the --pre-trained-group-name keyword containing the models in create-training-script. If training on a feature collection containing multiple sets of periodic features (from different algorithms), set the suffix corresponding to the desired algorithm using --period-suffix or the features: info: period_suffix: field in the config file. The string specified in --add-keywords serves as a catch-all for additional keywords that the user wishes to be included in each line of the script.

+

If --pre-trained-group-name is specified and the --train-all keyword is set, the output script will train all classes specified in config.yaml regardless of whether they have a pre-trained model. If --train-all is not set (the default), the script will limit training to classes that have an existing trained model.

+
+
+

Running inference

+

Running inference requires the following steps: download ids of a field, download (or generate) features for all downloaded ids, run inference for all available trained models, e.g:

+
get-quad-ids --field <field_number> --whole-field
+get-features --field <field_number> --whole-field --impute-missing-features
+
+
+

OR

+
generate-features --field <field_number> --ccd <ccd_number> --quad <quad_number> --doGPU
+
+
+

The optimal way to run inference is through an inference script generated by running create-inference-script with the appropriate arguments. After creating the script and adding the needed permissions (e.g. using chmod +x), the commands to run inference on the field <field_number> are (in order):

+
./get_all_preds.sh <field_number>
+
+
+
    +
  • Requires models_dnn/ or models_xgb/ folder in the root directory containing the pre-trained models for DNN and XGBoost, respectively.

  • +
  • In a preds_dnn or preds_xgb directory, creates a single .parquet (and optionally .csv) file containing all ids of the field in the rows and inference scores for different classes across the columns.

  • +
  • If running inference on specific ids instead of a field/ccd/quad (e.g. on GCN sources), run ./get_all_preds.sh specific_ids

  • +
+
+
+

Handling different file formats

+

When our manipulations of pandas dataframes is complete, we want to save them in an appropriate file format with the desired metadata. Our code works with multiple formats, each of which have advantages and drawbacks:

+
    +
  • Comma Separated Values (CSV, .csv): in this format, data are plain text and columns are separated by commas. While this format offers a high level of human readability, it also takes more space to store and a longer time to write and read than other formats.

    +

    pandas offers the read_csv() function and to_csv() method to perform I/O operations with this format. Metadata must be included as plain text in the file.

    +
  • +
  • Hierarchical Data Format (HDF5, .h5): this format stores data in binary form, so it is not human-readable. It takes up less space on disk than CSV files, and it writes/reads faster for numerical data. HDF5 does not serialize data columns containing structures like a numpy array, so file size improvements over CSV can be diminished if these structures exist in the data.

    +

    pandas includes read_hdf() and to_hdf() to handle this format, and they require a package like PyTables to work. pandas does not currently support the reading and writing of metadata using the above function and method. See scope/utils.py for code that handles metadata in HDF5 files.

    +
  • +
  • Apache Parquet (.parquet): this format stores data in binary form like HDF5, so it is not human-readable. Like HDF5, Parquet also offers significant disk space savings over CSV. Unlike HDF5, Parquet supports structures like numpy arrays in data columns.

    +

    While pandas offers read_parquet() and to_parquet() to support this format (requiring e.g. PyArrow to work), these again do not support the reading and writing of metadata associated with the dataframe. See scope/utils.py for code that reads and writes metadata in Parquet files.

    +
  • +
+
+
+

Mapping between column names and Fritz taxonomies

+

The column names of training set files and Fritz taxonomy classifications are not the same by default. Training sets may also contain columns that are not meant to be uploaded to Fritz. To address both of these issues, we use a ‘taxonomy mapper’ file to connect local data and Fritz taxonomies.

+

This file must currently be generated manually, entry by entry. Each entry’s key corresponds to a column name in the local file. The set of all keys is used to establish the columns of interest for upload or download. For example, if the training set includes columns that are not classifications, like RA and Dec, these columns should not be included among the entries in the mapper file. The code will then ignore these columns for the purpose of classification.

+

The fields associated with each key are fritz_label (containing the associated Fritz classification name) and taxonomy_id identifying the classification’s taxonomy system. The mapper must have the following format, also demonstrated in golden_dataset_mapper.json and DNN_AL_mapper.json:

+
{
+"variable":
+    {"fritz_label": "variable",
+      "taxonomy_id": 1012
+    },
+
+"periodic":
+    {"fritz_label": "periodic",
+      "taxonomy_id": 1012
+    },
+
+    .
+    . [add more entries here]
+    .
+
+"CV":
+    {"fritz_label": "Cataclysmic",
+      "taxonomy_id": 1011
+    }
+}
+
+
+
+
+
+

Generating features

+

Code has been adapted from ztfperiodic and other sources to calculate basic and Fourier stats for light curves along with other features. This allows new features to be generated with SCoPe, both locally and using GPU cluster resources. The feature generation script is run using the generate-features command.

+

Currently, the basic stats are calculated via tools/featureGeneration/lcstats.py, and a host of period-finding algorithms are available in tools/featureGeneration/periodsearch.py. Among the CPU-based period-finding algorithms, there is not yet support for AOV_cython. For the AOV algorithm to work, run source build.sh in the tools/featureGeneration/pyaov/ directory, then copy the newly created .so file (aov.cpython-310-darwin.so or similar) to lib/python3.10/site-packages/ or equivalent within your environment. The GPU-based algorithms require CUDA support (so Mac GPUs are not supported).

+

inputs:

+
    +
  1. –source-catalog* : name of Kowalski catalog containing ZTF sources (str)

  2. +
  3. –alerts-catalog* : name of Kowalski catalog containing ZTF alerts (str)

  4. +
  5. –gaia-catalog* : name of Kowalski catalog containing Gaia data (str)

  6. +
  7. –bright-star-query-radius-arcsec : maximum angular distance from ZTF sources to query nearby bright stars in Gaia (float)

  8. +
  9. –xmatch-radius-arcsec : maximum angular distance from ZTF sources to match external catalog sources (float)

  10. +
  11. –limit : maximum number of sources to process in batch queries / statistics calculations (int)

  12. +
  13. –period-algorithms* : dictionary containing names of period algorithms to run. Normally specified in config - if specified here, should be a (list)

  14. +
  15. –period-batch-size : maximum number of sources to simultaneously perform period finding (int)

  16. +
  17. –doCPU : flag to run config-specified CPU period algorithms (bool)

  18. +
  19. –doGPU : flag to run config-specified GPU period algorithms (bool)

  20. +
  21. –samples_per_peak : number of samples per periodogram peak (int)

  22. +
  23. –doScaleMinPeriod : for period finding, scale min period based on min-cadence-minutes (bool). Otherwise, set –max-freq to desired value

  24. +
  25. –doRemoveTerrestrial : remove terrestrial frequencies from period-finding analysis (bool)

  26. +
  27. –Ncore : number of CPU cores to parallelize queries (int)

  28. +
  29. –field : ZTF field to run (int)

  30. +
  31. –ccd : ZTF ccd to run (int)

  32. +
  33. –quad : ZTF quadrant to run (int)

  34. +
  35. –min-n-lc-points : minimum number of points required to generate features for a light curve (int)

  36. +
  37. –min-cadence-minutes : minimum cadence between light curve points. Higher-cadence data are dropped except for the first point in the sequence (float)

  38. +
  39. –dirname : name of generated feature directory (str)

  40. +
  41. –filename : prefix of each feature filename (str)

  42. +
  43. –doCesium : flag to compute config-specified cesium features in addition to default list (bool)

  44. +
  45. –doNotSave : flag to avoid saving generated features (bool)

  46. +
  47. –stop-early : flag to stop feature generation before entire quadrant is run. Pair with –limit to run small-scale tests (bool)

  48. +
  49. –doQuadrantFile : flag to use a generated file containing [jobID, field, ccd, quad] columns instead of specifying –field, –ccd and –quad (bool)

  50. +
  51. –quadrant-file : name of quadrant file in the generated_features/slurm directory or equivalent (str)

  52. +
  53. –quadrant-index : number of job in quadrant file to run (int)

  54. +
  55. –doSpecificIDs: flag to perform feature generation for ztf_id column in config-specified file (bool)

  56. +
  57. –skipCloseSources: flag to skip removal of sources too close to bright stars via Gaia (bool)

  58. +
  59. –top-n-periods: number of (E)LS, (E)CE periods to pass to (E)AOV if using (E)LS_(E)CE_(E)AOV algorithm (int)

  60. +
  61. –max-freq: maximum frequency [1 / days] to use for period finding (float). Overridden by –doScaleMinPeriod

  62. +
  63. –fg-dataset*: path to parquet, hdf5 or csv file containing specific sources for feature generation (str)

  64. +
  65. –max-timestamp-hjd*: maximum timestamp of queried light curves, HJD (float)

  66. +
+

output: +feature_df : dataframe containing generated features

+

* - specified in config.yaml

+
+

Example usage

+

The following is an example of running the feature generation script locally:

+
generate-features --field 301 --ccd 2 --quad 4 --source-catalog ZTF_sources_20230109 --alerts-catalog ZTF_alerts --gaia-catalog Gaia_EDR3 --bright-star-query-radius-arcsec 300.0 --xmatch-radius-arcsec 2.0 --query-size-limit 10000 --period-batch-size 1000 --samples-per-peak 10 --Ncore 4 --min-n-lc-points 50 --min-cadence-minutes 30.0 --dirname generated_features --filename gen_features --doCPU --doRemoveTerrestrial --doCesium
+
+
+

Setting --doCPU will run the config-specified CPU period algorithms on each source. Setting --doGPU instead will do likewise with the specified GPU algorithms. If neither of these keywords is set, the code will assign a value of 1.0 to each period and compute Fourier statistics using that number.

+

Below is an example run the script using a job/quadrant file (containing [job id, field, ccd, quad] columns) instead of specifying field/ccd/quad directly:

+
generate-features --source-catalog ZTF_sources_20230109 --alerts-catalog ZTF_alerts --gaia-catalog Gaia_EDR3 --bright-star-query-radius-arcsec 300.0 --xmatch-radius-arcsec 2.0 --query-size-limit 10000 --period-batch-size 1000 --samples-per-peak 10 --Ncore 20 --min-n-lc-points 50 --min-cadence-minutes 30.0 --dirname generated_features_DR15 --filename gen_features --doGPU --doRemoveTerrestrial --doCesium --doQuadrantFile --quadrant-file slurm.dat --quadrant-index 5738
+
+
+
+
+

Slurm scripts

+

For large-scale feature generation, generate-features is intended to be run on a high-performance computing cluster. Often these clusters require jobs to be submitted using a utility like slurm (Simple Linux Utility for Resource Management) to generate scripts. These scripts contain information about the type, amount and duration of computing resources to allocate to the user.

+

Scope’s generate-features-slurm code creates two slurm scripts: (1) runs single instance of generate-features, and (2) runs the generate-features-job-submission which submits multiple jobs in parallel, periodically checking to see if additional jobs can be started. See below for more information about these components of feature generation.

+

generate-features-slurm can receive all of the arguments used by generate-features. These arguments are passed to the instances of feature generation begun by running slurm script (1). There are also additional arguments specific to cluster resource management:

+

inputs:

+
    +
  1. –job-name : name of submitted jobs (str)

  2. +
  3. –cluster-name : name of HPC cluster (str)

  4. +
  5. –partition-type : cluster partition to use (str)

  6. +
  7. –nodes : number of nodes to request (int)

  8. +
  9. –gpus : number of GPUs to request (int)

  10. +
  11. –memory-GB : amount of memory to request in GB (int)

  12. +
  13. –submit-memory-GB : Memory allocation to request for job submission (int)

  14. +
  15. –time : amount of time before instance times out (str)

  16. +
  17. –mail-user: user’s email address for job updates (str)

  18. +
  19. –account-name : name of account having HPC allocation (str)

  20. +
  21. –python-env-name : name of Python environment to activate before running generate_features.py (str)

  22. +
  23. –generateQuadrantFile : flag to map fields/ccds/quads containing sources to job numbers, save file (bool)

  24. +
  25. –field-list : space-separated list of fields for which to generate quadrant file. If None, all populated fields included (int)

  26. +
  27. –max-instances : maximum number of HPC instances to run in parallel (int)

  28. +
  29. –wait-time-minutes : amount of time to wait between status checks in minutes (float)

  30. +
  31. –doSubmitLoop : flag to run loop initiating instances until out of jobs (hard on Kowalski)

  32. +
  33. –runParallel : flag to run jobs in parallel using slurm [recommended]. Otherwise, run in series on a single instance

  34. +
  35. –user : if using slurm, your username. This will be used to periodically run squeue and list your running jobs (str)

  36. +
  37. –submit-interval-minutes : Time to wait between job submissions, minutes (float)

  38. +
+
+
+
+

Feature definitions

+
+

Selected phenomenological feature definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

definition

ad

Anderson-Darling statistic

chi2red

Reduced chi^2 after mean subtraction

f1_BIC

Bayesian information criterion of best-fitting series (Fourier analysis)

f1_a

a coefficient of best-fitting series (Fourier analysis)

f1_amp

Amplitude of best-fitting series (Fourier analysis)

f1_b

b coefficient of best-fitting series (Fourier analysis)

f1_phi0

Zero-phase of best-fitting series (Fourier analysis)

f1_power

Normalized chi^2 of best-fitting series (Fourier analysis)

f1_relamp1

Relative amplitude, first harmonic (Fourier analysis)

f1_relamp2

Relative amplitude, second harmonic (Fourier analysis)

f1_relamp3

Relative amplitude, third harmonic (Fourier analysis)

f1_relamp4

Relative amplitude, fourth harmonic (Fourier analysis)

f1_relphi1

Relative phase, first harmonic (Fourier analysis)

f1_relphi2

Relative phase, second harmonic (Fourier analysis)

f1_relphi3

Relative phase, third harmonic (Fourier analysis)

f1_relphi4

Relative phase, fourth harmonic (Fourier analysis)

i60r

Mag ratio between 20th, 80th percentiles

i70r

Mag ratio between 15th, 85th percentiles

i80r

Mag ratio between 10th, 90th percentiles

i90r

Mag ratio between 5th, 95th percentiles

inv_vonneumannratio

Inverse of Von Neumann ratio

iqr

Mag ratio between 25th, 75th percentiles

median

Median magnitude

median_abs_dev

Median absolute deviation of magnitudes

norm_excess_var

Normalized excess variance

norm_peak_to_peak_amp

Normalized peak-to-peak amplitude

roms

Root of mean magnitudes squared

skew

Skew of magnitudes

smallkurt

Kurtosis of magnitudes

stetson_j

Stetson J coefficient

stetson_k

Stetson K coefficient

sw

Shapiro-Wilk statistic

welch_i

Welch I statistic

wmean

Weighted mean of magtnidues

wstd

Weighted standard deviation of magnitudes

dmdt

Magnitude-time histograms (26x26)

+
+
+

Selected ontological feature definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

definition

mean_ztf_alert_braai

Mean significance of ZTF alerts for this source

n_ztf_alerts

Number of ZTF alerts for this source

period

Period determined by subscripted algorithms (e.g. ELS_ECE_EAOV)

significance

Significance of period

AllWISE_w1mpro

AllWISE W1 mag

AllWISE_w1sigmpro

AllWISE W1 mag error

AllWISE_w2mpro

AllWISE W2 mag

AllWISE_w2sigmpro

AllWISE W2 mag error

AllWISE_w3mpro

AllWISE W3 mag

AllWISE_w4mpro

AllWISE W4 mag

Gaia_EDR3__parallax

Gaia parallax

Gaia_EDR3__parallax_error

Gaia parallax error

Gaia_EDR3__phot_bp_mean_mag

Gaia BP mag

Gaia_EDR3__phot_bp_rp_excess_factor

Gaia BP-RP excess factor

Gaia_EDR3__phot_g_mean_mag

Gaia G mag

Gaia_EDR3__phot_rp_mean_mag

Gaia RP mag

PS1_DR1__gMeanPSFMag

PS1 g mag

PS1_DR1__gMeanPSFMagErr

PS1 g mag error

PS1_DR1__rMeanPSFMag

PS1 r mag

PS1_DR1__rMeanPSFMagErr

PS1 r mag error

PS1_DR1__iMeanPSFMag

PS1 i mag

PS1_DR1__iMeanPSFMagErr

PS1 i mag error

PS1_DR1__zMeanPSFMag

PS1 z mag

PS1_DR1__zMeanPSFMagErr

PS1 z mag error

PS1_DR1__yMeanPSFMag

PS1 y mag

PS1_DR1__yMeanPSFMagErr

PS1 y mag error

+
+
+
+

Running automated analyses

+

The primary deliverable of SCoPe is a catalog of variable source classifications across all of ZTF. Since ZTF contains billions of light curves, this catalog requires significant compute resources to assemble. We may still want to study ZTF’s expansive collection of data with SCoPe before the classification catalog is complete. For example, SCoPe classifiers can be applied to the realm of transient follow-up.

+

It is useful to know the classifications of any persistent ZTF sources that are close to transient candidates on the sky. Once SCoPe’s primary deliverable is complete, obtaining these classifications will involve a straightforward database query. Presently, however, we must run the SCoPe workflow on a custom list of sources repeatedly to account for the rapidly changing landscape of transient events. See “Guide for Fritz Scanners” for a more detailed explanation of the workflow itself. This section continues with a discussion of how the automated analysis in gcn_cronjob.py is implemented using cron.

+
+

cron job basics

+

cron runs scripts at specific time intervals in a simple environment. While this simplicity fosters compatibility between different operating systems, the trade-off is that some extra steps are required to run scripts compared to more familiar coding environments (e.g. within scope-env for this project).

+

To set up a cron job, first run EDITOR=emacs crontab -e. You can replace emacs with your text editor of choice as long as it is installed on your machine. This command will open a text file in which to place cron commands. An example command is as follows:

+
0 */2 * * * cd scope && ~/miniforge3/envs/scope-env/bin/python ~/scope/gcn_cronjob.py > ~/scope/log_gcn_cronjob.txt 2>&1
+
+
+

Above, the 0 */2 * * * means that this command will run every two hours, on minute 0 of that hour. Time increments increase from left to right; in this example, the five numbers are minute, hour, day (of month), month, day (of week). The */2 means that the hour has to be divisible by 2 for the job to run. Check out crontab.guru to learn more about cron timing syntax.

+

Next in the line, we change directories to scope in order for the code to access our config.yaml file located in this directory. Then, ~/miniforge3/envs/scope-env/bin/python ~/scope/gcn_cronjob.py is the command that gets run (using the Python environment installed in scope-env). The > character forwards the output from the command (e.g. what your script prints) into a log file in a specific location (here ~/scope/log_gcn_cronjob.txt). Finally, the 2>&1 suppresses ‘emails’ from cron about the status of your job (unnecessary since the log is being saved to the user-specified file).

+

Save the text file once you finish modifying it to install the cron job. Ensure that the last line of your file is a newline to avoid issues when running. Your computer may pop up a window to which you should respond in the affirmative in order to successfully initialize the job. To check which cron jobs have been installed, run crontab -l. To uninstall your jobs, run crontab -r.

+
+
+

Additional details for cron environment

+

Because cron runs in a simple environment, the usual details of environment setup and paths cannot be overlooked. In order for the above job to work, we need to add more information when we run EDITOR=emacs crontab -e. The lines below will produce a successful run (if SCoPe is installed in your home directory):

+
PYTHONPATH = /Users/username/scope
+
+0 */2 * * * /opt/homebrew/bin/gtimeout 2h ~/miniforge3/envs/scope-env/bin/python scope-gcn-cronjob > ~/scope/log_gcn_cronjob.txt 2>&1
+
+
+
+

In the first line above, the PYTHONPATH environment variable is defined to include the scope directory. Without this line, any code that imports from scope will throw an error, since the user’s usual PYTHONPATH variable is not accessed in the cron environment.

+

The second line begins with the familiar cron timing pattern described above. It continues by specifying the a maximum runtime of 2 hours before timing out using the gtimeout command. On a Mac, this can be installed with homebrew by running brew install coreutils. Note that the full path to gtimeout must be specified. After the timeout comes the call to the gcn_cronjob.py script. Note that the usual #/usr/bin/env python line at the top of SCoPe’s python scripts does not work within the cron environment. Instead, python must be explicitly specified, and in order to have access to the modules and scripts installed in scope-env we must provide a full path like the one above (~/miniforge3/envs/scope-env/bin/python). The line concludes by sending the script’s output to a dedicated log file. This file gets overwritten each time the script runs.

+
+
+

Check if cron job is running

+

It can be useful to know whether the script within a cron job is currently running. One way to do this for gcn_cronjob.py is to run the command ps aux | grep gcn_cronjob.py. This will always return one item (representing the command you just ran), but if the script is currently running you will see more than one item.

+
+
+
+

Local feature generation/inference

+

SCoPe contains a script that runs local feature generation and inference on sources specified in an input file. Example input files are contained within the tools directory (local_scope_radec.csv and local_scope_ztfid.csv). After receiving either ra/dec coordinates or ZTF light curve IDs (plus an object ID for each entry), the run-scope-local script will generate features and run inference using existing trained models, saving the results to timestamped directories. This script accepts most arguments from generate-features and scope-inference. Additional inputs specific to this script are listed below.

+

inputs:

+
    +
  1. –path-dataset : path (from base scope directory or fully qualified) to parquet, hdf5 or csv file containing specific sources (str)

  2. +
  3. –cone-radius-arcsec : radius of cone search query for ZTF lightcurve IDs, if inputting ra/dec (float)

  4. +
  5. –save-sources-filepath : path to parquet, hdf5 or csv file to save specific sources (str)

  6. +
  7. –algorithms : ML algorithms to run (currently dnn/xgb)

  8. +
  9. –group-names : group names of trained models (with order corresponding to –algorithms input)

  10. +
+

output: +current_dt : formatted datetime string used to label output directories

+
+

Example usage

+
run-scope-local --path-dataset tools/local_scope_ztfid.csv --doCPU --doRemoveTerrestrial --scale_features min_max --group-names DR16_stats nobalance_DR16_DNN_stats --algorithms xgb
+
+run-scope-local --path-dataset tools/local_scope_radec.csv --doCPU --write_csv --doRemoveTerrestrial --group-names DR16_stats nobalance_DR16_DNN_stats --algorithms xgb dnn
+
+
+
+
+
+

scope-download-classification

+

inputs:

+
    +
  1. –file : CSV file containing obj_id and/or ra dec coordinates. Set to “parse” to download sources by group id.

  2. +
  3. –group-ids : target group id(s) on Fritz for download, space-separated (if CSV file not provided)

  4. +
  5. –start : Index or page number (if in “parse” mode) to begin downloading (optional)

  6. +
  7. –merge-features : Flag to merge features from Kowalski with downloaded sources

  8. +
  9. –features-catalog : Name of features catalog to query

  10. +
  11. –features-limit : Limit on number of sources to query at once

  12. +
  13. –taxonomy-map : Filename of taxonomy mapper (JSON format)

  14. +
  15. –output-dir : Name of directory to save downloaded files

  16. +
  17. –output-filename : Name of file containing merged classifications and features

  18. +
  19. –output-format : Output format of saved files, if not specified in (9). Must be one of parquet, h5, or csv.

  20. +
  21. –get-ztf-filters : Flag to add ZTF filter IDs (separate catalog query) to default features

  22. +
  23. –impute-missing-features : Flag to impute missing features using scope.utils.impute_features

  24. +
  25. –update-training-set : if downloading an active learning sample, update the training set with the new classification based on votes

  26. +
  27. –updated-training-set-prefix : Prefix to add to updated training set file

  28. +
  29. –min-vote-diff : Minimum number of net votes (upvotes - downvotes) to keep an active learning classification. Caution: if zero, all classifications of reviewed sources will be added

  30. +
+

process:

+
    +
  1. if CSV file provided, query by object ids or ra, dec

  2. +
  3. if CSV file not provided, bulk query based on group id(s)

  4. +
  5. get the classification/probabilities/periods of the objects in the dataset from Fritz

  6. +
  7. append these values as new columns on the dataset, save to new file

  8. +
  9. if merge_features, query Kowalski and merge sources with features, saving new CSV file

  10. +
  11. Fritz sources with multiple associated ZTF IDs will generate multiple rows in the merged feature file

  12. +
  13. To skip the source download part of the code, provide an input CSV file containing columns named ‘obj_id’, ‘classification’, ‘probability’, ‘period_origin’, ‘period’, ‘ztf_id_origin’, and ‘ztf_id’.

  14. +
  15. Set --update-training-set to read the config-specified training set and merge new sources/classifications from an active learning group

  16. +
+

output: data with new columns appended.

+
scope-download-classification --file sample.csv --group-ids 360 361 --start 10 --merge-features True --features-catalog ZTF_source_features_DR16 --features-limit 5000 --taxonomy-map golden_dataset_mapper.json --output-dir fritzDownload --output-filename merged_classifications_features --output-format parquet -get-ztf-filters --impute-missing-features
+
+
+
+
+

scope-download-gcn-sources

+

inputs:

+
    +
  1. –dateobs: unique dateObs of GCN event (str)

  2. +
  3. –group-ids: group ids to query sources, space-separated [all if not specified] (list)

  4. +
  5. –days-range: max days past event to search for sources (float)

  6. +
  7. –radius-arcsec: radius [arcsec] around new sources to search for existing ZTF sources (float)

  8. +
  9. –save-filename: filename to save source ids/coordinates (str)

  10. +
+

process:

+
    +
  1. query all sources associated with GCN event

  2. +
  3. get fritz names, ras and decs for each page of sources

  4. +
  5. save json file in a useful format to use with generate-features  --doSpecificIDs

  6. +
+
scope-download-gcn-sources --dateobs 2023-05-21T05:30:43
+
+
+
+
+

scope-upload-classification

+

inputs:

+
    +
  1. –file : path to CSV, HDF5 or Parquet file containing ra, dec, period, and labels

  2. +
  3. –group-ids : target group id(s) on Fritz for upload, space-separated

  4. +
  5. –classification : Name(s) of input file columns containing classification probabilities (one column per label). Set this to “read” to automatically upload all classes specified in the taxonomy mapper at once.

  6. +
  7. –taxonomy-map : Filename of taxonomy mapper (JSON format)

  8. +
  9. –comment : Comment to post (if specified)

  10. +
  11. –start : Index to start uploading (zero-based)

  12. +
  13. –stop : Index to stop uploading (inclusive)

  14. +
  15. –classification-origin: origin of classifications. If ‘SCoPe’ (default), Fritz will apply custom color-coding

  16. +
  17. –skip-phot : flag to skip photometry upload (skips for existing sources only)

  18. +
  19. –post-survey-id : flag to post an annotation for the Gaia, AllWISE or PS1 id associated with each source

  20. +
  21. –survey-id-origin : Annotation origin name for survey_id

  22. +
  23. –p-threshold : Probability threshold for posted classification (values must be >= than this number to post)

  24. +
  25. –match-ids : flag to match input and existing survey_id values during upload. It is recommended to instead match obj_ids (see next line)

  26. +
  27. –use-existing-obj-id : flag to use existing source names in a column named ‘obj_id’ (a coordinate-based ID is otherwise generated by default)

  28. +
  29. –post-upvote : flag to post an upvote to newly uploaded classifications. Not recommended when posting automated classifications for active learning.

  30. +
  31. –check-labelled-box : flag to check the ‘labelled’ box for each source when uploading classifications. Not recommended when posting automated classifications for active learning.

  32. +
  33. –write-obj-id : flag to output a copy of the input file with an ‘obj_id’ column containing the coordinate-based IDs for each posted object. Use this file as input for future uploads to add to this column.

  34. +
  35. –result-dir : name of directory where upload results file is saved. Default is ‘fritzUpload’ within the tools directory.

  36. +
  37. –result-filetag: name of tag appended to the result filename. Default is ‘fritzUpload’.

  38. +
  39. –result-format : result file format; one of csv, h5 or parquet. Default is parquet.

  40. +
  41. –replace-classifications : flag to delete each source’s existing classifications before posting new ones.

  42. +
  43. –radius-arcsec: photometry search radius for uploaded sources.

  44. +
  45. –no-ml: flag to post classifications that do not originate from an ML classifier.

  46. +
  47. –post-phot-as-comment: flag to post photometry as a comment on the source (bool)

  48. +
  49. –post-phasefolded-phot: flag to post phase-folded photometry as comment in addition to time series (bool)

  50. +
  51. –phot-dirname: name of directory in which to save photometry plots (str)

  52. +
  53. –instrument-name: name of instrument used for observations (str)

  54. +
+

process: +0. include Kowalski host, port, protocol, and token or username+password in config.yaml

+
    +
  1. check if each input source exists by comparing input and existing obj_ids and/or survey_ids

  2. +
  3. save the objects to Fritz group if new

  4. +
  5. in batches, upload the classifications of the objects in the dataset to target group on Fritz

  6. +
  7. duplicate classifications will not be uploaded to Fritz. If n classifications are manually specified, probabilities will be sourced from the last n columns of the dataset.

  8. +
  9. post survey_id annotations

  10. +
  11. (post comment to each uploaded source)

  12. +
+
scope-upload-classification --file sample.csv --group-ids 500 250 750 --classification variable flaring --taxonomy-map map.json --comment confident --start 35 --stop 50 --skip-phot --p-threshold 0.9 --write-obj-id --result-format csv --use-existing-obj-id --post-survey-id --replace-classifications
+
+
+
+
+

scope-manage-annotation

+

inputs:

+
    +
  1. –action : one of “post”, “update”, or “delete”

  2. +
  3. –source : ZTF ID or path to .csv file with multiple objects (ID column “obj_id”)

  4. +
  5. –group-ids : target group id(s) on Fritz, space-separated

  6. +
  7. –origin : name of annotation

  8. +
  9. –key : name of annotation

  10. +
  11. –value : value of annotation (required for “post” and “update” - if source is a .csv file, value will auto-populate from source[key])

  12. +
+

process:

+
    +
  1. for each source, find existing annotations (for “update” and “delete” actions)

  2. +
  3. interact with API to make desired changes to annotations

  4. +
  5. confirm changes with printed messages

  6. +
+
scope-manage-annotation --action post --source sample.csv --group_ids 200 300 400 --origin revisedperiod --key period
+
+
+
+
+

Scope Upload Disagreements (deprecated)

+

inputs:

+
    +
  1. dataset

  2. +
  3. group id on Fritz

  4. +
  5. gloria object

  6. +
+

process:

+
    +
  1. read in the csv dataset to pandas dataframe

  2. +
  3. get high scoring objects on DNN or on XGBoost from Fritz

  4. +
  5. get objects that have high confidence on DNN but low confidence on XGBoost and vice versa

  6. +
  7. get different statistics of those disagreeing objects and combine to a dataframe

  8. +
  9. filter those disagreeing objects that are contained in the training set and remove them

  10. +
  11. upload the remaining disagreeing objects to target group on Fritz

  12. +
+
./scope_upload_disagreements.py -file dataset.d15.csv -id 360 -token sample_token
+
+
+
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/zenodo.html b/zenodo.html new file mode 100644 index 0000000..8718898 --- /dev/null +++ b/zenodo.html @@ -0,0 +1,268 @@ + + + + + + + Data Releases on Zenodo + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + ZTF Variable Source Classification Project + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Data Releases on Zenodo

+

As more ZTF fields receive SCoPe classifications, we make them public on Zenodo. This page describes the data products available and provides a guide to preparing/publishing new data releases. The permanent link for the SCoPe III repository on Zenodo is https://zenodo.org/doi/10.5281/zenodo.8410825. This link will always resolve to the latest data release.

+
+

Data product description

+

The most recent data release contains these components:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

file

description

field_296_100rows.csv

Demo predictions file containing 100 classified light curves

fields.json

List of fields in classification catalog, generated when running combine-preds

predictions_dnn_xgb_N_fields.zip

Zip file containing classification catalog (contains N combined DNN/XGB prediction files in CSV format)

SCoPe_classification_demo.ipynb

Notebook interacting with demo predictions

trained_dnn_models.zip

Zip file containing trained DNN models

trained_xgb_models.zip

Zip file containing trained XGB models

training_set.parquet

Parquet file containing training set

+
+
+

Preparing a new release

+

To begin a new release draft, click “New version” on the current release. The main difference between releases is the classification catalog Zip file, which adds more ZTF fields over time, along with fields.json. Other unchanged elements of the release may be imported from the previous release by clicking “Import files”.

+
+
+

Publishing a new release

+

To publish a new release after uploading the latest classification catalog, first ensure that all desired files are in place. Then, click “Get a DOI now!” to reserve a version-specific DOI for this release. Additionally, specify the publication date and version in vX.Y.Z format.

+

Finally, create release notes by clicking “Add description” and choosing “Notes” under the “Type” dropdown. These release notes should specify what has changed from one version to the next.

+
+
+

Adding new users

+

The “ZTF Source Classification Project” community ztf-scope contains the current data repository. Inviting additional Zenodo users to this community as Curators will allow them to manage the repository and create new versions.

+
+
+ + +
+ +
+
+ + + + \ No newline at end of file